TwitterAPIs Docs
API ReferenceTweet Details

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.

GET
/tweet/replies-complete

Authorization

bearerAuth
AuthorizationBearer <token>

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

In: header

Query Parameters

id?string

Numeric ID of the parent tweet. Provide either id or url.

url?string

Full status URL of the parent tweet. Provide either id or url.

max?integer

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.

sort?string

Reply ordering: relevance (default), latest, or likes.

cursor?string

Resume point from a previous response's next_cursor when is_complete was false.

fields?string

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.

compact?string

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.

paid_promotion?string

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

UnitPrice
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.

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.