X Tweet Scraper | $0.00015/Tweet | Pay-Per-Result
Pricing
from $0.00015 / tweets
X Tweet Scraper | $0.00015/Tweet | Pay-Per-Result
Scrape X (Twitter) tweets, replies, profiles, lists, and searches from $0.00015 per delivered row on every Apify plan. Get 63 fields per tweet, 50+ filters, batch lookup & flat exports. No X login. Built by Xquik. World's fastest & cheapest X (Twitter) scraper service. Not affiliated with X Corp.
Pricing
from $0.00015 / tweets
Rating
4.5
(14)
Developer
Xquik
Maintained by CommunityActor stats
30
Bookmarked
4.7K
Total users
1.5K
Monthly active users
8.3 hours
Issues response
12 minutes ago
Last modified
Share
English · Español · Türkçe · 简体中文 · 日本語 · 한국어 · Deutsch · Français · Italiano
Watch how Framer uses Xquik scrapers with
Claude Code, Codex, Cursor, and more, from 6:07.
Xquik is the world's fastest & cheapest X (Twitter) scraper service with the most complete X data. Xquik's X Tweet Scraper collects tweets, replies, profiles, lists & searches with 50+ filters. Public benchmarks prove it is the cheapest & fastest of 12 tweet Actors. Its rows carry 2x the median Actor's fields, as the benchmark below shows. Most other Apify Actors charge before filtering or deduplicating. Xquik charges only for delivered, unique, filter-matching results.
Scrape public X (Twitter) tweets from $0.00015 per delivered result on every Apify plan. Apify bills platform usage separately. You need no X login, & you pay 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?
Xquik's X Tweet Scraper returns tweets, engagement metrics, public author profiles & media. It accepts URLs, handles, List IDs, Tweet IDs & search queries with 50+ filters.
Key features
- Filters & duplicate removal run before billing.
- One input supports lookups, timelines, Lists, search & engagement modes.
- Tweet ID inputs have no fixed count cap. Your Apify spend & timeout settings still apply.
- Run logs show page timing in
fetchDurationMs,processingDurationMs,pushDurationMs,statusDurationMs&fullPageDurationMs. - Runs keep delivered rows & progress when Apify restarts them.
Use cases
- Feed research, enrichment, analytics & AI training with more fields per tweet. Our median rich row had 63 fields on 2026-09-29. That is 2x the median of 11 other Actors.
- Track brand sentiment across tweets.
- Monitor competitor posts & industry terms.
- Find prospects in public conversations.
- Collect public datasets for research.
- Find posts with high public engagement.
What data can X Tweet Scraper extract?
| Field | Description |
|---|---|
id | Tweet ID |
text | Full 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 URL |
author | 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 |
isRetweet | Whether this row is a retweet, original attached |
isPinned | Whether the author pinned this post, flat rows |
isReply | Whether this tweet is a reply |
quoted_tweet | Quoted tweet object (if quote tweet) |
conversationId | Thread/conversation ID |
resultType | Row type for rich, engagement & diagnostic rows |
sourceTweetId | Source tweet ID for article and engagement modes |
article | Structured article data in mode: "article" |
Optional tweet metadata includes authorUnavailable, card, communityId,
communityNote, edit, exclusiveContent, noteTweet & postCta.
isTranslatable, place, possiblySensitive & viewState keep other public
context. previousCounts keeps pre-edit engagement. tombstone keeps
visibility notices. unmentionedUserIds lists users who left the conversation.
See OpenAPI for the exact fields.
Set outputVariant: "rich" for the most data per row. Rich rows add
hasCommunityNotes, quotedTweetPermalink, unavailableAuthorId & media
sourceUser at the end. Legacy rows stay unchanged.
Nested author objects carry public profile fields. They cover identity,
counts, verification, availability, professional data & profile biographies.
Retweet rows set isRetweet to true. Their text carries the original post
in full. retweeted_tweet holds the original post with its author & counts.
Tweet rows also keep type, source, inReplyToId, inReplyToUserId,
inReplyToUsername & retweeted_tweet. Quoted & reposted tweets carry the same
fields at every nesting level.
Media carries availability, geometry, tags & video variants. It also carries the
watchNowUrl & visitSiteUrl actions.
Rows never include viewer-only state. The Actor removes follow, block, mute, bookmark, like, repost, edit-permission & similar viewer flags. Raw output drops them too.
How do I use X Tweet Scraper to scrape tweet data?
Each example below is a complete input. Pick the one that fits your data.
Follow these steps in Apify Console:
- Open a task example or the Input tab.
- Add URLs, handles, Tweet IDs or search terms.
- Set
maxItems& any filters you need. - Click Start & wait for the run to finish.
- Export the dataset as JSON, CSV, Excel or HTML.
The recipes below show the input for each source.
Paste URLs
Paste any 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 return those tweets, unique & in your input order. Profile URLs
return the account's posts. Search URLs run their query. List URLs return the
List's posts. maxItems caps results across all pasted URLs.
Scrape many handles
Handles work as shorthand for many from:username searches:
{ "twitterHandles": ["elonmusk", "nasa", "openai"], "maxItems": 100 }
Each handle returns that account's posts. The Actor removes duplicate rows
before output & billing. You can add usernames with or without @. Handles &
profile URLs keep reposts, as the Posts tab on X does. They keep them even with
dates or filters. Set tweetTypes.excludeRetweets to drop them.
Search tweets
Put one or more queries in the Search terms field:
{"searchTerms": ["from:elonmusk AI", "#bitcoin lang:en"],"maxItems": 1000,"queryType": "Latest"}
With mode set to tweet or tweets & no Tweet IDs, queries run as Search.
Valid searchTerms then never return an empty lookup.
Account backfills with date windows work too, such as
from:elonmusk since:2026-01-01 until:2026-01-02. Each term keeps its own
searchTerm attribution. maxItems caps results across all search terms. The
Actor checks every returned tweet against since:, until: & Unix-time
windows. Filtered searches keep reading until they find matches or X has no more
results.
A from: search term returns what X search returns, so it leaves out reposts.
Add include:nativeretweets to keep them, or filter:nativeretweets for
reposts only.
Look up tweets by ID
{ "tweetIds": ["1846987139428634858", "1858743654778892784"], "maxItems": 100 }
Results keep your input order, drop duplicates & include only the tweets you
asked for. The lookup also accepts tweetId, tweetIDs, tweets, postIds,
lookupPostIds, tweetUrls & postUrls.
Engagement, thread & article modes
Set mode to force one route, whatever other fields the input holds:
{ "mode": "replies", "replyTweetIds": ["1846987139428634858"], "maxItems": 100 }
Tweet & search modes are tweet, tweets & search. Profile modes are
profileTweets, profileReplies, profileMedia & profileLikes. listTweets
reads List posts, & article reads the X article in a post. Modes for a single
post are replies, quotes, thread, retweeters & favoriters.
profileTweets follows the profile Posts tab on X. It returns the account's
posts, reposts & replies to its own posts. Rows come in date order. The Actor
drops replies to other accounts before billing. It also drops conversation
context from other authors.
For original posts only, exclude the types you do not want:
{"mode": "profileTweets","twitterHandles": ["apify"],"tweetTypes": { "excludeReplies": true, "excludeRetweets": true },"maxItems": 100}
tweetTypes.excludeReplies, excludeRetweets & excludeQuotes work on every
source. A search sends them to X as -filter:replies, -filter:nativeretweets
& -filter:quote. On a profile or a List, the Actor drops those rows itself.
Excluded rows never reach the dataset, so you never pay for them. They never
count toward maxItems either.
profileReplies follows X's With Replies tab. It returns the account's own
posts & replies. The Actor excludes conversation context from other authors. Use
filter:replies or a to: search for reply-only results.
Search & paginated Tweet modes support time.since, time.until, Unix
timestamps & lang. These include profile Posts, With Replies, Media, Likes,
Lists, replies, quotes & threads. Matching flat date operators work too. The
Actor verifies each row before billing. The lower date bound is inclusive. The
upper bound is exclusive. Date filters exclude rows without usable dates.
Language filters exclude missing or mismatched languages. Filtered rows never
use up your result limit.
The same date for since & until gives an empty window. Set until to the
next day to get 1 full day. List runs with a date window reach older days
quickly. They end once they pass your lower bound. Windows far back in a List
can miss a few replies. Tweet filters do not apply to user lists or direct Tweet
or article lookups.
time.withinTime & within_time work in the same modes. A value of 7d keeps
the last 7 days before the run starts reading. A window reaching back before
2006 keeps every post.
mode: "replies" is stricter. Every tweet row has inReplyToId equal to the
requested tweet ID. Nested conversation replies never count as direct replies.
If X shows fewer replies than it reports, the Actor keeps the rows it found. It
adds 1 replies-incomplete record to diagnostics when your limit is not
reached. The run stays partial until it reaches your limit or X has no more
replies. replyCoverage reports reply counts & coverage details. Set maxItems
to the total you want, even above 25,000 for one reply target.
Article rows include resultType: "article", sourceTweetId, article &
optional author. Engagement user rows include resultType: "user",
sourceTweetId & engagementMode.
Retweeters work as a normal public engagement mode. Favoriters are best effort.
X may show likers only on eligible or owner-visible posts. Profile likes are
best effort too, since many public profiles have no readable Likes tab. If X
shows no users or liked tweets, the Actor writes a free diagnostics record.
Tweet rows can carry bookmark counts. X does not show which accounts bookmarked
a post.
Export flat CSV rows
Keep the default nested JSON fields, or add spreadsheet-friendly columns:
{ "searchTerms": ["from:nasa moon"], "maxItems": 100, "outputPreset": "flat" }
Flat output keeps author & media unchanged. It adds top-level fields such as
authorUsername, authorName, authorFollowers, tweetUrl, twitterUrl,
mediaUrls, imageUrls & videoUrls.
Every flat tweet row carries media. A tweet without media has an empty list.
Each row then has the same keys in a spreadsheet or typed pipeline.
Choose field names
Legacy field names are the default. Pick a style for rich or raw results:
{"searchTerms": ["from:nasa moon"],"maxItems": 100,"outputVariant": "rich","fieldStyle": "snake_case"}
Use camelCase or snake_case for top-level & nested result fields. Flat snake
case output includes fields such as author_username & 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 & replyCoverage. Rich &
raw output apply fieldStyle at every nesting level. For example, snake case
uses result_type, actor_version & 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.
Combine advanced filters
Combine user, date, location, media & 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 in one run. The Actor
removes duplicates before billing & fills your limit from either mode. Top
sorts by relevance & does not return every match. Set includeSearchTerms: true
to attach each matching query as a searchTerm field.
When you set lang, the Actor verifies each returned tweet's language. It skips
mismatches & keeps reading for matching tweets.
Task examples
Choose from 50 public tasks. Each has a bounded input & a matching dataset view. Every task opens with a real search or target. Edit it 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 electric vehicle conversations
How much does it cost to scrape tweets?
Xquik's X Tweet Scraper costs $0.00015 per delivered row on every Apify plan.
Apify bills your platform usage separately. Xquik applies one charge per
delivered data row. Diagnostics are free in the diagnostics output.
- You need no Xquik subscription.
- You pay no separate start or query fee. URLs & single Tweet lookups add no fee either.
- Filters & deduplication run before billing. You never pay for filtered or duplicate rows.
- No-input, invalid-input & zero-output runs write 1 actionable record to the
free
diagnosticsoutput.
A run that hits a problem, or a large run, also writes a run-report record.
Its estimatedChargeUsd uses the live pay-per-event price from Apify. Runs with
a problem always write run-report, including no-input and invalid-input exits.
A small run that goes well skips it & saves Apify usage. Turn on
alwaysSaveRunRecords to write it on every run. Run reports separate data rows
in realRows from diagnostics in diagnosticRows.
To cap what a run can spend, see Run options.
Benchmark
Xquik's X Tweet Scraper beat 11 other tweet Actors on cost & speed. Its median row had 63 fields, 2x the median of the others.
xquik/x-tweet-scraper: 890 useful tweets, $0.000175 per useful tweet, 39.2 per second & 63 fields per row. View runxquik/x-tweet-scraper: 883 useful tweets, $0.000176 per useful tweet, 25.2 per second & 63 fields per row. View runxquik/x-tweet-scraper: 882 useful tweets, $0.000177 per useful tweet, 25.7 per second & 63 fields per row. View runxquik/x-tweet-scraper: 877 useful tweets, $0.000178 per useful tweet, 26.9 per second & 63 fields per row. View runscrapesmith/twitter-x-scraper-tweets-profiles-replies: 813 useful tweets, $0.000185 per useful tweet, 10.5 per second & 36 fields per row. View runscrapesmith/twitter-x-scraper-tweets-profiles-replies: 805 useful tweets, $0.000187 per useful tweet, 10.6 per second & 36 fields per row. View runscrapesmith/twitter-x-scraper-tweets-profiles-replies: 805 useful tweets, $0.000187 per useful tweet, 10.7 per second & 36 fields per row. View runkaitoeasyapi/twitter-x-data-tweet-scraper-pay-per-result-cheapest: 880 useful tweets, $0.000250 per useful tweet, 9.1 per second & 46 fields per row. View runscraper_one/x-posts-search: 804 useful tweets, $0.000314 per useful tweet, 3.3 per second & 14 fields per row. View rundanek/twitter-scraper: 807 useful tweets, $0.000347 per useful tweet, 5.0 per second & 27 fields per row. View runtweetapi/twitter-x-search-scraper: 337 useful tweets, $0.000374 per useful tweet, 2.6 per second & 28 fields per row. View runapi-ninja/x-twitter-advanced-search: 837 useful tweets, $0.000430 per useful tweet, 7.4 per second & 28 fields per row. View runapidojo/twitter-scraper-lite: 251 useful tweets, $0.000494 per useful tweet, 12.9 per second & 54 fields per row. View runapidojo/tweet-scraper: 481 useful tweets, $0.000832 per useful tweet, 7.8 per second & 55 fields per row. View runxtdata/twitter-x-scraper: 1,378 useful tweets, $0.001168 per useful tweet, 11.9 per second & 67 fields per row. View runseemuapps/x-tweet-scraper: 805 useful tweets, $0.001242 per useful tweet, 6.9 per second & 24 fields per row. View runmaximedupre/twitter-scraper: 46 useful tweets, $0.002846 per useful tweet, 0.3 per second & 31 fields per row. View run
Every Actor ran the same search & filters. The other Actors ran on 2026-09-27.
Xquik's runs set outputVariant: "rich" & ran on 2026-09-29. All runs used the
Bronze tier. A useful tweet is a unique English original post with 10+ likes.
Cost is the customer's total spend per useful tweet. Ours includes the Apify
usage our customers pay. Fields per row is the median count of non-empty fields,
nested ones included. A list counts as 1 field. Open a run for its input, log &
dataset.
Empty, partial & stopped runs
Xquik's X Tweet Scraper explains empty, partial & stopped runs for free. The run status says why the run stopped. It also counts charged results & targets read.
Empty results
Check an empty result before you pay for another run. The filtering object in
reports & final diagnostics counts the rows your filters removed. Read
serverFilteredRows, actorFilteredRows & pagesWithUnknownServerFiltering.
You never pay result charges for filtered rows.
A run can finish below your limit when X has no more results. It reports
outcome: "complete" with completionReason: "source_exhausted". Interrupted
runs keep their partial outcome & retry guidance.
Partial runs
failedSubtargets counts queries & profile targets that stopped after an error.
Delivered rows stay in the dataset & count toward billing. An error never means
the target is missing. These runs use completionReason: "partial_failure".
An interrupted run also writes a free partial diagnostic. Results already
delivered stay intact. The diagnostic reports availableResults,
failedTargets, retryable & nextAction. A successful Actor exit confirms
delivery. It does not confirm complete extraction.
Stop causes
The status text names every cause of the stop. A run with a missing account & a
stalled search says both. stopCauses lists each cause with its own message,
retryable & nextAction. The causes are target_not_found,
target_protected, search_unavailable, likes_hidden, target_failed,
pagination_safety_limit, reply_reach & deadline_reached. The run is
retryable when any cause is.
Missing & unavailable targets
A missing or protected target is not a failure. X has nothing to read there. The
run reads every other target to the end. It reports outcome: "complete". Its
completion reason comes from the targets it read, such as source_exhausted.
failedSubtargets leaves those targets out. The status text & a free complete
diagnostic count them. A run without other rows writes a zero-output
diagnostic instead.
A search X cannot run counts as a failure. X.com shows "Something went wrong" for such a search. The run stops it at once without retries. Likes X hides also count as failures & stop at once. X shows who liked a post only to its author. It shows an account's liked posts only to that account.
When all failures concern unavailable targets, diagnostics set
retryable: false. Check target URLs or usernames & choose available public
accounts. Narrow a search X cannot run or change its filters. Read retweeters,
replies or posts instead of hidden likes. Other failures keep retry guidance for
unfinished targets.
The diagnostic names those targets in unavailableTargets. Each entry has the
target as you entered it, a reason & a nextAction. The reason is
not_found, protected, search_unavailable or likes_hidden. A search entry
can also have a fix, such as the operator to remove. The list holds up to 100
entries. Remove those targets from your input.
Safety & time limits
completionReason: "pagination_safety_limit" is not a read failure. The run
kept its valid rows. It then ended a target that stopped returning new results.
The run reports incomplete extraction. failedSubtargets stays 0. You pay
only for delivered rows.
The default Apify timeout is 0, so runs have no time limit. The Actor
continues until it reaches your cap or runs out of eligible data. You can still
set a finite Apify timeout. Then completionReason: "deadline_reached" means
that limit is near. The Actor saves rows & the report, then exits cleanly before
the limit. You pay once for each delivered row.
Input
The Input tab lists every option. Give at least one of startUrls,
twitterHandles, listIds, tweetIds, searchTerms or twitterContent.
Their documented aliases work too. Every other field is optional.
Examples:
- Paste a tweet URL into Start URLs.
- Paste a profile URL, or add the username to X handles.
- Use
from:user since:YYYY-MM-DD until:YYYY-MM-DDas a search term for account backfills. - Paste a List URL into Start URLs.
- Combine
twitterContentwith filters such asfrom:,since:,min_faves:&filter:mediafor advanced searches.
Top supported search operators
| Operator | Example | Purpose |
|---|---|---|
from: | from:elonmusk | Only tweets by this user |
to: | to:OpenAI | Only replies to this user |
@ | @nasa | Mentions of 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 |
X no longer searches filter:vine, filter:consumer_video, filter:pro_video,
filter:news or retweets_of:. A search with one of them ends at once. A free
diagnostic names the fix. Keep each query to 512 characters or fewer. X searches
no more than that.
Date windows include the lower bound & exclude the upper bound. The Actor checks both bounds before it adds or charges for each tweet.
For the full operator list, see Twitter Advanced Search.
Migrate from another tweet Actor
Paste the input you already use. Xquik's X Tweet Scraper reads the field names other tweet Actors use. It maps them to its own fields. Canonical names stay the documented default. An alias never drops a field & never changes what you pay. The input form lists canonical fields only, so it stays short. Aliases work in JSON, API, SDK, automation & saved task inputs.
Each line names the fields you already use, then the field they map to:
startUrls,urls,tweetUrls,postUrls,profileUrls,accountUrls:startUrlsprofileUrl, as one string:startUrlstweetIds,tweetIDs,tweets,postIds,lookupPostIds,tweet_ids, ortweetIdas one string:tweetIdstwitterHandles,usernames,user_names,userNameList,handles,screenNames,profileTweets:twitterHandlesusername,handle,screenName, as one string:twitterHandlessearchTerms,searchQueries,queries,search, as a list or one search per line:searchTermstwitterContent,query,searchQuery:twitterContentmaxItems,maxResults,max_results,resultsLimit,count,resultsCount,numberOfTweets,maxPosts,max_posts,max_items,maxTweets,tweetsDesired:maxItemssort:queryTypetweetLanguage,language:langauthor,inReplyTo,mentioning:from,to,@start,startDate,end,endDate:since,untilminimumRetweets,minimumFavorites,minimumReplies:min_retweets,min_faves,min_repliesonlyImage,onlyVideo,onlyQuote,onlyTwitterBlue:filter:images,filter:videos,filter:quote,filter:blue_verifiedgeotaggedNear,withinRadius:near,withinquickDateRangefrom the Google Search Scraper, such asd7,w2,m1ory:since_time, counted back from the run start
How a pasted input behaves:
- Every source runs. An input with URLs, handles, search terms, List IDs & Tweet
IDs runs them all.
maxItemsapplies across the whole run. - A search query next to
searchTermsruns as 1 more term. - A profile URL written as
x.com/@namereads likex.com/name. - When you set an alias & its canonical field, the canonical value wins. The run log names the alias that lost.
- The run log names every field the Actor ignores, such as
customMapFunction. The Actor never drops a field silently. - A row cap must be a whole number of 1 or more.
maxResults: 0stops the run before it reads or charges anything. quickDateRange: "m1"reads the past month on every route. Months & years count back on the calendar. Without h, d, w, m or y, the run stops before any read or charge.- The Actor has no page unit. Replace
maxPageswithmaxItems. - The Actor has no user ID field. Send handles or profile URLs instead of
userIdoruser_ids. - Search operator fields such as
from,min_faves,since_time&filter:imagesalready use X's names. They need no mapping.
Console & API input
The Console form has these controls:
- Mode, Output Variant, Field Style, Output Preset & Sort By are validated dropdowns.
- Start URLs & Profile URLs accept strings or
{ "url": "..." }objects. Their JSON editors keep both API formats. - Structured filters offer grouped controls, so you need no nested JSON.
- The form hides flat operators that a filter group already covers. JSON, API, SDK, automation & saved task inputs still accept them.
- Max Items & 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. The aliases in the migration table
above stay available. includeRaw is an alias for outputVariant: "raw". Older
outputVariant values such as compact & full still work as Legacy output.
The form labels them as Legacy aliases.
Output
Each tweet row is a JSON object with the metadata X makes available. The dataset & run-report schemas give each field a title, description & example. AI agents can read them without guessing what a field means.
Sample values are illustrative. Your runs return live data from X.
{"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 the dataset as JSON, CSV, Excel or HTML.
Run options
- Set Apify's max total charge to cap run cost. Leave
maxItemsempty to get the most rows that budget allows. SetmaxItemswhen you want fewer tweets. - Set
maxTotalChargeUsdin the Apify API, or Max cost per run in Console. Apify passes that limit to the Actor asACTOR_MAX_TOTAL_CHARGE_USD. The Actor turns it into the maximum billable row count. - Pass
tweetIdsto look up many tweets at once. Paste a profile URL to read one account's posts. - With many queries, set
includeSearchTerms: trueto tag each result with its search term. - Set
queryType: "Latest + Top"to run both X search modes in one run. Deduplication & result caps apply across both. - Use Xquik account or keyword monitors for 1-second checks & signed webhooks. Active monitors check every second.
Always use the latest build
Select latest for every run to get every published fix.
If you pick no build, Apify runs Xquik's X Tweet Scraper on its latest
default. Console runs & standard API examples inherit that default.
Saved tasks can override the Actor default. Schedules & 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 a temporary rollback or to reproduce
a run.
Read Apify's build tags, run options & task documentation.
Related Xquik Actors
Every Xquik Actor shares the same extraction engine, filter-first billing & diagnostics. Pick the one that matches the data you need.
- X Profile Scraper: Scrapes profiles plus their posts, replies, media & followers from handles, IDs or URLs. Use it when you start from accounts rather than searches. From $0.00015 per row.
- X Reply Scraper: Scrapes replies, comments & whole conversations under posts with 25+ filters. Use it when you need the discussion beneath tweets. From $0.00015 per row.
- X Engagement Scraper: Scrapes replies, quotes, retweeters & threads for post URLs or IDs in bulk. Use it when you measure who engaged with posts. From $0.00015 per row.
- X Follower Scraper: Scrapes followers, following, List members, subscribers & Community members as profile rows. Use it when you need audience or member lists. From $0.00015 per profile.
- X User Search Scraper: Searches users by handle, bio & location with follower, verification, age & location filters. Use it when you build account lists from search. From $0.00015 per profile.
- X List Scraper: Scrapes List posts, members & followers from List URLs or IDs. Use it when a curated List defines your sources. From $0.00015 per row.
- X Community Scraper: Scrapes Community info, posts, searches, members & moderators. Use it when your sources are X Communities. From $0.00015 per row.
- X Trends Scraper: Scrapes real-time trends by location with rank, volume, query & WOEID. Use it when you track what is trending where. From $0.00015 per trend.
- X Article Scraper: Scrapes long-form X Articles as Markdown & text with covers, authors, dates & metrics. Use it when you need article bodies, not tweets. From $0.00015 per article.
- X Media Downloader: Extracts or stores photos, videos & GIFs from posts or profiles with MP4 & metadata options. Use it when you need the media files themselves. From $0.00015 per media row.
- X (Twitter) Brand Monitoring with AI Analysis: Tracks brand mentions with AI relevance, sentiment & customer-experience answers & compares runs. Use it when you watch a brand over time. From $0.0003 per analyzed tweet.
- X Tweet Sentiment Analysis with AI: Labels attitude, intensity & sarcasm probability for every tweet with AI. Use it when you need general sentiment on any topic. From $0.0003 per analyzed tweet.
- X (Twitter) Stock & Crypto AI Trading Signals: Labels bullish, bearish, neutral or mixed stance, content type, conviction & asset relevance with AI. Use it when you follow stocks, crypto or trading talk. From $0.0003 per analyzed tweet.
- X (Twitter) News Monitor with AI Analysis: Labels news posts by format, source attribution & topic relevance with AI. Use it when you separate reporting from commentary. From $0.0003 per analyzed tweet.
- X Tweet Classifier with AI Analysis: Answers your own category, score & yes/no questions for every tweet with AI. Use it when the preset analyses do not fit your labels. From $0.0003 per analyzed tweet.
- X Tweet Viral Score Analyzer with AI: Estimates a Viral Score from 0 to 100 & a verdict for every tweet from 8 AI trait answers. Use it when you study why tweets spread or flop. From $0.0003 per analyzed tweet.
Need more than scraping?
Xquik also provides 47 dashboard tools, 129 REST operations, signed webhooks & an MCP server.
- API documentation: REST API guides
- Search Tweets API: search tweets over REST
- 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 & issue tracker
FAQ
Answers to common questions, then where to get help.
Do I need an X API key?
No. You need no X API key, login or credentials.
What limits a run?
Your item limit & your Apify spend limit stop the run. Apify account & platform limits still apply.
How fast is it?
Xquik's X Tweet Scraper delivered 25.2 to 39.2 useful tweets per second in the benchmark. Runtime depends on your input, the result count & X availability.
Why do I get posts that X's search tab leaves out?
X leaves some matching posts out of its Latest tab. Xquik's X Tweet Scraper returns those posts too. Every post is a real X search result for your query. You pay for each post once.
Which search operators work?
X advanced search supports authors, recipients, mentions, dates, engagement, media & location. See Top supported search operators for examples.
Can I use the Apify API to run this?
Yes. See the API tab for Python, JavaScript & cURL examples.
Can I schedule recurring scrapes?
Yes. Use Apify's built-in scheduling to run Xquik's X Tweet Scraper on a cron.
Can I get a custom solution?
Yes. Visit xquik.com or read the API docs for the dashboard, API, MCP server & webhooks.
Is it legal to scrape X data?
Xquik's X Tweet Scraper requests public X fields. Results can contain personal data. Confirm a lawful purpose & follow the privacy rules that apply to you. Ask qualified counsel when unsure.
Where do I get help?
Open an issue in the Issues tab on the Actor page, or on GitHub. You can also contact support@xquik.com with the run ID.