TwitterAPIs Docs
API ReferenceUser Reads

Full Tweet History API

Collect a user's tweet history in bulk, auto-paginating server-side across upstream pages. Unlike GET /user/tweets (one upstream page per call), this drives pagination for you and returns a large batch in one request. Each call is bounded by both `max` and a server-side time budget, so it always returns inside a normal client timeout. When more history remains the response carries a `next_cursor` — pass it back as `cursor` to continue, and repeat until `next_cursor` is null. Uses the public account pool: no registered session required. Cost: $0.0024 per call.

GET
/user/tweets/complete

Authorization

bearerAuth
AuthorizationBearer <token>

Pass your API key as a bearer token on every request: Authorization: Bearer <API_KEY>.

In: header

Query Parameters

user_id*string

Numeric ID of the target account. Resolve a handle with GET /user/info first.

max?integer

Target number of tweets to collect in this call. Defaults to 200. This is a MINIMUM target, not a hard cap: pages arrive in whole chunks, so a response may contain up to one page (<=100) more than requested. Twitter's ~3200-per-user history ceiling still applies overall.

cursor?string

Resume point from a previous response's next_cursor. Omit on the first call. Pass it back to continue collecting where the last call stopped.

Response Body

application/json

application/json

application/json

application/json

application/json

application/json

application/json

curl -X GET "https://example.com/user/tweets/complete?user_id=44196397&max=200&cursor=DAAHCgABHNqVL6L__zs"
{  "count": 201,  "next_cursor": "DAAHCgABHNqVL6L__zsLAAIAAAAT",  "tweets": [    {      "id": "2071092912000246106",      "text": "RT @XFreeze: xAI models now support Zero Data Retention (ZDR) on OpenRouter",      "created_at": "Sun Jun 28 04:46:43 +0000 2026",      "lang": "en",      "is_retweet": true,      "is_quote": false,      "author": {        "id": "44196397",        "username": "elonmusk",        "name": "Elon Musk",        "verified": true,        "followers_count": 240574388      },      "retweet_count": 208,      "view_count": 599857    }  ]}
{  "error": "bad_request",  "message": "Missing or malformed parameter. Fix the request before retrying."}
{  "error": "unauthorized",  "message": "The API key is missing, malformed, or revoked. Check the Authorization header."}
{  "error": "insufficient_credits",  "message": "Your balance is exhausted. Top up your credits to continue."}
{  "error": "not_found",  "message": "The resource does not exist, for example a deleted tweet or a private account."}
{  "error": "rate_limited",  "message": "Too many requests. Back off and retry with exponential backoff."}
{  "error": "server_error",  "message": "Something failed on our side. Retry with backoff; if it persists, contact support."}

Pricing

UnitPrice
Per call$0.0024
Per 1,000 calls$2.40
Per 1,000 records (~200 per call)~$0.01

Pagination

This endpoint is cursor-paginated and returns a large batch per call (~200 by default, not ~20). Pass the next_cursor from each response back as the cursor parameter to continue. Stop when next_cursor is null — that is the reliable stop signal here, and unlike the follower-graph endpoints you should NOT wait for an empty array. Each call is also bounded by a server-side time budget, so a response can be truncated even when it returned fewer tweets than you asked for; next_cursor, not count, tells you whether you are done. See Pagination for the full loop.