# X.com (Twitter) Profile Scraper (`lurkapi/x-twitter-profile-scraper`) Actor

Scrape tweets from any X profile by handle, profile URL, or user ID. Pay per tweet ($0.30/1k base). Optional add-ons: full author profile, thread expansion, media downloads.

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

## Pricing

from $0.30 / 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.

Learn more: https://docs.apify.com/platform/actors/running/actors-in-store#pay-per-event

## What's an Apify Actor?

Actors are a software tools running on the Apify platform, for all kinds of web data extraction and automation use cases.
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.

In JavaScript/TypeScript projects, use official [JavaScript/TypeScript client](https://docs.apify.com/api/client/js.md):

```bash
npm install apify-client
```

In Python projects, use official [Python client library](https://docs.apify.com/api/client/python.md):

```bash
pip install apify-client
```

In shell scripts, use [Apify CLI](https://docs.apify.com/cli/docs.md):

````bash
# MacOS / Linux
curl -fsSL https://apify.com/install-cli.sh | bash
# Windows
irm https://apify.com/install-cli.ps1 | iex
```bash

In AI frameworks, you might use the [Apify MCP server](https://docs.apify.com/platform/integrations/mcp.md).

If your project is in a different language, use 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

## X.com (Twitter) Profile Scraper

Scrape every tweet from any X.com (formerly Twitter) profile. Paste a handle, a profile URL, or a numeric user ID and get clean structured data straight to your spreadsheet, CRM, or dashboard. No X account, no login, no coding needed.

### 🐦 What it does

Give it any X profile and this tool pulls that account's tweets:

- **Handles or profile URLs**: paste `elonmusk` or `https://x.com/openai` to pull that account's timeline.
- **Numeric user IDs**: paste `44196397` when you already have the internal ID (handles can change, IDs cannot).

For every tweet you get:

- The full text (no 280-character truncation on long-form notes)
- Author handle, display name, avatar, and verification badges
- Likes, retweets, replies, quotes, bookmarks, view count
- Attached photos and videos (turn on the download add-on to save the files)
- Hashtags, mentions, and expanded URLs
- Nested quoted tweet and retweeted tweet, when present
- Precise creation timestamp in ISO 8601

### 📋 How to use it

#### Step 1: Pick your inputs

- **X handles or profile URLs**: one per line in the Handles box.
- **Numeric user IDs**: one per line in the User IDs box.

You can mix both in one run.

#### Step 2: Set sort and limits

- **Sort**: Latest for chronological (fastest, cheapest), Top for most engaged first, Media for a media-only feed.
- **Max tweets per profile**: default 40, raise to pull more per profile.
- **Max tweets per run**: hard cap across every profile in the run. Default 100 to protect against surprise bills.

#### Step 3: (Optional) Filter your results

Every filter is off by default (except Exclude replies which defaults to ON to keep the timeline clean).

- **Date range**: keep only tweets between a From and To date.
- **Language**: dropdown with every supported language.
- **Minimum likes, retweets, replies, or views**: drop tweets below your threshold.
- **Exclude replies / retweets**: keep the timeline clean.
- **Only tweets with media, images, videos, or links**: keep only tweets matching a media type.

Filters are free. Tweets dropped by a filter are never billed.

#### Step 4: (Optional) Add-ons

Every add-on is OFF by default. Each is billed only when it returns a real result. Failed lookups cost nothing.

- **Full author profile**: for every unique author in the run, fetch the full profile: followers, following, bio, self-set location, website, joined date, tweet count, banner image, verification badges. Billed once per unique handle across the run (100 tweets from one account = 1 charge).
- **Expand threads**: when a tweet is part of a conversation, pull sibling tweets in the thread. Attached as `threadTweets[]` on the row.
- **Download media files**: save every photo and video into your run's key-value store. You get a signed download link (kvUrl) on each media item. Billed once per tweet that had at least one file downloaded.

#### Step 5: Run

Click Start. Rows stream into the Output tab as each page finishes, so you do not have to wait for the whole run.

### 📊 What you get

Every row is one tweet from one of the profiles you gave. Five tabs group the fields by what you probably care about:

| Tab | What is in it |
|---|---|
| 📋 Overview | Status, tweet ID, URL, handle, text, date, top counts, source profile |
| 🐦 Tweets | Full spread: all six engagement counts, type flags, hashtags, mentions, links |
| 📊 Engagement | Only the numeric counts, ready for sorting or charting |
| 👤 Authors | Author profile columns (populated when the Full author profile add-on is on) |
| 🖼️ Media | Tweets that have media. Signed download link per file when the download add-on is on |

Export from the Output tab as JSON, CSV, or Excel.

Every row has a `status` field. `Success` means the row is good. Anything else is a human-readable message explaining what happened (handle not found, account suspended, X infrastructure under load). Rows that did not succeed are never billed.

### 💰 Pricing

You only pay for what you get. Every event is billed per result.

| Event | Rate | When it fires |
|---|---|---|
| Tweet scraped | $0.30 / 1,000 | Once per successful tweet row |
| Author profile enrichment | $3.00 / 1,000 | Once per unique author successfully resolved |
| Thread expansion | $10.00 / 1,000 | Once per unique thread expanded |
| Media download | $2.00 / 1,000 | Once per tweet with at least one file saved |


### 💡 Good to know

- **Long text is never truncated.** Long-form notes come back in full, unlike some competitors that cut off at 280 characters.
- **View count is populated on retweets and quoted tweets too**, not just originals.
- **URL forms accepted**: `x.com/user`, `twitter.com/user`, `mobile.x.com/user`, and `https://x.com/user/` all work.
- **userId inputs**: Top and Media sort require a handle, so those fall back to Latest when the input is a numeric userId. The dataset row still returns the same author fields either way.
- **Media files are stored in your Apify key-value store.** How long they are kept depends on your Apify plan.
- **Rows appear in real time.** Open the Output tab while the run is still going and start pulling data.

### For developers

Call this actor through the Apify API:

```json
{
    "handles": ["elonmusk", "sama", "openai"],
    "userIds": ["44196397"],
    "maxItems": 500,
    "maxTweetsPerProfile": 100,
    "sortBy": "Latest",
    "minLikes": 100,
    "language": "en",
    "excludeReplies": true,
    "enrichAuthor": true,
    "downloadMedia": true
}
````

Every input field is optional except that you must provide at least one of `handles` or `userIds`.

### ❓ FAQ

**Why is `viewCount` null on some tweets?**
X started exposing view counts publicly in December 2022. Tweets posted before that date do not have a view count on their API record, so the field comes back null.

**Why is `author.location` empty?**
`author.location` is the free-text Location field the user typed into their own profile. Many users leave it blank. X does not expose the "Account based in" country panel data on public API endpoints, so we cannot fill it in for you.

**Why did my run return zero rows?**
Possible reasons: the profile is protected, the account is suspended or deleted, your filters are too strict (try loosening the date range or minimum counts), or you set Exclude replies ON for an account that only ever replies to other users.

**Can I search for tweets across multiple accounts by keyword?**
Not with this actor. Use our [X.com Tweet Scraper](https://apify.com/lurkapi/x-twitter-tweet-scraper) for keyword search and tweet URL inputs.

**Can I use my own X cookies?**
No. This actor does not accept user cookies.

**How long are downloaded media files stored?**
Files land in your Apify key-value store. Retention depends on your Apify plan.

### 🔗 Other tools you might like

- [X.com (Twitter) Tweet Scraper](https://apify.com/lurkapi/x-twitter-tweet-scraper): Search X by keyword, hashtag, or tweet URL. Full advanced-search operator support.
- [Meta Ads (Facebook & Instagram) Scraper](https://apify.com/lurkapi/meta-ads-facebook-instagram-scraper): Scrape ads from Meta's public Ad Library.
- [TikTok Scraper](https://apify.com/lurkapi/tiktok-scraper-all-in-one): Videos, profiles, hashtags, sounds, keyword search, all in one actor.

### ⚖️ Disclaimer

This tool is intended for personal, research, and educational use. You are responsible for complying with X.com's Terms of Service and applicable laws in your jurisdiction. The developer is not liable for misuse. Data availability depends on X at run time.

**Keywords:** twitter profile scraper, x.com profile scraper, tweets from user, user tweet scraper, twitter timeline scraper, x api alternative, no login twitter scraper

# Actor input Schema

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

Usernames (e.g. elonmusk) or full profile URLs (https://x.com/elonmusk). One entry per profile.

## `userIds` (type: `array`):

Numeric X user IDs (e.g. 44196397). Useful when the handle has changed but the account is the same. Note: Top and Media sort are not supported for userId inputs — those fall back to Latest.

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

Hard cap on total tweets returned across all profiles. Default 100.

## `maxTweetsPerProfile` (type: `integer`):

Hard cap on tweets returned from each profile. Default 40.

## `sortBy` (type: `string`):

Latest = chronological timeline (fastest, cheapest). Top = most-engaged first. Media = media-only tweets. Top and Media use X's advanced search under the hood.

## `dateFrom` (type: `string`):

Earliest tweet date (YYYY-MM-DD).

## `dateTo` (type: `string`):

Latest tweet date (YYYY-MM-DD).

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

Keep only tweets in this language. Applied as a post-filter on the profile timeline, or injected as `lang:<code>` when sortBy is Top / Media.

## `minLikes` (type: `integer`):

Drop tweets below this favorite count.

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

Drop tweets below this retweet count.

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

Drop tweets below this reply count.

## `minViews` (type: `integer`):

Drop tweets below this view count.

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

Drop @-reply tweets. Defaults to true — most users scraping a profile want original posts, not the account's reply chatter.

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

Drop retweets.

## `mustHaveMedia` (type: `boolean`):

Keep only tweets with at least one attached photo or video.

## `onlyImages` (type: `boolean`):

Keep only tweets with at least one image attached (excludes video-only tweets).

## `onlyVideos` (type: `boolean`):

Keep only tweets with at least one video or animated GIF attached.

## `mustHaveLink` (type: `boolean`):

Keep only tweets containing at least one external link.

## `enrichAuthor` (type: `boolean`):

Enrich each unique author with the full profile: followers, following, bio, self-set location, website, joined date, tweet count, banner image, verification badges. Charged once per unique handle across the run (not per tweet).

## `expandThreads` (type: `boolean`):

When a tweet is part of a conversation, fetch sibling tweets in the thread and attach as threadTweets\[]. Charged once per unique conversation expanded.

## `downloadMedia` (type: `boolean`):

Download every photo and video attached to a tweet into the run's key-value store. Each media\[] item gets kvKey + kvUrl (signed public link) + bytes. Charged once per tweet with at least one file downloaded.

## `outputId` (type: `boolean`):

Numeric tweet ID.

## `outputUrl` (type: `boolean`):

Canonical tweet URL.

## `outputFullText` (type: `boolean`):

Full tweet text (long-form notes never 280-char truncated).

## `outputCreatedAt` (type: `boolean`):

ISO-8601 creation timestamp.

## `outputLang` (type: `boolean`):

Source language as returned by X.

## `outputReplyCount` (type: `boolean`):

Reply count.

## `outputRetweetCount` (type: `boolean`):

Retweet count.

## `outputLikeCount` (type: `boolean`):

Favorite / like count.

## `outputQuoteCount` (type: `boolean`):

Quote-tweet count.

## `outputBookmarkCount` (type: `boolean`):

Bookmark count.

## `outputViewCount` (type: `boolean`):

View count (populated for retweets/quoted tweets too, unlike some competitors).

## `outputIsReply` (type: `boolean`):

Boolean flag for reply tweets.

## `outputIsRetweet` (type: `boolean`):

Boolean flag for retweets.

## `outputIsQuote` (type: `boolean`):

Boolean flag for quote tweets.

## `outputConversationId` (type: `boolean`):

Conversation root ID (useful for grouping threads).

## `outputInReplyTo` (type: `boolean`):

inReplyToTweetId + inReplyToScreenName when the tweet is a reply.

## `outputMentions` (type: `boolean`):

@-mentions array.

## `outputHashtags` (type: `boolean`):

Hashtags array.

## `outputUrls` (type: `boolean`):

Expanded URLs in tweet.

## `outputMedia` (type: `boolean`):

Media array. Only present when the downloadMedia add-on is enabled.

## `outputAuthor` (type: `boolean`):

Author block (id, screenName, name, profileImageUrl, verification flags, followers, bio).

## `outputQuotedTweet` (type: `boolean`):

Nested quoted-tweet object when present.

## `outputRetweetedTweet` (type: `boolean`):

Nested retweeted-tweet object when present.

## Actor input object example

```json
{
  "handles": [
    "elonmusk"
  ],
  "userIds": [],
  "maxItems": 20,
  "maxTweetsPerProfile": 20,
  "sortBy": "Latest",
  "language": "",
  "excludeReplies": true,
  "excludeRetweets": false,
  "mustHaveMedia": false,
  "onlyImages": false,
  "onlyVideos": false,
  "mustHaveLink": false,
  "enrichAuthor": false,
  "expandThreads": false,
  "downloadMedia": false,
  "outputId": true,
  "outputUrl": true,
  "outputFullText": true,
  "outputCreatedAt": true,
  "outputLang": true,
  "outputReplyCount": true,
  "outputRetweetCount": true,
  "outputLikeCount": true,
  "outputQuoteCount": true,
  "outputBookmarkCount": true,
  "outputViewCount": true,
  "outputIsReply": true,
  "outputIsRetweet": true,
  "outputIsQuote": true,
  "outputConversationId": true,
  "outputInReplyTo": true,
  "outputMentions": true,
  "outputHashtags": true,
  "outputUrls": true,
  "outputMedia": true,
  "outputAuthor": true,
  "outputQuotedTweet": true,
  "outputRetweetedTweet": true
}
```

# Actor output Schema

## `overview` (type: `string`):

Status, ID, URL, handle, text, timestamp, top counts, source.

## `tweets` (type: `string`):

Full per-tweet spread — text, all counts, flags, hashtags, mentions, links.

## `engagement` (type: `string`):

Likes, retweets, replies, quotes, bookmarks, views per tweet.

## `authors` (type: `string`):

Author profile columns (populated when the enrichAuthor add-on is on).

## `media` (type: `string`):

Tweets with attached media. kvUrl per file populated when downloadMedia add-on is on.

# 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": [
        "elonmusk"
    ],
    "userIds": [],
    "maxItems": 20,
    "maxTweetsPerProfile": 20
};

// Run the Actor and wait for it to finish
const run = await client.actor("lurkapi/x-twitter-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": ["elonmusk"],
    "userIds": [],
    "maxItems": 20,
    "maxTweetsPerProfile": 20,
}

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

```

## MCP server setup

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

```

## OpenAPI specification

```json
{
    "openapi": "3.0.1",
    "info": {
        "title": "X.com (Twitter) Profile Scraper",
        "description": "Scrape tweets from any X profile by handle, profile URL, or user ID. Pay per tweet ($0.30/1k base). Optional add-ons: full author profile, thread expansion, media downloads.",
        "version": "0.0",
        "x-build-id": "l8Bxi864o0PCxmL9Y"
    },
    "servers": [
        {
            "url": "https://api.apify.com/v2"
        }
    ],
    "paths": {
        "/acts/lurkapi~x-twitter-profile-scraper/run-sync-get-dataset-items": {
            "post": {
                "operationId": "run-sync-get-dataset-items-lurkapi-x-twitter-profile-scraper",
                "x-openai-isConsequential": false,
                "summary": "Executes an Actor, waits for its completion, and returns Actor's dataset items in response.",
                "tags": [
                    "Run Actor"
                ],
                "requestBody": {
                    "required": true,
                    "content": {
                        "application/json": {
                            "schema": {
                                "$ref": "#/components/schemas/inputSchema"
                            }
                        }
                    }
                },
                "parameters": [
                    {
                        "name": "token",
                        "in": "query",
                        "required": true,
                        "schema": {
                            "type": "string"
                        },
                        "description": "Enter your Apify token here"
                    }
                ],
                "responses": {
                    "200": {
                        "description": "OK"
                    }
                }
            }
        },
        "/acts/lurkapi~x-twitter-profile-scraper/runs": {
            "post": {
                "operationId": "runs-sync-lurkapi-x-twitter-profile-scraper",
                "x-openai-isConsequential": false,
                "summary": "Executes an Actor and returns information about the initiated run in response.",
                "tags": [
                    "Run Actor"
                ],
                "requestBody": {
                    "required": true,
                    "content": {
                        "application/json": {
                            "schema": {
                                "$ref": "#/components/schemas/inputSchema"
                            }
                        }
                    }
                },
                "parameters": [
                    {
                        "name": "token",
                        "in": "query",
                        "required": true,
                        "schema": {
                            "type": "string"
                        },
                        "description": "Enter your Apify token here"
                    }
                ],
                "responses": {
                    "200": {
                        "description": "OK",
                        "content": {
                            "application/json": {
                                "schema": {
                                    "$ref": "#/components/schemas/runsResponseSchema"
                                }
                            }
                        }
                    }
                }
            }
        },
        "/acts/lurkapi~x-twitter-profile-scraper/run-sync": {
            "post": {
                "operationId": "run-sync-lurkapi-x-twitter-profile-scraper",
                "x-openai-isConsequential": false,
                "summary": "Executes an Actor, waits for completion, and returns the OUTPUT from Key-value store in response.",
                "tags": [
                    "Run Actor"
                ],
                "requestBody": {
                    "required": true,
                    "content": {
                        "application/json": {
                            "schema": {
                                "$ref": "#/components/schemas/inputSchema"
                            }
                        }
                    }
                },
                "parameters": [
                    {
                        "name": "token",
                        "in": "query",
                        "required": true,
                        "schema": {
                            "type": "string"
                        },
                        "description": "Enter your Apify token here"
                    }
                ],
                "responses": {
                    "200": {
                        "description": "OK"
                    }
                }
            }
        }
    },
    "components": {
        "schemas": {
            "inputSchema": {
                "type": "object",
                "properties": {
                    "handles": {
                        "title": "👤 X handles / profile URLs",
                        "type": "array",
                        "description": "Usernames (e.g. elonmusk) or full profile URLs (https://x.com/elonmusk). One entry per profile.",
                        "items": {
                            "type": "string"
                        }
                    },
                    "userIds": {
                        "title": "🔢 Numeric user IDs",
                        "type": "array",
                        "description": "Numeric X user IDs (e.g. 44196397). Useful when the handle has changed but the account is the same. Note: Top and Media sort are not supported for userId inputs — those fall back to Latest.",
                        "items": {
                            "type": "string"
                        }
                    },
                    "maxItems": {
                        "title": "Max tweets per run",
                        "minimum": 1,
                        "type": "integer",
                        "description": "Hard cap on total tweets returned across all profiles. Default 100.",
                        "default": 100
                    },
                    "maxTweetsPerProfile": {
                        "title": "Max tweets per profile",
                        "minimum": 1,
                        "type": "integer",
                        "description": "Hard cap on tweets returned from each profile. Default 40.",
                        "default": 40
                    },
                    "sortBy": {
                        "title": "Sort",
                        "enum": [
                            "Latest",
                            "Top",
                            "Media"
                        ],
                        "type": "string",
                        "description": "Latest = chronological timeline (fastest, cheapest). Top = most-engaged first. Media = media-only tweets. Top and Media use X's advanced search under the hood.",
                        "default": "Latest"
                    },
                    "dateFrom": {
                        "title": "From date",
                        "type": "string",
                        "description": "Earliest tweet date (YYYY-MM-DD)."
                    },
                    "dateTo": {
                        "title": "To date",
                        "type": "string",
                        "description": "Latest tweet date (YYYY-MM-DD)."
                    },
                    "language": {
                        "title": "Language",
                        "enum": [
                            "",
                            "en",
                            "es",
                            "pt",
                            "ja",
                            "ar",
                            "ko",
                            "fr",
                            "de",
                            "id",
                            "tr",
                            "ru",
                            "it",
                            "th",
                            "hi",
                            "nl",
                            "pl",
                            "sv",
                            "zh",
                            "vi",
                            "fa",
                            "ro",
                            "uk",
                            "he",
                            "el",
                            "cs",
                            "hu",
                            "no",
                            "da",
                            "fi",
                            "bg",
                            "sk",
                            "sl",
                            "hr",
                            "sr",
                            "ms",
                            "ca",
                            "tl",
                            "lv",
                            "lt",
                            "et",
                            "und"
                        ],
                        "type": "string",
                        "description": "Keep only tweets in this language. Applied as a post-filter on the profile timeline, or injected as `lang:<code>` when sortBy is Top / Media.",
                        "default": ""
                    },
                    "minLikes": {
                        "title": "Minimum likes",
                        "minimum": 0,
                        "type": "integer",
                        "description": "Drop tweets below this favorite count."
                    },
                    "minRetweets": {
                        "title": "Minimum retweets",
                        "minimum": 0,
                        "type": "integer",
                        "description": "Drop tweets below this retweet count."
                    },
                    "minReplies": {
                        "title": "Minimum replies",
                        "minimum": 0,
                        "type": "integer",
                        "description": "Drop tweets below this reply count."
                    },
                    "minViews": {
                        "title": "Minimum views",
                        "minimum": 0,
                        "type": "integer",
                        "description": "Drop tweets below this view count."
                    },
                    "excludeReplies": {
                        "title": "Exclude replies",
                        "type": "boolean",
                        "description": "Drop @-reply tweets. Defaults to true — most users scraping a profile want original posts, not the account's reply chatter.",
                        "default": true
                    },
                    "excludeRetweets": {
                        "title": "Exclude retweets",
                        "type": "boolean",
                        "description": "Drop retweets.",
                        "default": false
                    },
                    "mustHaveMedia": {
                        "title": "Only tweets with media",
                        "type": "boolean",
                        "description": "Keep only tweets with at least one attached photo or video.",
                        "default": false
                    },
                    "onlyImages": {
                        "title": "Only tweets with images",
                        "type": "boolean",
                        "description": "Keep only tweets with at least one image attached (excludes video-only tweets).",
                        "default": false
                    },
                    "onlyVideos": {
                        "title": "Only tweets with videos",
                        "type": "boolean",
                        "description": "Keep only tweets with at least one video or animated GIF attached.",
                        "default": false
                    },
                    "mustHaveLink": {
                        "title": "Only tweets with links",
                        "type": "boolean",
                        "description": "Keep only tweets containing at least one external link.",
                        "default": false
                    },
                    "enrichAuthor": {
                        "title": "Full author profile ($)",
                        "type": "boolean",
                        "description": "Enrich each unique author with the full profile: followers, following, bio, self-set location, website, joined date, tweet count, banner image, verification badges. Charged once per unique handle across the run (not per tweet).",
                        "default": false
                    },
                    "expandThreads": {
                        "title": "Expand threads ($)",
                        "type": "boolean",
                        "description": "When a tweet is part of a conversation, fetch sibling tweets in the thread and attach as threadTweets[]. Charged once per unique conversation expanded.",
                        "default": false
                    },
                    "downloadMedia": {
                        "title": "Download media files ($)",
                        "type": "boolean",
                        "description": "Download every photo and video attached to a tweet into the run's key-value store. Each media[] item gets kvKey + kvUrl (signed public link) + bytes. Charged once per tweet with at least one file downloaded.",
                        "default": false
                    },
                    "outputId": {
                        "title": "id",
                        "type": "boolean",
                        "description": "Numeric tweet ID.",
                        "default": true
                    },
                    "outputUrl": {
                        "title": "url",
                        "type": "boolean",
                        "description": "Canonical tweet URL.",
                        "default": true
                    },
                    "outputFullText": {
                        "title": "fullText",
                        "type": "boolean",
                        "description": "Full tweet text (long-form notes never 280-char truncated).",
                        "default": true
                    },
                    "outputCreatedAt": {
                        "title": "createdAt",
                        "type": "boolean",
                        "description": "ISO-8601 creation timestamp.",
                        "default": true
                    },
                    "outputLang": {
                        "title": "lang",
                        "type": "boolean",
                        "description": "Source language as returned by X.",
                        "default": true
                    },
                    "outputReplyCount": {
                        "title": "replyCount",
                        "type": "boolean",
                        "description": "Reply count.",
                        "default": true
                    },
                    "outputRetweetCount": {
                        "title": "retweetCount",
                        "type": "boolean",
                        "description": "Retweet count.",
                        "default": true
                    },
                    "outputLikeCount": {
                        "title": "likeCount",
                        "type": "boolean",
                        "description": "Favorite / like count.",
                        "default": true
                    },
                    "outputQuoteCount": {
                        "title": "quoteCount",
                        "type": "boolean",
                        "description": "Quote-tweet count.",
                        "default": true
                    },
                    "outputBookmarkCount": {
                        "title": "bookmarkCount",
                        "type": "boolean",
                        "description": "Bookmark count.",
                        "default": true
                    },
                    "outputViewCount": {
                        "title": "viewCount",
                        "type": "boolean",
                        "description": "View count (populated for retweets/quoted tweets too, unlike some competitors).",
                        "default": true
                    },
                    "outputIsReply": {
                        "title": "isReply",
                        "type": "boolean",
                        "description": "Boolean flag for reply tweets.",
                        "default": true
                    },
                    "outputIsRetweet": {
                        "title": "isRetweet",
                        "type": "boolean",
                        "description": "Boolean flag for retweets.",
                        "default": true
                    },
                    "outputIsQuote": {
                        "title": "isQuote",
                        "type": "boolean",
                        "description": "Boolean flag for quote tweets.",
                        "default": true
                    },
                    "outputConversationId": {
                        "title": "conversationId",
                        "type": "boolean",
                        "description": "Conversation root ID (useful for grouping threads).",
                        "default": true
                    },
                    "outputInReplyTo": {
                        "title": "inReplyTo*",
                        "type": "boolean",
                        "description": "inReplyToTweetId + inReplyToScreenName when the tweet is a reply.",
                        "default": true
                    },
                    "outputMentions": {
                        "title": "mentions",
                        "type": "boolean",
                        "description": "@-mentions array.",
                        "default": true
                    },
                    "outputHashtags": {
                        "title": "hashtags",
                        "type": "boolean",
                        "description": "Hashtags array.",
                        "default": true
                    },
                    "outputUrls": {
                        "title": "urls",
                        "type": "boolean",
                        "description": "Expanded URLs in tweet.",
                        "default": true
                    },
                    "outputMedia": {
                        "title": "media",
                        "type": "boolean",
                        "description": "Media array. Only present when the downloadMedia add-on is enabled.",
                        "default": true
                    },
                    "outputAuthor": {
                        "title": "author",
                        "type": "boolean",
                        "description": "Author block (id, screenName, name, profileImageUrl, verification flags, followers, bio).",
                        "default": true
                    },
                    "outputQuotedTweet": {
                        "title": "quotedTweet",
                        "type": "boolean",
                        "description": "Nested quoted-tweet object when present.",
                        "default": true
                    },
                    "outputRetweetedTweet": {
                        "title": "retweetedTweet",
                        "type": "boolean",
                        "description": "Nested retweeted-tweet object when present.",
                        "default": true
                    }
                }
            },
            "runsResponseSchema": {
                "type": "object",
                "properties": {
                    "data": {
                        "type": "object",
                        "properties": {
                            "id": {
                                "type": "string"
                            },
                            "actId": {
                                "type": "string"
                            },
                            "userId": {
                                "type": "string"
                            },
                            "startedAt": {
                                "type": "string",
                                "format": "date-time",
                                "example": "2025-01-08T00:00:00.000Z"
                            },
                            "finishedAt": {
                                "type": "string",
                                "format": "date-time",
                                "example": "2025-01-08T00:00:00.000Z"
                            },
                            "status": {
                                "type": "string",
                                "example": "READY"
                            },
                            "meta": {
                                "type": "object",
                                "properties": {
                                    "origin": {
                                        "type": "string",
                                        "example": "API"
                                    },
                                    "userAgent": {
                                        "type": "string"
                                    }
                                }
                            },
                            "stats": {
                                "type": "object",
                                "properties": {
                                    "inputBodyLen": {
                                        "type": "integer",
                                        "example": 2000
                                    },
                                    "rebootCount": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "restartCount": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "resurrectCount": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "computeUnits": {
                                        "type": "integer",
                                        "example": 0
                                    }
                                }
                            },
                            "options": {
                                "type": "object",
                                "properties": {
                                    "build": {
                                        "type": "string",
                                        "example": "latest"
                                    },
                                    "timeoutSecs": {
                                        "type": "integer",
                                        "example": 300
                                    },
                                    "memoryMbytes": {
                                        "type": "integer",
                                        "example": 1024
                                    },
                                    "diskMbytes": {
                                        "type": "integer",
                                        "example": 2048
                                    }
                                }
                            },
                            "buildId": {
                                "type": "string"
                            },
                            "defaultKeyValueStoreId": {
                                "type": "string"
                            },
                            "defaultDatasetId": {
                                "type": "string"
                            },
                            "defaultRequestQueueId": {
                                "type": "string"
                            },
                            "buildNumber": {
                                "type": "string",
                                "example": "1.0.0"
                            },
                            "containerUrl": {
                                "type": "string"
                            },
                            "usage": {
                                "type": "object",
                                "properties": {
                                    "ACTOR_COMPUTE_UNITS": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "DATASET_READS": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "DATASET_WRITES": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "KEY_VALUE_STORE_READS": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "KEY_VALUE_STORE_WRITES": {
                                        "type": "integer",
                                        "example": 1
                                    },
                                    "KEY_VALUE_STORE_LISTS": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "REQUEST_QUEUE_READS": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "REQUEST_QUEUE_WRITES": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "DATA_TRANSFER_INTERNAL_GBYTES": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "DATA_TRANSFER_EXTERNAL_GBYTES": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "PROXY_RESIDENTIAL_TRANSFER_GBYTES": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "PROXY_SERPS": {
                                        "type": "integer",
                                        "example": 0
                                    }
                                }
                            },
                            "usageTotalUsd": {
                                "type": "number",
                                "example": 0.00005
                            },
                            "usageUsd": {
                                "type": "object",
                                "properties": {
                                    "ACTOR_COMPUTE_UNITS": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "DATASET_READS": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "DATASET_WRITES": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "KEY_VALUE_STORE_READS": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "KEY_VALUE_STORE_WRITES": {
                                        "type": "number",
                                        "example": 0.00005
                                    },
                                    "KEY_VALUE_STORE_LISTS": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "REQUEST_QUEUE_READS": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "REQUEST_QUEUE_WRITES": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "DATA_TRANSFER_INTERNAL_GBYTES": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "DATA_TRANSFER_EXTERNAL_GBYTES": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "PROXY_RESIDENTIAL_TRANSFER_GBYTES": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "PROXY_SERPS": {
                                        "type": "integer",
                                        "example": 0
                                    }
                                }
                            }
                        }
                    }
                }
            }
        }
    }
}
```
