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

# Get tweet

> Retrieve one tweet by numeric ID with full text, author fields, media, quote and reply context, and metrics

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

<Callout icon="coins" color="#5c3327">
  **1 credit per call** · [All plans](https://xquik.com/#pricing) from \$0.00012/credit · Accepts [MPP](/mpp/overview)
</Callout>

<Info>
  Get tweet returns one tweet by numeric ID. It is also useful as a tweet lookup
  API, single tweet API, tweet info API, X tweet API, or tweet details endpoint.
  The canonical endpoint remains `GET /api/v1/x/tweets/{id}`.
</Info>

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

  ```javascript Node.js theme={null}
  const tweetId = "1893456789012345678";
  const response = await fetch(`https://xquik.com/api/v1/x/tweets/${tweetId}`, {
    headers: { "x-api-key": "xq_YOUR_KEY_HERE" },
  });
  const data = await response.json();
  const tweet = data.tweet;
  const author = data.author ?? {};
  const media = tweet.media ?? [];
  const quotedTweet = tweet.quoted_tweet;
  const handoff = {
    tweet_id: tweet.id,
    text: tweet.text,
    author_id: author.id ?? null,
    author_username: author.username ?? null,
    author_followers: author.followers ?? null,
    author_verified: author.verified ?? null,
    author_profile_picture: author.profilePicture ?? null,
    created_at: tweet.createdAt ?? null,
    conversation_id: tweet.conversationId ?? null,
    is_reply: tweet.isReply === true,
    is_quote_status: tweet.isQuoteStatus === true,
    is_note_tweet: tweet.isNoteTweet === true,
    tweet_source: tweet.source ?? null,
    quote_tweet_id: quotedTweet?.id ?? null,
    metrics: {
      retweets: tweet.retweetCount ?? 0,
      replies: tweet.replyCount ?? 0,
      likes: tweet.likeCount ?? 0,
      quotes: tweet.quoteCount ?? 0,
      views: tweet.viewCount ?? 0,
      bookmarks: tweet.bookmarkCount ?? 0,
    },
    media_urls: media.map((item) => item.mediaUrl),
  };
  process.stdout.write(`${JSON.stringify(handoff)}\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}",
      headers={"x-api-key": "xq_YOUR_KEY_HERE"},
  )
  data = response.json()
  tweet = data["tweet"]
  author = data.get("author") or {}
  media = tweet.get("media", [])
  quoted_tweet = tweet.get("quoted_tweet") or {}
  handoff = {
      "tweet_id": tweet["id"],
      "text": tweet["text"],
      "author_id": author.get("id"),
      "author_username": author.get("username"),
      "author_followers": author.get("followers"),
      "author_verified": author.get("verified"),
      "author_profile_picture": author.get("profilePicture"),
      "created_at": tweet.get("createdAt"),
      "conversation_id": tweet.get("conversationId"),
      "is_reply": tweet.get("isReply") is True,
      "is_quote_status": tweet.get("isQuoteStatus") is True,
      "is_note_tweet": tweet.get("isNoteTweet") is True,
      "tweet_source": tweet.get("source"),
      "quote_tweet_id": quoted_tweet.get("id"),
      "metrics": {
          "retweets": tweet.get("retweetCount", 0),
          "replies": tweet.get("replyCount", 0),
          "likes": tweet.get("likeCount", 0),
          "quotes": tweet.get("quoteCount", 0),
          "views": tweet.get("viewCount", 0),
          "bookmarks": tweet.get("bookmarkCount", 0),
      },
      "media_urls": [item["mediaUrl"] for item in media],
  }
  print(json.dumps(handoff))
  ```
</CodeGroup>

The examples shape durable tweet lookup rows instead of raw response dumps. Use
`GET /api/v1/x/tweets/{id}` when a workflow needs one tweet plus author context.
Store `tweet_id`, `text`, `author_id`, `author_username`, `author_followers`,
`author_verified`, `author_profile_picture`, `created_at`, `conversation_id`,
`is_reply`, `is_quote_status`, `is_note_tweet`, `tweet_source`,
`quote_tweet_id`, `metrics`, and `media_urls` with the downstream record.

## Direct tweet handoff

Pass a 15 to 20 digit numeric tweet ID in the path. If a user gives a tweet URL,
extract the final status ID first. For workflows that accept pasted Tweet URLs,
call [`Search tweets`](/api-reference/x/search-tweets) with the URL in `q` and
omit `cursor`, `sinceTime`, and `untilTime`. URLs, usernames, and short IDs
still return `400 invalid_tweet_id` on this path endpoint. Use the response when
you need normalized tweet text, optional author data, engagement counts, quote
metadata, conversation context, Note Tweet text, source, and media URLs for 1
record.

<CardGroup cols={2}>
  <Card title="Single row" icon="message-square">
    Store one durable row per ID with `tweet_id`, `text`, timestamps, flags,
    metrics, and media URLs.
  </Card>

  <Card title="Author context" icon="user-round">
    Use embedded `author` fields when returned instead of making a second user
    lookup for the same row.
  </Card>

  <Card title="Quote context" icon="quote">
    Store `isQuoteStatus` and `quoted_tweet.id` when you need quote joins or
    attribution.
  </Card>

  <Card title="Conversation joins" icon="list-tree">
    Store `conversationId` and `isReply` when the row feeds a thread, reply, or
    moderation workflow.
  </Card>

  <Card title="Long-form tweets" icon="file-text">
    Use `isNoteTweet` and `tweet.text` for complete Note Tweet text returned by
    this endpoint.
  </Card>

  <Card title="Media assets" icon="image">
    Store each `media[].mediaUrl` for review queues, warehouses, and downstream
    enrichment.
  </Card>
</CardGroup>

Direct tweet reads cost 1 credit per successful call. For MPP callers, this
endpoint is billed as a fixed charge at USD 0.00015 per call.

## Path parameters

<ParamField path="id" type="string" required>
  Numeric tweet ID, 15-20 digits. If you have a tweet URL, use the final status
  ID.
</ParamField>

## Which tweet endpoint?

<CardGroup cols={2}>
  <Card title="One tweet by ID" icon="message-square">
    Use `GET /x/tweets/{id}` for one tweet's text, author, media, quote or reply
    flags, metrics, and Note Tweet text.
  </Card>

  <Card title="Many tweet IDs" icon="files">
    Use [`Get tweets (batch)`](/api-reference/x/batch-tweets) when you already
    have multiple numeric IDs.
  </Card>

  <Card title="Keyword or advanced search" icon="search">
    Use [`Search tweets`](/api-reference/x/search-tweets) when you need keyword,
    operator, author, date, media, engagement, verification filters, or pasted
    Tweet URL exact lookup.
  </Card>

  <Card title="Thread context" icon="list-tree">
    Use [`Get tweet thread`](/api-reference/x/tweet-thread) when the next action
    needs surrounding conversation rows.
  </Card>

  <Card title="Engagement lists" icon="users-round">
    Use replies, quote tweets, retweeters, or favoriters pages when you need
    users or tweets connected to this tweet.
  </Card>

  <Card title="Saved exports" icon="file-spreadsheet">
    Use [`Create extraction`](/api-reference/extractions/create) with
    `reply_extractor`, `quote_extractor`, `repost_extractor`,
    `thread_extractor`, or `tweet_search_extractor` when you need CSV, JSON, or
    XLSX output.
  </Card>
</CardGroup>

## Headers

<ParamField header="x-api-key" type="string" required>
  Your API key. Session cookie authentication is also supported.
</ParamField>

## Response

<Tabs>
  <Tab title="200 OK">
    <ResponseField name="tweet" type="object">
      The tweet data.

      <Expandable title="tweet object">
        <ResponseField name="id" type="string">Tweet ID.</ResponseField>
        <ResponseField name="text" type="string">Tweet text content. For Note Tweets (long-form posts), returns the complete text up to 25,000 characters.</ResponseField>
        <ResponseField name="createdAt" type="string">ISO 8601 creation timestamp.</ResponseField>
        <ResponseField name="isNoteTweet" type="boolean">Whether this is a Note Tweet (long-form post, up to 25,000 characters). Omitted when false.</ResponseField>
        <ResponseField name="isReply" type="boolean">Whether this tweet is a reply to another tweet. Omitted when false.</ResponseField>
        <ResponseField name="isQuoteStatus" type="boolean">Whether this tweet quotes another tweet. Omitted when false.</ResponseField>
        <ResponseField name="conversationId" type="string">ID of the root tweet in the conversation thread.</ResponseField>
        <ResponseField name="source" type="string">Client application used to post this tweet.</ResponseField>
        <ResponseField name="entities" type="object">Parsed entities from the tweet text (URLs, mentions, hashtags, media).</ResponseField>
        <ResponseField name="contentDisclosure" type="object">Disclosure metadata for paid partnership and AI-generated media labels. Includes `advertising.isPaidPromotion` and `aiGenerated.hasAiGeneratedMedia` when X returns them. Omitted if unavailable.</ResponseField>
        <ResponseField name="quoted_tweet" type="object">The quoted tweet object. Present when `isQuoteStatus` is true.</ResponseField>
        <ResponseField name="retweetCount" type="number">Retweet count.</ResponseField>
        <ResponseField name="replyCount" type="number">Reply count.</ResponseField>
        <ResponseField name="likeCount" type="number">Like count.</ResponseField>
        <ResponseField name="quoteCount" type="number">Quote tweet count.</ResponseField>
        <ResponseField name="viewCount" type="number">View count.</ResponseField>
        <ResponseField name="bookmarkCount" type="number">Bookmark count.</ResponseField>

        <ResponseField name="media" type="object[]">
          Attached media items. Omitted when the tweet has no attached media.

          <Expandable title="media item">
            <ResponseField name="mediaUrl" type="string">Direct media URL (pbs.twimg.com).</ResponseField>
            <ResponseField name="type" type="string">Media type: `photo`, `video`, or `animated_gif`.</ResponseField>
            <ResponseField name="url" type="string">Shortened t.co URL from the tweet text.</ResponseField>
          </Expandable>
        </ResponseField>
      </Expandable>
    </ResponseField>

    <ResponseField name="author" type="object">
      The tweet author. Omitted if author data is unavailable.

      <Expandable title="author object">
        <ResponseField name="id" type="string">Author user ID.</ResponseField>
        <ResponseField name="username" type="string">Author X username.</ResponseField>
        <ResponseField name="followers" type="number">Follower count.</ResponseField>
        <ResponseField name="verified" type="boolean">Whether the author is verified.</ResponseField>
        <ResponseField name="profilePicture" type="string">Profile picture URL. Omitted if unavailable.</ResponseField>
      </Expandable>
    </ResponseField>

    ```json theme={null}
    {
      "tweet": {
        "id": "1893456789012345678",
        "text": "Introducing our new extraction API. Ship faster.",
        "createdAt": "2026-02-24T14:30:00.000Z",
        "isNoteTweet": false,
        "isReply": false,
        "isQuoteStatus": true,
        "conversationId": "1893456789012345678",
        "source": "Twitter Web App",
        "contentDisclosure": {
          "advertising": { "isPaidPromotion": true },
          "aiGenerated": {
            "detectionSource": "UserDeclared",
            "hasAiGeneratedMedia": true
          }
        },
        "entities": {
          "urls": [
            {
              "display_url": "xquik.com/blog/extracti...",
              "expanded_url": "https://xquik.com/blog/extraction-api",
              "url": "https://t.co/abc123"
            }
          ],
          "hashtags": [],
          "user_mentions": []
        },
        "quoted_tweet": {
          "id": "1893000000000000000",
          "text": "What API tools are you shipping this week?",
          "author": {
            "id": "111222333",
            "username": "devtools"
          }
        },
        "retweetCount": 320,
        "replyCount": 85,
        "likeCount": 1400,
        "quoteCount": 45,
        "viewCount": 250000,
        "bookmarkCount": 210,
        "media": [
          {
            "mediaUrl": "https://pbs.twimg.com/media/example.jpg",
            "type": "photo",
            "url": "https://t.co/abc123"
          }
        ]
      },
      "author": {
        "id": "987654321",
        "username": "xquikcom",
        "followers": 10000,
        "verified": true,
        "profilePicture": "https://pbs.twimg.com/profile_images/xquik/photo.jpg"
      }
    }
    ```
  </Tab>

  <Tab title="400 Invalid tweet ID">
    ```json theme={null}
    { "error": "invalid_tweet_id" }
    ```

    The provided tweet ID is empty or not a valid format.
  </Tab>

  <Tab title="401 Unauthenticated">
    ```json theme={null}
    { "error": "unauthenticated" }
    ```

    Missing or invalid API key. Check the `x-api-key` header value.
  </Tab>

  <Tab title="402 Subscription required">
    ```json theme={null}
    { "error": "no_subscription" }
    ```

    No active subscription or insufficient credits. Possible error values: `no_subscription`, `subscription_inactive`, `no_credits`, `insufficient_credits`.
    For [MPP](/mpp/overview) requests without a valid payment credential, 402 returns a `WWW-Authenticate: Payment` challenge header instead.
  </Tab>

  <Tab title="404 Tweet not found">
    ```json theme={null}
    { "error": "tweet_not_found" }
    ```

    The tweet does not exist. It may have been deleted or the ID is invalid.
  </Tab>

  <Tab title="502 X API unavailable">
    ```json theme={null}
    { "error": "x_api_unavailable" }
    ```

    The read service returned an error. Retry after a short delay.
  </Tab>

  <Tab title="429 Rate Limit Exceeded">
    ```json theme={null}
    { "error": "rate_limit_exceeded", "retryAfter": 60 }
    ```

    Your tier rate limit was exceeded. Wait for the `Retry-After` header before retrying.
  </Tab>

  <Tab title="424 Dependency Failed">
    ```json theme={null}
    { "error": "x_api_unavailable" }
    ```

    The normalized v1 response contract can return 424 when the read service is unavailable.
  </Tab>
</Tabs>

<Note>
  **Next steps:** [Search Tweets](/api-reference/x/search-tweets) to find tweets by query, or [Get User](/api-reference/x/get-user) to look up the author profile.
</Note>
