Validate a post
validate_postChecks a post against every target network without creating anything: returns errors (blocking, per target: each one is checked with its own text and media), warnings and, per target, the exact text with its length and the media it would publish. Call it before schedule_post when unsure whether a text, link or media fits every network; schedule_post runs the same checks and refuses an invalid post, but validate_post lets you fix it first with no side effect.
Network rules (the server enforces them on each target with its own text and media; use overrides for a shorter text on one network and mediaOverrides for other media there):
x: 280 chars (links count 23); Every link counts as 23 characters. Up to 4 images or 1 video.
bluesky: 300 chars; Up to 4 images or 1 video (50 MB max). Without media, the first link becomes a preview card.
facebook: 63206 chars; Published on the linked Facebook Page. Without media, the first link becomes a preview card.
instagram: 2200 chars; Media required, JPEG images and MP4 or MOV videos only: one image, one video (Reel), or a carousel of up to 20 images and videos, mixed. With instagramStory: true, published as a story instead: exactly one image or one video (60 s max), no caption, no replies, gone after 24 h. Links in the caption are not clickable.
tiktok: 2200 chars; Media required: one video or a set of images. Links are not clickable; hashtags are recognised. Status scheduled needs
tiktoksettings (privacy chosen by the user); without them use status review and the user picks them in Broadcast.linkedin: 3000 chars; Published on the linked personal profile. Up to 20 images or 1 video. Without media, the first link becomes an article card.
mastodon: 500 chars; Up to 4 images or 1 video.
youtube: 5000 chars; One video required, no images. The text becomes the description; the title is its first line (100 chars max). Published public, not made for kids, unless changed in Broadcast. Vertical videos of 3 min or less become Shorts.
threads: 500 chars; The 500 limit counts UTF-8 bytes: an accented letter takes 2, an emoji 4. Up to 20 images (JPEG or PNG) and videos (MP4 or MOV, 5 min max), mixed in a carousel, at most 5 links. Without media, the first link becomes a preview card. Only the first hashtag becomes a topic. Replies:
replies(optional) lists messages posted under the post right after it, from the same account, each{"text":"…","media":[…]}. On x, bluesky, threads and mastodon they form a thread (each one replies to the one before; 4 images or one video each, 20 mixed on threads; limits 280 on x with links at 23, 300 on bluesky, 500 on threads and mastodon). On linkedin, facebook and instagram only the first goes out, as a comment (text only; 1250 on linkedin), e.g. to keep a link out of a LinkedIn post. Up to 24. Each reply on X costs credits like a post. When a text is too long for X or Bluesky, put a short opening inoverrides.x(oroverrides.bluesky) and the rest inrepliesrather than cutting the message;noReplies: ["linkedin"]keeps the replies off a network (e.g. LinkedIn when it gets the whole text).xThreadandfirstCommentare older names for the same thing. Media per network:mediaOverridesworks likeoverrides(keyed by account id or platform, an account id wins) and replacesmediafor that target; a target without an entry getsmedia, an empty list sends the text alone. Upload each file once and reuse its key across targets. Alt text: give every image analt(a short factual description, in the post's language), either to upload_media or per media ref ({"key":"…","alt":"…"}, which wins); it is sent on bluesky, mastodon, x, linkedin, threads, facebook and instagram. Example, one message as a vertical 9:16 video for TikTok, Instagram (Reel) and YouTube (Short) and a 4:5 carousel elsewhere:{"platforms":["tiktok","instagram","youtube","x","facebook","threads","bluesky","mastodon"],"media":[{"key":"<4:5 image 1>"},{"key":"<image 2>"},{"key":"<image 3>"},{"key":"<image 4>"}],"mediaOverrides":{"tiktok":[{"key":"<9:16 video>"}],"instagram":[{"key":"<9:16 video>"}],"youtube":[{"key":"<9:16 video>"}]}}(4 images at most because of x, bluesky and mastodon; give instagram, threads or facebook a longer carousel of their own). The X credit cost depends only on the text and link (and the number of replies). Dates are ISO 8601 with an offset; Europe/Paris is the user's time zone.
Input Schema
| Name | Required | Description | Default |
|---|---|---|---|
| body | Yes | Main text of the post. Per-network overrides go in `overrides`; leave it as an empty string when every target has its own text there (never write quote marks as the text). | |
| link | No | Link appended after the text (becomes a preview card on Bluesky, Mastodon, Threads, Facebook and LinkedIn without media). | |
| media | No | Images (4 on x, bluesky and mastodon, 10 on facebook, 20 on instagram, threads and linkedin, 35 on tiktok) or one video, for every target without its own entry in `mediaOverrides`. Instagram and Threads also take a carousel of up to 20 images and videos, mixed. Instagram takes JPEG images and MP4 or MOV videos only. | |
| repeat | No | Publishes the post again every day, week or month at the same time (Europe/Paris), counted from scheduledAt: once an occurrence goes out, the next one is created with the same content. null stops the series. TikTok settings chosen in the app apply to every occurrence. | |
| status | No | draft: saved without a date. review (default when scheduledAt is set): waits for an approval in the app. scheduled: published automatically at scheduledAt, without approval (needs the publish scope); with scheduledAt "now" it goes out within a minute. | |
| tiktok | No | The user's TikTok settings for every TikTok target, required to schedule a TikTok post (status scheduled); without them the post waits in review for the user to pick them in Broadcast. While TikTok's audit of Broadcast is pending they are optional: the post goes out private (SELF_ONLY), interactions off. By publishing, the user accepts TikTok's Music Usage Confirmation (and Branded Content Policy when brandedContent is true). | |
| replies | No | Replies Broadcast posts under the post right after it goes out, from the same account. On x, bluesky, threads and mastodon they form a thread: each one replies to the one before. On linkedin, facebook and instagram only the first one goes out, as a comment under the post (text only; e.g. the link, kept out of the post). None on tiktok, youtube or an instagram story. Up to 24. On X each reply costs credits like a post (10 with a link). If one fails, the post stays published, the replies carry on from that one on the automatic retries, and the target's `replies` says where they stopped. null or [] removes them. When the post's text is longer than a thread network takes, put its first part in `overrides` for that network and the rest in replies. Per network, `noReplies` turns them off. | |
| xThread | No | Deprecated: same as `replies` (ignored when `replies` is given). | |
| accounts | No | Target account ids (see GET /accounts / list_accounts). | |
| hashtags | No | Hashtags appended on their own line, with or without the leading #. | |
| noReplies | No | Account ids or platform names that get no replies (e.g. ["linkedin"] to keep the thread on x and bluesky only). On update_post it replaces the list; omit it to keep it. | |
| overrides | No | Text replacing `body` for one network, keyed by account id or platform name (e.g. a shorter text for x). On update_post it replaces every override at once. | |
| platforms | No | Alternative to `accounts`: every connected account of these networks. | |
| scheduledAt | No | ISO 8601 date-time with offset (e.g. 2026-10-14T09:00:00+02:00), or "now". Required for status review and scheduled. | |
| firstComment | No | Deprecated: a single reply, same as `replies: [{ text }]` (ignored when `replies` is given). | |
| idempotencyKey | No | Client-chosen key: a retried call with the same key returns the post already created instead of a duplicate. | |
| instagramStory | No | true: every Instagram target is published as a story instead of a post (exactly one image or one video of 60 s max; no caption, no replies; gone after 24 h). Or per Instagram account: an object keyed by account id (e.g. {"<id>": true}), the accounts left out staying posts. Default false. A story takes the target's own media when it has some in `mediaOverrides`. | |
| mediaOverrides | No | Media replacing `media` for one network, keyed by account id or platform name like `overrides` (an account id wins over its platform): e.g. a vertical 9:16 video for tiktok, instagram and youtube, and a 4:5 carousel for the others in `media`. A target without an entry gets `media`; an empty list sends it no media. The same key may be used by several targets. Each target is validated with its own media. |