Skip to main content
PUT

Request

string
required
The post ID.
string
required
The post status. One of:
  • draft — keep as draft
  • scheduled — schedule for the time given in scheduled_at (must be in the future)
  • publishingpublish immediately: dispatches the publish job to all enabled platforms
Cross-validated: 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, meta is merged into the platform’s existing object. Send a key as null to remove it (e.g. "title": null).
  • Required-to-publish keys are enforced on this request when status is scheduled or publishing and you include a platforms[] array in the body (each submitted row is checked). Drafts are not checked. A missing key returns 422 on platforms.{i}.meta.{field} (e.g. platforms.0.meta.channel_id).
  • If you publish with only { "status": "publishing" } (no platforms[]), this endpoint does not re-validate stored meta — ensure board_id / privacy_level / channel_id were saved earlier. The MCP publish-post-tool always 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 meta keys: X, YouTube, Threads, Bluesky, Mastodon, Telegram.

Instagram / Facebook

LinkedIn / LinkedIn Page

TikTok

Example TikTok meta:

Pinterest

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 (including platforms[].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; include platforms[] 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 } }.