# Twitter User Scraper: profiles, followers and following

Twitter User Scraper returns X accounts rather than tweets: a profile by handle, URL or ID, the people who follow it, the people it follows, and who retweeted a given tweet.

[Run this scraper free](https://apify.com/apidojo/twitter-user-scraper)

[See the three jobs](#jobs)

apidojo/twitter-user-scraper

**Followers / following**

**Keyword search**

**Profile lookups**

**Network queries**

**Users returned**

Estimated run cost

$0.00

Free Apify plan: 5 runs a month, 10 items a run. No credit card.

**$0.004** per profile looked up

**$0.016** per network query, ~70 in

**8.9K** users · 4.4 from 16 reviews

**30–80/s** users, per the listing

Read on 21 September 2026.

## Which of the seven charges will your run fire?

Naming an account costs $0.004. Asking about its network costs $0.016 a time, and three switches decide how many of those fire. Two of the three are on before you touch anything.

-   `twitterHandles · startUrls · twitterUserIds`

    $0.004per account named

    No users included

    Three ways to name an account. Identical price, so pick whichever matches your data.

    `["elonmusk"] or 44196397`

-   On before you touch anything

    `getFollowers · getFollowing`

    +$0.032per profile, unasked

    ~70 users each included

    Both prefill to true in the schema, so a plain handle lookup already fires two network queries you did not ask for.

    `getFollowers: false`

-   `getRetweeters`

    $0.016per tweet

    ~70 retweeters included

    Also prefills true. Applies to tweet URLs in startUrls, and returns who retweeted them.

    `x.com/NASA/status/198134…`

-   `searchTerms`

    $0.008per search

    ~20 users included

    Finds accounts by keyword instead of naming them. Half the price of a profile query and it brings twenty users with it.

    `["climate scientist"]`

Every user past a query’s included page costs $0.0004, and getAbout adds $0.0002 a profile for creation date, username history and verification timestamps. maxItems is the ceiling on all of it.

**Apify actor:** apidojo/twitter-user-scraper

**Inputs:** startUrls · twitterHandles · twitterUserIds · searchTerms · getFollowers · getFollowing · getRetweeters · includeUnavailableUsers · maxItems

**Returns:** One record per account, whether it is the subject or one of its followers

**Charge events:** Seven. Keyword search, profile URL, followers, following, retweeters, about page, per user

**Defaults that cost:** getFollowers, getFollowing and getRetweeters all prefill to true

**Minimum per run:** 5 objects. A single profile has to be listed five times

**Login or proxy:** Neither. Public accounts only

**Reliability:** 98.24% of 202,394 runs succeeded in the last 30 days

## Three questions about people

Look an account up, pull the network around it, or find accounts you cannot name yet. The three cost quite differently, which is the whole reason to know which one you are doing.

**01 Look up accounts $0.004 per account**

**02 Pull a network $0.016 / query · ~70 free**

**03 Find accounts $0.008 / search · ~20 free**

### How do you get X profile data for a list of handles?

Put them in twitterHandles and turn the network switches off. Each account costs $0.004 and returns the full profile, followers count, bio, location, creation date and X Premium status. Five profiles cost $0.02.

Input

```
{
  "twitterHandles": ["NASA", "ESA", "JAXA_en", "isro", "csagc"],
  "getFollowers": false,
  "getFollowing": false,
  "getRetweeters": false,
  "maxItems": 5
}
```

5 × $0.004 \= **$0.02**

What comes back

The **user record**, Around 20 fields per account, with both verification flags kept separate.

```
{
  "type": "user",
  "userName": "exampleUser",
  "id": "1467931973616386052",
  "name": "Example User",
  "description": "Bio description with links and hashtags",
  "location": "San Francisco, CA",
  "followers": 1147899,
  "following": 561,
  "isVerified": true,
  "isBlueVerified": true,
  "verifiedType": "business",
  "createdAt": "Mon Dec 06 19:00:41 +0000 2021",
  "statusesCount": 2104
}
```

Turn the switches off, or pay nine times the price

getFollowers and getFollowing prefill to true. Left alone, each account in that list also fires two $0.016 network queries, turning a $0.004 lookup into $0.036 before a single follower is returned. The README’s input table says they default to false; the schema the form loads says true. Set them explicitly either way.

### How do you export the followers of an X account?

Set getFollowers to true on the accounts you named. Each list is one $0.016 query with roughly 70 users included, then $0.0004 per user after. One profile plus 500 followers costs $0.19.

Input

```
{
  "twitterHandles": ["NASA"],
  "getFollowers": true,
  "getFollowing": false,
  "maxItems": 500
}
```

$0.004 + $0.016 + 430 × $0.0004 \= **$0.19**

What comes back

The **user record, with followerOf**, The same shape as a lookup, plus the account whose network produced it.

```
{
  "followerOf": "elonmusk",
  "type": "user",
  "userName": "exampleUser",
  "followers": 1147899,
  "following": 561,
  "protected": false,
  "canDm": true,
  "listedCount": 1294,
  "mediaCount": 139
}
```

Followers and following are two queries, not one

Asking for both on one account fires $0.032 in query fees and gives you two included pages. A thousand of each comes to $0.78. Decide which direction you actually need before turning both on out of habit.

### How do you find X accounts by keyword?

Put terms in searchTerms. A search costs $0.008 and brings about 20 users inside it, which makes it the cheapest way into a niche you cannot name accounts in yet. A hundred users from one search cost $0.04.

Input

```
{
  "searchTerms": ["climate scientist", "oceanographer"],
  "getFollowers": false,
  "getFollowing": false,
  "maxItems": 200
}
```

2 × $0.008 + 160 × $0.0004 \= **$0.08**

What comes back

The **user record**, Identical to a lookup. Feed the handles back in to go deeper on the good ones.

```
{
  "type": "user",
  "userName": "example_researcher",
  "name": "Example Researcher",
  "description": "Ocean carbon. Views my own.",
  "followers": 18422,
  "isBlueVerified": false,
  "listedCount": 204,
  "favouritesCount": 1450
}
```

A run needs five objects, even for one profile

The actor requires a minimum of 5 objects per run to cover its operational cost. Its own documented workaround for a single profile is to repeat the handle five times in twitterHandles. A run pulling followers usually clears the floor on its own.

## What an account record holds

One shape whatever produced it, and the listing publishes an availability guarantee for each field: eleven are always present, two depend on whether the account filled them in.

-   6

    Identity

    Always present

    -   id, userName
    -   name
    -   url, twitterUrl
    -   profilePicture
    -   description
-   5

    Size and reach

    Always present

    -   followers, following
    -   statusesCount
    -   listedCount
    -   mediaCount
    -   favouritesCount
-   4

    Status

    Verification kept separate

    -   isVerified, legacy
    -   isBlueVerified, X Premium
    -   verifiedType
    -   protected, canDm
-   3

    Context

    Some conditional

    -   createdAt
    -   location, if the user set one
    -   coverPicture, if set
    -   followerOf, on network results

**id · userName:** Numeric ID and the @handle, both always present

**name:** Display name

**url · twitterUrl:** The x.com and twitter.com forms of the profile link

**description:** Bio text, links and hashtags as written

**location:** Free text, only where the account set one

**followers · following:** Both counts at the time of the run

**statusesCount:** Total posts on the account

**listedCount:** How many Lists include this account. A quiet authority signal

**mediaCount · favouritesCount:** Posts with media, and likes given

**isVerified:** Legacy verification, the old blue check

**isBlueVerified:** X Premium. Different thing, kept in a different field

**verifiedType:** "business" and similar, where X exposes it

**protected · canDm:** Whether the account is locked, and open to messages

**createdAt:** Account creation date, in X’s own string format

**followerOf:** Which account’s network this record came from

**professional:** Professional account type and category where set

isVerified and isBlueVerified are not the same signal and the listing keeps them apart on purpose: one is legacy verification, the other is a paid subscription. Filtering on the wrong one is the usual way an influencer shortlist goes wrong.

## What will surprise you

Five things, and the first two are the reason a first run costs more than expected.

-   01

    Two network switches are on by default

    getFollowers and getFollowing prefill to true in the input schema, and getRetweeters does too. The README’s table says all three are false. The schema is what the form loads, so assume on and set them explicitly.

-   02

    A run needs at least five objects

    The actor states a minimum of 5 objects per run to cover its operating cost. For one profile with no network, the documented workaround is to list the handle five times.

-   03

    Each direction of a network is its own query

    Followers and following are $0.016 each, with their own included page. Retweeters is a third. Nothing bundles them.

-   04

    Included pages are approximate

    Roughly 70 users on a network query, roughly 20 on a keyword search. They are first-page sizes, not guarantees, so budget on the item rate rather than the free tier.

-   05

    Suspended accounts are excluded unless you ask

    includeUnavailableUsers is off, so suspended and unavailable accounts are dropped. Turn it on when a gap in a follower list would itself be the finding.

Free Apify accounts run it in demo mode: 5 runs a month, capped at 10 items.

## What each kind of run costs

A run costs the fee for every query it fires plus $0.0004 for each user past the included pages. The rows below are the listing’s own worked examples, and all seven reproduce from the published event prices.

| Run | Method | Calculation | Cost |
| --- | --- | --- | --- |
| 5 profiles, no network | 5 profile queries | 5 × $0.004 | $0.02 |
| 20 users | 1 keyword search | $0.008 | $0.008 |
| 100 users | 1 keyword search | $0.008 + 80 × $0.0004 | $0.04 |
| 1 profile + 70 followers | profile + followers | $0.004 + $0.016 | $0.02 |
| 1 profile + 500 followers | profile + followers | $0.004 + $0.016 + 430 × $0.0004 | $0.19 |
| 1 profile + 1,000 each way | profile + both networks | $0.004 + 2 × $0.016 + 1,860 × $0.0004 | $0.78 |
| 1 tweet + 200 retweeters | retweeters query | $0.016 + 130 × $0.0004 | $0.068 |

The estimator above prices one kind of query at a time, because that is what it can do honestly: a run that mixes a profile lookup with a followers pull adds both fees, as rows four to six show. Computed from the seven charge events the Apify Store API reports; the listing rounds its retweeters example to $0.07 where the arithmetic gives $0.068.

## Who scrapes X accounts rather than tweets?

Five kinds of work need the people rather than the posts: influencer research, lead generation, audience overlap, account intelligence and academic network analysis.

-   Influencer research

    Find accounts, then look them up

    Search a niche, then pull full profiles on the shortlist and filter on isBlueVerified and listedCount rather than follower count alone

    $0.04 per 100 found

-   Lead generation

    Pull a network, followers only

    Export the followers of an account your buyers already follow, with bios and locations for qualification

    $0.19 per 500 followers

-   Audience overlap

    Pull a network on two accounts

    Take both follower lists and intersect them to see how much of a competitor’s audience you already share

    $0.78 per 1,000 each way

-   Account intelligence

    Look up accounts, with getAbout

    Check creation dates, username history and verification timestamps when an account’s age is the question

    $0.0042 per profile

-   Network researchers

    Pull a network, at scale

    Build follower graphs for community detection, where followerOf is the edge and the record is the node

    $0.0004 per edge

## Wiring it into a pipeline

The actor is apidojo/twitter-user-scraper. The one thing to encode deliberately is the switches: leave them out of your run input and you inherit the schema defaults, which fire two network queries per account.

**Python**

**JavaScript**

**cURL**

```
from apify_client import ApifyClient

client = ApifyClient("YOUR_APIFY_TOKEN")

# Always state the switches. Omitted, they inherit the schema's true and
# each account quietly fires two $0.016 network queries.
run = client.actor("apidojo/twitter-user-scraper").call(run_input={
    "twitterHandles": ["NASA", "ESA", "JAXA_en", "isro", "csagc"],
    "getFollowers": False,
    "getFollowing": False,
    "getRetweeters": False,
    "maxItems": 5,
})

for u in client.dataset(run.default_dataset_id).iterate_items():
    # Legacy verification and paid Premium are different fields
    print(u["userName"], u["followers"], u["isVerified"], u["isBlueVerified"])
```

```
import { ApifyClient } from 'apify-client';

const client = new ApifyClient({ token: process.env.APIFY_TOKEN });

// Audience overlap: two follower lists, intersected.
const run = await client.actor('apidojo/twitter-user-scraper').call({
  twitterHandles: ['NASA', 'ESA'],
  getFollowers: true,
  getFollowing: false,
  getRetweeters: false,
  maxItems: 4000,
});

const { items } = await client.dataset(run.defaultDatasetId).listItems();

// followerOf is the edge: which account's network produced this record.
const sets = Object.groupBy(items, (u) => u.followerOf);
const [a, b] = Object.values(sets).map((g) => new Set(g.map((u) => u.id)));
console.log([...a].filter((id) => b.has(id)).length, 'shared followers');
```

```
curl -X POST \
  "https://api.apify.com/v2/acts/apidojo~twitter-user-scraper/run-sync-get-dataset-items?token=YOUR_APIFY_TOKEN" \
  -H "Content-Type: application/json" \
  -d '{"searchTerms":["climate scientist"],"getFollowers":false,"getFollowing":false,"maxItems":200}'
```

Datasets export as CSV or stream over the API. Every key above is in the actor’s input schema, and the switches are named in full precisely because leaving them out is the expensive option.

## Twitter User Scraper FAQ

### Why did a simple handle lookup cost more than $0.004?

Because getFollowers and getFollowing prefill to true. Each account then also fires two $0.016 network queries, so the lookup costs $0.036 before any users are returned. Set both to false explicitly.

### How much does it cost to export 500 followers?

About $0.19, $0.004 to name the account, $0.016 for the followers query with roughly 70 users inside it, and $0.0004 for each of the remaining 430.

### Why does one profile need five handles in the input?

The actor requires a minimum of 5 objects per run to cover its operating cost. Its documented workaround for a single profile is to repeat the handle five times. Runs that pull a network usually clear the floor without help.

### What is the difference between isVerified and isBlueVerified?

isVerified is legacy verification, the old blue check. isBlueVerified is an X Premium subscription. They are separate fields because they mean different things, and filtering on the wrong one skews an influencer shortlist.

### Can I get who retweeted a tweet?

Yes. Put the tweet URL in startUrls with getRetweeters on. It bills as a $0.016 network query with roughly 70 retweeters included, so 200 retweeters cost about $0.07.

### Does it return suspended accounts?

Not by default. includeUnavailableUsers is off, so suspended and unavailable accounts are dropped from the output. Turn it on when the gap itself is what you are measuring.

### Can I look accounts up by numeric ID?

Yes. twitterUserIds takes X user IDs directly, at the same $0.004 as a handle. IDs survive a username change, which handles do not.

### How fast is it?

The listing quotes 30 to 80 users a second, and elsewhere up to 67. The range is the figure to plan with.

## Where Twitter User Scraper fits

[Parent scraper Twitter Scraper The Twitter family in one place: six scrapers, what each costs, and which to reach for. The rest of them return tweets. This is the one that returns the people who wrote them, and the people around those people.](/scrapers/twitter-scraper/)

Sibling scrapers

-   [Twitter Scraper Unlimited](/scrapers/twitter-scraper-lite/)
-   [Twitter Profile Scraper](/scrapers/twitter-profile-scraper/)
-   [Twitter List Scraper](/scrapers/twitter-list-scraper/)

Guides

-   Measuring audience overlap between two X accounts*Coming soon*
-   Why listedCount beats follower count for shortlists*Coming soon*
-   Legacy verified or X Premium: filtering the right field*Coming soon*

## Look up five accounts

Two cents, with the network switches off.

`twitterHandles: ["NASA"] · getFollowers: false`

[Run this scraper free](https://apify.com/apidojo/twitter-user-scraper)

Apidojo is not affiliated with X Corp.

## Guides for this scraper

-   [Scraping X (Twitter) data: guides by task Turning an X search query into structured data: which actor fits each job, what a run costs, and the limits that decide how you batch it.](/blog/twitter-scraping/)
-   [Reading account age in X reply data Every reply carries the responder's account creation date, follower counts and post history. Here is what those fields can and cannot tell you.](/blog/twitter-scraping/x-replier-account-age/)
-   [X (Twitter) platform guides: how the app works Everyday questions about X itself: posting, quoting, embedding, deleted posts, blocks, and what each piece of platform behaviour actually means.](/blog/x-guides/)
-   [Who Blocked Me on Twitter (X)? How to Check in 2026 Twitter (X) does not show who blocked you: no list, no notification, no API endpoint.](/blog/x-guides/who-blocked-me-on-twitter/)
