Platform features
Post options by network
Every network has its own upload features: Reels vs Stories, YouTube titles and visibility, TikTok privacy and consent, LinkedIn company pages, X threads and polls. Pass them per target with the advanced form of Create a post: each entry in platforms takes an options object. TikTok settings go in a top-level tiktok object and apply to every TikTok target.
curl -X POST "https://creatoros-production-5658.up.railway.app/v1/posts" \
-H "Authorization: Bearer $CREATOROS_API_KEY" \
-H "Content-Type: application/json" \
-d '{
"content": "Behind the scenes 🎬",
"media": [
"med_b0Wq7Yx2Rk9LzT4nVs1Pc8Hf3Jd6Gm5Ea2Uo7Ki9Nr0"
],
"platforms": [
{
"platform": "instagram",
"account_id": "acc_uwsum2TkX6QB7M2BWX_F2kYykNTaWuC3V2Spge_Xm4r",
"options": {
"shareToFeed": false,
"collaborators": [
"partnerbrand"
]
}
},
{
"platform": "youtube",
"account_id": "acc_Yt7Kp2Lm9Qx4Vw1Nz8Rc3Hb6Js5Df0Ga2Ue9Ki4Oq7X",
"options": {
"title": "Behind the scenes",
"visibility": "unlisted"
}
},
{
"platform": "tiktok",
"account_id": "acc_Q3n1PvR8dKc0Zb7LwY4sHx2mJt9Eg6Ua5Nf1Ck8Tq3Vz"
}
],
"tiktok": {
"privacy_level": "PUBLIC_TO_EVERYONE",
"allow_comment": true,
"content_preview_confirmed": true,
"express_consent_given": true
}
}'In options on the Instagram target.
| Field | Type | Default | What it does |
|---|---|---|---|
| contentType | "story" | (feed) | "story" publishes a Story. Omit otherwise: single videos publish as Reels, images go to the feed. |
| shareToFeed | boolean | true | Reels only. false shows the Reel in the Reels tab only. |
| collaborators | Array<string> | Up to 3 usernames of public Business or Creator accounts. Not for Stories. | |
| userTags | Array<{username, x?, y?, mediaIndex?}> | Images require x/y (0.0 to 1.0); Reels and videos ignore coordinates; Stories take them optionally. mediaIndex picks the carousel slide (0-based, default 0), video slides included. | |
| trialParams | {graduationStrategy} | Trial Reels, shown only to non-followers. graduationStrategy is "MANUAL" or "SS_PERFORMANCE" (auto-graduate when it performs well). | |
| thumbOffset | number (ms) | 0 | Offset from video start to use as the Reel cover. Ignored when instagramThumbnail is set. |
| instagramThumbnail | string (URL) | Custom Reel cover, JPEG or PNG, recommended 1080 x 1920 px. Takes priority over thumbOffset. Also accepted as reelCover. | |
| audioName | string | Renames the Reel's own audio (replaces "Original Audio"). Set at creation only. | |
| audioConfiguration | {audioId, audioVolume?, videoVolume?} | Catalog track for a Reel; see Reels with catalog audio. Requires loginMethod=facebook_login. | |
| muteAudio | boolean | false | Reels, Stories and video carousel slides; ignored for images. Instagram has no mute parameter, so Creator OS strips the audio track before sending and the published video is permanently silent; if stripping fails, the post fails rather than publishing with sound. Videos above 200 MB cannot be muted. |
| isAiGenerated | boolean | false | Instagram labels the post as containing AI-generated images or video (not AI-written captions). Feed posts, Reels, Stories and carousels. |
| isPaidPartnership | boolean | false | Shows the "Paid partnership" label. Feed posts, Reels and carousels; Stories reject it at creation with a 400. Requires loginMethod=facebook_login: Instagram Login accounts get a 400 with code instagram_paid_partnership_requires_facebook_login. Implied by brandedContentSponsors. See Paid partnership label. |
| brandedContentSponsors | Array<string> | Up to 2 sponsors, each an Instagram username (leading @ optional) or numeric Instagram user id, of public Business or Creator accounts. Same login and content-type rules as isPaidPartnership. | |
| commentsEnabled | boolean | true | false turns comments off right after publishing (Creator OS publishes first, then disables). Feed posts, Reels and carousels; ignored for Stories. Both login methods. Best-effort: if Instagram rejects the toggle, the post stays up with comments on; turn them off in the Instagram app. |
| locationId | string | Numeric id of a Facebook Page that has location data, not a place name. Feed posts, Reels and the carousel as a whole; not single slides, and a Story with locationId is rejected at creation with a 400. See Location tags. | |
| firstComment | string | Posted as the first comment after publishing. Feed posts and carousels, not Stories. The place for links, because captions have none. |
TikTok
Top-level tiktok object (snake_case or camelCase keys).
| Field | Type | Default | What it does |
|---|---|---|---|
| privacy_level | string | Required. One of the creator's values from creator info: PUBLIC_TO_EVERYONE, MUTUAL_FOLLOW_FRIENDS, FOLLOWER_OF_CREATOR, SELF_ONLY. Accounts connected through TikTok's Business app publish videos as public only: non-public values on video direct posts are rejected unless draft: true (photo posts keep every level). See connection lanes. | |
| allow_comment | boolean | Required. Enable or disable comments on the post. | |
| allow_duet | boolean | Required for videos. Enable or disable duets. | |
| allow_stitch | boolean | Required for videos. Enable or disable stitches. | |
| content_preview_confirmed | boolean | Required, must be true. Legal requirement from TikTok. | |
| express_consent_given | boolean | Required, must be true. Legal requirement from TikTok. | |
| video_cover_timestamp_ms | number | 1000 | Cover frame position in milliseconds. Ignored when video_cover_image_url is set. |
| video_cover_image_url | string (URL) | Custom cover image (JPG, PNG or WebP, at most 20 MB). Overrides video_cover_timestamp_ms. | |
| media_type | "video" | "photo" | (from media) | Set to "photo" for photo carousels. |
| photo_cover_index | number | 0 | Which image is the cover (0-based). |
| description | string | Long-form caption for photo carousels, up to 4,000 characters. | |
| auto_add_music | boolean | Let TikTok add recommended music. Photo carousels only. With the brand-organic or branded-content toggle on, TikTok allows Commercial Music Library tracks only, so this attaches nothing there; use musicSoundInfo instead. | |
| musicSoundInfo | object | Commercial Music Library track to attach (TikTok for Business app connections only). Pick musicSoundId from GET /v1/accounts/{accountId}/tiktok/commercial-music. Ignored on drafts. | |
| musicSoundInfo.musicSoundId | string | The id field of a track from GET /v1/accounts/{accountId}/tiktok/commercial-music (a song clip id). TikTok rejects the commercial music id at publish time. | |
| musicSoundInfo.musicSoundVolume | number | 50 | Track volume (0 to 100). Video posts only. |
| musicSoundInfo.musicSoundStart | number | 0 | Start point in milliseconds. Video posts only. |
| musicSoundInfo.musicSoundEnd | number | End point in milliseconds (defaults to video length). Must be greater than musicSoundStart. Video posts only. | |
| videoOriginalSoundVolume | number | Volume of the video's own sound when a commercial track is attached (0 to 100). Requires musicSoundInfo. Video posts only. | |
| video_made_with_ai | boolean | AI-generated content disclosure. Accounts connected through TikTok's Business app carry the disclosure on video posts only: direct photo posts reject true; use draft: true and set the disclosure in the TikTok app. | |
| locationId | string | Location tag id from GET /v1/accounts/{accountId}/tiktok/locations. Requires locationName. Business app connections and video posts only. Ignored on drafts. | |
| locationName | string | Location tag display name returned next to the id. Required with locationId. | |
| isAdsOnly | boolean | Publish as an "Only show in ads" post (Spark Ads). Business app connections and video posts only. Ignored on drafts. | |
| draft | boolean | false | Send to the Creator Inbox instead of publishing. See Draft delivery. |
| commercialContentType | "none" | "brand_organic" | "brand_content" | Commercial content disclosure. See Commercial content. | |
| isBrandOrganicPost | boolean | Implied by commercialContentType: "brand_organic"; set it only to disclose both types at once. | |
| brandPartnerPromote | boolean | Implied by commercialContentType: "brand_content"; set it only to disclose both types at once. |
YouTube
In options on the YouTube target.
| Field | Type | Default | What it does |
|---|---|---|---|
| title | string | First line of content, or "Untitled Video" | Video title, at most 100 characters. |
| visibility | "public" | "private" | "unlisted" | "public" | Who can see the video. |
| madeForKids | boolean | false | Marks the video as child-directed for COPPA. true permanently disables comments, the notification bell, personalized ads, end screens and cards on the video. YouTube may block views when the flag is never set. |
| containsSyntheticMedia | boolean | false | Discloses that the video contains synthetic content that could be mistaken for real. YouTube may add a label to the video. |
| categoryId | string | "22" (People & Blogs) | Video category. Common values: "1" Film, "10" Music, "20" Gaming, "22" People & Blogs, "27" Education, "28" Science & Technology. |
| playlistId | string | Playlist to add the video to after upload. See Playlists. | |
| firstComment | string | Posted and pinned as the first comment, at most 10,000 characters. Posted immediately with publishNow, at the scheduled time otherwise. |
In options on the Facebook target.
| Field | Type | Default | What it does |
|---|---|---|---|
| contentType | "story" | "reel" | (feed) | "story" for a Page Story (24 hours, no caption), "reel" for a Reel (single vertical video). Omit for a feed post. |
| title | string | Reel title, separate from the content caption. contentType: "reel" only. | |
| firstComment | string | Posted as the first comment after publishing. Feed posts and Reels, not Stories. Skipped when facebookSettings.draft is true. | |
| pageId | string | (default Page) | Target Page when the account manages several. List them with GET /v1/accounts/{accountId}/facebook-page. |
| geoRestriction | {countries} | Up to 25 uppercase ISO 3166-1 alpha-2 codes. Feed posts, videos and Reels; not Stories. See Geo-restriction. | |
| facebookSettings.draft | boolean | false | Create an unpublished draft in Facebook Publishing Tools. Feed posts and Reels, not Stories. Drafts expire after about 30 days. |
| facebookSettings.carouselCards | Array<{link, name?, description?}> | 2 to 10 cards, one per image in mediaItems (same length, images only). Mutually exclusive with contentType. name and description take up to 255 characters; Facebook displays about 35 and 30. | |
| facebookSettings.carouselLink | string (URL) | (first card's link) | "See more" destination on the carousel end card. Only with carouselCards. |
| facebookSettings.textFormatPresetId | string (digits) | Facebook preset id for a large-text background. Text-only feed posts on Pages; 400 when media or cards are present, contentType is set, or content is empty. |
In options on the LinkedIn target.
| Field | Type | Default | What it does |
|---|---|---|---|
| documentTitle | string | media item title, then filename | Title shown on document (PDF/carousel) posts. LinkedIn requires one for document posts. |
| organizationUrn | string | (default organization or personal profile) | Post to a specific organization page, urn:li:organization:123456. List the options with GET /v1/accounts/{accountId}/linkedin-organizations. |
| firstComment | string | Posted as the first comment after publishing. | |
| disableLinkPreview | boolean | false | true suppresses the automatic URL preview card. |
| audience | object | Organization pages only. Audience targeting (OR within a facet, AND across facets). LinkedIn rejects targeting under 300 members. | |
| audience.countries | Array<string> | Up to 25 ISO 3166-1 alpha-2 codes with a built-in LinkedIn geo URN (merged with geoRestriction.countries). | |
| audience.geoLocations | Array<string> | LinkedIn geo URNs or ids (urn:li:geo:<id> or <id>): countries, states, regions, cities. | |
| audience.interfaceLocales | Array<{language, country}> | Members' LinkedIn interface locale, e.g. { language: "es", country: "ES" }. | |
| audience.industries | Array<string> | urn:li:industry:<id> or id. | |
| audience.jobFunctions | Array<string> | urn:li:function:<id> or id. | |
| audience.seniorities | Array<string> | urn:li:seniority:<id> or id. | |
| audience.staffCountRanges | Array<"SIZE_1" | "SIZE_2_TO_10" | "SIZE_11_TO_50" | "SIZE_51_TO_200" | "SIZE_201_TO_500" | "SIZE_501_TO_1000" | "SIZE_1001_TO_5000" | "SIZE_5001_TO_10000" | "SIZE_10001_OR_MORE"> | Company size of the member's current employer. | |
| audience.degrees | Array<string> | urn:li:degree:<id> or id. | |
| audience.fieldsOfStudy | Array<string> | urn:li:fieldOfStudy:<id> or id. | |
| audience.organizations | Array<string> | Schools, as urn:li:organization:<id> or id. | |
| reshareUrl | string | Post link or urn:li:share / urn:li:ugcPost / urn:li:groupPost URN to repost. Mutually exclusive with mediaItems. See Repost. | |
| poll | {question, options, duration?} | Create a poll. Cannot be combined with mediaItems or reshareUrl. See Poll. | |
| poll.question | string | 1 to 140 characters. | |
| poll.options | Array<string> | 2 to 4 choices, 1 to 30 characters each. | |
| poll.duration | "ONE_DAY" | "THREE_DAYS" | "SEVEN_DAYS" | "FOURTEEN_DAYS" | "SEVEN_DAYS" | How long the poll accepts votes. |
| geoRestriction | {countries} | Restrict visibility to up to 25 countries. Organization pages only, 300+ targeted followers. See Geo-restriction. |
Threads
In options on the Threads target.
| Field | Type | Default | What it does |
|---|---|---|---|
| topic_tag | string | (from hashtags) | Topic tag for categorisation and discoverability. 1 to 50 characters, no periods (.) or ampersands (&). Overrides auto-extraction from content hashtags. |
| firstComment | string | Posted right after publishing as a reply to the published post (with threadItems, a reply to the root post). Up to 500 characters. It is itself a Threads post, so it counts toward the 250 posts per 24 hours. | |
| threadItems | Array<{content, mediaItems?}> | The complete sequence of posts in a thread. The first item becomes the root post and must be threadItems[0]. When set, the top-level content is for display and search only and is not published. |
X
In options on the X target.
| Field | Type | Default | What it does |
|---|---|---|---|
| threadItems | Array<{content, mediaItems?}> | Publish a thread: each item becomes the next post in the thread. | |
| replySettings | string | everyone | Limit replies to following, mentionedUsers, subscribers or verified. Applies to the first post of a thread. Cannot be combined with replyToTweetId. |
| poll | {options: string[], duration_minutes} | 2 to 4 options of up to 25 characters, open 5 to 10080 minutes. Cannot be combined with media, threadItems or quoteTweetId. | |
| replyToTweetId | string | Post as a reply to this tweet. | |
| quoteTweetId | string | Quote this tweet. | |
| geoRestriction.countries | string[] | Hide attached media outside these countries (up to 25 ISO codes). The text stays visible everywhere. | |
| paidPartnership | boolean | false | Label the post as a paid partnership. Depends on your X API access tier. |
| madeWithAi | boolean | false | Label the post as containing AI-generated media. |
| sensitiveMedia | {adultContent?, graphicViolence?, other?} | Put a sensitive-content warning on the attached media. | |
| longVideo | boolean | false | Premium accounts: allow videos longer than the standard limit. |