> ## 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 list memberships API: lists a user is on

> Get the public Twitter or X Lists that include an account. Each List has its name, description, member and follower counts & owner profile. 1 credit per List.

<Panel>
  <Tabs defaultTabIndex={0} sync={false}>
    <Tab title="200" id="response-x-user-list-memberships-200">
      ```json theme={null}
      {
        "lists": [],
        "has_next_page": false,
        "next_cursor": ""
      }
      ```
    </Tab>

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

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

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

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

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

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

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

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

    <Tab title="503" id="response-x-user-list-memberships-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>
  Requested result counts are upper bounds for paid authenticated calls. When remaining credits cannot cover the full page, Xquik returns fewer results. If zero paid results are affordable, it returns `402 insufficient_credits`.
</Note>

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

<CodeGroup>
  ```bash cURL theme={null}
  curl https://xquik.com/api/v1/x/users/verge/list-memberships \
    -H "x-api-key: xq_your_api_key_here" | jq
  ```

  ```javascript Node.js theme={null}
  const username = "verge";
  const response = await fetch(`https://xquik.com/api/v1/x/users/${username}/list-memberships`, {
    headers: { "x-api-key": "xq_your_api_key_here" },
  });
  const data = await response.json();
  if (!response.ok) throw new Error(JSON.stringify(data));
  const nextCursor = data.has_next_page ? data.next_cursor : null;
  const listRows = data.lists.map((list) => ({
    profile_username: username,
    list_id: list.id,
    list_name: list.name,
    member_count: list.memberCount ?? null,
    follower_count: list.subscriberCount ?? null,
    owner_username: list.owner?.username ?? null,
    list_url: list.url ?? null,
    next_cursor: nextCursor,
  }));
  ```

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

  username = "verge"
  response = requests.get(
      f"https://xquik.com/api/v1/x/users/{username}/list-memberships",
      headers={"x-api-key": "xq_your_api_key_here"},
  )
  data = response.json()
  if not response.ok:
      raise RuntimeError(data)
  next_cursor = data["next_cursor"] if data["has_next_page"] else None
  list_rows = [
      {
          "profile_username": username,
          "list_id": item["id"],
          "list_name": item["name"],
          "member_count": item.get("memberCount"),
          "follower_count": item.get("subscriberCount"),
          "owner_username": (item.get("owner") or {}).get("username"),
          "list_url": item.get("url"),
          "next_cursor": next_cursor,
      }
      for item in data["lists"]
  ]
  ```
</CodeGroup>

The Node.js and Python snippets build 1 row per List. Store `listRows` or
`list_rows` with `nextCursor` or `next_cursor` before requesting the next page.

## Read the Lists that include an account

Use `GET /x/users/{id}/list-memberships` to read the public Lists that include
1 account. They match the profile's List memberships page on X.

Each List carries its `owner` profile, so you can see who listed the account.
Compare `memberCount` and `subscriberCount` to find the Lists with reach. Store
each List `id`, since a List name can change.

A private List stays out of every answer. An empty `lists` array with
`has_next_page: false` means no more public Lists include the account. It costs
nothing. Use [User lists](/api-reference/x/user-lists) for the Lists the
account created.

## Path parameters

<ParamField path="id" type="string" required>
  User ID, username with or without `@`, or URL-encoded profile URL, such as
  `x.com/verge`. See [path IDs](/api-reference/overview#path-ids).
</ParamField>

## Query parameters

<ParamField query="cursor" type="string">
  Pagination cursor. Pass the `next_cursor` value from the previous response to fetch the next page.
</ParamField>

<ParamField query="pageSize" type="integer">
  Lists per page. Range: `1-100`. Defaults to `20`. Aliases: `limit`, `count`, `max_results`, `maxItems`, `max_items` & `per_page`.
</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="lists" type="object[]">
  Public Lists that include the account.
  **List object fields.**

  <ResponseField name="id" type="string">
    Numeric List ID.
  </ResponseField>

  <ResponseField name="name" type="string">
    List name.
  </ResponseField>

  <ResponseField name="description" type="string">
    List description. Empty when the owner wrote none.
  </ResponseField>

  <ResponseField name="memberCount" type="number">
    Accounts on the List.
  </ResponseField>

  <ResponseField name="subscriberCount" type="number">
    Accounts that follow the List.
  </ResponseField>

  <ResponseField name="owner" type="object">
    Public profile of the account that owns the List, with the fields of [Get
    User](/api-reference/x/twitter-profile-lookup).
  </ResponseField>

  <ResponseField name="url" type="string">
    List page on x.com.
  </ResponseField>

  <ResponseField name="createdAt" type="string">
    When the owner made the List (ISO 8601).
  </ResponseField>

  <ResponseField name="bannerUrl" type="string">
    URL of the banner the owner uploaded. Omitted when the owner uploaded none.
  </ResponseField>

  <ResponseField name="customBanner" type="object">
    Banner the owner uploaded: `url`, `width`, `height`, `salientRect`, `mediaId`, `mediaKey` &
    dominant colors in `palette`. Omitted when there is none.
  </ResponseField>

  <ResponseField name="defaultBanner" type="object">
    Banner X shows when the owner uploaded none: `url`, `width`, `height` & `salientRect`. X picks it
    per reading account, so 2 calls can return different ones.
  </ResponseField>

  <ResponseField name="facepileUrls" type="string[]">
    Avatar URLs of a few List members, which X may pick per request.
  </ResponseField>

  <ResponseField name="membersContext" type="string">
    Member count as X words it, such as `35 members`.
  </ResponseField>
</ResponseField>

<ResponseField name="has_next_page" type="boolean">Whether more results are available.</ResponseField>
<ResponseField name="next_cursor" type="string">Cursor for the next page.</ResponseField>

```json theme={null}
{
  "lists": [
    {
      "id": "1284239399492833280",
      "name": "#Mars2020 Science & Tech",
      "description": "Official accounts on the Perseverance Mars rover mission.",
      "memberCount": 35,
      "subscriberCount": 76,
      "owner": {
        "id": "1232783237623119872",
        "username": "NASAPersevere",
        "name": "NASA's Perseverance Mars Rover",
        "followers": 2887286,
        "verified": true
      },
      "url": "https://x.com/i/lists/1284239399492833280",
      "createdAt": "2020-07-17T21:31:47.000Z",
      "membersContext": "35 members"
    }
  ],
  "has_next_page": true,
  "next_cursor": "DAAHCgABHTwHK3H..."
}
```

### 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."
}
```

The user ID is empty or invalid.

### 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" }
```

### 402 Payment required

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

### 403 Protected account

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

The account is protected, so X shows its Lists to no one else. The request costs nothing.

### 404 User not found

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

### 502 X API unavailable

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

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

### 503 Service busy

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

Xquik is busy. Wait for `Retry-After`, then retry.

### 429 Rate limit exceeded

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

The Xquik tier limit blocked the request.
Use `Retry-After` when present. Otherwise, use the JSON `retryAfter` field.

### 424 Dependency failed

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

The opt-in normalized contract returns 424 when the read service fails.
Send `xquik-api-contract: 2026-04-29` to opt in. Default v1 returns 502.

## Twitter List memberships questions

### How do I see which Lists a Twitter account is on?

Call `GET /x/users/{id}/list-memberships` with the user ID, username, or profile
URL. Each result is a public List that includes the account.

### How much does it cost?

Each returned List costs 1 credit. An empty page costs nothing. Lower
`pageSize` to return fewer Lists.

### Does it return private Lists?

No. It returns only public Lists. Private Lists stay out of every answer.

### How do I get the Lists an account created?

Use [User lists](/api-reference/x/user-lists). It returns the public Lists the
account created.

### Does this replace X's official API?

No. This page documents Xquik, an independent third-party service.
It does not document X's official API.

<Note>
  **Next steps.** [List members](/api-reference/x/list-members) reads who is on a List, and [List tweets](/api-reference/x/list-tweets) reads its timeline.
</Note>

<div className="related-api-links">
  <Accordion title="Related follower, list & community APIs" icon="link">
    * Profiles: [Search users](/api-reference/x/search-users) · [Search autocomplete](/api-reference/x/search-autocomplete) · [Get user](/api-reference/x/twitter-profile-lookup) · [Batch users](/api-reference/x/batch-users)
    * Followers: [Followers](/api-reference/x/followers) · [Following](/api-reference/x/following) · [Follower IDs](/api-reference/x/follower-ids) · [Following IDs](/api-reference/x/following-ids) · [Creator subscriptions](/api-reference/x/user-subscriptions) · [Affiliates](/api-reference/x/user-affiliates) · [Similar accounts](/api-reference/x/user-similar) · [Verified followers](/api-reference/x/verified-followers) · [Followers you know](/api-reference/x/followers-you-know) · [Check follower](/api-reference/x/check-follower)
    * Lists: [Search lists](/api-reference/x/search-lists) · [User lists](/api-reference/x/user-lists) · [List memberships](/api-reference/x/user-list-memberships) · [List members](/api-reference/x/list-members) · [List followers](/api-reference/x/list-followers)
    * Communities: [Find](/api-reference/x/community-find) · [Popular](/api-reference/x/community-popular) · [Topics](/api-reference/x/community-topics) · [Suggested](/api-reference/x/community-suggested) · [Details](/api-reference/x/community-info) · [Members](/api-reference/x/community-members) · [Moderators](/api-reference/x/community-moderators) · [Timeline](/api-reference/x/community-tweets) · [Media](/api-reference/x/community-media) · [Keyword search](/api-reference/x/community-search)
  </Accordion>
</div>


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