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:

PlatformFormatAspectMax durationMax sizeCaption
TikTok (video)mp4, mov, av, webmmin 720×1280, 9:16 preferred3s – 10 min4 GB2,200
Instagram Reelmp4, mov9:163s – 90 min300 MB2,200
Instagram feedmp4, movflexible3s – 60 min300 MB2,200
YouTubemp4, mov, avi, wmv, flv, 3gpflexible1s – unlimited256 GB5,000
X (Twitter)mp4, mov16:9 / 1:1 / 9:161s – 140s512 MB280 free / 25,000 paid
LinkedInmp4, mov, avi1:2.4 to 2.4:10 – 15 min5 GB3,000
Threadsmp4, mov0.01:1 to 10:10 – 5 min1 GB500
Facebook feedmp4, movflexible1s – 4 hr4 GB63,206
Pinterest pinmp4, movflexible4s – 15 min2 GB500
Blueskymp4, movflexible1s – 60s100 MB300 (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

Terminal window
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_statusPUBLIC_TO_EVERYONE, MUTUAL_FOLLOW_FRIENDS, FOLLOWER_OF_CREATOR, or SELF_ONLY.
  • Instagram with a video defaults to feed; format: "reel" routes to Reels.
  • YouTube requires privacy_status (public, unlisted, private). title defaults to the first line of body if omitted.
  • Pinterest requires board_id. destination_link is 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_id for 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:

Terminal window
# Vertical platforms — 9:16
curl -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:9
curl -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.

Ready to get started?

Start with our free plan and scale as your needs grow. No credit card required.