X (Twitter) Profile Scraper: Followers, Bio & Stats avatar

X (Twitter) Profile Scraper: Followers, Bio & Stats

Pricing

from $1.00 / 1,000 profile founds

Go to Apify Store
X (Twitter) Profile Scraper: Followers, Bio & Stats

X (Twitter) Profile Scraper: Followers, Bio & Stats

Bulk Twitter follower count checker: paste X handles or profile URLs and get one spreadsheet row per account - display name, bio, exact follower, following and post counts, and badge type. Built for growth teams sizing an account before they pitch it. No login, no API key, misses are free.

Pricing

from $1.00 / 1,000 profile founds

Rating

0.0

(0)

Developer

Adrian Voss

Adrian Voss

Maintained by Community

Actor stats

1

Bookmarked

14

Total users

11

Monthly active users

5 hours ago

Last modified

Share

X Profile Lookup: twitter profile scraper from $2/1k

Paste a list of X handles and get a spreadsheet with each account's exact follower count, bio and post count.

Make.com: copy this scenario to build a weekly competitor war-room brief for your Shopify brand.

Who uses this

  • Growth and partnerships teams sizing an account before pitching a collaboration, instead of opening 40 tabs.
  • Community managers keeping a roster of member handles current month over month.
  • Analysts and RevOps filling the Twitter-handle column that has sat un-enriched in the CRM, straight into Google Sheets or Clay.

Try it in 30 seconds

The input box already has three real handles in it. Click Start and you get one row per account, like the rows below. No login, no cookies, no API key, no developer account.

Example output

Real rows from a recent run:

handledisplayNamefollowersCountfollowingCounttweetCount
NASANASA92,377,20511574,365
GymsharkGymshark381,68843079,702
apifyApify17,4143014,975

Every row also carries bio, location, website, join date, badge type, profile picture and header image.

What it costs

About $2 per 1,000 profiles found, and nothing at all for a handle that doesn't resolve - a typo in your list is free. First runs fit inside Apify's free credit.

You give this actor a list of X (Twitter) handles or profile URLs and for each one it returns the display name, bio, location, website, join date, exact follower / following / post counts, badge type, profile picture and header image. Every number is read from the profile page's own server-rendered data at request time. No login, no cookies, no API key, and no stored database sits between you and the answer.

Who it's for

Growth and partnerships teams sizing an account before they pitch it, community managers keeping a roster of member handles current, researchers tracking how a set of accounts grows week over week, and anyone whose CRM has a Twitter handle column that has never been enriched. If your workflow today is "open 40 tabs and copy the follower count into a spreadsheet", this is that job as one API call. Pricing is per profile: a few tenths of a cent for a profile that came back with data, and nothing at all for a handle that is unused, suspended or typo'd. No seat license, no monthly minimum, no credit system to decode.

Why this one

  • Exact counts, not the abbreviated ones on the page. The profile card shows "92.3M followers" and "74.3K posts". The page's own data carries 92385570 and 74276, and that is what this actor returns. Rounded figures are useless for tracking growth; these are not.
  • No API key and no $200/month tier. X's official API starts at $200/month for the plan most people need. This reads the public profile page, which anyone can open in a browser, and bills per profile found.
  • Never charged for a miss. A handle nobody holds comes back as a clean NOT_FOUND row, a suspended account is labelled as suspended rather than silently returned as empty data, and neither one costs anything.
  • A suspended account is never sold to you as a hit. X still renders a page for a suspended handle. This actor reads the status and treats it as a miss, instead of billing you for a row with no profile in it.
  • Handles, @handles, x.com links and old twitter.com links all work. Paste whatever your CRM already stores; you do not have to normalise the column first.
  • No credential ever enters this actor. There is no input field that could take a bearer token, a cookie or a password, because none is needed.

What you get

Every row starts with the same five fields, then the profile fields.

FieldTypeDescription
querytextThe handle or URL you submitted, echoed back
foundbooleantrue if the profile was found
statustextOK on a match; NOT_FOUND, BLOCKED, BAD_FORMAT, or REQUEST_FAILED on a miss
messagetextPlain-English reason for a miss, only present when found is false
scrapedAtISO 8601 datetimeWhen the page was fetched
handletextThe account's handle, in the casing X itself uses
userIdtextThe account's stable numeric X user ID, which survives a handle change
displayNametextThe account's display name
biotextThe bio text, as X stores it
locationtextThe self-declared location, if the account sets one
websitelinkThe account's link, already expanded past the t.co wrapper
joinedDateISO 8601 datetimeWhen the account was created
followersCountnumberExact follower count
followingCountnumberExact following count
tweetCountnumberExact number of posts
verifiedbooleanWhether the account carries any badge
verifiedTypetextWhich badge: Blue, Business or Government
isProtectedbooleanWhether the account is protected (posts visible to followers only)
profileImageUrlimageProfile picture, upgraded to the 400x400 size
bannerUrlimageHeader image, if the account sets one
profileUrllinkCanonical profile page
followersDeltanumberChange in followersCount since this handle's previous monitoring run. Null on the first run or with monitoring off
followersDeltaPctnumberPercent change in followersCount since the previous run, to one decimal
followingDeltanumberChange in followingCount since the previous run
tweetsDeltanumberChange in tweetCount since the previous run
bioChangedbooleanWhether the bio text differs from the previous run's snapshot
nameChangedbooleanWhether the display name differs from the previous run's snapshot
previousSnapshotAtISO 8601 datetimeWhen this handle was last monitored — null on the first run
daysSincePreviousnumberDays elapsed since the previous monitoring run, to one decimal

Deselect any field in the Input tab's column picker to drop it from every row: query, found, status, message and scrapedAt always stay. The eight change columns above are only filled when "Track changes for these handles across runs" is on — see Monitoring below.

Monitoring: an X / Twitter follower count tracker

Turn on "Track changes for these handles across runs" (deltaMode) and this actor becomes a follower count tracker: it remembers each handle's follower/following/post counts, bio and display name between runs, and fills in the eight change columns by comparing this run against that handle's previous one. Schedule it weekly and followersDelta / followersDeltaPct become the weekly follower change for a list of accounts, with bioChanged / nameChanged doubling as bio change alerts. Every handle is still looked up and billed once, exactly as with monitoring off — turning it on only adds columns, it never changes what you pay per profile found.

The first monitoring run for a handle has nothing to compare against: it always comes back (and is charged), every change column is null, and its snapshot becomes the baseline the next run compares to.

Turn on "Only report profiles that changed" (alertOnChangeOnly) to also drop a handle from the results — and skip charging for it — when nothing moved at all since its previous run (same three counts, same bio, same display name). On a scheduled run this means you only pay for the accounts that actually changed; an unchanged handle still runs, just for free, and comes back as an uncharged UNCHANGED row unless you also have "Hide rows with no result" on.

By default the watchlist memory is keyed to your exact handle list, so editing the list starts a fresh baseline. Type a name into "Watchlist name" (deltaName) to keep one memory across list edits — for example when you add a new competitor but still want its growth compared against a baseline you set weeks ago for the rest of the list.

Price

$2 per 1,000 profiles, plus a $0.00005 start fee. Misses (found:false) are never charged.

1,000 handles through this actor: about $2 if every one resolves, less if some do not, and less again on a paid Apify plan. The same 1,000 profiles through X's own API means a $200/month subscription before you read the first row.

How to use

  1. In the Apify Console. Open the actor page and click Start — the profiles field is already pre-filled with a working example. Results land in the run's dataset as soon as each item is found.
  2. Via the API. Call it directly with a POST request — no Console needed once you have an API token:
    curl "https://api.apify.com/v2/acts/accountable_eel~x-profile-lookup/run-sync-get-dataset-items?token=<YOUR_TOKEN>" \
    -X POST \
    -H "Content-Type: application/json" \
    -d '{"profiles":["nasa","apify","github"]}'
  3. On a schedule. Save this actor as an Apify Task with the input you want, then add a Schedule (hourly, daily, weekly) so it runs on its own — no server of your own required.
  1. Open the Input tab and paste your list into "X handles or profile URLs to look up": one per line, as a bare handle (nasa), an @handle, or a full profile URL on either domain.
  2. Leave "Try it first" on for your opening run. It caps the run at 5 profiles so you can check the output shape before spending on the whole list.
  3. Optionally trim "Which columns do you want?" to the fields you actually need, or use "Only keep rows containing" and "Skip rows containing" to filter by keyword.
  4. Turn "Try it first" off and press Start to run the full list.

Typical uses: enriching a CRM column of Twitter handles, sizing a list of creators before an outreach campaign, and running the same list weekly so you can chart follower growth over time.

Input

{
"profiles": [
"nasa",
"apify",
"github"
]
}

One X (Twitter) handle or profile URL per line. Accepted formats: nasa, @nasa, https://x.com/nasa, https://twitter.com/nasa.

Sample output

queryfoundstatushandleuserIddisplayNamebiolocationwebsitejoinedDatefollowersCountfollowingCounttweetCountverifiedverifiedTypeisProtectedprofileImageUrlbannerUrlprofileUrlfollowersDeltafollowersDeltaPctfollowingDeltatweetsDeltabioChangednameChangedpreviousSnapshotAtdaysSincePreviousscrapedAt
nasatrueOKNASA11348282NASAMaking the seemingly impossible, possible. ✨Pale Blue Dothttp://www.nasa.gov/2007-12-19T20:20:32.000Z9237441511574337falsehttps://pbs.twimg.com/profile_images/1321163587679784960/0ZxKlEKB_400x400.jpghttps://pbs.twimg.com/profile_banners/11348282/1788992290https://x.com/NASA2026-09-28T06:20:15.112Z

A handle nobody holds, or one belonging to a suspended account, gets a row with found: false and a status / message explaining which of the two it was. Neither is charged.

Use it from Clay, n8n, Make, or an AI agent

This actor runs synchronously over plain HTTP — call it directly from a script, a workflow tool, or an AI agent, no Apify Console needed once you have an API token.

curl "https://api.apify.com/v2/acts/accountable_eel~x-profile-lookup/run-sync-get-dataset-items?token=<YOUR_TOKEN>" \
-X POST \
-H "Content-Type: application/json" \
-d '{"profiles":["nasa","apify","github"]}'

n8n. Add an HTTP Request node: Method POST, URL https://api.apify.com/v2/acts/accountable_eel~x-profile-lookup/run-sync-get-dataset-items?token=<YOUR_TOKEN>, Body Content Type JSON, JSON Body {"profiles":["nasa","apify","github"]} (swap in an expression from an earlier node for a real value).

Clay. Add an "HTTP API" column: Method POST, URL https://api.apify.com/v2/acts/accountable_eel~x-profile-lookup/run-sync-get-dataset-items?token=<YOUR_TOKEN>, Body {"profiles":["{{profile}}"]}, mapping the row's profile into the profiles array.

MCP. In Claude, Cursor, or any MCP client with the Apify MCP server, ask for "Bulk Twitter Follower Count Checker & X Profile API" — the agent will find and run this actor.

Tips

  • Run "Try it first" on a few accounts whose follower counts you already know, so you can confirm the numbers before committing a long list.
  • Store userId, not handle, as your join key. Handles change; the numeric ID does not, so a rename shows up as a changed handle on the same userId instead of a broken row.
  • Keep the parallel-request setting low on a big list. X notices bursts, and a page of BLOCKED rows costs more in wasted time than a slower, steadier run.
  • verifiedType is more useful than verified on its own: Government and Business badges say something about the account that a paid Blue badge does not.
  • location is free text the account holder typed. "Pale Blue Dot" is a real value. Do not feed it into a geocoder without cleaning it.
  • Turn on "Track changes for these handles across runs" and schedule the task instead of diffing followersCount yourself between runs — the actor now keeps that history for you and fills in followersDelta and the rest each run.

vs. alternatives

What it costsWhat you getTrade-off
This actor (x-profile-lookup)$2 per 1,000 found profiles at the FREE tier, less on paid tiers, nothing for a missOne flat row per handle: display name, bio, location, website, join date, exact follower / following / post counts, badge type, picturesProfile data only. It returns nothing about the account's posts, followers list, or engagement. If you need posts, apidojo/tweet-scraper is the actor for that job, not this one.
apidojo/tweet-scraper$0.40 per 1,000 tweetsPosts: the tweets themselves, with their text, media and engagement countsA different product for a different question. Use it when you want what an account said; use this when you want who the account is.
X API (official)From $200/monthEverything X chooses to expose, under a documented contract with rate limits you can plan againstIf you are building a product on X data and need guarantees, pay for the API. This is for the enrichment case where a monthly subscription for a follower-count column makes no sense.
Doing it yourselfYour time, plus parsing a serialized page payload that X reformats without notice, plus telling a suspended account apart from an unused handleThe same dataThe parsing, the exact-versus-rounded count handling, the suspended-versus-missing distinction, and re-testing when the page changes are the maintenance this actor absorbs.

Prices for third-party tools are their published figures as of September 2026 and are not tracked here; check the vendor before relying on the comparison.

FAQ

Why does a row say found: false? One of four reasons, and message always names which: nobody holds that handle (NOT_FOUND, a real HTTP 404 from X), the account is suspended (NOT_FOUND, with "suspended" in the message), the input is not a valid handle shape (BAD_FORMAT), or the request was refused or timed out (BLOCKED / REQUEST_FAILED). None of the four is charged.

Am I charged for a miss? No. The charge fires only when a profile actually resolves and its data is returned. Suspended accounts, unused handles and blocked requests all produce a row and cost nothing.

Do I need an X API key, a login, or a cookie? No. There is no input field that accepts one. The actor reads the public profile page, the same page a logged-out visitor sees.

Are the follower counts exact or rounded? Exact. The visible profile card rounds to "92.3M"; the page's underlying data carries the real integer, and that is the number in followersCount. The same is true of followingCount and tweetCount.

Is this a live check or a stored database? Live. Every run fetches the current page — there is no stored database of profiles behind it. Turning on "Track changes for these handles across runs" does keep one small snapshot per handle (counts, bio, display name) so the next run can diff against it; that memory only ever holds what this actor measured for your own watchlists, not a general profile database.

How does change tracking decide what counts as a change? Any move in followersCount, followingCount or tweetCount, or a different bio or display name than the previous run's snapshot, counts. There is no minimum-move threshold — a follower count that goes from 100 to 99 counts the same as one that doubles.

What happens to protected accounts? They still return a row. X serves the profile header for a protected account, so display name, bio, join date and the three counts are all present; isProtected: true flags it. What a protected account does not expose is its posts, which this actor does not return for any account.

What does verifiedType mean? It is X's own label for the badge on the account: Blue for a paid subscription, Business for an organisation, Government for an official body. null means the page carried no badge for that account.

Does an old twitter.com URL still work? Yes. twitter.com, mobile.twitter.com and x.com links all resolve to the same handle before the request is made.

Is this GDPR-relevant? What comes back is an account's own public, self-published profile information, the same fields any visitor sees without logging in. It returns no private data, no email addresses and no follower lists.

Can an AI agent call this directly? Yes. It is on the Apify MCP server, so an agent in Claude, Cursor or another MCP client can find and run it by name, or you can call the REST endpoint shown above from any script or workflow.