Threads Search Scraper
Pricing
from $1.99 / 1,000 results
Threads Search Scraper
Threads Search Scraper collects posts by query, author or date range - caption, media type, image and video URLs, likes, replies, reposts, verification and privacy flags. π§΅ For social listening and Meta Threads trend research.
Pricing
from $1.99 / 1,000 results
Rating
0.0
(0)
Developer
Scrapers Hub
Maintained by CommunityActor stats
0
Bookmarked
2
Total users
1
Monthly active users
11 days ago
Last modified
Categories
Share
π§΅ Threads Search Scraper β Extract Threads Posts, Engagement Metrics & Author Data by Keyword
The Threads Search Scraper searches Meta's Threads by keyword and returns structured post data β caption text, author handle, verification status, like counts, reply and repost counts, media URLs, link previews and precise timestamps. Give it a search query and it queries the public Threads search endpoint, returning one dataset row per post with engagement metrics already parsed into numeric fields.
Threads has become a significant surface for real-time public conversation, particularly around marketing, technology, culture and consumer brands. Because posts are short, text-first and heavily engaged, keyword-level search results are a useful signal for social listening, content research, trend detection and competitive monitoring. This Threads search scraper turns those results into rows you can filter, rank and chart rather than scroll through.
The Actor is deliberately explicit about what it can and cannot guarantee. Threads' public, logged-out search endpoint returns a single fixed batch per query β roughly 20 results in observed testing β with no further pagination available without an authenticated session. The recency toggle and the author and date filters were tested against that endpoint and could not be confirmed to work anonymously. All of this is documented in the input schema and logged at runtime, so you know exactly what you are getting.
π What Data Can You Extract with This Threads Search Scraper?
Every dataset item represents one Threads post returned by the search, grouped here into the categories most analysis workflows use.
| Category | Fields | What it gives you |
|---|---|---|
| Post identity | postId, postCode, postUrl | Threads' numeric post ID, its short URL code, and the canonical link to the post. |
| Author profile | userId, username, profilePicUrl, isVerified, isPrivate | The posting account's handle and ID, avatar URL, and its verification and privacy flags. |
| Content | captionText, captionIsEdited, mediaType, hasAudio | The post body text, whether the caption was edited, the media type code, and whether audio is present. |
| Media assets | imageUrl, videoUrl, thumbnailUrl, allImages, allVideos, originalWidth, originalHeight | Primary and complete media URL sets plus the original dimensions of the attached media. |
| Engagement metrics | likeCount, directReplyCount, repostCount, quoteCount, reshareCount, hasLiked | The full engagement picture: likes, direct replies, reposts, quotes and reshares as separate numeric fields. |
| Conversation context | isReply, canReply, replyControl, replyToUsername, replyToUserId | Whether the post is itself a reply, who it replies to, and what reply permissions the author set. |
| Link previews | linkPreviewUrl, linkPreviewTitle, linkPreviewImageUrl, linkPreviewDisplayUrl | The target URL, headline, image and display domain of any attached link card. |
| Timing and commercial flags | takenAt, takenAtISO, takenAtFormatted, isPaidPartnership, organicTrackingToken | Post timestamp in three formats, plus a sponsored-content flag. |
Splitting engagement into likeCount, directReplyCount, repostCount, quoteCount and reshareCount rather than one combined score is what makes this output genuinely useful. Reposts and quotes signal very different things β amplification versus commentary β and a post with high replies but few likes is usually contentious rather than popular. Having all five as separate integers lets you build engagement ratios that a single aggregate number would hide entirely.
π Key Features of the Threads Search Scraper
| Feature | Description |
|---|---|
| π Keyword search | Query Threads' public search with any keyword or phrase through the searchQuery field. |
| π Five distinct engagement metrics | Likes, direct replies, reposts, quotes and reshares are returned as separate integers, not merged into a single score. |
| πΌοΈ Complete media capture | imageUrl, videoUrl and thumbnailUrl cover the primary asset, while allImages and allVideos capture multi-media posts in full. |
| π Link preview extraction | Attached link cards return their URL, title, image and display domain as four separate fields. |
| β Author verification flags | isVerified and isPrivate let you separate established accounts from the long tail immediately. |
| π Three timestamp formats | takenAt, takenAtISO and takenAtFormatted cover Unix, ISO 8601 and human-readable use without any conversion work. |
| π¬ Reply-thread context | isReply, replyToUsername and replyControl reveal conversation structure and who controls participation. |
| π Configurable proxy | proxyConfiguration is exposed in the input and defaults to residential groups, which Threads requires in practice. |
| π’ Transparent limitations | Unverified filters and pagination limits are documented in the schema and warned about in the run log rather than glossed over. |
π Why Choose This Threads Search Scraper?
Engagement metrics that support real analysis. Returning likeCount, directReplyCount, repostCount, quoteCount and reshareCount as five separate integers means you can compute amplification ratios, reply-to-like ratios and quote-driven controversy signals. A single blended engagement number cannot express any of that.
Honest documentation of platform constraints. Threads' anonymous search endpoint has real limits, and this Actor states them plainly: one fixed batch per query, recency ordering unverified, author and date filters confirmed to have no effect when logged out. Knowing the boundary up front is far more valuable than a promise that quietly fails.
Configurable residential proxying. Threads blocks datacentre IP ranges and non-browser TLS fingerprints aggressively. Because proxyConfiguration is exposed as an input and defaults to residential groups, you control the network path rather than hoping a hidden default works for your volume.
Rich context beyond the post text. Link previews, media dimensions, reply targets, paid-partnership flags and verification status all arrive on the same row. That turns a keyword search into a dataset you can segment by account type, content format and commercial intent without any follow-up requests.
π₯ Input
{"searchQuery": "prompt ideas","sort": "top","maxPosts": 20,"proxyConfiguration": {"useApifyProxy": true,"apifyProxyGroups": ["RESIDENTIAL"]}}
π§ Threads Search Scraper Input Fields
| Field | Type | Required | Default | Description |
|---|---|---|---|---|
searchQuery | string | β Yes | β (prefilled prompt ideas) | Keyword or phrase to search for on Threads. |
sort | string (top | recent) | No | top | Result ordering. top is the verified default Threads search order. recent is best-effort only β Threads' recency toggle is a client-side action on the live site and could not be fully verified against the public endpoint, so results may still return top-ranked; the Actor logs a warning when this happens. |
fromUsername | string | No | β | Restrict results to posts by this username. Unverified: live testing showed Threads' public search endpoint ignores this filter entirely β it appears gated behind a login-only search discovery feature. The Actor sends it anyway in case that changes, and logs a warning that it could not be confirmed working. |
beforeDate | string (YYYY-MM-DD) | No | β | Only include posts before this date. Same unverified caveat as fromUsername β confirmed via live testing to have no effect on anonymous search results. |
afterDate | string (YYYY-MM-DD) | No | β | Only include posts after this date. Same unverified caveat as fromUsername. |
maxPosts | integer | No | 20 | Maximum number of posts to return. Threads' public search endpoint returns a single fixed batch per query (observed ~20 results) with no pagination available without an authenticated session, so this is an upper bound, not a guarantee. |
proxyConfiguration | object | No | { "useApifyProxy": true, "apifyProxyGroups": ["RESIDENTIAL"] } | Proxy settings. Residential proxy is strongly recommended β Threads blocks datacentre IPs and non-browser TLS fingerprints aggressively. |
π‘ Input Examples
Basic keyword search with the verified default ordering
{"searchQuery": "AI marketing","sort": "top","maxPosts": 20}
Attempting recency ordering (best-effort)
{"searchQuery": "product launch","sort": "recent","maxPosts": 20,"proxyConfiguration": { "useApifyProxy": true, "apifyProxyGroups": ["RESIDENTIAL"] }}
Brand monitoring query with explicit residential proxying
{"searchQuery": "customer support chatbot","sort": "top","maxPosts": 20,"proxyConfiguration": { "useApifyProxy": true, "apifyProxyGroups": ["RESIDENTIAL"] }}
π€ Output
{"postId": "3568430359959899896","postCode": "DGFnIGLIQ74","postUrl": "https://www.threads.com/@anjela.marketing/post/DGFnIGLIQ74","userId": "72020571379","username": "anjela.marketing","profilePicUrl": "https://instagram.fccs8-1.fna.fbcdn.net/v/t51.2885-19/473069250_610379694802837...","isVerified": false,"isPrivate": false,"captionText": "HOW I CREATE A MONTH OF CONTENT IN 20 MINUTES WITH CHATGPT\nMost people use AI to brainstorm conten...","mediaType": 19,"hasAudio": false,"imageUrl": "","videoUrl": "","thumbnailUrl": "","allImages": [],"allVideos": [],"originalWidth": 612,"originalHeight": 612,"likeCount": 358,"hasLiked": false,"directReplyCount": 14,"repostCount": 32}
π§Ύ Threads Post Output Fields
| Field | Type | Description |
|---|---|---|
postId | string | null | Threads' numeric identifier for the post. |
postCode | string | null | Short code used in the post's public URL. |
postUrl | string | null | Canonical URL of the post. |
userId | string | null | Identifier of the posting account. |
username | string | null | Account handle of the author. |
profilePicUrl | string | null | URL of the author's profile picture. |
isVerified | boolean | null | Whether the account carries a verification badge. |
isPrivate | boolean | null | Whether the account is private. |
captionText | string | null | Full text body of the post. |
captionIsEdited | boolean | null | Whether the caption has been edited since posting. |
mediaType | integer | null | Numeric media type code for the post. |
hasAudio | boolean | null | Whether the post's media includes audio. |
imageUrl | string | null | Primary image URL, empty when the post has no image. |
videoUrl | string | null | Primary video URL, empty when the post has no video. |
thumbnailUrl | string | null | Thumbnail image URL for video posts. |
allImages | array | null | All image URLs attached to the post. |
allVideos | array | null | All video URLs attached to the post. |
originalWidth | integer | null | Original width of the post media in pixels. |
originalHeight | integer | null | Original height of the post media in pixels. |
likeCount | integer | null | Number of likes on the post. |
hasLiked | boolean | null | Whether the requesting session has liked the post. |
directReplyCount | integer | null | Number of direct replies. |
repostCount | integer | null | Number of reposts. |
quoteCount | integer | null | Number of quote posts. |
reshareCount | integer | null | Number of reshares. |
isReply | boolean | null | Whether this post is a reply to another post. |
canReply | boolean | null | Whether replies are currently permitted. |
replyControl | string | null | The author's reply permission setting. |
replyToUsername | string | null | Handle of the account this post replies to. |
replyToUserId | string | null | Identifier of the account this post replies to. |
linkPreviewUrl | string | null | Target URL of an attached link card. |
linkPreviewTitle | string | null | Headline shown on the link card. |
linkPreviewImageUrl | string | null | Image used by the link card. |
linkPreviewDisplayUrl | string | null | Display domain shown on the link card. |
takenAt | integer | null | Post timestamp as a Unix epoch value. |
takenAtISO | string | null | Post timestamp in ISO 8601 format. |
takenAtFormatted | string | null | Human-readable post timestamp. |
isPaidPartnership | boolean | null | Whether the post is flagged as a paid partnership. |
organicTrackingToken | string | null | Threads' internal organic tracking token for the post. |
π» How to Use the Threads Search Scraper (Step by Step)
Step 1: Craft Your Search Query
searchQuery is the only required input and behaves like the Threads search box. Multi-word phrases work and generally return tighter results than single generic words. Because the public endpoint returns one fixed batch per query, the specificity of your phrasing matters more here than on platforms where you can paginate deeply β a precise query gets you a relevant twenty posts, a vague one gets you twenty irrelevant ones.
Step 2: Choose Your Sort Order
Leave sort at top for the verified behaviour: Threads' default popularity-weighted ordering. Setting it to recent is a best-effort attempt at recency ordering. That toggle is a client-side action on the live Threads site and could not be confirmed to work against the anonymous endpoint, so results may still come back top-ranked β the Actor logs a warning when it detects this. Treat recent as an attempt, not a guarantee.
Step 3: Understand the Optional Filters
fromUsername, beforeDate and afterDate are present in the schema, but live testing confirmed that Threads' public logged-out search endpoint ignores them: the server-side query variable stayed null regardless of what was sent. They appear to be gated behind a login-only search discovery feature. The Actor still sends them in case Threads changes that behaviour, and warns in the log that they could not be confirmed. Do not build a workflow that depends on them filtering anything.
Step 4: Set a Realistic Post Cap
maxPosts defaults to 20 and functions as an upper bound only. The public endpoint returns a single fixed batch per query β around 20 results in observed testing β and no further pagination is available without an authenticated session. Setting maxPosts to 500 will not produce 500 posts; the Actor returns what it found and logs a warning when the result count falls short.
Step 5: Configure Residential Proxying
This is the setting that most affects whether a run succeeds. Threads blocks datacentre IPs and non-browser TLS fingerprints aggressively, and the default proxyConfiguration already specifies residential groups for that reason. Unless you have a specific reason to change it, keep the default. If runs start returning empty results, the proxy path is the first thing to examine.
Step 6: Run and Read the Log
Start the run from the Apify Console or through the API. The log is unusually informative for this Actor: it warns when recent ordering appears not to have applied, when unverified filters were sent, and when fewer posts were returned than requested. Reading it tells you whether the dataset reflects your intent or the endpoint's constraints.
Step 7: Analyse and Combine Results
Because a single query yields a bounded batch, breadth comes from running several related queries rather than one deep one. Deduplicate the combined results on postId, then use likeCount, repostCount, quoteCount and directReplyCount to rank posts, and isVerified to separate established accounts from the wider conversation. Running the same query set on a schedule and diffing on postId is the practical way to track a topic over time.
π API Access & Integrations
Run the Threads search scraper and receive the posts in a single call:
curl -X POST "https://api.apify.com/v2/acts/scrapers-hub~threads-search-scraper/run-sync-get-dataset-items?token=YOUR_TOKEN" \-H "Content-Type: application/json" \-d '{"searchQuery": "prompt ideas","sort": "top","maxPosts": 20,"proxyConfiguration": { "useApifyProxy": true, "apifyProxyGroups": ["RESIDENTIAL"] }}'
The same run using the official Python client:
from apify_client import ApifyClientclient = ApifyClient("YOUR_TOKEN")run_input = {"searchQuery": "AI marketing","sort": "top","maxPosts": 20,"proxyConfiguration": {"useApifyProxy": True, "apifyProxyGroups": ["RESIDENTIAL"]},}run = client.actor("scrapers-hub/threads-search-scraper").call(run_input=run_input)for post in client.dataset(run["defaultDatasetId"]).iterate_items():print(post["username"], post["likeCount"], post["repostCount"], post["takenAtISO"])print(post["captionText"][:120])
Results can also be routed into Zapier, Make, Google Sheets or Slack, or delivered to your own endpoint through Apify webhooks the moment a run completes.
π‘ Best Use Cases for Threads Post Data
π Social Listening and Brand Monitoring
Running your brand, product or category name as searchQuery returns the public conversation around it, with captionText for sentiment work and likeCount plus repostCount to gauge reach. The isVerified flag helps you spot when a larger account has entered the discussion.
π Content Performance Research
Studying what performs on Threads means comparing formats, not just topics. Combining mediaType, hasAudio, originalWidth and originalHeight with the five engagement counters shows whether text-only, image or video posts drive more amplification for a given subject.
π₯ Trend and Topic Detection
Running a set of related queries on a schedule and diffing on postId surfaces newly appearing posts around a topic. Sorting the combined results by repostCount and quoteCount highlights which ideas are spreading rather than merely being liked.
π€ Creator and Influencer Discovery
Filtering results by isVerified and ranking authors by aggregate likeCount across a query set identifies accounts with genuine traction in a niche. username, userId and profilePicUrl give you enough to build a shortlist, and isPaidPartnership flags accounts already doing commercial work.
π¬ Conversation and Sentiment Analysis
The reply context fields β isReply, replyToUsername and directReplyCount β let you distinguish original statements from responses, which matters when running sentiment models. A high directReplyCount relative to likeCount is a reliable marker of contested rather than popular content.
π Link and Referral Tracking
Where posts share external content, linkPreviewUrl, linkPreviewTitle and linkPreviewDisplayUrl reveal which domains and headlines are circulating in a topic. Aggregating display domains across a query set gives a quick map of which publishers dominate a conversation.
π― Competitive Campaign Intelligence
Searching competitor product names and campaign slogans surfaces how they are being discussed publicly. Pairing isPaidPartnership with username shows which creators are being activated commercially, and takenAtISO anchors each observation to a date.
βοΈ Tips for Better Threads Scraping Results
- Keep residential proxies enabled. The default
proxyConfigurationuses residential groups because Threads blocks datacentre traffic and non-browser TLS fingerprints. Changing it is the fastest route to empty results. - Use several narrow queries rather than one broad one. Since each query returns a single bounded batch, coverage comes from query breadth, not from raising
maxPosts. - Treat
recentas best-effort. If ordering matters to your analysis, sort bytakenAtyourself after export instead of relying on the toggle. - Ignore the unverified filters for production logic.
fromUsername,beforeDateandafterDatewere confirmed to have no effect on anonymous search. Filter onusernameandtakenAtISOafter the fact instead. - Deduplicate on
postIdacross runs. Repeated scheduled runs of the same query will overlap heavily;postIdis the reliable key. - Read the run log before trusting a small dataset. The Actor explicitly warns when it returned fewer posts than requested or when a filter could not be confirmed to apply.
π οΈ Troubleshooting
Why did I only get about 20 posts when I asked for more?
Because that is the platform's limit for anonymous search. Threads' public search endpoint returns a single fixed batch per query with no pagination available without a logged-in session. maxPosts is an upper bound, and the Actor logs a warning when fewer posts are available.
Why did sort: "recent" still return popular posts?
The recency toggle on Threads is a client-side action that could not be verified against the public endpoint. The Actor sends the request and logs a warning when results still appear top-ranked. Sort by takenAt after export if ordering matters.
Why did fromUsername not filter my results?
Live testing showed the public search endpoint ignores that parameter entirely β the server-side query variable remained null regardless of what was sent, suggesting it is gated behind a login-only feature. Filter on the username field after export instead.
Why is my run returning no results at all?
This is almost always a proxy or blocking issue. Confirm proxyConfiguration is using residential groups, then retry. Threads is aggressive about datacentre IP ranges and unusual TLS fingerprints.
Why are imageUrl and videoUrl empty on some rows?
Because those posts are text-only. Threads is a text-first platform, and posts without attached media legitimately return empty media fields β as in the real sample above, where mediaType is populated but every media URL is blank.
β Frequently Asked Questions About Threads Scraping
What is the Threads Search Scraper? It is an Apify Actor that searches Meta's Threads by keyword and returns structured post data β caption text, author details, engagement counts, media URLs, link previews and timestamps β as dataset rows.
Do I need a Threads or Instagram account to use it? No. The Actor queries the public, logged-out Threads search endpoint. No credentials are used, which is also why several filters cannot be applied.
How many posts can I get from one search?
Roughly 20 in observed testing. The public endpoint returns one fixed batch per query and offers no further pagination anonymously, so maxPosts caps rather than extends the result set.
Can I scrape all posts from a specific user?
Not through this Actor. The fromUsername filter is sent but was confirmed to have no effect on anonymous search results, so it cannot be relied on to restrict results to one account.
Does date filtering work?
No. beforeDate and afterDate are in the schema but live testing confirmed they have no effect on anonymous search. Filter on takenAtISO after export instead.
What engagement metrics are returned?
Five separate integers: likeCount, directReplyCount, repostCount, quoteCount and reshareCount, plus the boolean hasLiked.
Can I configure the proxy?
Yes. proxyConfiguration is exposed in the input and defaults to Apify residential groups, which are strongly recommended because Threads blocks datacentre IPs aggressively.
Does the scraper return images and videos?
It returns media URLs β imageUrl, videoUrl, thumbnailUrl, and the complete allImages and allVideos arrays β along with the original media dimensions. The files themselves are not downloaded.
How do I know when a post was published?
Three fields cover it: takenAt as a Unix epoch integer, takenAtISO in ISO 8601, and takenAtFormatted as a human-readable string.
Can I identify sponsored posts?
Yes. The isPaidPartnership boolean flags posts marked as paid partnerships, which is useful when separating organic conversation from commercial activity.
How do I collect more posts on a topic?
Run several related queries rather than raising maxPosts. Combine the datasets and deduplicate on postId to build broader coverage of a subject.
Can I schedule recurring Threads searches?
Yes. Apify's scheduler supports any cron expression, and diffing consecutive runs on postId is the practical way to track a topic over time.
What export formats are available? Datasets export as JSON, JSONL, CSV, Excel, XML or HTML from the Apify Console, or can be read directly through the API.
Is scraping Threads legal? This Threads search scraper accesses publicly visible search results without logging in. How you use the resulting data is your responsibility, including compliance with Meta's terms of service and applicable privacy law.
Why does the run log contain warnings even on successful runs? By design. The Actor warns whenever it sends an unverified filter, when recency ordering may not have applied, and when fewer posts were returned than requested, so you can judge the dataset accurately.
π Support & Feedback
If you hit a bug, an empty result set that should not be empty, or a parsing issue, open a ticket in the Issues tab of this Actor on Apify. Reports filed there are tracked and answered directly.
Need something custom β additional Threads fields, a different collection strategy, or a social listening pipeline built around this data? Email scraperhubapi@gmail.com with a description of what you are trying to achieve.
If the Threads Search Scraper is useful to you, a review on its Apify page is genuinely appreciated. Ratings and written feedback shape which improvements are prioritised next.
βοΈ Disclaimer
This Threads search scraper collects only publicly visible posts returned by Threads' public search endpoint. It does not log in, does not access private accounts, direct messages or follower-only content, and does not attempt to circumvent authentication or technical access controls.
You are responsible for how you use the extracted data. Post text, images, video and profile pictures are protected by copyright and other rights held by the accounts that published them, and republishing or repurposing that material may require permission. Review Meta's terms of service for Threads before running the Actor at scale or embedding its output in a commercial product.
Threads posts contain personal data by their nature β handles, profile images, opinions and, at times, information about identifiable individuals. When you collect and store it, you act as the data controller under the GDPR, the UK GDPR, the CCPA and other applicable privacy legislation, with the corresponding obligations around lawful basis, transparency, retention limits and data-subject rights. Avoid using this data to profile, target or contact individuals without a proper legal basis.
For questions about data handling, or to request removal of data associated with your runs, contact scraperhubapi@gmail.com.