update_post
posts:write
Edit one platform variant of a post: its copy (contentText), media or platformPayload. To attach a visual, pass the postMedia returned by create_branded_image or create_carousel as media (X: 1-4 images; LinkedIn: 1-20 images or one PDF document), or a video asset from import_media_from_url or complete_media_upload; pass {} to remove it. On each X image, altText (at most 1000 characters) is posted as that image's accessibility text.
To tag people in the X post's media, set platformPayload.media.tagged_user_ids to at most 10 numeric X user ids (the tweet as a whole, not per image). An X thread keeps its first post in contentText and the rest in platformPayload.thread (an array of strings, each at most 280 characters as X counts them); send the whole thread array to change it, or {} as platformPayload to make it a single post. To make an X post quote another post on X, pass its link as quoteTweetUrl (null stops quoting; the quote is kept when you change the thread).
To post it in an X Community the user is a member of, pass the community's link as communityUrl (null posts to followers instead; it is kept when you change the thread). To choose who can reply to an X post, pass replySettings: everyone (anyone; X's default), following (accounts you follow), mentionedUsers or verified (null or everyone clears a restriction); one stored value is sent on every tweet in a thread. To turn an X post into a poll, pass poll ({options: 2-4 strings up to 25 characters each, durationMinutes: 5-10080}); null removes the poll and makes it a plain post again; omitting it keeps the current poll when you change the thread.
A poll can't have media or a quote on the same post — remove one before adding the other. TikTok posts land in the inbox by default. Do not set platformPayload.postMode to direct — Direct Post is only available from the in-app composer after privacy, commercial-content disclosure and Music Usage Confirmation.
Call it when the user asks for changes to a draft, e.g. to apply copy they picked from rewrite_post; get postId from list_posts or create_draft_post. It cannot change status, timing or the account it posts from.
Editing the copy of an approved or scheduled post sends its group back to Review as pending approval and clears its slot. Show the user the final copy and have them confirm it before calling approve_post_group; to discard a draft, use reject_post_group.
Input
postIdstring (uuid)requiredcontentTextstringmin length 1 · max length 10000
mediaobjectplatformPayloadobjectquoteTweetUrlstring | nullX posts only: a link to a post on X (https://x.com/name/status/123) for this post to quote, or null to stop quoting. Omit to keep the current quote, even when you send platformPayload.
communityUrlstring | nullX posts only: a link to an X Community the user is a member of (https://x.com/i/communities/123) to post in, or null to post to followers instead. Omit to keep the current community, even when you send platformPayload.
replySettingsstring | nullX posts only: who can reply. everyone, following, mentionedUsers or verified. One stored value; on a thread it is sent on every tweet. null or everyone clears a restriction so anyone can reply. Omit to keep the current setting, even when you send platformPayload.
pollobject | nullX posts only: replaces this post's poll with these options and duration, or null to remove the poll and make it a plain post. Omit to keep the current poll, even when you send platformPayload. Can't be combined with media or a quote.
Fields
optionsarray<string>required2-4 choices voters pick between, each up to 25 characters.
at least 2 items · at most 4 items
durationMinutesintegerrequiredHow long the poll stays open to votes, in minutes (5-10080, i.e. 5 minutes to 7 days). 1440 is one day.
min 5 · max 10080
Permission
Needs the posts:write scope: create drafts. It changes your workspace, so clients may ask you to confirm each call.
Example call
Your assistant sends this for you. It is shown so you can see the shape of a call, with placeholder values for the required fields.
{ "jsonrpc": "2.0", "id": 1, "method": "tools/call", "params": { "name": "update_post", "arguments": { "postId": "3f8e2c1a-0000-4000-8000-000000000000" } }}Same action over the REST API
The tool runs PATCH /v1/orgs/{orgId}/marketing/posts/{postId} as the signed-in user, with the same validation, approval rules and limits. See it in the Posts API reference.