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.

EndpointBodyReturnsNotes
POST/2/articles/drafttitle, content_statedata.id, the draft article IDCreates the draft. Nothing is public yet. content_state must already be built.
POST/2/articles/{article_id}/publishnonedata.post_id, the article seed postPublishes 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.

articles-draft-then-publish.sh
# 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

X Articles API
OpenTweet
Create a draft from an API call
POST /2/articles/draft
POST /api/v1/articles, status stays draft
Publish a draft
POST /2/articles/{id}/publish
publish_now: true, or POST /api/v1/articles/:id/publish
Send markdown as the body
content_state only. You write the converter.
content_markdown is the input. Conversion is handled.
Schedule for a future time
No scheduling parameter exists.
scheduled_date on the create call
List your articles
No documented list endpoint.
GET /api/v1/articles with status and account filters
Update an existing draft
No documented update endpoint.
PUT /api/v1/articles/:id
Retry a failed publish
You rebuild the request and call again.
Article stores failed_reason and can be republished
Works without an X developer account
Developer app and pay-per-use credits required.
Normal X login, flat monthly fee

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.

opentweet-article.sh
# 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.

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.