Threads Post Detail Scraper
Pricing
Pay per usage
Pricing
Pay per usage
Rating
0.0
(0)
Developer
Farhan Febrian Nauval
Maintained by CommunityActor stats
0
Bookmarked
2
Total users
1
Monthly active users
a day ago
Last modified
Categories
Share
Extract full detail for any public Threads post by URL or shortcode — caption text, author profile, image and video media, engagement counters (likes, replies, reposts, quotes), and reply controls — in a clean structured JSON output.
Why use this actor
- No account / no login required — just give it a Threads post URL or shortcode.
- No API key needed — Threads has no public API; this actor returns the same data the web app shows.
- Full post payload — caption with mentions and links, all image candidates and video versions, author profile (handle, display name, verified badge, profile photo), language detection, and the post's stable IDs.
- All engagement counters — likes, direct replies, reposts, quotes, and reshares in one shot.
- Flexible input — accepts both full URLs (
https://www.threads.com/@user/post/CODE) and bare shortcodes (CODE); takedown / deleted posts surface as a clean_errorrow instead of crashing the run. - Stable JSON output suitable for pipelines, spreadsheets, and databases — every row carries
_input,_postCode,_source, and_scrapedAtenvelope fields so you can join results back to your input list.
How it works
- You provide a list of Threads post URLs or shortcodes (e.g.
https://www.threads.com/@zuck/post/DYSAIo_FL77, or justDYSAIo_FL77). - The actor opens each post and reads the post record the same way the Threads web app does, then assembles a flat JSON object.
- 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
{"posts": ["https://www.threads.com/@zuck/post/DYSAIo_FL77","https://www.threads.com/@andiraa/post/DYQ2AUFj_CN"],"proxyConfiguration": {"useApifyProxy": true,"apifyProxyGroups": ["DATACENTER"]}}
| Field | Type | Description |
|---|---|---|
posts | array | List of Threads post URLs or shortcodes. Both https://www.threads.com/@zuck/post/DYSAIo_FL77 and DYSAIo_FL77 are accepted. |
proxyConfiguration | object | Apify Proxy settings. Datacenter proxy works for most cases. |
Output
Input: https://www.threads.com/@zuck/post/DYSAIo_FL77
{"_input": "https://www.threads.com/@zuck/post/DYSAIo_FL77","_postCode": "DYSAIo_FL77","_source": "S1-primary","_scrapedAt": "2026-05-18T11:00:34.398509+00:00","id": "3896177221392711419_63055343223","pk": "3896177221392711419","code": "DYSAIo_FL77","fbid": "17955322232962801","taken_at": 1778680540,"media_type": 1,"like_count": 2198,"like_and_view_counts_disabled": false,"detected_language": "en","original_height": 1400,"original_width": 1920,"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. This is the first major AI product where there is no log of your conversations stored on servers.","pk": "17955322235962801","has_translation": null},"user": {"pk": "63055343223","id": "63055343223","username": "zuck","full_name": "Mark Zuckerberg","is_verified": true,"profile_pic_url": "https://instagram.fcgk12-1.fna.fbcdn.net/v/t51.82787-19/550174606_17925811725103224_8363667901743352243_n.jpg","text_post_app_is_private": false,"has_onboarded_to_text_post_app": true},"text_post_app_info": {"direct_reply_count": 599,"repost_count": 190,"quote_count": 53,"reshare_count": 145,"reply_control": "everyone","is_reply": false,"can_reply": false,"text_fragments": {"fragments": [{ "fragment_type": "plaintext", "plaintext": "Today we're starting to roll out Incognito Chat with Meta AI on WhatsApp and the Meta AI app..." }]},"pinned_post_info": { "is_pinned_to_parent_post": false, "is_pinned_to_profile": false },"is_post_unavailable": false},"image_versions2": {"candidates": [{ "width": 1920, "height": 1400, "url": "https://instagram.fcgk12-2.fna.fbcdn.net/v/t51.82787-15/671768087_17966805447103224_3515623500855095561_n.webp?..." },{ "width": 1080, "height": 788, "url": "https://instagram.fcgk12-2.fna.fbcdn.net/v/t51.82787-15/671768087_17966805447103224_3515623500855095561_n.webp?stp=dst-webp_s1080x1080..." },"... 12 more"]},"carousel_media": null,"video_versions": null,"audio": null,"has_audio": null,"accessibility_caption": null,"is_paid_partnership": null,"canonical_url": null,"organic_tracking_token": "eyJ2ZXJzaW9uIjo1LCJwYXlsb2FkIjp7ImlzX2FuYWx5dGljc190cmFja2VkIjp0cnVlLC..."}
| Field | Type | Description |
|---|---|---|
_input | string | The URL or shortcode exactly as you supplied it. Use this to join results back to your input list. |
_postCode | string | The parsed Threads shortcode (e.g. DYSAIo_FL77). |
_source | string | Internal tag for the path used to fetch the record. S1-primary means the fastest, richest path; values starting with S2- indicate a fallback was used. |
_scrapedAt | string | ISO-8601 UTC timestamp when the record was scraped. |
id | string | Threads media ID in the form {pk}_{user_pk}. |
pk | string | Numeric primary key of the post. |
code | string | Threads shortcode (matches _postCode). |
fbid | string | Meta's internal Facebook-side ID for the post. |
taken_at | integer | Unix timestamp (seconds, UTC) of when the post was created. |
media_type | integer | 1 = image, 2 = video, 8 = carousel, 19 = text-only. |
like_count | integer | Number of likes on the post. |
like_and_view_counts_disabled | boolean | true if the author has hidden public counters. |
detected_language | string | Auto-detected language code of the caption (e.g. en, id). |
original_height / original_width | integer | Pixel dimensions of the primary media. |
caption | object | {text, pk, has_translation} — the post's caption with its own stable ID. |
user | object | Author profile snapshot: pk, username, full_name, is_verified, profile_pic_url, and Threads onboarding flags. |
text_post_app_info | object | Threads-specific metadata: reply / repost / quote / reshare counts, reply_control (everyone / mentioned_only / followed_only), is_reply, can_reply, pin status, post-availability flags, and text_fragments (caption broken into plaintext / mention / link / sticker segments). |
image_versions2.candidates | array | All image renditions returned for the post (width, height, url), from full-resolution down to thumbnails. null / empty for text-only posts. |
carousel_media | array | For carousel posts (media_type: 8), the per-slide media objects. null for single-media posts. |
video_versions | array | Video renditions (type, width, height, url) for video posts. null otherwise. |
audio | object | Audio track metadata for posts with sound. null if absent. |
accessibility_caption | string | Auto-generated alt text describing the media. |
is_paid_partnership | boolean | true if the post is tagged as a paid partnership. |
canonical_url | string | Canonical URL for the post if set by Threads. |
organic_tracking_token | string | Threads' opaque tracking token for the post. |
Error envelope
Posts that don't exist, were deleted, or fail to fetch return a structured error instead of crashing the run:
{"_input": "https://www.threads.com/@zuck/post/this-does-not-exist","_postCode": "this-does-not-exist","_source": "S2-fallback","_scrapedAt": "2026-05-18T11:00:35.012345+00:00","_error": "not_found","_errorDetail": "NotFound on post page"}
Filter on _error to triage failed rows. Common values: not_found (post was deleted or never existed), invalid_input (URL or shortcode could not be parsed), fetch_failed (transient network error after retries).
Pricing
This actor is billed per result: $6.00 per 1,000 posts. Each successful post = 1 result. Errors (not-found, deleted) are not billed.
Other Sosmed Actors
| Platform | Actor | Best for |
|---|---|---|
| Threads | Threads Account Scraper | Profile data for a Threads handle (followers, bio, verified) |
| Threads | Threads Account Threads Scraper | All posts authored by a user |
| Threads | Threads Account Replies Scraper | All replies authored by a user |
| Instagram Post Detail Scraper | Full detail for any IG post | |
| Twitter / X | X Post Detail Scraper | Full detail for any tweet |
| Bluesky | Bluesky Post Detail Scraper | Full detail for any Bluesky post |
| Reddit Post Detail Scraper | Full detail for any Reddit submission |
Browse the full catalog at apify.com/xtracto.
Notes
- Deleted, taken-down, or never-existed posts return
{"_error": "not_found", "_input": "..."}. Posts under takedown still surface their shortcode in_postCode. media_typetells you the post shape:1= single image,2= single video,8= carousel (seecarousel_media),19= text-only (noimage_versions2candidates).text_post_app_info.text_fragmentsis the structured breakdown of the caption — use it to recover@mentionsand inline links cleanly without re-parsing the plaintext.- This actor returns the post object only; it does not fetch the reply tree. To pull a user's full reply timeline, use the Threads Account Replies Scraper.
- Engagement counters (
like_count,direct_reply_count,repost_count,quote_count) are eventually-consistent and may lag the live network by a few minutes. - Media URLs (
image_versions2.candidates[].url,video_versions[].url) are time-limited signed URLs from Meta's CDN — fetch or rehost them promptly if you need long-term storage. - For large jobs (>500 posts), switch
proxyConfigurationtoRESIDENTIALto avoid per-IP rate limits.