SFOLN

Catalogue / Social media data

Twitter Following Scraper (X)

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

Export the accounts any public X (Twitter) user follows, most recent first, as flat profiles: handle, name, bio, location, website, follower and following counts and join date. $0.30 per 1,000 accounts + $0.002 per page of up to 200. Up to 5,000 per account.

About

What it does

Twitter Following Scraper (X) exports the accounts any public X (Twitter) user follows, most recently followed first, as clean, flat profile records: handle, name, bio with expanded links, location, website, follower / following / post counts, avatar, account creation date and automated-account label. Use it to map interests and influence networks, discover sources a competitor or journalist relies on, build prospect lists, or enrich social-graph datasets.

Price

Price per delivered record

EventPricePer 1,000Charged for
X followed account profile
x-following-profile
$0.0003$0.30 / 1,000Charged once per followed-account profile delivered.
Following page
x-following-query
$0.002$2 / 1,000Charged once per upstream page of up to 200 followed accounts, 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-following/run-sync-get-dataset-items" \
  -H "Authorization: Bearer $APIFY_TOKEN" \
  -H "Content-Type: application/json" \
  -d '{"handles":["apify"],"maxFollowingPerUser":20}'
mcp.json · hosted Apify MCP server
{
  "mcpServers": {
    "apify": {
      "type": "http",
      "url": "https://mcp.apify.com?tools=sfoln/x-following"
    }
  }
}
asynchronous run · for large batches
POST https://api.apify.com/v2/actors/sfoln~x-following/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: List the accounts that @apify follows on X and group them by what they do, based on their bios.

Input

Input fields

Paste X (Twitter) handles. The Actor returns the accounts they follow (most recent first), one dataset record per followed account, plus one summary record per input 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.
maxFollowingPerUserinteger200Max followed accounts per input account
How many of the most recently followed accounts to return per input account (1–5000). Range 1–5000.
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 record under `raw`.
Example input
{
  "handles": [
    "apify"
  ],
  "maxFollowingPerUser": 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
following (one per profile, charged) | account-summary (one per input account, free).
ofHandlestring | nullOf account
The input account whose followings this row lists.
positioninteger | nullPosition
1 = most recent following (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.
followingsReturnedinteger | nullRows returned
followings 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": "NASA",
  "recordType": "following",
  "ofHandle": "NASA",
  "position": 1,
  "handle": "NASAWebb",
  "userId": "1100000000",
  "name": "NASA Webb Telescope",
  "bio": "Unfolding the universe. https://www.nasa.gov/webb",
  "location": "Space",
  "url": "https://www.nasa.gov/webb",
  "profileUrl": "https://x.com/NASAWebb",
  "followers": 2900000,
  "following": 120,
  "tweets": 6100,
  "likes": 900,
  "mediaCount": 2300,
  "isBlueVerified": null,
  "verifiedType": null,
  "profileImageUrl": "https://pbs.twimg.com/profile_images/1/a_normal.jpg",
  "coverImageUrl": null,
  "createdAt": "2010-05-21T14:00:00.000Z",
  "isAutomated": false,
  "automatedBy": null,
  "canDm": false,
  "possiblySensitive": false,
  "withheldInCountries": [],
  "pinnedTweetIds": [],
  "unavailable": false,
  "unavailableReason": null,
  "unavailableMessage": null,
  "status": "ok",
  "charged": true,
  "chargedEvent": "x-following-profile",
  "source": "twitterapi",
  "fetchedAt": "2026-10-14T10:00:00.000Z"
}

Machine-readable

This page for agents