# Twitter (X) Scraper ✅ No Login or Cookies (`atomus/twitter-scraper`) Actor

Scrape X.com (Twitter) with no login and no cookies. Extract a profile's tweets, run advanced keyword search, pull single tweet details, or fetch full user profiles. Get likes, retweets, replies, quotes, views, media URLs, author, and conversation context as clean JSON. Add followers and comments.

- **URL**: https://apify.com/atomus/twitter-scraper.md
- **Developed by:** [Atomus APIs](https://apify.com/atomus) (community)
- **Categories:** Social media, Lead generation, Automation
- **Features:** Limited permissions
- **Stats:** 130 total users, 23 monthly users, 100.0% runs succeeded, 2 bookmarks
- **User rating**: 5.00 out of 5 stars

## Pricing

from $2.00 / 1,000 tweet scrapeds

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

## Twitter (X) Scraper

<table width="100%" style="border:none;border-radius:10px;background:#120306">
<tr><td style="padding:34px;border:none">
<span style="color:#F59E0B;font-size:13px;font-weight:700;letter-spacing:2px">TWITTER (X) SCRAPER &nbsp;&bull;&nbsp; TWITTER API</span><br><br>
<span style="color:#F5F5F6;font-size:40px;font-weight:800;letter-spacing:-1.2px">Catch it on X<br>before it trends.</span><br><br>
<span style="color:#D6D3D1;font-size:16px">Four modes on one clean shape: a profile's timeline, advanced keyword search, single tweet details, and full user profiles. Every tweet carries 30+ fields — likes, retweets, replies, quotes, bookmarks, views, media URLs, the quoted tweet and the reply context. <b style="color:#F5F5F6">X's own search operators work verbatim</b>, and every search filter is free. No X account, no login, no cookies.</span><br><br>
<span style="background:#10B981;color:#FFFFFF;font-size:13px;font-weight:700;padding:6px 13px;border-radius:5px">SEARCH FILTERS ARE FREE</span>
<span style="background:#1C1917;color:#F59E0B;font-size:13px;font-weight:700;padding:6px 13px;border-radius:5px">&nbsp;X SEARCH OPERATORS WORK VERBATIM&nbsp;</span>
</td></tr>
</table>

#### Copy to your AI assistant

Paste this into ChatGPT, Claude, Cursor, or any LLM to start using this Actor right away.

```
atomus/twitter-scraper is an Apify Actor that returns public X (Twitter) data as structured JSON in four modes chosen by the required searchType input: "user-tweets" (a profile's timeline, from handles), "search" (advanced keyword search, from searchQuery), "tweet-detail" (specific tweets, from tweetUrls) and "profile" (full user profiles, from handles). Use it whenever someone needs tweets or X profiles without cookies, a login, or a browser - brand monitoring, social listening, trend tracking, or building a tweet dataset. Run it with curl: curl -X POST "https://api.apify.com/v2/acts/atomus~twitter-scraper/run-sync-get-dataset-items?token=APIFY_TOKEN" -H "Content-Type: application/json" -d '{"searchType":"search","searchQuery":"from:openai min_faves:5000 filter:videos","sortOrder":"Latest","maxItems":50}'. Or in Python: ApifyClient("APIFY_TOKEN").actor("atomus/twitter-scraper").call(run_input={"searchType":"user-tweets","handles":["openai"],"maxItems":50}) then client.dataset(run["defaultDatasetId"]).list_items().items. Inputs: searchType (required), handles (string[], @name, name or profile URL), searchQuery (string, raw X advanced-search operators pass through verbatim), tweetUrls (string[], status URL or bare numeric id), sortOrder ("Top"|"Latest"), maxItems (int, default 20), and free search filters fromUsers, toUsers, mentioning, hashtags, since, until (YYYY-MM-DD), minRetweets, minFaves, minReplies, language, onlyVerified, onlyMedia, onlyLinks, excludeReplies, excludeRetweets. Paid add-ons: maxFollowers and maxFollowing on profile mode, maxRetweeters and maxComments on tweet-detail mode, each delivered as separate records. A tweet row carries tweet_id, url, text, created_at, lang, source, favorite_count, retweet_count, reply_count, quote_count, bookmark_count, view_count, conversation_id, in_reply_to_screen_name, quoted_tweet, sensitive, hashtags, mentions, urls, media (type, image url, highest-bitrate mp4) and an author block. Billing is per tweet or profile returned, with a one-result minimum per run; search filters cost nothing. X caps a single profile timeline near ~100 tweets per pass, which is a platform limit every scraper shares. Full input schema, every enum and default, and the complete output field list: GET https://api.apify.com/v2/acts/atomus~twitter-scraper/build/default
```

***

### X (Twitter) MCP Server: use these Actors from ChatGPT, Claude or Cursor

Point your AI assistant at Atomus and it can read the social platforms on its own: X, TikTok, and the four big Chinese networks. No glue code, no scraping logic in your prompts.

```json
{
  "mcpServers": {
    "atomus": {
      "url": "https://mcp.apify.com?tools=atomus/twitter-scraper,atomus/tiktok-scraper,atomus/tiktok-comments-scraper,atomus/douyin-scraper,atomus/xiaohongshu-scraper,atomus/weibo-scraper,atomus/bilibili-scraper",
      "headers": { "Authorization": "Bearer YOUR_APIFY_TOKEN" }
    }
  }
}
```

Then ask, in plain language:

> "Find every tweet mentioning our product in the last week with more than 50 likes, then pull the replies on the three angriest ones."

That one sentence uses this Actor in two modes. Pinning the `tools=` list is what keeps your assistant on these Actors instead of reaching for whatever scraper it finds first.

***

### How to scrape Twitter (X)

`searchType` picks the mode, and each mode reads a different input field.

#### A profile's timeline

```json
{ "searchType": "user-tweets", "handles": ["openai", "https://x.com/anthropicai"], "maxItems": 50 }
```

Returns the user's recent tweets. `@name`, bare `name` and a full profile URL are all accepted.

#### Advanced search, with X's own operators

```json
{
  "searchType": "search",
  "searchQuery": "from:openai min_faves:5000 filter:videos",
  "sortOrder": "Latest",
  "maxItems": 100
}
```

Whatever you would type into X's search box works here verbatim. `sortOrder` is `Top` (relevance and engagement) or `Latest` (reverse-chronological).

#### The same search, built from filter fields

```json
{
  "searchType": "search",
  "searchQuery": "pricing",
  "mentioning": ["openai"],
  "since": "2026-08-01",
  "minFaves": 50,
  "language": "en",
  "excludeRetweets": true,
  "maxItems": 200
}
```

Every one of these filters is **free** and compiles into the same X operators. Use them instead of memorising the syntax — and note that narrowing here genuinely lowers the bill, because filtering happens before results are counted.

#### Specific tweets, with their replies

```json
{
  "searchType": "tweet-detail",
  "tweetUrls": ["https://x.com/openai/status/1846846285917131130", "1846846285917131130"],
  "maxComments": 50,
  "maxRetweeters": 100
}
```

Tweet details include the quoted tweet and reply context. `maxComments` and `maxRetweeters` are paid add-ons that arrive as their own records.

#### A user profile, and who follows them

```json
{
  "searchType": "profile",
  "handles": ["openai"],
  "maxFollowers": 1000
}
```

Profile mode returns bio, follower and following counts, verification, location and website. `maxFollowers` / `maxFollowing` are paid add-ons on this mode.

***

### Input

| Parameter | Type | Required | Default | Used by | Description |
|-----------|------|----------|---------|---------|-------------|
| `searchType` | string | ✅ Yes | `user-tweets` | — | `user-tweets`, `search`, `tweet-detail`, `profile`. |
| `handles` | string\[] | per mode | (none) | timeline, profile | `@openai`, `openai`, or `https://x.com/openai`. |
| `searchQuery` | string | per mode | (none) | search | Free text, or raw X advanced-search operators. |
| `tweetUrls` | string\[] | per mode | (none) | tweet-detail | Status URLs or bare numeric tweet IDs. |
| `sortOrder` | string | No | `Top` | search | `Top` or `Latest`. |
| `maxItems` | integer | No | `20` | timeline, search | Tweets per handle or per query. Your main cost lever. |

**Free search filters** (search mode): `fromUsers`, `toUsers`, `mentioning`, `hashtags`, `since`, `until` (`YYYY-MM-DD`), `minRetweets`, `minFaves`, `minReplies`, `language` (2-letter), `onlyVerified`, `onlyMedia`, `onlyLinks`, `excludeReplies`, `excludeRetweets`.

**Paid add-ons:** `maxFollowers` and `maxFollowing` (profile mode), `maxRetweeters` and `maxComments` (tweet-detail mode). All default to `0`, which is off, and each arrives as its own record type.

***

### What data does the Twitter (X) Scraper return?

One row per tweet or profile, the same shape across all four modes.

| Group | Fields |
|---|---|
| **Tweet** | `tweet_id` · `url` · `text` · `created_at` · `lang` · `source` · `sensitive` |
| **Engagement** | `favorite_count` · `retweet_count` · `reply_count` · `quote_count` · `bookmark_count` · `view_count` |
| **Thread context** | `conversation_id` · `in_reply_to_screen_name` · `in_reply_to_status_id` · `quoted_tweet` (the full nested tweet object) |
| **Entities** | `hashtags[]` · `mentions[]` · `urls[]` · `media[]` (type, image URL, highest-bitrate MP4 URL) |
| **Author** | `author.screen_name` · `name` · `avatar` · `followers_count` · `blue_verified` |
| **Profile rows** | bio, follower and following counts, verification, location, website |

#### Example row

```json
{
  "tweet_id": "1846846285917131130",
  "url": "https://x.com/OpenAI/status/1846846285917131130",
  "text": "True",
  "created_at": "Thu Oct 17 09:30:41 +0000 2024",
  "lang": "en",
  "favorite_count": 175957,
  "retweet_count": 36419,
  "reply_count": 5599,
  "quote_count": 635,
  "bookmark_count": 3015,
  "view_count": 28146703,
  "conversation_id": "1846846285917131130",
  "media": [],
  "author": {
    "screen_name": "OpenAI",
    "name": "OpenAI",
    "followers_count": 5097390,
    "blue_verified": true
  }
}
```

#### One platform limit, stated plainly

X caps a single profile timeline near **~100 tweets per pass**. That is a limit of X.com, not of this Actor, and every X scraper shares it. To go deeper, use search mode (which paginates further) or re-run on a schedule and append to the same dataset.

***

### How much does it cost to scrape Twitter (X)?

Pay per result, as a per-event charge.

| Event | Free plan | Gold+ |
|---|---|---|
| Tweet (timeline, search, tweet detail) | $4.00 / 1,000 | $2.00 / 1,000 |
| Profile | $4.00 / 1,000 | $2.00 / 1,000 |
| Follower / following / retweeter (add-on) | $0.50 / 1,000 | $0.15 / 1,000 |
| Comment (add-on) | $3.00 / 1,000 | $1.00 / 1,000 |

Bronze and Silver plans sit between the two columns.

**Every run bills a minimum of 1 result**, which covers the request even when nothing comes back — a private or suspended account, or a search that matched nothing. The lookup happened either way.

**Search filters are free**, and they run before results are counted, so a tighter query is a cheaper one.

**Free plan:** 10 tweets per calendar month, plus 1 profile, so you can see both shapes before paying. The counters reset on the 1st.

***

### What do people use the Twitter (X) Scraper for?

- **Brand monitoring**: watch mentions of your product with an engagement floor, so the alert only fires on posts that are actually spreading.
- **Competitor tracking**: follow a rival's timeline and measure what lands.
- **Social listening and sentiment**: pull a topic over a date range and hand the text to an LLM.
- **Trend tracking**: `Latest` search on a narrow query, on a schedule.
- **Influencer and audience research**: profiles plus the follower add-on, to see who an account actually reaches.
- **Crisis detection**: a search with `minReplies` set high finds the threads going wrong before they are news.
- **AI and research datasets**: a clean, consistent tweet shape across every mode.
- **AI agent context**: give an agent live public discussion instead of its training cutoff.

***

### Twitter (X) Scraper vs cookie-based tools vs the official X API

| | This Twitter (X) Scraper | Cookie-based scrapers | Official X API |
|---|---|---|---|
| **X account / cookies** | Not needed | Your session cookie required | Developer account + keys |
| **Account / ban risk** | None (no account used) | High (your account can be flagged) | None |
| **Setup** | Paste a handle, query or URL | Extract and paste your cookie | App approval + OAuth |
| **Advanced search operators** | Work verbatim | Varies | Limited by tier |
| **Timeline depth** | ~100 per pass (X's own cap) | Same cap | Tier-limited |
| **Pricing** | Pay per result (from $2.00 / 1,000 tweets on Gold) | Subscription + your account | High monthly tiers |

***

### FAQ

#### Do I need an X account or cookies?

No. The Actor reads public data and handles request signing itself, so there is nothing to log into and no account to put at risk.

#### Can I use this from ChatGPT or Claude?

Yes, two ways. Paste the "Copy to your AI assistant" block above into any LLM and it will write the call for you. Or connect the **X MCP server** config above, and every Atomus Actor becomes a native tool your assistant can call on its own, including chaining several in one request.

#### Can I search tweets by date, engagement or user?

Yes, and it costs nothing extra. `fromUsers`, `toUsers`, `mentioning`, `hashtags`, `since`/`until`, `minFaves`, `minRetweets`, `minReplies`, `language`, `onlyVerified`, `onlyMedia`, `onlyLinks`, `excludeReplies` and `excludeRetweets` compile into X's own search operators.

#### Can I paste raw X search operators instead?

Yes. `searchQuery` passes through verbatim, so `from:openai min_faves:5000 filter:videos` behaves exactly as it does in X's search box.

#### How many tweets can I get from one profile?

X caps a profile timeline near ~100 tweets per pass. Use search mode, or schedule re-runs into the same dataset, to build something deeper.

#### How much does it cost?

$4 per 1,000 tweets or profiles, $2 per 1,000 on Gold and above. Followers, following and retweeters are $0.50 / 1,000 ($0.15 on Gold); comments are $3 / 1,000 ($1 on Gold). Every run bills at least one result. Free Apify plans include 10 tweets and 1 profile per month.

#### Why does an empty search still cost something?

A run bills a minimum of one result because the lookup was performed either way — a suspended account or a query with no matches costs the same request upstream as one that returns data.

#### Is there an official X API?

Yes, behind a developer account and paid tiers that are expensive and rate-limited for most data needs. This Actor is the practical alternative: no keys, no OAuth, structured JSON, pay per result.

#### Is it legal to scrape X?

This Actor collects only publicly available data. You are responsible for using the output in line with applicable laws (GDPR/CCPA), X's terms, and your own compliance requirements. It is an independent tool, not affiliated with X Corp.

#### Can I run this on a schedule?

Yes. Apify [Schedules](https://docs.apify.com/platform/schedules) run the Actor on a cron interval and [webhooks](https://docs.apify.com/platform/integrations/webhooks) push each finished run into your systems — which is how a search query becomes a brand monitor.

***

### All Atomus scrapers

<span style="background:#10B981;color:#FFFFFF;font-size:13px;font-weight:700;padding:6px 13px;border-radius:5px">2.4M+ RESULTS DELIVERED</span>

### Support

### ⚠️ Disclaimer

This Actor is an independent tool and is not affiliated with, endorsed by, or sponsored by X Corp. X® and Twitter® are trademarks of their respective owners. All trademarks are property of their respective owners.

Use the data extracted by this Actor in compliance with applicable data protection laws (GDPR, CCPA) and X's terms of service. Do not use it for spam, harassment, or unlawful purposes.

# Actor input Schema

## `searchType` (type: `string`):

Choose the mode. Each mode uses a different input field below and is billed per result: tweets are $4/1k → $2/1k by Apify plan; a profile is billed as one result. A run always bills at least 1 result.

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

Used by "Profile timeline" and "User profile". One or more X usernames: @openai, openai, or a full profile URL like https://x.com/openai.

## `searchQuery` (type: `string`):

Used by "Advanced search". Free text to search for. You can also paste raw X advanced-search operators here (e.g. "from:openai min_faves:5000 filter:videos"): they work verbatim. Combine with the filters below.

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

Used by "Advanced search". "Top" ranks by relevance/engagement; "Latest" is reverse-chronological.

## `fromUsers` (type: `array`):

Search filter (free). Only tweets authored by these usernames.

## `toUsers` (type: `array`):

Search filter (free). Only tweets that are replies to these usernames.

## `mentioning` (type: `array`):

Search filter (free). Only tweets that mention these usernames.

## `hashtags` (type: `array`):

Search filter (free). Only tweets containing these hashtags (with or without the #).

## `since` (type: `string`):

Search filter (free). Only tweets on/after this date, format YYYY-MM-DD.

## `until` (type: `string`):

Search filter (free). Only tweets on/before this date, format YYYY-MM-DD.

## `minRetweets` (type: `integer`):

Search filter (free). Only tweets with at least this many retweets.

## `minFaves` (type: `integer`):

Search filter (free). Only tweets with at least this many likes.

## `minReplies` (type: `integer`):

Search filter (free). Only tweets with at least this many replies.

## `language` (type: `string`):

Search filter (free). Two-letter language code, e.g. en, es, pt, ja.

## `onlyVerified` (type: `boolean`):

Search filter (free). Only tweets from Blue-verified accounts.

## `onlyMedia` (type: `boolean`):

Search filter (free). Only tweets that include an image or video.

## `onlyLinks` (type: `boolean`):

Search filter (free). Only tweets that contain a link.

## `excludeReplies` (type: `boolean`):

Search filter (free). Drop reply tweets from the results.

## `excludeRetweets` (type: `boolean`):

Search filter (free). Drop native retweets from the results.

## `tweetUrls` (type: `array`):

Used by "Tweet details". Paste tweet URLs (https://x.com/openai/status/1846846285917131130) or bare numeric tweet IDs.

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

Used by "Profile timeline" and "Advanced search". How many tweets to return per username (timeline) or per query (search). This is your main cost lever: those modes bill per tweet. X caps a profile timeline near ~100 tweets per pass (a platform limit every scraper shares). Default 20. Every run bills a minimum of 1 result, which covers the request even when a query returns nothing (a private or suspended account, or a search with no matches). Why there is a minimum: one request is one lookup, and that lookup does the same work whether it comes back with 50 results, with 1, or with none. The minimum covers the request itself, which is what keeps thin targets worth running instead of being refused outright. Requests that fail are free.

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

Add-on for "User profile" mode (paid plans). Also fetch up to this many of the profile's followers, delivered as separate follower records. Billed as follower-scraped. 0 = off.

## `maxFollowing` (type: `integer`):

Add-on for "User profile" mode (paid plans). Also fetch up to this many accounts the profile follows, as separate following records. Billed as follower-scraped. 0 = off.

## `maxRetweeters` (type: `integer`):

Add-on for "Tweet details" mode (paid plans). Also fetch up to this many users who retweeted each tweet, as separate retweeter records. Billed as follower-scraped. 0 = off.

## `maxComments` (type: `integer`):

Add-on for "Tweet details" mode (paid plans). Also fetch up to this many replies/comments under each tweet, as separate comment records. Billed as comment-scraped. 0 = off.

## Actor input object example

```json
{
  "searchType": "user-tweets",
  "handles": [
    "openai"
  ],
  "sortOrder": "Top",
  "onlyVerified": false,
  "onlyMedia": false,
  "onlyLinks": false,
  "excludeReplies": false,
  "excludeRetweets": false,
  "tweetUrls": [
    "https://x.com/OpenAI/status/1846846285917131130"
  ],
  "maxItems": 20,
  "maxFollowers": 0,
  "maxFollowing": 0,
  "maxRetweeters": 0,
  "maxComments": 0
}
```

# 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": [
        "openai"
    ],
    "tweetUrls": [
        "https://x.com/OpenAI/status/1846846285917131130"
    ]
};

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

# Run the Actor and wait for it to finish
run = client.actor("atomus/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 '{
  "handles": [
    "openai"
  ],
  "tweetUrls": [
    "https://x.com/OpenAI/status/1846846285917131130"
  ]
}' |
apify call atomus/twitter-scraper --silent --output-dataset

```

## MCP server setup

```json
{
    "mcpServers": {
        "apify": {
            "type": "http",
            "url": "https://mcp.apify.com/?tools=fetch-actor-details,atomus/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/Y3cgyqvI46p0VMr0m/builds/9CA07Rll7o0drSGSJ/openapi.json
