---
title: Platform Settings - Configure Social Post Options
description: Configure per-platform post settings for Instagram, TikTok, LinkedIn, and Threads with the PostNitro Embed API. Conditional validation rules and full field reference.
canonical: https://postnitro.ai/docs/embed/api/schedule/platform-settings
---

# Platform settings & conditional validation

The [create](https://postnitro.ai/docs/embed/api/schedule/create-scheduled-post) and [update](https://postnitro.ai/docs/embed/api/schedule/update-scheduled-post)
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? |
| --- | --- | --- | --- |
| Instagram | `instagramPostSettings` | An Instagram account is selected **and** `designId` is set | — |
| TikTok | `tiktokPostSettings` | A TikTok account is selected **and** `designId` is set | — |
| LinkedIn | `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"` | — |

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

---

## `instagramPostSettings`

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

## `tiktokPostSettings`

```jsonc
{
  "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`

```jsonc
{
  "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`

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

## `postSettings`

Required only when any selected platform's `postType` resolves to `"reel"`.
Carries video metadata.

```jsonc
{
  "videoDuration": 30,   // number, required
  "audioId": "string"
}
```

---

## 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": "..." }`.
- **All the conditional/business rules above** are enforced by PostNitro and
  relayed back as `{ "success": false, "message": "...", "error": ... }`. See the
  [error reference](https://postnitro.ai/docs/embed/api/schedule/errors) for the full list of messages.
