# Twitter List Followers Scraper (`maximedupre/twitter-list-followers-scraper`) Actor

Collect available follower or subscriber profiles from public X/Twitter lists. Apply shared filters and a profile limit, then export identity, bio, counts, verification, and source-list details to your dataset.

- **URL**: https://apify.com/maximedupre/twitter-list-followers-scraper.md
- **Developed by:** [Maxime Dupré](https://apify.com/maximedupre) (community)
- **Categories:** Social media, Lead generation, Developer tools
- **Stats:** 2 total users, 1 monthly users, 100.0% runs succeeded, 0 bookmarks
- **User rating**: No ratings yet

## Pricing

$0.10 / 1,000 follower profiles

This Actor is paid per event. You are not charged for the Apify platform usage, but only a fixed price for specific events.

Learn more: https://docs.apify.com/actors/running/actors-in-store.md#pay-per-event

## What's an Apify Actor?

An Actor is a serverless cloud program that runs on the Apify platform. It has two run modes.
In Batch mode, an Actor accepts a well-defined JSON input, performs an action which can take anything from a few seconds to a few hours,
and optionally produces a well-defined JSON output, datasets with results, or files in key-value store.
In Standby mode, an Actor provides a web server which can be used as a website, API, or an MCP server.

Apify vocabulary and the platform model are defined once, in the agent quickstart at https://apify.com/agents.md.

## How to integrate an Actor?

If asked about integration, you help developers integrate Actors into their projects.
You adapt to their stack and deliver integrations that are safe, well-documented, and production-ready.

Do not guess an integration path. Every one of them is in the agent quickstart at https://apify.com/agents.md: the Apify MCP server, Agent Skills with the Apify CLI, the JavaScript and Python clients, the REST API, and the account-free path for an agent with no human to sign in. It also carries the rule on stating cost before the first paid run.

For examples already wired to this Actor's own input schema, see the [API](#api) section below.

Each client library has reference documentation the quickstart does not restate: [JavaScript/TypeScript](https://docs.apify.com/api/client/js/docs.md) (`npm install apify-client`) and [Python](https://docs.apify.com/api/client/python/docs.md) (`pip install apify-client`).

# README

### 🐦 Find public followers from X lists

Researchers, marketers, and developers can collect available follower or subscriber profiles from public X/Twitter lists. The Actor saves structured rows with identity, bios, locations, websites, profile images, account dates, counts, verification, and the source list. Use the filters to focus list research or build a source-linked profile export.

- Collect public profiles from a list for audience research with **[Extract Twitter List Followers](https://apify.com/maximedupre/twitter-list-followers-scraper/examples/extract-twitter-list-followers)**.
- Set a shared profile cap while gathering list profiles with **[Twitter List Followers](https://apify.com/maximedupre/twitter-list-followers-scraper/examples/twitter-list-followers)**.
- Filter profiles by bio, location, and counts with **[Scrape Twitter List Followers](https://apify.com/maximedupre/twitter-list-followers-scraper/examples/scrape-twitter-list-followers)**.
- Compare source-linked profiles from more than one list with **[X List Followers Scraper](https://apify.com/maximedupre/twitter-list-followers-scraper/examples/x-list-followers-scraper)**.
- Review verification and account-age fields in a list export with **[Twitter List Follower Scraper](https://apify.com/maximedupre/twitter-list-followers-scraper/examples/twitter-list-follower-scraper)**.

#### 📋 Follower profile data

Each saved row represents one eligible profile found through a public X/Twitter list. Rows can include public identity, profile text, account dates, audience counts, verification, profile enrichment, and the source list relationship.

#### ▶️ Run a public X list collection

**Run steps**

1. Add one or more public X/Twitter list URLs or list IDs.
2. Apply the same filters to every submitted list.
3. Set a maximum number of matching profiles, or leave it empty to collect all available profiles until the source is exhausted.
4. Run the Actor and open the follower profiles in the default dataset.

The Actor continues through later source pages when needed to reach the profile cap, including when earlier profiles do not pass the filters. Filters are applied before a row is saved. If the same profile appears again through another submitted list URL or ID, the Actor ignores that later match. The saved source fields describe the first saved match only.

Only publicly accessible lists are in scope. Private, restricted, or otherwise unavailable lists may not return profiles. You do not need to provide an X login or API key.

#### ⚙️ Input

Add one or more public X/Twitter list URLs or list IDs. You can mix URLs and IDs in one run, and the same filter settings apply to every list.

**Input fields**

| Field | Type | What it does |
|---|---|---|
| `listSources` | array of strings | Adds the public X/Twitter list URLs or list IDs to collect from. |
| `maxItems` | integer | Stops after this many matching follower profiles. Leave it empty to collect all available profiles until the source is exhausted. |
| `minFollowers` | integer | Keeps profiles with at least this many followers. Leave it empty to skip this filter. |
| `maxFollowers` | integer | Keeps profiles with no more than this many followers. Leave it empty to skip this filter. |
| `verificationState` | string (`verified` or `unverified`) | Keeps verified or unverified profiles. Leave it empty to keep both. |
| `verificationTypes` | array of strings | Keeps profiles with one of the public verification type values you enter. Leave it empty to skip this filter. |
| `bioContains` | array of strings | Keeps profiles whose bio contains at least one entered word or phrase. Leave it empty to skip this filter. |
| `usernameContains` | array of strings | Keeps profiles whose username contains at least one entered word or phrase. Leave it empty to skip this filter. |
| `locationContains` | array of strings | Keeps profiles whose location contains at least one entered word or phrase. Leave it empty to skip this filter. |
| `websitePresence` | string (`has_website` or `no_website`) | Keeps profiles with a public website or profiles without one. Leave it empty to skip this filter. |
| `minFollowingCount` | integer | Keeps profiles following at least this many accounts. Leave it empty to skip this filter. |
| `maxFollowingCount` | integer | Keeps profiles following no more than this many accounts. Leave it empty to skip this filter. |
| `minPostCount` | integer | Keeps profiles with at least this many posts. Leave it empty to skip this filter. |
| `maxPostCount` | integer | Keeps profiles with no more than this many posts. Leave it empty to skip this filter. |
| `createdAfter` | date string (`YYYY-MM-DD`) | Keeps profiles created on or after this date. Dates are read in UTC. Leave it empty to skip this filter. |
| `createdBefore` | date string (`YYYY-MM-DD`) | Keeps profiles created on or before this date. Dates are read in UTC. Leave it empty to skip this filter. |

**Example input**

This example uses the public input from the successful current-beta default-input run:

```json
{
  "listSources": [
    "84839422"
  ],
  "maxItems": 100
}
```

#### 🧾 Output

The `dataset` output link opens the collected profiles in the default dataset and its `overview` view. One row is saved for each first eligible follower or subscriber profile. `userId`, `listId`, and `relationship` are required by the public dataset schema. Other fields can be omitted when the public source does not provide them.

**Follower profile row**

| Field | Type | What it does |
|---|---|---|
| `userId` | string | Public ID of the profile. |
| `username` | string | Public username without the `@` sign. |
| `displayName` | string | Name shown on the public profile. |
| `bio` | string | Public bio text from the profile. |
| `location` | string | Public location text from the profile. |
| `website` | URL | Public website URL on the profile. |
| `profileImageUrl` | URL | URL of the public profile image. |
| `createdAt` | date-time | Date and time when the account was created. |
| `followersCount` | integer | Public number of followers for the profile. |
| `followingCount` | integer | Public number of accounts followed by the profile. |
| `postCount` | integer | Public number of posts from the profile. |
| `mediaCount` | integer | Public number of media posts from the profile. |
| `likesCount` | integer | Public number of likes from the profile. |
| `verificationState` | string (`verified` or `unverified`) | Public verification state of the profile. |
| `verificationType` | string | Public verification type of the profile. |
| `bannerImageUrl` | URL | URL of the public profile banner image. |
| `pinnedPostIds` | array of strings | Public IDs of posts pinned to the profile. |
| `professionalType` | string | Public professional account classification. |
| `profileLanguage` | string | Public language value for the profile. |
| `affiliateLabel` | string | Public label showing the profile's affiliate relationship, when provided. |
| `listId` | string | Public ID of the list that supplied this profile. |
| `listUrl` | URL | Public URL of the list that supplied this profile. |
| `relationship` | string (`follower` or `subscriber`) | The profile's relationship to the source list. |

**Genuine row from a successful current-beta run**

```json
{
  "userId": "275227815",
  "username": "Kimberlyanncol2",
  "displayName": "Kimberly Ann COllins",
  "createdAt": "2011-03-31T21:43:43.000Z",
  "listId": "84839422",
  "listUrl": "https://x.com/i/lists/84839422",
  "relationship": "subscriber",
  "bio": "in the now!",
  "location": "Georgia, USA",
  "website": "https://t.co/8hqibfqPRZ",
  "profileImageUrl": "https://pbs.twimg.com/profile_images/893844982309801985/lUUar3Aw_normal.jpg",
  "followersCount": 606,
  "followingCount": 4088,
  "postCount": 2043,
  "mediaCount": 60,
  "likesCount": 229,
  "verificationState": "unverified",
  "bannerImageUrl": "https://pbs.twimg.com/profile_banners/275227815/1644166015",
  "pinnedPostIds": [
    "2066477107002134663"
  ],
  "professionalType": "Creator",
  "profileLanguage": "en"
}
```

#### 💳 Pricing

This Actor uses pay-per-event pricing. One successfully collected public follower profile saved to the dataset is one billable event. The current price is shown in the Apify Console.

#### 🔌 Integrations

Use the Apify Console or API to start runs and read the default dataset after a run. The dataset can be exported with the formats available in Apify.

https://www.youtube.com/watch?v=bNACk1\_S\_6w\&list=PLObrtcm1Kw6MUrlLNDbK9QRg8VDJg0gOW\&index=4

#### ❓ FAQ

##### What happens if one profile appears in more than one list?

The Actor saves the first eligible occurrence and ignores later duplicates. The saved row keeps the list ID, list URL, and relationship from that first match.

##### Will the Actor keep reading pages when filters remove profiles?

Yes. It continues through later source pages when needed to reach the maximum profile count, even when earlier profiles do not pass the filters.

##### Can I mix list URLs and list IDs?

Yes. Add one or more public X/Twitter list URLs or IDs in `listSources` and mix both forms.

##### What does an empty Maximum profiles value do?

It returns all available matching profiles until the source is exhausted. There is no fixed upper limit in the public input schema.

##### Which lists can I use?

Use public X/Twitter lists that the source makes accessible. Private, restricted, or unavailable lists are not included.

##### What does the relationship field mean?

It shows whether the profile is a `follower` or a `subscriber` of the source list.

##### Are all profile fields always present?

No. Fields such as a website, verification type, affiliate label, or public counts can be omitted when the source does not provide them.

##### Do I need an X login or API key?

No. The Actor collects publicly accessible list data without requiring you to authenticate to X.

### 📝 Changelog

**v0.0** (16-09-2026)

- Initial release.

### 🆘 Support

For issues, questions, or feature requests, [file a ticket](https://console.apify.com/actors/maximedupre~twitter-list-followers-scraper/issues) and I'll fix or implement it in less than 24h 🫡

### 🔗 Related Actors

- **[Twitter Scraper](https://apify.com/maximedupre/twitter-scraper)**: Collect public X posts, profile matches, network members, and trends for broader X research.
- **[Twitter Organization Affiliates Scraper](https://apify.com/maximedupre/twitter-organization-affiliates-scraper)**: Export public accounts linked to verified X/Twitter organizations.
- **[Twitter List Followers Scraper](https://apify.com/powerai/twitter-list-followers-scraper)**: Fetch follower profiles from a public Twitter list with another focused Actor.
- **[Twitter X List Followers Scraper](https://apify.com/igview-owner/twitter-x-list-followers)**: Extract public follower profiles from a Twitter/X list.
- **[X Follower Scraper | $0.15/1K Profiles | Pay-Per-Result](https://apify.com/xquik/x-follower-scraper)**: Collect X followers, following, list members, subscribers, and community members.

**Made with ❤️ by Maxime Dupré**

# Actor input Schema

## `listSources` (type: `array`):

Add one or more public X/Twitter list URLs or list IDs. You can mix URLs and IDs in one run.

## `maxItems` (type: `integer`):

Stop after this many matching follower profiles. If you leave it empty, the run collects all available profiles until the source is exhausted.

## `minFollowers` (type: `integer`):

Keep profiles with at least this many followers. Leave it empty to skip this filter.

## `maxFollowers` (type: `integer`):

Keep profiles with no more than this many followers. Leave it empty to skip this filter.

## `verificationState` (type: `string`):

Keep profiles that are verified or unverified. Leave it empty to keep both.

## `verificationTypes` (type: `array`):

Keep profiles with one of these public verification type values. Enter the values used by the source. Leave it empty to skip this filter.

## `bioContains` (type: `array`):

Keep profiles whose bio contains at least one of these words or phrases. Leave it empty to skip this filter.

## `usernameContains` (type: `array`):

Keep profiles whose username contains at least one of these words or phrases. Leave it empty to skip this filter.

## `locationContains` (type: `array`):

Keep profiles whose location contains at least one of these words or phrases. Leave it empty to skip this filter.

## `websitePresence` (type: `string`):

Keep profiles with a public website or profiles without one. Leave it empty to skip this filter.

## `minFollowingCount` (type: `integer`):

Keep profiles following at least this many accounts. Leave it empty to skip this filter.

## `maxFollowingCount` (type: `integer`):

Keep profiles following no more than this many accounts. Leave it empty to skip this filter.

## `minPostCount` (type: `integer`):

Keep profiles with at least this many posts. Leave it empty to skip this filter.

## `maxPostCount` (type: `integer`):

Keep profiles with no more than this many posts. Leave it empty to skip this filter.

## `createdAfter` (type: `string`):

Keep profiles created on or after this date. Use YYYY-MM-DD. Dates are read in UTC. Leave it empty to skip this filter.

## `createdBefore` (type: `string`):

Keep profiles created on or before this date. Use YYYY-MM-DD. Dates are read in UTC. Leave it empty to skip this filter.

## Actor input object example

```json
{
  "listSources": [
    "84839422"
  ],
  "maxItems": 100
}
```

# Actor output Schema

## `dataset` (type: `string`):

Open the collected follower profiles in the default dataset.

# API

You can run this Actor programmatically using our API. Below are code examples in JavaScript, Python, and CLI, as well as the OpenAPI specification and MCP server setup.

## JavaScript example

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

// Initialize the ApifyClient with your Apify API token
// Replace the '<YOUR_API_TOKEN>' with your token
const client = new ApifyClient({
    token: '<YOUR_API_TOKEN>',
});

// Prepare Actor input
const input = {
    "listSources": [
        "84839422"
    ],
    "maxItems": 100
};

// Run the Actor and wait for it to finish
const run = await client.actor("maximedupre/twitter-list-followers-scraper").call(input);

// Fetch and print Actor results from the run's dataset (if any)
console.log('Results from dataset');
console.log(`💾 Check your data here: https://console.apify.com/storage/datasets/${run.defaultDatasetId}`);
const { items } = await client.dataset(run.defaultDatasetId).listItems();
items.forEach((item) => {
    console.dir(item);
});

// 📚 Want to learn more 📖? Go to → https://docs.apify.com/api/client/js/docs

```

## Python example

```python
from apify_client import ApifyClient

# Initialize the ApifyClient with your Apify API token
# Replace '<YOUR_API_TOKEN>' with your token.
client = ApifyClient("<YOUR_API_TOKEN>")

# Prepare the Actor input
run_input = {
    "listSources": ["84839422"],
    "maxItems": 100,
}

# Run the Actor and wait for it to finish
run = client.actor("maximedupre/twitter-list-followers-scraper").call(run_input=run_input)

# Fetch and print Actor results from the run's dataset (if there are any)
print(f"💾 Check your data here: https://console.apify.com/storage/datasets/{run.default_dataset_id}")
for item in client.dataset(run.default_dataset_id).iterate_items():
    print(item)

# 📚 Want to learn more 📖? Go to → https://docs.apify.com/api/client/python/docs/quick-start

```

## CLI example

```bash
echo '{
  "listSources": [
    "84839422"
  ],
  "maxItems": 100
}' |
apify call maximedupre/twitter-list-followers-scraper --silent --output-dataset

```

## MCP server setup

```json
{
    "mcpServers": {
        "apify": {
            "type": "http",
            "url": "https://mcp.apify.com/?tools=fetch-actor-details,maximedupre/twitter-list-followers-scraper"
        }
    }
}
```

The hosted server signs you in with OAuth on first connect, so no API token belongs in this config. Clients without OAuth support can send an `Authorization: Bearer <APIFY_API_TOKEN>` header instead, using a token from API & Integrations in Apify Console (https://console.apify.com/settings/integrations).

## OpenAPI specification

Download the OpenAPI definition: https://api.apify.com/v2/actors/6Msg1d4qhZ833K8qU/builds/Mhd4KMw0ItimD09Y9/openapi.json
