# Twitter (X) Profile Scraper | Bulk User Data, Followers & Bio (`ecomdate/x-profile-scraper`) Actor

Scrape public X (Twitter) profiles in bulk — no login or API key. Get followers, following, bio, tweet & media counts, verification, join date & avatar as clean JSON.

- **URL**: https://apify.com/ecomdate/x-profile-scraper.md
- **Developed by:** [Ecomdate Tech](https://apify.com/ecomdate) (community)
- **Categories:** Social media, Developer tools, Lead generation
- **Stats:** 8 total users, 6 monthly users, 100.0% runs succeeded, 0 bookmarks
- **User rating**: No ratings yet

## Pricing

from $1.00 / 1,000 profile scrapeds

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/platform/actors/running/actors-in-store#pay-per-event

## What's an Apify Actor?

Actors are web data automations that power AI and operations. They run on the Apify platform to scrape websites, process data, connect APIs, and automate workflows.
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.
Actors are written with capital "A".

## 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.
The best way to integrate Actors is as follows.

- **AI agents and MCP clients** — the [Apify MCP server](https://docs.apify.com/integrations/mcp.md) at `https://mcp.apify.com` (remote, streamable HTTP, OAuth on first use).
- **Agentic workflows and local Actor development** — [Agent Skills](https://apify.com/.well-known/agent-skills/index.json) with the [Apify CLI](https://docs.apify.com/cli/docs.md): `npm install -g apify-cli`, then `apify login`.
- **JavaScript/TypeScript projects** — the official [JS/TS client](https://docs.apify.com/api/client/js/docs.md): `npm install apify-client`.
- **Python projects** — the official [Python client](https://docs.apify.com/api/client/python/docs.md): `pip install apify-client`.
- **Any other language** — the [REST API](https://docs.apify.com/api/v2.md).

For usage examples, see the [API](#api) section below.

For more details, see Apify documentation as [Markdown index](https://docs.apify.com/llms.txt) and [Markdown full-text](https://docs.apify.com/llms-full.txt).

# README

Scrape **X (Twitter) profiles in bulk** — followers, following, tweet counts, bio, verification, join date, avatar and more. Paste a list of handles and get clean, structured JSON ready for lead lists, competitor research, or enrichment. **No Twitter login or API key needed on your end.**

### Features

- 🔎 **Bulk profile lookup** — pass hundreds of handles in one run
- 📊 **Full metrics** — followers, following, tweets & media counts
- 🪪 **Identity & status** — display name, user ID, X Blue verification, protected flag, account status
- 📝 **Profile details** — bio, location, account creation date, avatar & header image, pinned tweet IDs
- 🌍 **Optional About data** — account country, join source, affiliate
- 🔗 **Flexible input** — accepts `@handle`, `handle`, or full `https://x.com/handle` URLs
- ✅ **Clean output** — camelCase fields, ISO-8601 dates, one row per profile, easy CSV/Excel export
- 🚫 **Graceful errors** — non-existent or suspended accounts return a row with a `status` field instead of being dropped

### How it works

1. You provide a list of usernames (or profile URLs).
2. The Actor looks up each profile and returns a structured record.
3. If **Include About details** is on, it fetches each profile's About section too.
4. Results stream into the dataset as they're scraped — export to JSON, CSV, Excel, or pull via API.

### Input

| Field | Type | Required | Default | Description |
|---|---|---|---|---|
| `usernames` | Array\<String> | Yes | – | Handles or profile URLs. Accepts `@handle`, `handle`, or `https://x.com/handle`. |
| `includeAbout` | Boolean | No | `false` | Also fetch each profile's About section (1 extra request per profile, billed separately). |
| `maxItems` | Integer | No | `0` | Cap the number of profiles (`0` = no limit). |

#### Example input

```json
{
  "usernames": ["elonmusk", "@apify", "https://x.com/github"],
  "includeAbout": false,
  "maxItems": 0
}
```

### Output

One record per profile. Example:

```json
{
  "inputUsername": "elonmusk",
  "status": "active",
  "userId": "44196397",
  "username": "elonmusk",
  "name": "Elon Musk",
  "description": "Starmind",
  "location": null,
  "followers": 240761641,
  "following": 1367,
  "tweetsCount": 105390,
  "mediaCount": 4597,
  "verified": true,
  "protected": false,
  "createdAt": "2009-06-02T20:12:29+00:00",
  "avatar": "https://pbs.twimg.com/profile_images/...",
  "headerImage": "https://pbs.twimg.com/profile_banners/...",
  "profileUrl": "https://x.com/elonmusk",
  "scrapedAt": "2026-07-09T12:00:00+00:00"
}
```

| Field | Meaning |
|---|---|
| `status` | `active`, `notfound`, `suspended`, or `protected` |
| `followers` / `following` | Follower and following counts |
| `tweetsCount` / `mediaCount` | Number of posts and media items |
| `verified` | X Blue / verified badge |
| `createdAt` / `scrapedAt` | ISO-8601 timestamps |
| `profileUrl` / `avatar` / `headerImage` | Source URLs for verification & media |

### Use cases

- **Lead generation** — enrich a list of prospects with follower counts and bios
- **Competitor & influencer research** — compare audience size and activity across accounts
- **Audience analysis** — snapshot metrics for a set of accounts over time
- **Data enrichment** — add X profile data to an existing CRM or spreadsheet

### Pricing

Pay-per-event, so you only pay for what you scrape:

- **Profile Scraped** — **$0.001 per profile** ($1 per 1,000 profiles)
- **About Details Enriched** — **$0.0005 per profile** (only when *Include About details* is enabled)

With Apify's Free plan ($5 in monthly credits) you can scrape roughly **5,000 profiles per month for free** — and there are **no separate compute or platform fees**, the per-profile price above is all you pay.

### FAQ

**Do I need a Twitter/X login or API key?**
No. Just paste the handles — the Actor handles data access for you.

**What happens with accounts that don't exist or are suspended?**
You still get a row for that input, with `status` set to `notfound` / `suspended`, so your results line up 1:1 with your input list.

**Can I input profile URLs instead of handles?**
Yes — `@handle`, `handle`, and `https://x.com/handle` all work. Duplicates are removed automatically.

**How many profiles can I scrape?**
There's no hard limit — use `maxItems` to cap a run. For very large lists, run in batches and monitor your spend.

**Is the data accurate / up to date?**
Data reflects the profile at scrape time (`scrapedAt`). Metrics like follower counts change constantly.

**Is scraping X legal?**
This Actor collects only publicly available profile data. You are responsible for using it in compliance with X's Terms and applicable laws (e.g. GDPR) in your jurisdiction.

### Support

Found a bug or need another field/endpoint? Open an issue on the Actor's **Issues** tab — feedback is welcome and shapes the roadmap.

***

**Need more?** Looking for follower lists or keyword/hashtag tweet search? Check out the other X (Twitter) scrapers from this developer.

# Actor input Schema

## `usernames` (type: `array`):

X/Twitter handles or profile URLs to scrape. Accepts '@handle', 'handle', or 'https://x.com/handle'.

## `includeAbout` (type: `boolean`):

Also fetch each profile's About section (account country, source, affiliate). Makes 1 extra request per profile and is billed separately.

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

Maximum number of profiles to scrape (0 = no limit). Protects your API usage and spend.

## Actor input object example

```json
{
  "usernames": [
    "elonmusk",
    "apify"
  ],
  "includeAbout": false,
  "maxItems": 0
}
```

# Actor output Schema

## `profiles` (type: `string`):

No description

# 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 = {
    "usernames": [
        "elonmusk",
        "apify"
    ]
};

// Run the Actor and wait for it to finish
const run = await client.actor("ecomdate/x-profile-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 = { "usernames": [
        "elonmusk",
        "apify",
    ] }

# Run the Actor and wait for it to finish
run = client.actor("ecomdate/x-profile-scraper").call(run_input=run_input)

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

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

```

## CLI example

```bash
echo '{
  "usernames": [
    "elonmusk",
    "apify"
  ]
}' |
apify call ecomdate/x-profile-scraper --silent --output-dataset

```

## MCP server setup

```json
{
    "mcpServers": {
        "apify": {
            "command": "npx",
            "args": [
                "mcp-remote",
                "https://mcp.apify.com/?tools=ecomdate/x-profile-scraper",
                "--header",
                "Authorization: Bearer <YOUR_API_TOKEN>"
            ]
        }
    }
}

```

## OpenAPI specification

Download the OpenAPI definition: https://api.apify.com/v2/acts/NybXzfVgX86L0dqCy/builds/tNMW9fVC0rbCbtNRE/openapi.json
