Threads Post Detail Scraper avatar

Threads Post Detail Scraper

Pricing

Pay per usage

Go to Apify Store
Threads Post Detail Scraper

Threads Post Detail Scraper

Fetch a Threads post by URL or post code, including replies.

Pricing

Pay per usage

Rating

0.0

(0)

Developer

Farhan Febrian Nauval

Farhan Febrian Nauval

Maintained by Community

Actor 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 _error row instead of crashing the run.
  • Stable JSON output suitable for pipelines, spreadsheets, and databases — every row carries _input, _postCode, _source, and _scrapedAt envelope fields so you can join results back to your input list.

How it works

  1. You provide a list of Threads post URLs or shortcodes (e.g. https://www.threads.com/@zuck/post/DYSAIo_FL77, or just DYSAIo_FL77).
  2. The actor opens each post and reads the post record the same way the Threads web app does, then assembles a flat JSON object.
  3. 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"]
}
}
FieldTypeDescription
postsarrayList of Threads post URLs or shortcodes. Both https://www.threads.com/@zuck/post/DYSAIo_FL77 and DYSAIo_FL77 are accepted.
proxyConfigurationobjectApify 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..."
}
FieldTypeDescription
_inputstringThe URL or shortcode exactly as you supplied it. Use this to join results back to your input list.
_postCodestringThe parsed Threads shortcode (e.g. DYSAIo_FL77).
_sourcestringInternal 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.
_scrapedAtstringISO-8601 UTC timestamp when the record was scraped.
idstringThreads media ID in the form {pk}_{user_pk}.
pkstringNumeric primary key of the post.
codestringThreads shortcode (matches _postCode).
fbidstringMeta's internal Facebook-side ID for the post.
taken_atintegerUnix timestamp (seconds, UTC) of when the post was created.
media_typeinteger1 = image, 2 = video, 8 = carousel, 19 = text-only.
like_countintegerNumber of likes on the post.
like_and_view_counts_disabledbooleantrue if the author has hidden public counters.
detected_languagestringAuto-detected language code of the caption (e.g. en, id).
original_height / original_widthintegerPixel dimensions of the primary media.
captionobject{text, pk, has_translation} — the post's caption with its own stable ID.
userobjectAuthor profile snapshot: pk, username, full_name, is_verified, profile_pic_url, and Threads onboarding flags.
text_post_app_infoobjectThreads-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.candidatesarrayAll image renditions returned for the post (width, height, url), from full-resolution down to thumbnails. null / empty for text-only posts.
carousel_mediaarrayFor carousel posts (media_type: 8), the per-slide media objects. null for single-media posts.
video_versionsarrayVideo renditions (type, width, height, url) for video posts. null otherwise.
audioobjectAudio track metadata for posts with sound. null if absent.
accessibility_captionstringAuto-generated alt text describing the media.
is_paid_partnershipbooleantrue if the post is tagged as a paid partnership.
canonical_urlstringCanonical URL for the post if set by Threads.
organic_tracking_tokenstringThreads' 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

PlatformActorBest for
ThreadsThreads Account ScraperProfile data for a Threads handle (followers, bio, verified)
ThreadsThreads Account Threads ScraperAll posts authored by a user
ThreadsThreads Account Replies ScraperAll replies authored by a user
InstagramInstagram Post Detail ScraperFull detail for any IG post
Twitter / XX Post Detail ScraperFull detail for any tweet
BlueskyBluesky Post Detail ScraperFull detail for any Bluesky post
RedditReddit Post Detail ScraperFull 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_type tells you the post shape: 1 = single image, 2 = single video, 8 = carousel (see carousel_media), 19 = text-only (no image_versions2 candidates).
  • text_post_app_info.text_fragments is the structured breakdown of the caption — use it to recover @mentions and 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 proxyConfiguration to RESIDENTIAL to avoid per-IP rate limits.