Threads Scraper - Posts, Likes & Replies by Profile
Pricing
from $1.20 / 1,000 post scrapes
Threads Scraper - Posts, Likes & Replies by Profile
Scrape posts from any public Threads profile with exact like, reply, repost and quote counts, full text, media URLs and true UTC timestamps. Pages back through years of history. No login, no API key. Tells you which profiles Threads will not serve.
Pricing
from $1.20 / 1,000 post scrapes
Rating
0.0
(0)
Developer
Eimantas V
Maintained by CommunityActor stats
0
Bookmarked
3
Total users
2
Monthly active users
4 days ago
Last modified
Categories
Share
Threads Scraper
Scrape posts from any public Threads profile — by handle or URL — with exact like, reply, repost and quote counts, the full post text, direct media URLs and true UTC timestamps. No Meta account, no API key, no access token.
One row per post, plus a summary row per profile carrying the exact follower count and bio.
What you get on every post
| Engagement | likes, replies, reposts, quotes — exact integers, never rounded |
| Content | the full post text, exactly as written |
| Media | direct image URLs at full resolution, every frame of a carousel, and video URLs |
| Timing | a true UTC ISO 8601 timestamp, plus the raw epoch |
| Thread structure | whether a post is a reply, who it replied to, and which thread it belongs to |
| Quotes | the text and author of the post it quotes |
| Author | handle, display name, verified flag, and the account id that survives a rename |
And on every profile: exact follower count, bio, display name, verified status.
Numbers, not prose
Threads' own profile page says 5.7M Followers. That's a range half a million wide presented as a fact — and most exports hand it to you exactly like that, or parse it back into 5700000 and let you assume it's real.
This Actor reads the numbers from the underlying data, so that same profile reports 5737159. The same is true of every engagement count: likeCount: 3036 and replyCount: 1743, as integers, on every row.
One naming trap worth knowing about, because it silently breaks other exports: Threads has no field called reply_count. The real reply counter is stored under a different name entirely, and a scraper that reaches for the obvious one returns a column of nulls that reads as "nobody replied to any of these posts".
It goes back years, not one page
A Threads profile hands out its posts four at a time and then makes you ask for more. Plenty of scrapers stop at that first handful.
This one keeps going: measured on a real profile, it walked back 17 months of history and was still finding more. Set maxPostsPerProfile to whatever depth you need, or give it a postedAfter date and let it stop there naturally.
Posts come back newest first, with a rank recording the original order.
Filters that cut the bill, not just the spreadsheet
Filtered posts are never written and never charged. They aren't rows you pay for and then delete.
- Include replies — off by default, so you get original posts only. Turn it on and replies arrive marked with
isReplyand the handle they answered. - Minimum likes — compared against the exact number, not a rounded one.
- Only posts after this date — also gives a deep run a natural stopping point.
Honest about which profiles it cannot read
This is the part other listings leave out. Threads serves some profiles to logged-out visitors and refuses others. It is not random and not a temporary block: a refused profile is refused every time, and an accepted one works every time.
When Threads refuses, you get an error row saying exactly that — errorClass: not-available-logged-out — and you are not charged for it.
One thing this Actor deliberately will not do is guess. Threads answers identically for a real account it has restricted and for a handle that does not exist — same redirect, same page, same everything, verified across thirteen handles. So the row says the profile could not be read, and does not claim to know which of the two it was. No other listing on this shelf tells you this at all, and at least one states the opposite.
Expect most well-known handles to work. In a sample of ten real brand and creator accounts, seven were readable.
An empty result always tells you why
Every profile gets a summary row, so a short result is never ambiguous:
zeroReason | What it means |
|---|---|
profile-has-no-posts | The profile was read successfully and genuinely has nothing |
all-posts-filtered-out | Posts were found; your filters removed all of them |
charge-limit-reached | Your charge limit stopped the run |
run-post-limit-reached | The total-posts ceiling was reached first |
run-timeout-reached | The run stopped itself early to finish cleanly rather than be killed |
The same row carries stoppedOn, pagesFetched, postsScanned and postsFiltered. If a profile stopped because it ran out of page budget rather than out of posts, stoppedOnScanLimit says so and the log names the setting to raise.
One setting that matters: the proxy country
Threads shows a profile page to anyone, but it only answers the requests that page past the first few posts to European addresses. Measured across seven locations: US and Middle East egress returned the profile and then refused every continuation; EU egress returned full history.
So this Actor runs from a German residential address by default, and you can leave the Proxy section alone. Residential rather than datacenter is not a preference: Apify has no German datacenter addresses, so it is the only pool that can place the request in the EU at all.
If you do override it to a non-EU country, expect the first few posts of each profile and nothing more — and the run will say so plainly rather than leaving you to wonder.
Honest about limits
- Threads publishes no view counts. Not for posts, not for videos — the number does not exist in the data, so no scraper can give it to you.
- Media URLs expire. Image and video links are signed by Meta's CDN. Download promptly rather than storing the URL.
- Total post count is not exact. Threads only states it rounded, so it is deliberately not reported as a number.
- A quoted post is not a row of its own. It belongs to a different author. The quoting post carries its text and handle instead — counting it would inflate both your dataset and your bill.
Pricing
Pay per result. No monthly rental on top.
| Event | Price per 1,000 | What triggers it |
|---|---|---|
| Post scraped | $2.00 | One post written to your dataset |
| Profile opened | $2.00 | One profile Threads actually served |
Prices fall with your Apify plan, down to $1.20 / $1.20 per 1,000 on Gold.
What is never charged:
- A profile Threads refused to serve — the case above
- Posts removed by your replies, minimum-likes or date filters
- The same post seen twice in one run, even across two spellings of the handle
- Quoted posts belonging to other authors
- Summary rows and error rows
- A request that failed and had to be retried
Getting started
- Put one or more profiles in Threads profiles — handles or URLs, one per line.
- Set Max posts per profile. The first few arrive with the profile itself; after that it pages in tens.
- Leave Include replies off for a first run to see original posts only.
- Run it. Results appear as they are collected — the Posts view is one row per post, the Run report view is the per-profile summary.
Leave the profile list empty and it runs a small demo on @zuck, so you can see the output format before spending anything meaningful.