create:post

Publishes a post, once a person has approved it. The call comes back at once as pending with a ref: that is not an error, and nothing has been sent or charged. Approvals is what happens in between.

Fields

text Required. Up to 280 characters for most accounts, and up to 25,000 for an account with X Premium. Write it at the length it needs: any length up to 25,000 is taken, and the person approving sees its length. okaybot_profiles shows long_posts: true on an account known to take long posts
publish_at when to publish, ISO 8601 UTC. Leave it and publish_in_minutes out to go as soon as a person approves
publish_in_minutes or when to publish as whole minutes from now: 60 is an hour, 1440 a day. publish_at wins when both are sent
profile the account to post as. Optional when the agent has one
reason Required over MCP. One short sentence. This is what the person reads on the approval card
idempotency_key send the same key twice and the second call returns the first answer instead of proposing it again

$0.200 against $0.015 is X's own price for a post carrying a URL. Okaybot spots the link before the call leaves, charges the right price, and says so on the approval card.

What comes back

First, immediately:

{ "status":  "pending",
  "ref":     "K08SAJJC",
  "message": "pending: this post is waiting for a person to approve it, and goes out on its own once they do. You do not need to poll unless you need its result before you move on.",
  "poll":    "/gateway/asks/K08SAJJC" }

Then, from the poll, if the agent needs the post before it moves on, once it is approved:

{ "status": "published",
  "ref": "K08SAJJC",
  "data": {
    "data": {
      "id": "1832000000000000112",
      "text": "We rebuilt the pipeline this week.",
      "edit_history_tweet_ids": ["1832000000000000112"]
    }
  } }

A post carrying publish_at or publish_in_minutes answers scheduled instead, with the time on it as publish_at, and sits on the calendar until then.

A write's answer is three fields and no more

X does not honour a field list on a create, so there is no created_at and no public_metrics here however much was asked for. Read the post back with read:post if you need the rest, and pay for it.

Nothing is charged unless it is published

A post you refuse, or that expires unanswered, costs nothing.