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)
  • publishing — publish 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), 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, 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.
  • Media compatibility is always re-checked on scheduled / publishing, with or without platforms[]: every enabled platform’s effective content_type is validated against the post’s effective media (media kind, GIF/MOV acceptance, byte cap via size, and video duration read from the file on upload). A failure is 422 on platforms.{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 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 } }.