Threads Replies Scraper
Pricing
from $2.50 / 1,000 results
Threads Replies Scraper
Extract public Threads post replies and comments with author info, available engagement metrics, media details, quote/repost signals, and verification status. The original post row includes public view count when available. Batch multiple posts with no login required.
Pricing
from $2.50 / 1,000 results
Rating
1.8
(2)
Developer
Rush
Maintained by CommunityActor stats
24
Bookmarked
1.8K
Total users
341
Monthly active users
4.7 days
Issues response
11 hours ago
Last modified
Categories
Share
Extract public replies and comments from Threads posts. First-level replies are collected by default, with an option to include publicly visible nested sub-replies. Get author info, available engagement metrics, media details, quote/repost signals, and verification status.
Note: Website structure may occasionally change, which could temporarily affect data extraction. Please test with small batches before large-scale use.
What Data Can You Extract?
For each reply
| Field | Description |
|---|---|
Author Username (author_username) | The @username of who wrote the reply |
Author Account ID (author_user_id) | Public numeric account identifier, useful as a join key when available (null when the public view does not expose it) |
Author Display Name (author_display_name) | Public display name |
Author Profile Picture (author_profile_pic_url) | Standard-resolution profile image URL. A post page rarely offers a high-resolution variant, so author_profile_pic_hd_url is usually null on these rows |
Author Profile URL (author_profile_url) | Link to the author's Threads profile |
Verified Status (author_is_verified) | Whether the author has a verified badge |
Fediverse Enabled (author_fediverse_enabled) | Whether the author has turned on sharing to the fediverse. A post page often does not publish this, so it is usually null here — null means unknown, never "disabled" |
Reply Content (text_content) | Publicly available reply text (with emoji support). On a long-form post's own row it is the whole post: its opening lines, then its long-form text |
Mentions / Hashtags (mentions / hashtags) | Extracted from the reply text. Each account and each tag is listed once, in the order it first appears |
Links (urls) | The web addresses the reply carries: external or Threads links written out in full in the text (such as https://example.com/page), plus the address behind a shared link's preview card, each listed once |
Mentioned Accounts (mentioned_accounts) | Accounts Threads actually tagged in the text, each with username and numeric account identifier when available |
Link Title (link_title) | Title of a shared link's preview card (empty when the reply shares no link) |
Language (language) | The language Threads read the reply in, such as zh_TW or ja — useful for separating one market's conversation from another. Threads labels only some replies, so this is often empty |
Posted Time (created_at / created_at_timestamp) | ISO timestamp + Unix timestamp; empty string / null when the public view does not publish a time |
Likes / Replies / Reposts / Quotes / Shares (like_count / reply_count / repost_count / quote_count / share_count) | Engagement metrics when publicly available; null means the public view did not publish that metric, while 0 is a published zero |
Author Liked (is_liked_by_author) | Whether the original post author liked this reply |
Replying To (reply_to_username) | Username of who the reply is responding to |
Has Media / Media URL / Media URLs (has_media / media_url / media_urls) | Whether the reply has media and its main media URL. Media URLs lists every media URL in a carousel and is empty for a single image or video. The public page does not give a GIF's own address, so a GIF reply has Has Media and Is GIF set and a null Media URL. Use Has Media and Is GIF for simple filtering |
Is GIF (is_gif) | True when the reply contains an embedded GIF — handy for quick GIF filtering |
Is Spoiler (is_spoiler) | Whether the author hid the media behind a spoiler cover |
Media Kind (media_category) | Human-readable media type — text, photo, video, carousel, gif, or other — the simplest field for filtering by media |
Media Width / Height (media_width / media_height) | Original media dimensions in pixels |
Has Audio (has_audio) | Whether the reply carries audio. Null means Threads published no audio signal for it — not a claim that the reply is silent |
Image Alt Text (accessibility_caption) | Image description (alt text) when publicly available |
Is Quote Post / Quoted Post URL (is_quote_post / quoted_post_url) | Quote post detection and target URL |
Is Repost / Reposted Post URL (is_repost / reposted_post_url) | Repost detection and original post URL |
Is Paid Partnership (is_paid_partnership) | Whether the reply is labelled as sponsored |
Is Edited (is_edited) | Whether the text was edited after publishing |
Reply Control (reply_control) | Who can reply, exactly as Threads labels it (values seen include everyone, accounts_you_follow and mentioned_only) |
Reply URL (reply_url) | Direct link to the reply |
Source Post URL (source_post_url) | The original post this reply belongs to |
Scraped At (scraped_at) | ISO timestamp of when the row was collected |
For each original post
The scraper also captures the post the replies belong to as an original_post row — one per collected post, in addition to its replies. A post cut short by the maximum cost you set for the run keeps the replies that fit and has no original_post row. The original post shares the same general fields (author, engagement, media, quote/repost, sponsorship) and carries View Count (view_count) when the post page publishes one — this is not limited to video posts. It is null when the page publishes no count, and also when the page carries several counts with no way to tell which belongs to this post, in which case no number is guessed. Reply rows do not include view counts. Reply-specific fields (reply_id, reply_url, is_liked_by_author, reply_to_username) only appear on reply rows.
Each original_post row also carries Replies Collected (collected_reply_count) and Public Subset (is_public_subset) — true when the post reports more replies than are publicly shown, false when everything it reports is publicly shown, null when this run cannot tell (the post publishes no reply total, your reply limit ended collection early, part of the conversation could not be read or checked this run, or replies on the page that could not be matched to this post could account for the difference). It describes the public view, not how many rows your limit delivered, and separates a fully collected small thread from a sample of a much larger one. A null is not a failure: posts that failed, including ones whose page could not be fully read or whose data could not be saved, are listed under failed_details in the run summary. With nested sub-replies enabled this flag is approximate.
How to Use
Input
| Parameter | Required | Default | Description |
|---|---|---|---|
post_urls | Yes | - | Up to 20 Threads post URLs. |
max_replies | No | 50 | Cap on how many replies to collect per post (10-300). Each collected post also delivers one original_post row in addition to its replies; that row does not count toward this cap. Threads may expose fewer public replies than this cap. |
include_nested_replies | No | false | When true, also collects publicly visible nested sub-replies. They count toward the same max_replies limit, so at the same limit fewer first-level replies may be collected. Default keeps first-level only. |
Example Input
{"post_urls": [{ "url": "https://www.threads.com/@zuck/post/DTa3-B1EbTp" },{ "url": "https://www.threads.com/@zuck/post/DSVRshjkbtK" },{ "url": "https://www.threads.com/@mosseri/post/DZ5UXU0G-DX" }]}
Replace these examples with public Threads post URLs you want to analyze.
Output Example
All data is saved to the dataset. Each record has an item_type field ("original_post" or "reply") and a source_post_url field to identify which post it belongs to. Reply rows use reply_id as the primary reply identifier when Threads provides it, so a reply that appears under more than one of the posts you asked for is stored once, unless the run could not verify its saved result data (see the FAQ). The examples below use fictional placeholder values.
Original Post
{"item_type": "original_post","source_post_url": "https://www.threads.com/@example_creator/post/EXAMPLE01","post_code": "EXAMPLE01","post_url": "https://www.threads.com/@example_creator/post/EXAMPLE01","author_username": "example_creator","author_user_id": "1234567890","author_display_name": "Example Creator","author_is_verified": true,"author_profile_pic_url": "https://example.com/avatar.jpg","author_profile_pic_hd_url": null,"author_profile_url": "https://www.threads.com/@example_creator","author_fediverse_enabled": null,"text_content": "Sharing a product update and inviting public feedback...","mentions": [],"mentioned_accounts": [],"hashtags": [],"urls": [],"link_title": "","language": "","created_at": "2026-01-12T18:00:30.000Z","created_at_timestamp": 1768240830,"like_count": 285,"reply_count": 96,"collected_reply_count": 42,"is_public_subset": true,"repost_count": 14,"quote_count": 3,"share_count": 23,"view_count": 24817,"has_media": false,"media_category": "text","is_gif": false,"is_spoiler": false,"media_url": null,"media_urls": [],"media_width": null,"media_height": null,"has_audio": null,"accessibility_caption": null,"is_quote_post": false,"quoted_post_url": null,"is_repost": false,"reposted_post_url": null,"is_paid_partnership": false,"is_edited": false,"reply_control": "everyone","scraped_at": "2026-04-25T11:08:00Z"}
Reply
{"item_type": "reply","source_post_url": "https://www.threads.com/@example_creator/post/EXAMPLE01","reply_id": "REPLY01","author_username": "example_commenter","author_user_id": "9876543210","author_display_name": "Example Commenter","author_is_verified": true,"author_profile_pic_url": "https://example.com/avatar.jpg","author_profile_pic_hd_url": null,"author_profile_url": "https://www.threads.com/@example_commenter","author_fediverse_enabled": null,"text_content": "Thanks @example_creator — I would like to see more details about availability.","mentions": ["example_creator"],"mentioned_accounts": [{ "username": "example_creator", "user_id": "1234567890" }],"hashtags": [],"urls": [],"link_title": "","language": "","created_at": "2026-01-12T18:00:30.000Z","created_at_timestamp": 1768240830,"like_count": 96,"reply_count": 10,"repost_count": 4,"quote_count": 1,"share_count": null,"is_liked_by_author": false,"reply_to_username": "example_creator","media_category": "text","has_media": false,"is_gif": false,"is_spoiler": false,"media_url": null,"media_urls": [],"media_width": null,"media_height": null,"has_audio": null,"accessibility_caption": null,"is_quote_post": false,"quoted_post_url": null,"is_repost": false,"reposted_post_url": null,"is_paid_partnership": false,"is_edited": false,"reply_control": "everyone","reply_url": "https://www.threads.com/@example_commenter/post/REPLY01","scraped_at": "2026-04-25T11:08:02Z"}
Use Cases
- Sentiment Analysis: Analyze public reactions to announcements or product launches
- Conversation Tracking: Monitor discussions around specific topics or posts
- Influencer Research: Study engagement patterns on influencer content
- Market Research: Gather authentic user feedback and opinions
- Content Strategy: Identify what types of posts generate the most engagement
Supported URL Formats
https://www.threads.com/@username/post/CODEhttps://threads.com/@username/post/CODEhttps://www.threads.net/@username/post/CODEhttps://threads.net/@username/post/CODE
A share link — https://www.threads.com/share/CODE, what the share button on a phone
produces — or a short post link such as https://www.threads.com/t/CODE works too: it is
resolved to the post it points at.
A post link that ends in /media, such as https://www.threads.com/@username/post/CODE/media,
works too: the post itself is collected, and the link is kept as pasted in source_post_url and
in the original post's post_url; a share or short link is recorded under the post address it
resolved to. The same post pasted more than once, in any of these forms, is collected once.
Paste the link the way your browser copies it, starting with https://.
Tracking parameters on the end of a post link do not stop it from working, and they are kept as part of source_post_url.
Features
- Batch Scraping: Scrape replies from multiple posts in a single run
- Conversation Modes: First-level replies by default; enable
include_nested_repliesto include publicly available nested sub-replies within the same per-post limit - No Login Required: Works with public posts without authentication
- Structured Data: Clean, consistent output format ready for analysis
- Batch Reporting: Each source post is tracked in the run summary, including any post that could not be collected
- Export Options: Download as JSON, CSV, or Excel
Limitations
| Limitation | Details |
|---|---|
| Public View | Returns the batch of replies Threads shows in the public, logged-out view of a post, not necessarily every reply on a very large thread. The original post row's reply_count shows the platform's reported total for reference when Threads reports one. It is null when no total is published; 0 means Threads published a zero. |
| Reply Permalinks | A link to an individual reply is treated as its own conversation: the reply becomes the original_post row and only replies to it are collected. Threads may not show that reply's child conversation to logged-out visitors; in that case no reply rows are delivered for it, rather than unrelated replies from the surrounding thread: depending on how the page is served, the reply's own row is delivered with is_public_subset saying whether the public view reports more, or the run lists it as a post whose replies were missing (see below). |
| Natural Variation | The exact set can differ between runs, and active posts keep gaining replies over time — this reflects the live public page, not a failure. |
| Replies Missing From The Page | Threads may serve a post's page without its replies. The post itself is still read (no row is delivered for it), and the run says the replies were missing rather than asking you to retry or check the link. Each run reads the live page, so if Threads makes the replies available again, a later run collects them. |
| Post Type | Only public posts (private accounts are not accessible) |
Output Locations
After the run completes:
- Dataset: Contains all data in a single export
- Use
item_typeto filter: "original_post" or "reply" - Use
source_post_urlto group by parent post - Use the "Overview" tab to see key fields at a glance
- Use
- Key-Value Store:
OUTPUT: Run summary. Every requested post is accounted for as collected, failed, stopped at the maximum cost set for the run, or not collected (posts_not_collected) — the four always add up to the number of different posts the run could use (total_posts). Collected posts a stop cut short are listed incut_short_post_urls. The rest of the links you gave are counted underlinks_skipped(a link it could not use) andduplicate_post_urls_skipped(a second link to a post the run already had).PROGRESS: Live progress during the run (posts completed and replies collected)
FAQ
Q: Why do I get fewer replies than the post shows?
A: This actor works from the public, logged-out view of a post. It returns the replies publicly visible during the run, capped by your max_replies setting. When a post has more replies than your limit, you get them in the order the run reads them from its public page, up to the limit; the actor does not rank replies by likes or date. On a very long conversation a run can also stop before reaching the end of it.
Q: What happens if one post in my batch fails?
A: Each post link is handled on its own. When the run summary is written, every post that failed is listed under failed_details in OUTPUT; posts the run did not reach, or that a stop interrupted before any of their replies could be collected, are counted as not collected (posts_not_collected), and posts an unexpected problem kept the run from reaching are counted as failed instead. A link this run cannot use is skipped rather than ending the run: the usable links are still collected, and the skipped ones are named by position in the log and counted under links_skipped. The run stops before collecting only when none of its links can be used, and its message then says whether to try again or to copy the post's own link; a share link the site does not answer is reported as exactly that, so the advice is to run it again rather than to check the link. If the site keeps asking the run to slow down, the run stops after the post it is reading — that post is delivered with the replies read so far — and the posts after it are counted as not collected; they can be run again a few minutes later.
Q: When does a run end as failed? A: When there is no usable result, when collected data could not be saved safely, or when an unexpected problem stopped the run before it finished its batch. A run you stop yourself is a different case, described below. These all finish successfully: some posts read and others unavailable or unreadable (the missed ones are named in the run summary, and any rows they delivered stay); every requested post turning out to be deleted or private (that answer is the result); a post whose replies on the page could not be matched to it, which is still delivered as its original post row; and stopping early because the site asked the run to slow down, once anything has been collected. A run that reaches the maximum cost set in the run options does not fail either: it ends itself there, and should the platform stop it first, it shows as Aborted. A run does end as failed when every requested post was read but none came with any reply data at all — the message says so without asking you to retry. Whatever the ending, rows already saved stay in the dataset.
If the status says saved result data could not be verified, some rows may already be in the dataset. Review them before starting another run so you do not collect the same result twice. A reply that the unverified post shares with another post you asked for may be missing from the other post's rows, or saved under both.
Q: What happens if I stop a run?
A: Abort it gracefully — through the API, add gracefully=true; Apify's default abort is not graceful and ends the run at once, without finishing the post in progress or writing a summary, as does the timeout set in the run options (the run then shows as Timed out). After a graceful stop the run starts no further post. The platform then gives it 30 seconds: the post in progress is delivered if it finishes in time to be saved, and is otherwise counted as not collected. If the stop cuts that post short, the replies already read are delivered and the post counts as collected — unless the maximum cost set for the run also cut it, in which case it counts as stopped at the maximum cost, or part of its page could not be read, in which case it counts as failed. A post the stop interrupts before any of its replies could be collected is counted as not collected. The run shows as Aborted, and its status message and run summary say what was collected and how many posts were not; a run the platform ends before its summary is written says it was being stopped, and a run stopped while it was still reading your links writes no summary either. If the run could not verify data it saved, the status message says so and asks you to review the dataset. A resurrected run goes on with the posts that were not collected and does not read a cut-short post again. Rows already saved are kept whichever way the run is stopped.
Need Another Threads Workflow?
- Threads Scraper - Posts, Profiles & Search: collect public posts, search keywords, discover profiles, and export account data.
Built by futurizerush — explore more Threads & social-media scrapers.
Disclaimer
This tool is provided for educational and research purposes only. Users are solely responsible for ensuring their use complies with all applicable laws, regulations, and the Terms of Service of the platforms being accessed. The developers make no warranties regarding the accuracy, completeness, or reliability of the extracted data. Data availability depends on the platform's public access policies, which may change without notice. The developers are not liable for any damages arising from the use or misuse of this tool.
By using this tool, you acknowledge that:
- You will only scrape publicly available data
- You are responsible for how you use the collected data
- Data accuracy depends on what the platform provides
Support
Have a question or run into a problem? Use the Issues tab on this Actor's page and we'll be glad to help.
Threads scraper, Threads replies scraper, Threads comments scraper, Threads data extraction, social media scraper, conversation analysis, sentiment tracking, engagement metrics, influencer research, social media monitoring, Threads post comments, Apify actor, web scraping, data collection, social media analytics, OpenClaw, Claude Code, Gemini, Antigravity, Codex, ChatGPT