# X (Twitter) Profile Scraper: Followers & Latest Posts (`precious_bathmat/x-twitter-scraper`) Actor

Scrape X (Twitter) profiles without login: followers, following, post count, bio, website, join date and verification, plus the latest posts with views, likes, replies, reposts, quotes and bookmarks, and any post by link. No API key.

- **URL**: https://apify.com/precious_bathmat/x-twitter-scraper.md
- **Developed by:** [Mariam Ahmed](https://apify.com/precious_bathmat) (community)
- **Categories:** Social media, Marketing
- **Stats:** 2 total users, 1 monthly users, 100.0% runs succeeded, 0 bookmarks
- **User rating**: No ratings yet

## Pricing

from $3.00 / 1,000 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

## X (Twitter) Profile Scraper: Followers & Latest Posts

Scrape **X (Twitter) profiles** without logging in. For every profile you get **followers, following, total posts, bio, website, location, join date and verification type** (blue, business, government), plus its **latest posts** with **views, likes, replies, reposts, quotes and bookmarks**. From those posts the scraper works out each profile's **median views, median likes, engagement rate and posting pace**. Paste any post link to get the same numbers for single posts.

- **Profiles**: followers, following, post count, bio, website and bio links, location, join date, verified type, protected flag, avatar and banner
- **Latest posts**: the 5 newest original posts X shows without login, plus the pinned post
- **Every post's numbers**: views, likes, replies, reposts, quotes, bookmarks and engagement rate; text (long posts in full), media type and images, links, hashtags, mentions, reply, quote, poll and live flags
- **Profile benchmarks**: median views, likes, replies and reposts, median engagement rate, posts per day (recent and all-time), last posted
- **Single posts by link**, x.com or twitter.com
- **No login, no cookies, no API key, no proxy**: reads the same public pages anyone can open

### What does this X scraper do?

```
@NASA        92,326,591 followers · median 940,451 views · 2,037 likes · Government
@AnthropicAI  1,787,831 followers · median 426,411 views · 1.15% engagement
@Reuters     26,418,340 followers · 1,401,254 posts · about 196 a day since 2007
```

1. Add **profiles** (`@NASA`, `NASA` or the profile address) and/or **post addresses**.
2. The scraper opens each public profile page and post page, the way a logged-out visitor sees them.
3. You get **one row per profile** in the dataset (with its latest posts inside) and **every post** in `POSTS`.

```mermaid
flowchart LR
    A[Profiles ·<br/>post links] --> B[Public profile page]
    A --> C[Public post page]
    B --> D[Profile row<br/>followers, bio, verified<br/>+ median views, engagement]
    B --> E[Latest posts<br/>views, likes, reposts]
    C --> E
```

### Who is it for?

- **Marketers and agencies** benchmarking brands and competitors: followers, typical views and engagement
- **Influencer and PR teams** checking an account's real reach before working with it
- **Journalists and researchers** collecting public numbers for news outlets, companies, agencies and public figures
- **Lead generation**: websites, bio links and verified business accounts
- **Monitoring**: a daily follower and engagement history for a list of accounts

### What data do you get?

**Profiles** (dataset, one row per profile; also `PROFILES_CSV`)

| Field | What it tells you |
|---|---|
| `username`, `name`, `userId`, `profileUrl`, `avatar`, `banner` | The account |
| `followers`, `following`, `posts` | Counts |
| `bio`, `website`, `bioLinks`, `location`, `joinedAt` | Profile details |
| `isBlueVerified`, `verifiedType`, `isProtected`, `businessAffiliates` | Verification (Business, Government), protected, affiliated accounts |
| `latestPostsRead`, `medianViews`, `medianLikes`, `medianReplies`, `medianReposts`, `medianEngagementRate` | From the latest posts, pinned post left out |
| `postsPerDayRecent`, `postsPerDayAllTime`, `lastPostedAt` | Posting pace and activity |
| `pinnedPostId`, `latestPosts` | The pinned post and the latest posts in full |

**Posts** (`POSTS`, every post; also `POSTS_CSV`)

| Field | What it tells you |
|---|---|
| `url`, `postId`, `author`, `authorName`, `authorFollowers` | The post and who posted it |
| `text`, `createdAt`, `language` | What and when (long posts in full) |
| `views`, `likes`, `replies`, `reposts`, `quotes`, `bookmarks` | How it performed |
| `engagementRate` | (likes + replies + reposts + quotes) ÷ views, in % |
| `mediaType`, `media` | Photo, video or GIF, with image addresses and alt text |
| `links`, `hashtags`, `mentions` | Links (expanded), hashtags and accounts mentioned |
| `isPinned`, `isReply`, `isQuote`, `quotedPostId`, `isLongPost`, `hasPoll`, `isLiveBroadcast` | What kind of post it is |

### Example: 11 October 2026

**19 profiles and 91 posts in 31 seconds**, every page read on the first try.

| Profile | Followers | Median views (latest posts) | Median likes | Engagement |
|---|---|---|---|---|
| @elonmusk | 241,502,944 | 2,251,518 | 16,598 | 0.71% |
| @NASA | 92,326,591 | 940,451 | 2,037 | 0.21% |
| @nytimes | 53,877,232 | 537,203 | 548 | 0.21% |
| @OpenAI | 5,424,613 | 4,183,393 | 7,089 | 0.45% |
| @AnthropicAI | 1,787,831 | 426,411 | 4,227 | 1.15% |
| @espn | 58,635,067 | 315,158 | 4,526 | 1.28% |
| @Reuters | 26,418,340 | 31,103 | 6 | 0.05% |

- **Followers are not reach**: OpenAI has 5.4 million followers and a median of 4.2 million views per recent post; Reuters has 26 million and a median of 31,000.
- The most viewed post in the run had **22.2 million views**.

### Pricing

**$0.003 per profile** and **$0.0005 per post**.

- 1,000 profiles with their latest posts (about 5,500 posts): **about $5.75**
- 1,000 profiles without posts: **$3**
- The run above: 19 profiles and 91 posts, **$0.10**

Profiles and posts that cannot be read (wrong name, deleted, suspended) are not charged.

### Good to know

- **What X shows without login**: a profile's 5 newest original posts (no replies or reposts) and its pinned post. It is a current snapshot, not a full history. Search, hashtags, replies, media tabs, followers lists and trends need a login on X and are not available.
- **Older posts** (before views were counted, around December 2022) have no view count; their engagement rate is left empty.
- **Post links** give that post only: replies under it come from other people and are not collected.
- **Medians** leave the pinned post out, since it is often old and much bigger than the rest.
- **Personal data**: public account numbers and posts only. Birthdates, followers, followings and repliers are never collected. Use it for public accounts (brands, media, organisations, public figures) and follow the data protection rules that apply to you.
- No login, no cookies, no proxies needed.

### Input

| Field | Meaning |
|---|---|
| **Profiles** | Usernames or profile addresses, one per line |
| **Latest posts** | On by default |
| **Include the pinned post** | On by default |
| **Post addresses** | Single posts, x.com or twitter.com |

### Integrations

Export to JSON, CSV, Excel or Google Sheets, or connect through the Apify API, webhooks, Make, Zapier and n8n. Schedule it daily on a list of accounts to track followers and engagement over time.

# Actor input Schema

## `profiles` (type: `array`):

One per line: "@NASA", "NASA" or the profile address (x.com/NASA or twitter.com/NASA).

## `latestPosts` (type: `boolean`):

Also get each profile's latest posts as X shows them without login (its 5 newest original posts, plus the pinned one), with views, likes, replies, reposts, quotes and bookmarks.

## `includePinnedPost` (type: `boolean`):

Keep the pinned post among the latest posts. It is never counted in the medians.

## `postUrls` (type: `array`):

Optional. Single posts, one per line: x.com/user/status/123... or twitter.com/user/status/123...

## Actor input object example

```json
{
  "profiles": [
    "@NASA",
    "@nytimes"
  ],
  "latestPosts": true,
  "includePinnedPost": true
}
```

# Actor output Schema

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

One row per profile: followers, following, posts, bio, website, verification and median views and engagement of the latest posts.

## `posts` (type: `string`):

Every post: text, date, views, likes, replies, reposts, quotes, bookmarks, media, links and hashtags.

## `profilesCsv` (type: `string`):

Profiles as a spreadsheet.

## `postsCsv` (type: `string`):

Posts as a spreadsheet.

## `summary` (type: `string`):

Counts and notes.

# 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 = {
    "profiles": [
        "@NASA",
        "@nytimes"
    ]
};

// Run the Actor and wait for it to finish
const run = await client.actor("precious_bathmat/x-twitter-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 = { "profiles": [
        "@NASA",
        "@nytimes",
    ] }

# Run the Actor and wait for it to finish
run = client.actor("precious_bathmat/x-twitter-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 '{
  "profiles": [
    "@NASA",
    "@nytimes"
  ]
}' |
apify call precious_bathmat/x-twitter-scraper --silent --output-dataset

```

## MCP server setup

```json
{
    "mcpServers": {
        "apify": {
            "type": "http",
            "url": "https://mcp.apify.com/?tools=fetch-actor-details,precious_bathmat/x-twitter-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/0C1hSmGCMROpalxeJ/builds/tegpAyQjSrKBLNIHr/openapi.json
