SFOLN

Catalogue / Social media data

Twitter Followers Scraper (X)

sfoln/x-followers · Social media, Lead generation, Automation On request

Export the followers of any public X (Twitter) account, newest first: full profiles with bio, location, follower counts and join date, or bulk follower IDs. $0.30 per 1,000 follower profiles + $0.002 per page of 200; IDs $0.05 per 1,000 + $0.003 per page of 5,000.

About

What it does

Twitter Followers Scraper (X) exports the followers of any public X (Twitter) account, newest first, as clean, flat records. Choose full follower profiles (handle, name, bio with expanded links, location, website, follower / following / post counts, avatar, account creation date, automated-account label) or bulk follower IDs (up to 5,000 per request, the cheapest way to map a follower graph). Built for audience research, influencer vetting, competitor analysis, lead lists and social-graph datasets.

Price

Price per delivered record

EventPricePer 1,000Charged for
X follower profile
x-follower-profile
$0.0003$0.30 / 1,000Charged once per follower profile delivered (mode "profiles").
X follower ID
x-follower-id
$0.00005$0.05 / 1,000Charged once per follower id delivered (mode "ids").
Followers page
x-followers-query
$0.002$2 / 1,000Charged once per upstream page of up to 200 follower profiles (mode "profiles"), including the last page and empty pages; covers the provider's per-call minimum.
Follower IDs page
x-follower-ids-query
$0.003$3 / 1,000Charged once per upstream page of up to 5,000 follower ids (mode "ids"), including the last page and empty pages; covers the provider's per-call minimum.

Apify free plan: up to 10 items per run. Paid plans have no per-run cap; set maxTotalChargeUsd to cap spend.

Run

Call it from code, an agent or the Console

This API is private on Apify for now. Email us and we will publish it for you, usually within two working days. The calls below work once it is public. contact@sfoln.com

curl · synchronous run, rows in the response
curl -X POST "https://api.apify.com/v2/actors/sfoln~x-followers/run-sync-get-dataset-items" \
  -H "Authorization: Bearer $APIFY_TOKEN" \
  -H "Content-Type: application/json" \
  -d '{"handles":["apify"],"maxFollowersPerUser":20}'
mcp.json · hosted Apify MCP server
{
  "mcpServers": {
    "apify": {
      "type": "http",
      "url": "https://mcp.apify.com?tools=sfoln/x-followers"
    }
  }
}
asynchronous run · for large batches
POST https://api.apify.com/v2/actors/sfoln~x-followers/runs?maxTotalChargeUsd=1
GET  https://api.apify.com/v2/actor-runs/{runId}            # until status is SUCCEEDED
GET  https://api.apify.com/v2/datasets/{defaultDatasetId}/items?format=json

Authenticate with an Apify API token. MCP clients can instead sign in with OAuth when prompted. Example prompt for an agent: Export the 200 newest followers of @apify on X with their bios, locations and follower counts.

Input

Input fields

Paste X (Twitter) handles. The Actor returns their followers (newest first), one dataset record per follower, plus one summary record per account.

FieldTypeDefaultMeaning
handles *arrayrequiredHandles or profile URLs
X handles (with or without @) or profile URLs, one per line. Duplicates are removed. Accounts on the Apify free plan can process up to 10 accounts per run.
maxFollowersPerUserinteger200Max followers per account
How many of the most recent followers to return per account (1–5000). Range 1–5000.
modestring"profiles"Mode
"profiles" returns full follower profiles (pages of up to 200). "ids" returns only numeric follower ids (pages of up to 5,000), much cheaper per row. One of "profiles", "ids".
maxItemsinteger1000Max accounts
Safety cap on the number of accounts processed in this run. Accounts beyond it are not processed or charged; their number is reported in the run's status message and OUTPUT (inputItemsDropped). Range 1–10000.
concurrencyinteger3Concurrency
Accounts processed in parallel (1–5). Range 1–5.
itemTimeoutSecsinteger300Per-account time limit (seconds)
Stop paginating an account after this long; rows already delivered are kept. Range 30–1800.
includeRawbooleanfalseInclude raw upstream response
Attach the unmodified TwitterAPI.io user object to each profile record under `raw` (profiles mode only).
Example input
{
  "handles": [
    "apify"
  ],
  "maxFollowersPerUser": 20
}

Output

One record per input item

Records land in the run's dataset; a synchronous call returns them directly. Each has a status (ok is charged; everything else is free) and a charged flag. The run's OUTPUT record totals items and charges.

FieldTypeMeaning
inputstring | objectInput
The input item this record corresponds to.
statusstringStatus
ok | not_found | error | skipped_invalid | skipped_budget | skipped_free_plan (result rows are always ok) e.g. "ok"
chargedbooleanCharged
Whether this record incurred a pay-per-event charge.
chargedEventstringCharged event
Pay-per-event event charged for this record.
sourcestringSource
Upstream data source (twitterapi = TwitterAPI.io).
fetchedAtstringFetched at
ISO timestamp.
errorobjectError
code / message when status is not ok.
warningsarrayWarnings
Non-fatal notes (e.g. stopped early).
recordTypestringRow type
follower (one per profile, charged) | follower-id (one per id, charged) | account-summary (one per input account, free).
ofHandlestring | nullOf account
The input account whose followers this row lists.
positioninteger | nullPosition
1 = most recent follower (newest first).
handlestring | nullHandle
X handle without @. e.g. "NASA"
userIdstring | nullUser id
Numeric X user id as a string.
namestring | nullName
Display name.
biostring | nullBio
Profile description with t.co links expanded.
locationstring | nullLocation
Free-text profile location.
urlstring | nullWebsite
Website link from the profile (expanded).
profileUrlstring | nullProfile URL
https://x.com/<handle>.
followersinteger | nullFollowers
Follower count.
followinginteger | nullFollowing
Accounts followed.
tweetsinteger | nullPosts
Total posts incl. replies and reposts (statusesCount).
likesinteger | nullLikes given
Posts this account has liked (favouritesCount).
mediaCountinteger | nullMedia
Media posts.
isBlueVerifiedboolean | nullBlue verified
Has a blue check (null when the endpoint does not report it).
verifiedTypestring | nullVerified type
Business / Government / null.
profileImageUrlstring | nullAvatar
Profile image URL.
coverImageUrlstring | nullBanner
Banner image URL.
createdAtstring | nullCreated at
ISO 8601 account creation time.
isAutomatedboolean | nullAutomated
Labelled as an automated account.
automatedBystring | nullAutomated by
Handle of the operator of an automated account.
canDmboolean | nullCan DM
Accepts direct messages.
possiblySensitiveboolean | nullPossibly sensitive
Marked as possibly sensitive.
withheldInCountriesarrayWithheld in
Country codes where the account is withheld.
pinnedTweetIdsarrayPinned post ids
Ids of pinned posts.
unavailableboolean | nullUnavailable
Account is suspended / deactivated / unavailable.
unavailableReasonstring | nullUnavailable reason
e.g. suspended.
unavailableMessagestring | nullUnavailable message
Upstream message for unavailable accounts.
modestring | nullMode
profiles | ids (summary rows).
followersReturnedinteger | nullRows returned
followers delivered for this account (summary rows).
pageFeesChargedinteger | nullPage fees charged
Per-page events charged for this account (summary rows).
pageFeeEventstring | nullPage fee event
Event name of the per-page fee (summary rows).
pagesFetchedinteger | nullPages fetched
Upstream pages fetched (summary rows).
stopReasonstring | nullStop reason
limit | end | budget | deadline | empty_pages | max_pages | error (summary rows).
Example record
{
  "input": "apify",
  "recordType": "follower",
  "ofHandle": "apify",
  "position": 1,
  "handle": "jane_dev",
  "userId": "1458000000000000000",
  "name": "Jane",
  "bio": "Data engineer. Blog: https://jane.dev",
  "location": "Prague",
  "url": "https://jane.dev",
  "profileUrl": "https://x.com/jane_dev",
  "followers": 812,
  "following": 301,
  "tweets": 4210,
  "likes": 9120,
  "mediaCount": 133,
  "isBlueVerified": null,
  "verifiedType": null,
  "profileImageUrl": "https://pbs.twimg.com/profile_images/1/a_normal.jpg",
  "coverImageUrl": "https://pbs.twimg.com/profile_banners/1/1",
  "createdAt": "2021-11-03T09:12:44.000Z",
  "isAutomated": false,
  "automatedBy": null,
  "canDm": true,
  "possiblySensitive": false,
  "withheldInCountries": [],
  "pinnedTweetIds": [],
  "unavailable": false,
  "unavailableReason": null,
  "unavailableMessage": null,
  "status": "ok",
  "charged": true,
  "chargedEvent": "x-follower-profile",
  "source": "twitterapi",
  "fetchedAt": "2026-10-14T10:00:00.000Z"
}

Machine-readable

This page for agents