X (Twitter) Followers Scraper - Export Follower Profiles
Pricing
from $0.09 / 1,000 accounts
X (Twitter) Followers Scraper - Export Follower Profiles
Export the followers of any public X (Twitter) account. Each row is a full profile, not just a handle. You get the bio, follower and following counts, verification, location, avatar, website and join date. No API key, nothing to paste. $0.09 per 1,000.
Pricing
from $0.09 / 1,000 accounts
Rating
0.0
(0)
Developer
Dami's Studio
Maintained by CommunityActor stats
0
Bookmarked
14
Total users
7
Monthly active users
19 hours ago
Last modified
Categories
Share
X (Twitter) Followers Scraper: export who follows an account, as full profiles
Give it up to ten X handles and you get the accounts that follow them, one row each, with the whole profile on it: bio, follower and following counts, post count, verification type, location, avatar, website and join date. Flip one switch and you get the accounts they follow instead.
Worth knowing before your first run: the list comes back newest-first, so asking for 200 gets you the 200 most recent followers, not a sample of all of them. There is no way to page to the oldest end of a big account.
| Input | Up to 10 X handles |
| Output | One full profile per account |
| Ceiling | 2,000 accounts per handle, 5,000 per run |
| Account needed | None from you |
| Price | $0.09 per 1,000 accounts, flat on every plan |
๐ฅ What X (Twitter) Followers Scraper does
Each handle is read in turn and its list is walked from the top. Because the newest arrivals sit at the top, a weekly re-run of the same handle is cheap: the people who turned up since last time are the first ones you see.
Rows are handles first, then filled out into full profiles. That second step is what puts the
counts, the location, the avatar and the join date on the row, and it is why profileEnriched is
on every row. A row with profileEnriched: false came back thin, with the handle, name and bio
only. Those rows still count as rows.
mode decides which direction you are reading. followers gives you the accounts following each
handle; following gives you the accounts it follows. The columns are identical either way, and
relation on each row tells you which one you asked for.
๐ฅ What you give it
{"handles": ["NASA", "github"],"mode": "followers","maxItemsPerHandle": 200,"enrichProfiles": true}
Every field below is prefilled in the form rather than defaulted in the schema. If you drive this from the API, set what you want explicitly instead of leaving it out.
| Field | Prefilled with | What it is |
|---|---|---|
handles | NASA, github | Up to 10 handles, with or without the @. Profile links like https://x.com/NASA work too. |
mode | followers | followers or following. |
maxItemsPerHandle | 50 | How many accounts to return for each handle, up to 2,000. You pay per row, so this is the budget. |
enrichProfiles | true | Fills in the counts, location, verification, avatar and join date. Turn it off only if all you want is the list of handles. |
sessionCookies | nothing | Optional, and not needed for a normal run. Your own X account, as an auth_token=...; ct0=... pair. Both halves are needed: X refuses an auth_token on its own. Marked secret in the schema. |
proxyUrls | nothing | Optional. One URL per line as http://user:pass@host:port, if you want the run to use servers you already pay for. |
Run it with empty input and you get one labelled sample row, free, so you can see the shape before you spend anything.
๐ค What you get back
A real row from a real run:
{"ok": true,"charged": true,"recordType": "profile","sourceHandle": "NASA","relation": "following","userName": "NASAHubble","name": "Hubble","url": "https://x.com/NASAHubble","description": "The official X account for the NASA Hubble Space Telescope, managed and operated by NASA's Goddard Space Flight Center.","followersCount": 8902296,"followingCount": 44,"tweetsCount": 8448,"isVerified": true,"verifiedType": "government","location": "Goddard Space Flight Center","profileImageUrl": "https://pbs.twimg.com/profile_images/3468011581/efb98...jpeg","createdAt": "2008-03-06T20:15:02.000Z","isProtected": false,"website": "http://www.nasa.gov/mission_pages/hubble/main/index.html","profileBannerUrl": "https://pbs.twimg.com/profile_banners/14091091/1669391293","listedCount": 15216,"mediaCount": 3127,"favouritesCount": 1241,"userId": "14091091","profileEnriched": true,"scrapedAt": "2026-09-16T22:18:47.607Z"}
| Field | What it is |
|---|---|
sourceHandle, relation | Which handle you asked about, and whether this row is a follower of it or an account it follows. |
userName, name, url | Handle, display name and profile link. |
verifiedType | What kind of tick: blue, business, government, creator or a professional type. More useful than a plain boolean. |
website | Expanded out of the t.co wrapper, so it is the real address. |
profileImageUrl | Rewritten to the 400px version rather than the thumbnail. |
listedCount, mediaCount, favouritesCount | How many lists include them, how many media posts, how many likes given. |
userId | X's numeric id, which survives a handle change. |
profileEnriched | true when the full profile came back, false when only the handle, name and bio did. |
scrapedAt | When this row was read. |
๐งพ Reading the output
Three kinds of row can land in your dataset.
| Row | How to spot it | Billed |
|---|---|---|
| An account | ok: true and a userName | yes |
| The sample row | _sample: true | no |
| A diagnostic | ok: false and an errorCode | no |
Filter on ok == true and you have your data. charged separates real rows from sample and
diagnostic rows, and is not a receipt.
Two things the Overview table will not show you, because it does not carry those columns.
_sample is hidden, so the free sample row reads as a real profile, and profileEnriched is
hidden, so a thin row looks complete until you notice the empty counts. Both are in the JSON.
A thin row is still a row, so if filling profiles in matters to you, check that column.
The error codes you are most likely to see: NOT_FOUND for a handle that does not exist, has been
suspended, or is protected; NO_RESULTS for an account with nobody on that side of its list;
BLOCKED when a handle could not be read this run; TIME_BUDGET for handles the run ran out of
time for. All are uncharged, and the run still ends green.
โถ๏ธ How to run it
- Open X (Twitter) Followers Scraper and click Try for free.
- Type handles into X (Twitter) handles, one per line.
- Choose Followers or Following, and set Accounts per handle.
- Click Start.
- Download the dataset as JSON, CSV or Excel, or pull it from the Apify API.
๐ฐ How much does it cost?
$0.09 per 1,000 accounts. Flat on every Apify plan, no volume tiers.
You pay per account delivered. The sample row and diagnostic rows are not charged. maxItemsPerHandle
times the number of handles is the ceiling on what a run can spend, so set it while you are testing.
๐ก What people use it for
- Watching who has followed a competitor or a conference account this week, since new followers come first.
- Building an audience list where the bio and the follower count matter, not just the handle.
- Checking overlap between two accounts' followers by running both and joining on
userId. - Working out what kind of accounts follow you, using
verifiedTypeandfollowersCountto sort.
๐ง What it does not do
- Newest-first only. You cannot reach the older end of a large account's list.
- Protected accounts are unreadable. They come back as a diagnostic row saying so.
- No emails, no phone numbers. Only what X puts on a public profile.
- Ten handles per run, 2,000 accounts per handle, 5,000 per run. A very big account can also stop short of what you asked for when the list stops paging.
- Thin rows are possible and are still charged.
profileEnriched: falseis the flag for it. - No tweets. This is the audience, not the timeline.
๐งญ Which X scraper do you need?
| If you want | Use |
|---|---|
| Who follows an account, or who it follows | This one |
| Profile records for handles you already have | Twitter Profile Scraper |
| Tweets matching a keyword or an advanced query | Twitter (X) Search Scraper |
| Specific tweets, or a profile's timeline | Tweet Scraper |
| Everything posted into a curated X list | Twitter List Scraper |
โ Questions people ask
Do I need an X account or an API key? No. The cookie field is optional and most runs never need it.
Can I get all 90 million followers of a big account? No. The ceiling is 2,000 per handle and 5,000 per run, taken from the newest end.
What is the difference between followers and following? Direction. followers is who follows
the handle, following is who the handle follows. Same columns, and relation says which.
Why do some rows have empty counts? They came back thin, with only the handle, name and bio.
profileEnriched: false marks them.
Is scraping X legal? This reads public profiles only, never private accounts or messages. Results can still contain personal data, which GDPR and similar laws cover, so have a reason for collecting it. Apify's write-up on the legality of web scraping is a good starting point, and we are not lawyers.
Can I run it on a schedule? Yes, and it suits this one: a weekly run picks up the new arrivals first.
๐ If something breaks
Open the Issues tab on the actor page. Include the handles you used and the run ID, and paste
any errorCode you got back, since that usually says what happened straight away.