All docs
Connect

X Organic: post, schedule and measure on X with an AI agent

TL;DR

X Organic connects over OAuth 2.0 to the X API v2 as your X profile, separate from X Ads. The agent uses the social tools: reads, drafts, scheduling through Agent Planners' queue, publishing, edits within X's window and deletes. Publishing, scheduling, editing and deleting always wait for a person; reading, drafting and cancelling follow your approval setting (by default every change waits for your approval; auto-approve is opt-in). X bills per request and those calls are billed in credits.

Connect

  1. 1Once per app, on developer.x.com: open the app, turn on User authentication settings with OAuth 2.0, set App permissions to Read and write, and add the callback https://www.agentplanners.com/api/oauth/x-organic/callback.
  2. 2Once per app: buy pay-per-use credits in the X Developer Console. Without credits X refuses every read and post.
  3. 3On Integrations, press Connect on the X Organic card and authorize the app on X. Your profile becomes an account row; Re-authorize renews the sign-in and keeps the row.
Scopes requested: tweet.read, tweet.write, users.read, media.write and offline.access (offline.access keeps the connection alive; X rotates the refresh token, which Agent Planners stores each time).

Tools

ToolKindOn X
social.list_accountsReadYour connected X profile(s), whether each can post
social.check_permissionsReadThe scopes the connection holds and what is missing — sends nothing
social.get_publishing_limitsReadWhat X allows: text and media limits, the edit window, no native scheduling
social.list_posts / social.get_postReadRecent posts, or one post, with public metrics, edit history and editable-until
social.get_post_insightsReadA post's impressions, likes, replies, reposts, quotes and bookmarks
social.generate_postReadDraft text from a brief, measured against 280 weighted characters — nothing is sent
social.list_scheduled_postsReadDrafts and scheduled / published / failed posts in the queue
social.create_draftWriteSave a draft in the queue (nothing goes to X)
social.upload_mediaWriteUpload an image or video to X for a later post (not public)
social.schedule_postWriteQueue a post for a time — always waits for a person
social.publish_postWritePost now — always waits for a person
social.update_scheduled_post / social.cancel_scheduled_postWriteChange (waits for a person when it changes text, media or time) or cancel a queued post
social.edit_postWriteEdit within X's window for the post — always waits for a person
social.delete_postWriteDelete a post (and its edit chain) — always waits for a person

What X does not support

  • Profile changes (name, bio, picture): X API v2 has no profile-update endpoint — social.update_profile answers so and sends nothing.
  • Native scheduling: X's API cannot schedule; Agent Planners' queue publishes at the approved time.
  • Drafts or hidden posts on X: a draft exists only in Agent Planners; published:false is a Facebook-only option and is refused for X.
  • Edits outside the window: X sets the window per post (30 minutes in its docs, an hour measured), at most five edits, each a new post id; replies to others, polls and reposts cannot be edited.

Approvals and duplicates

  • Publishing, scheduling, editing and deleting always wait for a person — in the app, schedules, projects, MCP and the REST API — even with auto-approve on.
  • One queue serves every lane, so the same post for the same account is never published twice; an uncertain send is read back against your recent posts before any retry.
  • Forbidden Rules apply to every social tool.

Billing

Prices are X's pay-per-use rates (docs.x.com/x-api/getting-started/pricing, read 26 October 2026; X says they can change). X's lower owned-reads price is not applied to an account read through its sign-in, so your own timeline is billed at the post-read price. A call is billed only when X accepted it, a retry of the same call is never billed twice (a new read is a new call), and the credit price keeps at least a 70 % margin over X's cost on every plan. Each tool call also carries the usual per-call charge (7 credits for a read, 34 for a write over MCP and REST).

X API callX's priceCredits
Post created$0.015 / request100
Post created with a link$0.20 / request1,334
Post read (any post, your own included)$0.005 / post returned34 per post
User read (the connected profile)$0.010 / user returned67
Delete$0.010 / request67
Media uploadnot listed by X0

Troubleshooting

AnswerMeaningWhat to do
402 / "credits"The X app has no pay-per-use credits leftBuy credits in the X Developer Console
401 / Re-authorizeThe X sign-in expired or was revokedRe-authorize on the X Organic card
429X's rate limitThe tool waits for X's reset time; try later
Missing scopeThe connection lacks tweet.write or media.writeRe-authorize and accept every permission

From MCP or the REST API

Over MCP, call the social__* tools (or search_tools "post to X"). Over REST, POST /api/v1/tools/{tool} with a bearer credential. A write that waits for a person answers 202 with a request id to poll.

bash
curl -X POST https://www.agentplanners.com/api/v1/tools/social__schedule_post \
  -H "Authorization: Bearer $AGENTPLANNERS_API_KEY" \
  -H "Content-Type: application/json" \
  -H "Idempotency-Key: launch-post-1" \
  -d '{"accountId":"<x account id from social__list_accounts>","text":"We just shipped one-click UTM links.","scheduledAt":"2026-11-02T09:00:00Z"}'
All organic networks: Organic social · approvals: Approvals.

Frequently asked questions

Can the agent post to X without my approval?
No. Publishing, scheduling, editing and deleting always wait for a person, even with auto-approve on.
Why does X refuse every call?
Usually the X app has no pay-per-use credits: buy credits in the X Developer Console. A 401 means re-authorize the X Organic card.
Can it change my X bio or profile picture?
No — X API v2 has no profile-update endpoint; change it in X.

Related