---
title: "Tweet Quotes"
method: GET
path: "/tweet/quotes"
tags: ["Tweet Details"]
---

# Tweet Quotes

`GET /tweet/quotes`

## Request

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

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.

## Query parameters

- `id` string: Numeric ID of the tweet whose quotes you want. Provide either id or url.
- `url` string: Full status URL of the tweet whose quotes you want. Provide either id or url.
- `cursor` string: Pagination cursor from a previous response's next_cursor.
- `count` integer: 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.
- `product` string: 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.
- `strict` boolean: 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.
- `fields` string
- `compact` '1'
- `paid_promotion` 'only' | 'exclude'

## Response `200`

Page through the tweets that quote a tweet.

- object
  - `tweets` Tweet[]: Quote tweets for this page, as full tweet objects. Each one that X embedded the original on carries the requested tweet under quoted_tweet.
    - `id` string: Numeric tweet ID as a string (avoids JS number precision loss).
    - `text` string: Full tweet text, including expanded URLs.
    - `created_at` string: Tweet creation timestamp in Twitter date format.
    - `author` User: A Twitter/X user profile.
      - `id` string: Numeric user ID as a string.
      - `username` string: Handle without the leading @.
      - `name` string: Display name.
      - `verified` boolean: Whether the account is legacy-verified.
      - `is_blue_verified` boolean: Whether the account carries the Verified (Blue) badge.
      - `verified_type` string, nullable: Verification type, for example Business or Government, when applicable; null otherwise.
      - `followers_count` integer: Follower count.
      - `following_count` integer: Following count.
      - `tweet_count` integer: Number of tweets the account has posted.
      - `favourites_count` integer: Number of tweets the account has liked.
      - `media_count` integer: Number of media items the account has posted.
      - `description` string: Profile bio text.
      - `location` string: Self-reported location.
      - `url` string: Linked website URL from the profile, when set.
      - `created_at` string: Account creation timestamp in Twitter date format.
      - `profile_image_url` string: Avatar image URL.
      - `cover_picture` string: Profile banner/cover image URL, when set.
      - `listed_count` integer, nullable: Number of public lists the account appears on.
      - `can_dm` boolean, nullable: Whether the account accepts direct messages. Currently null on profile lookups (user/info, user/search) and on tweet authors: X no longer includes DM permission in those payloads. The key stays so it fills again if X restores it. For a real answer between two accounts, use can_dm on /twitter/user/check_follow_relationship.
      - `parody_commentary_fan_label` string, nullable: X's parody / commentary / fan account label, when the account is marked as one; null when it carries no such label.
      - `creator_subscriptions_enabled` boolean, nullable: True when the account sells X Subscriptions to its followers; null when X does not say.
      - `can_media_tag` boolean, nullable: Whether other accounts are permitted to tag this account in media; null when X does not report the media-tag permission.
      - `has_custom_timelines` boolean, nullable: Whether the account has created custom timelines.
      - `is_translator` boolean, nullable: Whether the account is a Twitter/X translator.
      - `possibly_sensitive` boolean, nullable: Whether the account is flagged as possibly posting sensitive media.
      - `default_profile` boolean, nullable: True when the account still uses the default profile theme.
      - `default_profile_image` boolean, nullable: True when the account still uses the default avatar.
      - `professional_type` string, nullable: Professional account type when set, for example "Creator" or "Business"; null otherwise.
      - `profile_bio` object, nullable: Structured bio with entity ranges, when present.
        - `description` string, nullable: The bio text.
        - `entities` object, nullable: Mention/URL entity ranges within the bio, when present.
      - `affiliate_label` object, nullable: Parent-organization/affiliate badge shown on the profile, when present.
        - `description` string, nullable: The affiliate/parent-org label text.
        - `badge_url` string, nullable: Badge image URL.
        - `url` string, nullable: Link the badge points to.
      - `pinned_tweet_ids` string[]: Numeric IDs (as strings) of the account's pinned tweet(s); empty array when the account has none pinned or when a trimmed user object omits the block.
      - `protected` boolean, nullable: Whether the account is protected (locked); null on a trimmed user object that carries no protected flag.
      - `type` string, nullable: The user result __typename, for example "User" or "UserUnavailable"; null when absent.
      - `is_automated` boolean, nullable: True when the profile carries X's automated-account label, which is how an account declares itself a bot. Null when no such label is on the profile. This field is never set to false by inference, so null means only that X did not label the account, never that a human runs it. Null on every account sampled so far, including accounts that are plainly automated.
      - `automated_by` string, nullable: Handle of the account that manages this automated account, read from the link on the automated label. Null unless is_automated is true and that label carries a single-segment x.com or twitter.com profile link. Null on every account sampled so far.
      - `unavailable` boolean, nullable: True when X reports the account as unavailable, for example suspended or withheld. False when X returns an ordinary account result. Null on a trimmed user object that reports no account type at all. It is derived from the same value as type, so the two can never disagree: a type of UserUnavailable always gives true.
      - `unavailable_message` string, nullable: The message X returns explaining why the account is unavailable, for example the text shown in place of the profile. Null when the account is available or when X sends no message.
      - `unavailable_reason` string, nullable: The short reason code X returns for an unavailable account, for example Suspended. Null when the account is available or when X sends no reason.
      - `withheld_in_countries` string[], nullable: ISO country codes in which X withholds this account. The empty array and null mean different things and the difference is legally relevant if you republish profiles: an empty array is X stating the account is withheld nowhere, while null is X not telling us. Do not read null as "not withheld". Null on every account today, because the block this is read from is one X no longer sends; the read is kept so the field fills in on its own if X restores it.
    - `favorite_count` integer: Number of likes (favorites) at fetch time.
    - `retweet_count` integer: Number of retweets at fetch time.
    - `reply_count` integer: Number of replies at fetch time.
    - `quote_count` integer: Number of quote tweets at fetch time.
    - `bookmark_count` integer: Number of bookmarks at fetch time.
    - `view_count` integer, nullable: Number of views (impressions). May be null on older tweets posted before public view counts existed.
    - `url` string: Canonical x.com status URL.
    - `lang` string: BCP-47 language code Twitter detected.
    - `is_retweet` boolean: True when the tweet is a retweet.
    - `is_quote` boolean: True when the tweet quotes another tweet.
    - `is_reply` boolean: True when the tweet is a reply to another tweet.
    - `has_video` boolean: True when the tweet carries at least one native video or animated-GIF media item (a one-field filter for video content, including video quote-retweets).
    - `is_paid_promotion` boolean: True when X shows its own "Paid partnership" label on the post (X's branded-content disclosure). False when X shows no label.
    - `has_community_note` boolean, nullable: True when the post carries a Community Note; null when X does not say.
    - `is_edited` boolean, nullable: True when the post has been edited since it was first posted; null when X sends no edit information.
    - `edit_history_ids` string[], nullable: The ids of every version of the post, oldest first and including the original; null when X sends no edit information.
    - `quoted_status_id` string, nullable: The id of the post this one quotes, present even when the quoted post is not expanded; null when it quotes nothing.
    - `source` string, nullable: Posting client/source label; frequently null.
    - `conversation_id` string: ID of the root tweet of the conversation thread this tweet belongs to.
    - `in_reply_to_status_id` string, nullable: ID of the tweet being replied to; null when the tweet is not a reply.
    - `in_reply_to_user_id` string, nullable: Numeric ID of the user being replied to; null when not a reply.
    - `in_reply_to_username` string, nullable: Handle of the user being replied to; null when not a reply.
    - `display_text_range` integer[], nullable: The UTF-16 character span [start, end) of the display text inside text. It marks the region a client should render, leaving out the leading @mentions on a reply and the trailing t.co link of attached media or a quoted tweet. Always a pair, for example [0, 144] on a plain tweet and [22, 285] on a reply. Null when X sends no range, or sends one whose members are not finite numbers, so a partial range is never passed off as a complete one.
    - `is_limited_reply` boolean, nullable: Whether replying to this tweet is restricted. True when X names a reply limitation, false when X names a limitation that is not about replies, and null when X names no limitation at all. Null is what every tweet sampled so far returns. The flag is relative to the account that read the tweet, and these public reads do not run as your account, so a value here would not describe you. It is a different question from the author's own who-can-reply setting, which this field does not report.
    - `entities` object: Parsed tweet entities. Always present; the arrays are empty when the tweet has none.
      - `hashtags` object[]: Hashtag entities in the tweet text.
        - `text` string: The hashtag text without the leading #.
        - `indices` integer[]: Start/end character offsets in the tweet text.
      - `symbols` object[]: Cashtag entities ($TSLA-style) in the tweet text.
        - `text` string: The cashtag text without the leading $.
        - `indices` integer[]: Start/end character offsets in the tweet text.
      - `timestamps` object[]: Date/time entities X extracts from the tweet text. Forwarded verbatim from X rather than remapped, so the member shape is whatever X sends and may gain fields without notice. Treat it as opaque unless you have verified the shape yourself.
      - `urls` object[]: Link entities in the tweet text.
        - `url` string: The t.co short URL as it appears in the text.
        - `expanded_url` string: The resolved destination URL.
        - `display_url` string: The human-readable display URL.
        - `indices` integer[]: Start/end character offsets in the tweet text.
      - `user_mentions` object[]: @-mention entities in the tweet text.
        - `id_str` string: Numeric ID of the mentioned user as a string.
        - `screen_name` string: Handle of the mentioned user.
        - `name` string: Display name of the mentioned user.
        - `indices` integer[]: Start/end character offsets in the tweet text.
    - `retweeted_tweet` Tweet (recursive)
    - `quoted_tweet` Tweet (recursive)
    - `media` Media[]: Media attachments, top-level for convenience. Same content and item shape as extended_entities.media below (the live API returns media in both places); present only when the tweet has media, omitted for text-only tweets.
      - `type` string: Media type: "photo", "video", or "animated_gif".
      - `media_url_https` string, nullable: Thumbnail/still image URL (normally twimg-hosted). Validate the host before fetching.
      - `url` string, nullable: The t.co display URL for the media in the tweet text.
      - `ext_alt_text` string: Author-supplied alt text, when present.
      - `video_info` object: Present for "video" and "animated_gif". Pick the highest-bitrate video/mp4 variant for playback.
        - `duration_millis` integer: Clip duration in milliseconds.
        - `variants` object[]: Playable renditions (an HLS manifest plus one or more mp4 bitrates).
          - `content_type` string: MIME type, e.g. "video/mp4" or "application/x-mpegURL".
          - `url` string: Rendition URL (normally twimg-hosted). Validate the host before fetching.
          - `bitrate` integer: Bitrate in bps; present on mp4 variants only.
    - `extended_entities` object: Media attached to the tweet, in the standard Twitter shape. Present only when the tweet has media; omitted for text-only tweets.
      - `media` Media[]: Media attachments. Photos have no video_info; videos and GIFs carry video_info.variants.
        - `type` string: Media type: "photo", "video", or "animated_gif".
        - `media_url_https` string, nullable: Thumbnail/still image URL (normally twimg-hosted). Validate the host before fetching.
        - `url` string, nullable: The t.co display URL for the media in the tweet text.
        - `ext_alt_text` string: Author-supplied alt text, when present.
        - `video_info` object: Present for "video" and "animated_gif". Pick the highest-bitrate video/mp4 variant for playback.
          - `duration_millis` integer: Clip duration in milliseconds.
          - `variants` object[]: Playable renditions (an HLS manifest plus one or more mp4 bitrates).
            - `content_type` string: MIME type, e.g. "video/mp4" or "application/x-mpegURL".
            - `url` string: Rendition URL (normally twimg-hosted). Validate the host before fetching.
            - `bitrate` integer: Bitrate in bps; present on mp4 variants only.
  - `count` integer: 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_cursor` string, nullable: Opaque cursor for the next page. Pass it straight back as ?cursor=. Null when there is no further page.
  - `has_more` boolean: True when this page returned tweets and carried a usable next_cursor. False on the final page.
  - `source` string: 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_query` string: The exact query sent upstream, quoted_tweet_id:<id>, so a surprising result is debuggable without reading our source.
  - `quote_matched` integer: 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_count` integer, 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.
  - `coverage` string: 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_hint` string: Present only when coverage is partial: a one-line reason, that X search does not return every quote for some accounts.
  - `requested_count` integer, nullable: The count you asked for, echoed as a number (20 when you sent none, null when it was not a number).
  - `effective_count` integer: The page size actually requested upstream, 1-20.
  - `product_used` string: Which ordering actually served this page: Top or Latest. Differs from the product you asked for only when top_fallback is true.
  - `top_fallback` boolean: 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.
  - `incomplete` boolean: 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_reason` string: Why the page is incomplete: upstream_soft_limit. Present only with incomplete.
  - `upstream_limit` object: X's own limit signal for this page (its error codes and message). Present only with incomplete.

## Other responses

- `400`: Bad request
- `401`: Unauthorized
- `402`: Insufficient credits
- `403`: Forbidden
- `404`: Not found
- `429`: Rate limited
- `5XX`: Server error

---

[API](https://skmtc.dev/twitterapis/apis/twitterapis-api.md) · [All operations](https://skmtc.dev/twitterapis/apis/twitterapis-api/llms.txt) · [OpenAPI document](https://skmtc.dev/twitterapis/apis/twitterapis-api/revisions/a33ce0fedb3c?raw)
