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

# Get followers you know

> Retrieve mutual X followers between the authenticated context and one target user for warm-intro, CRM, scoring, and agent workflows

<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 or ID list, Xquik returns fewer results. If zero paid results are affordable, it returns `402 insufficient_credits`.
</Note>

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

<Info>
  Get followers you know returns mutual followers between the authenticated
  context and one target X user. It is also useful as a mutual followers API,
  followers you know API, X mutual followers API, or Twitter mutual followers
  API. The canonical endpoint remains
  `GET /api/v1/x/users/{id}/followers-you-know`.
</Info>

<CodeGroup>
  ```bash First page theme={null}
  curl https://xquik.com/api/v1/x/users/44196397/followers-you-know \
    -H "x-api-key: xq_YOUR_KEY_HERE" | jq
  ```

  ```bash Next page theme={null}
  curl -G https://xquik.com/api/v1/x/users/44196397/followers-you-know \
    --data-urlencode "cursor=abc123" \
    -H "x-api-key: xq_YOUR_KEY_HERE" | jq
  ```

  ```javascript Node.js theme={null}
  const userId = "44196397";
  const response = await fetch(`https://xquik.com/api/v1/x/users/${userId}/followers-you-know`, {
    headers: { "x-api-key": "xq_YOUR_KEY_HERE" },
  });
  const data = await response.json();
  const mutualRows = data.users.map((user) => ({
    target_user_id: userId,
    x_user_id: user.id,
    username: user.username,
    display_name: user.name,
    can_dm: user.canDm ?? null,
    follower_count: user.followers ?? null,
    verified: user.verified ?? false,
    verified_type: user.verifiedType ?? null,
    profile_image_url: user.profilePicture ?? null,
  }));
  const nextCursor = data.has_next_page ? data.next_cursor : null;
  const checkpoint = { target_user_id: userId, next_cursor: nextCursor };

  for (const row of mutualRows) {
    process.stdout.write(`${JSON.stringify(row)}\n`);
  }
  process.stdout.write(`${JSON.stringify(checkpoint)}\n`);
  ```

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

  user_id = "44196397"
  response = requests.get(
      f"https://xquik.com/api/v1/x/users/{user_id}/followers-you-know",
      headers={"x-api-key": "xq_YOUR_KEY_HERE"},
  )
  data = response.json()
  mutual_rows = [
      {
          "target_user_id": user_id,
          "x_user_id": user["id"],
          "username": user["username"],
          "display_name": user["name"],
          "can_dm": user.get("canDm"),
          "follower_count": user.get("followers"),
          "verified": user.get("verified", False),
          "verified_type": user.get("verifiedType"),
          "profile_image_url": user.get("profilePicture"),
      }
      for user in data["users"]
  ]
  next_cursor = data["next_cursor"] if data["has_next_page"] else None
  checkpoint = {"target_user_id": user_id, "next_cursor": next_cursor}

  for row in mutual_rows:
      print(json.dumps(row))
  print(json.dumps(checkpoint))
  ```
</CodeGroup>

The Node.js and Python snippets shape durable mutual follower rows instead of
printing the full response page. Persist the rows with the checkpoint so a
worker can resume pagination with `next_cursor` without duplicating already
imported profiles.

## Direct mutual followers handoff

Use `GET /x/users/{id}/followers-you-know` when a sales, community, recruiting, support, CRM, or agent workflow needs one JSON page of mutual followers for a target user. The path `id` is the target numeric X user ID. The endpoint returns people who follow both the authenticated context and the target user.

<CardGroup cols={2}>
  <Card title="Mutual rows" icon="users-round">
    Store `users[]` as the mutual follower profile rows returned on this page.
  </Card>

  <Card title="Stable upserts" icon="key-round">
    Store `users[].id` as `x_user_id` for CRM, warehouse, scoring, and agent dedupe.
  </Card>

  <Card title="Warm-intro labels" icon="badge">
    Store `users[].username` and `users[].name` for handles, owner review, routing, and handoff labels.
  </Card>

  <Card title="Profile context" icon="file-text">
    Store `users[].description`, `location`, `url`, `profilePicture`, and `coverPicture` when returned.
  </Card>

  <Card title="Priority signals" icon="chart-no-axes-combined">
    Store `users[].followers`, `users[].following`, `verified`, and `verifiedType` for scoring and queue priority.
  </Card>

  <Card title="DM preflight" icon="message-square">
    Store `users[].canDm` when returned, then use the DM endpoints only after a user-approved message flow.
  </Card>

  <Card title="Next page" icon="arrow-right">
    Store `has_next_page` and `next_cursor`; pass `next_cursor` back as `cursor` only when `has_next_page` is true.
  </Card>
</CardGroup>

Direct mutual followers cost 1 credit per user returned. Low credit balances can return fewer users than a full page; zero affordable results return `402 insufficient_credits`. For MPP callers, this endpoint is billed as a session at USD 0.00015 per user returned.

## Path parameters

<ParamField path="id" type="string" required>
  Target X user ID as a numeric string. Use [Get user](/api-reference/x/get-user)
  first if you only have a username.
</ParamField>

## Query parameters

<ParamField query="cursor" type="string">
  Pagination cursor from `next_cursor` in a previous response. Omit for the
  first page. Pass a cursor only when `has_next_page` is true.
</ParamField>

## Which follower graph endpoint?

<CardGroup cols={2}>
  <Card title="Mutual followers" icon="users-round">
    Use `GET /x/users/{id}/followers-you-know` for people who follow both the
    authenticated context and the target user.
  </Card>

  <Card title="All followers" icon="list-tree">
    Use [`GET /x/users/{id}/followers`](/api-reference/x/followers) for all
    followers of one target profile.
  </Card>

  <Card title="Verified followers" icon="badge-check">
    Use [`GET /x/users/{id}/verified-followers`](/api-reference/x/verified-followers)
    when you only need verified followers of the target profile.
  </Card>

  <Card title="DM handoff" icon="message-square">
    Use [`Send DM`](/api-reference/x-write/send-dm) only after your workflow has
    a user-approved outreach step.
  </Card>
</CardGroup>

## Headers

<ParamField header="x-api-key" type="string" required>
  Your API key. Session cookie authentication is also supported.
</ParamField>

## Response

<Tabs>
  <Tab title="200 OK">
    <ResponseField name="users" type="object[]">
      Array of mutual follower profiles.

      <Expandable title="user object">
        <ResponseField name="id" type="string">User ID.</ResponseField>
        <ResponseField name="username" type="string">X username.</ResponseField>
        <ResponseField name="name" type="string">Display name.</ResponseField>
        <ResponseField name="description" type="string">Profile bio. Omitted if empty.</ResponseField>
        <ResponseField name="followers" type="number">Follower count. Omitted if unavailable.</ResponseField>
        <ResponseField name="following" type="number">Following count. Omitted if unavailable.</ResponseField>
        <ResponseField name="verified" type="boolean">Whether the user is verified. Omitted if unavailable.</ResponseField>
        <ResponseField name="profilePicture" type="string">Profile picture URL. Omitted if unavailable.</ResponseField>
        <ResponseField name="location" type="string">Profile location. Omitted if empty.</ResponseField>
        <ResponseField name="createdAt" type="string">ISO 8601 account creation timestamp. Omitted if unavailable.</ResponseField>
        <ResponseField name="statusesCount" type="number">Total number of tweets posted. Omitted if unavailable.</ResponseField>
        <ResponseField name="coverPicture" type="string">Cover/banner image URL. Omitted if unavailable.</ResponseField>
        <ResponseField name="mediaCount" type="number">Total number of media tweets posted. Omitted if unavailable.</ResponseField>
        <ResponseField name="canDm" type="boolean">Whether the user accepts direct messages. Omitted if unavailable.</ResponseField>
        <ResponseField name="url" type="string">Website URL from profile. Omitted if empty.</ResponseField>
        <ResponseField name="favouritesCount" type="number">Total number of tweets liked. Omitted if unavailable.</ResponseField>
        <ResponseField name="hasCustomTimelines" type="boolean">Whether the user has custom timelines. Omitted if unavailable.</ResponseField>
        <ResponseField name="isTranslator" type="boolean">Whether the user is an X translator. Omitted if unavailable.</ResponseField>
        <ResponseField name="withheldInCountries" type="string[]">Country codes where the account is withheld. Omitted if empty.</ResponseField>
        <ResponseField name="possiblySensitive" type="boolean">Whether the account is flagged as possibly sensitive. Omitted if unavailable.</ResponseField>
        <ResponseField name="pinnedTweetIds" type="string[]">IDs of pinned tweets. Omitted if none.</ResponseField>
        <ResponseField name="isAutomated" type="boolean">Whether the account is marked as automated. Omitted if unavailable.</ResponseField>
        <ResponseField name="automatedBy" type="string">Username of the account operator if automated. Omitted if not automated.</ResponseField>
        <ResponseField name="unavailable" type="boolean">Whether the account is unavailable. Omitted if available.</ResponseField>
        <ResponseField name="unavailableReason" type="string">Reason the account is unavailable. Omitted if available.</ResponseField>
        <ResponseField name="verifiedType" type="string">Verification type (e.g. `Business`, `Government`). Omitted if not verified or standard blue check.</ResponseField>
        <ResponseField name="profile_bio" type="object">Structured profile bio with entity annotations. Omitted if unavailable.</ResponseField>
      </Expandable>
    </ResponseField>

    <ResponseField name="has_next_page" type="boolean">
      Whether more results are available.
    </ResponseField>

    <ResponseField name="next_cursor" type="string">
      Opaque cursor for the next page. Empty string when no more results.
    </ResponseField>

    ```json theme={null}
    {
      "users": [
        {
          "id": "987654321",
          "username": "xquikcom",
          "name": "Xquik",
          "followers": 10000,
          "verified": true,
          "profilePicture": "https://pbs.twimg.com/profile_images/xquik/photo.jpg"
        }
      ],
      "has_next_page": true,
      "next_cursor": "DAADDAABCgABF..."
    }
    ```
  </Tab>

  <Tab title="400 Invalid user ID">
    ```json theme={null}
    { "error": "invalid_user_id" }
    ```

    The user ID is empty or invalid.
  </Tab>

  <Tab title="401 Unauthenticated">
    ```json theme={null}
    { "error": "unauthenticated" }
    ```

    Missing or invalid API key.
  </Tab>

  <Tab title="402 Subscription required">
    ```json theme={null}
    { "error": "no_subscription" }
    ```

    No active subscription or insufficient credits. Possible error values: `no_subscription`, `subscription_inactive`, `no_credits`, `insufficient_credits`.
  </Tab>

  <Tab title="502 X API unavailable">
    ```json theme={null}
    { "error": "x_api_unavailable" }
    ```

    The read service returned an error. Retry after a short delay.
  </Tab>

  <Tab title="429 Rate Limit Exceeded">
    ```json theme={null}
    { "error": "rate_limit_exceeded", "retryAfter": 60 }
    ```

    Your tier rate limit was exceeded. Wait for the `Retry-After` header before retrying.
  </Tab>

  <Tab title="424 Dependency Failed">
    ```json theme={null}
    { "error": "x_api_unavailable" }
    ```

    The normalized v1 response contract can return 424 when the read service is unavailable.
  </Tab>
</Tabs>

<Note>
  **Related:** [Direct message workflow](/guides/direct-message-workflow) for user-approved outreach after `users[].canDm`, [Send DM](/api-reference/x-write/send-dm) to send and store `messageId`, [DM history](/api-reference/x/dm-history) to read participant-scoped context, [Get followers](/api-reference/x/followers), [Get following](/api-reference/x/following), and [Get verified followers](/api-reference/x/verified-followers).
</Note>
