Instagram Reels vs TikTok vs YouTube Shorts: publishing via API
Compare the API requirements for publishing short-form video across the three major platforms — aspect ratios, duration limits, thumbnail handling, and processing wait times.
Three platforms, three different upload protocols
Instagram Reels, TikTok, and YouTube Shorts all serve the same content format: short vertical video. Publishing that video through their APIs is where the similarity ends.
Instagram requires your video hosted at a public URL and uses a container model with polling. TikTok makes you query creator settings before every post. YouTube has no Shorts-specific endpoint at all — you upload a regular video and hope the algorithm classifies it correctly.
This is a side-by-side breakdown of what each platform requires, where they diverge, and what will trip you up.
Video specs at a glance
| Spec | Instagram Reels | TikTok | YouTube Shorts |
|---|---|---|---|
| Aspect ratio | 9:16 required for Reels tab | 9:16 recommended | 9:16 required for Shorts classification |
| Resolution | 1080 x 1920 recommended | 1080 x 1920 (min 720 x 1280) | 1080 x 1920 recommended |
| Max duration (API) | 90 seconds | Varies by creator (up to 60 min) | 3 minutes |
| Min duration | 5 seconds | No documented minimum | No documented minimum |
| Max file size | ~1 GB | No hard documented max via API | 128 GB (standard YouTube limit) |
| Formats | MP4, MOV | MP4, MOV, WebM | MP4, MOV, AVI, WebM, and others |
| Video codec | H.264 or HEVC | H.264 recommended | H.264 recommended |
| Audio codec | AAC (48 kHz max, mono or stereo) | AAC recommended | AAC recommended |
| Frame rate | 23–60 FPS | 30–60 FPS | 24–60 FPS |
The resolution and aspect ratio requirements are nearly identical. The divergence is in duration limits and upload mechanics.
Duration limits
This is where things get frustrating.
Instagram Reels caps API-published Reels at approximately 90 seconds. The native app now supports Reels up to 3 minutes (and longer for some accounts), but the Graph API has not caught up. If your workflow generates videos longer than 90 seconds, they cannot be published as Reels through the API.
TikTok does not have a fixed duration limit. Instead, you must call the Creator Info endpoint before every post, which returns a max_video_post_duration_sec value specific to that creator. Most creators can post videos up to 10 minutes. Some have access to 60 minutes. You cannot know the limit without making the API call.
YouTube Shorts supports videos up to 3 minutes. YouTube extended this from 60 seconds in late 2024. A vertical video under 3 minutes is automatically classified as a Short — there is no flag or parameter to set. The classification is entirely based on aspect ratio and duration.
The upload flow
Each platform has a fundamentally different publishing model.
Instagram Reels: container model with polling
Instagram uses a three-step container model:
Step 1 — Create container:
POST /{ig-user-id}/media
Send media_type=REELS and a video_url pointing to a publicly accessible video file.
Step 2 — Poll for status:
GET /{container-id}?fields=status_code
Check repeatedly until the status is FINISHED.
Step 3 — Publish:
POST /{ig-user-id}/media_publish
Send the container ID to make the Reel live.
The video must be hosted at a public URL. Instagram does not accept direct file uploads through the standard container flow — Meta’s servers fetch the video from your URL. For large files or unreliable hosting, a resumable upload flow is available.
The share_to_feed parameter controls whether the Reel appears in the main feed in addition to the Reels tab. If you omit it, the Reel only appears in the Reels tab.
TikTok: creator info query, then upload
TikTok requires a mandatory pre-flight check before every post:
Step 1 — Query creator info:
POST /v2/post/publish/creator_info/query/
Returns the creator’s available privacy levels, max video duration, and feature toggles (duet, stitch, comments). This call is required before every post.
Step 2 — Initialize upload:
POST /v2/post/publish/video/init/
Set source to either PULL_FROM_URL (provide a video_url) or FILE_UPLOAD (returns an upload_url for direct upload). Both return a publish_id for status tracking.
Step 3 — Upload file (file upload path only):
PUT {upload_url}
Send the video binary with Content-Range headers. Files under 5 MB go as a single chunk. Files over 64 MB must be chunked (5–64 MB per chunk, uploaded sequentially). The upload URL expires after 1 hour.
Step 4 — Poll for status:
POST /v2/post/publish/status/fetch/
Check the publish status using the publish_id from initialization.
The creator info query is not optional. TikTok enforces this during app review and requires your UI to display the creator’s available privacy levels with no pre-selected default.
YouTube Shorts: standard video upload
YouTube has no Shorts-specific endpoint. You upload a video using the standard Videos API:
Step 1 — Initiate resumable upload:
POST https://www.googleapis.com/upload/youtube/v3/videos?uploadType=resumable&part=snippet,status
Send video metadata (title, description, privacy status) in the request body. Returns a resumable upload URI in the Location header.
Step 2 — Upload video:
PUT {resumable-upload-uri}
Send the video binary. Supports chunked upload with Content-Range headers for large files.
That is it. YouTube classifies the video as a Short automatically based on its aspect ratio and duration. There is no isShort flag, no media_type parameter, no special endpoint.
The simplicity is deceptive. You have less control over how the content is categorized, and the classification rules are not fully documented.
Thumbnail and cover image handling
| Feature | Instagram Reels | TikTok | YouTube Shorts |
|---|---|---|---|
| Custom cover image | Yes | No | No |
| Frame selection | Yes (millisecond offset) | Yes (millisecond offset) | No |
| Auto-generated | Yes (fallback) | Yes (always) | Yes (always) |
| Post-publish editing | In-app only | In-app only | Limited (text/emoji overlay in-app) |
Instagram Reels has the best thumbnail support. Use cover_url to provide a custom cover image, or thumb_offset to pick a specific frame by millisecond offset. If you provide both, cover_url takes precedence. The cover displays as a center-cropped 1080 x 1080 square on the profile grid, so the center of your image needs to look good at that crop.
TikTok lets you select a frame via video_cover_timestamp_ms in the post info object. There is no way to upload a custom cover image through the API. The creator can change it manually in the app after posting.
YouTube Shorts does not support custom thumbnails for Shorts. The thumbnails.set endpoint works for regular YouTube videos but not for Shorts. YouTube auto-generates the thumbnail, and creators can only add text or emoji overlays through the app. This is a significant limitation for any workflow that depends on branded or consistent thumbnails.
Processing and wait times
All three platforms process video asynchronously after upload. None of them offer webhooks — you must poll.
Instagram Reels: Poll GET /{container-id}?fields=status_code until the status is FINISHED. Processing time varies with file size and server load. Meta recommends polling once per minute for no more than 5 minutes. Attempting to publish before the container is ready returns a 400 error. Containers expire after 24 hours if not published.
TikTok: Poll POST /v2/post/publish/status/fetch/ with the publish_id from initialization. Processing typically completes in under 30 seconds for files up to 512 MB, about a minute for larger files. After processing, public posts go through content moderation, which usually takes under a minute but can occasionally take hours.
YouTube Shorts: There is no clean processing status endpoint. You can call GET /youtube/v3/videos?part=processingDetails to check status, but each call costs 1 quota unit. Shorts are typically processed within a few minutes. Upload status progresses through uploaded → processed (or failed / rejected).
| Platform | Typical processing time | Polling method | Polling cost |
|---|---|---|---|
| Instagram Reels | 30 seconds – 5 minutes | GET container status | Free (rate-limited) |
| TikTok | Under 30 seconds + moderation | POST status fetch | Free (30 req/min) |
| YouTube Shorts | A few minutes | GET videos.list | 1 quota unit per call |
App review and verification
None of these platforms let you publish publicly without some form of review.
Instagram Reels requires Meta’s app review process. Each permission (instagram_business_content_publish, instagram_business_basic, etc.) needs a separate submission with a screencast demonstrating the full user flow. Expect 2–4 weeks.
TikTok has the most rigorous audit. Unaudited apps are restricted to SELF_ONLY privacy and can only serve 5 users per day. The audit requires UX mockups, compliance with content sharing guidelines (no watermarks, mandatory privacy selectors, commercial content disclosures), and can take multiple review rounds. Violations can result in permanent revocation.
YouTube requires Google’s OAuth verification for sensitive scopes. Unverified apps display a warning screen, are limited to 100 users, and can only upload private videos. Verification includes a security assessment and may require a third-party audit for restricted scopes.
Platform-specific gotchas
Instagram Reels
- Video must be hosted at a publicly accessible URL. No direct file upload through the standard flow
- The 90-second API duration cap is a hard limit, even though the native app supports longer Reels
- Only 9:16 aspect ratio videos between 5–90 seconds are eligible for the Reels tab
- Token management requires exchanging short-lived tokens for long-lived tokens, then re-exchanging before they expire every 60 days
TikTok
- You must call the Creator Info endpoint before every post, not just once. Creator settings can change at any time
- Your UI must force the user to actively choose a privacy level. Pre-selecting a default will get your app rejected in review
video.uploadandvideo.publishare separate OAuth scopes. You need both to post content- Upload URLs expire after 1 hour. Slow or interrupted uploads require re-initialization
- Chunk uploads must be sequential. No parallel chunk uploading
YouTube Shorts
- There is no way to explicitly declare a video as a Short. You upload a vertical video and trust YouTube’s automatic classification
- No custom thumbnail support for Shorts via the API. This is confirmed as not on YouTube’s roadmap
- Google only issues an OAuth refresh token on the first authorization. If you lose it, you must pass
prompt=consentto force re-consent - The default quota allows roughly 6 uploads per day. Any production application needs a quota increase, which requires a full compliance audit
The same video, three platforms, through Postproxy
Here is what publishing a short-form video to all three platforms looks like through Postproxy:
curl -X POST "https://api.postproxy.dev/api/posts" \ -H "Authorization: Bearer YOUR_API_KEY" \ -H "Content-Type: application/json" \ -d '{ "post": { "body": "3 tips that changed how we approach customer onboarding" }, "profiles": ["instagram", "tiktok", "youtube"], "media": ["https://example.com/video.mp4"] }'One request. Postproxy handles the container model for Instagram, the creator info query and privacy validation for TikTok, the resumable upload for YouTube, the processing status polling on all three, and returns per-platform results showing exactly what happened on each network.
What Postproxy handles
Postproxy manages the complexity of three different upload protocols so your system does not have to:
- Instagram’s container creation, status polling, and publishing flow
- TikTok’s creator info validation, privacy level selection, and chunked uploads
- YouTube’s resumable upload protocol and quota management
- Per-platform video format validation and duration checks
- Processing status polling across all three platforms
- OAuth token management and refresh for each platform
- Per-platform outcome reporting — what succeeded, what failed, and why
Your system sends a video once. Postproxy publishes it as a Reel, a TikTok, and a Short.
Connect your accounts and start publishing through the Postproxy API.