## 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.

### One API for every social platform

Publish to Instagram, X, LinkedIn, TikTok, YouTube and more with a
single request. Free plan, no credit card required.

[Get started free](https://app.postproxy.dev/users/sign_up)

## 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](/content/blog/x-twitter-api-posting-integration-guide/index.html) before you can reference it.

**Instagram** and **Threads** use a [container model](/content/blog/post-to-instagram-via-api/index.html). 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](/content/blog/facebook-api-posting-integration-guide/index.html) 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](/content/blog/linkedin-api-automate-company-page-publishing/index.html) 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](/content/blog/how-to-post-to-tiktok-via-api/index.html). 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](/content/blog/youtube-upload-api-guide/index.html). 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-Version` header 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                 |
| Instagram  | 2,200 (caption)        | No clickable links in captions                      |
| Facebook   | 63,206                  | Supports link previews, scheduled publishing       |
| LinkedIn   | 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](/content/blog/handling-image-and-video-uploads-across-social-media-apis/index.html).

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.
