X Tweet Scraper | $0.15/1K Tweets | Pay-Per-Result avatar

X Tweet Scraper | $0.15/1K Tweets | Pay-Per-Result

Pricing

from $0.00015 / tweets

Go to Apify Store
X Tweet Scraper | $0.15/1K Tweets | Pay-Per-Result

X Tweet Scraper | $0.15/1K Tweets | Pay-Per-Result

Scrape X (Twitter) tweets, replies, profiles, lists, and searches from $0.15 per 1,000 delivered rows on paid Apify plans. Use 50+ filters, batch lookup, flat exports, and resumable maximum coverage. Filters run before billing. No X API key or login. Built by Xquik. Not affiliated with X Corp.

Pricing

from $0.00015 / tweets

Rating

4.5

(13)

Developer

Xquik

Xquik

Maintained by Community

Actor stats

23

Bookmarked

2.8K

Total users

828

Monthly active users

2.9 hours

Issues response

41 minutes 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
  • Automatic fixes - keep every run on latest for current speed, coverage, and correctness improvements
  • Maximum resumable search and quotes - automatic pages request up to 300 rows and continue with exact queries, dates, authors, replies, and limits
  • Compatible saved cursors - automatic cursors keep current coverage while older saved cursors retain their original page limits. Expired automatic cursors restart safely
  • Canonical time bounds - searches send each resolved time bound once
  • Maximum profile coverage - profile posts and With Replies runs combine resumable timeline and author-search coverage
  • Fast handle timelines - pure Latest handle inputs use automatic With Replies coverage. Search filters and time bounds keep exact search routing
  • Private request diagnostics - logs keep bounded route classes and numeric evidence. One-way keys correlate runs without exposing customer or platform identifiers. Progress messages never repeat profile, list, or Tweet targets
  • Complete page timing - privacy-safe logs expose fetchDurationMs, processingDurationMs, pushDurationMs, statusDurationMs, and fullPageDurationMs with row and cursor-class counts
  • Safe restart resume - billable output is durably checkpointed before writing. Restarts restore accepted Tweets, timing, and failure counts
  • Run-limit-safe fetching - slow bulk fetches fall back to checkpointed direct pagination before Apify's time limit

Always Use the Latest Build

Select latest for every run. It receives current speed, coverage, and correctness 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.

What can this scraper do?

  • Scrape tweets from an X list - paste a list URL like https://x.com/i/lists/123456 and 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)
  • Exact author search - bare from:handle queries include matching posts and replies without changing search meaning
  • Batch tweet lookup - fetch up to 10,000 tweets by ID in one run. Chunks run concurrently. Partial responses recheck unresolved IDs once
  • Profile Posts tab support - profileTweets returns target-authored non-reply posts, even when a source timeline mixes in reply rows
  • Engagement and thread modes - collect strict direct replies with coverage evidence, quotes, thread context, retweeters, best-effort favoriters, articles, profile media, and profile likes
  • With Replies tab support - profileReplies and /with_replies return target-authored posts and replies from X's With Replies tab. Conversation context from other authors is excluded before billing
  • 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 search modes concurrently, deduplicate before billing, and backfill unused capacity from either mode
  • 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 camelCase or snake_case fields 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.

What data can X Tweet Scraper extract?

FieldDescription
idTweet ID
textFull tweet text (including Note Tweets up to 25k chars)
createdAtX native timestamp string
likeCountNumber of likes
retweetCountNumber of retweets
replyCountNumber of replies
quoteCountNumber of quote tweets
viewCountNumber of views
bookmarkCountNumber of bookmarks
langTweet language
urlDirect link to tweet
tweetUrlFlat output tweet URL alias
twitterUrlFlat output twitter.com-formatted URL
authorAvailable author fields (username, bio, website, counts)
authorUsernameFlat output author handle
authorFollowersFlat output author follower count
authorUrlFlat output author website when available
authorDescriptionFlat output author bio text
authorCoverPictureFlat output author banner image URL
authorPinnedTweetIdsFlat output author pinned tweet IDs
mediaAttached images, videos, GIFs
mediaUrlsFlat output media URLs
imageUrlsFlat output image URLs
videoUrlsFlat output video URLs
entitiesHashtags, URLs, mentions
displayTextRangeX display text range when available
contentDisclosureDisclosure metadata when available
isLimitedReplyWhether replies are limited
isNoteTweetWhether this is a Note Tweet (long-form post)
isQuoteStatusWhether this tweet quotes another tweet
isReplyWhether this tweet is a reply
quoted_tweetQuoted tweet object (if quote tweet)
conversationIdThread/conversation ID
resultTypeRow type for rich rows, engagement rows, and diagnostics
sourceTweetIdSource tweet ID for article and engagement modes
articleStructured article data in mode: "article"

Optional tweet fields preserve extra data whenever X provides it.

FieldDescription
cardLink card metadata
communityNoteCommunity Note metadata
editEdit history metadata
isTranslatableTranslation availability
noteTweetLong-form post metadata
placeTagged place metadata
possiblySensitiveX sensitivity state
previousCountsPre-edit engagement counts
viewStateX view-state metadata

Nested author data also preserves optional public profile metadata.

FieldDescription
affiliatesHighlightedLabelAffiliate label metadata
businessAccountAffiliatesCountBusiness affiliate count
creatorSubscriptionsCountCreator subscription count
hasGraduatedAccessGraduated access state
hasHiddenSubscriptionsOnProfileHidden subscription state
highlightsInfoProfile highlights metadata
identityVerificationIdentity verification metadata
isProfileTranslatableProfile translation availability
parodyCommentaryFanLabelParody or fan label
profileDescriptionLanguageDetected bio language
profileImageShapeProfile image shape
profileInterstitialTypeProfile interstitial type
profileSortEnabledProfile sorting state
profileTranslatorTypeProfile translator type
superFollowEligibleSubscription 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 applies one charge per delivered default dataset row: 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. Run reports separate data rows in realRows and diagnostics in diagnosticRows.

failedSubtargets counts queries and profile targets stopped by read failures. Accepted rows remain data rows and count toward billing. These runs use completionReason: "partial_failure". Fast server-side pagination follows the same reporting contract.

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.

  • 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, search terms, and ranking passes 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 a status such as no-input, invalid-input, or zero-output. Diagnostic rows explain what happened and are easy to filter out with dataset.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 concurrent batches of up to 100. Partial successful responses recheck unresolved IDs once. Batch output stays unique and matches requested IDs. Profile URLs auto-route to maximum profile coverage. 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 uses resumable timeline and author-search coverage. The Actor deduplicates both sources 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 safely 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 use maximum profile coverage. Historical windows use exact search. Compatible adjacent windows share one retrieval and keep their original searchTerm attribution. maxItems is a global cap 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 diagnostic when capacity remains. Real replies always take priority over diagnostics. 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 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.

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 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.
  • 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

OperatorExamplePurpose
from:from:elonmuskOnly tweets by this user
to:to:OpenAIOnly replies to this user
@@nasaTweets mentioning this user
list:list:123456Tweets from list members
lang:lang:enFilter by language
since: / until:since:2026-01-01Date range
min_faves:min_faves:100Engagement threshold
min_retweets:min_retweets:50Retweet threshold
filter:mediafilter:mediaX media search operator
filter:videosfilter:videosX video search operator
filter:imagesfilter:imagesX image search operator
filter:linksfilter:linksOnly tweets with links
filter:repliesfilter:repliesOnly reply tweets
filter:quotefilter:quoteOnly quote tweets
filter:blue_verifiedfilter:blue_verifiedOnly 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.

Common patterns:

  • Single tweet by URL - paste the tweet URL into Start URLs
  • User timeline - paste a profile URL or add the username to X Handles. The Actor combines resumable timeline and author-search coverage
  • Account date backfill - use from:user since:YYYY-MM-DD until:YYYY-MM-DD as a Search Term. The Actor merges compatible windows before retrieval. Recent windows use maximum profile coverage. Historical windows use exact search
  • Entire X list - paste the list URL into Start URLs
  • Advanced search - combine twitterContent with filters like from:, 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:

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.

Tips & advanced options

  • Control spend - set Apify max total charge to cap run cost. Leave maxItems empty for maximum rows within that budget, or set maxItems when you want fewer tweets.
  • API budget cap - set maxTotalChargeUsd in the Apify API, or Max cost per run in Console. Apify exposes that limit to the Actor as ACTOR_MAX_TOTAL_CHARGE_USD, and the Actor turns it into the maximum billable row count.
  • Known tweet IDs - pass tweetIds for concurrent 100-ID batches. Paste a profile URL to use the fast user-timeline path.
  • Attribution - set includeSearchTerms: true when 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 concurrently. Deduplication and result caps remain atomic.
  • 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.

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.