Last updated: August 31, 2026
The X Articles API endpoints, and what they still cannot do
X shipped official Articles endpoints on June 11, 2026. POST /2/articles/draft creates a draft, POST /2/articles/{article_id}/publish publishes it. Auth is OAuth 1.0a or OAuth 2.0 PKCE with tweet.read, tweet.write, and users.read. The publishing account needs any X Premium tier. There is no scheduling endpoint, and you build DraftJS content state by hand.
This is the reference page: exact paths, exact scopes, exact responses, and an honest list of the gaps. If you want the deep dive on the content_state format itself, block types, entity ranges, and the image rules, that is in publish X Articles via API.
Endpoint reference
Two endpoints. That is the entire official surface as of August 2026.
| Endpoint | Body | Returns | Notes |
|---|---|---|---|
| POST/2/articles/draft | title, content_state | data.id, the draft article ID | Creates the draft. Nothing is public yet. content_state must already be built. |
| POST/2/articles/{article_id}/publish | none | data.post_id, the article seed post | Publishes the draft. Returns a post ID, not a URL. You construct the URL yourself. |
Auth
OAuth 1.0a or OAuth 2.0 with PKCE. User context only. App-only bearer tokens are rejected because an article publishes as a specific account.
Scopes
tweet.read
tweet.write
users.read
Account requirement
Any X Premium tier on the publishing account. Premium+ has not been required since January 7, 2026.
# 1. Create the draft. content_state is snake_case, not DraftJS camelCase.
curl -X POST https://api.x.com/2/articles/draft \
-H "Authorization: Bearer $X_USER_ACCESS_TOKEN" \
-H "Content-Type: application/json" \
-d '{
"title": "What we learned shipping weekly",
"content_state": {
"blocks": [
{ "text": "What we learned shipping weekly", "type": "header-one" },
{ "text": "Short feedback loops beat big releases.", "type": "unstyled" }
],
"entities": []
}
}'
# => { "data": { "id": "1815550000000000000" } }
# 2. Publish it. Separate call, no body.
curl -X POST https://api.x.com/2/articles/1815550000000000000/publish \
-H "Authorization: Bearer $X_USER_ACCESS_TOKEN"
# => { "data": { "post_id": "1815550000000000001" } }The four gaps
The endpoints existing is real progress. Before June 2026 there was no supported way to publish an X Article from code at all. But the surface is deliberately minimal, and the gaps are structural rather than cosmetic.
1. No scheduling. There is no parameter, and no second endpoint. A draft sits until something calls publish. If you want an article live at 9am Tuesday, you are running a cron job, a queue, and a retry policy. That is real infrastructure for one feature.
2. No markdown. The body is content_state: an array of blocks plus an entities array, in snake_case. It looks like DraftJS raw state but the field names differ, so serializing DraftJS output directly fails. If your source of truth is markdown, and for most people writing long-form it is, you own that converter forever, including inline style ranges and entity ranges.
3. No read-back. There is no documented list or get endpoint. Your own database is the only record of what you published, when, and under which account. Multi-account setups feel this immediately.
4. No update. There is no documented endpoint to edit a draft you already created. A typo caught before publish means building the whole content_state again.
Two limits from the format, not the endpoints
content_state has no code-block type, so fenced code degrades to unstyled text. And article images only accept the tweet_image media category, so GIFs and videos are rejected. Both are covered in detail in publish X Articles via API.Official endpoints vs the OpenTweet articles API
What OpenTweet does not change
The Premium requirement is on the X account, not the tool. If the connected account has no active X Premium subscription, the publish fails on either path. OpenTweet stores the failure reason instead of losing the article, but it cannot grant eligibility.Markdown in, article out
The wedge is the source of truth. If markdown is what you write and what your repo stores, then every hand-built content_state is a translation step you maintain. Send the markdown instead and let the conversion, the image uploads, and the two-step draft-then-publish flow happen behind one call.
# The same article, from markdown, scheduled, in one call.
curl -X POST https://opentweet.io/api/v1/articles \
-H "Authorization: Bearer ot_your_api_key" \
-H "Content-Type: application/json" \
-d '{
"title": "What we learned shipping weekly",
"content_markdown": "# What we learned shipping weekly\n\nShort feedback loops **beat** big releases.",
"scheduled_date": "2026-09-03T13:00:00Z"
}'The same thing is available to AI agents as MCP tools at mcp.opentweet.io/mcp, including create, update, list, and publish. Full endpoint reference in the developer docs, and the scheduling behaviour is covered in how to schedule X Articles.
7-day free trial. Cancel anytime.
Frequently asked questions
What are the official X Articles API endpoints?
There are two. POST https://api.x.com/2/articles/draft creates a draft from a title and a content_state object and returns the draft article ID. POST https://api.x.com/2/articles/{article_id}/publish publishes that draft and returns the post_id of the article seed post. They landed on June 11, 2026.
What OAuth scopes does the X Articles API need?
tweet.read, tweet.write, and users.read on a user-context token. Both OAuth 1.0a and OAuth 2.0 with PKCE are accepted. App-only bearer tokens will not work, because an article is published as a specific user.
Do X Articles require Premium+ to publish through the API?
No. Any X Premium tier can publish articles, and has been able to since January 7, 2026. The Premium+ requirement is the old rule and it no longer applies. The requirement sits on the publishing account, not on the developer app.
Can I schedule an X Article through the official API?
No. There is no scheduling parameter and no scheduling endpoint. A draft created with POST /2/articles/draft sits indefinitely until something calls the publish endpoint. If you want an article to go live at a specific time, you have to run that timer yourself or use a platform that runs one.
Can I send markdown to the X Articles API?
No. The body must be a content_state object: an array of blocks plus an entities array, in snake_case. It resembles DraftJS raw state but is not identical to it. If your source of truth is markdown, you write and maintain the converter yourself, including inline style ranges and entity ranges.
Can I list or update articles through the X API?
Not through the two published endpoints. The official surface is create-draft and publish. There is no documented list, read-back, or update endpoint, so your own database has to be the record of what you published and when.
Is there a simpler API for publishing X Articles?
Yes. OpenTweet exposes articles at POST https://opentweet.io/api/v1/articles taking a title and a content_markdown body, with either publish_now or a scheduled_date. It does the content_state conversion, the image uploads, and the two-step draft-then-publish flow, and it needs no X developer account.
Related guides
Everything else about publishing long-form on X from code.
Publish X Articles via API
The content_state format explained block by block, plus the gotchas.
Schedule X Articles
X has no scheduling endpoint. Here is how scheduling actually works.
Can you schedule X Articles?
The short answer, and what the native composer does and does not do.
X Articles character limit
How long an article can actually be, by tier.
Blog to X Article
Turn an existing post into an article draft without hand-building content_state.
X Articles in OpenTweet
Write in markdown, schedule, and publish to X across multiple accounts.
Stop hand-building content_state
Send markdown, get a published or scheduled X Article. REST or MCP, no X developer account, no converter to maintain.
7-day free trial. Cancel anytime.