Cross-posting to multiple social networks via API: A practical guide
How to publish the same content to X, Instagram, Facebook, LinkedIn, Threads, TikTok, and YouTube through their APIs — and what makes it harder than it looks.
The appeal is obvious
You have a piece of content. You want it on X, Instagram, LinkedIn, Threads, Facebook, TikTok, and YouTube. One message, eight platforms.
It sounds like a loop. Iterate over a list of platforms, call each API, done. In practice, it is not a loop. Every platform has a different publishing model, different media handling, different authentication, and different failure modes. Cross-posting is an integration problem that compounds with each network you add.
Eight platforms, eight publishing models
No two platforms accept content the same way.
X uses a direct POST to /2/tweets. Text and media IDs go in the same request. Media must be uploaded separately through a chunked upload flow before you can reference it.
Instagram and Threads use a container model. You create a media container first, wait for it to process, then publish the container in a second request. Both require media hosted on a publicly accessible URL — they pull the file from your server. Threads has an additional constraint: you must wait at least 30 seconds between creating and publishing a container.
Facebook publishes through different endpoints depending on content type. Text posts go to /{page-id}/feed. Photos go to /{page-id}/photos. Videos use the Resumable Upload API through /{app-id}/uploads, then attach the file handle to /{page-id}/videos.
LinkedIn requires a multi-step upload for any media. Images go through the Images API, videos through a chunked upload with ETag tracking. Both return asset URNs that you reference when creating the post via the Posts API. Every request needs a Linkedin-Version header and X-Restli-Protocol-Version: 2.0.0.
TikTok supports pull-from-URL or chunked file upload. Before publishing, you must query the creator info endpoint to get available privacy levels — your post will fail if you use a privacy level the creator hasn’t enabled. Photo posts use a completely different endpoint than video posts.
YouTube uses Google’s resumable upload protocol. You initiate an upload session, receive a URI, then PUT the video binary to that URI. Video metadata (title, description, category, privacy) is sent in the initiation request, not with the video data.
A cross-posting system has to speak all seven dialects.
Authentication is not uniform
Every platform uses OAuth, but the implementations diverge.
- X supports OAuth 1.0a and OAuth 2.0 with PKCE. Tokens expire after 2 hours
- Instagram, Facebook, Threads use Meta’s OAuth with separate permission scopes per platform. Each permission needs individual app review with screencasts
- LinkedIn uses OAuth 2.0 with a required
Linkedin-Versionheader on every request - TikTok uses OAuth 2.0 with strict app verification that can take multiple rounds of review
- YouTube uses Google OAuth 2.0 with scope-based verification. Unverified apps are limited to 100 users and private videos only
Token lifetimes vary. Refresh mechanisms vary. Some platforms revoke tokens silently. A cross-posting system needs a token management layer that handles renewal, revocation detection, and re-authentication prompts per platform.
Text limits and formatting
The same text cannot go everywhere unchanged.
| Platform | Character limit | Notes |
|---|---|---|
| X | 280 (free/basic), 25,000 (Pro) | Supports polls, replies, quote posts |
| 2,200 (caption) | No clickable links in captions | |
| 63,206 | Supports link previews, scheduled publishing | |
| 3,000 | Supports mentions via URN format | |
| Threads | 500 | Emojis count by UTF-8 byte length |
| TikTok | 2,200 (video), 90 (photo title) | Photo posts have separate description field (4,000 chars) |
| YouTube | 100 (title), 5,000 (description) | Title and description are separate fields |
A 600-character post works on most platforms but gets rejected by X (free tier) and Threads. A post with a link renders a preview on Facebook and LinkedIn, does nothing on Instagram, and becomes a link_attachment parameter on Threads.
Cross-posting requires content adaptation, not content duplication.
Media is the hardest part
Every platform handles media uploads differently, accepts different formats, and enforces different size limits. This is covered in depth in our guide to media uploads across social media APIs.
The short version: you cannot upload a video the same way to any two platforms. X uses chunked INIT/APPEND/FINALIZE. Instagram pulls from a URL. LinkedIn requires ETag tracking. YouTube uses resumable PUT. TikTok offers both pull and chunked upload. Facebook uses its own Resumable Upload API.
A cross-posting system that supports media is not calling seven similar endpoints. It is implementing seven distinct upload protocols.
The same content, through Postproxy
Here is what the same cross-post looks like through Postproxy. One request, all platforms:
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": ["twitter", "instagram", "facebook", "linkedin", "threads", "tiktok", "youtube"], "media": ["https://example.com/video.mp4"] }'One request. Postproxy handles the seven different upload flows, the authentication, the format adaptation, the status polling, and returns per-platform results showing exactly what happened on each network.
What Postproxy handles
Postproxy manages the complexity so your system does not have to:
- Seven different OAuth flows with automatic token refresh
- Seven different media upload protocols (chunked, container, resumable, pull-from-URL)
- Per-platform text and media format validation
- Per-platform rate limit tracking and request pacing
- Per-platform outcome reporting — what succeeded, what failed, and why
- Partial success as a first-class result, not an exception
Your system sends content once. Postproxy handles every platform-specific implementation.
Connect your accounts and start cross-posting through the Postproxy API.