Twitter User Timeline API | Get a User's Tweets
Page through a user's public timeline, cursor-paginated at roughly 20 tweets per call. The page mirrors the account's timeline as X returns it, so it contains original tweets, retweets, and the account's own replies. Each tweet carries is_retweet and is_reply, so filter client-side if you want original posts only. Cost: $0.0008 per call.
User Tweets pages through a profile's public timeline, cursor-paginated at roughly 20 tweets per call. The page is the account's timeline as X returns it, so it contains original tweets, retweets, and the account's own replies. Filter client-side on the is_retweet and is_reply flags if you only want original posts. Each page is one $0.0008 read with bearer auth.
Authorization
bearerAuth Pass your API key as a bearer token on every request: Authorization: Bearer <API_KEY>.
In: header
Query Parameters
Handle without the leading @.
Numeric user ID; provide either username or user_id.
Pagination cursor from a previous response.
Accepted but not honoured on this endpoint: the upstream timeline page is fixed at roughly 20 tweets and raising count does not return more. Use cursor to read further back.
Response Body
application/json
application/json
application/json
application/json
application/json
application/json
application/json
curl -X GET "https://example.com/user/tweets?username=naval&user_id=44196397&count=20"{ "tweets": [ { "id": "1759123456789012345", "text": "Reading > scrolling.", "created_at": "Tue Feb 20 14:02:11 +0000 2026", "author": { "id": "745273", "username": "naval" }, "favorite_count": 4821 } ], "next_cursor": "DAABCgABF..."}{ "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.0008 |
| Per 1,000 calls | $0.80 |
| Per 1,000 records (~20 per call) | ~$0.04 |
Each timeline page is one $0.0008 read, so a deep backfill costs one call per page. Stop paging once you reach the date or count you need.
When to use
Use it to read an account's posting history, for example pulling a founder's last 200 tweets for analysis. Filter on is_retweet / is_reply if you want original posts only.
Pagination
This endpoint is cursor-paginated and returns roughly 20 records per call. Pass the next_cursor from each response back as the cursor parameter to read the next page. Stop when the records array comes back empty: follower-graph endpoints return a non-null cursor even on the final page, so the empty array is the only reliable stop signal. See Pagination for the full loop.
Related endpoints
- User Tweets and Replies: Fetch a user's timeline including their replies (same upstream timeline as User Tweets).
- User Media: Page through a profile's media tweets (images and video).
- User Mentions: Fetch tweets that mention a username.
FAQ
Does User Tweets include replies and retweets?
Yes, both. The page is the account's timeline as X returns it, so retweets and the account's own replies come back alongside original posts. Every tweet carries is_retweet and is_reply, so filter on those flags client-side if you want original posts only.
How is it different from User Tweets and Replies?
In practice it is not: both endpoints resolve to the same upstream timeline and return the same tweets for the same account. User Tweets and Replies is kept as an alias for compatibility. Pick either and filter on is_reply yourself.
How far back can I read a timeline?
Page with next_cursor until the tweets array comes back empty. Each page is roughly 20 tweets and one billed call.
What identifier does it take?
Pass either username (the handle without the leading @) or the numeric user_id. The response is cursor-paginated timeline tweets.
User Media GET
Fetch the media tweets posted by a user, cursor-paginated. Returns the tweet objects from the account's Media tab, with media URLs included under extended_entities.media. The tab occasionally surfaces a link-or-card tweet with no attachment, so guard on extended_entities before reading it. Cost: $0.0008 per call.
User Tweets and Replies GET
Page through a user's public timeline including the replies the account posted. This endpoint resolves to the same upstream timeline as GET /user/tweets and returns the same tweets in the same order, so treat it as an alias kept for compatibility rather than a wider result set. Each tweet carries is_retweet and is_reply for client-side filtering. Cost: $0.0008 per call.