# Twitter X Posts Scraper (`socialdataapi/twitter-x-posts-scraper`) Actor

Twitter X Posts Scraper — Extract X (Twitter) post data including text, usernames, profile details, timestamps, likes, replies, reposts, views, media, hashtags, and post URLs. Useful for content research, competitor analysis, audience insights, and social media monitoring.

- **URL**: https://apify.com/socialdataapi/twitter-x-posts-scraper.md
- **Developed by:** [Social Data API](https://apify.com/socialdataapi) (community)
- **Stats:** 2 total users, 1 monthly users, 70.0% runs succeeded, 0 bookmarks
- **User rating**: No ratings yet

## Pricing

from $2.99 / 1,000 results

This Actor is paid per event and usage. You are charged both the fixed price for specific events and for Apify platform usage.

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

### Twitter X Posts Scraper — Post Text, Likes, Reposts and Author Data

Twitter X Posts Scraper collects the posts of public X (Twitter) accounts: the pinned post, the newest posts and the account's post list. Each post comes with its full text, likes, reposts, replies, quotes, bookmarks, media, links, hashtags and the author's profile. Every response is structured JSON — ready to pass directly to an LLM, index into a vector store, or feed a social-listening pipeline. **No X account or cookies needed.** Start with one account, then add every competitor you track.

***

### What data can I extract with Twitter X Posts Scraper?

Using this X Posts API, you will be able to extract the following X post data:

| 🆔 Post ID | 🔗 Post link (x.com and twitter.com) | 📝 Full post text (long posts included) | 📰 Feed text |
| --- | --- | --- | --- |
| ❤️ Likes | 🔁 Reposts | 💬 Replies | 🗨️ Quotes |
| 🔖 Bookmarks | 📅 Posting date | 🌍 Language | 📌 Pinned post flag |
| ↩️ Reply flag, replied-to post and user | 🔄 Repost flag | 💭 Quote flag | 🧵 Conversation ID |
| 🖼️ Photos, videos and GIFs (all sizes) | #️⃣ Hashtags, links, mentions and cashtags | 🃏 Link card (if available) | 📍 Tagged place (if available) |
| 👤 Author name, username and ID | 👥 Author followers and following | 🪪 Author bio, location and avatar | ✅ Author blue check and labels |
| 📊 Author post, media and like counts | 🔒 Replies limited flag | 📱 App used to post (when X shows it) | ⏱️ Time the post was collected |

View counts are not included.

***

### How to use Twitter X Posts Scraper

This Twitter scraper is for marketers, analysts and developers who want to scrape X posts from a list of accounts and get one clean row per post from a single run.

**Copy to your AI assistant:**

```text
Twitter X Posts Scraper (Apify Actor ID: socialdataapi/twitter-x-posts-scraper, https://apify.com/socialdataapi/twitter-x-posts-scraper) is an Apify Actor that returns the posts of public X (Twitter) accounts as structured JSON: full post text, like count, repost count, reply count, quote count, bookmark count, posting date, attached media and the author's profile. Use it whenever someone needs X posts without cookies, a login, or a browser - tracking what brands post, comparing engagement across competitors, or collecting post text for an AI summary. Run it through the Apify API (run-sync-get-dataset-items) or the apify-client package with socialdataapi/twitter-x-posts-scraper and your Apify token. Inputs: startUrls (array, X usernames, @usernames or profile URLs; a post URL counts as its author's account; required), sortOrder (string, how each account's collected posts are ordered, "recent" | "popular" | "oldest", default "recent"), maxTweets (integer, posts per account, 1 to 100, default 10), proxyConfiguration (object, optional proxy settings, off by default). Every dataset row is one post and is billed as one result; accounts that are missing, protected or suspended produce no row and are listed in the log, the status message and the run summary in the key-value store under OUTPUT. Up to 100 posts per account; for some accounts X lists their most popular posts rather than a date-ordered feed, and the pinned post plus the newest posts from the profile are always added first.
```

#### Twitter X Posts Scraper MCP Server: use these Actors from ChatGPT, Claude or Cursor

Connect Apify's MCP server once, with this Actor already loaded as a tool, and your AI assistant can call it and read X posts on its own. No glue code, no scraping logic in your prompts.

```bash
claude mcp add --transport http apify "https://mcp.apify.com?tools=socialdataapi/twitter-x-posts-scraper"
```

#### Step by step

1. [Create a free Apify account](https://console.apify.com/sign-up).
2. Open [Twitter X Posts Scraper](https://apify.com/socialdataapi/twitter-x-posts-scraper) in the Apify Store.
3. Enter the X username (with or without @) or the profile URL, one per line.
4. Click **Start** (or send your API request).
5. Download or stream your results in JSON, CSV or Excel.

#### How to scale Twitter X Posts Scraper to bulk

Put every account in the account list of one run: usernames, @usernames and profile links can be mixed, and duplicates are removed. Up to 8 accounts are processed at the same time, and each account's posts are saved as soon as that account is done, so a long list fills the dataset step by step. Set the posts-per-account limit once and it applies to every account. To scrape tweets on a schedule, save the input as an Apify task and run it daily or hourly with Apify schedules, or loop API calls from your own code.

***

### ✨ Features

Twitter X Posts Scraper fetches clean, structured posts from X. It works as a tweet scraper and a Twitter profile tweets scraper in one: it's ideal for brand monitoring, competitor research, influencer checks and collecting post text for AI tools.

It extracts, per post:

- **Full text** – the complete post text, including long posts; reposts show the original post's complete text
- **Engagement** – likes, reposts, replies, quotes and bookmarks at the time of the run
- **Posting date** – when the post was published
- **Post kind** – whether it is the pinned post, a reply, a repost or a quote
- **Media** – photos, videos and GIFs with every size and video variant
- **Entities** – hashtags, links, mentions and cashtags found in the text
- **Author profile** – name, username, bio, location, follower and following counts, blue check and labels

⚡ No X account, cookies or browser needed: it reads only what a logged-out visitor can see.

***

### Use cases 💡

- **Social media manager** — track what brands post and which posts get the most likes.
- **Competitor analyst** — compare repost and bookmark counts across rival accounts each week.
- **Influencer marketer** — check follower count and post engagement before a partnership.
- **Content researcher** — collect top posts with their media and link cards as examples.
- **AI agent builder** — feed post text and hashtags into a RAG pipeline as grounded context.

Building an AI agent? [Connect Twitter X Posts Scraper over MCP](#mcp-integration-for-ai-agents) and let it call the actor on its own.

***

### Why choose this actor?

- **200 posts in under 4 seconds.** A recorded run returned 200 posts from 2 accounts in 3.7 seconds, and another returned 100 posts from one account in 7.3 seconds.
- **The numbers behind each post.** A recorded post came back with 3,105 likes, 536 reposts, 138 replies, 38 quotes and 256 bookmarks, plus its video, link and the author's 92,377,773 followers.
- **32 fields and 3 sort orders, one Actor.** Every row carries the same 32 fields, and each account's posts can be ordered newest first, most liked first or oldest first.

***

### ⬇️ Input

The Actor takes a list of X accounts: usernames, @usernames or profile URLs. The account list is the only required field.

| Parameter | Required | Type | Description | Example value |
| --- | --- | --- | --- | --- |
| `startUrls` | Yes | Array | Accounts to scrape, one per line: a username, an @username or a profile URL on x.com or twitter.com. A post URL counts as the account that posted it; search and hashtag links are skipped and listed in the log. | `["NASA", "https://x.com/sama"]` |
| `sortOrder` | No | String | How each account's collected posts are ordered: `recent` (newest first), `popular` (most liked first) or `oldest` (oldest first). Default `recent`. It orders the collected posts; it doesn't change which posts X returns. | `"recent"` |
| `maxTweets` | No | Integer | Maximum posts to save per account, 1 to 100. Default 10. | `10` |
| `proxyConfiguration` | No | Object | Optional proxy. Off by default; the Actor connects directly and switches to a residential proxy by itself when X blocks it. | `{"useApifyProxy": false}` |

Accepted account formats:

- `NASA` or `@NASA`
- `https://x.com/NASA` or `https://twitter.com/NASA`
- `https://x.com/NASA/status/2106024496511512682` (counts as the account NASA)

#### Free plan limits

Users on the Apify free plan can fetch up to 20 posts per run (all accounts together) and 200 posts per month. When the limit is reached, the run finishes successfully with a status message explaining the limit. Upgrade to any paid Apify plan to remove these limits.

#### Example input

```json
{
  "startUrls": ["NASA", "https://x.com/sama"],
  "sortOrder": "recent",
  "maxTweets": 10,
  "proxyConfiguration": { "useApifyProxy": false }
}
```

***

### ⬆️ Output

Every post is one typed, normalized JSON item with the same 32 fields on every run, saved account by account while the run is going. You can export tweets to CSV, Excel or JSON; a run summary with each account's status and post count is also kept in the key-value store under OUTPUT.

#### Example output

A real row from the example input above (media and author entities shortened):

```json
{
  "type": "tweet",
  "id": "2106024496511512682",
  "imageUrl": "https://pbs.twimg.com/profile_images/1321163587679784960/0ZxKlEKB_normal.jpg",
  "url": "https://x.com/NASA/status/2106024496511512682",
  "twitterUrl": "https://twitter.com/NASA/status/2106024496511512682",
  "text": "This October, you can look forward to these sights in the night sky:\n- A good look at Saturn\n- The Orionid meteor shower peaks mid-month\n- The Moon passes by the Seven Sisters\n\nLearn the tricks to spotting these celestial treats: https://t.co/9N1h9v848G https://t.co/tV9cZfzSBP",
  "fullText": "This October, you can look forward to these sights in the night sky:\n- A good look at Saturn\n- The Orionid meteor shower peaks mid-month\n- The Moon passes by the Seven Sisters\n\nLearn the tricks to spotting these celestial treats: https://t.co/9N1h9v848G https://t.co/tV9cZfzSBP",
  "source": "",
  "retweetCount": 536,
  "replyCount": 138,
  "likeCount": 3105,
  "quoteCount": 38,
  "createdAt": "Fri Oct 02 14:12:22 +0000 2026",
  "lang": "en",
  "bookmarkCount": 256,
  "isReply": false,
  "inReplyToId": null,
  "conversationId": "2106024496511512682",
  "inReplyToUserId": null,
  "inReplyToUsername": null,
  "isPinned": false,
  "author": {
    "type": "user",
    "userName": "NASA",
    "url": "https://x.com/NASA",
    "twitterUrl": "https://twitter.com/NASA",
    "id": "11348282",
    "name": "NASA",
    "isBlueVerified": true,
    "profilePicture": "https://pbs.twimg.com/profile_images/1321163587679784960/0ZxKlEKB_normal.jpg",
    "coverPicture": "https://pbs.twimg.com/profile_banners/11348282/1788992290",
    "description": "Making the seemingly impossible, possible. ✨",
    "location": "Pale Blue Dot",
    "followers": 92377773,
    "following": 115,
    "status": "",
    "canDm": false,
    "canMediaTag": false,
    "createdAt": "Wed Dec 19 20:20:32 +0000 2007",
    "entities": { "description": {} },
    "fastFollowersCount": 0,
    "favouritesCount": 17013,
    "hasCustomTimelines": true,
    "isTranslator": false,
    "mediaCount": 28176,
    "statusesCount": 74374,
    "withheldInCountries": [],
    "affiliatesHighlightedLabel": {},
    "possiblySensitive": false,
    "pinnedTweetIds": [],
    "professional": {}
  },
  "authorDisplay": "@NASA",
  "extendedEntities": {
    "media": [
      {
        "display_url": "pic.x.com/tV9cZfzSBP",
        "expanded_url": "https://x.com/NASA/status/2106024496511512682/video/1",
        "id_str": "2106024304890568704",
        "media_url_https": "https://pbs.twimg.com/media/HToaHj-W4AA57vI.png",
        "type": "video",
        "url": "https://t.co/tV9cZfzSBP"
      }
    ]
  },
  "card": {},
  "place": {},
  "entities": {
    "hashtags": [],
    "smarttags": [],
    "symbols": [],
    "timestamps": [],
    "urls": [
      {
        "display_url": "go.nasa.gov/4hBG439",
        "expanded_url": "https://go.nasa.gov/4hBG439",
        "indices": [230, 253],
        "url": "https://t.co/9N1h9v848G"
      }
    ],
    "user_mentions": []
  },
  "isRetweet": false,
  "isQuote": false,
  "media": [
    {
      "display_url": "pic.x.com/tV9cZfzSBP",
      "expanded_url": "https://x.com/NASA/status/2106024496511512682/video/1",
      "id_str": "2106024304890568704",
      "media_url_https": "https://pbs.twimg.com/media/HToaHj-W4AA57vI.png",
      "type": "video",
      "url": "https://t.co/tV9cZfzSBP"
    }
  ],
  "isConversationControlled": false,
  "scrapedTimestamp": "2026-10-04T10:30:28.194Z"
}
```

***

### How does it work?

The Actor gets public X data without needing an X account. It works as a Twitter scraper without login: it sees only what any visitor sees. For every account it reads the public profile, the account's post list and the newest posts, removes duplicates and keeps up to your limit, pinned post first. It uses plain HTTP requests, no browser. Every request gets up to 3 attempts with growing waits, and a blocked connection is replaced with a fresh one for the rest of the run. When no proxy is selected it connects directly and switches to a residential proxy by itself if X blocks it; when you select a proxy, every request goes through it. Only public data is returned, nothing from protected accounts. The output keeps the same field names on every run, so your code doesn't have to change when X changes its pages.

***

### How do you integrate Twitter X Posts Scraper into your stack?

Twitter X Posts Scraper works with what you already use: the REST API from any language, MCP for AI agents, and no-code tools.

#### Using Twitter X Posts Scraper with the Apify API

Treat it as an X tweets API: send the input JSON from the example above to the Actor's run-sync-get-dataset-items endpoint with your Apify token, and the response is the list of posts. With the apify-client package for Python or JavaScript, call the Actor with the same input and read the items from the run's default dataset.

*Works in Go, Ruby, Node.js, cURL — any language that can make an HTTP request.*

#### MCP integration for AI agents

Register Apify's MCP server once, with this Actor already loaded as a tool:

```bash
claude mcp add --transport http apify "https://mcp.apify.com?tools=socialdataapi/twitter-x-posts-scraper"
```

Your agent can then call it directly, for example to pull an account's latest posts in the middle of a conversation. Compatible clients include Claude Code, Cursor and Windsurf.

#### No-code tools (n8n, Make, LangChain)

- **n8n**: use the Apify node with the "Run an Actor" operation, pick this Actor and pass the input JSON. You can also point the HTTP Request node at the run-sync endpoint with your token.
- **Make**: add the Apify app's "Run an Actor" module with this Actor and your input, then "Get Dataset Items" to read the posts.
- **LangChain**: install `langchain-apify` and wrap this Actor with `ApifyActorsTool` using its Actor ID, so your chain can request posts as a tool call.

***

### Is it legal to scrape X data?

Scraping publicly available X data is generally lawful, although X's terms restrict automated access. The Actor returns only publicly available data — what any user sees without logging in, nothing from protected accounts. Usernames, names, pictures and bios are personal data: scraping public data is generally permissible, but storing and using it must comply with local data-protection law such as GDPR and CCPA. Consult legal counsel if your use case involves bulk storage of personal data.

***

### Frequently asked questions

#### What fields does Twitter X Posts Scraper return?

It returns the full post text, the like, repost, reply, quote and bookmark counts, the posting date, attached media and the author's profile, plus the post links, flags and entities. See [the data fields section](#what-data-can-i-extract-with-twitter-x-posts-scraper).

#### Does Twitter X Posts Scraper require an X account or login?

No. Only public post data is extracted, and no credentials or cookies are needed.

#### How fast does Twitter X Posts Scraper run?

A recorded run returned 200 posts from 2 accounts in 3.7 seconds, and 100 posts from one account took 7.3 seconds. Data is collected live on every run, not cached.

#### What happens if a post is private or doesn't exist?

An account that doesn't exist, is protected or is suspended produces no rows: it is named in the log and the status message, and the run summary under OUTPUT marks it as failed with the reason. In code, compare the accounts you sent with the accounts in the summary or in the author field of the rows.

#### Can I scrape multiple X posts at once?

Yes. Add as many accounts as you like to the account list; up to 8 are processed at the same time, and each one gets up to 100 posts.

#### Does Twitter X Posts Scraper work with Claude, ChatGPT, and other AI agent tools?

Yes — Twitter X Posts Scraper is available as an MCP tool through Apify's MCP server. Register it in Claude Code, Cursor or Windsurf with `claude mcp add --transport http apify "https://mcp.apify.com?tools=socialdataapi/twitter-x-posts-scraper"`. Any agent that can call an HTTP endpoint can use the REST API directly.

#### Does Twitter X Posts Scraper return data in a format LLMs can use directly?

Yes. Every post is typed, normalized JSON with consistent field names. No HTML parsing, no selectors: pass it straight to an LLM, index it into a vector store, or feed it to an agent tool.

#### What happens when X changes its layout or updates its anti-bot system?

The Actor is maintained. When X changes, the Actor is updated, and your calls keep returning the same JSON fields with no changes on your end.

#### Can I use Twitter X Posts Scraper without managing proxies or browser infrastructure?

Yes. Retries and the switch to a residential proxy when X blocks a connection run on the Actor's side, and no browser is used. You send one request and get structured JSON back.

#### Which X post fields work best for AI training data and RAG indexing?

For RAG, use the full post text, the hashtags and links, and the author's bio. For training data, use the like, repost, reply, quote and bookmark counts, the posting date and the pinned, reply, repost and quote flags. Values are typed: strings, integers and booleans, with media and entities as nested objects.

***

### Your feedback

Found a bug or missing a field? Let us know through the Actor's Issues tab. Every report is read, and fixes ship as X changes.

# Actor input Schema

## `startUrls` (type: `array`):

Accounts to scrape, one per line: a profile URL (https://x.com/username or https://twitter.com/username), a username or an @username. A post URL is turned into the account that posted it. Search and hashtag links are skipped and listed in the log.

## `sortOrder` (type: `string`):

How each account's collected posts are ordered before they are saved: newest first, most liked first or oldest first. It orders the posts that were collected; it doesn't change which posts X returns.

## `maxTweets` (type: `integer`):

Maximum number of posts to save for each account (1 to 100). Free plan: up to 20 posts per run (all accounts together) and 200 per month; paid plans have no limit.

## `proxyConfiguration` (type: `object`):

When a proxy is selected, every request goes through it and a blocked session is replaced with a fresh one. When the proxy is off, the Actor connects directly and moves to Apify's US residential proxy after X blocks the direct connection.

## Actor input object example

```json
{
  "startUrls": [
    "elonmusk"
  ],
  "sortOrder": "recent",
  "maxTweets": 10,
  "proxyConfiguration": {
    "useApifyProxy": false
  }
}
```

# Actor output Schema

## `results` (type: `string`):

All scraped posts, one row per post.

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

Per-account status and post counts, saved to the key-value store under the OUTPUT key.

# 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 = {
    "startUrls": [
        "elonmusk"
    ],
    "proxyConfiguration": {
        "useApifyProxy": false
    }
};

// Run the Actor and wait for it to finish
const run = await client.actor("socialdataapi/twitter-x-posts-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 = {
    "startUrls": ["elonmusk"],
    "proxyConfiguration": { "useApifyProxy": False },
}

# Run the Actor and wait for it to finish
run = client.actor("socialdataapi/twitter-x-posts-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 '{
  "startUrls": [
    "elonmusk"
  ],
  "proxyConfiguration": {
    "useApifyProxy": false
  }
}' |
apify call socialdataapi/twitter-x-posts-scraper --silent --output-dataset

```

## MCP server setup

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