X Reply Scraper | $0.15/1K Replies | Pay-Per-Result
Pricing
from $0.00015 / replies
X Reply Scraper | $0.15/1K Replies | Pay-Per-Result
Scrape X (Twitter) replies, comments, conversations, and reply timelines for $0.15 per 1,000 delivered rows on every Apify plan. Use bulk URLs, 25+ filters, 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 / replies
Rating
5.0
(4)
Developer
Xquik
Maintained by CommunityActor stats
0
Bookmarked
15
Total users
8
Monthly active users
2 days ago
Last modified
Share
Scrape X (Twitter) replies for $0.15 per 1,000 delivered rows on every Apify plan. Paste post URLs, Tweet IDs, profile URLs, or usernames. Export replies, conversations, authors, engagement, entities, and media URLs. Apify bills your platform usage separately. No X login is required.
Filters run before dataset writes. You pay only for delivered rows.
Xquik is an independent third-party service. Not affiliated with X Corp. "Twitter" and "X" are trademarks of X Corp.
What does this Twitter reply scraper do?
X Reply Scraper collects public replies and comment conversations. It handles single posts, bulk URL lists, Tweet IDs, and user reply timelines.
Use it for sentiment analysis, customer feedback, community research, reply ranking, lead discovery, moderation review, and conversation datasets.
Reply collection behavior
- Auto mode switches incomplete direct results to conversation search.
- Automatic Tweet reply pages request up to 300 rows.
- Four strategies cover direct replies, search, and thread context.
- Bulk inputs accept post URLs, Tweet IDs, profiles, and usernames.
- Profile targets combine timeline and author search when both apply.
- Filters and duplicate removal run before billing.
- Output supports 4 sort modes, 3 detail levels, and 3 field styles.
- Every reply keeps its source target, parent IDs, root ID, and depth.
- Continuation cursors support backfills and scheduled runs.
- Empty runs write 1 diagnostic row unless the charge limit blocks it.
- Page and target logs include
fetchDurationMs,processingDurationMs,pushDurationMs,statusDurationMs,fullPageDurationMs, andfullTargetDurationMswithout repeating inputs. - Checkpoints preserve accepted replies, timing, and failures 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 exact builds only for temporary rollbacks.
Quick start
The initial form targets a verified public conversation. It returns up to 25 full, flat rows across at most 10 pages. Auto mode searches the full conversation by default. Deduplication and source attribution stay on.
Scrape replies from a post URL
{"startUrls": [{ "url": "https://x.com/OpenAI/status/2082577277246972300" }],"maxItems": 100}
Scrape replies from Tweet IDs
{"tweetIds": ["2082577277246972300", "2083148725367783580"],"maxItemsPerTarget": 100,"maxItems": 10000}
Collect the full nested conversation
{"tweetIds": ["2082577277246972300"],"collectionStrategy": "conversationSearch","scope": "all","maxDepth": 5,"sort": "oldest","maxItems": 500}
Scrape a user's reply timeline
{ "usernames": ["OpenAI", "apify"], "maxItems": 10000 }
Filter replies before billing
{"tweetIds": ["2082577277246972300"],"anyWords": ["API", "agent", "developer"],"excludeWords": ["airdrop", "giveaway"],"lang": "en","minLikes": 2,"minViews": 100,"verifiedOnly": true,"maxItems": 10000}
Export flat CSV-friendly rows
{"tweetIds": ["2082577277246972300"],"outputMode": "full","outputPreset": "flat","fieldStyle": "camelCase","maxItems": 100}
Sample values are illustrative. Responses reflect source data at run time.
AI agent & MCP readiness
Run this Actor through Apify MCP, API clients, x402, or Skyfire.
- Limited permissions protect unrelated Apify account data.
- Pay-per-event billing supports deterministic result-based costs.
- Standby mode stays disabled for agentic-payment compatibility.
- Typed schemas expose replies, run reports, and continuation cursors.
- Bounded defaults prevent accidental unbounded agent runs.
- Stable
camelCaseandsnake_casemodes simplify tool chaining. - Diagnostic rows include a status, message, and recovery action.
- Run reports include exact outcomes, stop reasons, and charge estimates.
Use this bounded input for autonomous workflows:
{"tweetIds": ["2082577277246972300"],"collectionStrategy": "auto","scope": "all","outputMode": "compact","fieldStyle": "camelCase","maxItems": 100}
Agents should process outputs in this order:
- Read
repliesfrom the default dataset. - Check
resultTypebefore using a row as reply data. - Follow
nextActionwhen a diagnostic row appears. - Inspect
runReport.results.completionReasonafter every run. - Reuse
continuationCursorsfor intentionally page-limited runs.
Set maxItems on every autonomous call. Also set Apify's maximum run cost. The
smaller limit controls the billed result count.
Apify decides whether allowsAgenticUsers is available for this Actor.
Reply targets & input aliases
Use the primary fields below.
| Input | Purpose |
|---|---|
startUrls | Mixed X post and profile URLs |
tweetIds | Numeric post IDs |
usernames | Profile timelines with author search |
startCursor | Resume one target from a saved source cursor |
The visual form shows canonical controls only. Compatibility aliases stay available in JSON, API, SDK, automation, and saved task inputs. Explicit canonical and alias fields keep their existing resolution order when combined.
Compatibility aliases accept common competitor inputs:
- URL aliases:
urls,tweetUrls,postUrls,profileUrls - ID aliases:
conversationIds,postIds,ids,tweetId,id - Username aliases:
twitterHandles,screenname - Global limit aliases:
maxResults,max_results,resultsLimit,maxReplies - Per-target aliases:
maxRepliesPerTweet,maxCommentsPerPost - Search alias:
useSearch - Nested reply aliases:
includeNestedReplies,includeRepliesOfReplies - Original post alias:
includeOriginalTweet - Output aliases:
outputVariant,includeRaw
Malformed or unsupported targets do not fail the Actor. The run returns an actionable diagnostic when no valid targets remain.
Profile targets combine cursor pagination with author search. The Actor removes duplicate rows before output and billing. Saved legacy cursors retain standard pagination.
Coverage strategies
Auto complete
Use collectionStrategy: "auto" for most jobs. Full or nested scopes start with
conversation_id search. Direct, unfiltered scopes start with the reply route.
They switch when it reports incomplete coverage or returns empty.
Direct reply endpoint
Use collectionStrategy: "replies" to force X's reply timeline. This keeps the
source ordering and supports cursors.
Conversation search
Use collectionStrategy: "conversationSearch" for broad conversation coverage.
The Actor searches by conversation_id:<Tweet ID>.
Full thread context
Use collectionStrategy: "thread" to read the source conversation context. Set
includeOriginalPost: true to keep the root post as depth 0.
Direct & nested reply controls
Use scope to choose the result shape.
| Value | Result |
|---|---|
direct | Keep depth 1 replies |
nested | Keep replies to replies at depth 2+ |
all | Keep every available direct and nested reply |
Use maxDepth to bound nesting. Parent links may be absent when X omits a
conversation ancestor. The Actor preserves the best available depth.
Sorting
Use sort with these values:
relevancepreserves X source orderlatestsorts newest firstoldestsorts oldest firstlikessorts highest like count first
Profile targets collect the requested unique, filtered result count before sorting it. Tweet targets retain global sorting.
The sortBy and queryType compatibility aliases remain supported.
Reply filters
All supported filters run before dataset writes.
Text & entity filters
| Input | Behavior |
|---|---|
exactPhrase | Require one exact phrase |
anyWords | Require at least 1 word or phrase |
excludeWords | Remove matching words or phrases |
keywordInclude | Alias merged with anyWords |
keywordExclude | Alias merged with excludeWords |
hashtags | Require at least 1 hashtag |
cashtags | Require at least 1 cashtag |
mentioning | Require an @mention |
Author & language filters
| Input | Behavior |
|---|---|
fromUser | Keep one reply author |
toUser | Keep replies addressed to one username |
lang | Keep one X language code |
verifiedOnly | Require any public verification signal |
blueVerifiedOnly | Require X Premium verification |
excludeOriginalAuthor | Remove source-author self-replies |
Engagement filters
Use minLikes, minReplies, minRetweets, minQuotes, minViews, and
minBookmarks. The minFaves alias maps to minLikes.
Media & time filters
- Set
hasMediaOnly: truefor replies with public media. - Set
mediaTypetoany,image,video,gif, orlink. - Set
sincefor an inclusive start timestamp. - Set
untilfor an exclusive end timestamp. - Use
sinceTimeanduntilTimeas compatibility aliases.
Limits, billing & continuation
maxItems limits delivered rows across the run. maxItemsPerTarget limits each
post or profile.
Independent targets run concurrently. Each target keeps ordered cursor pagination. Dataset writes keep caps, deduplication, attribution, and billing atomic.
The Actor removes duplicates before billing. Set dedupeAcrossTargets: false to
preserve duplicate rows from different targets.
After a page-limited run, read next-cursors from the default key-value store.
Pass one cursor through startCursor to continue that target.
Output fields
Dataset and run-report schemas describe every returned field. Primitive fields also include examples for agents and generated integrations.
Every full reply row can include these core fields:
| Field | Description |
|---|---|
id | Reply ID |
text | Reply text |
fullText | Long-form reply text |
createdAt | Reply timestamp |
lang | X language code |
url | Direct reply URL |
conversationId | X conversation ID |
inReplyToId | Immediate parent ID |
inReplyToUserId | Parent author ID |
inReplyToUsername | Parent username |
likeCount | Likes |
replyCount | Child replies |
retweetCount | Reposts |
quoteCount | Quotes |
viewCount | Views |
bookmarkCount | Bookmarks |
author | Available public author metadata |
media | Images, videos, GIFs, and variants |
entities | Hashtags, cashtags, mentions, URLs, and video timestamps |
quoted_tweet | Quoted post when available |
retweeted_tweet | Reposted post when available |
Full rows also preserve available source metadata. This includes isNoteTweet,
isReply, isLimitedReply, isQuoteStatus, source, type,
displayTextRange, contentDisclosure, conversationControl, article,
limitedActions, card, communityId, communityNote, edit,
isTranslatable, noteTweet, place, postCta, possiblySensitive,
previousCounts, tombstone, unmentionedUserIds, and viewState.
Flat rows keep conversation ancestry, source details, result type, and schema version. See OpenAPI for the exact fields.
Author metadata
Nested authors follow the public profile contract. It covers identity, counts, verification, availability, professional data, and profile biographies.
Flat output adds authorId, authorUsername, authorName, authorFollowers,
authorFollowing, and authorVerified.
Media metadata
Media includes availability, geometry, tags, video variants, watchNowUrl, and
visitSiteUrl actions.
Flat output adds mediaUrls.
Output modes
Compact
Set outputMode: "compact" to reduce dataset width. It preserves text,
conversation, author, engagement, and media fields.
Full
Set outputMode: "full" to preserve every supported public field.
Raw
Set outputMode: "raw" to add a sanitized source snapshot under raw.
Nested or flat
The default flat layout keeps nested objects and adds author fields for
tables. Set outputPreset: "nested" to omit the added flat fields.
Field naming
Set fieldStyle to source, camelCase, or snake_case. The Actor avoids
overwriting colliding source keys.
Diagnostic rows
Every started run writes at least 1 default dataset row unless its charge limit blocks all rows.
Successful data rows use resultType: "reply". Non-data exits write exactly 1
row with resultType: "diagnostic" and an actionable fix.
Every outcome writes run-report, including no-input and invalid-input exits.
The report schema documents completion, billing, failures, and saved cursors.
Its version field reports the exact published Actor source version.
Possible statuses include:
no-inputinvalid-inputreplies-incompletezero-outputabortedunexpected-error
Filter diagnostics with:
const replies = dataset.filter((row) => row.resultType !== 'diagnostic');
How much does it cost?
Every Apify plan costs $0.15 per 1,000 delivered rows. This equals
$0.00015
per row. Apify bills platform usage separately.
Xquik applies one charge per delivered default dataset row. No separate start, URL, query, pagination, filter, or proxy fee applies.
Each data row and the single possible diagnostic row is billable. The run report separates delivered rows from the estimated row charge.
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. Replies already collected remain delivered
and bill once. Unfinished pagination remains resumable.
Public task examples
Choose from 50 public tasks. Each has a bounded input and a matching dataset view. Edit any task before running it.
Start with these examples:
- Collect replies for AI agents
- Build an X reply RAG dataset
- Archive replies for LLM processing
- Extract reply leads for CRM
API example
JavaScript
import { ApifyClient } from 'apify-client';const client = new ApifyClient({ token: '<APIFY_API_TOKEN>' });const run = await client.actor('xquik/x-reply-scraper').call({tweetIds: ['2082577277246972300'],collectionStrategy: 'auto',scope: 'all',maxItems: 100,});const { items } = await client.dataset(run.defaultDatasetId).listItems();console.log(items);
Python
from apify_client import ApifyClientclient = ApifyClient("<APIFY_API_TOKEN>")run = client.actor("xquik/x-reply-scraper").call(run_input={"tweetIds": ["2082577277246972300"],"collectionStrategy": "auto","scope": "all","maxItems": 100,})for item in client.dataset(run["defaultDatasetId"]).iterate_items():print(item)
cURL
curl "https://api.apify.com/v2/acts/xquik~x-reply-scraper/run-sync-get-dataset-items" \-X POST \-H "Authorization: Bearer <APIFY_API_TOKEN>" \-H "Content-Type: application/json" \-d '{"tweetIds":["2082577277246972300"],"maxItems":100}'
Automation & integrations
Run the Actor through Apify schedules, webhooks, API clients, Make, Zapier, n8n, Google Sheets, cloud storage, or the Apify MCP server.
Eligible agent workflows can also use x402 or Skyfire.
Xquik also provides 47 dashboard tools, 128 REST operations, signed webhooks, and an MCP server.
Responsible use
Collect only public data. Follow applicable laws and platform rules.
Reply datasets can contain personal data. Choose a lawful purpose. Minimize retention. Protect exports. Honor deletion and access requests where required.
The Actor does not bypass protected accounts. It does not request customer X passwords, session cookies, or authentication tokens.
FAQ
Do I need an X login or API key?
No. Do not paste X credentials into Actor input.
Can it scrape nested replies?
Yes. Set scope: "all" or scope: "nested". Use maxDepth to bound depth.
Why did auto mode switch to search?
Full and nested scopes use conversation search. Direct scope switches there when the reply source reports incomplete or returns empty.
Can I scrape a user's replies?
Yes. Pass usernames, twitterHandles, screenname, or profile URLs.
Can I sort by likes or date?
Yes. Use likes, latest, oldest, or relevance.
Can I exclude spam before billing?
Yes. Use excludeWords, author filters, engagement limits, and media filters.
Can I resume a large conversation?
Yes. Read next-cursors, then pass one cursor through startCursor.
Does it download media files?
No. It returns public media URLs and metadata. This controls storage costs.
Does it run custom JavaScript from input?
No. The Actor does not execute untrusted mapping code.
What happens when no reply matches?
The Actor writes exactly 1 diagnostic row with a suggested fix.
Which export formats work?
Use Apify's JSON, JSONL, CSV, Excel, XML, RSS, or HTML exports.
Where can I report an issue?
Use the Actor Issues tab. Include the public target, input, and run ID. Never include passwords, tokens, cookies, or private data.