Skip to Content

Platform settings & conditional validation

The create and update endpoints accept an optional settings object per platform. Which ones are required depends on the platforms of your selectedAccounts and whether a designId is attached.

PlatformSettings objectRequired whenDesign required?
InstagraminstagramPostSettingsAn Instagram account is selected and designId is set
TikToktiktokPostSettingsA TikTok account is selected and designId is set
LinkedInlinkedinPostSettingsA LinkedIn account is selectedYes, when status = "SCHEDULED"
ThreadsthreadsPostSettingsA Threads account is selected and designId is set
postSettingsAny resolved postType is "reel" — though it can be omitted and resolved for you

General content rule: a post must have either a non-empty postContent caption or a designId.


instagramPostSettings

{ "postType": "carousel | image | reel", "postAsStory": true // boolean, required }

tiktokPostSettings

{ "postType": "carousel | reel", "privacyLevel": "PUBLIC_TO_EVERYONE | MUTUAL_FOLLOW_FRIENDS | SELF_ONLY", // required when SCHEDULED "canComment": true, // boolean, required "canDuet": true, // boolean, required for reel (non-carousel) "canStitch": true, // boolean, required for reel (non-carousel) "autoAddMusic": true, // boolean, required for carousel "postTitle": "string | null", "isBrandedContent": false, // boolean, required "isYourBrand": false, // boolean, required "isThirdPartyBrand": false, // boolean, required "isAIGeneratedContent": false // boolean, required }

Cross-field rules (enforced when status = "SCHEDULED"):

  • If isBrandedContent is true, at least one of isYourBrand / isThirdPartyBrand must be true.
  • isBrandedContent cannot be true when privacyLevel = "SELF_ONLY".

linkedinPostSettings

{ "postType": "carousel | document | image | reel", "postTitle": "string | null" // required (5–90 chars) when postType=document and SCHEDULED }

For LinkedIn, a designId is required when status = "SCHEDULED" — text-only LinkedIn posts can only be saved as drafts, not scheduled.

threadsPostSettings

{ "postType": "carousel | image | reel" }

postSettings

Applies when any selected platform’s postType resolves to "reel" — it carries the video render settings.

{ "videoDuration": 30, // number, 5 up to (but not including) 60 "audioId": "string" // optional, media id of an audio track }

videoDuration and audioId are the only accepted keys; anything else returns a 422. This is the same object the generate and import endpoints take as videoSettings, so settings carry straight over from creating a video to scheduling it.

audioId is a media id, not a URL. List the workspace’s tracks with the Audio API to find one. It is verified when you make the request: the media must exist, belong to your API key’s workspace, and be an audio file. Note that deleting a track is refused while a scheduled post still references it.

You can omit it

For a reel post you don’t have to send postSettings at all. When it’s missing, each field is resolved in turn:

videoDurationaudioId
1. Your requestthe value you sentthe value you sent
2. The attached designthe videoSettings the design was generated withthe videoSettings the design was generated with
3. Fallback30null (no audio)

The design lookup applies to designs created through the generate or import endpoints — those store the videoSettings they were created with. A design made in the editor has none, so it falls through to the defaults. Fields resolve independently: send only audioId and the duration still comes from the design or the fallback.


Where validation happens

  • Shape checks (each *PostSettings must be an object; status, scheduledAt present and well-formed; postContent an object; selectedAccounts an array) are performed at the Embed API edge and return 422 { "status": false, "message": "..." }.
  • postSettings field checks (allowed keys, videoDuration range, and the audioId workspace/type lookup) also happen at the edge, as 422.
  • All the conditional/business rules above are enforced by PostNitro and relayed back as { "success": false, "message": "...", "error": ... }. See the error reference for the full list of messages.
Last updated on