Threads Scraper - Posts, Replies, Search & New Post Monitor
Pricing
from $2.60 / 1,000 profile with new posts
Threads Scraper - Posts, Replies, Search & New Post Monitor
Threads scraper with no login: an account's posts with history, every reply as its own row, keyword search results, plus the e-mails, link domains, mentions and hashtags found in them. Repeat runs return only what is new; nothing new costs nothing. Paid plans add AI summaries and labels.
Pricing
from $2.60 / 1,000 profile with new posts
Rating
0.0
(0)
Developer
Daniel Carter
Maintained by CommunityActor stats
0
Bookmarked
3
Total users
1
Monthly active users
14 hours ago
Last modified
Categories
Share
Threads scraper (threads.com / threads.net) with no login: an account's posts with their history, every reply to a post as its own row, the posts a keyword search shows — and, read out of all of it, the e-mail addresses, phone numbers, link domains, mentioned accounts and hashtags as rows of their own. It remembers what it already gave you, so repeat runs return — and charge — only what is new; an account with nothing new is one small profile-snapshot-checked event for its current profile and follower change.
| Free plan (preview) | Paid Apify plan (Starter and up) | |
|---|---|---|
| Accounts per run | 3 | 200 |
| Posts per account | the newest 10 posts of the account's first screen, + how many more the screen held | every post of the screen and the history up to maxPostsPerProfile (1,000 per account) |
| Only new posts on repeat runs (accounts) | yes | yes |
| Post addresses per run (replies) | 1, with 5 replies + how many more the screen held | 50, every reply Threads shows to visitors, up to maxRepliesPerPost |
| Keywords per run | 1, with 5 posts of the search screen + how many more it held | 50, every post of the search screen (18 to 35), more with searchPasses |
| Only new replies and search posts on repeat runs | locked | yes |
| Text of replies and search posts | first 140 characters (textTruncated: true) | full |
| Author of every post and reply | name, user number, display name, verified mark, profile address, profile picture address | the same |
| Indicator rows (e-mail, phone, link domain, mentioned account, hashtag) | 1 per kind and target (the most seen value) + how many a paid run would have returned, per kind | every distinct value, one row each; on repeat runs only values not delivered before |
Filters minLikes, since | yes | yes |
| AI summary of a post's replies, AI insight per keyword | not available — a free run calls no model | yes, each charged only after it passed our checks |
Your own questions answered per post and reply (aiLabels) | not available — a free run calls no model | yes, $0.0002 per answer that passed our checks |
Limits report (limits row and notice rows) | complete | complete |
| Price per event | list price | collection rows: BRONZE −20%, SILVER −35%, GOLD and up −48%; AI events: the same price on every plan |
How big is the difference? Measured on 2026-10-08: a free run reads the first screen of an account, 4 to 10 posts; the same accounts gave 70 to 128 posts within 8 to 10 further pages in our test runs and kept going. One post showed 133 of its 140 replies; another 612 replies and counting. A keyword gave 18 to 35 posts per pass and 25 to 54 after four passes.
A free run never fails because of a limit: it shows the preview, tells you in the dataset what stayed locked as counted numbers (free-plan-preview rows), and ignores paid-only inputs with a notice.
This is an unofficial, independent tool. It is not affiliated with, endorsed by, or sponsored by Meta Platforms, Inc., Instagram, or Threads. It reads only what Threads shows to visitors who are not logged in. It does not use accounts, login cookies, or private profiles. Results contain personal data such as usernames and the text people posted. You are responsible for how you run this Actor and how you use its output, including having a lawful basis for processing personal data (for example under GDPR or the laws that apply to you), respecting the rights of the people who wrote the posts, and Threads' terms. Do not use this Actor to monitor or profile private individuals, to send unsolicited bulk messages, or to harass anyone.
Export every reply under a post
Give one or more post addresses in postUrls and set maxRepliesPerPost (default 100, up to 1,000). You get one row per reply (recordType: "reply") with the text, time, likes, replies, reposts, quotes and the author's name, display name and verified mark, plus one thread row per post that says how many replies Threads reported and how many were read. Example input: {"postUrls": ["https://www.threads.com/@nasa/post/DZaMpw5kY3a"], "maxRepliesPerPost": 100}. A reply costs $0.002 (reply), the post $0.005 (thread-checked); there is no run-start fee, and on paid plans a second run returns only the replies that are new.
Followers and following lists are not offered. Threads does not show them to visitors who are not logged in (checked again on 2026-10-27: the /followers and /following addresses answer 404), and this Actor never logs in. The follower count of every account is in its profile row, with the change since your last run.
Using it from Claude or another AI agent (Apify MCP). Each of the three inputs (usernames, postUrls, keywords) starts with one sentence and an example, and the prefilled input runs as it is. Leave include, aiLabels and the AI switches out unless you want those paid layers.
What it is for
- Brand and topic monitoring. Follow what your own brand's accounts, your competitors' accounts or a product keyword show on Threads, and get only the new posts on each scheduled run.
- Public account analysis. An account's posts over time with likes, replies, reposts and quotes, and how those numbers and the follower count moved between runs.
- Reading a conversation. Every reply under a post as a row you can sort and count, and — on paid plans — a short AI summary of what the replies say, with the replies it is based on.
- Finding leads. Search a keyword your buyers use, or read the replies under a post where people ask for a recommendation, and let
aiLabelsmark the ones that ask ("Is the author looking for a product or a recommendation?"). The indicator rows give you the public contact points that came with them: the e-mail addresses and link domains accounts put in their bio and posts, and who mentioned whom. - Mapping a topic. Which hashtags, accounts and sites come up around a keyword or under a post, counted, with the posts they were seen in.
Nothing new, nothing to pay
Most scrapers hand you the same posts on every run and bill you for all of them. This one keeps a record of what it gave you.
- An account is charged only when it returns at least one new post
- Posts you received in a previous run are never charged again
- Accounts Threads does not show cost nothing, and there is no run-start fee; an account checked with nothing new is one
profile-snapshot-checkedfor its current profile and follower change
Your first run has nothing to compare against, so it returns the current posts as a baseline. From the second run onward you get only the difference. On paid plans the same holds for the replies of a post and for the posts of a keyword.
How to use it
- Enter accounts (
usernames), post addresses (postUrls) or keywords (keywords) — any mix. - Set how much to read (
maxPostsPerProfile,maxRepliesPerPost,searchPasses). - Run it, or schedule it hourly or daily: each run hands you just the new material. The last rows of the dataset tell you what was limited and why.
Input
| Field | Type | Description |
|---|---|---|
usernames | array | Accounts: @handle, plain name or profile address (profiles is read as the same field) |
postUrls | array | Post addresses (https://www.threads.com/@name/post/CODE) or name/CODE; only the name and the code are taken from what you enter |
keywords | array | Search keywords, 2 to 80 characters |
onlyNewPosts | boolean | Return only what was not delivered before (default true; for replies and search posts: paid plans) |
maxPostsPerProfile | integer | Posts per account, newest first, 1–1,000 (default 25; past the first screen: paid plans) |
maxRepliesPerPost | integer | Reply rows per post, 0–1,000 (default 100; above 5: paid plans) |
searchPasses | integer | How often the same search is asked, 1–5 (default 1; above 1: paid plans) |
skipReplies | boolean | Leave out an account's own replies to other people |
minLikes | integer | Leave out posts and replies with fewer likes (default 0). What is left out is not charged, and is delivered on the run in which it passes |
since | string | Leave out posts and replies published before this date (2026-10-01 or 2026-10-01T00:00:00Z) |
include | array | Kinds of indicator rows: email, phone, domain, mention, hashtag. Not set: all five, in the rows layout. []: no indicator rows |
includeEngagementDelta | boolean | Add how much each post's numbers moved since the previous run (default true) |
resultLayout | string | rows (one row per post) or perProfile (posts inside one row per account). Empty with accounts only: perProfile, as before |
aiThreadSummary / aiKeywordInsight | boolean | AI layers (paid plans, off by default) |
aiLabels | array | Your own questions, answered for every post and reply row (paid plans): [{"label": "asks_recommendation", "question": "Is the author asking for a product recommendation?"}, {"label": "stage", "question": "Where is the author in buying?", "options": ["researching", "comparing", "decided"]}]. Without options the answer is true or false. Up to 10 labels |
aiLanguage / aiMaxItems / aiLabelMaxItems | string / integer / integer | Language of the summaries (default en), the most summaries per run (default 50), the most texts sent for labels per run (default 2,000) |
maxConcurrency / proxyConfiguration | integer / object | Up to 4 targets are read at once; keep Apify Proxy on |
{"usernames": ["@zuck", "https://www.threads.com/@nasa"],"postUrls": ["https://www.threads.com/@nasa/post/DZaMpw5kY3a"],"keywords": ["electric cars"],"resultLayout": "rows","maxPostsPerProfile": 50,"maxRepliesPerPost": 200,"include": ["email", "domain", "mention"],"minLikes": 2}
Output
One row is one thing; recordType says which.
recordType | One row per | Main fields |
|---|---|---|
profile | account | username, userId, fullName, biography, bioLinks, followers, followerDelta, isVerified, profilePicUrl, newPosts, postsRead, firstRun, contacts (how many e-mail addresses, phone numbers, link domains, mentioned accounts and hashtags the bio and the posts held) |
post | post of an account | postCode, url, text, publishedAt, likeCount, replyCount, repostCount, shareCount, quoteCount, isReply, isPinned, hashtags, mentions, links, linkPreview, topicTag, isQuote, quotedPost, genAiDetectionMethod, media, isNew, engagementDelta, the author fields, aiLabels |
searchPost | post found by a keyword | the post fields + sourceName (the keyword) |
keywordSummary | keyword | postsFound, postsDelivered, passes, oldestPostAt, newestPostAt, totalLikes, totalReplies, and ai when the insight is on |
thread | post address | the post fields + repliesDisplayedByThreads, repliesRead, repliesNew, moreRepliesAvailable |
reply | reply | threadCode, replyDepth, parentPostCode, replyToUsername, the author fields, text, publishedAt, likeCount, replyCount, aiLabels |
indicator | distinct value per account, post or keyword | indicatorType (email, phone, domain, mention, hashtag), value, occurrences, foundIn (bio, post, reply), firstSeenAt, lastSeenAt, postUrls (up to 5), authorUsernames (up to 5: who wrote it) |
threadSummary | AI summary of a post's replies | summary, sentiment, topics[], questions[], disagreements[], each with evidencePostCodes |
limits | run | what was read, what Threads did not show, what was not charged |
The author fields are the same on every post, search post, thread and reply row: authorUsername, authorUserId, authorFullName, authorIsVerified, authorProfileUrl, authorProfilePicUrl.
Every post, search post, thread and reply row also carries what came with the post, each null when Threads did not send it:
linkPreview— the link card under the post:url(the address it leads to),title,displayUrl.topicTagandtopicTagId— the topic the author put the post under.isQuoteandquotedPost— the post it quotes:authorUsername,url,postCode,postId,text,publishedAt.genAiDetectionMethod— how Threads says the post was marked as AI-made, in Threads' own word (NONE: not marked;SELF_DISCLOSURE_FLOW: the author said so). Threads sends it with account and search posts, not on a post's own page.
Threads does not send image descriptions (alt text), reposts or a paid-partnership mark to visitors who are not logged in (0 of 51 posts measured on 2026-10-13), so there is no field for them.
Rows without recordType and with a noticeCode are messages (a free-plan preview, a skipped input); they are never charged. With resultLayout: "perProfile" an account comes back as one row with profile, followerDelta, newPosts, posts[], firstRun, charged — the shape this Actor has returned since its first version — and the run writes no limits row.
{"recordType": "reply","sourceName": "nasa/DZaMpw5kY3a","threadCode": "DZaMpw5kY3a","replyDepth": 1,"postCode": "DZaXk2pDq1c","authorUsername": "space_fan_42","authorUserId": "63055343223","authorFullName": "Space Fan","authorIsVerified": false,"authorProfileUrl": "https://www.threads.com/@space_fan_42","authorProfilePicUrl": "https://…/profile.jpg","text": "Is the full audio going to be searchable?","publishedAt": "2026-10-07T18:02:11.000Z","likeCount": 14,"replyCount": 1,"replyToUsername": "nasa","aiLabels": { "asks_question": true },"isNew": true}
{"recordType": "indicator","sourceType": "post","sourceName": "nasa/DZaMpw5kY3a","indicatorType": "email","value": "press@example.org","occurrences": 2,"foundIn": ["reply"],"firstSeenAt": "2026-10-07T18:02:11.000Z","lastSeenAt": "2026-10-07T19:40:02.000Z","postUrls": ["https://www.threads.com/@space_fan_42/post/DZaXk2pDq1c"],"authorUsernames": ["space_fan_42"],"isNew": true}
About people in the results. A row carries what Threads shows next to a post: the account name, the user number, the display name, the verified mark, the profile picture address and the reaction counts. For an account you name yourself it also carries the public bio and the follower count. The indicator rows hold what people wrote into a public bio, post or reply themselves — nothing is looked up anywhere else. For media only the address is returned — no file is downloaded.
What Threads shows, and what it does not
- Search is the one screen Threads shows to visitors who are not logged in: about 20 posts per search, not sorted by date and without a second page. It is a snapshot of how a keyword is talked about, not a live feed.
searchPassesasks again and collects the posts that differ. - Replies are read as far as Threads shows them to visitors; for a post with thousands of replies that is a part of them. The
threadrow carries both the count Threads displays and the count this run read. - Accounts that Threads does not show to visitors (private, removed, or restricted) return a notice and are not charged.
- When Threads does not show a page, the run does not ask again and again: it tells you in a notice row and goes on with the next target.
Pricing
| Event | FREE | BRONZE | SILVER | GOLD and up | When |
|---|---|---|---|---|---|
profile-checked | $0.005 | $0.004 | $0.00325 | $0.0026 | An account returned at least one new post |
post-delivered | $0.002 | $0.0016 | $0.0013 | $0.00104 | Per new post of an account |
profile-snapshot-checked | $0.005 | $0.004 | $0.00325 | $0.0026 | An account was checked and returned no new post: its row carries the current profile and the follower change (never together with profile-checked) |
keyword-checked | $0.005 | $0.004 | $0.00325 | $0.0026 | A keyword's search was read (also when it found nothing) |
search-post | $0.004 | $0.0032 | $0.0026 | $0.00208 | Per post found by a keyword |
thread-checked | $0.005 | $0.004 | $0.00325 | $0.0026 | A post address was read (also when Threads answers that the post does not exist) |
reply | $0.002 | $0.0016 | $0.0013 | $0.00104 | Per reply row |
indicator | $0.002 | $0.0016 | $0.0013 | $0.00104 | Per indicator row: one distinct value per target, however often it was seen; with only-new delivery, once per target across runs |
thread-summarized | $0.03 | $0.03 | $0.03 | $0.03 | Per AI summary of a post's replies that passed our checks |
keyword-insight | $0.03 | $0.03 | $0.03 | $0.03 | Per AI keyword insight that passed our checks |
ai-label | $0.0002 | $0.0002 | $0.0002 | $0.0002 | Per answer to one of your aiLabels questions about one post or reply, after it passed our checks |
There is no run-start fee. Checking an account that has nothing new triggers one profile-snapshot-checked and no other account event. Apify platform usage of a run (compute, proxy, storage) is billed by Apify in addition to these events, as it has been for this Actor.
Examples at the FREE price: two accounts, first run, 25 posts each = $0.11; the same two accounts the next day with one new post each = $0.014; a post with 300 replies = $0.605; one keyword with 21 posts = $0.089. On top of that: 40 indicator rows = $0.08; two labels on 300 replies = 600 answers = $0.12. Indicator rows are on by default in the rows layout — set include to [] to leave them out. The first time an account you already monitor runs in the rows layout, the indicator values on its screen are delivered once and charged (they were never delivered before); take kinds out of include to leave them out. A target's record holds 5,000 indicator values and none of them is ever charged a second time; values past the 5,000 are not delivered and not charged — an indicator-record-full notice row says how many were left out (see "Indicator values" below).
AI layers (paid plans, optional)
All three are off by default. When you switch one on, the public text of the post and its replies (or of the keyword's posts) is sent to Anthropic's API (Claude), an AI provider based in the United States, to write the summary or answer your questions; account names are not sent. Leave the layers off and nothing is sent anywhere. A summary is charged only after it passed our checks: every statement must cite replies or posts of your run, and a summary that cites none is thrown away uncharged.
Your own labels (aiLabels). Each question is answered for every post, search post and reply row the run delivers (the first 400 characters of its text), and the answers are in the row's aiLabels. An answer is charged only when it is true, false or exactly one of the options you gave; anything else is dropped uncharged and counted by reason in the limits row. An answer is checked for its form, not for its truth: it is a model's reading of a short text. Labels need the rows layout.
Scheduling and the record of what you already have
The Actor keeps its record in a key-value store named THREADS-MONITOR-STATE in your own Apify account: per account, post and keyword, the codes of what was delivered. Nothing is stored on our side. Delete a record (or the store) and the next run starts from a new baseline.
The order of a delivery. Rows go out a batch at a time (up to 200 rows): the run first counts how many rows your charge limit still pays for, writes that many into the dataset, puts them on the record, and only then charges them. A row that is charged is in your dataset.
Restarts. A run that is aborted, moved by the platform or resurrected goes on where it stopped: what is on the record is not delivered and not charged again. A run that was killed in the middle of a batch can leave two things behind, each at most that one batch: rows that were written right before the kill are written once more by the restart (or by your next run) — they are in the dataset twice and charged once; rows that were written and put on the record right before the kill are not charged at all.
Do not schedule two runs on the same account, post or keyword so that they overlap. There is no lock between runs. Each run reads the record again right before it writes a batch and leaves out what another run delivered in the meantime, but two runs that reach the same new posts within the same moment each deliver them into their own dataset and each charge them — as two separate runs of any scraper would. Overlapping runs can also overwrite each other's record: the run that saves later may drop a post the other run has just recorded as delivered, and that post is then delivered and charged once more by a later run, even one that overlaps nothing. Schedule the runs on a target so that one has finished before the next one starts. Runs on different targets do not affect each other.
The record is yours to delete, not a switch for free rows. An entry in the record means "already delivered": it is not delivered and not charged. Nothing you can write into the record, or into a run's own key-value store, makes the Actor deliver a row without its charge. If you delete a record, the next run takes that target as new: everything it reads is delivered and charged.
Indicator values. The record of one target holds up to 5,000 indicator values. When it is full, new values of that target are not delivered and not charged (a value that cannot be put on the record would be charged again on every run); an indicator-record-full notice says how many, and how to start over.
Coming from version 1.0. Your records are read as they are. What version 1.0 could have shown you up to your last run counts as delivered — including posts that have since moved off its first screen — so the first run of this version charges only posts published after that run.
Changes in version 1.1 (2026-10)
- New: replies of a post (
postUrls), keyword search (keywords), account history past the first screen, one-row-per-post layout (resultLayout: "rows"), indicator rows, filters (minLikes,since), three AI layers. - The existing output is unchanged: a run with accounts only returns the rows it always returned, field for field (
profile.userIdandposts[].authorUserIdincluded). Indicator rows and labels are part of therowslayout. - Free plan: 3 accounts per run. More accounts in a free run are skipped with a notice and not charged.
maxPostsPerProfilenow really reaches that many posts on paid plans (before, a run returned the 4 to 10 posts of the first screen whatever the number). A first run, and a run withonlyNewPosts: false, can therefore return more posts — each at the unchangedpost-deliveredprice. Scheduled only-new runs are not affected.- A run whose inputs are all unusable ends with a notice row instead of failing.
Leave a review
A short review on the Reviews tab, good or bad, helps other people find this Actor and tells us what to build next. Found a bug or need a feature? Open an issue on the Issues tab and we'll look into it.