Threads Scraper — Posts, Replies & Profiles, No Login
Pricing
from $4.00 / 1,000 post scrapeds
Threads Scraper — Posts, Replies & Profiles, No Login
Threads Scraper — extract posts, replies and profiles from threads.com with no login or cookies. Paste usernames or post URLs and get flat rows: text, like/reply/repost/quote counts, media, timestamps and author. Bulk-ready. JSON, CSV or Excel.
Pricing
from $4.00 / 1,000 post scrapeds
Rating
5.0
(1)
Developer
Muhamed Didovic
Maintained by CommunityActor stats
0
Bookmarked
38
Total users
15
Monthly active users
5 hours ago
Last modified
Categories
Share
Threads Scraper
Scrape Threads (threads.com) — profiles, user posts, replies, single post threads, keyword searches and hashtag feeds — without a login, cookies, or an account. Give it usernames, post URLs, keywords or hashtags and get back clean, flat rows: post text, like and reply counts, media, timestamps and author info. JSON, CSV or Excel.
Why use this scraper
- No login, no cookies. Pure HTTP against Threads' public endpoints — nothing to configure, no session to babysit.
- Whole-account in one run. Point it at any set of usernames and pull their posts or replies together.
- Find posts without knowing the author. Search any keyword or hashtag and get matching posts from across Threads — brand monitoring and social listening, not just known handles.
- Structured output. One row per post with a stable schema — ready for analysis, monitoring, or feeding an AI agent.
- Post-level detail. Paste a Threads post URL to pull the post and its whole reply thread.
- Filter by date. Set a publication window and posts outside it are dropped before they reach your dataset, so you are never charged for rows you asked not to receive.
- It tells you when it fails. See below — this is the part that actually costs people money.
You are not billed for empty runs
A Threads endpoint does not break loudly. When Meta gates one, it answers with a well-formed, completely empty payload — so a scraper built on it keeps reporting success while returning nothing, and keeps charging for it. That is not hypothetical: it is the single most common complaint on competing Threads actors, up to and including public requests for refunds after a hundred-plus consecutive billed runs produced no data.
This actor treats that as a failure:
- Every target returning nothing fails the run. You get a
FAILEDstatus and a message naming the cause, instead of a green run with an empty dataset. - Partial failures are reported. If 3 of 10 targets come back empty, the run still succeeds — you keep the rows you got — but the status message says
7/10 targetsso a slowly rotting endpoint is visible long before it dies completely. - Date-filtered rows are never charged. Filtering happens before billing, and the run tells you how many posts the window excluded.
- Your cost cap is honoured cleanly. At
maxTotalChargeUsdthe run stops and finishes normally with the rows you paid for, rather than overrunning into a killed run. - No padding. Threads' post pages embed a "more like this" carousel of unrelated posts. Those are excluded by design — they would inflate your dataset and your bill. Rows are also deduplicated by post ID.
Coming from another Threads scraper?
These are the things users most often ask for on other Threads actors. This actor already returns all of them:
| What people ask for elsewhere | Field here | Notes |
|---|---|---|
| A stable numeric user ID | userId | Populated on every row, not just some |
| Real reply / repost / quote counts | replyCount, repostCount, quoteCount | Actual values, not zeros |
| Reshare counts | reshareCount | Where Threads exposes it |
| A working "is this a reply" flag | isReply | Verified against Threads' own flag across live posts |
| A direct link to each post | url | Built on every row |
| Top vs Recent search ranking | searchSortType | Both supported |
| Date / datetime filtering | postedAfter, postedBefore | Applied before billing |
| Sortable timestamps | publishedAt, takenAtTimestamp | ISO 8601 and epoch seconds |
View counts are not available. Threads does not expose them to logged-out requests — the field simply is not in the response. Any actor that promises view counts without a logged-in session cannot be reading them from Threads. We would rather tell you that than ship a column of nulls.
What it does
| Input | Mode | You get |
|---|---|---|
| Usernames | Posts | Each user's Threads posts |
| Usernames | Replies | Each user's replies |
| Usernames | Profile info | Full name, follower count, bio, verification, profile picture |
| Post URLs | (automatic) | The post, plus its full reply thread unless you turn replies off |
| Search keywords | (automatic) | Posts mentioning each term, from any author |
| Hashtags | (automatic) | Posts under each tag |
How it works
You give it Threads usernames, post URLs, keywords or hashtags. For a user's posts and replies, the actor bootstraps a public guest token from Threads' own web app (no account, no cookies) and calls Threads' public GraphQL API over plain HTTP — the same endpoint the website uses. For post URLs, keyword searches and hashtag feeds it reads the server-rendered page directly, which needs no API token at all. Each target is normalized to a flat schema and streamed to your dataset. No browser, no third-party unblock service.
Input
| Field | Type | Description |
|---|---|---|
usernames | array | Threads handles, @handles, or profile URLs. Each is scraped per mode. |
mode | select | posts (default), replies, or profile. Applies to usernames only. |
postUrls | array | Threads post URLs (https://www.threads.com/@user/post/CODE). threads.net links work too. |
includeReplies | boolean | For post URLs: true (default) returns the post plus every reply in its conversation; false returns just the post you asked for. See the note below. |
searchQueries | array | Keywords or phrases to search for — returns matching posts from any author. |
hashtags | array | Hashtag feeds to pull, with or without the leading #. |
searchSortType | select | For keyword searches: top (default) or recent. Hashtag feeds are unaffected. |
postedAfter | string | Keep only posts published on or after this date. YYYY-MM-DD or a full ISO timestamp. |
postedBefore | string | Keep only posts published on or before this date. A bare YYYY-MM-DD includes the whole day. |
maxItems | integer | Max total rows across all targets. |
proxy | object | Datacenter (default) works and is fast; switch to Residential for very high volume. |
How many rows will a post URL return? With
includeReplieson (the default), one post URL returns the whole conversation — typically 5–30 rows, since active threads have many replies. If you only want the posts you pasted, setincludeRepliestofalseand you'll get exactly one row per URL. UsemaxItemsas a hard ceiling either way.
Date filtering works on every input type — search, hashtags, profiles and post URLs alike. Posts Threads returns without a timestamp are kept rather than silently dropped, so a filtered run never quietly loses rows you can't account for. The run's status message reports how many posts the window excluded.
Example input
{"usernames": ["zuck", "mosseri"],"mode": "posts","maxItems": 100}
Keyword and hashtag discovery, no handle needed:
{"searchQueries": ["climate change"],"hashtags": ["coffee"],"searchSortType": "recent","maxItems": 200}
Just the posts you pasted, one row each:
{"postUrls": ["https://www.threads.com/@zuck/post/DakyAavlKLZ"],"includeReplies": false}
Output
Each post row includes:
| Field | Description |
|---|---|
postId, code, url | Post identifiers + canonical Threads URL |
username, userId, userFullName, userIsVerified | Author |
text | Post text |
publishedAt, takenAtTimestamp | ISO timestamp + unix |
likeCount, replyCount, repostCount, quoteCount | Engagement — real counts, not placeholder zeros |
reshareCount | Reshares. Threads populates this on some posts only, so expect nulls |
isReply, replyToAuthor | Reply context |
mediaCount, mediaUrls | Attached images/videos |
linkPreviewUrl | Link preview target, if any |
hasAudio | Whether attached video carries audio |
scrapedFromMode | Which input produced the row: posts, replies, thread, search or hashtag |
searchQuery | The keyword or #hashtag that matched — on discovery rows only |
Rows from mode: "profile" are account records rather than posts, and carry username, userId, fullName, isVerified, followerCount, biography, profilePicUrl and profileUrl.
Sample output
{"postId": "3937491905269768921","code": "DakyAavlKLZ","url": "https://www.threads.com/@zuck/post/DakyAavlKLZ","username": "zuck","userIsVerified": true,"text": "Today we're releasing Muse Spark 1.1 ...","publishedAt": "2026-07-09T14:00:34.000Z","likeCount": 2767,"replyCount": 412,"repostCount": 88,"quoteCount": 19,"reshareCount": 7,"isReply": false,"mediaCount": 0,"scrapedFromMode": "posts"}
Posts published in a given window only:
{"searchQueries": ["product launch"],"postedAfter": "2026-08-01","postedBefore": "2026-08-14","maxItems": 500}
Pricing
Pay-per-result — you only pay for what you get. See the Pricing tab on the actor page for current rates.
| Event | When you're charged |
|---|---|
| Actor start | Once per run (platform floor) |
| Post scraped | Per row returned in the output |
FAQ
Do I need a Threads or Instagram account? No. It only reads what Threads serves publicly to logged-out visitors — no login, no cookies.
Can I scrape a single post and its replies? Yes — put its URL in postUrls. By default you get the post and every reply in its thread; set includeReplies to false for just the post itself.
Why did 20 post URLs return 200+ rows? Because each URL brings back its whole conversation. Threads posts often have dozens of replies. Set includeReplies to false for one row per URL, or cap the run with maxItems.
Can I find posts without knowing who wrote them? Yes — use searchQueries for keywords or hashtags for tag feeds. Neither needs a handle.
A post URL returned nothing. Why? The post was deleted, made private, or its author's account was removed. The run's status message reports how many targets came back empty. Threads also serves a gated version of some post pages to certain IPs, so the actor retries on a fresh address before concluding a post is gone.
Can I get view counts? No, and neither can any logged-out scraper. Threads does not include a view count in the data it serves to guests — the field is absent from the response, not zeroed. Every other engagement metric (likes, replies, reposts, quotes, reshares) is returned.
Can I filter by date? Yes — postedAfter and postedBefore accept YYYY-MM-DD or a full ISO timestamp, and work with every input type. Posts outside the window are dropped before billing, so they cost nothing.
I set a date range and got zero rows. Is it broken? Almost certainly not. The status message tells you how many posts were excluded by the window; if that number is large, widen the range. A genuinely broken endpoint fails the run instead of returning an empty dataset.
Which pricing model? Pay per result — you only pay for rows returned. See the Pricing tab.
Support
Found a bug or want a new field/mode? Open an issue on the actor's Issues tab.
🤖 For AI Agents & LLM Apps
Compact reference for AI agents calling this actor via the Apify MCP server or the Apify API (actor: memo23/threads-scraper).
Purpose: Scrape Threads (threads.com) — user posts, replies, profiles, single post threads, keyword searches, and hashtag feeds — with no login or cookies, returning flat post rows.
Minimal input:
{"usernames": ["zuck"],"mode": "posts","maxItems": 20}
For keyword/hashtag discovery with no handle: { "searchQueries": ["climate change"], "hashtags": ["coffee"], "searchSortType": "recent", "maxItems": 20 }.
Output: one row per post with postId, code, url, username, userId, userFullName, userIsVerified, text, publishedAt, takenAtTimestamp, likeCount, replyCount, repostCount, quoteCount, reshareCount, isReply, replyToAuthor, mediaCount, mediaUrls[], linkPreviewUrl, hasAudio, scrapedFromMode, searchQuery. mode: "profile" rows are account records (username, userId, fullName, isVerified, followerCount, biography, profilePicUrl, profileUrl).
Behaviors an agent should know:
- Always set
maxItems. A post URL withincludeReplieson (default) returns the whole conversation (typically 5–30 rows per URL); setincludeReplies: falsefor one row per URL. usernamesare scraped permode(posts/replies/profile);searchQueriesandhashtagsneed no handle.searchSortTypeistoporrecent.- Every target that returns nothing fails the run (guards against empty-but-billed runs); partial emptiness is reported in the status message.
postedAfter/postedBefore(YYYY-MM-DD or ISO) filter before billing, so excluded posts cost nothing.- View counts are not available to logged-out requests and are never returned.
- Pay-per-result: charged once per run at actor start, then per post row returned; date-filtered and empty results are not charged.
⚠️ Disclaimer
This scraper only collects data that is publicly available on Threads without logging in. Use it in compliance with Threads' terms and applicable law (including data-protection rules such as GDPR). You are responsible for how you use the data.
SEO Keywords
threads scraper, scrape threads, threads.com scraper, threads.net scraper, threads api, scrape threads posts, threads post scraper, threads profile scraper, threads replies scraper, threads hashtag scraper, threads keyword search, threads social listening, brand monitoring threads, social media scraper, threads data export, threads content analysis, no-login threads scraper, Apify threads, threads json csv