> ## Documentation Index
> Fetch the complete documentation index at: https://docs.xquik.com/llms.txt
> Use this file to discover all available pages before exploring further.

# View quote tweets with Twitter API & author fields

> View quote tweets for an original tweet with a Twitter API, author profiles, commentary, media, engagement counts, filters, cursors, alerts & error responses.

<Panel>
  <Tabs defaultTabIndex={0} sync={false}>
    <Tab title="200" id="response-x-tweet-quotes-200">
      ```json theme={null}
      {
        "tweets": [],
        "has_next_page": false,
        "next_cursor": ""
      }
      ```
    </Tab>

    <Tab title="400" id="response-x-tweet-quotes-400">
      ```json theme={null}
      {
        "error": "invalid_input",
        "message": "Invalid input. Check the request body."
      }
      ```
    </Tab>

    <Tab title="401" id="response-x-tweet-quotes-401">
      ```json theme={null}
      {
        "error": "unauthenticated",
        "message": "Authentication required."
      }
      ```
    </Tab>

    <Tab title="402" id="response-x-tweet-quotes-402">
      ```json theme={null}
      {
        "error": "insufficient_credits",
        "message": "Insufficient credits. Top up or subscribe to continue."
      }
      ```
    </Tab>

    <Tab title="404" id="response-x-tweet-quotes-404">
      ```json theme={null}
      {
        "error": "tweet_not_found",
        "message": "Tweet not found. Check the tweet ID."
      }
      ```
    </Tab>

    <Tab title="409" id="response-x-tweet-quotes-409">
      ```json theme={null}
      {
        "error": "coverage_cursor_unavailable",
        "message": "Cursor busy. Retry after the indicated delay."
      }
      ```
    </Tab>

    <Tab title="410" id="response-x-tweet-quotes-410">
      ```json theme={null}
      {
        "error": "coverage_cursor_gone",
        "message": "Cursor finished, expired, or superseded. Restart pagination without cursor."
      }
      ```
    </Tab>

    <Tab title="424" id="response-x-tweet-quotes-424">
      ```json theme={null}
      {
        "error": "x_api_unavailable",
        "message": "X data source temporarily unavailable. Try again later."
      }
      ```
    </Tab>

    <Tab title="429" id="response-x-tweet-quotes-429">
      ```json theme={null}
      {
        "error": "rate_limit_exceeded",
        "message": "Too many requests. Try again later.",
        "retryAfter": 60
      }
      ```
    </Tab>

    <Tab title="502" id="response-x-tweet-quotes-502">
      ```json theme={null}
      {
        "error": "x_api_unavailable",
        "message": "X data source temporarily unavailable. Try again later."
      }
      ```
    </Tab>

    <Tab title="503" id="response-x-tweet-quotes-503">
      ```json theme={null}
      {
        "error": "x_api_unavailable",
        "message": "Maximum coverage is busy. Retry shortly."
      }
      ```
    </Tab>
  </Tabs>
</Panel>

<blockquote className="agent-llms-directive">
  For the complete documentation index, see <a href="/llms.txt">llms.txt</a>.
</blockquote>

<Note>
  Repost records include `retweetedAt`, the repost event's UTC ISO 8601 timestamp. It is `null` when
  that timestamp is unavailable. The API omits it for original posts. The nested original post keeps
  its own creation date. This field does not report every account that reposted a post. [Request
  per-account timestamps with Get retweeters.](/api-reference/x/retweeters#retweet-timestamps)
</Note>

Requested result counts are upper bounds for paid authenticated calls. When remaining credits cannot cover the full page or ID list, Xquik returns fewer results. If zero paid results are affordable, it returns `402 insufficient_credits`.

<Callout icon="coins" color="#5c3327">
  **1 credit per tweet returned** · [All plans](https://xquik.com/#pricing) from \$0.00012/credit · Supports [guest paid reads](/guides/guest-wallets)
</Callout>

This route returns quote tweets for one original tweet. Each row
includes the quoting tweet's commentary, author, engagement counts, and media
attachments. The route is `GET /api/v1/x/tweets/{id}/quotes`.

A post X does not have returns `404 tweet_not_found`, as
[Get tweet](/api-reference/x/get-tweet) does. Quotes X still lists for a
deleted post return as rows. A post without quotes returns an empty page. A 404
costs no credits.

Pass `next_cursor` back unchanged as `cursor`. A page can be empty while
`has_next_page` is `true`, so keep following `next_cursor`. A cursor in use
returns `409 coverage_cursor_unavailable`. Wait for `Retry-After`, then retry it
once. A finished or expired cursor returns `410 coverage_cursor_gone`. Restart
without a cursor and deduplicate by `id`. A busy read returns `503`. Retry after
`Retry-After`.

<CodeGroup>
  ```bash First page theme={null}
  curl "https://xquik.com/api/v1/x/tweets/1893456789012345678/quotes" \
    -H "x-api-key: xq_your_api_key_here" | jq
  ```

  ```bash Next page with filters theme={null}
  curl -G https://xquik.com/api/v1/x/tweets/1893456789012345678/quotes \
    --data-urlencode "cursor=abc123" \
    --data-urlencode "sinceTime=1774500000" \
    --data-urlencode "includeReplies=false" \
    --data-urlencode "verifiedOnly=true" \
    -H "x-api-key: xq_your_api_key_here" | jq
  ```

  ```javascript Node.js theme={null}
  const tweetId = "1893456789012345678";
  const params = new URLSearchParams({
    sinceTime: "1774500000",
    includeReplies: "false",
  });
  const response = await fetch(`https://xquik.com/api/v1/x/tweets/${tweetId}/quotes?${params}`, {
    headers: { "x-api-key": "xq_your_api_key_here" },
  });
  const data = await response.json();
  const nextCursor = data.has_next_page ? data.next_cursor : null;
  const quoteRows = data.tweets.map((tweet) => ({
    quoted_tweet_id: tweetId,
    quote_id: tweet.id,
    text: tweet.text,
    author_id: tweet.author?.id ?? null,
    author_username: tweet.author?.username ?? null,
    author_name: tweet.author?.name ?? null,
    author_followers: tweet.author?.followers ?? null,
    author_verified: tweet.author?.verified ?? null,
    author_profile_picture: tweet.author?.profilePicture ?? null,
    created_at: tweet.createdAt ?? null,
    like_count: tweet.likeCount ?? null,
    reply_count: tweet.replyCount ?? null,
    retweet_count: tweet.retweetCount ?? null,
    quote_count: tweet.quoteCount ?? null,
    media_urls: tweet.media?.map((item) => item.mediaUrl).filter(Boolean) ?? [],
  }));
  const checkpoint = { quoted_tweet_id: tweetId, next_cursor: nextCursor };

  for (const row of quoteRows) {
    process.stdout.write(`${JSON.stringify(row)}\n`);
  }
  process.stdout.write(`${JSON.stringify({ checkpoint })}\n`);
  ```

  ```python Python theme={null}
  import json
  import requests

  tweet_id = "1893456789012345678"
  response = requests.get(
      f"https://xquik.com/api/v1/x/tweets/{tweet_id}/quotes",
      params={"sinceTime": "1774500000", "includeReplies": "false"},
      headers={"x-api-key": "xq_your_api_key_here"},
  )
  data = response.json()
  next_cursor = data["next_cursor"] if data["has_next_page"] else None
  quote_rows = [
      {
          "quoted_tweet_id": tweet_id,
          "quote_id": tweet["id"],
          "text": tweet["text"],
          "author_id": (tweet.get("author") or {}).get("id"),
          "author_username": (tweet.get("author") or {}).get("username"),
          "author_name": (tweet.get("author") or {}).get("name"),
          "author_followers": (tweet.get("author") or {}).get("followers"),
          "author_verified": (tweet.get("author") or {}).get("verified"),
          "author_profile_picture": (tweet.get("author") or {}).get("profilePicture"),
          "created_at": tweet.get("createdAt"),
          "like_count": tweet.get("likeCount"),
          "reply_count": tweet.get("replyCount"),
          "retweet_count": tweet.get("retweetCount"),
          "quote_count": tweet.get("quoteCount"),
          "media_urls": [
              item["mediaUrl"] for item in tweet.get("media", []) if item.get("mediaUrl")
          ],
      }
      for tweet in data["tweets"]
  ]
  checkpoint = {"quoted_tweet_id": tweet_id, "next_cursor": next_cursor}

  for row in quote_rows:
      print(json.dumps(row))
  print(json.dumps({"checkpoint": checkpoint}))
  ```
</CodeGroup>

The Node.js and Python snippets write JSON Lines quote rows plus a separate
checkpoint. They do not write raw response pages. Store each mapped row and the latest
`next_cursor`. A moderation queue, campaign report, research job, or agent
handoff can then resume from the last completed page without duplicate rows.

## Direct quote tweet handoff

Use `GET /api/v1/x/tweets/{id}/quotes` when a support, campaign, moderation,
research, or agent workflow needs quote tweets as JSON rows. It returns one row
for every quote tweet in the response. Store `quoted_tweet_id`, `quote_id`,
`text`, `author_id`, `author_username`, `author_name`, `author_followers`,
`author_verified`, `author_profile_picture`, `created_at`, engagement counts,
media URLs, and a separate `next_cursor` checkpoint. Use `sinceTime`,
`untilTime`, `includeReplies`, and tweet result filters to narrow the quote set
before you export rows.

<CardGroup cols={2}>
  <Card title="Quote rows" icon="quote">
    Store `tweets[]` as quote tweet rows for one source tweet.
  </Card>

  <Card title="Stable upserts" icon="key-round">
    Store `tweets[].id` as `quote_id` with `quoted_tweet_id` for idempotent
    imports and moderation queues.
  </Card>

  <Card title="Author joins" icon="user-round">
    Store `tweets[].author.id`, `username`, `name`, `followers`, `verified`, and
    `profilePicture` for CRM, research, and review tools.
  </Card>

  <Card title="Engagement metrics" icon="chart-no-axes-combined">
    Store `likeCount`, `replyCount`, `retweetCount`, `quoteCount`, `viewCount`,
    and `bookmarkCount` when returned.
  </Card>

  <Card title="Media context" icon="image">
    Store `media[].mediaUrl`, `entities`, `quoted_tweet`, and `retweeted_tweet`
    when returned to keep attached context.
  </Card>

  <Card title="Window filters" icon="calendar-range">
    Use `sinceTime`, `untilTime`, `includeReplies`, and tweet result filters to
    narrow campaign, support, or audit windows.
  </Card>

  <Card title="Next page" icon="arrow-right">
    Store `has_next_page` and `next_cursor`, then pass `next_cursor` back as `cursor`
    only when `has_next_page` is true.
  </Card>

  <Card title="Credit-limited pages" icon="coins">
    Use `tweets.length`, not a requested page size, for row counts. Low balances
    can return fewer rows.
  </Card>
</CardGroup>

Direct quote tweet reads cost 1 credit per tweet returned. Low credit balances
can return fewer tweets than a full page. Zero affordable results return
`402 insufficient_credits`.

## Historical pages vs live quote alerts

Use this endpoint when you need existing quote tweets for one source tweet. Use
monitors when future quote activity should arrive as stored events or signed
webhook deliveries.

<CardGroup cols={2}>
  <Card title="Historical quote pull" icon="clock-arrow-down">
    Call `GET /x/tweets/{id}/quotes`, store `quote_id`, and resume with
    `next_cursor` for one known source tweet.
  </Card>

  <Card title="Account quote monitor" icon="radio">
    Use [`POST /monitors`](/api-reference/monitors/create) with
    `eventTypes: ["tweet.quote"]` when one tracked account's future quote
    tweets should produce events.
  </Card>

  <Card title="Keyword quote monitor" icon="search-check">
    Use [`POST /monitors/keywords`](/api-reference/monitors/create-keyword)
    with `eventTypes: ["tweet.quote"]` when matching future quote tweets should
    produce events.
  </Card>

  <Card title="Signed webhook delivery" icon="webhook">
    Use [`POST /webhooks`](/api-reference/webhooks/create) with `tweet.quote`,
    verify signatures, and replay stored rows with
    [`GET /events`](/api-reference/events/list).
  </Card>
</CardGroup>

## Quote tweet questions

### What are quote tweets?

A quote tweet is a new tweet containing commentary about an original tweet.
X calls this format a [Quote Post](https://docs.x.com/x-api/posts/quote-tweets/introduction).
This endpoint returns the quoting tweet, its author, and visible engagement.
It never changes the original tweet.

### How does a Twitter API view quote tweets?

Pass the original tweet's numeric ID through the path. Store every returned
`quote_id` before requesting `next_cursor`. Keep the original tweet ID beside
each row for attribution, deduplication, and campaign reporting.

### Why are some quote tweets not showing?

X controls which quote tweets each request exposes. Deleted, protected,
withheld, blocked, or unavailable tweets may not appear. Filters can also
remove otherwise visible rows. A missing row cannot confirm zero quote
activity.

### How do quote tweets differ from replies and reposts?

A quote tweet adds its author's commentary and references the original tweet.
A repost shares the original without added commentary. The replies endpoint
returns tweets from the original conversation. Use retweeters for reposting
profiles.

### How can teams analyze quote tweets?

Store text, author, creation time, engagement counts, and media URLs. Keep the
source relationship separate. Use both tweet IDs as the deduplication key. Use
monitors and signed webhooks for future quote alerts.

## Path parameters

<ParamField path="id" type="string" required>
  Post ID or URL-encoded post URL, such as `x.com/nasa/status/20`. See [path IDs](/api-reference/overview#path-ids).
</ParamField>

## Query parameters

<ParamField query="cursor" type="string">
  Pagination cursor from `next_cursor` in a previous response. Leave it empty
  for the initial request. Pass a cursor only when `has_next_page` is true.
</ParamField>

<ParamField query="mode" type="string">
  Legacy pagination override. Use `standard` when required by an older client.
  Search filters such as `keywords` apply only without it.
</ParamField>

<ParamField query="pageSize" type="integer">
  Tweets per page. Range: `1-100`. Defaults to `20`.
</ParamField>

<ParamField query="sinceTime" type="string">
  Unix timestamp in seconds. Only return quotes after this time.
</ParamField>

<ParamField query="untilTime" type="string">
  Unix timestamp in seconds. Only return quotes before this time.
</ParamField>

A reply that quotes the tweet is part of the default result, as in the Quotes
view on X. Send `replies=exclude` to drop such replies.

### Tweet result filters

These optional filters apply to `tweets[]` returned by this route. They keep the
same quoted tweet. Xquik filters rows after it fetches each page. Selective
filters can return fewer rows than an unfiltered page.

<ParamField query="includeReplies" type="boolean">
  Keep replies that quote the post. Automatic pages keep them unless this is
  `false`. Standard pages keep them only when it is `true`. Explicit `replies`
  takes precedence.
</ParamField>

<ParamField query="fromUser" type="string">
  Filter to posts from this username. The `@` prefix is optional.
</ParamField>

<ParamField query="toUser" type="string">
  Filter to replies directed to this username.
</ParamField>

<ParamField query="mentioning" type="string">
  Filter to posts that mention this username.
</ParamField>

<ParamField query="language" type="string">
  Only include posts with this language code.
</ParamField>

<ParamField query="sinceDate" type="string">
  Include posts created on or after this date or timestamp.
</ParamField>

<ParamField query="untilDate" type="string">
  Include posts up to this date or timestamp. A date is a UTC day, inclusive, so its own posts count.
</ParamField>

<ParamField query="mediaType" type="string">
  Use `images`, `videos`, `gifs`, `media`, `links`, or `none`.
</ParamField>

<ParamField query="minLikes" type="integer">
  Require this minimum like count.
</ParamField>

<ParamField query="minRetweets" type="integer">
  Require this minimum repost count.
</ParamField>

<ParamField query="minReplies" type="integer">
  Require this minimum reply count.
</ParamField>

<ParamField query="minQuotes" type="integer">
  Require this minimum quote count.
</ParamField>

<ParamField query="minViews" type="integer">
  Require this minimum view count.
</ParamField>

<ParamField query="minBookmarks" type="integer">
  Require this minimum bookmark count.
</ParamField>

<ParamField query="maxFaves" type="integer">
  Allow this maximum like count. Missing counts pass.
</ParamField>

<ParamField query="maxRetweets" type="integer">
  Allow this maximum repost count. Missing counts pass.
</ParamField>

<ParamField query="maxReplies" type="integer">
  Allow this maximum reply count. Missing counts pass.
</ParamField>

<ParamField query="maxQuotes" type="integer">
  Allow this maximum quote count. Missing counts pass.
</ParamField>

<ParamField query="blueVerifiedOnly" type="boolean">
  When `true`, only return posts from Blue-verified authors.
</ParamField>

<ParamField query="verifiedOnly" type="boolean">
  When `true`, only return posts from verified authors.
</ParamField>

<ParamField query="replies" type="string">
  Use `include`, `exclude`, or `only` for replies.
  This setting overrides `includeReplies` when the endpoint supports both.
</ParamField>

<ParamField query="retweets" type="string">
  Use `include`, `exclude`, or `only` for reposts.
</ParamField>

<ParamField query="exactPhrase" type="string">
  Match this literal phrase, including any hyphens.
</ParamField>

<ParamField query="excludeWords" type="string">
  Exclude comma-separated or whitespace-separated terms.
</ParamField>

<ParamField query="anyWords" type="string">
  Require at least 1 comma-separated or whitespace-separated term.
</ParamField>

<ParamField query="hashtags" type="string">
  Match these hashtags. Separate values with commas or spaces.
</ParamField>

<ParamField query="cashtags" type="string">
  Match these cashtags. Separate values with commas or spaces.
</ParamField>

<ParamField query="quotes" type="string">
  Use `include`, `exclude`, or `only` for quote posts.
</ParamField>

<ParamField query="url" type="string">
  URL substring or domain that must appear in tweet URL entities.
</ParamField>

<ParamField query="conversationId" type="string">
  Filter to tweets in this conversation thread.
</ParamField>

<ParamField query="inReplyToTweetId" type="string">
  Only include replies to this tweet ID.
</ParamField>

<ParamField query="quotesOfTweetId" type="string">
  Filter to quote tweets of this tweet ID.
</ParamField>

<ParamField query="retweetsOfTweetId" type="string">
  Filter to retweets of this tweet ID.
</ParamField>

<ParamField query="cardName" type="string">
  Keep only Tweets with this card type, such as `poll2choice_text_only`. Tweet
  search checks each Tweet's card.
</ParamField>

<ParamField query="source" type="string">
  X search no longer supports `source`. A Tweet search with it answers 424 &
  charges nothing.
</ParamField>

<ParamField query="excludeSource" type="string">
  X search no longer supports `excludeSource`. A Tweet search with it answers 424
  & charges nothing.
</ParamField>

<ParamField query="geocode" type="string">
  X search no longer supports `geocode`. A Tweet search with it answers 424 &
  charges nothing.
</ParamField>

<ParamField query="near" type="string">
  Match this place name.
</ParamField>

<ParamField query="within" type="string">
  X search no longer supports `within`. A Tweet search with it answers 424 &
  charges nothing. Use `near` alone.
</ParamField>

<ParamField query="safe" type="boolean">
  When `true`, enable X safe-search filtering.
</ParamField>

<ParamField query="news" type="boolean">
  X no longer searches `filter:news`, so leave this unset.
</ParamField>

<ParamField query="sinceId" type="string">
  Return Tweets whose IDs exceed this ID.
</ParamField>

<ParamField query="maxId" type="string">
  Return Tweets at or below this ID.
</ParamField>

<ParamField query="nativeRetweets" type="boolean">
  When `true`, only return native reposts.
</ParamField>

<ParamField query="withinTime" type="string">
  Match Tweets from this recent window, such as `90m` or `7d`. Use a whole number & `s`, `m`, `h` or `d`.
</ParamField>

<ParamField query="keywords" type="string">
  Words the Tweets must match, in X search syntax.
</ParamField>

<ParamField query="place" type="string">
  Search within this X place ID. [Search places](/api-reference/x/search-places) finds the ID by name.
</ParamField>

<ParamField query="placeCountry" type="string">
  Search within this country code.
</ParamField>

<ParamField query="pointRadius" type="string">
  Geo point radius in X search syntax, such as `-73.99 40.73 25mi`.
</ParamField>

<ParamField query="boundingBox" type="string">
  Geo bounding box in X search syntax, such as `-74.1 40.6 -73.9 40.8`.
</ParamField>

<ParamField query="advancedQuery" type="string">
  Raw X search operators appended to the final search query.
</ParamField>

<ParamField query="listId" type="string">
  Search within this X List ID.
</ParamField>

## Which tweet engagement endpoint?

<CardGroup cols={2}>
  <Card title="Quote tweets" icon="quote">
    Use `GET /x/tweets/{id}/quotes` for tweet rows that quote one source tweet.
  </Card>

  <Card title="Tweet replies" icon="message-square-reply">
    Use [`GET /x/tweets/{id}/replies`](/api-reference/x/tweet-replies) when you
    need reply tweet rows under the source tweet.
  </Card>

  <Card title="Retweeters" icon="repeat-2">
    Use [`GET /x/tweets/{id}/retweeters`](/api-reference/x/retweeters) for user
    profiles that reposted one source tweet.
  </Card>

  <Card title="Tweet likers" icon="heart">
    Use [`GET /x/tweets/{id}/favoriters`](/api-reference/x/favoriters) for user
    profiles that liked one source tweet.
  </Card>

  <Card title="Saved exports" icon="file-spreadsheet">
    Use [`Create extraction`](/api-reference/extractions/create) with
    `toolType=quote_extractor` when you need a saved job or CSV, JSON, or XLSX
    export.
  </Card>

  <Card title="Search handoff" icon="search">
    Use [`Search tweets`](/api-reference/x/search-tweets) when you need keyword,
    operator, or structured-filter discovery across many source tweets.
  </Card>
</CardGroup>

## Headers

<ParamField header="x-api-key" type="string">
  Full account key. Sessions and OAuth also work.
</ParamField>

<ParamField header="Authorization" type="string">
  `Bearer xq_your_guest_key_here` for `paid_reads`.
</ParamField>

## Response

### 200 OK

<ResponseField name="tweets" type="object[]">
  Array of quote tweets.
  **Tweet object fields.**

  <ResponseField name="id" type="string">This value is the tweet ID.</ResponseField>
  <ResponseField name="text" type="string">This value contains the tweet text.</ResponseField>
  <ResponseField name="type" type="string">This value identifies the tweet type when available.</ResponseField>
  <ResponseField name="createdAt" type="string">This value contains the ISO 8601 creation timestamp.</ResponseField>
  <ResponseField name="isNoteTweet" type="boolean">Whether this is a Note Tweet. Omitted if unavailable.</ResponseField>
  <ResponseField name="isPinned" type="boolean">Whether the author pinned this post to their profile. Omitted if unavailable.</ResponseField>
  <ResponseField name="isReply" type="boolean">Whether the tweet is a reply. Omitted if unavailable.</ResponseField>
  <ResponseField name="inReplyToId" type="string">This ID identifies the tweet receiving the reply.</ResponseField>
  <ResponseField name="inReplyToUserId" type="string">User ID being replied to. Omitted if unavailable.</ResponseField>
  <ResponseField name="inReplyToUsername" type="string">Username being replied to. Omitted if unavailable.</ResponseField>
  <ResponseField name="conversationId" type="string">Conversation thread ID. Omitted if unavailable.</ResponseField>
  <ResponseField name="likeCount" type="number">This value records the like count when available.</ResponseField>
  <ResponseField name="retweetCount" type="number">This value records the repost count when available.</ResponseField>
  <ResponseField name="replyCount" type="number">This value records the reply count when available.</ResponseField>
  <ResponseField name="quoteCount" type="number">This value records the quote tweet count when available.</ResponseField>
  <ResponseField name="viewCount" type="number">This value records the view count when available.</ResponseField>
  <ResponseField name="bookmarkCount" type="number">This value records the bookmark count when available.</ResponseField>
  <ResponseField name="url" type="string">Permalink URL on X. Omitted if unavailable.</ResponseField>
  <ResponseField name="lang" type="string">The tweet's language code appears here when X returns it.</ResponseField>
  <ResponseField name="source" type="string">Client used to post the tweet. Omitted if unavailable.</ResponseField>
  <ResponseField name="displayTextRange" type="number[]">Start and end offsets for rendered tweet text. Omitted if unavailable.</ResponseField>
  <ResponseField name="isLimitedReply" type="boolean">Whether replies are limited. Omitted if unavailable.</ResponseField>
  <ResponseField name="isQuoteStatus" type="boolean">Whether this tweet quotes another tweet. Omitted if unavailable.</ResponseField>
  <ResponseField name="isRetweet" type="boolean">Whether this row is a retweet. `text` carries the original post in full.</ResponseField>
  <ResponseField name="entities" type="object">Parsed entities. Omitted if unavailable.</ResponseField>
  <ResponseField name="contentDisclosure" type="object">X can return paid partnership and AI-generated media labels here. Paid partnership state appears in `advertising.isPaidPromotion`. AI media state appears in `aiGenerated.hasAiGeneratedMedia`. X may omit this object.</ResponseField>

  <ResponseField name="author" type="object">
    Tweet author profile. Omitted if unavailable.
    **Author object fields.**
    <ResponseField name="id" type="string">Author user ID.</ResponseField>
    <ResponseField name="username" type="string">Author handle without `@`.</ResponseField>
    <ResponseField name="name" type="string">Author display name.</ResponseField>
    <ResponseField name="followers" type="number">This value records the author's follower count when available.</ResponseField>
    <ResponseField name="verified" type="boolean">Whether the author is verified. Omitted if unavailable.</ResponseField>
    <ResponseField name="profilePicture" type="string">Author profile image URL. Omitted if unavailable.</ResponseField>
  </ResponseField>

  <ResponseField name="media" type="object[]">
    This array contains media attachments when available.
    **Media object fields.**
    <ResponseField name="mediaUrl" type="string">Direct media URL.</ResponseField>
    <ResponseField name="videoVariants" type="object[]">Available video renditions with bitrate, content type, and URL. Omitted for images.</ResponseField>
    <ResponseField name="type" type="string">Media type.</ResponseField>
    <ResponseField name="url" type="string">Shortened URL from the tweet text.</ResponseField>
  </ResponseField>

  <ResponseField name="quoted_tweet" type="object">Embedded quoted tweet. Omitted if not a quote tweet.</ResponseField>
  <ResponseField name="retweeted_tweet" type="object">Original retweeted tweet. Omitted if not a retweet.</ResponseField>
</ResponseField>

<ResponseField name="has_next_page" type="boolean">Whether more results are available.</ResponseField>
<ResponseField name="next_cursor" type="string">Cursor for the next page.</ResponseField>

### 401 Unauthenticated

Anonymous requests receive `WWW-Authenticate: Bearer`. This is not a Payment challenge.

### 402 Payment required

Account keys receive account options. A guest wallet receives a checkout option.
Confirm any payment action.

<Note>
  **Related.** [Tweet replies](/api-reference/x/tweet-replies) · [Tweet thread](/api-reference/x/tweet-thread) · [Retweeters](/api-reference/x/retweeters) · [Tweet favoriters](/api-reference/x/favoriters)
</Note>

<div className="related-api-links">
  <Accordion title="Related tweet, reply & media APIs" icon="link">
    * Tweets: [Get tweet](/api-reference/x/get-tweet) · [Batch tweets](/api-reference/x/batch-tweets) · [Tweet thread](/api-reference/x/tweet-thread) · [Hidden replies](/api-reference/x/tweet-hidden-replies) · [Translate tweet](/api-reference/x/tweet-translation) · [Embed tweet](/api-reference/x/tweet-embed) · [Resolve links](/api-reference/x/resolve-links) · [Tweet subtitles](/api-reference/x/tweet-subtitles) · [X Article](/api-reference/x/get-article)
    * Analysis: [Sentiment analysis](/api-reference/x/sentiment-analysis) · [Brand mentions](/api-reference/x/brand-monitoring) · [News classification](/api-reference/x/news-classification) · [Market signals](/api-reference/x/market-signals) · [Viral score](/api-reference/x/viral-score) · [Classify posts](/api-reference/x/classify-tweets)
    * Engagement: [Tweet replies](/api-reference/x/tweet-replies) · [Quote tweets](/api-reference/x/tweet-quotes) · [Likers](/api-reference/x/favoriters) · [Reposters](/api-reference/x/retweeters) · [Check repost](/api-reference/x/tweet-repost-check)
    * Profiles: [User tweets](/api-reference/x/user-tweets) · [Batch user tweets](/api-reference/x/batch-user-tweets) · [User replies](/api-reference/x/user-replies) · [User likes](/api-reference/x/user-likes) · [User media](/api-reference/x/user-media) · [User highlights](/api-reference/x/user-highlights) · [User articles](/api-reference/x/user-articles)
    * Feeds: [List tweets](/api-reference/x/list-tweets) · [Trends](/api-reference/x/trends) · [Trend locations](/api-reference/x/trend-locations) · [Search Spaces](/api-reference/x/search-spaces) · [Get Space](/api-reference/x/get-space) · [Space replay](/api-reference/x/space-replay) · [Get broadcast](/api-reference/x/get-broadcast) · [Hashflags](/api-reference/x/hashflags) · [Search places](/api-reference/x/search-places) · [Download media](/api-reference/x/download-media)
  </Accordion>
</div>


This documentation is built and hosted on [Mintlify](https://mintlify.com), a developer documentation platform.