Threads Reply Tree Scraper - Nested Comments & Replies avatar

Threads Reply Tree Scraper - Nested Comments & Replies

Pricing

from $1.00 / 1,000 replies

Go to Apify Store
Threads Reply Tree Scraper - Nested Comments & Replies

Threads Reply Tree Scraper - Nested Comments & Replies

Scrape Threads posts with their full nested reply trees, the author's own follow-up posts, and recent posts from profiles. Plain HTTP, no login.

Pricing

from $1.00 / 1,000 replies

Rating

0.0

(0)

Developer

Hypebridge

Hypebridge

Maintained by Community

Actor stats

0

Bookmarked

6

Total users

3

Monthly active users

8 days ago

Last modified

Share

What does Threads Reply Tree Scraper do?

Threads Reply Tree Scraper extracts a Threads post and its complete conversation: every reply, every reply to a reply, down to ten levels, plus the follow-up posts the author added to their own thread. No official API key, no login, no browser. Each reply comes back as a flat record with its parent and depth, so the whole tree can be rebuilt exactly.

Give it a profile link instead and it lists the profile's recent posts and, if you want, fetches the reply tree under each one.

It only reads what a logged-out visitor can see. It does not log in, post, follow, or touch private accounts.

Why scrape Threads reply trees?

  • Sentiment and brand monitoring: pull every reaction to an announcement, launch, or controversy and analyse it with your own model.
  • Conversation datasets for AI: reply trees come as parent/child edges, ready for LLM context windows, graph tools, or fine-tuning sets.
  • Community and customer research: see what people actually say when a creator, brand, or founder posts, in their own words and languages.
  • Engagement analysis: find which replies carried the discussion and who started the sub-threads.
  • Archiving: keep a timestamped copy of a public discussion before it is edited or deleted.

What data can Threads Reply Tree Scraper extract?

FieldTypeDescription
dataTypeStringPOST for a post, REPLY for a reply, PROFILE for a profile
id / codeStringNumeric post id and the short code used in the URL
urlStringCanonical threads.com link to the post or reply
usernameStringHandle of the author
textStringPost text (empty for media-only posts)
createdAt / timestampString / IntegerPublish time as ISO-8601 UTC and as Unix seconds
likeCount, replyCount, repostCount, quoteCountIntegerEngagement counts
replyDepthInteger0 for the post, 1 for direct replies, 2 and deeper for nested replies
parentPostId / rootPostIdStringThe post this one answers, and the post at the top of the tree
replyToUsernameStringHandle being replied to
authorObjectAuthor id, username, full name, verified and private flags, profile picture
media / mediaCountArray / IntegerImages and videos with URL and size
quotedPostObjectThe post this one quotes, when there is one
mentionsArray@handles mentioned in the text
hasUnavailableRepliesBooleanOn the top post: Threads says some replies are hidden from logged-out visitors
language, replyControl, isEdited, likedByAuthor, isReply, topicTagMixedDetected language, who may reply, edit flag, author-liked flag, reply flag, and topic tag when present

Profile rows add fullName, biography, followerCount, isVerified, isPrivate, profilePicUrl and bioLinks. Every record also carries sourceInput (the link you supplied) and scrapedAt.

How to scrape a Threads reply tree

  1. Create a free Apify account if you don't have one.
  2. Open Threads Reply Tree Scraper and click Try for free.
  3. Paste Threads post links into Threads post or profile links.
  4. Set Max items per URL to cap how many records each link returns.
  5. Click Start and download results from the Dataset tab as JSON, CSV, Excel, or HTML.
  • Post links: https://www.threads.com/@username/post/CODE, the older threads.net domain, short links /t/CODE and /post/CODE, embed links ending in /embed, and links with tracking parameters such as ?xmt= or ?igshid=
  • Profile links: https://www.threads.com/@username

Search, hashtag, home feed and profile tab links (/replies, /media, /reposts) are not supported. If any of them is in the input, the run stops before fetching anything and tells you which links to remove. Logged-out Threads returns unrelated posts for search and hashtags, and only a handful of posts for the profile tabs, so supporting them would hand you data that does not match what you asked for.

Duplicate links to the same post or profile are fetched once.

A profile link returns the profile and its most recent posts. With Get post details on (the default), each post's reply tree is fetched too, so one profile link can give you the conversation under every recent post.

What you get is the recent slice that Threads shows a logged-out visitor, not a full history. Threads fails on certain posts regardless of who asks, so the listing stops at the first post it cannot read. In testing that was somewhere between about 40 and 250 or more posts depending on the profile. Use Max posts per profile to ask for fewer. The run summary records how many posts were listed and why the listing stopped.

How much will it cost?

Pay-per-event pricing: you are charged for each record delivered, and the rate depends on what the record is. There is no start fee and no charge for compute.

RecordWhat it isPrice per record
ReplyA direct reply to a post$0.0015
Nested replyA reply to a reply, any depth$0.0018
PostThe post behind a link you supplied, or a profile post fetched with its reply tree$0.0025
Author follow-up postA post the author added to their own thread$0.0025
ProfileA profile record$0.004
Listed postA profile post listed without its reply tree$0.002

Paid Apify plans get lower rates. Examples at the standard rate:

  • 1,000 direct replies to one post: about $1.50
  • A post with 200 direct replies and 100 nested replies: about $0.0025 + $0.30 + $0.18 = $0.48
  • A profile, its 20 recent posts, and 25 replies under each: about $0.004 + $0.05 + $0.75 = $0.80
  • A profile and its 20 recent posts only, no reply trees: about $0.004 + $0.04 = $0.044

Use Max items per URL, Max posts per profile and Max replies per profile post to cap spend.

Input

ParameterTypeDefaultDescription
startUrlsArrayrequiredThreads post or profile links (up to 100)
maxItemsInteger100Records per link, counting everything (1 to 5,000)
getPostDetailsBooleantrueFor profile links, fetch each post's reply tree
maxReplyDepthInteger50 post only, 1 direct replies, up to 10 levels of nesting
maxPostsPerProfileInteger20Recent posts to take from a profile
maxRepliesPerPostInteger25Replies to collect under each profile post
repliesSinceStringnoneOnly replies on or after this date, e.g. 2026-09-01 or 7 days
maxConcurrencyInteger5Links processed in parallel (1 to 10)
debugModeBooleanfalseKeep the raw body of failed requests (max 10 files)

Example: a post and its first 200 replies

{
"startUrls": [{ "url": "https://www.threads.com/@zuck/post/Dd1MqfcG0aH" }],
"maxItems": 200,
"maxReplyDepth": 1
}

Example: a deep conversation tree

{
"startUrls": [{ "url": "https://www.threads.com/@zuck/post/Dd1MqfcG0aH" }],
"maxItems": 2000,
"maxReplyDepth": 8
}

Example: the reply trees under a brand's recent posts

{
"startUrls": [{ "url": "https://www.threads.com/@natgeo" }],
"maxPostsPerProfile": 10,
"maxRepliesPerPost": 50,
"maxItems": 1000
}

Example: only the new replies since last week

{
"startUrls": [{ "url": "https://www.threads.com/@zuck/post/Dd1MqfcG0aH" }],
"repliesSince": "7 days",
"maxItems": 500
}

Output

Everything is saved to one dataset in the Dataset tab. Use dataType to filter PROFILE, POST and REPLY rows in your own tooling. The Output tab also links to two ready-made views: Reply tree (depth first, with who replied to whom, plus likes, replies, reposts and quotes, ready for CSV or Excel export) and Profiles.

A SUMMARY record in the key-value store lists, per link, the status, record counts, why a run stopped early (maxItems, maxReplyDepth, or a safety limit), the replies Threads reports against the replies returned, and a count of any failures met on the way by type, so a 2,400-reply post that returned 1,200 rows is never a mystery.

Sample output

{
"dataType": "REPLY",
"id": "3996164469004254295",
"url": "https://www.threads.com/@pie_3.1415926._/post/Dd1Oml3CTxX",
"username": "pie_3.1415926._",
"surface": "POST_DETAIL",
"sourceInput": "https://www.threads.com/@zuck/post/Dd1MqfcG0aH",
"scrapedAt": "2026-10-02T15:40:46.770Z",
"code": "Dd1Oml3CTxX",
"text": "他頭貼變黑白我還以為他掛了",
"createdAt": "2026-09-28T12:52:29.000Z",
"timestamp": 1790599949,
"likeCount": 56,
"replyCount": 1,
"repostCount": 2,
"quoteCount": 0,
"language": "zh_TW",
"isEdited": false,
"replyControl": "everyone",
"likedByAuthor": false,
"replyDepth": 1,
"parentPostId": "3996155940894885511",
"rootPostId": "3996155940894885511",
"replyToUsername": "zuck",
"author": { "id": "72703007294", "username": "pie_3.1415926._", "fullName": "圓周率", "isVerified": false, "isPrivate": false, "profilePicUrl": "https://..." },
"media": null,
"mediaCount": 0,
"mentions": [],
"topicTag": null,
"isReply": true,
"hasUnavailableReplies": null,
"quotedPost": null,
"enrichError": false
}

Tips

  • Replies are collected breadth first, so a low Max items per URL returns the top-level replies before any nested ones.
  • When the author continues their own thread with follow-up posts, those come first as REPLY rows at depth 1, followed by everyone else's replies.
  • A post's replyCount is usually higher than the number of rows you get back: Threads hides some replies from logged-out visitors. The top post carries hasUnavailableReplies when Threads says so.
  • With Replies since, older replies are not returned or charged, but their nested replies are still checked, so a new reply under an old one is found. Its parentPostId may then point at a reply that is not in the output.
  • To rebuild the conversation, join parentPostId to id. The Reply tree view is already shaped this way, with the depth first.
  • Start with a small maxItems to check the data, then raise it.

FAQ

Threads Reply Tree Scraper only extracts publicly available data. Always check the site's Terms of Service and make sure you have a legitimate purpose.

Do I need a Threads account or API key?

No. The Actor reads public posts the way a logged-out visitor does.

The post or profile was deleted, belongs to a private account, or is not visible to logged-out visitors. The run still succeeds, and the link is listed as unavailable in the SUMMARY record.

Why did my run stop immediately?

One of your links is a search, hashtag, home feed or profile tab link, which are not supported. The error message names each one. Remove them and run again.

Can it scrape search results or hashtags?

No. Logged-out Threads returns unrelated posts for search and hashtag pages, so the results would not match your query.

Support

  • Bugs and feature requests: Issues tab
  • Programmatic access: API tab

Disclaimer: Our Actors are ethical and do not extract any private user data, such as email addresses, gender, or location. They only extract what the user has chosen to share publicly. We therefore believe that our Actors, when used for ethical purposes by Apify users, are safe. However, you should be aware that your results could contain personal data. Personal data is protected by the GDPR in the European Union and by other regulations around the world. You should not scrape personal data unless you have a legitimate reason to do so. If you're unsure whether your reason is legitimate, consult your lawyers.