PostHero API

v1 Reference

Platform-Specific Content

Use the platformContent object to customize content and settings per platform. This is a top-level field in the Create Post and Update Post request body. How it works: - The top-level text field is the canonical default — every platform without an override uses it as-is. - To override text for a specific platform (including LinkedIn), set platformContent.<platform>.text. This automatically marks that platform as unsynced from the default. - Some platforms accept additional settings (privacy, content type, etc.) inside platformContent.<platform>. - If you don't include a platform in platformContent, it uses the default text. Media is always top-level — images, videos, and PDFs are passed via the media object, not inside platformContent. All platforms in the post share the same media. See Publishing with Media. Threads — for Twitter, Threads, and Bluesky threads, separate each post with triple newlines (\n\n\n) in that platform's text. Threading is auto-detected per platform from the separator: the same request can thread on X (because platformContent.twitter.text contains \n\n\n) while staying as a single long-form post on LinkedIn (because text or platformContent.linkedin.text doesn't contain it). No isThread flag is required.
PlatformFields
linkedin
textdefaults to top-level text, override via platformContent.linkedin.text, 3,000 chars
auto-plugschedule follow-up comments on the published post via top-level isAutoPlug + autoPlug fields. See Auto-plug (LinkedIn).
twitter
text280 chars per tweet (\n\n\n splits threads)
threads
text500 chars per post (\n\n\n splits threads)
bluesky
text300 chars per post (\n\n\n splits threads)
instagram
text2,200 chars
contentTypefeed / reel / story / carousel
facebook
text63,206 chars
youtube
textdescription, 5,000 chars
titlerequired, 100 chars
tagsarray
privacypublic / unlisted / private
videoTypelong / short
thumbnailoptional custom thumbnail URL (JPG/PNG/GIF, ≤30 MB; server compresses to YouTube's 2 MB limit). Long-form only — ignored on Shorts. Requires a verified YouTube channel; otherwise the thumbnail step is skipped and you get an email notification (the video still publishes).
tiktok
textcaption, 2,200 chars
privacyLevelPUBLIC_TO_EVERYONE / MUTUAL_FOLLOW_FRIENDS / FOLLOWER_OF_CREATOR / SELF_ONLY
allowCommentsboolean
allowDuetboolean, video only
allowStitchboolean, video only
postModedirect / draft
autoAddMusicboolean, carousels only, default true

Example request

// Post to LinkedIn + Twitter with different text
curl --request POST \
  --url https://server.posthero.ai/api/v1/posts \
  --header 'Authorization: Bearer YOUR_API_KEY' \
  --header 'Content-Type: application/json' \
  --data '{
  "text": "Excited to announce our new feature! Here is a deep dive into how we built it and what it means for the industry...",
  "platforms": [
    { "platform": "linkedin", "accountId": "acc_li_1" },
    { "platform": "twitter", "accountId": "acc_tw_1" }
  ],
  "platformContent": {
    "twitter": {
      "text": "We just launched something big. Check it out!"
    }
  },
  "media": { "images": ["https://s3.amazonaws.com/..."] },
  "publishNow": true
}'

// Thread on X, single long-form on LinkedIn — from the same POST.
// Threading is auto-detected per platform from \n\n\n separators.
curl --request POST \
  --url https://server.posthero.ai/api/v1/posts \
  --header 'Authorization: Bearer YOUR_API_KEY' \
  --header 'Content-Type: application/json' \
  --data '{
  "platforms": [
    { "platform": "linkedin", "accountId": "acc_li_1" },
    { "platform": "twitter",  "accountId": "acc_tw_1" }
  ],
  "platformContent": {
    "linkedin": {
      "text": "Long-form LinkedIn post. Multiple paragraphs are fine — no triple newlines means LinkedIn publishes this as a single post."
    },
    "twitter": {
      "text": "Tweet 1 — punchy hook.\n\n\nTweet 2 — supporting detail.\n\n\nTweet 3 — call to action."
    }
  }
}'