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, replies, profiles, lists, and searches for $0.15 per 1,000 delivered rows on every Apify plan. Use 50+ filters, batch lookup, and flat exports. Filters run before billing. Apify bills platform usage separately. No X login. Built by Xquik. Not affiliated with X Corp.
Pricing
from $0.00015 / tweets
Rating
4.5
(14)
Developer
Xquik
Maintained by CommunityActor stats
29
Bookmarked
3.7K
Total users
1K
Monthly active users
5.2 hours
Issues response
a day ago
Last modified
Share
Scrape public X (Twitter) tweets for $0.15 per 1,000 delivered results on every Apify plan. Apify bills platform usage separately. No X login, start fee, 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 returns tweets, engagement metrics, public author profiles, and media. It accepts URLs, handles, List IDs, Tweet IDs, and search queries with 50+ filters.
Core behavior
- Filters and duplicate removal run before billing.
- One input supports lookups, timelines, Lists, search, and engagement modes.
- Tweet ID batches accept up to 10,000 IDs per run.
- Automatic search and quote pages request up to 300 rows.
- Saved cursors retain their original page limits and restart when expired.
- Profile modes combine timeline and author search when both apply.
- Page logs include
fetchDurationMs,processingDurationMs,pushDurationMs,statusDurationMs, andfullPageDurationMswithout repeating targets. - Checkpoints preserve accepted rows, timing, and failure counts after restarts.
Always use the latest build
Select latest for every run to receive all published fixes.
When no build is specified, Apify uses this Actor's latest default. Console
runs and standard API examples inherit that default.
Saved tasks may override the Actor default. Schedules and task integrations
reuse that choice. Keep every override set to latest.
Apify does not redirect exact build numbers to latest. Replace pinned numbers
with latest. Use an exact build only for temporary rollback or
reproducibility.
Read Apify's build tags, run options, and task documentation.
Task examples
Choose from 50 public tasks. Each has a bounded input and a matching dataset view. Every task opens with a real search or target. Edit it before running.
- 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, and video timestamps |
displayTextRange | X display text range when available |
contentDisclosure | Disclosure metadata when available |
conversationControl | Reply policy and public conversation owner |
reactionContext | Public post and user referenced by a reaction |
limitedActions | Public interaction restrictions and prompts |
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 metadata may include card, communityId, communityNote,
edit, noteTweet, and postCta. isTranslatable, place,
possiblySensitive, and viewState preserve other public context.
previousCounts preserves pre-edit engagement. tombstone preserves notices.
unmentionedUserIds lists users who left the conversation. See OpenAPI for the
exact fields.
Nested authors follow the public profile contract. It covers identity, counts, verification, availability, professional data, and profile biographies.
Tweet rows also preserve type, source, inReplyToId, inReplyToUserId,
inReplyToUsername, and retweeted_tweet. Quoted and reposted tweets preserve
the same supported safe fields recursively.
Media includes availability, geometry, tags, video variants, watchNowUrl, and
visitSiteUrl actions.
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.
How much does it cost to scrape tweets?
Every Apify plan costs $0.00015 per delivered row ($0.15 per 1,000). Apify
bills your platform usage separately. Xquik applies one charge per delivered
data row. Diagnostics are free in the diagnostics output.
No Xquik subscription applies. No separate start or query 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. Run reports separate
data rows in realRows and diagnostics in diagnosticRows.
failedSubtargets counts queries and profile targets stopped by read failures.
Pagination and payment failures preserve partial rows and unfinished cursors.
They never imply that the target is missing. Accepted rows remain data rows and
count toward billing. These runs use completionReason: "partial_failure". Fast
server-side pagination follows the same reporting contract.
Interrupted extraction also writes a free partial diagnostic. Available
results remain intact. The diagnostic reports availableResults,
failedTargets, retryable, and nextAction. A successful Actor exit confirms
delivery, not complete extraction.
completionReason: "pagination_safety_limit" is not a read failure. It means
fast server-side pagination retained valid rows, then reached its bounded safety
limit. failedSubtargets stays 0. Only accepted dataset rows are billed.
The default Apify timeout is 0, so runs have no time limit. The Actor
continues until the cap or eligible data is exhausted. A caller can still set a
finite Apify timeout. Then completionReason: "deadline_reached" means that
configured limit is near. The Actor keeps the final 15 seconds for checkpoints,
rows, reports, and a successful exit. Valid rows remain delivered and bill once.
Unfinished pagination remains resumable.
- Starts, queries, URLs, and single Tweet lookups add no separate fee.
- The Actor removes duplicates before writing or billing rows.
- No-input, invalid-input, and zero-output runs write 1 actionable record to the
free
diagnosticsoutput.
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 concurrent batches of up to 100. Partial successful
responses recheck unresolved IDs once. Batch output stays unique and matches
requested IDs. Profile URLs combine the profile timeline with author search.
Search URLs extract the query. List URLs use the dedicated list path instead of
generic list: search. maxItems caps results across all pasted URLs.
2. Bulk handles
Shorthand for many from:username searches:
{ "twitterHandles": ["elonmusk", "nasa", "openai"], "maxItems": 100 }
Each handle combines cursor pagination with author search. The Actor removes
duplicate rows before output and billing. Usernames accept an optional @
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"}
If mode is tweet or tweets without Tweet IDs, query input routes to
Search. This prevents valid searchTerms from returning an empty lookup.
Plain account backfills with date windows, such as
from:elonmusk since:2026-01-01 until:2026-01-02, use a bounded account route.
Recent windows combine the profile timeline with author search. Historical
windows use exact search. Compatible adjacent windows share one retrieval and
keep their original searchTerm attribution. maxItems caps results across all
search terms. All since:/until: and unix-time windows verify each returned
tweet. Filtered account windows read full source pages before applying the
output cap. Filtered pages continue until matching tweets or pagination ends.
Independent search terms run concurrently. Each term keeps ordered cursor
pagination for consistent depth and attribution. Account windows share one
retrieval only when they are compatible.
4. Lookup tweets by ID
{ "tweetIds": ["1846987139428634858", "1858743654778892784"], "maxItems": 100 }
The Actor processes 100 IDs per request. It runs batches concurrently and writes each completed group once. Partial responses recheck only unresolved IDs. Results preserve input order, remove duplicates, and exclude unrequested tweets.
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.
profileTweets follows the profile Posts tab. It returns target-authored
non-reply posts. Reply rows and conversation context from other authors are
excluded before billing.
profileReplies follows X's With Replies tab. It returns target-authored
profile posts and replies. Conversation context from other authors is excluded.
Use filter:replies or to: search when you need reply-only results.
mode: "replies" is stricter. It combines direct timelines, supported ranking
modes, every forward cursor module, labeled hidden-content branches, time
partitions scaled to the reported reply count, and search. Every tweet row has
inReplyToId equal to the requested tweet ID. Nested conversation replies never
count as direct replies. If X exposes fewer replies than reported, the Actor
keeps the safe partial rows. It adds 1 replies-incomplete record to
diagnostics when capacity remains. Complete results require 80% of the current
reported direct-reply count. replyCoverage reports counts, strategies,
pagination anomalies, missing fields, and the recommended fallback. The Actor
honors transient retry delays before returning zero output. Set maxItems up to
25,000 for one large reply target.
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, the Actor writes a free
diagnostics record. 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.
Legacy diagnostics use resultType, actorVersion, and replyCoverage. Rich
and raw output apply fieldStyle recursively. For example, snake case uses
result_type, actor_version, and reply_coverage. 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 concurrently. The
Actor deduplicates before billing and backfills unused capacity from either
mode. Top is relevance-ranked and is not exhaustive. Set
includeSearchTerms: true to attach each matching query as a searchTerm
field. Short transient read outages get one extra retry before the Actor returns
a diagnostic.
When you set lang, the Actor verifies each returned tweet's language. It skips
mismatches and continues paging for matching tweets.
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 exposes these controls:
- Mode, Output Variant, Field Style, Output Preset, and Sort By are validated selects.
- The Start URLs and Profile URLs fields accept strings or
{ "url": "..." }objects. Their JSON editors preserve both API formats. - Structured Filters exposes grouped controls without nested JSON.
- Canonical filter groups keep equivalent flat operators out of the form. JSON, API, SDK, automation, and saved task inputs still accept them.
- 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". Historical outputVariant values such as
compact and full remain accepted and use Legacy output. The visual form
labels them as Legacy aliases.
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 |
Date windows use an inclusive lower bound and exclusive upper bound. The Actor verifies both bounds before adding or charging for each tweet.
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.
Examples:
- Paste a tweet URL into Start URLs.
- Paste a profile URL or add the username to X Handles. The Actor combines its timeline with author search.
- Use
from:user since:YYYY-MM-DD until:YYYY-MM-DDas a Search Term for account backfills. The Actor merges compatible windows before retrieval. Recent windows combine the profile timeline with author search. Historical windows use exact search. - Paste a list URL into Start URLs.
- Combine
twitterContentwith filters such asfrom:,since:,min_faves:, andfilter:mediafor advanced searches.
The scraper routes list URLs through the dedicated list path instead of generic
list:ID search.
Output
Each tweet is a JSON object with available metadata:
Dataset and run-report schemas include field titles, descriptions, and examples. Agents can inspect them without guessing field meaning.
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.
Run options
- Set Apify max total charge to cap run cost. Leave
maxItemsempty for maximum rows within that budget, or setmaxItemswhen you want fewer tweets. - 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. - Pass
tweetIdsfor concurrent 100-ID batches. Paste a profile URL to use the fast user-timeline path. - Set
includeSearchTerms: truewhen running many queries to tag each result with its source search term. - Set
queryType: "Latest + Top"to run both X search modes concurrently. Deduplication and result caps remain atomic. - Use Xquik account or keyword monitors for 1-second checks and signed webhooks. Active monitors check every second.
Use cases
- Track brand sentiment across tweets.
- Monitor competitor posts and industry terms.
- Find prospects in public conversations.
- Collect public datasets for research.
- Find posts with high public engagement.
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 also provides 47 dashboard tools, 129 REST operations, signed webhooks, and an MCP server.
- API documentation: REST API guides
- 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: discover supported tools
- 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 supports authors, recipients, mentions, dates, engagement, media, and location.
Can I use the Apify API to run this? Yes. See the API tab for Python, JavaScript, and cURL examples.
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 read the API docs for the dashboard, API, MCP server, and webhooks.