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

# Check an X account for a shadowban

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

## Request

- Base URL: `https://xquik.com`
- 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. It also says if the account is active, protected or suspended.

Each check answers pass, fail or unknown, with its reason & the posts, suggestions or replies it read. The reply check answers pass or unknown, since X ranks replies for each viewer. A protected account gets the suggestion check only, 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 or reply threads. 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.
  - `checks` object, required: The 4 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.

## 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.
- `500`: Unexpected error.
- `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.
- `default`: Unexpected error.

## Changes

- **2026-11-02** `20d4bcaa8f4e`: 1 breaking
  - api path removed without deprecation
- **2026-11-02** `48f2012c62b3`: 1 info
  - endpoint added
- **2026-11-01** `1863d7ef8b4d`: 1 breaking
  - api path removed without deprecation
- **2026-11-01** `20dce55324e1`: 1 info
  - endpoint added

[Operation history](https://skmtc.dev/xquik-dev/apis/xquik-api/changes/api/v1/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/db6708e077dc?raw)
