# Platform rules and options

Source: https://postninja.app/docs/platforms

What each platform accepts through the API and MCP: text limits, photos and videos, and the options only some platforms have. PostNinja checks all of this before scheduling, so a post that's accepted can go out.

## Text for each platform

`content` goes to every platform unless one has its own text in `platformContent`. Use it for a short X version, hashtags on Instagram, or anything else that should differ. Rules are checked against each platform's own text.

Request body:

```json
{
  "content": "Our biggest update yet: dark mode, faster search and a new editor.",
  "platformContent": {
    "x": "Dark mode is here 🌙",
    "instagram": "Our biggest update yet ✨ #productupdate #darkmode",
    "threads": "Dark mode, faster search and a new editor. What should we build next?"
  },
  "accountIds": [
    "…"
  ],
  "publishNow": true
}
```

## Photos and videos

- Upload with [`POST /api/v1/media`](https://postninja.app/docs/api#post-api-v1-media) or the MCP `upload_image` tool, then pass ids in `mediaIds` (up to 10, in display order).
- Photos: JPEG, PNG or WebP up to 30 MB, converted to JPEG. Videos: MP4 or MOV up to 512 MB.
- For videos sent through the API, pass `width`, `height` and `durationMs` when uploading so length and shape are checked before scheduling.
- Seven days after a post has gone out everywhere, its original files are deleted (the platforms keep their copies); 30 days after a failure that nobody retried. Media that was cleaned up can't be attached to a new post.

## At a glance

| Platform | Text | Media | First comment |
| --- | --- | --- | --- |
| X | 280 characters (weighted) | Up to 4 photos, or 1 video (up to 20 minutes, 512 MB); not both | Yes, up to 280 characters: posted as a reply to the post (or the thread's last post) |
| Instagram | 2,200 characters, at most 30 hashtags and 20 @mentions | Required: 1 to 10 photos or videos. Photos between 4:5 (portrait) and 1.91:1 (landscape) | Yes, up to 2,200 characters (not on Stories) |
| Threads | 500 characters, up to 5 links | Optional: up to 20 items; photos up to 8 MB, videos up to 5 minutes and 1 GB | Yes, up to 500 characters: posted as a reply |
| Facebook | 63,206 characters | Optional: up to 10 photos, or 1 video up to 1 GB; not both | Yes, up to 8,000 characters |
| TikTok | 2,200 characters | Required: 1 video (3 seconds to 10 minutes) or up to 35 photos; not both | Not supported |
| YouTube | `youtubeTitle`, up to 100 characters. Left out: the first line of the text | 5,000 characters (counted in bytes) | Yes, up to 10,000 characters: a comment on the video |
| Pinterest | 800 characters | Required: up to 5 photos, or 1 video (4 seconds to 15 minutes); not both | Not supported |

## X

Text counts by X's weights: most CJK characters and emoji count as 2, and every link counts as 23.

Each X post costs 10 credits, or 80 when it contains a link, for every selected X account. Thread posts and an X first comment are charged the same way, up front; anything that doesn't go out is refunded.

|  |  |
| --- | --- |
| Text | 280 characters (weighted) |
| Media | Up to 4 photos, or 1 video (up to 20 minutes, 512 MB); not both |
| Threads | `xThread`: up to 25 posts in all, each up to 280 characters, each with its own photos or video |
| First comment | Yes, up to 280 characters: posted as a reply to the post (or the thread's last post) |
| Stats | Not read: X posts count as published without numbers |

X thread with a photo on the second post:

```json
{
  "platformContent": {
    "x": "We rebuilt our editor from scratch. Here's what changed 🧵"
  },
  "xThread": [
    "1. It's 3x faster on big documents.",
    {
      "text": "2. Everything works offline now.",
      "mediaIds": [
        "…"
      ]
    },
    "Try it today: https://example.com/editor"
  ],
  "accountIds": [
    "…"
  ],
  "scheduledAt": "2026-10-12T09:00:00Z"
}
```

## Instagram

Business and Creator accounts. One photo is a feed post, one video is a Reel, and several items make a carousel.

`instagramFormat: "story"` posts a Story instead: exactly one photo or video, and Instagram doesn't show captions on Stories.

|  |  |
| --- | --- |
| Caption | 2,200 characters, at most 30 hashtags and 20 @mentions |
| Media | Required: 1 to 10 photos or videos. Photos between 4:5 (portrait) and 1.91:1 (landscape) |
| Videos | Reels 3 seconds to 15 minutes; videos in a carousel up to 60 seconds; up to 300 MB |
| Stories | One photo, or a 3-60 second video up to 100 MB |
| First comment | Yes, up to 2,200 characters (not on Stories) |
| Daily limit | About 50 posts per account per day, set by Instagram |

## Threads

Any Threads profile. Text-only posts are fine. Emoji count as their UTF-8 bytes (usually 4), as Threads counts them.

|  |  |
| --- | --- |
| Text | 500 characters, up to 5 links |
| Media | Optional: up to 20 items; photos up to 8 MB, videos up to 5 minutes and 1 GB |
| First comment | Yes, up to 500 characters: posted as a reply |
| Daily limit | 250 posts per profile per day, set by Threads |

## Facebook

Facebook Pages (not personal profiles). Each Page you connect is its own account.

|  |  |
| --- | --- |
| Text | 63,206 characters |
| Media | Optional: up to 10 photos, or 1 video up to 1 GB; not both |
| First comment | Yes, up to 8,000 characters |

## TikTok

TikTok asks the person posting to choose who can see each post and to disclose commercial content. Set these in `tiktok`; agents should ask rather than guess.

While our TikTok app is in TikTok's review, TikTok makes every post private (Only me), whatever `privacy` says.

|  |  |
| --- | --- |
| Caption | 2,200 characters |
| Media | Required: 1 video (3 seconds to 10 minutes) or up to 35 photos; not both |
| Privacy | `tiktok.privacy`: `PUBLIC_TO_EVERYONE` (Everyone), `MUTUAL_FOLLOW_FRIENDS` (Friends), `FOLLOWER_OF_CREATOR` (Followers), `SELF_ONLY` (Only me). Left out: public if the account allows it |
| Interactions | `allowComments`, `allowDuet`, `allowStitch` (Duet and Stitch for videos only); default true, and off when the account has them disabled |
| Disclosure | `yourBrand: true` for your own business (labelled Promotional content); `brandedContent: true` for a paid partnership (labelled Paid partnership, can't be `SELF_ONLY`) |
| Cover | `tiktok.coverTimestampMs`: the moment of the video used as its cover |
| First comment | Not supported |

TikTok settings:

```json
{
  "content": "Our spring collection is here",
  "tiktok": {
    "privacy": "PUBLIC_TO_EVERYONE",
    "allowComments": true,
    "allowDuet": false,
    "allowStitch": false,
    "yourBrand": true,
    "coverTimestampMs": 2500
  },
  "mediaIds": [
    "…"
  ],
  "accountIds": [
    "…"
  ],
  "scheduledAt": "2026-10-12T18:00:00Z"
}
```

Posting to TikTok means you agree to TikTok's Music Usage Confirmation, and to its Branded Content Policy for branded content.

## YouTube

Posts are YouTube Shorts: one vertical or square video. The post's text becomes the description.

|  |  |
| --- | --- |
| Title | `youtubeTitle`, up to 100 characters. Left out: the first line of the text |
| Description | 5,000 characters (counted in bytes) |
| Media | Required: exactly 1 video, vertical or square, up to 3 minutes |
| Thumbnail | `youtubeThumbnailId`: an uploaded photo under 2 MB |
| First comment | Yes, up to 10,000 characters: a comment on the video |

## Pinterest

Pins go to the board picked for the account on the Connections page; there's no board parameter in the API. The Pin title is the first line of the text, up to 100 characters.

|  |  |
| --- | --- |
| Description | 800 characters |
| Media | Required: up to 5 photos, or 1 video (4 seconds to 15 minutes); not both |
| First comment | Not supported |
