How to Cross-Post a Video to Every Social Platform via API
One MP4 to TikTok, Instagram Reels, YouTube, X, LinkedIn, Threads, Facebook, Pinterest, and Bluesky in a single API call. Spec table and code included.
The matrix problem
Each platform has its own video rules. To cross-post one MP4, satisfy the intersection:
| Platform | Format | Aspect | Max duration | Max size | Caption |
|---|---|---|---|---|---|
| TikTok (video) | mp4, mov, av, webm | min 720×1280, 9:16 preferred | 3s – 10 min | 4 GB | 2,200 |
| Instagram Reel | mp4, mov | 9:16 | 3s – 90 min | 300 MB | 2,200 |
| Instagram feed | mp4, mov | flexible | 3s – 60 min | 300 MB | 2,200 |
| YouTube | mp4, mov, avi, wmv, flv, 3gp | flexible | 1s – unlimited | 256 GB | 5,000 |
| X (Twitter) | mp4, mov | 16:9 / 1:1 / 9:16 | 1s – 140s | 512 MB | 280 free / 25,000 paid |
| mp4, mov, avi | 1:2.4 to 2.4:1 | 0 – 15 min | 5 GB | 3,000 | |
| Threads | mp4, mov | 0.01:1 to 10:1 | 0 – 5 min | 1 GB | 500 |
| Facebook feed | mp4, mov | flexible | 1s – 4 hr | 4 GB | 63,206 |
| Pinterest pin | mp4, mov | flexible | 4s – 15 min | 2 GB | 500 |
| Bluesky | mp4, mov | flexible | 1s – 60s | 100 MB | 300 (graphemes) |
A 1080×1920, 9:16, H.264/AAC, ≤60 second, ≤100 MB MP4 satisfies all ten. Render once, publish everywhere.
The one-call cross-post
curl -X POST "https://api.postproxy.dev/api/posts" \ -H "Authorization: Bearer YOUR_API_KEY" \ -H "Content-Type: application/json" \ -d '{ "post": { "body": "60 seconds on what we built this week. Full breakdown: acme.com/blog/this-week" }, "profiles": [ "tiktok", "instagram", "youtube", "twitter", "linkedin", "threads", "facebook", "pinterest", "bluesky" ], "media": ["https://yourcdn.com/weekly-recap-9x16.mp4"], "platforms": { "tiktok": { "privacy_status": "PUBLIC_TO_EVERYONE" }, "instagram": { "format": "reel" }, "youtube": { "title": "What we built this week", "privacy_status": "public" }, "pinterest": { "title": "Weekly engineering recap", "board_id": "987654321", "destination_link": "https://yourstore.com/blog/weekly-recap" } } }'One POST. Postproxy fans out to each platform’s flow, holds tokens, polls async processing, and returns one post record with per-platform substates.
What the platform params do:
- TikTok requires
privacy_status—PUBLIC_TO_EVERYONE,MUTUAL_FOLLOW_FRIENDS,FOLLOWER_OF_CREATOR, orSELF_ONLY. - Instagram with a video defaults to feed;
format: "reel"routes to Reels. - YouTube requires
privacy_status(public,unlisted,private).titledefaults to the first line ofbodyif omitted. - Pinterest requires
board_id.destination_linkis the URL the pin links to. - TikTok, Bluesky, X, Threads, LinkedIn, Facebook all accept a video without extra params (LinkedIn defaults to your personal profile; pass
organization_idfor a company page).
Caption length and the lowest cap
The post.body is sent to every platform you target. Each platform has its own cap; the shortest one (X free at 280, Bluesky at 300, Threads at 500) is the practical limit if you want the same body to land cleanly everywhere. Write to that lowest cap, or split the work into two requests targeting different profile sets.
If you need genuinely different copy per platform, make two API calls — one to the long-form profiles, one to the short-form profiles — sharing the media array. The cost is one extra round-trip; the benefit is one body that fits each platform’s audience.
Partial success
Nine platforms means at least one will rate-limit, throttle, or token-expire on a busy day. Postproxy publishes the rest and reports the failures separately:
{ "id": "p_xyz", "status": "processed", "platforms": [ { "network": "tiktok", "status": "published", "permalink": "https://tiktok.com/..." }, { "network": "instagram", "status": "published", "permalink": "..." }, { "network": "youtube", "status": "published", "permalink": "..." }, { "network": "twitter", "status": "failed", "error": "duplicate_content" }, { "network": "linkedin", "status": "published", "permalink": "..." }, { "network": "threads", "status": "published", "permalink": "..." }, { "network": "facebook", "status": "published", "permalink": "..." }, { "network": "pinterest", "status": "published", "permalink": "..." }, { "network": "bluesky", "status": "published", "permalink": "..." } ]}To unblock the failed platform, edit the post (PATCH /api/posts/:id) — change the body, adjust media, or simply re-trigger by toggling draft. Failed platform records can also be inspected via error_details for the underlying platform error code.
See partial success and retries policy for the full semantics.
When you need different aspect ratios
The media array on a single post is sent to every targeted platform — there is no per-platform media swap. If you want 9:16 for the vertical platforms and 16:9 for X and LinkedIn, send two requests with the same post.body and different profile sets:
# Vertical platforms — 9:16curl -X POST "https://api.postproxy.dev/api/posts" \ -H "Authorization: Bearer YOUR_API_KEY" \ -H "Content-Type: application/json" \ -d '{ "post": { "body": "Demo of the new dashboard." }, "profiles": ["tiktok", "instagram", "youtube"], "media": ["https://yourcdn.com/demo-9x16.mp4"], "platforms": { "tiktok": { "privacy_status": "PUBLIC_TO_EVERYONE" }, "instagram":{ "format": "reel" }, "youtube": { "privacy_status": "public", "title": "Dashboard demo" } } }'
# Horizontal platforms — 16:9curl -X POST "https://api.postproxy.dev/api/posts" \ -H "Authorization: Bearer YOUR_API_KEY" \ -H "Content-Type: application/json" \ -d '{ "post": { "body": "Demo of the new dashboard." }, "profiles": ["twitter", "linkedin"], "media": ["https://yourcdn.com/demo-16x9.mp4"] }'For one-source → many-formats workflows, see Repurpose YouTube videos to Shorts, Reels, and TikTok.
What this gives you
Without an API like this:
- 9 OAuth flows to implement and refresh
- 9 upload endpoints, half with container/publish steps
- 9 status polling pipelines
- ~3,000 lines of platform-specific code, ongoing maintenance
With Postproxy: one POST, one webhook, one place to look when something fails.