Get All Replies to a Tweet API | Twitter Replies (Complete)
Fetch all direct replies to a tweet in a single call. The endpoint walks the reply pages for you and returns them together, instead of one cursor page at a time, and reports whether it reached the end. Each call is bounded by max and a server-side time budget, so a large conversation can come back incomplete with a cursor to resume from. Cost: $0.0024 per call.
Tweet Replies (Complete) returns every direct reply under a tweet in one call by walking the reply pages server-side, and says whether it reached the end. Pass a tweet ID or URL, an optional max (default 500) and sort. It is billed flat at $0.0024 per call however many pages it walks.
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 parent tweet. Provide either id or url.
Full status URL of the parent tweet. Provide either id or url.
Target number of replies to collect in this call (default 500). Pages arrive whole, so count can pass max by up to one page. Larger values take longer.
Reply ordering: relevance (default), latest, or likes.
Resume point from a previous response's next_cursor when is_complete was false.
Comma-separated list of dotted field paths to keep in the response (one parameter, never repeated), applied to every object in the returned lists and to nested objects (for example fields=id,text,author.username; the list's own name may prefix a path, fields=tweets.id). A path prefix that lands on an array applies to each element (media.media_url_https). Pagination and envelope keys (next_cursor, cursor, has_more, count, partial, error, message, reason) are always kept. Unknown paths are ignored; up to 50 paths of up to 6 segments. Projection never changes status codes or billing, and applies to data reads only: account, feedback, session status, monitor (other than deliveries), webhook and stream-compat reads return their bodies unchanged.
Set to 1 (or true) to apply the built-in compact preset: ids, url, text, created_at, lang, the engagement counts, the is_retweet/is_reply/is_quote flags, conversation ids, the author's id/username/name/followers_count/verification, and the quoted or retweeted tweet's id/url/author username. The preset trims what it recognises and leaves alone what it would empty, so it never turns a body into {}. Combine with fields to add paths on top of the preset. Typically cuts a tweet page by 70 to 90 percent for LLM tool callers.
Filter this page's tweets by X's Paid partnership label: only keeps tweets whose is_paid_promotion is true, exclude keeps the rest. Omit it for every tweet. It filters the page X returned and does not fetch more, so a filtered page can hold fewer tweets than asked for, or none, while next_cursor still pages on. The response carries paid_promotion_filter { mode, kept, removed }, and count reflects what is returned. Any other value is a 400. Billing is the same as without it.
Response Body
application/json
application/json
application/json
application/json
application/json
application/json
application/json
application/json
curl -X GET "https://example.com/tweet/replies-complete?id=1759123456789012345&url=https%3A%2F%2Fx.com%2Fnaval%2Fstatus%2F1759123456789012345&max=200&sort=latest&fields=id%2Ctext%2Ccreated_at%2Cauthor.username&compact=1&paid_promotion=only"{ "count": 1, "next_cursor": null, "has_more": false, "is_complete": true, "pages_fetched": 1, "sort": "relevance", "tweets": [ { "id": "1759123999000111222", "text": "Congrats on the launch!", "created_at": "Tue Feb 20 14:30:02 +0000 2026", "author": { "id": "9921", "username": "devjane", "name": "Jane" }, "favorite_count": 12, "reply_count": 1 } ]}{ "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": "forbidden", "message": "X refused this resource for the acting account: on a read, the account is not a participant in the DM thread, the target is protected or has blocked it, or the session was attestation-blocked for calling from a datacenter or rotating IP; on a write, the account is not authorized for the action or has no logged-in session. The credentials are still valid, so do not re-register."}{ "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 (~500 per call) | ~$0.0048 |
One flat $0.0024 call regardless of how many reply pages it walks, so a long conversation costs less here than paging Tweet Replies at $0.0008 a page. When is_complete is false, a follow-up call with the cursor is another flat call.
When to use
Use it instead of Tweet Replies when you want the whole conversation under a post without running the cursor loop yourself, for example collecting every reply to a launch tweet for sentiment analysis.
Pagination
This endpoint walks the reply pages for you and returns a large batch per call (up to max, default 500), not one ~20-reply page. Stop when is_complete is true (next_cursor is then null). When is_complete is false the call stopped early, on max, the server-side time budget, the page cap, or a page after the first failing; pass next_cursor back as cursor to continue. Unlike the follower-graph endpoints, do not wait for an empty array, and do not compare count to max.
Related endpoints
- Tweet Replies: Page through the replies to a tweet.
- Tweet Detail: Fetch a single tweet's full object by ID.
- Tweet Thread: Reconstruct a thread forward from its first tweet.
- Tweet Quotes: Page through the tweets that quote a tweet.
FAQ
How do I know I have every reply?
Check is_complete. True means X signalled the end of the conversation. False means the call stopped early (on max, the time budget, the page cap, or a later page failing); pass next_cursor back as cursor to continue.
Is count a completion signal?
No. A call can stop early on its time budget, so read is_complete (or next_cursor) rather than comparing count to max.
Does it return nested replies?
It returns the direct replies to the tweet you pass, the same set Tweet Replies pages through. To follow a sub-thread, call it again on a reply's ID.
Tweet Quotes GET
Fetch the quote tweets of a given tweet, cursor-paginated as full tweet objects, so you can read the commentary people attached rather than just count it. This endpoint is search-backed rather than served by a dedicated X operation, and every response says so in-band via source, search_query and quote_matched. Cost: $0.0008 per call.
Overview
User Reads: Read a profile, its timeline, media, mentions, affiliates, and follow relationships by username or numeric ID.