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 sharedcaption. - •
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 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"
}
}
}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.
titlerequiredstringVideo title, ≤100 chars.
categoryIdrequiredstringYouTube category id, e.g. "22" (People & Blogs).
madeForKidsrequiredbooleanCOPPA "Made for Kids" self-declaration.
privacyStatus"public" | "unlisted" | "private"Default "private".
tagsstring[]Video tags.
defaultLanguagestringBCP-47 language code for the metadata.
containsSyntheticMediabooleanAltered/synthetic content self-disclosure.
embeddablebooleanAllow embedding on other sites.
publicStatsViewablebooleanShow like/view counts on the watch page.
license"youtube" | "creativeCommon"Video license.
thumbnailUrlstringCustom 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.
disableCommentrequiredbooleanTurn off comments.
brandContentTogglerequiredbooleanPaid partnership (branded content) disclosure.
brandOrganicTogglerequiredbooleanPromoting your own brand disclosure.
isAigcrequiredbooleanAI-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.
disableDuetbooleanVideo only.
disableStitchbooleanVideo only.
videoCoverTimestampMsnumberVideo only — cover frame timestamp.
autoAddMusicbooleanPhoto only.
photoCoverIndexnumberPhoto only — cover image index.
photoTitlestringPhoto only — title, ≤90 chars.
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.
shareToFeedbooleanReel — also show it in the main feed.
coverUrlstringReel/video cover image URL.
thumbOffsetMsnumberReel/video — cover frame timestamp.
audioNamestringReel — rename the original audio.
collaboratorsstring[]Invited collaborator usernames.
locationIdstringFacebook Place id to tag.
userTags{ username, x?, y? }[]People to tag (x/y for image tag position).
altTextstringAccessibility alt text (single image).
isAiGeneratedbooleanAI-content label. Not supported on carousel children.
isTrialReelbooleanReel 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.
topicstringTopic tag for the post.
altTextstringAccessibility alt text.
linkAttachmentstringURL to attach as a link preview (text-only posts).
quotePostIdstringThreads post id to quote.
locationIdstringLocation to tag.
allowlistedCountryCodesstring[]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).
langsstring[]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.
spoilerTextstringContent warning shown before the body.
sensitivebooleanMark media as sensitive.
languagestringISO 639 language code.
Telegram
The text is the post caption (per-platform via platformCaptions.telegram).
disableNotificationbooleanSend silently.
protectContentbooleanBlock forwarding and saving.
Discord
The message is the post caption (per-platform via platformCaptions.discord).
channelIdstringTarget channel id (bot connections that post to a specific channel).
See also
Back to the Posts reference, or the Quickstart.