How to Bulk Upload YouTube Shorts via API
YouTube's Data API v3 has the most generous free tier of any major social platform, but it caps everyone — every CodivUpload free user — at a shared 10,000 quota units per day. Each video upload costs roughly 1,600 units, so realistically that's about six videos per day across all shared-tier users globally. For agencies, content repurposers, and anyone running a daily Shorts cadence, that's not enough. The fix is BYOP (Bring Your Own Project): you spin up your own Google Cloud project, get a private 10,000-unit allowance, and CodivUpload uses your project's credentials instead of the shared pool. With BYOP, a single account can upload 60+ Shorts per day. This guide covers both the standard OAuth path (free, shared quota — fine for casual creators) and the BYOP path (private quota, recommended for production use).
Prerequisites
- A YouTube channel
- A CodivUpload profile with the channel connected
- An API key from Dashboard → API Keys
- For BYOP only: a Google Cloud project with the YouTube Data API v3 enabled
Step-by-step
- 1
Path A — Standard OAuth (free, shared quota)
If you upload fewer than six Shorts per day across your entire workspace, the standard OAuth flow is sufficient. In Dashboard → Profiles → Connect → YouTube, approve the OAuth flow. CodivUpload uses its production OAuth client ID under the shared 10,000 unit/day pool. No setup beyond the connect button. After connecting, you can upload immediately — the call shape is identical to the BYOP path; only the underlying quota differs.
- 2
Path B — Set up BYOP for dedicated quota
For agency or production use, follow the full BYOP setup guide. The high-level steps: create a new Google Cloud project, enable YouTube Data API v3 in APIs & Services → Library, configure the OAuth consent screen (set External user type, add your email as test user), create OAuth 2.0 credentials (Web application type, add CodivUpload's redirect URI), and submit for verification if you'll exceed the 100-user testing-mode allowance. Once your GCP credentials are live, paste the Client ID and Secret into Dashboard → Profiles → Connect → YouTube (BYOP). Re-authorize the channel against your own credentials. From this point CodivUpload routes all upload calls through your project, drawing from your private 10,000 unit quota.
- 3
Format your video as a Short
YouTube auto-classifies a video as a Short if it meets three criteria: vertical aspect ratio (9:16), under 60 seconds duration, and the title or description contains #Shorts. CodivUpload appends #Shorts to the title automatically when you set youtube_type=shorts, but you should still ensure the source video is vertical and trimmed under 60 seconds. Horizontal videos with #Shorts in the title are still treated as regular videos by the algorithm.
- 4
Upload via POST /v1/posts (works for both OAuth and BYOP)
The API call is identical regardless of whether the channel is connected via standard OAuth or BYOP. Set post_type=video, profile_name to your profile, platforms=["youtube"], and youtube_type=shorts. Pass the video URL in media_urls. CodivUpload handles the resumable upload protocol behind the scenes — you don't need to chunk the file or handle retries.
curl -X POST https://api.codivupload.com/v1/posts \ -H "Authorization: Bearer YOUR_API_KEY" \ -H "Content-Type: application/json" \ -d '{ "post_type": "video", "profile_name": "my_brand", "platforms": ["youtube"], "media_urls": ["https://your-cdn.example.com/short.mp4"], "title": "Quick tip for creators", "description": "How to save 4 hours/week on social — full guide in the comments.", "youtube_type": "shorts", "youtube_privacy_status": "public", "youtube_tags": ["productivity", "creators", "shorts", "automation"], "youtube_category_id": "27" }' - 5
Add to a playlist programmatically
If you have an existing Shorts playlist, set youtube_playlist_id to add the upload to it automatically. Each playlistItems.insert call costs 50 quota units — included in BYOP's 10,000-unit budget. For longer-form videos use the same field; YouTube doesn't distinguish between Shorts playlists and regular playlists at the API level.
- 6
Loop through a video list (Python example)
Wrap the upload in a Python or Node script. Pause 30 seconds between uploads to stay under YouTube's per-minute rate limits — even with BYOP, you can trigger temporary throttling if you fire too fast. The script below reads a list of {url, title} dicts and posts each one through CodivUpload.
import os, time, requests API = "https://api.codivupload.com/v1/posts" KEY = os.environ["CODIVUPLOAD_API_KEY"] PROFILE = "my_brand" videos = [ {"url": "https://cdn.example.com/v1.mp4", "title": "Tip 1: batch your content"}, {"url": "https://cdn.example.com/v2.mp4", "title": "Tip 2: use a content bank"}, # ... up to 60 per day with BYOP ] for v in videos: r = requests.post(API, headers={ "Authorization": f"Bearer {KEY}", "Content-Type": "application/json", }, json={ "post_type": "video", "profile_name": PROFILE, "platforms": ["youtube"], "media_urls": [v["url"]], "title": v["title"], "description": v["title"] + " — full breakdown in our newsletter.", "youtube_type": "shorts", "youtube_privacy_status": "public", "youtube_tags": ["productivity", "creator-tips"], }) r.raise_for_status() print(v["title"], "→", r.json()["post_id"]) time.sleep(30)
Frequently asked
Why does YouTube reject some of my uploads with invalidTags?+
YouTube's tags field has a hard 500-character limit, counting commas and quote-marks for multi-word tags. CodivUpload sanitizes tags automatically — overflowing entries are truncated from the end of the list — but if you bypass the sanitizer with a custom override, you can hit the cap. Other common rejections: title over 100 characters, description over 5,000 characters, or quota exhaustion (status quotaExceeded in destinations).
Can I upload faster than 30 seconds per post?+
Technically yes — YouTube's resumable upload protocol supports parallel sessions, but per-minute rate limits start kicking in around 5-10 sessions per minute. 30 seconds is the safe pacing; for hitting the daily 60-Shorts ceiling on BYOP, that gives you a full 30 minutes of buffer.
Do I need BYOP for fewer than 6 videos per day?+
No. The shared quota covers casual creators. BYOP becomes necessary at agency scale (managing multiple channels), daily-Shorts cadence (one creator producing more than 5 per day), or production reliability (you don't want to share quota with a thousand other workspaces and risk the daily cap being exhausted by 4 PM).
Can I use BYOP for one channel and shared OAuth for another?+
Yes. BYOP is per-channel. Connect each YouTube account inside its own CodivUpload profile, choose BYOP or standard OAuth for each connection independently. Production accounts → BYOP. Test accounts → standard OAuth.
What's the difference between youtube_type=shorts and youtube_type=video?+
youtube_type=shorts triggers the Shorts classification rules: title gets #Shorts appended, custom thumbnails are skipped (Shorts auto-extract from the first frame), and the video lands in the Shorts shelf on the channel page. youtube_type=video uses the standard video flow with full thumbnail support and lands in the Videos tab.
How do I disclose AI-generated content?+
Set youtube_contains_synthetic_media=true. YouTube adds an automatic disclosure label to the video page. As of 2025 this is required for any content that uses generative AI to manipulate footage of real people — failing to disclose can result in age-restriction or removal under YouTube's misleading content policy.
Custom thumbnails for Shorts — supported?+
No. YouTube's Shorts player extracts the first frame as the thumbnail and ignores any uploaded image. CodivUpload's youtube_thumbnail_url field is silently dropped when youtube_type=shorts. For long-form videos (youtube_type=video), the field is honored.
Can I cross-post the same Short to TikTok and Instagram Reels?+
Yes. Add tiktok and instagram to platforms in the same call: "platforms": ["youtube", "tiktok", "instagram"]. Use platform-specific overrides where the formats differ (e.g. instagram_share_to_feed=true if you also want it on the IG grid). One caveat: the source video must satisfy the strictest platform's constraints — TikTok wants 9:16 portrait under 180 seconds, which is a superset of YouTube Shorts and Instagram Reels, so a 9:16/60-second master file works everywhere.
Related guides
How to Schedule Instagram Posts via API
Schedule Instagram Reels, carousels, and feed posts via REST API using the CodivUpload profile + platforms model. Free tier, no Meta app review. Code samples in cURL, Python, JavaScript.
How to Auto-Post TikTok Videos via API
Programmatically upload TikTok videos with captions, hashtags, and privacy settings. CodivUpload's profile + platforms model. Production-ready in 10 minutes.
How to Automate Cross-Posting with Python
Cross-post to TikTok, Instagram, YouTube, X, LinkedIn, and 4 more from a single Python script using the CodivUpload SDK. Production-ready code with error handling.
Ready to automate?
Free plan includes 30 posts/month across 11 platforms. No credit card required.
See pricing