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

> Look up an X user profile by username with follower counts, bio, and verification status

<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 call** · [All plans](https://xquik.com/#pricing) from \$0.00012/credit
</Callout>

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

  ```javascript Node.js theme={null}
  const username = "xquikcom";
  const response = await fetch(`https://xquik.com/api/v1/x/users/${username}`, {
    headers: { "x-api-key": "xq_YOUR_KEY_HERE" },
  });
  const data = await response.json();
  const profileRow = {
    user_id: data.id,
    username: data.username,
    display_name: data.name,
    bio: data.description ?? null,
    follower_count: data.followers ?? null,
    following_count: data.following ?? null,
    verified: data.verified ?? false,
    verified_type: data.verifiedType ?? null,
    profile_url: data.url ?? null,
    profile_image_url: data.profilePicture ?? null,
    created_at: data.createdAt ?? null,
    unavailable_reason: data.unavailableReason ?? null,
  };

  process.stdout.write(`${JSON.stringify(profileRow)}\n`);
  ```

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

  response = requests.get(
      "https://xquik.com/api/v1/x/users/xquikcom",
      headers={"x-api-key": "xq_YOUR_KEY_HERE"},
  )
  data = response.json()
  profile_row = {
      "user_id": data["id"],
      "username": data["username"],
      "display_name": data["name"],
      "bio": data.get("description"),
      "follower_count": data.get("followers"),
      "following_count": data.get("following"),
      "verified": data.get("verified", False),
      "verified_type": data.get("verifiedType"),
      "profile_url": data.get("url"),
      "profile_image_url": data.get("profilePicture"),
      "created_at": data.get("createdAt"),
      "unavailable_reason": data.get("unavailableReason"),
  }
  print(json.dumps(profile_row))
  ```

  ```go Go theme={null}
  package main

  import (
    "encoding/json"
    "io"
    "log"
    "net/http"
    "os"
  )

  func main() {
    username := "xquikcom"
    req, err := http.NewRequest("GET", "https://xquik.com/api/v1/x/users/"+username, nil)
    if err != nil {
      log.Fatal(err)
    }
    req.Header.Set("x-api-key", "xq_YOUR_KEY_HERE")

    resp, err := http.DefaultClient.Do(req)
    if err != nil {
      log.Fatal(err)
    }
    defer resp.Body.Close()

    body, err := io.ReadAll(resp.Body)
    if err != nil {
      log.Fatal(err)
    }

    var user map[string]any
    if err := json.Unmarshal(body, &user); err != nil {
      log.Fatal(err)
    }

    row := map[string]any{
      "user_id":            user["id"],
      "username":           user["username"],
      "display_name":       user["name"],
      "bio":                user["description"],
      "follower_count":     user["followers"],
      "following_count":    user["following"],
      "verified":           user["verified"],
      "verified_type":      user["verifiedType"],
      "profile_url":        user["url"],
      "profile_image_url":  user["profilePicture"],
      "created_at":         user["createdAt"],
      "unavailable_reason": user["unavailableReason"],
    }
    if err := json.NewEncoder(os.Stdout).Encode(row); err != nil {
      log.Fatal(err)
    }
  }
  ```
</CodeGroup>

Use `GET /x/users/{id}` when a workflow needs one durable profile row for CRM
enrichment, lead scoring, account monitoring, or support triage. Store
`user_id`, `username`, `display_name`, `bio`, `follower_count`,
`following_count`, `verified`, `verified_type`, `profile_url`,
`profile_image_url`, `created_at`, and `unavailable_reason` instead of logging
the full lookup response.

<CardGroup cols={2}>
  <Card title="Profile row" icon="user-round">
    Store `id` as `user_id` plus `username`, `name`, `description`, `followers`,
    `following`, `verified`, and `verifiedType`.
  </Card>

  <Card title="Lookup key" icon="key-round">
    Use a numeric user ID for durable joins. Use username lookup when the
    workflow starts from a handle.
  </Card>

  <Card title="Availability" icon="triangle-alert">
    Store `unavailable` and `unavailableReason` when returned, so retries,
    support triage, and CRM syncs distinguish missing accounts from unavailable
    profiles.
  </Card>

  <Card title="Next action" icon="route">
    Use the returned `id` for followers, following, timelines, media, DMs,
    follow checks, and monitor setup.
  </Card>
</CardGroup>

## Path parameters

<ParamField path="id" type="string" required>
  User ID or username (without `@`).
</ParamField>

## Which user endpoint?

<CardGroup cols={2}>
  <Card title="User profile" icon="user-round">
    Use `GET /x/users/{id}` for one profile row by username or numeric user ID.
  </Card>

  <Card title="Search users" icon="search">
    Use [`GET /x/users/search`](/api-reference/x/search-users) when the workflow
    starts from a name, keyword, or partial handle.
  </Card>

  <Card title="Profile timeline" icon="list">
    Use [`GET /x/users/{id}/tweets`](/api-reference/x/user-tweets) for posts from
    one profile.
  </Card>

  <Card title="Followers" icon="users">
    Use [`GET /x/users/{id}/followers`](/api-reference/x/followers) when the next
    step needs audience rows.
  </Card>

  <Card title="Follow check" icon="user-check">
    Use [`GET /x/followers/check`](/api-reference/x/check-follower) when the
    workflow only needs one source-target relationship.
  </Card>

  <Card title="Saved exports" icon="file-spreadsheet">
    Use [`Create extraction`](/api-reference/extractions/create).
    Create saved CSV/JSON/XLSX jobs. Export followers, following, timelines,
    media, or search.
  </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="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 (lists). Omitted if unavailable.</ResponseField>
    <ResponseField name="isTranslator" type="boolean">Whether the user is a Twitter 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 (suspended, deactivated). 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>

    ```json theme={null}
    {
      "id": "987654321",
      "username": "xquikcom",
      "name": "Xquik",
      "description": "X real-time data platform",
      "followers": 10000,
      "following": 500,
      "verified": true,
      "profilePicture": "https://pbs.twimg.com/profile_images/xquik/photo.jpg",
      "coverPicture": "https://pbs.twimg.com/profile_banners/xquik/cover.jpg",
      "location": "San Francisco",
      "url": "https://xquik.com",
      "createdAt": "2020-01-15T00:00:00.000Z",
      "statusesCount": 5000,
      "mediaCount": 120,
      "favouritesCount": 430,
      "canDm": true,
      "isAutomated": false,
      "possiblySensitive": false,
      "hasCustomTimelines": false,
      "pinnedTweetIds": ["1234567890"]
    }
    ```
  </Tab>

  <Tab title="400 Invalid username">
    ```json theme={null}
    { "error": "invalid_username" }
    ```

    The provided username is empty or not a valid format.
  </Tab>

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

    Missing or invalid API key. Check the `x-api-key` header value.
  </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`.
    For [MPP](/mpp/overview) requests without a valid payment credential, 402 returns a `WWW-Authenticate: Payment` challenge header instead.
  </Tab>

  <Tab title="404 User not found">
    ```json theme={null}
    { "error": "user_not_found" }
    ```

    The X user does not exist. Check the username.
  </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>
  **Next steps:** [Check Follower](/api-reference/x/check-follower) to verify follow relationships, or [Search Tweets](/api-reference/x/search-tweets) to find tweets from this user.
</Note>
