Skip to main content
GET
Twitter followers API, profile export & cursors
1 credit per result returned · All plans from $0.00012/credit · Supports guest paid reads
Get followers returns follower profiles for one X account by username or numeric user ID. The endpoint is GET /api/v1/x/users/{id}/followers.
Omit mode for automatic maximum coverage. Xquik combines available views within a short request window. It keeps the existing response shape. Pass next_cursor back unchanged as cursor. Keep the same endpoint, target, query, and filters.
Existing unprefixed cursors keep their legacy behavior. after, limit, and pageSize aliases also keep working. Billing still counts only returned rows. Use mode=standard only to force legacy single-view pagination. A page can be empty or underfilled. Continue while has_next_page is true. Stop only after the response reports has_next_page=false. First-page requests do not support Idempotency-Key retries. Repeating a cursorless request starts a separate extraction. Results returned by that extraction incur their normal charges. Save each response before requesting its next page. You cannot replay earlier or terminal responses after their cursors become unavailable. If automatic coverage is busy, an initial request returns a standard data page. Live coverage cursors remain atomic. Concurrent use returns 409 coverage_cursor_unavailable with exact Retry-After seconds. Wait, then retry the same cursor once. Repeated busy responses never authorize restarting with another cursor. Finished, expired, superseded, or identity-mismatched cursors return 410 coverage_cursor_gone. The response omits Retry-After. Restart without a cursor. Keep received results. Deduplicate restarted results by id. Malformed cursors return 400 invalid_coverage_cursor. Restart without them.
The Node.js and Python snippets write JSON Lines import rows, not raw follower pages. Store each mapped row and the latest next_cursor in your sync job. It can then resume from the last completed page.

Direct follower handoff

Use GET /api/v1/x/users/{id}/followers when a CRM, warehouse, audience, or agent workflow needs follower rows for one profile now. The examples above write JSON Lines rows with source_user_id_or_username, x_user_id, x_username, display_name, profile enrichment, segmentation fields, page_index, page_cursor, next_cursor, and has_next_page for imports or upserts. Use follower_explorer when you need an estimated job, saved extraction, or CSV, JSON, or XLSX file export. Followers come newest first. x.com puts some promoted followers first; Xquik doesn’t, so the first rows can differ from x.com’s list.

Choose live API or saved export

Use this endpoint for current JSON pages when an app, queue, or agent can store next_cursor and process users[] immediately. Use follower_explorer when the job needs a cost estimate, reusable extraction ID, stored result pages, or CSV, JSON, or XLSX files after completion.

Live page

Call GET /x/users/{id}/followers with pageSize and cursor for low-latency imports, enrichment, queues, or agent handoffs.

Saved export

Run follower_explorer when operators need estimates, job status, paginated saved rows, or file downloads.

Follower rows

Store users[] as the follower profile rows returned on this page.

Stable upserts

Store users[].id as x_user_id for CRM, warehouse, audience, and agent deduplication.

Readable labels

Store users[].username and users[].name for handles, labels, enrichment, and deduplication.

Profile enrichment

Store users[].description, location, and url when returned. The API omits empty profile fields.

Segmentation inputs

Store users[].followers, users[].following, verified, and verifiedType for filters and scoring.

Profile media

Store users[].profilePicture and coverPicture for enrichment, review queues, or profile previews.

Next page

Store has_next_page and next_cursor, then pass next_cursor back as cursor only when has_next_page is true.

Credit-limited pages

Use users.length, not the requested pageSize, for row counts and budget checks. Low balances can return fewer rows.
Automatic pageSize accepts 20 to 300. Standard mode accepts 20 to 200. Paid calls can return fewer rows. users.length is the billable row count. Zero affordable results return 402 insufficient_credits. For high-volume follower pulls, deduplicate profiles by id. Continue through empty pages while the cursor advances. Stop with a partial-result status when next_cursor is missing or repeats.

Build a Twitter follower tracker

Store complete follower snapshots with the source profile and collection time. Compare snapshots by numeric user ID. Classify IDs that appear only in the latest snapshot as newly observed followers. Classify IDs missing from the latest complete snapshot as removed followers. Do not compare partial exports. Keep username, profile name, verification state, follower counts, and profile image beside each ID. Reviewers read those fields. Compare on the numeric ID, because usernames can change. Save every cursor page before marking a snapshot complete. Record the final row count and completion time. A failed or credit-limited run should remain partial.

Which follower endpoint?

  • Use GET /api/v1/x/users/{id}/followers for one account’s live follower page.
  • Use follower_explorer when you need a saved job, CSV, JSON, or XLSX export.
  • Use GET /api/v1/x/users/{id}/following for accounts the user follows.
  • Use GET /api/v1/x/users/{id}/verified-followers when you only need verified followers.

Path parameters

string
required
User ID, username with or without @, or URL-encoded profile URL, such as x.com/nasa. See path IDs.

Query parameters

string
Pass next_cursor back unchanged. New Xquik cursors resume automatic coverage. Existing unprefixed cursors keep legacy behavior.
string
Optional compatibility override. Omit it for automatic maximum coverage. Use standard for legacy single-view pagination. Use coverage for a one-shot diagnostic response without cursor pagination.
string
Legacy cursor alias for cursor. When both are present, cursor wins.
number
Automatic pages accept 20 through 300. Standard pages accept 20 through 200. The default is 200. Credits can reduce the returned row count.
number
With mode=coverage, set a one-shot cap from 1 through 10000. Otherwise, this is a legacy page size alias. pageSize wins.
boolean
default:"false"
Set true to add each row’s full profile, as GET /x/users/{id} returns it. Pages take several seconds longer. The price per row stays the same. Later pages can leave it out, & next_cursor still works.

User result filters

These filters apply before billing. Selective filters can return fewer rows.
integer
Require this minimum follower count. Filtering happens before billing.
integer
Allow this maximum follower count. Missing counts pass this filter.
integer
Require this minimum following count.
integer
Allow this maximum following count. Missing counts pass this filter.
integer
Require this minimum post count.
integer
Allow this maximum post count. Missing counts pass this filter.
integer
Require this minimum account age in days.
boolean
When true, only return verified profiles.
string
Match the exact verification type.
boolean
When true, require a profile website.
boolean
When true, require a profile location.
string
Require every comma-separated or line-separated bio term.
string
Require this text in the profile location.
string
Require this text in the username.

Headers

string
Full account key. Sessions and OAuth also work.
string
Bearer xq_your_guest_key_here for paid_reads.

Response

200 OK

With enrichProfiles=true, each row carries the full profile. The x-xquik-profile-enrichment header then counts the rows that have it, as in enriched=180; requested=200. A row without it keeps its list fields.
object[]
Array of follower profiles. User object fields.
string
X user ID.
string
X username.
string
Display name.
string
Profile bio. Omitted if empty.
number
Follower count.
number
Following count.
boolean
Whether the user is verified.
string
Profile picture URL.
string
Profile location. Omitted if empty.
object | null
Country or region X shows for the account, with value, level & observedAt. X infers it from account access. It states no nationality or exact location. null when X shows none. Present with enrichProfiles=true, unless X withholds it.
boolean
true when X withheld accountBasedIn from this row. Retry later to get it. Omitted otherwise.
string
ISO 8601 account creation timestamp.
number
Total number of tweets posted. Omitted if unavailable.
string
Cover or banner image URL. Omitted if unavailable.
number
Total number of media tweets posted. Omitted if unavailable.
string
Website URL from profile. Omitted if empty.
number
Total number of tweets liked. Omitted if unavailable.
boolean
Whether the user has custom timelines. Omitted if unavailable.
boolean
Whether the user is an X translator. Omitted if unavailable.
string[]
Country codes where the account is withheld. Omitted if empty.
boolean
Whether X flags the account as possibly sensitive. Omitted if unavailable.
string[]
IDs of pinned tweets. Omitted if none.
boolean
Whether X marks the account as automated. Omitted if unavailable.
string
Username of the account operator if automated. Omitted if not automated.
boolean
Whether the account is unavailable. Omitted if available.
string
Reason the account is unavailable. Omitted if available.
string
Verification type (for example Business, Government). Omitted if not verified or standard blue check.
object
Structured profile bio with entity annotations. Omitted if unavailable.
boolean
Whether the account has X Premium verification. Omitted if unavailable.
boolean
Normalized verification status. Omitted if unavailable.
string
Profile banner URL. Omitted if unavailable.
boolean
Whether the account protects its posts. Omitted if unavailable.
string
Role within the requested community context. Omitted outside community results.
boolean
Whether more results are available.
string
Cursor for the next page.

400 Invalid user ID

404 User not found

401 Unauthenticated

Anonymous requests get WWW-Authenticate: Bearer and a guest wallet checkout action. This is not a Payment challenge.

402 Payment required

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

502 X API unavailable

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

429 Rate limit exceeded

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

424 Dependency failed

The normalized v1 response contract can return 424 when the read service is unavailable.
Related. Follower Export CRM Workflow for saved CSV, JSON, or XLSX files for imports or upserts, Following, Verified Followers, and Followers You Know.