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

# X community moderators API & admin profiles

> Retrieve X community moderators with usernames, bios, verification state, profile media, and follower and following counts. Costs 1 credit per result.

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

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

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

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

    <Tab title="404" id="response-x-community-moderators-404">
      ```json theme={null}
      {
        "error": "not_found",
        "message": "Resource not found."
      }
      ```
    </Tab>

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

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

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

    <Tab title="503" id="response-x-community-moderators-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>

Export moderator profiles for one X community. Store stable user IDs for
access reviews. Analyze visible profiles or monitor the moderator roster.

## X community moderator API questions

### What does an X community moderator do?

X's moderator playbook separates creators, admins, moderators, and members.
The creator is also the first admin. Admins can change settings and manage
moderator roles. Moderators review reported Community posts, manage members,
and enforce Community rules.

This route only reads profiles exposed by the visible moderator roster. It
cannot assign roles, remove members, return reports, or expose private actions.
Read X's official
[Communities Moderator Playbook](https://help.x.com/en/using-x/communities-moderator-playbook)
for current role responsibilities.

Store `communityRole` only when the response supplies it. Never infer admin
status from verification, follower counts, biographies, or profile images.

### How do I find X community moderators?

Open the Community page when one manual lookup is enough. X says direct
Community URLs expose visible member and moderator lists. X documents that
public interface in its official
[Communities guide](https://help.x.com/en/using-x/communities).

Use this API for repeatable collection, pagination, exports, and snapshot
review. Start with the numeric Community ID. Store that ID with every
moderator ID. A username can change and cannot identify the source Community.

Request another page only when `has_next_page` is exactly `true`. Pass the
returned cursor string back without editing it. Mark the roster complete only
after `has_next_page` is `false`.

### Which tools support X community moderation?

Choose each endpoint by the record it returns:

* Retrieve visible moderator profiles with this route.
* Retrieve rules and counts with [Community Info](/api-reference/x/community-info).
* Retrieve recent posts with [Community Tweets](/api-reference/x/community-tweets).
* Search Community posts with [Community Search](/api-reference/x/community-search).
* Review reports or change roles in X's own moderator interface.

The moderator API does not return enforcement logs or reported-post queues.
Keep those workflows separate from public profile exports. A profile
row alone does not justify a moderation decision.

### Can AI automate community moderation?

Do not automate enforcement from a moderator profile snapshot. Verification,
follower counts, biographies, and avatars do not prove behavior or permissions.

Use automation to normalize rows, compare complete snapshots, and queue human
review. An AI model may summarize an approved public change set. Keep private
review notes outside the exported profile record. Require a human decision
before any account action.

<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
</Callout>

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

  ```javascript Node.js theme={null}
  const communityId = "1234567890";
  const response = await fetch(`https://xquik.com/api/v1/x/communities/${communityId}/moderators`, {
    headers: { "x-api-key": "xq_your_api_key_here" },
  });
  const data = await response.json();
  const nextCursor = data.has_next_page ? data.next_cursor : null;
  const moderatorRows = data.users.map((user) => ({
    community_id: communityId,
    moderator_id: user.id,
    username: user.username,
    display_name: user.name,
    bio: user.description ?? null,
    follower_count: user.followers ?? null,
    verified: user.verified ?? false,
    profile_image_url: user.profilePicture ?? null,
    page_size: data.users.length,
    has_next_page: data.has_next_page,
    next_cursor: nextCursor,
  }));

  process.stdout.write(JSON.stringify(moderatorRows, null, 2));
  ```

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

  community_id = "1234567890"
  response = requests.get(
      f"https://xquik.com/api/v1/x/communities/{community_id}/moderators",
      headers={"x-api-key": "xq_your_api_key_here"},
  )
  data = response.json()
  next_cursor = data["next_cursor"] if data["has_next_page"] else None
  moderator_rows = [
      {
          "community_id": community_id,
          "moderator_id": user["id"],
          "username": user["username"],
          "display_name": user["name"],
          "bio": user.get("description"),
          "follower_count": user.get("followers"),
          "verified": user.get("verified", False),
          "profile_image_url": user.get("profilePicture"),
          "page_size": len(data["users"]),
          "has_next_page": data["has_next_page"],
          "next_cursor": next_cursor,
      }
      for user in data["users"]
  ]

  print(json.dumps(moderator_rows, indent=2))
  ```
</CodeGroup>

Use `GET /x/communities/{id}/moderators` for moderator audits,
trust and safety queues, or CRM enrichment. It creates one row per
community moderator. Store `community_id`, `moderator_id`, `username`,
`display_name`, `bio`, `follower_count`, `verified`, `profile_image_url`, and
`next_cursor`. Store `page_size` and `has_next_page` with the checkpoint when
you paginate moderator audits or saved review queues.

## Direct moderator handoff

Use the first page with no `cursor`. Request the next page only when
`has_next_page` is exactly `true`. Pass `next_cursor` back as `cursor` without
modification. Requested result counts are upper bounds. Use `page_size` to
record the returned moderator count for each page.

<CardGroup cols={2}>
  <Card title="Moderator rows" icon="shield-check">
    Store one row per moderator with community ID, user ID, username, profile
    fields, verification, and follower count.
  </Card>

  <Card title="Next page" icon="arrow-right">
    Store each page and its pagination fields before requesting another page.
  </Card>

  <Card title="Default page" icon="rows-3">
    Expect up to the default page size per call. Low credits can return fewer
    rows.
  </Card>

  <Card title="Saved export" icon="file-spreadsheet">
    Use `community_moderator_explorer` when the workflow needs an extraction
    job or CSV, JSON, or XLSX output.
  </Card>
</CardGroup>

## Build a complete moderator roster

Save each response page as a checkpoint. Save every profile row
before storing its cursor. Resume with the exact saved cursor after an
interruption.

Create a local `export_manifest_id` for each collection run. Store it with
`community_id`, `moderator_id`, page number, cursor, and collection time. The key
keeps each collection run separate.

Label credit-bounded, failed, and interrupted runs as incomplete moderator
exports. Do not compare a partial roster with a completed baseline. A partial
comparison can falsely report removed moderators.

Deduplicate resumed pages with `community_id` and `moderator_id`. Keep the
latest username as a label. Use numeric user IDs to join collection runs.

Store these completion fields with the export manifest:

* Requested Community ID.
* Returned page count and profile count.
* First and final cursor values.
* Final `has_next_page` value.
* Collection start and completion times.
* Complete, partial, or failed status.

These fields show whether the roster finished.

## Audit a community moderation team

Use this route when the role matters more than general membership. Every
returned profile represents a moderator visible for the selected community.
Keep the community ID and collection time with each profile.

Review moderator rows for:

* User ID, username, and profile name.
* Verification state and public biography.
* Follower counts and profile image.
* Cursor position and collection time.

Compare snapshots by user ID. A changed username does not represent a new
moderator. Flag added and removed IDs for review.

Do not combine moderator rows with the full member roster without a role column. Other
tools could otherwise read ordinary members as moderators.

Both `community_id` and your local `export_manifest_id` must match. Then join
the moderator roster with [Community Info](/api-reference/x/community-info).
Keep rules, member counts, and moderator profiles in separate tables, one
per endpoint.

Store `communityRole` only when the response provides it. Never expand it into
a broader permission. An omitted role cannot prove admin, creator, or member
permissions.

## Review moderator coverage

Compare complete moderator snapshots by Community ID and user ID. Record added
and removed IDs without guessing the reason.

Use this review sequence:

1. Confirm both exports ended with `has_next_page` set to `false`.
2. Confirm both exports use the same numeric Community ID.
3. Compare stable moderator IDs, not usernames or display names.
4. Ask a reviewer to inspect added and missing IDs.
5. Store the decision outside the public profile snapshot.

Keep one row per visible moderator. The username is a label that can change.
Join on the numeric user ID.

Send unexpected changes to a human reviewer. Require human approval before
any account action.

Store each review outcome outside the public profile snapshot. Record the
reviewer, decision time, and Community ID in your own system.

Refresh a profile only when current biography or counts matter. Keep the
original moderator observation.

## Path parameters

<ParamField path="id" type="string" required>
  Community ID (numeric string).
</ParamField>

## Query parameters

<ParamField query="cursor" type="string">
  Pagination cursor from a previous response. Omit for the first page.
</ParamField>

## Which community endpoint?

<CardGroup cols={2}>
  <Card title="Community moderators" icon="shield-check">
    Use `GET /x/communities/{id}/moderators` for governance audits, moderator
    review queues, and profile enrichment.
  </Card>

  <Card title="Community members" icon="users">
    Use [`GET /x/communities/{id}/members`](/api-reference/x/community-members)
    for the broader member list.
  </Card>

  <Card title="Community info" icon="badge-info">
    Use [`GET /x/communities/{id}/info`](/api-reference/x/community-info) for
    member count, moderator count, rules, and join policy.
  </Card>

  <Card title="Community tweets" icon="message-square-text">
    Use [`GET /x/communities/{id}/tweets`](/api-reference/x/community-tweets)
    for posts inside one community.
  </Card>

  <Card title="Community search" icon="search">
    Use [`GET /x/communities/tweets`](/api-reference/x/community-search)
    for keyword search across community tweets.
  </Card>

  <Card title="Saved exports" icon="file-spreadsheet">
    Use [`Create extraction`](/api-reference/extractions/create) with
    `community_moderator_explorer`, `community_extractor`, or
    `community_post_extractor` for queued file exports.
  </Card>
</CardGroup>

### User result filters

These filters apply before billing. Selective filters can return fewer rows.

<ParamField query="minFollowers" type="integer">
  Require this minimum follower count. Filtering happens before billing.
</ParamField>

<ParamField query="maxFollowers" type="integer">
  Allow this maximum follower count. Missing counts pass this filter.
</ParamField>

<ParamField query="minFollowing" type="integer">
  Require this minimum following count.
</ParamField>

<ParamField query="maxFollowing" type="integer">
  Allow this maximum following count. Missing counts pass this filter.
</ParamField>

<ParamField query="minStatuses" type="integer">
  Require this minimum post count.
</ParamField>

<ParamField query="maxStatuses" type="integer">
  Allow this maximum post count. Missing counts pass this filter.
</ParamField>

<ParamField query="minAccountAgeDays" type="integer">
  Require this minimum account age in days.
</ParamField>

<ParamField query="verifiedOnly" type="boolean">
  When `true`, only return verified profiles.
</ParamField>

<ParamField query="verifiedType" type="string">
  Match the exact verification type.
</ParamField>

<ParamField query="hasWebsite" type="boolean">
  When `true`, require a profile website.
</ParamField>

<ParamField query="hasLocation" type="boolean">
  When `true`, require a profile location.
</ParamField>

<ParamField query="bioContains" type="string">
  Require every comma-separated or line-separated bio term.
</ParamField>

<ParamField query="locationContains" type="string">
  Require this text in the profile location.
</ParamField>

<ParamField query="usernameContains" type="string">
  Require this text in the username.
</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="users" type="object[]">
  Array of community moderators.
  **User object fields.**

  <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.
  </ResponseField>

  <ResponseField name="followers" type="number">
    Reports the profile's follower count.
  </ResponseField>

  <ResponseField name="following" type="number">
    Following count.
  </ResponseField>

  <ResponseField name="verified" type="boolean">
    Verified status.
  </ResponseField>

  <ResponseField name="profilePicture" type="string">
    Profile image URL.
  </ResponseField>

  <ResponseField name="location" type="string">
    Profile location.
  </ResponseField>

  <ResponseField name="createdAt" type="string">
    Account creation date (ISO 8601).
  </ResponseField>

  <ResponseField name="statusesCount" type="number">
    Total number of tweets posted. Omitted if unavailable.
  </ResponseField>

  <ResponseField name="coverPicture" type="string">
    Cover or banner image URL. Omitted if unavailable.
  </ResponseField>

  <ResponseField name="mediaCount" type="number">
    Total number of media tweets posted. 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 X flags the account as possibly sensitive. Omitted if unavailable.
  </ResponseField>

  <ResponseField name="pinnedTweetIds" type="string[]">
    Lists pinned Tweet IDs. Omitted if none.
  </ResponseField>

  <ResponseField name="isAutomated" type="boolean">
    Whether X marks the account 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 (for example `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>

  <ResponseField name="isBlueVerified" type="boolean">
    Whether the account has X Premium verification. Omitted if unavailable.
  </ResponseField>

  <ResponseField name="isVerified" type="boolean">
    Normalized verification status. Omitted if unavailable.
  </ResponseField>

  <ResponseField name="profileBannerUrl" type="string">
    Profile banner URL. Omitted if unavailable.
  </ResponseField>

  <ResponseField name="protected" type="boolean">
    Whether the account protects its posts. Omitted if unavailable.
  </ResponseField>

  <ResponseField name="communityRole" type="string">
    Role within the requested community context. Omitted outside community results.
  </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. Pass as the `cursor` query parameter.</ResponseField>

```json theme={null}
{
  "users": [
    {
      "id": "987654321",
      "username": "moduser",
      "name": "Moderator",
      "followers": 5000,
      "verified": true
    }
  ],
  "has_next_page": false,
  "next_cursor": ""
}
```

### 400 Invalid community ID

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

The community 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" }
```

Missing or invalid API key.

### 402 Payment required

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

### 404 Community not found

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

Xquik could not resolve the community. Check the community ID.

### 502 X API unavailable

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

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

### 429 Rate limit exceeded

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

You exceeded your tier rate limit. Wait for the `Retry-After` header before retrying.

### 424 Dependency failed

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

Send `xquik-api-contract: 2026-04-29` to opt in to HTTP 424. Default v1 returns
HTTP 502 with `x_api_unavailable`.

<Note>
  **Next steps.** [Community Members](/api-reference/x/community-members) for the full member list, or [Community Info](/api-reference/x/community-info) for community details.
</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.