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

# Twitter retweet checker API: did a user repost?

> Check whether one X account reposted a tweet, with the repost time & ID, for giveaway & campaign proof. Reads the account's newest posts. 1 credit per check.

<Panel>
  <Tabs defaultTabIndex={0} sync={false}>
    <Tab title="200" id="response-x-tweet-repost-check-200">
      ```json theme={null}
      {
        "isRetweeted": true,
        "retweetedAt": "2026-09-11T16:59:50.000Z",
        "retweetId": "2098456494362460375",
        "tweetId": "2098439298617856319",
        "userId": "3065618342",
        "checkedPosts": 20,
        "complete": false
      }
      ```
    </Tab>

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

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

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

    <Tab title="403" id="response-x-tweet-repost-check-403">
      ```json theme={null}
      {
        "error": "x_account_protected",
        "message": "Account is protected. Choose a public account."
      }
      ```
    </Tab>

    <Tab title="404" id="response-x-tweet-repost-check-404">
      ```json theme={null}
      {
        "error": "user_not_found",
        "message": "X user not found. Check the username."
      }
      ```
    </Tab>

    <Tab title="424" id="response-x-tweet-repost-check-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-repost-check-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-repost-check-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-repost-check-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>

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

<CodeGroup>
  ```bash cURL theme={null}
  curl -G https://xquik.com/api/v1/x/tweets/2098439298617856319/retweeters/check \
    --data-urlencode "user=discord" \
    -H "x-api-key: xq_your_api_key_here" | jq
  ```

  ```javascript Node.js theme={null}
  const tweetId = "2098439298617856319";
  const params = new URLSearchParams({ user: "discord" });
  const response = await fetch(
    `https://xquik.com/api/v1/x/tweets/${tweetId}/retweeters/check?${params}`,
    { headers: { "x-api-key": "xq_your_api_key_here" } },
  );
  const check = await response.json();
  if (!response.ok) throw new Error(JSON.stringify(check));

  const proofRow = {
    tweet_id: check.tweetId,
    user_id: check.userId,
    reposted: check.isRetweeted,
    reposted_at: check.retweetedAt,
    read_whole_timeline: check.complete,
  };
  process.stdout.write(`${JSON.stringify(proofRow)}\n`);
  ```

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

  tweet_id = "2098439298617856319"
  response = requests.get(
      f"https://xquik.com/api/v1/x/tweets/{tweet_id}/retweeters/check",
      params={"user": "discord"},
      headers={"x-api-key": "xq_your_api_key_here"},
  )
  check = response.json()
  if not response.ok:
      raise RuntimeError(check)

  proof_row = {
      "tweet_id": check["tweetId"],
      "user_id": check["userId"],
      "reposted": check["isRetweeted"],
      "reposted_at": check["retweetedAt"],
      "read_whole_timeline": check["complete"],
  }
  print(json.dumps(proof_row, separators=(",", ":")))
  ```
</CodeGroup>

## How the check reads

X keeps no list of the reposts one account made of one post. So the check reads
the account's newest posts, up to 3 pages, and stops at the first repost of the
post. `checkedPosts` says how many posts it read.

* `isRetweeted: true` names the repost in `retweetId` and its time in
  `retweetedAt`.
* `isRetweeted: false` with `complete: true` means the account never reposted
  the post.
* `isRetweeted: false` with `complete: false` means no repost among the newest
  posts. An older repost can exist.

A protected account returns 403 `x_account_protected`. Xquik charges nothing.

## Path parameters

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

## Query parameters

<ParamField query="user" type="string" required>
  The account to check: user ID, username with or without `@`, or profile URL.
</ParamField>

## 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="isRetweeted" type="boolean">
  Whether the account reposted the post.
</ResponseField>

<ResponseField name="retweetedAt" type="string | null">
  When the account reposted it, else `null`.
</ResponseField>

<ResponseField name="retweetId" type="string | null">
  The ID of the account's repost, else `null`.
</ResponseField>

<ResponseField name="tweetId" type="string">
  The post checked.
</ResponseField>

<ResponseField name="userId" type="string">
  The account checked.
</ResponseField>

<ResponseField name="checkedPosts" type="number">
  How many of the account's newest posts the check read.
</ResponseField>

<ResponseField name="complete" type="boolean">
  Whether the check read the account's whole timeline.
</ResponseField>

```json theme={null}
{
  "isRetweeted": true,
  "retweetedAt": "2026-09-11T16:59:50.000Z",
  "retweetId": "2098456494362460375",
  "tweetId": "2098439298617856319",
  "userId": "3065618342",
  "checkedPosts": 20,
  "complete": false
}
```

### 400 Invalid tweet ID

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

### 400 Invalid user ID

```json theme={null}
{
  "error": "invalid_user_id",
  "message": "Send a user ID, @username or profile URL, such as x.com/nasa."
}
```

`user` is missing or invalid.

### 403 Protected account

```json theme={null}
{
  "error": "x_account_protected",
  "message": "Account is protected. Choose a public account."
}
```

### 404 User not found

```json theme={null}
{ "error": "user_not_found", "message": "X user not found. Check the username." }
```

### 401 Unauthenticated

Anonymous requests get `WWW-Authenticate: Bearer` and a guest wallet checkout action. This is not a Payment challenge.

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

Missing or invalid API key.

### 402 Payment required

Account keys get account options. Guest keys get guest top-up only.
No checkout starts automatically. Confirm any payment action.

### 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>
  **Related.** [Retweeters](/api-reference/x/retweeters) · [Check follower](/api-reference/x/check-follower) · [Get tweet](/api-reference/x/get-tweet)
</Note>

<AudienceCommunityApiLinks />


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