Update a post
Edits an existing post. Works on drafts, scheduled posts, and posts that previously failed or were cancelled — basically anything that hasn’t been published yet. Posts that are currently publishing, already published, or partially published can’t be edited and will return a 400.
The body is the same shape as POST /posts.
The list of accounts and the list of media are replaced wholesale by what you send. Anything that was attached before is swapped out for the new lists. The history of past publish attempts is kept around for the audit log, but the per-account rows themselves are rebuilt from scratch.
If the post was scheduled, editing it cancels the pending publish and Postbreeze re-queues it with the new content and time. We do this so you can change a scheduled post without having to cancel and recreate it.
Only workspace owners, admins, and editors can edit posts.
Authorizations
Your Postbreeze API key
Path Parameters
Prefixed cuid of the post to update.
"post_01HZX5T2K9Q3RB6N6JZP3RYV0M"
Body
One entry per platform to publish to. Order is preserved in the UI.
[
{
"accountId": "soc_01HZW2K9R5T8V3N7M4P0J1Q6BD",
"platformOptions": { "platform": "INSTAGRAM", "kind": "FEED" }
}
]Default caption applied to every platform unless overridden via platforms[].captionOverride.
10000"Just shipped a new feature 🚀"
ISO-8601 publish time. Post is created as SCHEDULED and a Temporal workflow is started. Omit for a draft.
"2026-06-15T09:00:00.000Z"
ISO-8601 time to pin the post on the calendar without actually scheduling it (status stays DRAFT). Ignored when scheduledFor is set.
IANA timezone the user composed in (e.g. Europe/Stockholm). Used to render scheduledFor correctly in the UI; not used by the publisher.
Media to ingest by URL. The server fetches each URL (SSRF-guarded) and stores it in your media library. Resulting MediaAsset ids are prepended to mediaIds.
IDs of media already in your library (returned from POST /media/presign or POST /media/from-url).
Per-asset alt-text overrides keyed by MediaAsset.id. Falls back to MediaAsset.altText when an entry is absent.
Response
The updated post.
Prefixed cuid identifier.
Workspace this post belongs to.
User id of the author.
Aggregate publish state. Derived from per-target statuses (PARTIALLY_PUBLISHED when some succeed and some fail).
DRAFT, NEEDS_APPROVAL, SCHEDULED, PUBLISHING, PARTIALLY_PUBLISHED, PUBLISHED, FAILED, CANCELED Default caption applied to every target unless overridden via targets[].captionOverride.
ISO-8601 publish time. Doubles as the calendar pin for drafts (set via draftScheduledAt).
IANA timezone the post was composed in. Cosmetic — used by the UI.
Temporal workflow id driving this post's publish, when scheduled. Null on drafts and after cancellation.
Workflow id staged during the schedule transaction. Visible while a Temporal start is in flight; cleared on commit.
User id of the approver. Set when an NEEDS_APPROVAL post is approved.
When the post was approved, if applicable.
True when the post was authored by an API-key or OAuth request. Cookie-session dashboard posts are false.
True when the request used the flat platforms[] body shape. False for the nested targets[] shape and dashboard posts.
Soft-delete timestamp. Listings and GET /posts/:id exclude rows where this is non-null.
When the post was created.
When the post was last modified.
One fan-out target per connected account this post publishes to.
Library media attached to the post, ordered by order. Per-target overrides on targets[].mediaIds win over this list.