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.
Authorization
bearerAuth Pass your API key as a bearer token on every request: Authorization: Bearer <API_KEY>.
In: header
Query Parameters
Numeric ID of the target account. Resolve a handle with GET /user/info first.
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.
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
| Unit | Price |
|---|---|
| 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.
User Likes GET
Read the Likes tab of the account named by user_id, read through your registered session, most recent first. Returns full tweet objects, cursor-paginated. Returns an empty list when the account hides its likes. Requires a registered session and a numeric user_id. Cost: $0.0008 per call.
User Mentions GET
Return the tweets that mention a given account, cursor-paginated. This is the canonical way to read a handle's mentions; it is a thin wrapper over a to:username search and returns the same tweet objects. Cost: $0.0008 per call.