Threads Replies Scraper: Comments of Any Post avatar

Threads Replies Scraper: Comments of Any Post

Pricing

from $0.06 / 1,000 replies

Go to Apify Store
Threads Replies Scraper: Comments of Any Post

Threads Replies Scraper: Comments of Any Post

Scrape the replies of any Threads post without a login: every reply Threads serves to a logged out visitor, page by page, plus the replies of replies to the depth you choose. Text, author, time, likes, media, depth and parent on each row. JSON, CSV, Excel, API. Pay per reply.

Pricing

from $0.06 / 1,000 replies

Rating

0.0

(0)

Developer

Automation Craft

Automation Craft

Maintained by Community

Actor stats

0

Bookmarked

1

Total users

1

Monthly active users

a day ago

Last modified

Share

Threads Replies Scraper: Comments of Any Post

Scrape the replies of any Threads post (threads.com, Meta's text app) without a login: give post URLs and get every reply Threads serves to a logged out visitor, page by page, plus the replies of those replies to the depth you choose. One row per reply with the text, the author, the time, likes, its own reply count, media, its depth in the conversation and the reply it answers, and one row for the post itself with its view count. Pay per reply, from $0.06 per 1,000.

Built for comment analysis and sentiment research, community and brand monitoring, giveaway and contest checks, and AI data sets of real conversations. Name a memory and every later run delivers and charges only the replies it has not delivered before. Rows carry what Threads shows publicly about each reply's author (handle, display name, id, profile picture); use them under the rules that apply to you.

Quick start

  1. Open the Actor and paste one or more Threads post URLs into Post URLs (https://www.threads.com/@user/post/CODE, the short /t/CODE form, threads.net links or a bare post code all work).
  2. Set Replies per post (100 when left out; the Console form starts at 20) and, if you like, the Order of replies (oldest first, the order Threads shows them, or newest first) and the Reply depth (2 by default: the replies and the replies of those replies).
  3. Run. Rows land in the dataset as JSON, CSV, Excel or through the API; a free coverage row per post says how many replies Threads shows, how many were read, delivered and charged, and why the walk stopped.
  4. For a monitor: give a Memory name and schedule the run; each reply comes once. With a memory the run reads the newest replies first at depth 1 (unless you set them), so new replies come first; it then reads on through replies it already delivered, free, within the work allowance (about 1,000 known direct replies a run), so on a busier post a run ends with stoppedBy: "work_allowance" after its new replies.

What you get

One reply row per reply, charged once per run, and one post row per post you gave (once per run day). Fill rates measured on 1,198 distinct replies of 4 posts delivered by the real actor's test matrix of 2026-10-08 (build 0.1.1, platform-results/fill-rates-r1.json):

FieldWhat it isFilled
code, url, postIdthe reply's short code, its own page and its numeric id100%
textthe full text of the reply94.6% (the rest are a sticker, an image or a GIF only)
postedAt, postedAtUnixwhen it was posted (UTC)100%
authorUsername, authorId, authorVerified, authorProfilePic, authorUrlthe reply's author100% (7.5% verified)
authorFullNamethe author's display name95.2%
likeCount, replyCount, repostCount, quoteCountengagement at the time of reading; replyCount is the reply's own replies100%
depth1 for a direct reply to the post, 2 for a reply to a reply, and so on100% (81.2% at depth 1, 15.9% at depth 2, 2.9% deeper)
parentPostCode, replyToUsernamethe post or reply this reply answers, and its author100%
rootPostCode, rootPostUrl, rootPostAuthorUsernamethe post you gave100%
isPostAuthor, likedByPostAuthor, authorThread, pinnedwritten by the post's author, liked by the post's author (as Threads shows it), part of the author's own continuation of the post, a reply the author pinnedalways set; 0.5% by the post author, 1.6% liked by the post author
language, languageTag, languageSource, languageUnknownthe language as an ISO code: Threads' own label when it has one (Chinese, Japanese and Korean), else a statistical classification of texts of 80 characters or more (languageSource: "text"); unknown and kept when neither gives one34.9% (0.6% Threads' own label, 34.3% from the text); replies are short, so most stay unknown
mediaType, hasMedia, imageUrl, images, videos, carouseltext, image, video or carousel, with the media URLs (they expire after some days)5.5% carry media
linkAttachmentthe link card (url, title, image)2.2%
isQuote, quotedPost, repostedPosta quoted or reposted post inside the replywhen present (0.3%)

The post row carries the same fields for the post you gave plus viewCount, the view count its page shows (4 of 4 posts measured), and lookupDay.

Free rows next to the replies: one coverage row per post (replyCountShown, the count Threads shows on the post; repliesRead, topLevelRead, repliesDelivered, repliesCharged, replyCalls, threadsExpanded, threadsCut, filtered, repeated and known counts, stopReason, walkEnded), a status row for a post that does not exist, an unusable value or posts a stopped run did not start, and one summary row with every counter and what was charged.

How deep it goes

A Threads post page shows at most about 10 replies to a visitor who is not logged in. This Actor reads past it: it asks Threads for the next replies the way Threads' own page does, about 90 direct replies per call, until Threads serves no more, and with Reply depth 2 or more it walks the replies of every reply that has more replies than were shown under it. Measured on 2026-10-08 on posts read to the end:

PostReplies Threads showsReplies read (direct and nested)Calls after the page
a NASA post9573 at depth 1, 89 at depth 21 at depth 1, 5 at depth 2
a Duolingo post1851462
a Zuckerberg post5183725
a Zuckerberg post2,5621,000 in 62 seconds (a run's cap, still going)24

Logged out, Threads stops serving replies before the count it shows: on the four posts the spike walked to the end, the direct replies it served were 51 to 74 percent of that count; counting the nested replies too, the rows read on the three posts of the table read to their end were 72 to 94 percent of it (372 of 518, 146 of 185, 89 of 95). The rest needs a login, which this Actor never uses. So no post is ever reported as complete: the coverage row gives the count Threads shows next to the replies read, and walkEnded: true when the walk read until Threads served no more.

How much does it cost to scrape Threads replies?

Pay per event. Prices per 1,000 events (USD):

EventFree planBronzeSilverGold
Reply (one reply row)0.090.080.070.06
Post (the post you gave, looked up, once per run day)2.002.002.002.00
Actor start (once per run, per GB of memory; runs use 256 MB, so one)0.007 per run0.007 per run0.007 per run0.007 per run

Platinum and Diamond plans pay the Gold price. There is no discount on the Actor start event.

The Store pricing card shows these same prices per 1,000 events: "$2.00 / 1,000" on the Post row means one post costs 0.2 cents, and "$0.06 / 1,000" on the Reply row means one reply costs 0.006 cents.

Worked examples on the Free plan: one post with 20 replies costs 0.007 + 0.002 + 20 x 0.00009 = $0.0108; one post with 1,000 replies costs 0.007 + 0.002 + 0.09 = $0.099; 10 posts with 100 replies each cost 0.007 + 0.02 + 0.09 = $0.117.

Free: a post that does not exist or could not be read, filtered replies, a reply already delivered in the run, replies a named memory knows, the coverage, status and summary rows, and every row of a run that cannot bill safely (a memory that could not be read or saved, a run the platform restarted).

The work allowance

Work that may end without a charge (a post that does not exist, a page of replies that all fail your filters or that the memory already knows) is bounded per run: 40 seconds of such unpaid work, plus 6 seconds for each charged post and 1 second for each charged reply. When it is spent the run stops, says so in the summary (stoppedBy: "work_allowance") and lists the posts it did not start in a free status row. Calls that deliver charged replies never use it up.

Input

FieldTypeWhat it does
postUrlslistThreads post URLs (threads.com or threads.net, /@user/post/CODE, /t/CODE, /post/CODE) or bare post codes; a reply's URL works too (its own replies are read). Up to 200 per run. Codes are case sensitive.
maxRepliesPerPostintegerReplies to keep per post, nested ones included (default 100, up to 5,000; 0 delivers the post row only).
replySortoldest_first or newest_firstThreads' default order (the first replies first) or the newest first (top and recent are accepted too). Default oldest_first; newest_first with a memory name.
replyDepth1 to 61: direct replies and the nested replies Threads shows inside them; 2: also the replies of every reply that has more than were shown; up to 6 levels. Default 2; 1 with a memory name.
postedAfter, postedBeforetextKeep replies in a date range (UTC): YYYY-MM-DD, YYYY-MM-DDTHH:MM, today, yesterday, 7 days, 6 hours. Replies outside are free. With oldest_first the walk stops at the first page of direct replies newer than postedBefore.
minLikesintegerKeep replies with at least this many likes.
excludePostAuthorbooleanLeave out the post author's own replies.
onlyWithMediabooleanKeep replies with an image, a video or a carousel.
languages, dropUnknownLanguagelist, booleanKeep replies in these languages (en, es, ja); replies with no detected language are kept unless dropUnknownLanguage is on.
maxItemsintegerA cap of post and reply rows for the whole run (no cap when left out).
memoryName, resetMemorytext, booleanPay once per reply across runs: a named memory this Actor keeps in your account; each run reads the conversation again (newest first), charges only replies it has not delivered before, and reads known replies free within the work allowance (about 1,000 known direct replies a run).
proxyConfigurationobjectApify datacenter proxy. Threads answers it fully, so a residential or other Apify proxy group is not used (the run says so in its summary); your own proxy URLs are used as given.

API examples

curl -X POST "https://api.apify.com/v2/acts/automation_craft~threads-replies-scraper/run-sync-get-dataset-items?token=YOUR_TOKEN" \
-H "Content-Type: application/json" \
-d '{"postUrls": ["https://www.threads.com/@zuck/post/Dd1MqfcG0aH"], "maxRepliesPerPost": 200}'
import { ApifyClient } from 'apify-client';
const client = new ApifyClient({ token: process.env.APIFY_TOKEN });
const run = await client.actor('automation_craft/threads-replies-scraper').call({
postUrls: ['https://www.threads.com/@nasa/post/DeKza99kXKb'],
replySort: 'newest_first',
maxRepliesPerPost: 100,
});
const { items } = await client.dataset(run.defaultDatasetId).listItems();
console.log(items.filter((x) => x.type === 'reply').length, 'replies');
from apify_client import ApifyClient
client = ApifyClient("YOUR_TOKEN")
run = client.actor("automation_craft/threads-replies-scraper").call(run_input={
"postUrls": ["https://www.threads.com/@duolingo/post/DUi82igCcv4"],
"replyDepth": "3",
})
for item in client.dataset(run["defaultDatasetId"]).iterate_items():
if item["type"] == "reply":
print(item["depth"], item["authorUsername"], item["text"])

What this Actor does NOT do

  • It does not read the replies Threads hides from visitors who are not logged in: on the posts measured a walk ends at about half to three quarters of the reply count Threads shows. It never logs in and never asks for your cookies or a Threads account.
  • It does not read the quotes or the reposts of a post: Threads serves no list of them to a logged out visitor.
  • It does not sort replies by likes or by Threads' ranking: it reads Threads' default order (oldest first) or the newest first.
  • It does not read profiles, searches, hashtags or followers lists: give it post URLs. Followers lists need a login.
  • It does not use residential proxies: Threads answers the Apify datacenter pool, and a residential group in the input is replaced by it (the summary says so).
  • It does not report a post's replies as complete, and it does not promise a number of replies per post.
  • It does not give view counts for replies; Threads shows a view count on a post's own page only, delivered on the post row.

FAQ

How many replies can it read from one post?

Every reply Threads serves to a logged out visitor, about 90 per call, page by page until Threads serves no more. On the posts measured the direct replies served were 51 to 74 percent of the reply count Threads shows, and with the nested replies 72 to 94 percent of it was read. The coverage row of each post gives the count Threads shows next to the replies read.

Can I see all replies on a Threads post without logging in?

Not all: logged out, Threads stops serving replies at about half to three quarters of the count it shows. This Actor reads all of what it serves and never logs in or asks for cookies, and it never reports a post as complete.

How do I export Threads comments to CSV or Excel?

Paste the post URLs into postUrls and run. Each reply is one row, so the dataset downloads as CSV, Excel or JSON from the run page or through the API, with the author, text, time, likes, depth and parent as columns.

Does it get the replies to replies?

Yes. Rows carry depth (1 for a direct reply) and parentPostCode. replyDepth 2, the default, also walks the replies of every reply that has more replies than were shown under it; up to 6 levels.

Why does this Actor run with limited permissions?

Least privilege: it only needs its own storages and the named memory store it creates itself, so it asks for nothing else in your account.

More data tools by Automation Craft

Changelog

  • 0.1 (2026-10-08): first release. Replies of Threads posts walked page by page without a login, about 90 per call, the replies of replies to depth 6, oldest or newest first, date, likes, media, language and post author filters, a cross run memory, a coverage row per post, free rows for misses.