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

# Tweet lookup API, post details & engagement counts

> Retrieve one tweet by numeric ID with full text, author profile, media, reply and quote context, likes, reposts, views, and URLs. Costs 1 credit per call.

<Panel>
  <Tabs defaultTabIndex={0} sync={false}>
    <Tab title="200" id="response-x-get-tweet-200">
      ```json theme={null}
      {
        "tweet": {
          "id": "1234567890",
          "text": "New feature",
          "retweetCount": 5,
          "replyCount": 3,
          "likeCount": 42
        }
      }
      ```
    </Tab>

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

    <Tab title="401" id="response-x-get-tweet-401">
      ```json theme={null}
      {
        "error": "unauthenticated",
        "message": "Authentication required. Provide a valid API key or bearer token."
      }
      ```
    </Tab>

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

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

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

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

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

    <Tab title="503" id="response-x-get-tweet-503">
      ```json theme={null}
      {
        "error": "x_api_unavailable",
        "message": "Xquik is busy right now. 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>

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

Get tweet returns one tweet by numeric ID. The endpoint is `GET /api/v1/x/tweets/{id}`.

See [Read Data Richness](/guides/tweet-profile-api-fields) for every optional tweet,
author, and media field.

<CodeGroup>
  ```bash Tweet ID theme={null}
  curl https://xquik.com/api/v1/x/tweets/1893456789012345678 \
    -H "x-api-key: xq_your_api_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_api_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_api_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 build tweet lookup rows, not 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 record you pass on.

## Direct tweet handoff

Pass a post ID or a URL-encoded post URL in the path. Other input, such as a
username, returns `400 invalid_tweet_id`. 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.

## Store a tweet lookup record

Use the numeric Tweet ID as the stable key. Keep text, author, thread, quote,
engagement, media, and disclosure fields as separate columns. You
cannot search one merged value.

| Tweet record column | Response source | Handoff rule |
| - | - | - |
| `tweet_id` | `tweet.id` | Use as the stable tweet upsert key. |
| `tweet_url` | `tweet.url` | Keep the original X permalink when returned. |
| `text` | `tweet.text` | Store the complete returned tweet or Note Tweet text. |
| `created_at` | `tweet.createdAt` | Keep the tweet publication time. |
| `author_id` | `author.id` | Keep a stable author identity when usernames change. |
| `author_username` | `author.username` | Display the current author handle. |
| `conversation_id` | `tweet.conversationId` | Join the tweet to its conversation thread. |
| `in_reply_to_id` | `tweet.inReplyToId` | Join replies to their immediate parent tweet. |
| `quote_tweet_id` | `tweet.quoted_tweet.id` | Keep quoted-tweet attribution when present. |
| `is_note_tweet` | `tweet.isNoteTweet` | Distinguish long-form Note Tweet text. |
| `like_count` | `tweet.likeCount` | Store the observed engagement count with lookup time. |
| `reply_count` | `tweet.replyCount` | Send active conversation threads to review. |
| `media_urls` | `tweet.media[].mediaUrl` | Keep image, video, or animated GIF URLs. |
| `content_disclosure` | `tweet.contentDisclosure` | Keep paid-promotion or AI-media labels when returned. |

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

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

## 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">
  Full account key. Sessions and OAuth also work.
</ParamField>

<ParamField header="Authorization" type="string">
  `Bearer xq_your_guest_key_here` authenticates `paid_reads` guest keys. Direct MPP uses the `Payment ...` credential. Get it from the `WWW-Authenticate: Payment` challenge.
</ParamField>

## Response

### 200 OK

<ResponseField name="tweet" type="object">
  The tweet data.
  **Tweet object fields.**

  <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="isPinned" type="boolean">Whether the author pinned this post to their profile. Omitted if unavailable.</ResponseField>
  <ResponseField name="isReply" type="boolean">Whether this tweet is a reply to another tweet. Omitted when false.</ResponseField>
  <ResponseField name="isLimitedReply" type="boolean">Whether X limits who can reply. Omitted if unavailable.</ResponseField>
  <ResponseField name="isQuoteStatus" type="boolean">Whether this tweet quotes another tweet. Omitted when false.</ResponseField>
  <ResponseField name="isRetweet" type="boolean">Whether this row is a retweet. `text` carries the original post in full.</ResponseField>
  <ResponseField name="conversationId" type="string">ID of the root tweet in the conversation thread.</ResponseField>
  <ResponseField name="conversationControl" type="object">Who can reply: `policy`, `mode`, `allowedCountryCodes`, `inviteViaMention` & `ownerUsername`. Omitted if unavailable.</ResponseField>
  <ResponseField name="limitedActions" type="object[]">Public interaction restrictions. Omitted if unavailable.</ResponseField>
  <ResponseField name="unmentionedUserIds" type="string[]">Users that left this conversation. Omitted if unavailable.</ResponseField>
  <ResponseField name="inReplyToId" type="string">Tweet ID this post replies to. Omitted when not a reply.</ResponseField>
  <ResponseField name="inReplyToUserId" type="string">User ID this post replies to. Omitted when unavailable.</ResponseField>
  <ResponseField name="inReplyToUsername" type="string">Username this post replies to. Omitted when unavailable.</ResponseField>
  <ResponseField name="source" type="string">Client application used to post this tweet.</ResponseField>
  <ResponseField name="type" type="string">Tweet type. Omitted if unavailable.</ResponseField>
  <ResponseField name="url" type="string">Tweet permalink. Omitted if unavailable.</ResponseField>
  <ResponseField name="lang" type="string">Tweet language code. Omitted if unavailable.</ResponseField>
  <ResponseField name="displayTextRange" type="number[]">Start and end offsets for rendered text. Omitted if unavailable.</ResponseField>
  <ResponseField name="entities" type="object">Parsed entities from the tweet text (URLs, mentions, hashtags, media).</ResponseField>

  <ResponseField name="noteTweet" type="object">
    Complete Note Tweet content and formatting. `inlineMedia` items contain the
    text `index` and `mediaId`. Omitted outside Note Tweets.
  </ResponseField>

  <ResponseField name="authorUnavailable" type="object">Why the tweet has no author. X serves a suspended or deleted account as an unavailable user; contains `reason` (for example `Suspended` or `NotFound`) and, when X sends one, `message`. Omitted when the author is available.</ResponseField>
  <ResponseField name="unavailableAuthorId" type="string">The author's ID when X withholds the author's profile. Omitted otherwise.</ResponseField>
  <ResponseField name="exclusiveContent" type="object">Creator whose subscription unlocks a subscriber-only post. Contains `creatorUserName` and, on the preview non-subscribers get, `subscribeUrl`. Omitted on public posts.</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="communityId" type="string">Community ID. Omitted outside communities.</ResponseField>
  <ResponseField name="quotedTweetId" type="string">Quoted tweet ID. Omitted when unavailable.</ResponseField>
  <ResponseField name="quotedTweetPermalink" type="object">The quoted post's link, kept when X withholds that post. Contains `url`, `expandedUrl`, and `displayUrl`. Omitted if unavailable.</ResponseField>
  <ResponseField name="quoted_tweet" type="object">The quoted tweet object. Present when `isQuoteStatus` is true.</ResponseField>
  <ResponseField name="retweeted_tweet" type="object">The original tweet when this post is a repost. Omitted otherwise.</ResponseField>
  <ResponseField name="tombstone" type="object">Unavailable tweet metadata. Omitted for available tweets.</ResponseField>
  <ResponseField name="hasCommunityNotes" type="boolean">Whether X holds Community Notes on the post, shown or not. Omitted if unavailable.</ResponseField>
  <ResponseField name="grokTranslatedPost" type="object">Grok's translation of the post, as X shows it. X defines its fields. Omitted if unavailable.</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.
    **Media item fields.**
    <ResponseField name="mediaUrl" type="string">Direct media URL (pbs.twimg.com).</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: `photo`, `video`, or `animated_gif`.</ResponseField>
    <ResponseField name="url" type="string">Shortened t.co URL from the tweet text.</ResponseField>
    <ResponseField name="sourceUser" type="object">Public profile that first posted copied media. Omitted if unavailable.</ResponseField>
  </ResponseField>
</ResponseField>

<ResponseField name="author" type="object">
  The tweet author. Omitted if author data is 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="integer">
    Follower count.
  </ResponseField>

  <ResponseField name="verified" type="boolean">
    Whether X marks the author as verified.
  </ResponseField>

  <ResponseField name="profilePicture" type="string">
    Author profile image URL.
  </ResponseField>
</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": "GrokSignature",
        "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": "username",
    "followers": 10000,
    "verified": true,
    "profilePicture": "https://pbs.twimg.com/profile_images/xquik/photo.jpg"
  }
}
```

### 400 Invalid tweet ID

```json theme={null}
{ "error": "invalid_tweet_id" }
```

The provided tweet ID is empty or not a valid format.

### 401 Unauthenticated

```json theme={null}
{ "error": "unauthenticated" }
```

Missing or invalid API key. Check the `x-api-key` header value.

### 402 Payment required

Account keys get account options. Guest keys get guest top-up only.
Anonymous calls receive a direct MPP `WWW-Authenticate: Payment` challenge plus a guest wallet creation action.
No checkout starts automatically. Confirm any payment action.

### 404 Tweet not found

```json theme={null}
{
  "error": "tweet_not_found",
  "reason": "author_suspended",
  "message": "X suspended this post's author."
}
```

X shows no post with this ID. `reason` says why when X names it:

* `deleted`: the author deleted the post.
* `author_suspended`: X suspended the post's author.
* `protected`: the author limits who can see the post. Another account may still see it.

Without `reason`, X named no cause. Check the tweet ID.

### 502 X API unavailable

```json theme={null}
{ "error": "x_api_unavailable" }
```

The read service returned an error. Retry after a short delay.

### 429 Rate limit exceeded

```json theme={null}
{ "error": "rate_limit_exceeded", "retryAfter": 60 }
```

You exceeded your tier rate limit. Wait for the `Retry-After` header before retrying.

### 424 Dependency failed

```json theme={null}
{ "error": "x_api_unavailable" }
```

The normalized v1 response contract can return 424 when the read service is unavailable.

<Note>
  **Next steps.** [Search Tweets](/api-reference/x/search-tweets) to find tweets by query, or [Get User](/api-reference/x/twitter-profile-lookup) to look up the author profile.
</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.