Threads Search Post Scraper With Media & Format Details
Pricing
from $5.99 / 1,000 results
Threads Search Post Scraper With Media & Format Details
Threads Search Post Scraper extracts Threads posts with media and format details, including captions, usernames, images, videos, links, hashtags, replies, likes, timestamps, and post types. Ideal for content research, trend analysis, competitor monitoring, and audience insights.
Pricing
from $5.99 / 1,000 results
Rating
0.0
(0)
Developer
Scrapier
Maintained by CommunityActor stats
0
Bookmarked
2
Total users
1
Monthly active users
2 days ago
Last modified
Categories
Share
Threads Search Scraper — Posts With Full Media & Trust Signals
Threads Search Scraper turns a Threads post URL, a numeric post ID, or a plain-text search phrase into structured post data — captions, engagement counts, full media galleries, and trust signals — pulled straight from threads.com and threads.net. A search phrase returns every matching post from that search, not just the top result. Every response is structured JSON, ready to pass directly to an LLM, index into a vector store, or feed a monitoring pipeline. No Threads account or login is ever required to run it.
🧵 What is Threads Search Scraper?
Threads Search Scraper is a Threads post scraper that accepts three kinds of targets — a full post URL, a numeric post ID, or a free-text search phrase — and returns one normalized post record per result, in JSON. What sets it apart from a plain Threads post scraper is depth on two axes competing tools usually skip: every available media resolution and full carousel/video sets per post, and a set of format and trust-signal flags (sponsorship, edit status, verification, view count) that most Threads exporters don't surface at all. No Threads account, cookie, or login is required — every fetch is anonymous, against Threads' public server-rendered pages and search surface.
Key capabilities:
- Accepts post URLs, numeric post IDs (10+ digits), and search phrases in the same run, mixed freely, one target per line.
- For search phrases, walks Threads' own search-results GraphQL query to return every matching post from that page, not just the first one.
- Returns full engagement counts, quote/repost resolution, and flat
mentions/hashtags/urlsarrays parsed from each post's content. - Optionally returns every
image_versions2size variant, full carousel item media, GIF detection, and a human-readable media-type label. - Optionally returns sponsorship, edit, audio, verification, privacy, and view-count trust signals per post.
- Caps total rows saved per run with
maxItems, and can route requests through Apify Proxy.
What data can you get with Threads Search Scraper?
Every run returns post-level content plus, on request, full media galleries and authenticity signals — this table maps each result type to the fields it carries and what it's for.
| Result Type | Extracted Fields | Primary Use Case |
|---|---|---|
| Post content & engagement | post_url, pk, code, caption, like_count, directReplyCount, repostCount, quoteCount, reshareCount, taken_at, scrapedAt | Content and engagement tracking |
| Entities & references | mentions, hashtags, urls, isQuotePost, quotedPostUrl, isRepost, repostedPostUrl | Mention/hashtag tracking, thread-relationship mapping |
| Full media gallery | mediaType, isGif, allImageVariants, allVideoVariants, carouselMedia | Media archiving, re-hosting, image/video pipelines |
| Format & trust signals | isSponsored, captionIsEdited, hasAudio, audio, isVerified, isPrivate, viewCount | Sponsorship compliance, authenticity checks, reach analysis |
| Author & raw platform metadata | user, id, text_post_app_info, image_versions2, video_versions, carousel_media, and other raw Threads/Instagram schema fields preserved unfiltered | Advanced/custom parsing beyond the curated fields above |
Full media galleries, not one thumbnail per post
Turn fetchFullMediaGallery on (it's on by default) and every post carries the complete media set instead of one representative image. allImageVariants lists every size candidate from image_versions2 — not just the largest — so you can pick the resolution your pipeline needs without re-fetching. Every carouselMedia item gets its own full images/videos arrays, id, and mediaType, because a carousel post's second or third slide is not the same media object as the first. isGif is derived from Threads' giphy_media_info payload, and mediaType is a human-readable label (image / video / carousel / gif / text-only) instead of Threads' raw numeric media_type code. Example shape for one post:
{"mediaType": "carousel","isGif": false,"allImageVariants": [{ "url": "https://scontent.threads.net/.../1080x1080.jpg", "width": 1080, "height": 1080 },{ "url": "https://scontent.threads.net/.../640x640.jpg", "width": 640, "height": 640 }],"allVideoVariants": [],"carouselMedia": [{ "id": "3123456789012345", "mediaType": "image", "images": [ { "url": "https://scontent.threads.net/.../slide1.jpg", "width": 1080, "height": 1350 } ], "videos": [] },{ "id": "3123456789012346", "mediaType": "video", "images": [], "videos": [ "https://scontent.threads.net/.../slide2.mp4" ] }]}
Format & trust signals
With includeFormatTrustSignals on (also on by default), each post carries isSponsored (paid-partnership disclosure), captionIsEdited, hasAudio plus the audio object, and the author's isVerified / isPrivate flags. viewCount is a real per-post view metric — but only for posts fetched directly by URL or numeric ID; it comes back null on search-derived rows, because Threads doesn't expose that number on its search surface.
How does Threads Search Scraper differ from the official Threads API?
Meta's Threads API does expose a public Keyword Search endpoint (checked 2026-08-04), but it is built for developers with an approved app, not for pulling media assets or trust signals at will. Threads Search Scraper needs neither an app review nor an access token.
| Feature | Meta Threads Keyword Search API | Threads Search Scraper |
|---|---|---|
| Access requirement | Meta developer app + threads_basic and threads_keyword_search permissions; public-post search only after app review approval | An Apify account; no Meta app, token, or review |
| Direct post URL/ID lookup | Not supported by this endpoint | Supported — a URL or a 10+ digit numeric ID returns that post directly |
| Query rate limit | 2,200 queries per rolling 24-hour period, per user, across all apps | No documented per-day query cap; the actor retries on transient errors and escalates proxy tier on failure |
| Result fields | Post ID, text, media type, permalink, timestamp, username, has_replies/is_quote_post/is_reply; owner/profile fields explicitly excluded | Full media galleries (every image size, carousel item media, video URLs), sponsorship/edit/audio/verification/privacy/view-count signals, quote/repost resolution |
| Results per query | Default 25 items, maximum 100 | Up to the first Threads search-results page per phrase (see the FAQ below); maxItems caps the run total |
| Keyword filtering | Returns an empty array for keywords Meta deems sensitive or offensive | No keyword filtering applied by the actor itself |
Use the official API when you already run an approved Meta developer app and only need lightweight text/permalink data within its rate limit. Use Threads Search Scraper when you need full-resolution media, carousel breakdowns, or trust signals without going through Meta's app-review process.
How to scrape Threads with Threads Search Scraper?
- Open Threads Search Scraper on the Apify Store and add it to your account — no Threads login is needed.
- In the Targets to collect field (
urls), add one line per target: a full post URL, a numeric post ID, or a search phrase. - Optionally set Max items (
maxItems) to cap total rows, toggle Full media gallery (fetchFullMediaGallery) and Format & trust signals (includeFormatTrustSignals) on or off, and expand Proxy (optional) (proxyConfiguration) if you want requests routed through Apify Proxy. - Click Start and let the run finish — the log shows each target being fetched and each row saved as it happens.
- Open the Dataset tab and export results as JSON, CSV, Excel, XML, or RSS, or pull them programmatically via the Apify API or
apify-client.
{"urls": ["Mark Zuckerberg"],"maxItems": 20}
How to run multiple queries in one job
The urls field is a plain string list — one URL, post ID, or search phrase per line — and every line submitted in a single run is processed in that same job, one target after another, writing rows to the same dataset as it goes. There is no separate batch-size or concurrency setting in the input schema; targets are fetched sequentially, and a maxItems cap (if set) stops the whole run early — even mid-target — once the total is reached.
⬇️ Input
Threads Search Scraper takes one required field (urls) and three optional controls. Configure it directly in the Apify Console UI or by passing a JSON object to the run.
| Parameter | Required | Type | Description | Example Value |
|---|---|---|---|---|
urls | Yes | array of strings | Each line: a full post URL (threads.com or threads.net), a numeric post ID (10+ digits), or a search phrase. A search phrase returns every matching post from that search. | ["https://www.threads.com/@zuck/post/AbCdEfGhIjK", "Mark Zuckerberg"] |
maxItems | No | integer, minimum 0 | Cap on how many rows to save across the whole run. Leave empty or 0 for no limit. No schema default; the Console pre-fills 10. | 50 |
fetchFullMediaGallery | No | boolean | When true, every post includes every image_versions2 size, every carousel item's own full image/video set, isGif, and the mediaType label. Default true. | true |
includeFormatTrustSignals | No | boolean | When true, every post includes isSponsored, captionIsEdited, hasAudio + audio, isVerified/isPrivate, and viewCount (null on search-derived rows). Default true. | true |
proxyConfiguration | No | object | Apify Proxy configuration. Leave off for a simple run; turn on for busy or sensitive targets. | {"useApifyProxy": true} |
Example input:
{"urls": ["https://www.threads.com/@zuck/post/AbCdEfGhIjK","10987654321098765","Mark Zuckerberg"],"maxItems": 50,"fetchFullMediaGallery": true,"includeFormatTrustSignals": true,"proxyConfiguration": {"useApifyProxy": true}}
Common pitfall: a numeric target is only treated as a post ID when it is 10 or more digits (the actor matches it against \d{10,}). Shorter numeric strings don't error out — they silently fall through to search-phrase mode instead, so you get search results for that number as text rather than the specific post you meant. When you have the post's ID, double-check its digit count, or just paste the full post URL instead.
⬆️ Output
Every result is a typed, normalized JSON object with a consistent field set across runs. Results land in the actor's default dataset and can be exported from the Apify Console (or fetched via the API) as JSON, CSV, Excel, XML, or RSS.
Scraped results
The dataset's default view surfaces 30 curated fields per post. Every row also carries the underlying raw Threads/Instagram post object (schema-tolerant — unrecognized fields from Threads are passed through rather than dropped), which is why fields like id, text_post_app_info, image_versions2, and video_versions show up alongside the curated ones. The example below is trimmed for readability — nested raw objects like text_post_app_info carry additional internal Threads fields not shown here.
[{"post_url": "https://www.threads.com/@examplecreator/post/C1a2B3c4D5e","pk": 3123456789012340,"code": "C1a2B3c4D5e","id": "3123456789012340_9876543210","caption": { "text": "Dropping the new lineup today — link in bio. #newdrop" },"like_count": 4821,"directReplyCount": 96,"repostCount": 41,"quoteCount": 12,"reshareCount": 5,"mentions": [],"hashtags": ["newdrop"],"urls": [],"isQuotePost": false,"quotedPostUrl": null,"isRepost": false,"repostedPostUrl": null,"mediaType": "carousel","isGif": false,"allImageVariants": [{ "url": "https://scontent.threads.net/.../1080x1080.jpg", "width": 1080, "height": 1080 }],"allVideoVariants": [],"carouselMedia": [{ "id": "3123456789012341", "mediaType": "image", "images": [ { "url": "https://scontent.threads.net/.../slide1.jpg", "width": 1080, "height": 1350 } ], "videos": [] }],"isSponsored": true,"captionIsEdited": false,"hasAudio": false,"audio": null,"isVerified": true,"isPrivate": false,"viewCount": 58210,"taken_at": 1769990400,"scrapedAt": "2026-08-04T10:15:22.104Z","user": {"friendship_status": { "muting": false, "following": false, "followed_by": false, "outgoing_request": null, "blocking": null },"id": "9876543210","pk": 9876543210,"text_app_last_visited_time": 0,"profile_pic_url": "https://scontent.threads.net/.../profile.jpg","username": "examplecreator","full_name": "Example Creator","is_verified": true,"text_post_app_is_private": false,"has_onboarded_to_text_post_app": true},"text_post_app_info": { "direct_reply_count": 96, "repost_count": 41, "quote_count": 12, "reshare_count": 5, "is_reply": false }},{"post_url": "https://www.threads.com/@newsdesk_daily/post/D2b3C4d5E6f","pk": 3123456789012350,"code": "D2b3C4d5E6f","id": "3123456789012350_1122334455","caption": { "text": "Breaking: full statement below." },"like_count": 1290,"directReplyCount": 34,"repostCount": 8,"quoteCount": 3,"reshareCount": 1,"mentions": [{ "username": "officialsource" }],"hashtags": [],"urls": ["https://example.com/statement"],"isQuotePost": false,"quotedPostUrl": null,"isRepost": false,"repostedPostUrl": null,"mediaType": "video","isGif": false,"allImageVariants": [],"allVideoVariants": ["https://scontent.threads.net/.../clip.mp4"],"carouselMedia": [],"isSponsored": false,"captionIsEdited": true,"hasAudio": true,"audio": { "audio_asset_id": "445566778899" },"isVerified": true,"isPrivate": false,"viewCount": 210004,"taken_at": 1769980200,"scrapedAt": "2026-08-04T10:15:23.881Z","user": {"friendship_status": { "muting": false, "following": false, "followed_by": false, "outgoing_request": null, "blocking": null },"id": "1122334455","pk": 1122334455,"text_app_last_visited_time": 0,"profile_pic_url": "https://scontent.threads.net/.../profile2.jpg","username": "newsdesk_daily","full_name": "News Desk Daily","is_verified": true,"text_post_app_is_private": false,"has_onboarded_to_text_post_app": true},"text_post_app_info": { "direct_reply_count": 34, "repost_count": 8, "quote_count": 3, "reshare_count": 1, "is_reply": false }},{"post_url": "https://www.threads.com/@quietresearcher/post/E3c4D5e6F7g","pk": 3123456789012360,"code": "E3c4D5e6F7g","id": "3123456789012360_5544332211","caption": { "text": "Quoting this thread — worth reading in full." },"like_count": 302,"directReplyCount": 5,"repostCount": 2,"quoteCount": 0,"reshareCount": 0,"mentions": [],"hashtags": [],"urls": [],"isQuotePost": true,"quotedPostUrl": "https://www.threads.com/@originalauthor/post/A1b2C3d4E5f","isRepost": false,"repostedPostUrl": null,"mediaType": "text-only","isGif": false,"allImageVariants": [],"allVideoVariants": [],"carouselMedia": [],"isSponsored": false,"captionIsEdited": false,"hasAudio": false,"audio": null,"isVerified": false,"isPrivate": false,"viewCount": null,"taken_at": 1769975000,"scrapedAt": "2026-08-04T10:15:24.240Z","user": {"friendship_status": { "muting": false, "following": false, "followed_by": false, "outgoing_request": null, "blocking": null },"id": "5544332211","pk": 5544332211,"text_app_last_visited_time": 0,"profile_pic_url": "https://scontent.threads.net/.../profile3.jpg","username": "quietresearcher","full_name": "Quiet Researcher","is_verified": false,"text_post_app_is_private": false,"has_onboarded_to_text_post_app": true},"text_post_app_info": { "direct_reply_count": 5, "repost_count": 2, "quote_count": 0, "reshare_count": 0, "is_reply": false }}]
Note the third row: viewCount is null because that post came back from a search phrase rather than a direct URL/ID fetch — Threads simply doesn't expose that number on its search surface, so the actor reports it as missing instead of guessing.
How can I use the data extracted with Threads Search Scraper?
- 📱 Media monitoring teams: pull every image resolution and full carousel/video set per post via
allImageVariantsandcarouselMedia, keyed offmediaType, instead of settling for one thumbnail URL. - ⚖️ Content moderation and compliance teams: flag
isSponsoredposts at scale across a keyword search to check paid-partnership disclosure, and usecaptionIsEditedto spot captions changed after publication. - 🤖 AI engineers and LLM developers: issue a search phrase, get back structured JSON posts, and pass
caption,mentions, andhashtagsstraight into a prompt as grounded context for a retrieval agent. - 🔬 Researchers: use
isQuotePost/quotedPostUrlandisRepost/repostedPostUrlto trace how a claim propagates through quote posts and reposts, andviewCount(on direct post/ID targets) to gauge reach beyond raw like counts.
How do you monitor sponsored content and engagement on Threads over time?
Tracking a creator's or a topic's Threads activity is a matter of running the same targets repeatedly and diffing the fields that change. Each run's scrapedAt timestamp anchors the comparison, so you always know how fresh a given snapshot is.
Between runs, watch: like_count, directReplyCount, repostCount, quoteCount, and reshareCount for engagement trajectory; isSponsored to catch when a creator starts or stops running paid-partnership content; captionIsEdited to catch a caption that was changed after the fact; and viewCount (direct post/ID targets only) for reach that raw like counts don't capture.
A practical loop: keep a list of post URLs or search phrases you care about, run this actor against that list on a schedule, and compare each new dataset against the previous one — for example, alert when isSponsored flips to true on a creator you track, or when like_count on a tracked post jumps well past its normal pace. Set this up with an Apify Schedule on the actor to run automatically at whatever interval fits your monitoring cadence, and pair it with an Apify webhook on the run's SUCCEEDED event to push each run's results onward as soon as they land.
Integrate Threads Search Scraper and automate your workflow
Threads Search Scraper works with any language or tool that can send an HTTP request — the Apify API sits underneath every run.
REST API with Python
from apify_client import ApifyClientclient = ApifyClient("<APIFY_API_TOKEN>")run = client.actor("<ACTOR_ID_FROM_STORE_PAGE>").call(run_input={"urls": ["Mark Zuckerberg"],"maxItems": 20,"fetchFullMediaGallery": True,"includeFormatTrustSignals": True,})for post in client.dataset(run["defaultDatasetId"]).iterate_items():print(post["post_url"], post["like_count"], post["mediaType"])
Replace <APIFY_API_TOKEN> with your Apify API token and <ACTOR_ID_FROM_STORE_PAGE> with this actor's username/actor-name identifier from its Apify Store page.
Scheduled monitoring and delivery
Set up an Apify Schedule to run this actor automatically on a cron-style interval with a saved input. For delivery, attach an Apify webhook to the run's SUCCEEDED event to push each run's dataset onward, or poll the dataset via the API on your own schedule instead.
⚖️ Is it legal to scrape Threads results?
Yes — scraping publicly accessible Threads posts is generally legal, and Threads Search Scraper returns only what any visitor to threads.com or threads.net can already see without logging in. In Meta Platforms, Inc. v. Bright Data Ltd. (N.D. Cal., Jan. 23, 2024), the court granted summary judgment for Bright Data, holding that Meta's terms of service do not bind scraping of publicly available data performed while logged out — directly relevant to a Meta-owned platform like Threads. That said, Threads posts carry usernames, profile pictures, and verification status tied to identifiable people, so this is personal data under GDPR and CCPA, and lawful-basis and data-minimization obligations still apply to how you store and use it — that case addressed collection, not those downstream duties. Scraping for one-off monitoring carries a different risk profile than scraping at scale to build an AI-training dataset. Consult your legal team for commercial use cases involving bulk data storage.
❓ Frequently asked questions
Do I need a Threads account or login to use Threads Search Scraper?
No. Every fetch is anonymous, against Threads' public server-rendered pages and its public search surface — the actor never asks for or uses Threads credentials, cookies, or a logged-in session.
Can I mix post URLs, post IDs, and search phrases in the same run?
Yes. The urls field accepts all three on separate lines in one run: a full post URL (threads.com or threads.net), a numeric post ID of 10 or more digits, or a free-text search phrase. Each line is classified independently and processed in order.
Does Threads Search Scraper support threads.net links as well as threads.com?
Yes. The actor accepts either host — a URL is only rejected if its host is neither threads.com nor threads.net.
How does Threads Search Scraper handle Threads' anti-bot measures?
It rotates user agents per request, retries automatically on 429/502/503/504 responses and network errors with exponential backoff and jitter, and escalates through proxy tiers on failure — starting with no proxy, then a datacenter (SHADER) group, then a residential group — before giving up after repeated residential failures.
Does Threads Search Scraper extract full media galleries and trust signals?
Yes. fetchFullMediaGallery (default on) adds mediaType, isGif, allImageVariants, allVideoVariants, and carouselMedia. includeFormatTrustSignals (default on) adds isSponsored, captionIsEdited, hasAudio/audio, isVerified/isPrivate, and viewCount. ⚠️ viewCount is only populated for posts fetched directly by URL or numeric ID — it is null on search-derived rows, because Threads doesn't expose that number on its search surface.
How many results does Threads Search Scraper return per query?
A direct post URL or numeric ID returns exactly one post — its own thread entry. A search phrase returns every post on Threads' first search-results page for that phrase, up to about 20 posts. ⚠️ Deeper pagination on Threads' search endpoint requires a logged-in session, which this actor does not use, so anonymous runs stop at that first page rather than paging further. maxItems then caps the total rows saved across the whole run, across all your targets combined.
Has there been legal precedent for scraping public data from Meta-owned platforms like Threads?
Yes. In Meta Platforms, Inc. v. Bright Data Ltd. (N.D. Cal., Jan. 23, 2024), the court ruled that Meta's terms of service do not bind a scraper collecting publicly available data while logged out, granting summary judgment against Meta's breach-of-contract claims.
How do I use Threads Search Scraper to monitor sponsored content or engagement over time?
Run the same post URLs or search phrases on a recurring schedule, extract like_count, isSponsored, captionIsEdited, and viewCount from each run, and compare against the previous run's dataset to alert on the change that matters — see the monitoring section above for the full loop and how to schedule it.
Does Threads Search Scraper work with Claude, ChatGPT, and AI agent frameworks?
Yes, as an HTTP endpoint. Because the actor is callable through the standard Apify API, any agent framework that can make an HTTP call can trigger a run, wait for it to finish, and read back structured JSON posts to ground its answer — no special integration required beyond an API call.
Can I use Threads Search Scraper without managing proxies or Threads credentials?
Yes. The actor handles proxy tier selection and escalation internally, and never requires Threads login credentials. Turning on proxyConfiguration with Apify Proxy is optional and only useful if you want Apify's proxy network in the mix for busier or more sensitive targets; leaving it off still runs the full flow.
What's the difference between fetchFullMediaGallery and includeFormatTrustSignals?
fetchFullMediaGallery controls whether each post carries its full media breakdown — every image size, full carousel item media, GIF detection, and the readable mediaType label. includeFormatTrustSignals controls a separate set of fields — sponsorship, edit status, audio, verification, privacy, and view count. Both default to on; turn either off independently for smaller, faster rows when you don't need that layer.
💬 Your feedback
Found a bug, or missing a field you need from a Threads post? Open an issue on this actor's Issues tab in the Apify Console, or message the developer directly from the actor's Store page — that's the fastest way to reach the Scrapier team.