Threads Account Threads Scraper
Pricing
from $0.99 / 1,000 results
Pricing
from $0.99 / 1,000 results
Rating
0.0
(0)
Developer
Farhan Febrian Nauval
Maintained by CommunityActor stats
0
Bookmarked
2
Total users
1
Monthly active users
17 hours ago
Last modified
Categories
Share
Threads Account Posts Scraper
Extract every public post from any Threads account in bulk — full caption text, images, video, like counts, repost / quote info, timestamps, and the author profile — as clean structured JSON.
Why use this actor
- No account / no login required — just give it a Threads username or profile URL.
- No API key needed — Threads has no public API; this actor returns the same posts the web app shows on a user's profile.
- Full post content — caption text, image / video URLs, link-preview cards, carousel media, like count, repost count, reply count, and parent-thread context for multi-post threads.
- Bulk input — pass a list of usernames or URLs in one run; one dataset row per published thread.
- Posts only (not replies) — the actor mirrors the "Threads" tab of a profile, so you get the user's own posts plus their reposts of others. Replies live in a separate sister actor (see below).
- Stable JSON output suitable for pipelines, spreadsheets, and databases — every row carries
_input,_source,_scrapedAtenvelope fields so you can join results back to your input list.
How it works
- You provide a list of Threads usernames (e.g.
zuck) or full profile URLs. - The actor resolves each handle to its internal user ID, then walks the user's posts feed page by page using a paging cursor.
- For each thread it returns the root post plus any follow-up posts in the same thread chain, along with the author profile and engagement counters.
- Results stream into your dataset, ready to download as JSON, CSV, or Excel.
You do not need to manage scrapers, browsers, or rotating IPs — all handled internally.
Input
{"usernames": ["zuck","https://www.threads.com/@mosseri"],"maxPosts": 30,"proxyConfiguration": {"useApifyProxy": true,"apifyProxyGroups": ["DATACENTER"]}}
| Field | Type | Description |
|---|---|---|
usernames | array | List of Threads usernames or profile URLs. Both zuck and https://www.threads.com/@zuck are accepted. |
maxPosts | integer | Maximum number of threads returned per user. Use 0 to fetch everything. Default: 30. |
proxyConfiguration | object | Apify Proxy settings. Datacenter proxy works for most cases. |
Output
Input: zuck, maxPosts: 3
Each row in the dataset is one thread — a list of posts (thread_items) chained by the same author, top-level post first.
{"_input": "zuck","_source": "S1-primary","_scrapedAt": "2026-05-18T10:59:13.348602+00:00","id": "3896177221392711419","thread_items": [{"post": {"pk": "3896177221392711419","id": "3896177221392711419_63055343223","code": "DYSAIo_FL77","taken_at": 1778680540,"like_count": 2198,"caption": {"text": "Today we're starting to roll out Incognito Chat with Meta AI on WhatsApp and the Meta AI app -- a completely private way to interact with AI, similar to how end-to-end encryption means no one can read your conversations, even Meta or WhatsApp..."},"user": {"pk": "63055343223","id": "63055343223","username": "zuck","is_verified": true,"profile_pic_url": "https://instagram.fcgk12-1.fna.fbcdn.net/v/t51.82787-19/550174606_..."},"image_versions2": {"candidates": [{ "width": 1920, "height": 1400, "url": "https://instagram.fcgk12-2.fna.fbcdn.net/v/t51.82787-15/671768087_..." }]},"original_width": 1920,"original_height": 1400,"video_versions": null,"carousel_media": null,"carousel_media_count": null,"has_audio": null,"text_post_app_info": {"link_preview_attachment": null,"reply_to_author": null,"is_post_unavailable": false,"share_info": { "quoted_post": null, "reposted_post": null }}},"line_type": "none","should_show_replies_cta": true,"reply_facepile_users": [],"view_replies_cta_string": "Show replies"},{"post": {"pk": "3896177217181602913","id": "3896177217181602913_63055343223","code": "DYSAIlEFFRh","taken_at": 1778680539,"like_count": 570,"caption": {"text": "Incognito Chat handles all AI inference in a Trusted Execution Environment that ensures your messages are not accessible to us. The conversations on your phone also disappear when you exit the session..."},"user": {"pk": "63055343223","username": "zuck","is_verified": true},"text_post_app_info": {"reply_to_author": { "username": "zuck", "id": "63055343223" },"share_info": { "quoted_post": null, "reposted_post": null }}},"line_type": "none","should_show_replies_cta": true}// ... 1 more follow-up post in this thread]}
A second thread with a link-preview attachment:
{"_input": "zuck","_source": "S1-primary","_scrapedAt": "2026-05-18T10:59:13.348602+00:00","id": "3886015488044874110","thread_items": [{"post": {"pk": "3886015488044874110","code": "DXt5n9UlLl-","taken_at": 1777469167,"like_count": 1498,"caption": {"text": "As part of our philanthropic work to help cure all diseases, our team @biohub is announcing the Virtual Biology Initiative -- a new effort to build the imaging tools, molecular tools, and open data infrastructure needed to build AI models that can reason about cells."}}},{"post": {"pk": "3886015488875339430","code": "DXt5n-GFJ6m","taken_at": 1777469167,"like_count": 727,"caption": { "text": "This has the potential to unlock developing models that understand biology..." },"text_post_app_info": {"link_preview_attachment": {"display_url": "biohub.org","title": "Biohub launches the Virtual Biology Initiative","url": "https://l.threads.com/?u=https%3A%2F%2Fbiohub.org%2Fnews%2Fvirtual-biology-initiative","image_url": "https://external.fcgk12-2.fna.fbcdn.net/emg1/v/t13/17965211273658538491?...","favicon_url": "https://external.fcgk12-2.fna.fbcdn.net/emg1/v/t13/16140870347078187614?..."}}}}]}
Field reference
| Field | Type | Description |
|---|---|---|
_input | string | The username or URL exactly as you supplied it. Use this to join results back to your input list. |
_source | string | Internal tag for the path used to fetch the record. S1-primary is the fastest, richest path; S2-fallback indicates a fallback was used. |
_scrapedAt | string | ISO-8601 UTC timestamp when the thread was scraped. |
id | string | Thread ID — equal to the root post's pk. Use this to deduplicate across runs. |
thread_items | array | One entry per post in the thread chain. thread_items[0] is always the root post; following entries are the author's own follow-up posts. |
thread_items[].post.pk | string | Numeric post ID. |
thread_items[].post.id | string | Full post identifier in the form <post_pk>_<user_pk>. |
thread_items[].post.code | string | Short slug used in the public post URL: https://www.threads.com/@<username>/post/<code>. |
thread_items[].post.taken_at | integer | Unix timestamp (seconds) of when the post was published. |
thread_items[].post.like_count | integer | Number of likes. |
thread_items[].post.caption.text | string | Full post caption / text body. null when the post is image-only. |
thread_items[].post.user | object | Author profile snapshot (pk, username, is_verified, profile_pic_url). |
thread_items[].post.image_versions2.candidates | array | All image sizes available for the post (width, height, URL). Empty when the post has no image. |
thread_items[].post.video_versions | array | Video renditions when the post is a video, otherwise null. |
thread_items[].post.carousel_media | array | Slides when the post is a multi-image carousel, otherwise null. |
thread_items[].post.carousel_media_count | integer | Number of slides in the carousel, otherwise null. |
thread_items[].post.original_width / original_height | integer | Dimensions of the primary media in pixels. |
thread_items[].post.has_audio | boolean | true if the video has audio, null for non-video posts. |
thread_items[].post.text_post_app_info.link_preview_attachment | object | Embedded link card with url, display_url, title, image_url, favicon_url. null when no link is attached. |
thread_items[].post.text_post_app_info.reply_to_author | object | The user this post replies to. For the root post in a chain this is null; for follow-ups it points back to the same author. |
thread_items[].post.text_post_app_info.share_info.quoted_post | object | The post being quoted, if this is a quote-thread. |
thread_items[].post.text_post_app_info.share_info.reposted_post | object | The post being reposted, if this row is a repost from another user. |
thread_items[].post.text_post_app_info.is_post_unavailable | boolean | true if the post has been removed or hidden. |
thread_items[].line_type | string | Visual connector flag used by the web app ("none", "line"). Usually safe to ignore. |
thread_items[].should_show_replies_cta | boolean | true if the post has replies a viewer can expand. |
thread_items[].reply_facepile_users | array | Up to 3 small avatars of users who replied (used for the "Replied by" stack in the UI). |
Error envelope
Usernames that can't be resolved or fail to fetch return a structured error instead of crashing the run:
{"_input": "this-handle-does-not-exist-xyz","_error": "user_resolve_failed","_source": "S1-primary","_scrapedAt": "2026-05-18T10:24:10.012345+00:00"}
Possible _error values: user_resolve_failed (handle not found / private / banned), fetch_failed (transient network or rate-limit error — accompanied by _errorDetail). Filter on _error to triage failed rows.
Pricing
This actor is billed per result: $6.00 per 1,000 threads (Tier 4). Each successful thread = 1 result. Errors are not billed.
Other Sosmed Actors
| Platform | Actor | Best for |
|---|---|---|
| Threads | Threads Account Replies Scraper | Replies the user posted on other people's threads |
| Threads | Threads Post Detail Scraper | Full reply tree + engagement for a single thread URL |
| Instagram Account Posts Scraper | Same author's Instagram feed | |
| Twitter / X | X Account Tweets Scraper | Tweets timeline for any handle |
| Bluesky | Bluesky Account Posts Scraper | Posts feed for any Bluesky handle |
| Mastodon | Mastodon Account Scraper | Posts feed for any fediverse handle |
Browse the full catalog at apify.com/xtracto.
Notes
- Posts only, not replies. The output mirrors the "Threads" tab of a profile. Replies the user wrote on other people's posts are not included — use the Threads Account Replies Scraper for those.
- Reposted threads are flagged. When the user reposted someone else's thread,
text_post_app_info.share_info.reposted_postis populated with the original post. Filter it out if you only want original content. - Quote-threads are flagged via
text_post_app_info.share_info.quoted_postand still count as the user's own posts. - Pagination is cursor-based — the actor walks the feed until it hits
maxPostsor runs out of threads. Older posts cost the same as newer ones; setmaxPosts: 0if you want the full archive. - Private / banned / never-existed accounts return
{"_error": "user_resolve_failed", "_input": "..."}and consume no result credit. - Counters (
like_count) are eventually-consistent and may lag the live network by a few minutes. - The internal
user.pkis the most reliable identifier — usernames can change butpkdoes not.