The four supported networks at a glance, the rules every target shares, and how platformSpecificData works.
Sandbox
In the sandbox these options are validated exactly as in production, but nothing is posted: each target gets a simulated result and a preview page. The outcomes described here (for example threads, Reels, stories, carousels, link previews and article cards) are production behaviour and apply once live platform access opens.
| Platform | platform value | Text limit | Media | Text-only | Credits |
|---|---|---|---|---|---|
| X (Twitter) | twitter | 280 weighted characters (25,000 with longPost) | 4 images, or 1 video, or 1 GIF | Yes | 5, or 50 with a link |
linkedin | 3,000 | 9 images (GIFs count as images), or 1 video | Yes | 1 | |
instagram | 2,200 (caption) | 1 to 10 images or videos, no GIFs | No | 1 | |
facebook | 63,206 | 10 images, or 1 video, no GIFs | Yes | 1 |
GET /v1/platforms lists them with their status. Other platform names that
BetterPost recognises (youtube, tiktok, pinterest, bluesky, threads, googlebusiness) return 403
platform_not_available; anything else is 400 invalid_platform.
mediaItems[].type is image, video or gif; url must be an http(s) URL; altText, when given, is 1 to
1,000 characters.platform must match the account.Each target can override the shared text with its own content, and pass network options in
platformSpecificData:
{
"content": "We just shipped dark mode",
"platforms": [
{
"platform": "twitter",
"accountId": "acc_2x9c4v7b1n8m3k5j0h6g2f4d",
"platformSpecificData": { "threadItems": [{ "content": "It follows your system setting by default." }] }
},
{
"platform": "linkedin",
"accountId": "acc_5l1n7k3j9h2g8f4d6s0a1q3w",
"content": "Dark mode is live for every workspace. Here is how we built it.",
"platformSpecificData": { "visibility": "PUBLIC" }
}
],
"publishNow": true
}Options are validated per network. Keys a network does not use are ignored rather than rejected, so you can send
the same platformSpecificData shape everywhere.