List articles
The drafts or the published articles of your account.
/client/articlesYour account, your proxy, your risk.
Account actions run with the session cookie of your own X account and go out through your own proxy. Use only accounts you control and follow X's rules. Automated posting, following or liking can get the account limited or suspended; that is between you and X. Treat the cookie like a password: it gives full access to the account. Trial keys cannot call these endpoints.
How to copy the cookie and which proxy to use: Your X session (cookie).
Parameters
cookiebody · string · requiredCookie header of your own logged-in X session: auth_token=...; ct0=... (guest_id is used when present). How to copy it: /docs/x-session.
proxybody · string · requiredYour proxy, format http://user:pass@host:port. The requests to X go out through it. Used only for this request.
lifecyclebody · string · optional · default draftdraft or published.
user_idbody · string · optionalYour own numeric user ID. Only needed when the cookie has no twid; ignored when it has one.
countbody · integer · optional · default 20Articles per page, 1 to 100 (more is capped at 100). X treats it as a hint.
cursorbody · string · optionalBottom cursor from the previous page. Leave it out for the first page.
Body parameters are sent as a JSON object with Content-Type: application/json.
Paginated: pass the bottom cursor of one page as cursor to get the next. Each page is one billed call. See Pagination.
Notes
- Needs X Premium on the account. Without it X refuses with error code 37 ("Twitter Blue claim is not enabled").
- No simple format: with format=simple the answer is the usual {status_code, response} wrapper.
- The
cookieandproxyfields: Your X session (cookie).
Example request
curl -X POST 'https://api.twittrapi.com/client/articles' \
--header 'X-API-KEY: YOUR_API_KEY' \
--header 'Content-Type: application/json' \
--data '{"cookie":"auth_token=...; ct0=...","proxy":"http://user:pass@host:port","lifecycle":"published","count":20}'import httpx
resp = httpx.post(
"https://api.twittrapi.com/client/articles",
headers={"X-API-KEY": "YOUR_API_KEY"},
json={
"cookie": "auth_token=...; ct0=...",
"proxy": "http://user:pass@host:port",
"lifecycle": "published",
"count": 20,
},
timeout=60,
)
print(resp.status_code, resp.json())const resp = await fetch("https://api.twittrapi.com/client/articles", {
method: "POST",
headers: { "X-API-KEY": process.env.TWITTRAPI_API_KEY, "Content-Type": "application/json" },
body: JSON.stringify({
cookie: "auth_token=...; ct0=...",
proxy: "http://user:pass@host:port",
lifecycle: "published",
count: 20,
}),
});
console.log(resp.status, await resp.json());Base URL https://api.twittrapi.com, key in the X-API-KEY header. The SDKs do not wrap account actions, so the examples are plain HTTP calls.
Response
Wrapper built by the API: {"status_code": <X status>, "response": "<X response body as a string>"}. The HTTP status is X's status when X answered 4xx or 5xx, otherwise 200. Parse response a second time to get X's JSON. On success response is X's ArticleEntitiesSlice answer with your articles and their IDs (use one as article_id).
In the raw format, field names and nesting come from X and can change without notice. See Response format.
Errors
- 400The body is not valid JSON.
- 422A required field is missing (including proxy), an ID is not numeric, or the cookie has no ct0. Also: the account is suspended, X rejected the session, or the text was already posted.
- 407The proxy is unreachable or timed out.
- 422lifecycle is not draft or published, or the cookie has no twid and user_id is missing or not numeric.
- X'sAny status X answers with (for example 401, 403, 404): passed through with X's body.
Errors every endpoint can return (401, 402, 403, 404, 408, 409, 429, 5xx), and which of them are charged, are on the Errors page. Calls that fail with 400, 407, 408, 409 or a 5xx error are refunded.