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 | — |
facebookPostSettings | A Facebook Page is selected and designId is set | Yes, when status = "SCHEDULED" | |
pinterestPostSettings | A Pinterest board is selected and designId is set | Yes, when status = "SCHEDULED" | |
| — | 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"
}facebookPostSettings
Facebook accounts are Pages (accountType: "page" in
social accounts).
{
"postType": "carousel | link_carousel | image | reel",
"linkUrl": "https://example.com", // link_carousel only; required when SCHEDULED
"callToAction": "LEARN_MORE", // link_carousel only; optional, see values below
"showEndCard": true, // link_carousel only; optional, default true
"useSlideTitles": false, // link_carousel only; optional, default false
"useSlideDescriptions": false // link_carousel only; optional, default false
}postType | Publishes as |
|---|---|
carousel | One post with every slide as a photo (multi-photo post) |
link_carousel | Swipeable cards, one per slide, each linking to linkUrl |
image | A single photo (single-slide designs) |
reel | A video, published as a Reel |
For Facebook, a designId is required when status = "SCHEDULED". The
link_carousel fields are ignored for other post types.
link_carousel rules:
linkUrlmust be an absolutehttp(s)URL with a real domain, for examplehttps://example.com. It’s required when scheduling; drafts can be saved without it, but a value that is sent must be valid.- The design needs 2 to 10 slides. Facebook shows up to 5 cards and chooses which ones.
- Each card uses its slide as the image. Facebook only accepts custom card
images for links on a domain the Page’s business has verified in Meta
Business Settings; otherwise publishing fails with a message saying so. Use
carouselfor designs linking elsewhere. useSlideTitles/useSlideDescriptionsset each card’s headline and description from the slide’s title and description. When off, or when a slide has no title or description, Facebook uses the link’s own.showEndCardcontrols Facebook’s final card linking to the Page.
callToAction values (omit or send null for no button):
BOOK_TRAVEL, BUY_NOW, CALL_NOW, DOWNLOAD, GET_DIRECTIONS,
GET_QUOTE, INSTALL_APP, INSTALL_MOBILE_APP, LEARN_MORE, LIKE_PAGE,
LISTEN_MUSIC, MESSAGE_PAGE, NO_BUTTON, OPEN_LINK, PLAY_GAME,
SHOP_NOW, SIGN_UP, SUBSCRIBE, USE_APP, USE_MOBILE_APP,
WATCH_MORE, WATCH_VIDEO. Some of these are meant for ads, and Facebook may
reject them on organic Page posts.
reel rules: the design must be between 16:9 (landscape) and 9:16
(vertical). Reels also use postSettings for their render
settings.
pinterestPostSettings
Pinterest accounts are boards (accountType: "board" in
social accounts). Each board you connect is its
own account, so the Pin goes to whichever boards are in selectedAccounts;
there is no board field here.
{
"postType": "carousel | image | reel",
"title": "string | null", // optional, max 100 characters
"link": "https://example.com" // optional destination URL
}postType | Publishes as |
|---|---|
carousel | A carousel Pin, one image per slide |
image | A single image Pin (single-slide designs) |
reel | A video Pin, uploaded to and processed by Pinterest |
For Pinterest, a designId is required when status = "SCHEDULED". The
caption (postContent.pinterest, or common) is published as the Pin
description; only the first 800 characters are used.
Rules:
titleis optional and at most 100 characters.linkis optional. When sent, it must be an absolutehttp(s)URL with a real domain, for examplehttps://example.com. On a carousel Pin every image links to it.- A
carouselneeds 2 to 5 slides. A 1-slide design is published as an image Pin; more than 5 slides fails at publish time. - Any design size works except ultra-wide (wider than 21:9). 2:3 is recommended.
reelPins also usepostSettingsfor their render settings.
postSettings
Applies when any selected platform’s postType resolves to "reel" — it carries
the reel’s music.
{
"backgroundMusicId": "string" // optional, media id of an audio track
}A reel plays its design’s motion and runs as long as it does, as the video did
when it was made (Length), so its
length isn’t yours to set. videoDuration is still accepted, so requests that
send it keep working, but it’s ignored. This is the same backgroundMusicId
the generate and import endpoints take in
videoSettings, so a track carries
straight over from creating a video to scheduling it.
audioId, the field’s older name, is still accepted. Send backgroundMusicId or
audioId, not both. videoDuration, backgroundMusicId and audioId are the
only accepted keys; anything else returns a 422. That includes
backgroundMusicVolume: a reel takes no volume.
backgroundMusicId 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 its music is
missing, it’s resolved in turn:
- Your request: the
backgroundMusicIdoraudioIdyou sent. - The attached design: the music the design was generated with.
- Fallback:
null(no audio).
The design lookup applies to designs created through the generate
or import endpoints, which keep the
videoSettings they were created with. A design made in the editor has none, so
it falls through to no audio.
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 and thebackgroundMusicIdoraudioIdworkspace/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.