Platform options

Per-network settings for POST /posts — YouTube title & description, TikTok privacy & disclosures, Instagram Reel settings, and more. Everything you need for reliable, fully-automated multi-platform publishing.

How it works

POST /posts and PATCH /posts/:id take two objects for per-network customization, both keyed by platform id (the same ids returned by GET /accounts):

  • platformCaptions — a different caption / description per network, e.g. { "twitter": "Shorter text for X" }. A platform without an entry falls back to the shared caption.
  • platformOptions — network-specific settings, e.g. { "youtube": { "title": "…" } }. The per-platform schemas are below.

Required fields matter. Some networks reject a publish if a required option is missing (YouTube needs title, categoryId and madeForKids; TikTok needs its five disclosure fields). A missing required field fails at publish time, surfaced in platform_results — not as a 400 on the create call. Unknown keys are ignored.

Multi-platform example

One video published to YouTube Shorts, TikTok and Instagram Reels in a single call, each with its own caption/description and its own settings. (There is no “Shorts” flag — a vertical clip ≤3 min is auto-classified as a Short by YouTube.)

POST /postsjsonc
POST https://api.posteahora.com/functions/v1/api/posts
Authorization: Bearer pah_live_…
Content-Type: application/json

{
  "caption": "Fallback text if a platform override is missing",
  "mediaUrls": ["https://cdn.posteahora.com/…/clip.mp4"],
  "mediaType": "video",
  "postType": "reel",                       // makes the Instagram post a Reel
  "status": "published",
  "accountMappings": [
    { "platform": "youtube",   "accountId": "<yt-account-id>" },
    { "platform": "tiktok",    "accountId": "<tt-account-id>" },
    { "platform": "instagram", "accountId": "<ig-account-id>" }
  ],
  "platformCaptions": {
    "youtube":   "Full YouTube description — links, timestamps, etc.",
    "tiktok":    "TikTok caption #fyp",
    "instagram": "Reel caption for IG ✨"
  },
  "platformOptions": {
    "youtube": {
      "title": "My video title (required, ≤100 chars)",
      "categoryId": "22",                    // required
      "madeForKids": false,                  // required
      "privacyStatus": "public",
      "tags": ["demo", "api"]
    },
    "tiktok": {
      "privacyLevel": "PUBLIC_TO_EVERYONE",  // required
      "disableComment": false,               // required
      "brandContentToggle": false,           // required
      "brandOrganicToggle": false,           // required
      "isAigc": false                        // required
    },
    "instagram": {
      "shareToFeed": true,
      "coverUrl": "https://cdn.posteahora.com/…/cover.jpg"
    }
  }
}
response + pollingjsonc
HTTP 201
{ "postIds": ["…", "…", "…"], "status": "queued" }

// Publishing is async. Poll GET /posts/:id and read platform_results:
{
  "post": {
    "id": "…",
    "status": "published",                   // or partial_published | failed | queued
    "platform_results": [
      { "platform": "youtube",   "success": true,  "remote_post_id": "…", "remote_permalink": "https://youtu.be/…" },
      { "platform": "tiktok",    "success": true,  "remote_publish_id": "…" },
      { "platform": "instagram", "success": false, "error": "…" }
    ]
  }
}

YouTube

The video description is the post caption (per-platform via platformCaptions.youtube), truncated to 5000 chars. The video title is a separate required field below.

titlerequired
string

Video title, ≤100 chars.

categoryIdrequired
string

YouTube category id, e.g. "22" (People & Blogs).

madeForKidsrequired
boolean

COPPA "Made for Kids" self-declaration.

privacyStatus
"public" | "unlisted" | "private"

Default "private".

tags
string[]

Video tags.

defaultLanguage
string

BCP-47 language code for the metadata.

containsSyntheticMedia
boolean

Altered/synthetic content self-disclosure.

embeddable
boolean

Allow embedding on other sites.

publicStatsViewable
boolean

Show like/view counts on the watch page.

license
"youtube" | "creativeCommon"

Video license.

thumbnailUrl
string

Custom thumbnail (requires a verified channel).

TikTok

The caption is the post caption (per-platform via platformCaptions.tiktok).

privacyLevelrequired
"PUBLIC_TO_EVERYONE" | "MUTUAL_FOLLOW_FRIENDS" | "FOLLOWER_OF_CREATOR" | "SELF_ONLY"

Audience. Unverified apps may be capped to SELF_ONLY until TikTok review.

disableCommentrequired
boolean

Turn off comments.

brandContentTogglerequired
boolean

Paid partnership (branded content) disclosure.

brandOrganicTogglerequired
boolean

Promoting your own brand disclosure.

isAigcrequired
boolean

AI-generated content disclosure.

postMode
"DIRECT_POST" | "MEDIA_UPLOAD"

Default DIRECT_POST. MEDIA_UPLOAD sends to the TikTok inbox as a draft to finish in-app.

disableDuet
boolean

Video only.

disableStitch
boolean

Video only.

videoCoverTimestampMs
number

Video only — cover frame timestamp.

autoAddMusic
boolean

Photo only.

photoCoverIndex
number

Photo only — cover image index.

photoTitle
string

Photo only — title, ≤90 chars.

Instagram

The caption is the post caption (per-platform via platformCaptions.instagram). Set postType:"reel" at the top level to publish a Reel, or "story" for a Story.

shareToFeed
boolean

Reel — also show it in the main feed.

coverUrl
string

Reel/video cover image URL.

thumbOffsetMs
number

Reel/video — cover frame timestamp.

audioName
string

Reel — rename the original audio.

collaborators
string[]

Invited collaborator usernames.

locationId
string

Facebook Place id to tag.

userTags
{ username, x?, y? }[]

People to tag (x/y for image tag position).

altText
string

Accessibility alt text (single image).

isAiGenerated
boolean

AI-content label. Not supported on carousel children.

isTrialReel
boolean

Reel only — publish to non-followers first.

trialGraduationStrategy
"MANUAL" | "SS_PERFORMANCE"

Reel only — how a trial Reel graduates to followers.

Threads

The text is the post caption (per-platform via platformCaptions.threads).

replyControl
"everyone" | "accounts_you_follow" | "mentioned_only" | "parent_post_author_only" | "followers_only"

Who can reply.

topic
string

Topic tag for the post.

altText
string

Accessibility alt text.

linkAttachment
string

URL to attach as a link preview (text-only posts).

quotePostId
string

Threads post id to quote.

locationId
string

Location to tag.

allowlistedCountryCodes
string[]

Restrict visibility to these ISO-3166 country codes.

chainItems
{ text, mediaUrl?, mediaType?, altText? }[]

Additional posts appended as a reply chain (thread).

Facebook, X (Twitter), LinkedIn

These networks take no extra options object — the caption (and per-platform platformCaptions override) is all they need. Set postType:"reel" for a Facebook Reel.

Bluesky

The text is the post caption (per-platform via platformCaptions.bluesky).

langs
string[]

BCP-47 language codes for the post.

Mastodon

The text is the post caption (per-platform via platformCaptions.mastodon).

visibility
"public" | "unlisted" | "private" | "direct"

Post visibility.

spoilerText
string

Content warning shown before the body.

sensitive
boolean

Mark media as sensitive.

language
string

ISO 639 language code.

Telegram

The text is the post caption (per-platform via platformCaptions.telegram).

disableNotification
boolean

Send silently.

protectContent
boolean

Block forwarding and saving.

Discord

The message is the post caption (per-platform via platformCaptions.discord).

channelId
string

Target channel id (bot connections that post to a specific channel).

See also

Back to the Posts reference, or the Quickstart.