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

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

Pricing

from $0.00015 / replies

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

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

Scrape X (Twitter) replies, comments, conversations & profile reply timelines for $0.15 per 1,000 rows on paid Apify plans. Bulk URLs or IDs. Nested replies. Filters run before billing. No start fee. No query fee. 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

4

Total users

2

Monthly active users

16 minutes ago

Last modified

Share

Scrape X (Twitter) replies for $0.15 per 1,000 delivered rows on paid Apify plans. Paste post URLs, Tweet IDs, profile URLs, or usernames. Export direct replies, nested conversations, authors, engagement, entities, and media URLs. No X login, cookies, proxy, or API key is required. Apify's pricing box remains authoritative before each run. Built by Xquik.

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.

Competitive Reply Scraper Features

  • Automatic completeness fallback detects incomplete reply pages. It then uses conversation search.
  • 4 collection strategies support auto, direct replies, conversation search, and full thread context.
  • Direct and nested replies preserve parent IDs, root IDs, and depth.
  • Bulk inputs accept mixed post URLs, Tweet IDs, profiles, and usernames.
  • Profile reply timelines collect public posts from With Replies tabs.
  • 4 sort modes preserve relevance or sort latest, oldest, or most liked.
  • 25+ filters cover text, author, language, engagement, media, and dates.
  • Filter before billing removes unwanted rows before dataset writes.
  • 3 detail levels provide compact, full, or raw source snapshots.
  • CSV-friendly output flattens author fields and media URL arrays.
  • Field naming controls preserve source, camelCase, or snake_case names.
  • Source attribution links every result to its input target.
  • Continuation cursors support controlled backfills and scheduled runs.
  • Spend-safe diagnostics write exactly 1 actionable row for empty runs.
  • Agent-ready schemas describe inputs, replies, reports, and cursors.
  • No credentials required avoids X passwords, cookies, and session tokens.

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 recovers from empty direct reply results. All reply depths, 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": 200
}

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"], "maxItemsPerTarget": 100, "maxItems": 200 }

Filter Replies Before Billing

{
"tweetIds": ["2082577277246972300"],
"anyWords": ["API", "agent", "developer"],
"excludeWords": ["airdrop", "giveaway"],
"lang": "en",
"minLikes": 2,
"minViews": 100,
"verifiedOnly": true,
"maxItems": 200
}

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.

This design satisfies Apify's technical eligibility requirements for agentic payments. Apify controls final allowsAgenticUsers availability.

Reply Targets & Input Aliases

Use the primary fields below.

InputPurpose
startUrlsMixed X post and profile URLs
tweetIdsNumeric post IDs
usernamesPublic profile reply timelines
profileUrlsProfile URL alias
tweetUrlsTweet URL alias
postUrlsPost URL alias
screennameSingle username alias
startCursorResume one target from a saved source cursor

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.

Coverage Strategies

Auto Complete

Use collectionStrategy: "auto" for most jobs. The Actor starts with the direct reply route. If X reports incomplete coverage, it switches to conversation_id search.

Filtered auto runs use conversation search immediately. This avoids incomplete direct pages when filters hide source rows.

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

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. maxPagesPerTarget bounds source pagination.

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

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, and URLs
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, article, bookmarked, card, communityNote, edit, favorited, grokAnalysisButton, grokImageEditable, isTranslatable, noteTweet, place, possiblySensitive, possiblySensitiveEditable, previousCounts, quickPromoteEligibility, retweeted, and viewState.

Conversation fields make flat rows reconstructable:

  • rootTweetId
  • parentReplyId
  • depth
  • isDirectReply
  • isOriginalPost
  • sourceTweetId
  • sourceTarget
  • sourceUrl
  • resultType
  • schemaVersion
  • _schema_version

Author Metadata

The nested author object preserves available public fields. These can include id, username, name, description, followers, following, verified, isBlueVerified, isVerified, verifiedType, location, url, createdAt, profilePicture, coverPicture, profileBannerUrl, statusesCount, mediaCount, favouritesCount, protected, canDm, hasCustomTimelines, isTranslator, withheldInCountries, possiblySensitive, pinnedTweetIds, isAutomated, automatedBy, unavailable, unavailableReason, affiliatesHighlightedLabel, businessAccountAffiliatesCount, canMediaTag, creatorSubscriptionsCount, followRequestSent, hasGraduatedAccess, hasHiddenSubscriptionsOnProfile, highlightsInfo, identityVerification, isProfileTranslatable, notificationsEnabled, parodyCommentaryFanLabel, profileDescriptionLanguage, profileImageShape, profileInterstitialType, profileSortEnabled, profileTranslatorType, superFollowEligible, superFollowedBy, superFollowing, communityRole, viewerFollowedBy, viewerFollowing, viewerBlockedBy, viewerBlocking, viewerLiveFollowing, viewerMuting, and profile_bio.

Flat output adds authorId, authorUsername, authorName, authorFollowers, authorFollowing, and authorVerified.

Media Metadata

Media objects can include id, type, mediaUrl, url, displayUrl, expandedUrl, altText, width, height, durationMillis, sizes, videoVariants, aspectRatio, mediaKey, allowDownload, availabilityStatus, faceRects, focusRects, indices, monetizable, and availability fields.

Flat output adds mediaUrls.

Output Modes

Compact

Set outputMode: "compact" for analysis-ready fields. This reduces dataset width while preserving text, conversation, author, engagement, and media.

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 table-ready author fields. 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.

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?

On paid Apify plans, Xquik's intended listing price is $0.15 per 1,000 delivered rows. This equals $0.00015 per row. The live Apify pricing box is authoritative before every run.

The free plan can use a separate anti-abuse tier. Check the live pricing box for your plan. Do not use free-tier anti-abuse pricing for paid-plan cost comparisons.

Xquik charges only default dataset rows. 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.

Apify platform usage follows the pricing box shown for your account.

Public Task Examples

Choose from 50 public tasks with bounded inputs and useful dataset views. Each task stays editable before you run it.

Examples cover:

  • reply sentiment datasets
  • customer feedback collection
  • nested thread reconstruction
  • most-liked reply ranking
  • launch and event reaction research
  • verified-author reply discovery
  • media reply collection
  • multilingual conversation research
  • public profile reply timelines
  • CSV and RAG exports
  • continuation cursor workflows

Agent-focused examples include:

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 and 128 REST operations. This Actor remains a focused reply collection surface.

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.

X can report an incomplete direct reply page. Auto mode then uses conversation search.

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.