X (Twitter) Engagement Scraper | $0.15/1K | Who Engaged
Pricing
from $0.12 / 1,000 account returneds
X (Twitter) Engagement Scraper | $0.15/1K | Who Engaged
Find out who amplified a post on X (Twitter). Export the accounts that reposted it, liked it, quoted it or replied to it, each with handle, name, bio, follower counts, verification and the text they wrote. The warmest lead list a launch can produce, as JSON, CSV or Excel. By FeedMiner.
Pricing
from $0.12 / 1,000 account returneds
Rating
0.0
(0)
Developer
FeedMiner
Maintained by CommunityActor stats
0
Bookmarked
2
Total users
1
Monthly active users
8 hours ago
Last modified
Categories
Share
🗯️ Quotes and replies in one run. Both come out together, tagged by what each account did, with the text they wrote. Reposters and likers are not offered here: X serves those two lists to a real browser only, which we measured rather than assumed.
💸 $0.15 per 1,000 accounts, down to $0.12 on the larger Apify plans. The most visible tool on the store bills $0.40 per 1,000 plus $0.016 per post for reposters alone. No start fee, no per-post fee.
🎯 The warmest list you will ever build. Someone who replied to your launch or quoted it is a better lead than someone who follows you and never reacts. This is that list, with follower counts and bios on it.
🔓 Nothing to connect. Repliers and quote authors both come back on a run where you supplied nothing. No login, no cookie, no API key on your side.
| FeedMiner · X (Twitter) suite • Posts, profiles, audiences, media, trends | ||
➤ You are here | What an account reacts to · $0.12/1K posts | Trending topics by country · $0.16/1K trends |
Copy to your AI assistant
feedminer/x-engagement-scraper on Apify. Lists the accounts that engaged with an X (Twitter) post: quote authors and repliers. One row per account with id, userName, name, description, followers, following, isVerified, isBlueVerified, location, plus engagement (quotes|replies), tweetId, text, postUrl and engagedAt. Call ApifyClient("TOKEN").actor("feedminer/x-engagement-scraper").call(run_input={...}), then client.dataset(run["defaultDatasetId"]).list_items().items. Input: startUrls (string[] of post URLs or ids), engagements (string[] of quotes|replies), maxItems (int), sessions (array, optional). Full spec: GET https://api.apify.com/v2/acts/feedminer~x-engagement-scraper/builds/default (Bearer TOKEN) → inputSchema, actorDefinition.storages.dataset, readme. Token: https://console.apify.com/account/integrations
How to find who engaged with an X (Twitter) post
Basic: everyone who talked back to a post
{"startUrls": ["https://x.com/elonmusk/status/1519480761749016577"],"engagements": ["replies", "quotes"],"maxItems": 2000}
Replies only, with nothing to connect
{"startUrls": ["https://x.com/elonmusk/status/1519480761749016577"],"engagements": ["replies"],"maxItems": 200}
Who quoted a competitor's announcement
{"startUrls": ["https://x.com/stripe/status/1234567890123456789"],"engagements": ["quotes"],"maxItems": 500}
Quotes are where the opinions are. A repost is agreement, a quote is a comment.
Several posts in one job
{"startUrls": ["https://x.com/yourcompany/status/1111111111111111111","https://x.com/yourcompany/status/2222222222222222222"],"engagements": ["quotes", "replies"],"maxItems": 4000}
Every row carries tweetId and engagement, so one export covers a whole campaign and still splits per post and per kind.
Input parameters
| Parameter | Type | Default | Description |
|---|---|---|---|
startUrls | array | The posts to look at, as post URLs or ids | |
engagements | array | ['replies', 'quotes'] | Replies are served without an account. Quotes come from X's search index and need one. Reposters and likers are not offered: X serves their lists only to a real browser, measured twice with a signed in account |
maxItems | integer | 1000 | Stop once this many engagements have been collected |
Advanced
| Parameter | Type | Default | Description |
|---|---|---|---|
sessions | array | Optional. The Actor works without one. X accounts of your own, for anyone who would rather the run used accounts they control | |
debugMode | boolean | false | Verbose logs for support |
Coming from another engagement scraper
A single tweetId works, as do tweetIds, tweetUrls, postUrls and urls.
Nothing to connect
Paste post URLs and press Start. Repliers and quote authors both come back on a run where you supplied nothing.
If you would rather the run worked from accounts you own, the optional sessions field takes them.
What data can you extract from post engagement?
| Field | Type | Description |
|---|---|---|
engagement | string | What this account did: quotes or replies |
tweetId | string | The post they engaged with |
userName | string | Handle |
name | string | Display name |
description | string | Bio |
followers following | integer | Audience size |
statusesCount mediaCount favouritesCount | integer | Activity counters |
isVerified isBlueVerified | boolean | Verification |
location | string | Free text location |
twitterUrl profilePicture | string | Profile links |
createdAt | string | Account creation date, RFC 3339 |
text | string | What they wrote |
postUrl | string | A link to what they wrote |
engagedAt | string | When they wrote it, RFC 3339 |
Pricing: Pay Per Event (PPE)
| Event | Price |
|---|---|
| Account returned | $0.00015 |
That is $0.15 per 1,000 accounts, with no start fee and no charge for a run that returns nothing. The price steps down on its own for the larger Apify plans, to $0.14 and then $0.12 per 1,000.
What a run costs
| Everyone who replied to or quoted one launch post, 2,000 accounts | $0.30 |
| A campaign of ten posts, 20,000 accounts | $3.00 |
Free tier
The Apify free plan includes $5 of usage every month, which is roughly 33,000 accounts here. No card required.
Advanced usage
Score your own launches. Export the repliers and quote authors of every launch post you made this year, count how many are verified and how many have more than 5,000 followers, and you have a reach report nobody had to compile by hand.
Find the people who move a market. The same handles quoting three competitors are the voices of your category. Sort by followers, keep the top hundred, that is your outreach list.
Read the room before replying. Quotes carry the text people wrote about a post. Sentiment on a launch is one export, not a week of scrolling.
Cross with a follower export. Pull an audience with X Follower Scraper, then pull the engagers here. Accounts in both lists are your active audience, the rest is dormant.
Integrate X engagement data into your stack
Python
from apify_client import ApifyClientclient = ApifyClient("YOUR_APIFY_TOKEN")run = client.actor("feedminer/x-engagement-scraper").call(run_input={"startUrls": ["https://x.com/yourcompany/status/1234567890123456789"],"engagements": ["quotes", "replies"],"maxItems": 3000,})rows = client.dataset(run["defaultDatasetId"]).list_items().itemsreach = sum(r["followers"] for r in rows if r["engagement"] == "quotes")print("quoted to roughly", reach, "followers")
JavaScript
import { ApifyClient } from 'apify-client';const client = new ApifyClient({ token: 'YOUR_APIFY_TOKEN' });const run = await client.actor('feedminer/x-engagement-scraper').call({startUrls: ['https://x.com/stripe/status/1234567890123456789'],engagements: ['quotes'],maxItems: 500,});const { items } = await client.dataset(run.defaultDatasetId).listItems();const critical = items.filter((i) => /but |however|disagree/i.test(i.text || ''));
No code
Send the dataset to Google Sheets, Airtable, Slack, Zapier, Make or n8n from the Integrations tab of the run.
Performance
| Measure | Value |
|---|---|
| Accounts per page | 20, the same page size X's own web app requests |
| Parallelism | Up to six jobs at a time, a job being one post and one engagement kind |
| Partial results | Kept and delivered when a limit is reached |
FAQ
Can I get everyone who reposted or liked a post?
Not here. X serves those two lists to a signed-in browser only, which we measured twice with an account rather than assumed. Replies and quotes are what X publishes, and the run walks them as far as maxItems asks, on a large post a deep but not unlimited list.
Why do replies need nothing while quotes come from the search index? Because X publishes a post's conversation to anyone and serves its search index to signed-in sessions only. The run brings its own session for the quotes, so you supply nothing either way.
Is a quote the same as a repost? No. A repost is a share with no comment, a quote adds one. Quotes carry the text and are listed here; reposts are not.
Do I get the reply text?
Yes, in text, with a link in postUrl.
What about a deleted post? The run reports it and moves to the next input instead of failing.
Can I run this on someone else's post? Yes, any public post. That is what makes it a competitive intelligence tool and not just an analytics one.
How do I avoid counting the same account twice? Rows are deduplicated per post and per engagement kind. An account that both replied and quoted appears once for each, which is deliberate: those are two different signals.
Does it work on a thread? Point it at any post in the thread. Each post has its own engagement.
Support
A post that will not open, an engagement kind you need, a list that stops early: write from the actor page.
Legal compliance
This actor reads engagement that X publishes on public posts. It does not access private accounts, protected posts or direct messages. Personal data in the output is subject to GDPR, CCPA and similar regimes: collect what you have a lawful basis to collect, keep it only as long as you need it, and honour deletion requests.
FeedMiner · Fast, honestly priced scrapers, kept alive when platforms change.
X Tweet Scraper · X Profile Scraper · X Follower Scraper · X Advanced Search Scraper · X Media Scraper · X Mentions Monitor · X Engagement Scraper · X Likes and Reposts Scraper · X Trends Scraper · All FeedMiner Actors