posts_validate
Check before you commit: pass an inline draft (`content` + `channels`) to fit-check without persisting anything, or a stored post's `id` to re-check exactly what is saved (media readiness included).
Check before you commit: pass an inline draft (content + channels) to fit-check without persisting anything, or a stored post’s id to re-check exactly what is saved (media readiness included). Returns the standard post response with ready, per-channel errors[] with machine fixes, warnings[], and the Ink cost (ink_estimate — publishing is free everywhere except X, which bills per post and 13× more when the text contains a URL). For inline drafts id is null.
Input
| Field | Type | Required | Description |
|---|---|---|---|
organization | string | no | Organization slug to act in (see organizations_list). Optional: API keys are bound to one organization; OAuth connections default to your active organization. |
id | string | no | Stored post id to re-check; omit for an inline draft |
content | string | no | The shared copy as markdown: **bold**, *italic*, [label](url), # heading, - bullet, blank lines between paragraphs. Markdown that contains no markup is posted exactly as typed — handles, URLs, and snake_case are safe — and \* shows a literal delimiter. Each channel’s copy is adapted from this unless per_channel overrides it. Optional only for a media-only post. |
channels | array | no | Target channels: channel ids from channels_list and/or provider names (“x”, “linkedin”), mixed. On update, when present it REPLACES the target set. A post response’s channels[] entries are accepted as-is. |
per_channel | object | no | Per-channel overrides keyed by channel id or provider name. A non-null value also ADDS that channel to the targets; on update, a null value ({“x”: null}) resets that channel to the shared content. Overriding one channel never touches the others. |
media | array | no | Ordered media to attach, in render order: file ids (file_…) from files_upload and/or public https:// URLs (fetched and stored server-side — the response echoes each url’s file id; poll files_get until ready before publishing). Each target channel must support the media (see capabilities.media). A post response’s media[] entries are accepted as-is. |
Result
JSON on success. A refusal comes back as an error prefixed with its code (NOT_FOUND, FORBIDDEN, TOO_MANY_REQUESTS, …) and a message written to be acted on — read it before retrying.
The same operation elsewhere
This tool and the REST operation postsValidate and the CLI command inklate posts validate run the same guarded procedure the dashboard uses — same permissions, same validation, same tenant isolation.