---
title: "Check an X account for a shadowban"
method: GET
path: "/x/users/{id}/shadowban"
tags: ["Users"]
---

# Check an X account for a shadowban

`GET /x/users/{id}/shadowban`

## Request

- Base URL: `https://xquik.com/api/v1`
- URL: `https://xquik.com/api/v1/x/users/{id}/shadowban`
- Auth: one of:
  - API key in header `x-api-key`
  - HTTP bearer
  - none

Checks 1 X account for a search ban, a search suggestion ban, reply deboosting & a reply lock. It also tests timeline visibility & early engagement, reads the sensitive flag & the countries that withhold the account, and says if the account is active, protected or suspended.

Each check answers pass, fail or unknown, with its reason & what it read. `overall` sums up the checks, and `checkedAt` holds the time of the check. The reply checks and the engagement check answer pass or unknown, since X ranks replies for each viewer and a drop alone proves nothing. A protected account skips the checks that need public posts, and a suspended account gets the account check only. Each profile, post, suggestion & reply in the answer costs 1 credit.

Shadowban checks show if X search lists an account, with each post they read.

## Path parameters

- `id` string, required

## Query parameters

- `fields` string
- `omit` string

## Response `200`

Shadowban checks

- ShadowbanReport: Says whether X limits 1 account in search, search suggestions, reply threads or its timeline. Each check holds a verdict, its reason & the evidence it read. Evidence is null for a check that couldn't read the account.
  - `username` string, nullable, required: Username of the account. Null for a suspended account asked for by ID.
  - `userId` string, nullable, required: ID of the account. Null for a suspended account asked for by username.
  - `account` 'active' | 'protected' | 'suspended', required: Whether the account is active, protected or suspended.
  - `checkedAt` string, date-time, required: When the check ran.
  - `overall` 'clear' | 'limited' | 'unclear' | 'suspended', required: `suspended` means X suspended the account. `limited` means at least 1 check failed. `clear` means search & suggestions passed with no fail. `unclear` means neither of those.
  - `checks` object, required: The 9 checks, each with a verdict, a reason & evidence.
    - `account` object, required: Passes an active or protected account & fails a suspended one.
      - `verdict` 'pass' | 'fail' | 'unknown', required: Pass means X shows the account there, and fail means it doesn't. Unknown means the check had nothing to test or X didn't answer.
      - `reason` 'active' | 'protected' | 'suspended', required: State of the account on X.
      - `evidence` object, required: Where to see the account on X.
        - `profileUrl` string, uri, required: Profile of the account on X.
    - `search` object, required: Looks for the account's recent posts in X search, sorted by Latest. `listed` passes & `missing` fails.
      - `verdict` 'pass' | 'fail' | 'unknown', required: Pass means X shows the account there, and fail means it doesn't. Unknown means the check had nothing to test or X didn't answer.
      - `reason` 'listed' | 'missing' | 'no_recent_posts' | 'unavailable' | 'protected' | 'suspended', required: `listed` means search shows its posts & `missing` means it shows none. `no_recent_posts` means the account has no recent post to look for.
      - `evidence` object, nullable, required: The search & the posts it looked for.
        - `query` string, required: The search it ran.
        - `searchUrl` string, uri, required: The same search on X, sorted by Latest.
        - `recentPostIds` string[], required: Up to 5 recent posts of the account.
        - `foundPostIds` string[], required: Up to 5 posts of the account that search showed.
    - `suggestion` object, required: Looks for the account among the accounts X suggests for its username. `suggested` passes & `not_suggested` fails.
      - `verdict` 'pass' | 'fail' | 'unknown', required: Pass means X shows the account there, and fail means it doesn't. Unknown means the check had nothing to test or X didn't answer.
      - `reason` 'suggested' | 'not_suggested' | 'unavailable' | 'suspended', required: `suggested` means X suggests the account for its username.
      - `evidence` object, nullable, required: The username searched & the accounts X suggested.
        - `query` string, required: The username it typed.
        - `suggestedUsernames` string[], required: Up to 10 accounts X suggested, in its order.
    - `replies` object, required: Opens the threads of up to 3 recent replies to other accounts. `in_thread` passes. X ranks replies for each viewer, so `more_replies` can't tell.
      - `verdict` 'pass' | 'fail' | 'unknown', required: Pass means X shows the account there, and fail means it doesn't. Unknown means the check had nothing to test or X didn't answer.
      - `reason` 'in_thread' | 'more_replies' | 'no_recent_replies' | 'not_found' | 'unavailable' | 'protected' | 'suspended', required: `more_replies` means X put a reply behind its hidden replies prompt. `not_found` means no reply showed on the pages the check read.
      - `evidence` object, nullable, required: Each reply it opened & where it showed.
        - `replies` object[], required: Up to 3 replies, newest first.
          - `replyId` string, required: ID of the reply.
          - `replyUrl` string, uri, required: The reply on X.
          - `parentId` string, required: ID of the post it replies to.
          - `parentUrl` string, uri, required: The thread of that post on X.
          - `placement` 'thread' | 'more_replies' | 'not_found', required: `thread` means the reply shows in the thread. `more_replies` means it shows only behind X's hidden replies prompt.
    - `replyLock` object, required: Reads the same reply threads as `replies`. `replies_show` passes when any checked reply shows. X ranks replies for each viewer, so `replies_missing` can't tell.
      - `verdict` 'pass' | 'fail' | 'unknown', required: Pass means X shows the account there, and fail means it doesn't. Unknown means the check had nothing to test or X didn't answer.
      - `reason` 'replies_show' | 'replies_missing' | 'no_recent_replies' | 'unavailable' | 'protected' | 'suspended', required: `replies_show` means X showed at least 1 checked reply. `replies_missing` means it showed none on the pages read.
      - `evidence` object, nullable, required: How many replies it opened & how many showed.
        - `checkedReplies` integer, required: Replies it looked for, up to 3.
        - `shownReplies` integer, required: Replies that showed in their thread.
    - `timeline` object, required: Looks for the account's posts on its profile timeline. `visible` passes & `hidden` fails.
      - `verdict` 'pass' | 'fail' | 'unknown', required: Pass means X shows the account there, and fail means it doesn't. Unknown means the check had nothing to test or X didn't answer.
      - `reason` 'visible' | 'hidden' | 'no_posts' | 'unavailable' | 'protected' | 'suspended', required: `visible` means the timeline shows posts. `hidden` means X counts posts but shows none. `no_posts` means the account has none to show.
      - `evidence` object, nullable, required: The post count on the profile & the posts read.
        - `postCount` integer, nullable, required: Posts X counts on the profile.
        - `timelinePosts` integer, required: Posts the timeline read returned, up to 20.
    - `engagement` object, required: Compares the newest 5 of the account's own posts older than 24 hours with its earlier posts, by the median of likes, replies, reposts & quotes. `typical` passes at 25% or more. A drop alone proves nothing, so `low` can't tell.
      - `verdict` 'pass' | 'fail' | 'unknown', required: Pass means X shows the account there, and fail means it doesn't. Unknown means the check had nothing to test or X didn't answer.
      - `reason` 'typical' | 'low' | 'too_few_posts' | 'unavailable' | 'protected' | 'suspended', required: `too_few_posts` means fewer than 8 posts to compare, or earlier posts with no engagement.
      - `evidence` object, nullable, required: The 2 medians & how many posts each one covers.
        - `newestMedian` number, required: Median engagement of the newest posts.
        - `newestPosts` integer, required: Posts in the newest group, up to 5.
        - `earlierMedian` number, required: Median engagement of the earlier posts.
        - `earlierPosts` integer, required: Posts in the earlier group.
    - `sensitive` object, required: Reads X's sensitive flag on the profile. `not_flagged` passes & `flagged` fails.
      - `verdict` 'pass' | 'fail' | 'unknown', required: Pass means X shows the account there, and fail means it doesn't. Unknown means the check had nothing to test or X didn't answer.
      - `reason` 'not_flagged' | 'flagged' | 'unknown' | 'suspended', required: `unknown` means X left the flag out of the profile.
      - `evidence` unknown, required
    - `withheld` object, required: Reads the countries where X withholds the account. `none` passes & `countries` fails.
      - `verdict` 'pass' | 'fail' | 'unknown', required: Pass means X shows the account there, and fail means it doesn't. Unknown means the check had nothing to test or X didn't answer.
      - `reason` 'none' | 'countries' | 'suspended', required: `countries` means X lists at least 1 country.
      - `evidence` object, nullable, required: The countries X lists.
        - `countries` string[], required: Country codes as X gives them.

## Other responses

- `400`: Invalid input. A value past its maxLength gets this answer, & the message names the field & its limit. Bad input costs nothing, since it's refused before any read.
- `401`: Non-MPP paid reads require Bearer authentication. Without credentials, the answer offers a guest checkout but does not create it. Invalid credentials return a plain error. Confirm before using any offered action.
- `402`: Payment required. MPP reads include `WWW-Authenticate`. Authenticated reads include balances, plus checkout when the key can open it. A key that reads only gets the account page instead. A failed request never creates checkout. A caller on a plan gets top-up only, plus `credits_renew_at` when the plan renews. Guest keys offer top-up.
- `403`: The API key is paused. Resume it at dashboard.xquik.com/api-keys & its next call goes through.
- `404`: X shows no profile for the account. `reason` says why. It is `not_found` for a handle or ID no account holds, which X answers for a deactivated account too. It is `suspended` when X suspended the account, with the message "X suspended this account. Choose another account."
- `424`: Dependency unavailable, unauthorized, or limited. Default v1 uses 502. Best-practice responses use 424 for transparent dependency failures. Search answers 424 `search_unavailable` when X fails the query itself, or when a filtered search goes far back without a match. The message says how far back the search looked. "X can't run this search" appears only when it's true. Searches X can't run fail at once, with the fix. When X fails a read, Xquik answers 502 `x_api_unavailable` with `X-Xquik-Cause` & `Retry-After`. Retry after that many seconds.
- `429`: Too many requests right now. Each user gets 500 reads a second. Each minute allows 120 writes & 60 deletes. `x_api_rate_limited` means X limits this read for now. Neither answer costs anything. Wait for the seconds in `Retry-After`, then retry.
- `502`: Dependency unavailable, unauthorized, or limited. Default v1 uses 502. Best-practice responses use 424 for transparent dependency failures. Search answers 424 `search_unavailable` when X fails the query itself, or when a filtered search goes far back without a match. The message says how far back the search looked. "X can't run this search" appears only when it's true. Searches X can't run fail at once, with the fix. When X fails a read, Xquik answers 502 `x_api_unavailable` with `X-Xquik-Cause` & `Retry-After`. Retry after that many seconds.
- `503`: Retry x_api_unavailable after Retry-After. With X-Xquik-Busy, retry until your deadline. Overload is announced with 503, `Retry-After` & a reason.

## Changes

- **2026-11-03** `a3dc7df62c97`: 1 info
  - endpoint added
- **2026-11-03** `0d920ffe4ae3`: 1 breaking
  - api path removed without deprecation
- **2026-11-03** `a656332daca1`: 1 info
  - endpoint added
- **2026-11-03** `48d99deede96`: 1 breaking
  - api path removed without deprecation
- **2026-11-03** `5448689d3b86`: 1 info
  - endpoint added

[Operation history](https://skmtc.dev/xquik-dev/apis/xquik-api/changes/x/users/:id/shadowban/get.md)

---

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