Meta Threads Scraper - Posts, Replies, Profiles, Keyword Search
Pricing
from $4.00 / 1,000 post scrapeds
Meta Threads Scraper - Posts, Replies, Profiles, Keyword Search
Extract public Meta Threads posts, replies, profiles and keyword search results. Verified keyword matching, typed status on every request, and honest nulls instead of fake zeros. No login, no cookies. Export CSV/JSON.
Pricing
from $4.00 / 1,000 post scrapeds
Rating
0.0
(0)
Developer
WebDataLabs
Maintained by CommunityActor stats
0
Bookmarked
2
Total users
1
Monthly active users
8 days ago
Last modified
Categories
Share
Extract public Meta Threads posts, replies, profiles and keyword search results. No login, no cookies, no API key.
What you get
This Threads scraper returns one flat record per public post, with the engagement metrics Threads actually publishes — likes, replies, reposts, quotes, reshares and (on post detail) views. It runs logged out against public data only.
Three things it does that most Threads scrapers do not:
- It checks that search results contain your keyword. Threads' own ranking returns posts that do not, which is the single most common complaint about keyword scraping on this platform. Every search row carries
keywordMatchedandmatchedFieldso you can see which results really matched and where. On live runs a third of the results Threads returns for a keyword do not actually contain it — those are flagged, not silently mixed in. - It never finishes with an unexplained empty dataset. Every query produces a status row with
status,statusReason,requestedCount,returnedCountandcapReason. If a run returns little, the dataset itself tells you why. - A missing number is
null, never0. Each metric has a companion*_statusfield —available,not_public,not_returned_by_sourceornot_checked. A0in this dataset means genuinely zero. This matters: a fake0silently corrupts any average, ranking or trend you build downstream.
What data can it extract?
| Field | What it is |
|---|---|
text, language, postedAt | Post body, detected language, publication time |
authorUsername, authorFullName, authorIsVerified, authorId | Who posted it |
likeCount, replyCount, repostCount, quoteCount, reshareCount | Engagement, each with a *_status companion |
viewCount | Public view count — published by Threads for the root post in Post detail mode |
isReply, replyToUsername, quotedPostUrl | Conversation context |
imageUrls, videoUrls, linkUrl, linkTitle | Media, and link previews unwrapped from Meta's redirect |
keywordMatched, matchedField | Search mode: whether the post really contains your keyword |
profileFollowerCount, profileBio, profileBioLinks | Profile mode |
status, statusReason, returnedCount, capReason | Why this query returned what it did |
The full field list is rendered from the dataset schema above the output table.
Example output
A real record from a live run — mode: search, keyword openai:
{"recordType": "post","mode": "search","query": "openai","postId": "3949278582485051018","shortcode": "DbOp_JUFGaK","url": "https://www.threads.com/@aaronparnas/post/DbOp_JUFGaK","postedAt": "2026-07-25T20:18:35.000Z","authorUsername": "aaronparnas","authorFullName": "Aaron Parnas","authorIsVerified": true,"text": "OpenAI caught one of its AI agents leaving “notes” to future versions of itself on how to escape internal constraints.","language": null,"imageUrls": [],"videoUrls": [],"likeCount": 19440,"likeCountStatus": "available","replyCount": 565,"replyCountStatus": "available","repostCount": 1217,"repostCountStatus": "available","quoteCount": 142,"quoteCountStatus": "available","viewCount": null,"viewCountStatus": "not_checked","isReply": false,"keywordMatched": true,"matchedField": "caption","status": "ok","statusReason": null}
How to use it
Pick a mode, paste what you already have into Queries, run. Accounts work as zuck, @zuck or a full profile URL; posts work as a full link or the bare shortcode.
Find posts about a topic
{ "mode": "search", "queries": ["openai", "climate tech"], "maxItemsPerQuery": 100 }
Track what an account posts
{ "mode": "userPosts", "queries": ["@zuck", "mosseri"], "maxItemsPerQuery": 200 }
Pull one post with its public replies
{ "mode": "postDetail", "queries": ["https://www.threads.com/@zuck/post/DakyAavlKLZ"], "includeReplyTree": true }
Profile stats for a list of accounts
{ "mode": "profile", "queries": ["zuck", "mosseri", "meta"] }
How much does it cost to scrape Threads?
Pay per result — you are charged for each post record delivered, and nothing else. Status rows that explain a failure are free, and a run that returns no posts costs effectively nothing. The current price is shown in the pricing box on this page.
Use cases
- Social listening — run
mode: searchon your brand and category, then filterkeywordMatched = trueto drop the results Threads' ranking padded in. - Competitor tracking —
mode: userPostson rival accounts, sorted bylikeCount, to see which messages land. - Creator research —
mode: profileacross a list of handles for follower counts and bio links, thenuserPostson the ones worth watching. - Conversation analysis —
mode: postDetailwithincludeReplyTree, then group byreplyToUsernameto see who a thread pulls in. - Dataset building for AI — one flat record per post, with
*_statusfields so you can exclude uncertain metrics instead of training on fabricated zeros.
Frequently asked questions
Do I need a Threads or Instagram login?
No. This actor scrapes only what Threads shows a logged-out visitor. No account, no cookies and no API key are involved.
How many search results can I get per keyword?
Roughly 20 to 40 per keyword. Threads does not paginate keyword search for logged-out visitors — it reports no next page, and no cursor exists in its search API. This actor fetches both the top and the recent ranking and combines them, which measured 96% more unique posts than the default ranking alone across four test keywords. Beyond that, no scraper can go deeper without an account. capReason: "search_page_limit" tells you when you have hit it. For depth, use userPosts — that mode paginates freely.
How many replies does Post detail return?
About 20, no matter how many the post has. Threads serves logged-out visitors only the first page of a conversation; a post with 839 replies still returns about 20. The true total is always reported in replyCount, so you can see the gap.
Why is viewCount empty on most rows?
Threads publishes a view count only for the root post of a permalink. In other modes it is not fetched at all, and the row says so with viewCountStatus: "not_checked" rather than putting a 0 there.
Does it match what I see in the Threads app?
Not exactly. The Threads web and app rankings differ, so the set of posts a keyword returns here will not be identical to the app's Recent tab. Everything returned is real, public and current — but it is the web result set.
Is it legal to scrape Threads?
This actor collects only public data that Threads serves to any logged-out visitor, and it does not log in or bypass authentication. It deliberately does not extract emails or phone numbers from bios. You are responsible for how you use the output — if you process personal data of people in the EU or UK you need a lawful basis under GDPR, and you should review Meta's terms for your use case. For anything commercially sensitive, take your own legal advice.
What happens when a run returns nothing?
You still get a row. Every query emits a status row naming the reason: no_public_posts, profile_not_found, login_wall, rate_limited or invalid_input, plus a plain-language statusReason. An invalid input is rejected before anything is charged.
Can it monitor Threads on a schedule?
Yes. Add the actor to a schedule in Apify Console and it will run at your chosen interval. Records carry scrapedAt, so you can diff runs to detect new posts or engagement changes.
Related actors
- Meta Ad Library Scraper — Facebook and Instagram ads, days running and creative changes
- Facebook Ad Scraper with AI Analysis — ad creative scored and summarised
- Reddit Scraper Pro — posts and full comment threads
- TikTok Shop Scraper — products, sales and sellers
- YouTube Shorts Scraper — Shorts metadata and engagement
- Google Trends Scraper — reliable interest-over-time data
Support
Found a bug or need a field that is missing? Open an issue on the Issues tab of this actor and it will be picked up there.