Tweet Details

Tweet Quotes

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.

get/tweet/quotes

Request

  • Base URL: https://api.twitterapis.com/twitter
  • URL: https://api.twitterapis.com/twitter/tweet/quotes
  • Auth: HTTP bearer

Query parameters

idstring

Numeric ID of the tweet whose quotes you want. Provide either id or url.

Example:1759123456789012345
urlstring

Full status URL of the tweet whose quotes you want. Provide either id or url.

Example:https://x.com/naval/status/1759123456789012345
cursorstring

Pagination cursor from a previous response's next_cursor.

countinteger

Max items to request for this page, 1-20. Defaults to 20. X's search returns at most 20 per page, so a larger number is clamped to 20 rather than erroring, and the response echoes both requested_count and effective_count.

productstring

Search ordering: Latest (default, reverse-chronological) or Top (X's ranked ordering, materially slower upstream). Any other value falls back to Latest rather than changing what the endpoint means.

Example:Latest
strictboolean

Set to true to drop every returned row that does not demonstrably quote the requested tweet, instead of only counting them in quote_matched. Default false, because X does not embed the quoted original on every search result, so strict mode can hide real quotes.

fieldsstring

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'1'

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'only' | 'exclude'

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

Page through the tweets that quote a tweet.

countinteger

Number of tweets returned in this page. This is what the SEARCH returned, never the tweet's true quote total, which is quote_count on the tweet object (see Tweet Detail). The two will differ because of search-index lag and because deleted, protected and withheld quotes are not in the index.

next_cursorstring nullable

Opaque cursor for the next page. Pass it straight back as ?cursor=. Null when there is no further page.

has_moreboolean

True when this page returned tweets and carried a usable next_cursor. False on the final page.

sourcestring

Always "search". Present so a caller comparing these numbers against X's UI knows this endpoint is served by X's search index and not by a dedicated quote-tweets operation.

search_querystring

The exact query sent upstream, quoted_tweet_id:<id>, so a surprising result is debuggable without reading our source.

quote_matchedinteger

How many of the returned tweets demonstrably quote the requested id, read off each tweet's embedded quoted_tweet. Equal to count means every row is a genuine quote. Zero on a non-empty page means X stopped honouring the search operator and the rows are junk that merely contain the number.

quote_countinteger nullable

The tweet's real quote total as X reports it, read from the embedded original on the returned rows, from a cached tweet lookup, or (first page only) one live tweet lookup. Null when it could not be read, or when X reported 0, because a missing count reads as 0.

coveragestring

Whether this answer is the whole set: complete (the search ended on the first page with at least quote_count genuine quotes), partial (the search ended on the first page with fewer, so search withheld some), or unknown (anything that cannot be proven: more pages to walk, a later page, no total, or a page where no row demonstrably quotes the tweet).

coverage_hintstring

Present only when coverage is partial: a one-line reason, that X search does not return every quote for some accounts.

requested_countinteger nullable

The count you asked for, echoed as a number (20 when you sent none, null when it was not a number).

effective_countinteger

The page size actually requested upstream, 1-20.

product_usedstring

Which ordering actually served this page: Top or Latest. Differs from the product you asked for only when top_fallback is true.

top_fallbackboolean

Present and true only when you asked for product=Top, the first Top page came back empty, and the page was served from Latest instead. X's ranked search returns an empty first page for some tweets that do have quotes, so an empty Top page is never passed off as zero quotes. Page on with the next_cursor as usual: after a fallback it is tagged so it keeps serving Latest even if you send product=Top again.

incompleteboolean

Present and true only when X soft-limited the search that served this page, so the page may be missing rows. Absent on every healthy page.

incomplete_reasonstring

Why the page is incomplete: upstream_soft_limit. Present only with incomplete.

upstream_limitobject

X's own limit signal for this page (its error codes and message). Present only with incomplete.

Changes

No recorded changes to this operation across all 1 revision of this API.