🧵Threads Search Post Scraper avatar

🧵Threads Search Post Scraper

Pricing

from $2.99 / 1,000 results

Go to Apify Store
🧵Threads Search Post Scraper

🧵Threads Search Post Scraper

🧵Threads Search Post Scraper collects Threads posts and reply threads via search or URLs, including author, timestamp, likes, replies, reposts, quotes, media, hashtags & links. 🔎 Perfect for social listening, competitor analysis & research. ⚡ Fast, accurate, scalable.

Pricing

from $2.99 / 1,000 results

Rating

0.0

(0)

Developer

SimpleAPI

SimpleAPI

Maintained by Community

Actor stats

0

Bookmarked

3

Total users

0

Monthly active users

3 days ago

Last modified

Share

Threads Scraper — Search Posts, Engagement Stats and Author Data

Threads Search Post Scraper turns a Threads post URL, a numeric post ID, or a plain search phrase into structured JSON: author details, caption text, like/reply/repost/quote counts, mentions, hashtags, outbound links, and quote/repost resolution. A search phrase runs a real multi-result Threads search and returns every matching post it finds, not just the first one. Built for social listening teams, brand and competitor monitoring, and researchers who need Threads post data without a Meta developer account. Feed it a batch of usernames, keywords, or links and get one consistent row per post back.

🧵 What is Threads Search Post Scraper?

Threads Search Post Scraper is an Apify Actor that scrapes public Threads posts by direct link, numeric post ID, or free-text search phrase, and returns one normalized JSON object per post. It reads Threads' own public server-rendered pages and public search results — no Threads account, login, or API key is required to run it.

  • 🔎 Discovers posts three ways in the same run: a full post URL, a numeric post ID (10+ digits), or a search phrase that triggers a real paginated Threads search
  • 👤 Returns full author identity per post — username, full name, verification status, profile picture
  • 📈 Returns flattened engagement counts — likes, replies, reposts, quotes, and reshares — as top-level fields instead of a nested object
  • 🔗 Extracts mentions, hashtags, and outbound links straight out of each post's text, plus quote/repost detection with the linked post's URL
  • 🎚️ One real volume control — maxItems caps total rows saved per run and, for search phrases, how many matches are fetched
  • 📤 Exports to JSON, CSV, Excel, and every other format an Apify dataset supports

📊 What data can I extract with Threads Search Post Scraper?

Every row returned combines Threads' raw post payload with this Actor's own flattened and derived fields — engagement counts, entity extraction, and quote/repost resolution.

FieldExample valueUse case
post_urlhttps://www.threads.com/@zuck/post/AbCdEfGhIjKCanonical link back to the live post
pk3487215590231847Threads' internal numeric post ID
codeAbCdEfGhIjKThreads shortcode used in the post URL
id3487215590231847_314216Composite post+author ID from Threads' payload
user{ "username": "zuck", "full_name": "Mark Zuckerberg", "is_verified": true, ... }Author identity for outreach or attribution
caption{ "text": "Excited to share..." }Raw caption object as Threads returns it
captionTextExcited to share our latest update.Flattened plain-text caption for table views
like_count5211Ranking posts by popularity
direct_reply_count128Measuring conversation volume
repost_count340Measuring amplification
quote_count22Measuring commentary/reaction volume
reshare_count340Secondary amplification signal
mentions[{ "username": "meta" }]Finding who a post tags or references
hashtags["AI", "Threads"]Grouping posts by topic/campaign
urls["https://meta.com"]Extracting outbound links shared in a post
is_quote_post / quoted_post_urlfalse / nullTracing quote chains
is_repost / reposted_post_urlfalse / nullTracing repost chains
taken_at1753142400Post publish time (Unix timestamp)
media_type1Filtering text posts vs. photo/video/carousel posts
image_versions2 / video_versions / carousel_medianullRaw media payload when the post carries photo, video, or carousel content
is_paid_partnershipfalseFlagging sponsored content
scrapedAt2026-08-04T10:15:32.123ZDeduplicating rows across scheduled runs

Beyond this list, every row also carries Threads' own raw platform fields as-is — text_post_app_info, usertags, accessibility_caption, canonical_url, has_liked, caption_is_edited, caption_add_on, original_height, original_width, has_audio, audio, transcription_data, media_overlay_info, sharing_friction_info, gen_ai_detection_method, giphy_media_info, organic_tracking_token, logging_info_token, __token, like_and_view_counts_disabled, metaPlace, meta_place — because the parser is schema-tolerant and never strips a field it doesn't recognize.

Engagement and interaction data

like_count, direct_reply_count, repost_count, quote_count, and reshare_count are pulled out of Threads' nested text_post_app_info object and placed at the top level of every row, alongside is_quote_post/quoted_post_url and is_repost/reposted_post_url. A social listening team can sort a dataset of search results on like_count or repost_count to surface the posts driving the most reaction on a keyword or brand name, without touching a nested object.

Author and entity-extraction data

The user object carries the author's username, full_name, is_verified, and profile_pic_url for every post, letting you segment results by account. mentions, hashtags, and urls are parsed directly from each post's text (with a regex fallback on the caption when Threads sends no hashtag fragments), so campaign or topic tracking doesn't need a separate text-parsing step.

🆚 How does Threads Search Post Scraper differ from the official Threads API?

Meta's Threads API does have a public keyword_search endpoint, but bulk keyword search on it is gated: without app-review approval for the threads_keyword_search permission, a call only searches the authenticated user's own posts — public search only unlocks after Meta approves your app (checked on developers.facebook.com/docs/threads/keyword-search, 2026-08-04). Threads Search Post Scraper needs none of that: no Meta developer app, no OAuth token, no app review — a search phrase or post link in urls runs immediately.

FeatureThreads Keyword Search APIThreads Search Post Scraper
SetupMeta developer app + app review for threads_keyword_searchPaste input, run
Search scope before approvalAuthenticated user's own posts onlyAny public post or search phrase
Max results per query100 (default 25)Set by maxItems; search pagination stops after 30 pages
Rate limit2,200 queries per rolling 24-hour period per user tokenNo fixed daily query quota in the Actor's own code
Author/owner fieldExcluded from the responseFull user object returned on every row
Direct post/ID lookupSeparate endpoints, own-account scopedA post URL or numeric ID is just another urls line

Why does the Threads API restrict keyword search to your own posts by default?

Meta requires the threads_keyword_search permission — granted only after app review — before a keyword_search call can see anything beyond the authenticated user's own posts. In practice, this means bulk cross-account keyword monitoring on the official API is blocked until an app clears Meta's review process, and even after approval it's capped at 100 results per call and 2,200 calls per rolling 24 hours per user token. Threads Search Post Scraper reads the same public pages a logged-out browser sees, so a search phrase, post URL, or post ID in urls returns results the moment the run starts — no review, no token, no per-account cap.

Use the official API when you're building inside your own approved Threads app and only need your own account's data. Use this Actor when you need public posts on demand without going through Meta's review pipeline.

💡 How to use data extracted from Threads?

📢 Social media and brand marketers

Run a brand name, product name, or campaign hashtag as a search phrase and pull back every matching post with like_count, direct_reply_count, and repost_count attached. Sort by engagement to find the posts worth a reply or a repost, and use the user object to see which accounts are driving the conversation.

🕵️ Social listening and PR agencies

Agencies running the same set of client and competitor keywords on a schedule can point each keyword at a search-phrase target, capped with maxItems, and diff the mentions/hashtags arrays run over run to flag new accounts or new topics entering the conversation — a repeatable audit rather than a one-off pull.

📊 Market research and intelligence

Feed a list of industry or topic keywords through urls in one run and use the flattened like_count/repost_count/quote_count fields to build an engagement distribution per keyword — which topics are generating the most reaction on Threads right now, without writing a JSON-flattening step first.

🤖 AI agents and automated pipelines

Because every row is flat, typed JSON with captionText, hashtags, and engagement counts already extracted, the dataset drops straight into a RAG index or an agent tool call for "what is Threads saying about X" without a normalization layer in between.

🔼 Input sample

Threads Search Post Scraper takes one required parameter and two optional ones, read directly from the Actor's input schema.

ParameterRequiredTypeDescriptionExample value
urlsYesarray (string list)Each line: a full post URL (threads.com or threads.net), a numeric post ID (10+ digits), or a search phrase. A search phrase runs a real multi-result Threads search and returns every matching post (up to maxItems), not just one.["Mark Zuckerberg", "https://www.threads.com/@zuck/post/AbCdEfGhIjK"]
maxItemsNointeger (min 0)Cap on how many rows to save across the whole run. For search phrases this also caps how many matching posts are fetched. Leave empty (or 0) for no limit (search defaults to up to 30 posts per phrase when left empty).25
proxyConfigurationNoobject (proxy editor)Turn on Apify Proxy so requests are routed through Apify's network. Threads serves an empty page to direct/un-proxied traffic from most cloud environments, so a proxy is recommended for reliable results.{ "useApifyProxy": true, "apifyProxyGroups": ["RESIDENTIAL"] }
{
"urls": [
"https://www.threads.com/@zuck/post/AbCdEfGhIjK",
"3487215590",
"Mark Zuckerberg"
],
"maxItems": 25,
"proxyConfiguration": {
"useApifyProxy": true,
"apifyProxyGroups": ["RESIDENTIAL"]
}
}

⚠️ Common pitfall: a URL must have a threads.com or threads.net host or the run fails outright for that target; a numeric string under 10 digits is not treated as a post ID at all — it silently falls through and gets searched as a text phrase instead of erroring.

🔽 Output sample

Output is typed, normalized JSON — one row per post, pushed to the Actor's default dataset and downloadable as JSON, CSV, Excel, HTML table, or the other formats every Apify dataset supports. Every row is charged under the row_result event; the Actor doesn't push separate uncharged error or accounting rows, so every row in your dataset is a real scraped post.

{
"post_url": "https://www.threads.com/@zuck/post/AbCdEfGhIjK",
"pk": "3487215590231847",
"user": {
"friendship_status": {
"muting": false,
"following": false,
"followed_by": false,
"outgoing_request": null,
"blocking": null
},
"id": "314216",
"pk": "314216",
"text_app_last_visited_time": 0,
"profile_pic_url": "https://scontent.cdninstagram.com/v/t51.2885-19/314216_profile.jpg",
"username": "zuck",
"full_name": "Mark Zuckerberg",
"transparency_label": null,
"transparency_product": null,
"transparency_product_enabled": false,
"is_verified": true,
"text_post_app_is_private": false,
"has_onboarded_to_text_post_app": true
},
"text_post_app_info": {
"is_post_unavailable": false,
"pinned_post_info": null,
"id": "3487215590231847_314216",
"share_info": {
"reposted_post": null,
"is_reposted_by_viewer": false,
"can_quote_post": true,
"quoted_attachment_author_attribution_allowed": true,
"quoted_attachment_post_unavailable": false,
"quoted_attachment_post": null,
"quoted_post": null
},
"direct_reply_count": 128,
"repost_count": 340,
"quote_count": 22,
"reshare_count": 340,
"text_fragments": {
"fragments": [
{ "fragment_type": "plain", "plaintext": "Excited to share our latest update. #AI #Threads cc @meta https://meta.com" }
]
},
"fediverse_info": { "is_federated": false, "enqueued_for_federation": null, "federated_like_count": null }
},
"id": "3487215590231847_314216",
"logging_info_token": null,
"is_paid_partnership": false,
"audio": null,
"caption": { "text": "Excited to share our latest update. #AI #Threads cc @meta https://meta.com" },
"caption_is_edited": false,
"transcription_data": null,
"carousel_media": null,
"code": "AbCdEfGhIjK",
"image_versions2": null,
"original_height": null,
"original_width": null,
"accessibility_caption": null,
"usertags": null,
"video_versions": null,
"has_audio": false,
"media_type": 1,
"caption_add_on": null,
"has_liked": false,
"like_count": 5211,
"taken_at": 1753142400,
"media_overlay_info": null,
"sharing_friction_info": { "should_have_sharing_friction": false, "sharing_friction_payload": null },
"canonical_url": "https://www.threads.com/@zuck/post/AbCdEfGhIjK",
"giphy_media_info": null,
"metaPlace": null,
"meta_place": null,
"gen_ai_detection_method": { "detection_method": "NONE" },
"organic_tracking_token": null,
"__token": null,
"like_and_view_counts_disabled": false,
"direct_reply_count": 128,
"repost_count": 340,
"quote_count": 22,
"reshare_count": 340,
"mentions": [{ "username": "meta" }],
"hashtags": ["AI", "Threads"],
"urls": ["https://meta.com"],
"is_quote_post": false,
"quoted_post_url": null,
"is_repost": false,
"reposted_post_url": null,
"scrapedAt": "2026-08-04T10:15:32.123Z",
"captionText": "Excited to share our latest update. #AI #Threads cc @meta https://meta.com"
}

🎯 How do you filter and target specific Threads posts?

This Actor has one input list, urls, but each line is classified independently, which is the real precision control. A direct post URL or numeric post ID fetches exactly that post (and any replies rendered in the same server-rendered thread view) — use this when you already know the post. A search phrase runs a real, paginated Threads search and returns every matching post it finds, up to your cap — use this when you're monitoring a keyword, hashtag, or account name rather than one link.

Volume is controlled entirely by maxItems: it caps total rows saved for the whole run, and for search-phrase targets it also caps how many matches are fetched (up to 30 per phrase by default when left empty). Search itself stops after 30 pages of results or two consecutive pages with no new posts, whichever comes first — a hard internal ceiling worth knowing before you set an unrealistically high maxItems on a narrow phrase. Mix target types freely in the same urls list: a few known post links alongside a broader keyword search in one run.

Three real targeting setups:

{ "urls": ["https://www.threads.com/@zuck/post/AbCdEfGhIjK"] }
{ "urls": ["3487215590"], "maxItems": 0 }
{
"urls": ["Mark Zuckerberg", "Meta AI announcement", "https://www.threads.com/@zuck/post/AbCdEfGhIjK"],
"maxItems": 50,
"proxyConfiguration": { "useApifyProxy": true, "apifyProxyGroups": ["RESIDENTIAL"] }
}

▶️ Want to try other Threads scrapers?

ScraperWhat it extracts
LinkedIn Profile Posts Scraper By Media & HashtagLinkedIn profile posts filtered by media type and hashtag
Facebook Group Posts And Details & Contact Leads ScraperFacebook group posts plus contact-lead details
TikTok Data Scraper — Video, Hashtag & Sound PerformanceTikTok videos, hashtags, sounds, and profiles
Pinterest Profile Scraper With Email & Website ContactsPinterest profiles with bio-published contact details
Reddit Subreddit Members Scraper By Time WindowSubreddit posters and commenters within a time window

⚡ How to extract Threads data programmatically

Threads Search Post Scraper runs like any other Apify Actor: one API call starts the run, and structured JSON comes back from its dataset — no separate Threads credentials to manage.

Python example

from apify_client import ApifyClient
client = ApifyClient("<APIFY_API_TOKEN>")
run = client.actor("YOUR_USERNAME/threads-search-post-scraper").call(run_input={
"urls": ["Mark Zuckerberg", "https://www.threads.com/@zuck/post/AbCdEfGhIjK"],
"maxItems": 25,
})
for item in client.dataset(run["defaultDatasetId"]).iterate_items():
print(item["user"]["username"], item["like_count"], item["captionText"])

Export to spreadsheets or CRM

Every dataset can be downloaded straight from the Apify Console as CSV or Excel. Map user.username to an Author column, captionText to Post text, like_count/direct_reply_count/repost_count to engagement columns, and post_url to a clickable link column in your CRM or spreadsheet import.

Scraping public Threads posts and profile data is generally legal — these are pages Threads publishes for anyone to view without logging in. This Actor's output includes personal data: usernames, full names, profile pictures, and post text tied to identifiable individuals. That puts GDPR and CCPA in scope for anyone storing or reusing it — you need a lawful basis for collecting and retaining this data, and you're responsible for how it's used downstream, not just for the scrape itself. Consult legal counsel for commercial applications involving bulk storage of personal data.

❓ FAQ

What happens if a post is deleted or made private after I scrape it?

The Actor returns data exactly as the public page or search result showed it at request time — it doesn't track deletion or privacy changes across runs. If a direct post URL or ID target is deleted, private, or unavailable when the run executes, that target returns zero posts (logged as a warning) rather than a stale cached row.

Can I get engagement stats along with the post text?

Yes — like_count, direct_reply_count, repost_count, quote_count, and reshare_count are flattened onto every row automatically, alongside captionText, with no extra input needed.

How accurate is the engagement data?

The Actor returns like, reply, repost, and quote counts exactly as Threads' public page or search response reports them at request time. Counts can keep climbing after you scrape, so treat them as a snapshot and re-run on a schedule if you need current numbers.

How many posts can I get per run?

Set by maxItems. Leave it empty or 0 for no cap on direct post/ID targets (the Actor returns every post in that thread view). For search phrases, maxItems caps total matches fetched, defaulting to up to 30 per phrase when left empty — search pagination internally stops after 30 pages or two consecutive empty pages regardless of the cap you set.

Put the keyword, hashtag, or name as its own line in urls — anything that isn't a threads.com/threads.net URL or a 10+ digit numeric ID is treated as a search phrase and run through Threads' own search.

Does Threads Search Post Scraper work with Claude, ChatGPT, and AI agent frameworks?

There's no dedicated MCP server for this Actor. It's callable as a standard Apify Actor run through the Apify API, so any agent framework that can make an HTTP call and read apify-client output can use it as a tool.

Can I use Threads Search Post Scraper without a Threads API key or developer account?

Yes. You only need an Apify account to run it. There's no Meta developer app, OAuth token, or app-review approval required — the Actor reads Threads' own public pages and search results directly.

Conclusion

Threads Search Post Scraper turns post links, post IDs, and search phrases into flat, typed JSON — author identity, engagement counts, mentions, hashtags, links, and quote/repost resolution on every row, with no Meta app review or developer account required. It's built for social listening teams, agencies tracking multiple keywords, researchers, and AI pipelines that need Threads post data on demand. Add your targets in the Apify Console or via the API and run it to get your first dataset.