X Tweet Scraper | $0.15/1K Tweets | Pay-Per Result
Pricing
from $0.00015 / tweets
X Tweet Scraper | $0.15/1K Tweets | Pay-Per Result
Scrape X (Twitter) tweets at scale from $0.15/1K on paid Apify plans. Paste tweet, profile, search, or list URLs. 50+ advanced filters. Batch lookup. No start fee. No query fee. No API key. No rate limits. Built by Xquik. Not affiliated with X Corp.
Pricing
from $0.00015 / tweets
Rating
4.3
(11)
Developer
Xquik
Maintained by CommunityActor stats
21
Bookmarked
2.5K
Total users
759
Monthly active users
2.9 hours
Issues response
8 hours ago
Last modified
Share
Scrape X (Twitter) tweets at scale from $0.15 per 1,000 delivered results on paid Apify plans. Apify's pricing box remains authoritative for your account before each run. No X API key or X login is required. There is no start or query fee. Built by Xquik.
Xquik is an independent third-party service. Not affiliated with X Corp. "Twitter" and "X" are trademarks of X Corp.
What does X Tweet Scraper do?
X Tweet Scraper extracts tweets, engagement metrics, author profiles, and media from X (formerly Twitter) using advanced search syntax with 50+ filters. It returns structured JSON data ready for analysis, monitoring, or integration into your pipeline.
Core behavior
- Metered tweet scraping - paid Apify plans start at $0.15 per 1,000 delivered rows, with no start fee, no query fee, and no separate single-tweet URL fee
- No forced 50-result or single-use restrictions - scrape 1 tweet, 10 tweets, up to 10,000 tweet IDs, profile timelines, search results, list timelines, replies, quotes, threads, retweeters, best-effort favoriters, articles, profile media, or profile likes
- One Actor surface - small lookups, backfills, URLs, search, and engagement modes use the same input
- Budget-safe by design - duplicates are removed before billing, empty runs produce only 1 diagnostic row, and Apify spend limits drive the maximum billable rows
- Export formats - use nested JSON or flat CSV-friendly fields with multi-query source attribution
What can this scraper do?
- Scrape tweets from an X list - paste a list URL like
https://x.com/i/lists/123456and collect results through the dedicated list path, bounded by run limits - Bulk X profile scraper - pass an array of usernames like
["elonmusk", "nasa"]to scrape many timelines in one run - X URL tweet extractor - paste a mix of tweet, profile, search, or list URLs into Start URLs and the scraper figures out what you want
- Advanced X search - raw search syntax and 50+ structured filters (user, date, location, media, engagement)
- Batch tweet lookup - fetch up to 10,000 tweets by ID in one run (batched in chunks of 100 transparently)
- Engagement and thread modes - use explicit
modevalues for replies, quotes, thread context, retweeters, best-effort favoriters, articles, profile media, and profile likes - With Replies tab support -
profileRepliesand/with_repliesreturn rows from X's With Replies tab, which can include both regular posts and replies depending on what X exposes - Multiple search terms - run many queries in a single Actor run, with the matching search term attached to each result
- Combined Latest + Top sort - run both X search modes and deduplicate for broader result coverage
- CSV-friendly flat output - set
outputPreset: "flat"to add top-level author fields, tweet URLs, and media URL arrays while keeping nested data - Consistent field names for agents - rich and raw result rows support
nested
camelCaseorsnake_casefields without changing legacy output - Safe API inputs - route, output, field, and sort options are typed choices, while invalid result limits fail before a billed run starts
Ready-to-run task examples
Choose from 50 public tasks with bounded inputs and useful dataset views. Each task opens with a real search or target and stays editable before you run it.
- Fetch fresh X posts for AI agents
- Build an X dataset for RAG
- Extract an X article for RAG
- Monitor AI search visibility on X
- Track AI SEO and generative engine optimization
- Discover AI agent tools on X
- Collect AI product feedback
- Monitor brand mentions on X
- Export Twitter data to CSV
- Collect replies to an OpenAI post
- Extract a complete Twitter thread
- Collect Spanish AI conversations
What data can X Tweet Scraper extract?
| Field | Description |
|---|---|
id | Tweet ID |
text | Full tweet text (including Note Tweets up to 25k chars) |
createdAt | X native timestamp string |
likeCount | Number of likes |
retweetCount | Number of retweets |
replyCount | Number of replies |
quoteCount | Number of quote tweets |
viewCount | Number of views |
bookmarkCount | Number of bookmarks |
lang | Tweet language |
url | Direct link to tweet |
tweetUrl | Flat output tweet URL alias |
twitterUrl | Flat output twitter.com-formatted URL |
author | Available author fields (username, bio, website, counts) |
authorUsername | Flat output author handle |
authorFollowers | Flat output author follower count |
authorUrl | Flat output author website when available |
authorDescription | Flat output author bio text |
authorCoverPicture | Flat output author banner image URL |
authorPinnedTweetIds | Flat output author pinned tweet IDs |
media | Attached images, videos, GIFs |
mediaUrls | Flat output media URLs |
imageUrls | Flat output image URLs |
videoUrls | Flat output video URLs |
entities | Hashtags, URLs, mentions |
displayTextRange | X display text range when available |
contentDisclosure | Disclosure metadata when available |
isLimitedReply | Whether replies are limited |
isNoteTweet | Whether this is a Note Tweet (long-form post) |
isQuoteStatus | Whether this tweet quotes another tweet |
isReply | Whether this tweet is a reply |
quoted_tweet | Quoted tweet object (if quote tweet) |
conversationId | Thread/conversation ID |
resultType | Row type for rich rows, engagement rows, and diagnostics |
sourceTweetId | Source tweet ID for article and engagement modes |
article | Structured article data in mode: "article" |
Optional tweet fields preserve extra data whenever X provides it.
| Field | Description |
|---|---|
card | Link card metadata |
communityNote | Community Note metadata |
edit | Edit history metadata |
isTranslatable | Translation availability |
noteTweet | Long-form post metadata |
place | Tagged place metadata |
possiblySensitive | X sensitivity state |
previousCounts | Pre-edit engagement counts |
viewState | X view-state metadata |
Nested author data also preserves optional public profile metadata.
| Field | Description |
|---|---|
affiliatesHighlightedLabel | Affiliate label metadata |
businessAccountAffiliatesCount | Business affiliate count |
creatorSubscriptionsCount | Creator subscription count |
hasGraduatedAccess | Graduated access state |
hasHiddenSubscriptionsOnProfile | Hidden subscription state |
highlightsInfo | Profile highlights metadata |
identityVerification | Identity verification metadata |
isProfileTranslatable | Profile translation availability |
parodyCommentaryFanLabel | Parody or fan label |
profileDescriptionLanguage | Detected bio language |
profileImageShape | Profile image shape |
profileInterstitialType | Profile interstitial type |
profileSortEnabled | Profile sorting state |
profileTranslatorType | Profile translator type |
superFollowEligible | Subscription eligibility |
Tweet rows also preserve type, source, inReplyToId, inReplyToUserId,
inReplyToUsername, and retweeted_tweet. Quoted and reposted tweets preserve
the same supported safe fields recursively.
Nested authors preserve these base profile fields: username, name,
description, followers, following, verified, isBlueVerified,
isVerified, profilePicture, coverPicture, profileBannerUrl, location,
statusesCount, mediaCount, protected, favouritesCount,
hasCustomTimelines, isTranslator, withheldInCountries, pinnedTweetIds,
isAutomated, automatedBy, unavailable, unavailableReason,
verifiedType, communityRole, and profile_bio.
Each media object can include id, mediaUrl, type, url, allowDownload,
altText, aspectRatio, availabilityStatus, displayUrl, durationMillis,
expandedUrl, faceRects, focusRects, height, indices, mediaKey,
monetizable, sizes, videoVariants, and width.
Viewer-relative state belongs to Xquik's fetch account, not your dataset. Follow, block, mute, bookmark, like, repost, edit-permission, and similar viewer flags are always removed, including from raw output.
Why scrape X (Twitter)?
- Sentiment analysis - analyze brand perception in collected posts
- Competitor monitoring - see what your competitors post, how it performs, who engages
- Market research - spot trending topics, rising accounts, emerging niches
- Lead generation - find prospects from conversations in your industry
- Academic research - build datasets for trend analysis, social-network studies, NLP training
- Content curation - discover top-performing content and influential voices
- Crisis review - collect brand, product, or keyword mentions on a schedule
Runs execute on Apify's platform with scheduling, webhooks, API access, integrations (Make, n8n, Zapier), proxy rotation, and dataset export in JSON, CSV, Excel, or HTML.
How much does it cost to scrape tweets?
On paid Apify plans, Xquik's listing price is $0.00015 per delivered row
($0.15 per 1,000). The Apify Console pricing box is authoritative and shows
the current price for your account tier before the run starts. Xquik charges
only for rows written to the default dataset: tweet rows, engagement user rows,
article rows, and at most 1 diagnostic row for an empty run. No separate Xquik
subscription or start fee applies. Each run also writes a run-report record
with estimatedChargeUsd calculated from the live pay-per-event price Apify
exposes to the Actor. Every outcome writes run-report, including no-input and
invalid-input exits.
- No separate start or query events - starts, search queries, profile URLs, list URLs, and single tweet lookups do not carry a separate URL fee
- No charge for removed duplicates - the Actor deduplicates across pages before writing
- One diagnostic row for non-data exits - no-input, invalid-input, and
zero-output runs write 1 structured diagnostic dataset row with
resultType: "diagnostic"and astatussuch asno-input,invalid-input, orzero-output. Diagnostic rows explain what happened and are easy to filter out withdataset.filter(r => r.resultType !== "diagnostic").
How do I use X Tweet Scraper to scrape tweet data?
1. Paste URLs directly
Paste a mix of tweet, profile, search, or list URLs:
{"startUrls": [{ "url": "https://x.com/elonmusk/status/1846987139428634858" },{ "url": "https://x.com/nasa" },{ "url": "https://x.com/search?q=AI%20lang%3Aen" },{ "url": "https://x.com/i/lists/1748648376080666720" }],"maxItems": 500}
Tweet URLs are looked up in batches of up to 100. Profile URLs auto-route to the
fast user-timeline path. Search URLs extract the query. List URLs route
through the dedicated list path instead of a generic list: search. Mix any
combination. maxItems is a global cap across all pasted URLs.
2. Bulk handles
Shorthand for many from:username searches:
{ "twitterHandles": ["elonmusk", "nasa", "openai"], "maxItems": 100 }
Each handle routes through the fast user-timeline path. Usernames can be passed
with or without the @ prefix.
3. Search tweets
Set the Search Terms field to one or more queries:
{"searchTerms": ["from:elonmusk AI", "#bitcoin lang:en"],"maxItems": 1000,"queryType": "Latest"}
Plain account backfills with date windows, such as
from:elonmusk since:2026-01-01 until:2026-01-02, route through timeline mode
instead of generic search. That path follows the account timeline, applies the
date window, and avoids X top-search ranking gaps. maxItems is a global cap
across all search terms in the run.
4. Lookup tweets by ID
{ "tweetIds": ["1846987139428634858", "1858743654778892784"], "maxItems": 100 }
Aliases accepted for the same lookup include tweetId, tweetIDs, tweets,
postIds, lookupPostIds, tweetUrls, and postUrls.
5. Explicit engagement, thread, and article modes
Use mode when you want one route, regardless of other input fields:
{ "mode": "replies", "replyTweetIds": ["1846987139428634858"], "maxItems": 100 }
Supported explicit modes: tweet, tweets, search, profileTweets,
profileReplies, profileMedia, profileLikes, listTweets, article,
replies, quotes, thread, retweeters, and favoriters.
profileReplies follows X's With Replies tab. That tab can include normal
profile posts as well as replies, so use filter:replies or to: search
filters when you need reply-only search results.
Article rows include resultType: "article", sourceTweetId, article, and
optional author. Engagement user rows include resultType: "user",
sourceTweetId, and engagementMode.
Retweeters remain a normal public engagement mode. Favoriters are best effort: X may only expose liking users for eligible or owner-visible posts. Profile likes are also best effort because many public profiles do not expose a readable Likes tab. If X does not expose users or liked tweets for a target, the actor returns one diagnostic row instead of failing the run. Bookmark counts can appear on tweet rows, but X does not expose the specific accounts that bookmarked a post.
6. Flat CSV output
Keep the default nested JSON fields, or add spreadsheet-friendly columns:
{ "searchTerms": ["from:nasa moon"], "maxItems": 100, "outputPreset": "flat" }
Flat output keeps author and media unchanged and also adds top-level fields
such as authorUsername, authorName, authorFollowers, tweetUrl,
twitterUrl, mediaUrls, imageUrls, and videoUrls.
7. Select field naming
Keep legacy field names by default. Select a style for rich or raw result data:
{"searchTerms": ["from:nasa moon"],"maxItems": 100,"outputVariant": "rich","fieldStyle": "snake_case"}
Use camelCase or snake_case for top-level and nested result fields. Flat
snake case output includes fields such as author_username and media_urls.
Safe source snapshots under raw keep their original source keys. Conflicting
source names also stay unchanged to prevent data loss.
Diagnostic rows always keep canonical control fields such as resultType,
status, message, and actorVersion. The Overview dataset view works with
either style. Choose the Console view matching the run's fieldStyle.
camelCase Fields expects camelCase. snake_case Fields expects
snake_case. Views select columns only. They never rename stored or exported
data.
8. Advanced filters
Combine user, date, location, media, and engagement filters:
{"twitterContent": "AI","from": "elonmusk","since": "2026-01-01_00:00:00_UTC","until": "2026-03-01_00:00:00_UTC","lang": "en","filter:media": true,"min_faves": 1000,"maxItems": 500}
Set queryType: "Latest + Top" to run both X search modes and deduplicate.
Top is relevance-ranked and is not exhaustive. Set includeSearchTerms: true
to attach the matching query as a searchTerm field on every result tweet,
useful when running multiple searchTerms in one run.
You can also pass competitor-friendly aliases such as query, searchQuery,
urls, profileUrls, usernames, maxResults, max_results, resultsLimit,
numberOfTweets, maxPosts, and max_posts.
Console & API Input UX
The Console uses native controls for the most common choices:
- Mode, Output Variant, Field Style, Output Preset, and Sort By are validated selects.
- Start URLs and Profile URLs accept URL strings or
{ "url": "..." }objects. The flexible JSON editor preserves both API formats. - Structured Filters exposes grouped property controls. You do not need to write nested JSON.
- Max Items and Max Items Per Target accept whole numbers of 1 or more. Engagement thresholds accept whole numbers of 0 or more.
Use canonical fields in new integrations. Compatibility aliases remain available
in JSON, API, SDK, automation, and task inputs. This includes includeRaw as an
alias for outputVariant: "raw". The visual form hides aliases that duplicate a
canonical control.
Top supported search operators
| Operator | Example | Purpose |
|---|---|---|
from: | from:elonmusk | Only tweets by this user |
to: | to:OpenAI | Only replies to this user |
@ | @nasa | Tweets mentioning this user |
list: | list:123456 | Tweets from list members |
lang: | lang:en | Filter by language |
since: / until: | since:2026-01-01 | Date range |
min_faves: | min_faves:100 | Engagement threshold |
min_retweets: | min_retweets:50 | Retweet threshold |
filter:media | filter:media | X media search operator |
filter:videos | filter:videos | X video search operator |
filter:images | filter:images | X image search operator |
filter:links | filter:links | Only tweets with links |
filter:replies | filter:replies | Only reply tweets |
filter:quote | filter:quote | Only quote tweets |
filter:blue_verified | filter:blue_verified | Only Premium users |
For the full operator list, see Twitter Advanced Search.
Input
See the Input tab for the complete list of options. All fields are optional
except at least one of: startUrls, twitterHandles, listIds, tweetIds,
searchTerms, twitterContent, or their documented aliases.
Common patterns:
- Single tweet by URL - paste the tweet URL into Start URLs
- User timeline - paste the profile URL or add the username to X Handles
- Account date backfill - use
from:user since:YYYY-MM-DD until:YYYY-MM-DDas a Search Term. The actor routes this to timeline mode for better coverage - Entire X list - paste the list URL into Start URLs
- Advanced search - combine
twitterContentwith filters likefrom:,since:,min_faves:,filter:media
The scraper auto-routes list URLs to the dedicated list path, which is usually
faster than generic list:ID search.
Output
Each tweet is a JSON object with available metadata:
Sample values are illustrative. Responses reflect source data at run time.
{"id": "1846987139428634858","text": "The future of AI is...","createdAt": "Sun Mar 15 12:00:00 +0000 2026","retweetCount": 500,"replyCount": 120,"likeCount": 5000,"quoteCount": 80,"viewCount": 1200000,"bookmarkCount": 300,"lang": "en","url": "https://x.com/elonmusk/status/1846987139428634858","author": {"id": "44196397","username": "elonmusk","name": "Elon Musk","followers": 180000000,"verified": true},"media": [{ "type": "photo", "url": "https://..." }],"entities": {"hashtags": [{ "text": "AI" }],"urls": [],"user_mentions": []},"isNoteTweet": false,"isQuoteStatus": false,"isReply": false,"conversationId": "1846987139428634858"}
Export as JSON, CSV, Excel, or HTML from the Apify dataset.
Tips & advanced options
- Control spend - set Apify max total charge to cap run cost. Leave
maxItemsempty for maximum rows within that budget, or setmaxItemswhen you want fewer tweets. - API budget cap - set
maxTotalChargeUsdin the Apify API, or Max cost per run in Console. Apify exposes that limit to the Actor asACTOR_MAX_TOTAL_CHARGE_USD, and the Actor turns it into the maximum billable row count. - Known tweet IDs - pass
tweetIdsfor known tweets (batched at 100 per call) or paste a profile URL (auto-routes to the fast user-timeline path). - Attribution - set
includeSearchTerms: truewhen running many queries to tag each result with its source search term. - Combined search modes - set
queryType: "Latest + Top"to run both X search modes and deduplicate. Use account timeline mode forfrom:userdate backfills. - 1-second monitoring - use Xquik account or keyword monitors with signed webhooks. Active monitors check every second.
Use cases
- Sentiment analysis - track brand perception across tweets
- Market research - monitor competitors and industry trends
- Lead generation - find prospects from social conversations
- Academic research - collect datasets for trend analysis
- Content curation - discover top-performing content and influencers
Data responsibility
The Actor requests public X fields. Results can contain personal data. Confirm a lawful purpose and follow applicable privacy rules. Ask qualified counsel when uncertain.
Need more than scraping?
Xquik provides 47 dashboard tools, 128 REST operations, signed webhooks, and a 2-tool MCP server.
- API Documentation - REST API with 128 documented operations
- Search Tweets API - the endpoint powering this Actor
- Batch Tweets API - fetch up to 100 tweets by ID
- User Tweets API - get a user's timeline
- MCP Server - browse 120 catalog routes; run 119 JSON or text operations
- Webhooks - signed event delivery
- GitHub - source code and issue tracker
FAQ
Do I need an X API key? No. This scraper uses its own infrastructure. No login or credentials required.
What limits a run? Your requested item limit and Apify spend limit stop the run. Apify account and platform limits still apply.
How fast is it? Runtime depends on route, result count, and upstream availability.
What search operators are supported? X advanced search operators such as from, to, mentions, date ranges, engagement filters, media filters, geo filters, and more.
Can I use the Apify API to run this? Yes. See the API tab for integration examples in Python, JavaScript, cURL, and more.
Can I schedule recurring scrapes? Yes. Use Apify's built-in scheduling to run this Actor on a cron.
Where do I report issues? Open an issue on GitHub or use the Issues tab on this Actor's page.
Can I get a custom solution? Yes. Visit xquik.com or check the API docs for direct API access with more endpoints and features.