Threads Scraper — Profiles, Posts, Replies & Search
Pricing
from $2.10 / 1,000 results
Threads Scraper — Profiles, Posts, Replies & Search
Scrape Threads without a browser. Profiles, posts, replies and keyword search with engagement counts. Detects silent empty responses and retries, so you get data instead of blank runs.
Pricing
from $2.10 / 1,000 results
Rating
0.0
(0)
Developer
Steady API
Maintained by CommunityActor stats
0
Bookmarked
2
Total users
1
Monthly active users
19 days ago
Last modified
Categories
Share
Scrape Meta's Threads without a browser. Profiles, individual posts with their replies, and keyword search — with full engagement counts.
The failure mode nobody handles
Threads does not tell you when it throttles you. It returns HTTP 200 with a full-size page and no post data in it.
Measured on 2026-09-15: the same search URL called five times in a row returned 21 posts on four attempts and zero posts on one — same status code, same ~1.1 MB page size. Called again a moment later, it returned 21 posts again.
If your scraper treats 200 OK as success, that run silently hands you an empty result and calls it a win.
This Actor treats an empty parse as a failure, backs off exponentially, rotates to a new proxy session, and retries. Every row tells you how many attempts it took.
What else is different
- No headless browser. Data is read straight out of the JSON embedded in the server-rendered page. Runs are fast and cheap.
- No fixed JSON path. Threads buries posts 15+ levels deep, and the path differs between profile pages, post pages and search results. This Actor walks the whole tree and collects anything shaped like a post, so a Meta refactor does not break it.
- Replies included. A post URL returns the post and its visible replies — 31 items on a busy thread in testing.
- Partial success. A failed target returns a row with
erroranderrorType, not a dead run. - Billing is one result per returned row, including rows that carry an
error, so what you are charged always matches the dataset you get.
Input
Give it any mix of these. Handles, URLs and search terms can all be used together.
| Field | Type | Notes |
|---|---|---|
profiles | array | zuck, @zuck or https://www.threads.com/@zuck all work |
postUrls | array | Single post URLs. Returns the post plus its visible replies |
searchQueries | array | Keywords. Returns matching posts from many accounts |
searchType | string | default (top posts) or tags (hashtag feeds) |
startUrls | array | Same targets in Apify request-list format |
maxPostsPerTarget | integer | 0 = no limit |
includeReplies | boolean | Default true. Turn off for original posts only |
includeProfileInfo | boolean | Adds follower count, bio and verified status |
onlyPostsWithMedia | boolean | Keep only posts with an image or video |
requestDelayMs | integer | Default 2500. Do not lower below 2000 on large runs |
proxyConfiguration | object | Optional. Works without a proxy |
Example
{"profiles": ["zuck", "@mosseri"],"postUrls": ["https://www.threads.com/@zuck/post/DdCYWl7GktV"],"searchQueries": ["openai"],"includeReplies": true}
Output
One row per post.
{"postId": "3981852126213720917","code": "DdCYWl7GktV","url": "https://www.threads.com/@zuck/post/DdCYWl7GktV","text": "Introducing @Muse, the personal agent that ...","postedAt": "2026-09-08T18:56:00.000Z","username": "zuck","userFullName": "Mark Zuckerberg","userIsVerified": true,"likeCount": 3025,"replyCount": 1735,"repostCount": 259,"quoteCount": 145,"isReply": false,"replyToUsername": null,"isQuote": false,"isRepost": false,"isPaidPartnership": false,"imageUrl": null,"images": [],"videos": [],"hasMedia": false,"linkAttachment": null,"sourceType": "profile","profileFollowerCount": 5736539,"profileBiography": "Mostly superintelligence and MMA takes"}
Failed targets look like this instead:
{"sourceUrl": "https://www.threads.com/@someone","error": "Empty response (HTTP 200, 1,186,646 bytes). Looks like temporary throttling","errorType": "EMPTY_RESPONSE"}
errorType is one of INVALID_INPUT, BLOCKED_OR_NOT_FOUND, EMPTY_RESPONSE, FETCH_FAILED.
RUN_SUMMARY in the key-value store gives you requestedTargets, succeededTargets, failedTargets, totalPosts and successRate.
What you can build with it
- Competitor tracking. Watch what brands post and how it lands, with like/reply/repost counts.
- Conversation mining. A post URL gives you the replies, which is where the actual opinions are.
- Trend discovery. Search a keyword and see who is talking and how loudly.
- Creator research. Follower counts, bios and posting cadence across a list of handles.
Notes and limits
- Threads serves roughly 10 posts per profile page and 20-30 per search. This Actor reads what the page serves; it does not scroll for more.
- Only public data. No login, no private accounts, no DMs, no follower lists.
- Search results mix many authors. Use
sourceTypeandsourceQueryto tell rows apart. postedAtis ISO 8601 UTC.likeCountis 0 on some search-sourced rows because Threads omits it there.
Legal
Only publicly visible Threads content is requested, through the same pages any logged-out visitor sees. No login, no personal data beyond what appears on a public profile.
Code examples
Copy-paste Python and Node examples (zero dependencies) live in github.com/steadyapi/scrapers. The Python one for this Actor is python/threads_profile.py.
Minimal call with plain HTTP:
curl -X POST "https://api.apify.com/v2/acts/steadyapi~threads-scraper/run-sync-get-dataset-items?token=$APIFY_TOKEN" \-H 'Content-Type: application/json' -d @input.json
Use it from AI agents (MCP)
Add this Actor as a tool in Claude, Cursor or any MCP client through the Apify MCP server:
https://mcp.apify.com/?tools=steadyapi/threads-scraper
Authenticate with your Apify token (OAuth is also supported). The agent can then call the Actor directly and read the results.
FAQ
Do I need a Threads or Instagram login? No. Only public profiles, posts and search results are collected.
Can I get replies to a post?
Yes. Put the post URL in postUrls and keep includeReplies on.
How many posts can I get from a profile? Threads shows a limited number of recent posts to logged-out visitors, so expect the latest posts rather than full history.
What about empty results? Threads sometimes answers with an empty page instead of an error. The Actor detects that and retries on a new session before reporting a failure.