X Reply Scraper | $0.15/1K Replies | Pay-Per-Result avatar

X Reply Scraper | $0.15/1K Replies | Pay-Per-Result

Pricing

from $0.00015 / replies

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

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

Xquik

Maintained by Community

Actor 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, and fullTargetDurationMs without 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 camelCase and snake_case modes 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:

  1. Read replies from the default dataset.
  2. Check resultType before using a row as reply data.
  3. Follow nextAction when a diagnostic row appears.
  4. Inspect runReport.results.completionReason after every run.
  5. Reuse continuationCursors for 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.

InputPurpose
startUrlsMixed X post and profile URLs
tweetIdsNumeric post IDs
usernamesProfile timelines with author search
startCursorResume 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.

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.

ValueResult
directKeep depth 1 replies
nestedKeep replies to replies at depth 2+
allKeep 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:

  • relevance preserves X source order
  • latest sorts newest first
  • oldest sorts oldest first
  • likes sorts 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

InputBehavior
exactPhraseRequire one exact phrase
anyWordsRequire at least 1 word or phrase
excludeWordsRemove matching words or phrases
keywordIncludeAlias merged with anyWords
keywordExcludeAlias merged with excludeWords
hashtagsRequire at least 1 hashtag
cashtagsRequire at least 1 cashtag
mentioningRequire an @mention

Author & language filters

InputBehavior
fromUserKeep one reply author
toUserKeep replies addressed to one username
langKeep one X language code
verifiedOnlyRequire any public verification signal
blueVerifiedOnlyRequire X Premium verification
excludeOriginalAuthorRemove 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: true for replies with public media.
  • Set mediaType to any, image, video, gif, or link.
  • Set since for an inclusive start timestamp.
  • Set until for an exclusive end timestamp.
  • Use sinceTime and untilTime as 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:

FieldDescription
idReply ID
textReply text
fullTextLong-form reply text
createdAtReply timestamp
langX language code
urlDirect reply URL
conversationIdX conversation ID
inReplyToIdImmediate parent ID
inReplyToUserIdParent author ID
inReplyToUsernameParent username
likeCountLikes
replyCountChild replies
retweetCountReposts
quoteCountQuotes
viewCountViews
bookmarkCountBookmarks
authorAvailable public author metadata
mediaImages, videos, GIFs, and variants
entitiesHashtags, cashtags, mentions, URLs, and video timestamps
quoted_tweetQuoted post when available
retweeted_tweetReposted 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-input
  • invalid-input
  • replies-incomplete
  • zero-output
  • aborted
  • unexpected-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:

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 ApifyClient
client = 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.

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.