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) or POST /posts/{post}/media/from-url.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. - 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 } }.

