Repurposing one video into YouTube Shorts, TikTok, and Instagram Reels
The real duration, aspect-ratio, and file-size limits for YouTube Shorts, TikTok, and Instagram Reels, the one export that clears all three, and how to publish it everywhere with a single PostGate API call.
Export one file to the tightest common denominator — MP4 with H.264 video and AAC audio, 9:16 vertical at 1080×1920, 3 to 180 seconds, comfortably under 300MB — and it clears Instagram Reels, TikTok, and YouTube Shorts at once. Then a single PostGate API call listing all three profiles publishes that same file everywhere.
Cutting one long-form YouTube video down into a vertical short is the easy part. The part that actually trips teams up is that YouTube Shorts, TikTok, and Instagram Reels don't agree on how long that clip is allowed to be, and treating "vertical video" as one universal format is how you end up with a file that uploads fine to two platforms and silently fails — or silently misclassifies — on the third. This is the real spec for each destination, the one export that clears all three bars at once, and how to publish it everywhere with a single PostGate API call.
PostGate handles OAuth, publishing and delivery evidence for every network through one API. Start free or read the docs.
How do the three platforms' specs differ?
Instagram Reels accepts MP4 or MOV video up to 300MB and between 3 seconds and 15 minutes long — the limits PostGate validates before it will attach a video to an Instagram target. Meta's own content-publishing documentation recommends a 9:16 aspect ratio for Reels specifically; treat that as a strong recommendation rather than a hard API-enforced number, since Meta has revised Reels specs before. See the Instagram Reels API guide for the container-type details.
TikTok is stricter on container: MP4 only, up to 4GB, between 3 seconds and 10 minutes (600 seconds). TikTok also caps the caption at 2,200 characters and does not allow links in it at all — worth knowing before you reuse a YouTube description that has a link in it. See publishing to TikTok via the API.
YouTube Shorts is the odd one out because it isn't a distinct upload type at all — there is no publishAsShort field on the YouTube Data API. YouTube classifies a video as a Short automatically, after upload, based on the file's own properties: since October 2024, that means 3 minutes (180 seconds) or shorter and shot in a vertical or square aspect ratio, per YouTube's own Shorts eligibility documentation. Upload a 16:9 video and it stays a regular upload no matter how short it is. See the YouTube Shorts API guide for what that means for the request itself.
What one export clears all three bars?
You don't need three separate renders if you export to the tightest common denominator across all three sets of limits. Encode to:
- MP4 container, H.264 video, AAC audio — the one codec combination every platform above documents accepting.
- 9:16 vertical, 1080×1920 — clears Instagram's recommended Reels framing, TikTok's native format, and YouTube's vertical-or-square Shorts test.
- 3 to 180 seconds — long enough to clear every platform's floor (Instagram and TikTok both require at least 3 seconds), short enough to still register as a YouTube Short, which is the tightest ceiling of the three by a wide margin (180s vs. TikTok's 600s and Instagram's 900s).
- Comfortably under 300MB — Instagram's video cap is the smallest of the three; TikTok (4GB) and YouTube (up to 256GB, per its own upload documentation) both have far more headroom.
One file that satisfies those four constraints is valid input for all three targets in the same PostGate request — no per-platform re-encode required, unless you specifically want different edits per platform (more on that below).
One PostGate call, three destinations, the same file
Creating a post takes one profiles array and one media array. When you list an Instagram, TikTok, and YouTube profile together, that same media array is delivered to every one of them in that single request — PostGate builds one target per profile, each tracked independently.
curl -X POST "https://postgate.studio/api/posts?profile_group_id=grp_acme123" \
-H "Authorization: Bearer $POSTGATE_API_KEY" \
-H "Content-Type: application/json" \
-H "Idempotency-Key: repurposed-clip-014" \
-d '{
"post": {
"body": "60 seconds from the full breakdown — link in bio for the rest.",
"options": {
"youtube": {
"title": "The 60-second version #Shorts",
"privacy": "public",
"made_for_kids": false,
"community_guidelines_confirmed": true
},
"body_overrides": {
"tiktok": "60 seconds from the full breakdown."
}
}
},
"profiles": ["pro_instagram123", "pro_tiktok456", "pro_youtube789"],
"media": ["https://cdn.example.com/clip-9x16.mp4"]
}'Use body_overrides where the caption itself needs to differ
The example above drops the "link in bio" line from the TikTok caption with body_overrides, because TikTok doesn't allow links in captions at all — sending one anyway either strips it or gets the post rejected depending on how it's formatted. Every other platform in the request still gets the shared post.body unless you add its own override. Platform-specific fields like YouTube's required title, made_for_kids, and Community Guidelines confirmation live under post.options.youtube — see the Posts guide for the full options envelope.
When do you actually need a different file per platform?
The media array in one POST /api/posts request is shared across every profile listed in that same request — there is no per-target or per-platform media field. If you cropped a different aspect ratio for one platform, burned in different captions, or trimmed a shorter cut specifically for YouTube Shorts' 180-second ceiling, that's not one call with three files routed to three destinations — it's three separate POST /api/posts calls, each with its own profile and its own edited media, and its own Idempotency-Key (reusing one key with different content returns a 409 conflict by design, so this isn't something you can shortcut around).
In practice this is still simple: one call per platform-specific edit, each returning its own target status, instead of one call juggling three files at once.
How do you read per-platform delivery results?
Whichever pattern you use, the response's targets array carries one entry per platform with its own status, attempt count, error detail, and permalink once published — see the delivery lifecycle guide. A partial result, where the clip lands on two platforms but fails on the third (a rejected format, a disconnected profile), is a normal terminal outcome to handle, not an error to retry blindly.
Frequently asked questions
Why is my vertical video not showing up as a YouTube Short?
There is no publishAsShort field on the YouTube Data API — YouTube classifies a video as a Short automatically, after upload, based on the file's own properties. Since October 2024 that means 3 minutes (180 seconds) or shorter and shot in a vertical or square aspect ratio. Upload a 16:9 video and it stays a regular upload no matter how short it is.
Can I put a link in a TikTok caption when posting via API?
No — TikTok does not allow links in captions at all, and caps captions at 2,200 characters. Sending a link anyway either strips it or gets the post rejected depending on formatting. When cross-posting, use body_overrides to drop the "link in bio" line from the TikTok caption while every other platform in the request keeps the shared post body.
Can I send a different video file to each platform in one API call?
No — the media array in one POST /api/posts request is shared across every profile listed in it; there is no per-target media field. A different crop, burned-in captions, or a shorter cut for one platform means separate POST /api/posts calls, each with its own profile, its own media, and its own Idempotency-Key — reusing one key with different content returns a 409 conflict by design.
What happens if the clip publishes on two platforms but fails on the third?
That is a partial result — a normal terminal outcome, not an error to retry blindly. The response's targets array carries one entry per platform with its own status, attempt count, error detail, and permalink once published, so you can keep the successful destinations and act only on the one that failed, whether that was a rejected format or a disconnected profile.
