Threads Scraper - Profiles & Posts, No Login
Pricing
from $0.40 / 1,000 threads profile or posts
Threads Scraper - Profiles & Posts, No Login
Threads answers on threads.com now; threads.net redirects across, so either URL or a bare handle works. Public profiles and recent posts, no login: bio, followers, text, likes, exact times, images, video and reply flags. $0.40/1,000 rows plus $0.001 a run. Blocked look-ups free.
Pricing
from $0.40 / 1,000 threads profile or posts
Rating
0.0
(0)
Developer
Dami's Studio
Maintained by CommunityActor stats
0
Bookmarked
1
Total users
1
Monthly active users
2 days ago
Last modified
Categories
Share
Threads Profiles & Recent Posts Scraper
Threads answers on threads.com now, and threads.net still 301s across to it, so either URL form resolves and so does a bare handle. A list of them returns a profile row for each, plus their recent public posts one row at a time: the text, the like count, the exact publish time, any image URLs, and flags for video and replies.
No Threads login. It resolves the profile from the crawler-facing metadata Threads publishes, then reads the public profile-posts query for the recent posts. HTTP only — no browser.
What it returns
Every row carries a recordType, so you can split the dataset in one pass.
profile rows (recordType: "profile"):
| Field | What it holds |
|---|---|
username, displayName | the handle and the public display name |
bio | public bio text |
followerCount | follower count as Threads publishes it — see the note below |
profilePicUrl, profileUrl | avatar image and the canonical public profile URL |
isVerified | frequently null; Threads doesn't put it in the public metadata for every account |
id, source | stable row id and which path the data came from |
post rows (recordType: "post"):
| Field | What it holds |
|---|---|
postId, postCode, postUrl | ids and the canonical threads.com/@user/post/... link |
username | the author handle |
text | the public post text |
likeCount | likes, or null when Threads doesn't expose a count |
publishedAt | ISO timestamp |
imageUrls | up to five public image URLs |
hasVideo, isReply | booleans for media type and whether the post is a reply |
A real pair of rows:
{"recordType": "profile","username": "zuck","displayName": "Mark Zuckerberg","bio": "Mostly superintelligence and MMA takes.","followerCount": 5700000,"profileUrl": "https://www.threads.com/@zuck","source": "threads_public_ssr"}{"recordType": "post","postId": "3960563624733395242","username": "zuck","text": "I believe everyone should have access to superintelligence, and I wrote a long piece about Meta's philosophy and values for building a positive future for everyone.","likeCount": 2127,"publishedAt": "2026-08-10T09:59:57.000Z","postUrl": "https://www.threads.com/@zuck/post/Db2v6H6kUkq","imageUrls": [],"hasVideo": false,"isReply": false,"source": "threads_public_graphql"}
diagnostic rows (recordType: "diagnostic") carry a code — BLOCKED, RATE_LIMITED, NOT_FOUND, NETWORK, TARGET_ERROR, NO_POSTS or NO_RESULTS — for bad input, blocking, rate limits, target errors or an empty result. They're free.
Only validated public profile and post rows are charged. Samples and diagnostics never are.
Input
{"profiles": ["zuck", "https://www.threads.com/@instagram"],"maxPostsPerProfile": 10,"includeProfile": true,"query": "AI","fallbackToResidential": false}
| Field | Default | Notes |
|---|---|---|
profiles | ["zuck"] prefilled | public handles or full threads.com/@handle URLs; both forms work |
maxPostsPerProfile | 10 | 1–30 public posts per profile |
includeProfile | true | set false to skip profile rows and pay only for posts |
query | — | case-insensitive text filter applied to the posts from the profiles you supplied |
fallbackToResidential | false | allow one proxy retry after a block or a transient failure |
proxyConfiguration | proxy off | only used by that one retry |
query is account-scoped on purpose. Threads doesn't give an anonymous global search path that holds up, so this Actor doesn't claim one — the filter narrows the posts from the handles you listed and nothing else.
Turning includeProfile off is the cheapest way to run a posts-only monitor here: each skipped profile row is one row you aren't billed for.
Leave profiles empty and you get one labelled, uncharged sample profile row.
Proxy behaviour
Direct HTTP first, always. When fallbackToResidential is on and a direct request comes back blocked, rate-limited or with a transient network failure, the Actor makes one retry through the proxy configuration you supplied. It doesn't retry successful requests and doesn't use a proxy for media.
Pricing
$0.40 per 1,000 rows ($0.0004 each), plus $0.001 each time a run starts. Charged only on rows actually returned, at the same rate on any plan.
A row is a genuine profile or post row. Samples, diagnostics, duplicates, blocked look-ups and no-result runs never incur the per-row fee, so a run that returns nothing costs the $0.001 start fee and no more. Direct HTTP is the default path, so no residential bandwidth is billed unless you switch on fallbackToResidential yourself.
Limits
- Public profiles and public posts only.
maxPostsPerProfileis capped at 30, which keeps both the cost and the load on Threads bounded.followerCountis approximate when Threads abbreviates it in the public metadata — it publishes "5.7M" for some accounts and an exact integer for others, and this returns whichever it gets, parsed to a number.isVerifiedis often null. It isn't in the public metadata for every account, and a guess would be worse than a blank.- No global keyword search, no hashtag feed, no follower lists, no reply threads. Profiles and their recent posts is the whole scope.
- Threads can change its anonymous endpoints. A diagnostic row means no result was charged.
Use public data in accordance with applicable law and Threads' terms.