# X (Twitter) Profile Scraper - No Login, With Latest Posts (`benthepythondev/x-profile-scraper`) Actor

Scrape X (Twitter) profiles without login, cookies or API key: name, bio, location, website, followers, following, post count, verification, join date, profile and banner pictures, plus the latest posts a visitor sees with likes, reposts, replies, views and media. JSON/CSV.

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

## Pricing

from $1.60 / 1,000 results

This Actor is paid per event. You are not charged for the Apify platform usage, but only a fixed price for specific events.
Since this Actor supports Apify Store discounts, the price gets lower the higher subscription plan you have.

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 (No Login, With Latest Posts)

Give X handles or profile links and get one clean row per profile: name, bio, location, website, followers, following, post count, verification, join date, profile and banner pictures, plus the latest posts X shows a visitor with likes, reposts, replies, views and media. No X account, no cookies, no X API key. Export to JSON/CSV/Excel, run on a schedule, call via API, or connect to Make, Zapier or n8n.

**What a run costs:** $0.0004 per saved profile on the Free plan, $0.00038 on Bronze, $0.00036 on Silver and $0.00034 from Gold up, plus $0.00005 per run start. The latest posts come with the profile at no extra charge. Accounts that do not exist, suspended accounts and entries that are no handle are not charged.

### 🔎 What is the X Profile Scraper?

It reads X the way a logged-out visitor does: the profile record X serves to every visitor and the posts on the public profile page, each completed with its full counts. Nothing is done with an account of yours.

#### What data does it extract?

- **Identity:** `id`, `userName`, `name`, `url`, `description`, `location`, `website`, `createdAt`, `birthdate` (when public)
- **Reach:** `followers`, `following`, `statusesCount`, `subscribersCount`, `highlightedPostsCount`
- **Status:** `isBlueVerified`, `verifiedType` (Business, Government), `affiliation`, `isProtected`
- **Pictures:** `profilePicture` (400×400), `coverPicture`
- **Latest posts:** `latestPosts[]` with `id`, `url`, `text`, `createdAt`, `likeCount`, `retweetCount`, `replyCount`, `quoteCount`, `bookmarkCount`, `viewCount`, `hashtags`, `mentions`, `urls`, `media[]` (photo or video, video file link, alt text), `isQuote`, `isRepost`

### ⬇️ Input

| Field | Type | Description |
|---|---|---|
| `handles` | array | Handles (`NASA`, `@NASA`) or profile links (`https://x.com/NASA`, twitter.com works too) |
| `includeLatestPosts` | boolean | Add the posts the profile page shows a visitor (default on) |
| `maxItems` | integer | Stop after this many profiles (default 1000) |

`usernames`, `twitterHandles`, `profileUrls`, `urls` and `startUrls`, the names other X Actors use, are accepted too.

#### Example input

```json
{
  "handles": ["NASA", "@SpaceX", "https://x.com/BillGates"],
  "includeLatestPosts": true
}
```

### ⬆️ Output

One row per profile (shortened):

```json
{
  "type": "user",
  "id": "11348282",
  "userName": "NASA",
  "name": "NASA",
  "url": "https://x.com/NASA",
  "description": "Making the seemingly impossible, possible. ✨",
  "location": "Pale Blue Dot",
  "website": "http://www.nasa.gov/",
  "followers": 92325783,
  "following": 115,
  "statusesCount": 74418,
  "isBlueVerified": true,
  "verifiedType": "Government",
  "createdAt": "2007-12-19T20:20:32Z",
  "profilePicture": "https://pbs.twimg.com/profile_images/1321163587679784960/0ZxKlEKB_400x400.jpg",
  "latestPosts": [
    {
      "id": "2109320622882873464",
      "text": "While observing the universe, @NASAHubble caught a galaxy cluster smiling for the camera. 😊 …",
      "createdAt": "2026-10-11T16:30:00Z",
      "likeCount": 19488,
      "retweetCount": 3532,
      "replyCount": 716,
      "viewCount": 2020348,
      "media": [{ "type": "photo", "url": "https://pbs.twimg.com/media/…jpg" }]
    }
  ]
}
```

Field names follow the most used X profile Actors (`userName`, `followers`, `following`, `statusesCount`, `isBlueVerified`, `profilePicture`, `coverPicture`, `createdAt`), so you can switch without rewriting your code.

### 💡 Use cases

- 🎯 **Influencer research:** audience size, verification and how the latest posts perform.
- 🧾 **Account checks:** does a handle exist, is it verified, when was it created, where does it link.
- 📈 **Follower tracking:** schedule it and watch `followers` and `statusesCount` change.
- 🗂️ **Lead enrichment:** add bio, website and location to a list of X handles.

### 🤖 For AI agents

```json
{ "handles": ["NASA"], "includeLatestPosts": true }
```

One input field, no credentials.

### 📏 Limits

- **Latest posts:** X shows a logged-out visitor the 5 to 11 newest posts of a profile (pinned and reposts included). Older posts, the replies and media tabs need a login and are not read.
- **No search, no followers lists:** both need an X account.
- **Protected accounts:** the profile row is saved, its posts are not public.
- **Suspended or withheld accounts** are listed in the key-value record `NOT_SAVED` and not charged.

### ❓ FAQ

**Do I need an X account, cookies or an X API key?** No.

**Why only the latest few posts?** That is what X shows a visitor who is not logged in. For single posts by link use the [X Post Scraper](https://apify.com/benthepythondev/x-post-scraper).

**Are follower counts exact?** Yes, X sends exact numbers (92,325,783, not "92.3M").

**How fast is it?** Five profiles at a time; a profile with its posts takes a few seconds.

**Is it legal?** It reads what X shows every visitor, without logging in. Respect GDPR and X's terms in how you use personal data, and do not use it for spam.

### 🔗 You might also like

- [X (Twitter) Post Scraper](https://apify.com/benthepythondev/x-post-scraper)
- [Threads Profile Scraper](https://apify.com/benthepythondev/threads-profile-scraper)
- [Instagram Profile Scraper](https://apify.com/benthepythondev/instagram-profile-scraper)

**Keywords:** X profile scraper, Twitter profile scraper, Twitter scraper no login, X scraper no API key, Twitter followers count, X user data, Twitter account checker, Twitter profile to JSON, X influencer research, Twitter bio scraper, latest tweets scraper, Twitter verification check

# Actor input Schema

## `handles` (type: `array`):

X handles (NASA or @NASA) or profile links (https://x.com/NASA, twitter.com links work too). One row per profile.

## `includeLatestPosts` (type: `boolean`):

Adds the posts X shows a logged-out visitor on the profile (usually 5 to 11, newest first) with full counts and media. No extra charge.

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

Stops after this many profiles. Only saved profiles are charged.

## Actor input object example

```json
{
  "handles": [
    "NASA",
    "https://x.com/elonmusk"
  ],
  "includeLatestPosts": true,
  "maxItems": 1000
}
```

# Actor output Schema

## `results` (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 = {
    "handles": [
        "NASA",
        "https://x.com/elonmusk"
    ]
};

// Run the Actor and wait for it to finish
const run = await client.actor("benthepythondev/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 = { "handles": [
        "NASA",
        "https://x.com/elonmusk",
    ] }

# Run the Actor and wait for it to finish
run = client.actor("benthepythondev/x-profile-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 '{
  "handles": [
    "NASA",
    "https://x.com/elonmusk"
  ]
}' |
apify call benthepythondev/x-profile-scraper --silent --output-dataset

```

## MCP server setup

```json
{
    "mcpServers": {
        "apify": {
            "type": "http",
            "url": "https://mcp.apify.com/?tools=fetch-actor-details,benthepythondev/x-profile-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/Z7jiWaD37l9zmwwx8/builds/nFxBQBmOD0GTXLMSc/openapi.json
