Posts
Update post
Update a post’s content, schedule, enabled platforms, or labels — and trigger publishing.
PUT
Request
string
required
The post ID.
string
required
The post status. One of:
draft— keep as draftscheduled— schedule for the time given inscheduled_at(must be in the future)publishing— publish immediately: dispatches the publish job to all enabled platforms
scheduled requires a scheduled_at in the future.string
The post caption/text body (max 10 000 characters at the API level; per-platform hard caps still apply via
GET /content-types). For Pinterest pins, this becomes the pin description (not meta.title).array
Replace the post’s media set. Each item must include a public
url — the API downloads and hosts it (same shape as POST /posts). Nested meta.alt_text (string, max 2000) is allowed for accessibility — that is media meta, not platforms[].meta.Prefer dedicated endpoints when practical: POST /posts/{post}/media (multipart file), POST /posts/{post}/media/from-url, or POST /posts/{post}/media/from-asset to reuse a library item.array
An array of platform entries to enable. Any platform NOT listed here will be disabled. Pass an empty array to disable all.
string
ISO 8601 datetime. Required when
status=scheduled.array
An array of label UUIDs to assign to the post. Replaces existing labels.
Per-platform meta
platforms[].meta holds settings that only apply to one social account on the post. The same keys are accepted on POST /posts and by the MCP create/update tools.
Behaviour
- Only the keys listed below are accepted. Unknown keys are dropped (they never persist).
- On update,
metais merged into the platform’s existing object. Send a key asnullto remove it (e.g."title": null). - Required-to-publish keys are enforced on this request when
statusisscheduledorpublishingand you include aplatforms[]array in the body (each submitted row is checked). Drafts are not checked. A missing key returns422onplatforms.{i}.meta.{field}(e.g.platforms.0.meta.channel_id). - If you publish with only
{ "status": "publishing" }(noplatforms[]), this endpoint does not re-validate stored meta — ensureboard_id/privacy_level/channel_idwere saved earlier. The MCPpublish-post-toolalways validates stored meta before publishing. - Media compatibility is always re-checked on
scheduled/publishing, with or withoutplatforms[]: every enabled platform’s effectivecontent_typeis validated against the post’s effective media (media kind, GIF/MOV acceptance, byte cap viasize, and video duration read from the file on upload). A failure is422onplatforms.{i}.content_type, e.g.Video exceeds the 300 MB limit for this post type (yours is 900.0 MB).— see Media → Enforced on the server. - Enum-like fields are JSON strings — send the exact literal (e.g.
"privacy_level": "PUBLIC_TO_EVERYONE"), not an integer or a different casing. - Platforms with no
metakeys: X, YouTube, Threads, Bluesky, Mastodon, Telegram.
Instagram / Facebook
LinkedIn / LinkedIn Page
TikTok
Example TikTok meta:
The pin description is the post
content, not a meta field.
Example Pinterest meta:
Discord
Mention
token formats (send these exact Discord markup strings):
There is no public REST endpoint to search Discord members/roles — construct tokens yourself (or use the dashboard mention picker).
Example Discord meta:
Response
Returns the updated post (includingplatforms[].meta).
Returns 422 with a message when the post is already finalized and cannot be edited (published, publishing, partially_published, or failed). English copy: “This post has already been processed and cannot be re-published. Duplicate it to try again.”
Tips
- To publish an existing draft, send
{ "status": "publishing" }— content/platforms already saved are kept. Required meta (board_id,privacy_level,channel_id) must already be stored; includeplatforms[]on this request if you want the API to 422 when a key is missing. - To schedule, send
{ "status": "scheduled", "scheduled_at": "2025-12-31T15:30:00Z" }. - To toggle which platforms are active without changing content, send only the
platforms[]array. - Clear a meta field with
null:{ "meta": { "title": null, "link": null } }.

