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.
| Platform | Settings object | Required when | Design required? |
|---|---|---|---|
instagramPostSettings | An Instagram account is selected and designId is set | — | |
| TikTok | tiktokPostSettings | A TikTok account is selected and designId is set | — |
linkedinPostSettings | A LinkedIn account is selected | Yes, when status = "SCHEDULED" | |
| Threads | threadsPostSettings | A Threads account is selected and designId is set | — |
| — | postSettings | Any resolved postType is "reel" — though it can be omitted and resolved for you | — |
General content rule: a post must have either a non-empty
postContentcaption or adesignId.
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
isBrandedContentistrue, at least one ofisYourBrand/isThirdPartyBrandmust betrue. isBrandedContentcannot betruewhenprivacyLevel = "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:
videoDuration | audioId | |
|---|---|---|
| 1. Your request | the value you sent | the value you sent |
| 2. The attached design | the videoSettings the design was generated with | the videoSettings the design was generated with |
| 3. Fallback | 30 | null (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
*PostSettingsmust be an object;status,scheduledAtpresent and well-formed;postContentan object;selectedAccountsan array) are performed at the Embed API edge and return422 { "status": false, "message": "..." }. postSettingsfield checks (allowed keys,videoDurationrange, and theaudioIdworkspace/type lookup) also happen at the edge, as422.- 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.