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
    }
  }'

Instagram

In options on the Instagram target.

FieldTypeDefaultWhat it does
contentType"story"(feed)"story" publishes a Story. Omit otherwise: single videos publish as Reels, images go to the feed.
shareToFeedbooleantrueReels only. false shows the Reel in the Reels tab only.
collaboratorsArray<string>Up to 3 usernames of public Business or Creator accounts. Not for Stories.
userTagsArray<{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).
thumbOffsetnumber (ms)0Offset from video start to use as the Reel cover. Ignored when instagramThumbnail is set.
instagramThumbnailstring (URL)Custom Reel cover, JPEG or PNG, recommended 1080 x 1920 px. Takes priority over thumbOffset. Also accepted as reelCover.
audioNamestringRenames 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.
muteAudiobooleanfalseReels, 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.
isAiGeneratedbooleanfalseInstagram labels the post as containing AI-generated images or video (not AI-written captions). Feed posts, Reels, Stories and carousels.
isPaidPartnershipbooleanfalseShows 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.
brandedContentSponsorsArray<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.
commentsEnabledbooleantruefalse 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.
locationIdstringNumeric 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.
firstCommentstringPosted 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).

FieldTypeDefaultWhat it does
privacy_levelstringRequired. 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_commentbooleanRequired. Enable or disable comments on the post.
allow_duetbooleanRequired for videos. Enable or disable duets.
allow_stitchbooleanRequired for videos. Enable or disable stitches.
content_preview_confirmedbooleanRequired, must be true. Legal requirement from TikTok.
express_consent_givenbooleanRequired, must be true. Legal requirement from TikTok.
video_cover_timestamp_msnumber1000Cover frame position in milliseconds. Ignored when video_cover_image_url is set.
video_cover_image_urlstring (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_indexnumber0Which image is the cover (0-based).
descriptionstringLong-form caption for photo carousels, up to 4,000 characters.
auto_add_musicbooleanLet 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.
musicSoundInfoobjectCommercial 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.musicSoundIdstringThe 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.musicSoundVolumenumber50Track volume (0 to 100). Video posts only.
musicSoundInfo.musicSoundStartnumber0Start point in milliseconds. Video posts only.
musicSoundInfo.musicSoundEndnumberEnd point in milliseconds (defaults to video length). Must be greater than musicSoundStart. Video posts only.
videoOriginalSoundVolumenumberVolume of the video's own sound when a commercial track is attached (0 to 100). Requires musicSoundInfo. Video posts only.
video_made_with_aibooleanAI-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.
locationIdstringLocation tag id from GET /v1/accounts/{accountId}/tiktok/locations. Requires locationName. Business app connections and video posts only. Ignored on drafts.
locationNamestringLocation tag display name returned next to the id. Required with locationId.
isAdsOnlybooleanPublish as an "Only show in ads" post (Spark Ads). Business app connections and video posts only. Ignored on drafts.
draftbooleanfalseSend to the Creator Inbox instead of publishing. See Draft delivery.
commercialContentType"none" | "brand_organic" | "brand_content"Commercial content disclosure. See Commercial content.
isBrandOrganicPostbooleanImplied by commercialContentType: "brand_organic"; set it only to disclose both types at once.
brandPartnerPromotebooleanImplied by commercialContentType: "brand_content"; set it only to disclose both types at once.

YouTube

In options on the YouTube target.

FieldTypeDefaultWhat it does
titlestringFirst line of content, or "Untitled Video"Video title, at most 100 characters.
visibility"public" | "private" | "unlisted""public"Who can see the video.
madeForKidsbooleanfalseMarks 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.
containsSyntheticMediabooleanfalseDiscloses that the video contains synthetic content that could be mistaken for real. YouTube may add a label to the video.
categoryIdstring"22" (People & Blogs)Video category. Common values: "1" Film, "10" Music, "20" Gaming, "22" People & Blogs, "27" Education, "28" Science & Technology.
playlistIdstringPlaylist to add the video to after upload. See Playlists.
firstCommentstringPosted and pinned as the first comment, at most 10,000 characters. Posted immediately with publishNow, at the scheduled time otherwise.

Facebook

In options on the Facebook target.

FieldTypeDefaultWhat 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.
titlestringReel title, separate from the content caption. contentType: "reel" only.
firstCommentstringPosted as the first comment after publishing. Feed posts and Reels, not Stories. Skipped when facebookSettings.draft is true.
pageIdstring(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.draftbooleanfalseCreate an unpublished draft in Facebook Publishing Tools. Feed posts and Reels, not Stories. Drafts expire after about 30 days.
facebookSettings.carouselCardsArray<{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.carouselLinkstring (URL)(first card's link)"See more" destination on the carousel end card. Only with carouselCards.
facebookSettings.textFormatPresetIdstring (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.

LinkedIn

In options on the LinkedIn target.

FieldTypeDefaultWhat it does
documentTitlestringmedia item title, then filenameTitle shown on document (PDF/carousel) posts. LinkedIn requires one for document posts.
organizationUrnstring(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.
firstCommentstringPosted as the first comment after publishing.
disableLinkPreviewbooleanfalsetrue suppresses the automatic URL preview card.
audienceobjectOrganization pages only. Audience targeting (OR within a facet, AND across facets). LinkedIn rejects targeting under 300 members.
audience.countriesArray<string>Up to 25 ISO 3166-1 alpha-2 codes with a built-in LinkedIn geo URN (merged with geoRestriction.countries).
audience.geoLocationsArray<string>LinkedIn geo URNs or ids (urn:li:geo:<id> or <id>): countries, states, regions, cities.
audience.interfaceLocalesArray<{language, country}>Members' LinkedIn interface locale, e.g. { language: "es", country: "ES" }.
audience.industriesArray<string>urn:li:industry:<id> or id.
audience.jobFunctionsArray<string>urn:li:function:<id> or id.
audience.senioritiesArray<string>urn:li:seniority:<id> or id.
audience.staffCountRangesArray<"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.degreesArray<string>urn:li:degree:<id> or id.
audience.fieldsOfStudyArray<string>urn:li:fieldOfStudy:<id> or id.
audience.organizationsArray<string>Schools, as urn:li:organization:<id> or id.
reshareUrlstringPost 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.questionstring1 to 140 characters.
poll.optionsArray<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.

FieldTypeDefaultWhat it does
topic_tagstring(from hashtags)Topic tag for categorisation and discoverability. 1 to 50 characters, no periods (.) or ampersands (&). Overrides auto-extraction from content hashtags.
firstCommentstringPosted 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.
threadItemsArray<{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.

FieldTypeDefaultWhat it does
threadItemsArray<{content, mediaItems?}>Publish a thread: each item becomes the next post in the thread.
replySettingsstringeveryoneLimit 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.
replyToTweetIdstringPost as a reply to this tweet.
quoteTweetIdstringQuote this tweet.
geoRestriction.countriesstring[]Hide attached media outside these countries (up to 25 ISO codes). The text stays visible everywhere.
paidPartnershipbooleanfalseLabel the post as a paid partnership. Depends on your X API access tier.
madeWithAibooleanfalseLabel the post as containing AI-generated media.
sensitiveMedia{adultContent?, graphicViolence?, other?}Put a sensitive-content warning on the attached media.
longVideobooleanfalsePremium accounts: allow videos longer than the standard limit.