# Threads Search Scraper (`logical_scrapers/threads-search-scraper`) Actor

Search Threads by keyword or hashtag without logging in and get the matching posts as structured data: text, author, likes, replies, reposts, quotes, media URLs and links, as JSON, CSV or Excel.

- **URL**: https://apify.com/logical\_scrapers/threads-search-scraper.md
- **Developed by:** [Goldmine](https://apify.com/logical_scrapers) (community)
- **Categories:**
- **Stats:** 2 total users, 1 monthly users, 100.0% runs succeeded, 2 bookmarks
- **User rating**: 5.00 out of 5 stars

## Pricing

from $1.99 / 1,000 results

This Actor is paid per event. You are not charged for the Apify platform usage, but only a fixed price for specific events.
Since this Actor supports Apify Store discounts, the price gets lower the higher subscription plan you have.

Learn more: https://docs.apify.com/actors/running/actors-in-store.md#pay-per-event

## What's an Apify Actor?

Actors are web data automations that power AI and operations. They run on the Apify platform to scrape websites, process data, connect APIs, and automate workflows.
In Batch mode, an Actor accepts a well-defined JSON input, performs an action which can take anything from a few seconds to a few hours,
and optionally produces a well-defined JSON output, datasets with results, or files in key-value store.
In Standby mode, an Actor provides a web server which can be used as a website, API, or an MCP server.
Actors are written with capital "A".

## How to integrate an Actor?

If asked about integration, you help developers integrate Actors into their projects.
You adapt to their stack and deliver integrations that are safe, well-documented, and production-ready.
The best way to integrate Actors is as follows.

- **AI agents and MCP clients** — the [Apify MCP server](https://docs.apify.com/integrations/mcp.md) at `https://mcp.apify.com` (remote, streamable HTTP, OAuth on first use).
- **Agentic workflows and local Actor development** — [Agent Skills](https://apify.com/.well-known/agent-skills/index.json) with the [Apify CLI](https://docs.apify.com/cli/docs.md): `npm install -g apify-cli`, then `apify login`.
- **JavaScript/TypeScript projects** — the official [JS/TS client](https://docs.apify.com/api/client/js/docs.md): `npm install apify-client`.
- **Python projects** — the official [Python client](https://docs.apify.com/api/client/python/docs.md): `pip install apify-client`.
- **Any other language** — the [REST API](https://docs.apify.com/api/v2.md).

For usage examples, see the [API](#api) section below.

For more details, see Apify documentation as [Markdown index](https://docs.apify.com/llms.txt) and [Markdown full-text](https://docs.apify.com/llms-full.txt).

# README

## Threads Search Scraper — search Threads posts by keyword or hashtag, no login

![Threads Search Scraper](https://i.ibb.co/C3szknLM/banner.jpg)

Search **[Threads](https://www.threads.com/)** the way its own search box does and get the matching posts back as structured data. This Threads search scraper (a Threads.net scraper, now threads.com) takes keywords, phrases or hashtags and returns every post Threads shows for them: text, author, likes, replies, reposts, quotes, media URLs, links and mentions. People use it for brand and keyword monitoring, trend and hashtag research, creator discovery, and building Threads datasets for analysis or AI agents.

Give it a query such as `nature` or `#photography` and get back the Top, Recent or Tags results, or all three de-duplicated, as JSON, CSV or Excel. No Threads account, cookies or API key needed.

***

### 🚀 Key Features

- 🔎 **Keywords, hashtags or URLs** — search Threads posts by any word or phrase, a `#hashtag` (with or without the `#`), or paste a `threads.com/search?q=...` URL
- 🗂️ **Every search tab** — read the Top, Recent or Tags tab, or all three in one run with duplicates removed
- 🧾 **Full post data** — text, publish time, like / reply / repost / quote / reshare counts, image and video URLs, link previews, hashtags, mentions and URLs in the text
- 👤 **Author details on every post** — username, display name, user ID, verified and private flags, profile picture and profile URL
- 📑 **Per-query limits** — `maxItems` caps posts per search query, not per run, so a list of queries stays balanced
- 💬 **Replies optional** — keep only top-level posts (default) or also save the replies Threads shows under each result
- 📅 **Date window** — keep only posts published between `postedAfter` and `postedBefore`
- 🛡️ **No login, proxy optional** — reads what Threads shows a logged-out visitor; Apify datacenter proxies are enough
- 📤 **Multiple export formats** — JSON, CSV, Excel, XML via the Apify dataset
- 🔁 **Schedulable runs** — run the same queries hourly or daily to track a topic over time

***

### 👥 Who Is This Actor For?

- 📣 **Social media and brand managers** — monitor mentions of a brand, product or campaign hashtag on Threads
- 📈 **Marketers and trend researchers** — see which posts Threads ranks on top for a topic and what is being posted right now
- 🧑‍🎤 **Creator and influencer teams** — find accounts posting about a niche and measure their engagement
- 🧠 **Analysts and data scientists** — build keyword datasets for sentiment, share-of-voice or content studies
- 🤖 **AI builders** — feed fresh Threads posts on a topic into an agent, a RAG pipeline or a summarisation workflow

### 💡 Common Use Cases

- Scrape Threads posts that mention a brand name and export them to a spreadsheet every morning
- Track a hashtag such as `#photography` and log the most-liked posts each week
- Search Threads for a competitor's product and collect the replies people leave
- Collect Threads keyword search results for a news topic to see what is spreading
- Discover creators who post about a niche by searching the Tags tab and sorting by followers later in your own pipeline

***

### 🔗 Supported query types

| Query type | Example |
| ---------- | ------- |
| **Keyword or phrase** | `nature`, `climate change` |
| **Hashtag** | `#photography` or `photography` with search type `tags` |
| **Threads search URL** | `https://www.threads.com/search?q=climate%20change&serp_type=default` (the URL's tab wins over `searchType`) |
| **Threads tag URL** | `https://www.threads.com/tags/nature` |

***

### 📥 Input

| Field | Type | Description | Default |
| ----- | ---- | ----------- | ------- |
| `searchQueries` | Array | Keywords, phrases, hashtags (with or without #) or Threads search URLs. Each query is searched separately. | Required |
| `searchType` | String | Which Threads search tab to read: `top`, `recent`, `tags` or `all` (Top, Recent and Tags in that order, de-duplicated). | `top` |
| `maxItems` | Integer | Maximum number of posts to save **per search query**. | `20` |
| `includeReplies` | Boolean | Also save the replies Threads shows under matching posts as their own items. | `false` |
| `postedAfter` | String | Keep only posts published on or after this date (`YYYY-MM-DD`, UTC). | — |
| `postedBefore` | String | Keep only posts published before this date (`YYYY-MM-DD`, UTC). | — |
| `proxyConfiguration` | Object | Proxy for Threads requests. Apify datacenter proxies are enough. | `{ "useApifyProxy": true }` |

#### Example Input

```json
{
  "searchQueries": ["nature", "#photography"],
  "searchType": "all",
  "maxItems": 40,
  "includeReplies": false,
  "proxyConfiguration": { "useApifyProxy": true }
}
```

***

### 📤 Output

Each dataset item is one Threads post:

| Field | Type | Description |
| ----- | ---- | ----------- |
| `id` | String | Threads post ID. |
| `code` | String | Post shortcode, the last part of the post URL. |
| `url` | String | Public post URL. |
| `text` | String | Post text. Empty for media-only posts. |
| `createdAt` | String | Publish time as an ISO 8601 timestamp (UTC). |
| `timestamp` | Integer | Publish time as unix seconds. |
| `likeCount` | Integer | Likes. |
| `replyCount` | Integer | Direct replies. |
| `repostCount` | Integer | Reposts. |
| `quoteCount` | Integer | Quote posts. |
| `reshareCount` | Integer | Shares outside Threads. |
| `username` | String | Author username. |
| `fullName` | String | Author display name, or `null` when Threads does not include it. |
| `userId` | String | Author user ID. |
| `isVerified` | Boolean | Author has a verified badge. |
| `isPrivate` | Boolean | Author's profile is private. |
| `profilePicUrl` | String | Author profile picture URL. |
| `profileUrl` | String | Author profile URL. |
| `mediaType` | String | `text`, `image`, `video` or `carousel`. |
| `hasMedia` | Boolean | The post carries at least one image or video. |
| `mediaCount` | Integer | Number of media attachments. |
| `images` | Array | Image URLs at the largest size Threads serves; video posts include their poster frame. |
| `videos` | Array | Direct video URLs. |
| `hasAudio` | Boolean | A video has an audio track. |
| `accessibilityCaption` | String | Threads' alt-text for the media, when present. |
| `hashtags` | Array | Hashtags found in the text, without `#`. |
| `mentions` | Array | Usernames mentioned in the text, without `@`. |
| `urls` | Array | Links in the text. |
| `linkPreview` | Object | `{ url, displayUrl, title, imageUrl }` of the attached link card, or `null`. |
| `isReply` | Boolean | The item is a reply to another post. |
| `replyToUsername` | String | Username the reply answers, or `null`. |
| `rootPostCode` | String | Shortcode of the post a reply belongs to, when it was in the same search result. |
| `threadId` | String | ID of the conversation the post belongs to. |
| `isQuotePost` | Boolean | The post quotes another post. |
| `quotedPostUrl` | String | URL of the quoted post, or `null`. |
| `isEdited` | Boolean | The text was edited after posting. |
| `isPaidPartnership` | Boolean | Marked as a paid partnership. |
| `replyControl` | String | Who may reply: `everyone`, `accounts_you_follow` or `mentioned_only`. |
| `searchQuery` | String | The query, exactly as given in the input. |
| `searchType` | String | The tab the post came from: `top`, `recent` or `tags`. |
| `scrapedAt` | String | When the post was scraped (ISO 8601). |

#### Example Output

```json
{
  "id": "3914153076311647543",
  "code": "DZR3XweDuU3",
  "url": "https://www.threads.com/@__neha_t.r.__/post/DZR3XweDuU3",
  "text": "‘‘‘🍂🦋’’’\n …☘️𝐧𝐚𝐭𝐮𝐫𝐞🍂…",
  "createdAt": "2026-06-07T09:10:29.000Z",
  "timestamp": 1780823429,
  "likeCount": 295,
  "replyCount": 15,
  "repostCount": 3,
  "quoteCount": 0,
  "reshareCount": 20,
  "username": "__neha_t.r.__",
  "fullName": "⇨¨*:·.η︎ҽⲏ𝖆 ♡",
  "userId": "80785690060",
  "isVerified": false,
  "isPrivate": false,
  "profilePicUrl": "https://instagram.fadd1-1.fna.fbcdn.net/v/t51.82787-19/657724346_17856282243690061_615697399606468911_n.jpg?...",
  "profileUrl": "https://www.threads.com/@__neha_t.r.__",
  "mediaType": "carousel",
  "hasMedia": true,
  "mediaCount": 3,
  "images": [
    "https://instagram.fadd1-1.fna.fbcdn.net/v/t51.82787-15/719009716_17865345288690061_1741070913251517281_n.webp?...",
    "https://instagram.fadd1-1.fna.fbcdn.net/v/t51.82787-15/719202633_17865345306690061_1719386697182439391_n.webp?...",
    "https://instagram.fadd1-1.fna.fbcdn.net/v/t51.82787-15/719099709_17865345297690061_3947244394621738741_n.webp?..."
  ],
  "videos": [],
  "hasAudio": false,
  "accessibilityCaption": null,
  "hashtags": [],
  "mentions": [],
  "urls": [],
  "linkPreview": null,
  "isReply": false,
  "replyToUsername": null,
  "rootPostCode": null,
  "threadId": "3914153076311647543",
  "isQuotePost": false,
  "quotedPostUrl": null,
  "isEdited": false,
  "isPaidPartnership": false,
  "replyControl": "everyone",
  "searchQuery": "nature",
  "searchType": "top",
  "scrapedAt": "2026-09-03T23:29:12.612Z"
}
```

You can export the dataset as **JSON, CSV, Excel, XML, RSS, or HTML** from the Apify Console or
via the [Apify API](https://docs.apify.com/api/v2).

***

### 💰 Pricing

This Actor is **pay per event** (you pay per result): $0.002 per post, so **1,000 posts cost $2.00**
plus Apify platform usage. A free Apify account is enough to try it.

***

### ❓ FAQ

#### What is the Threads Search Scraper?

It is a Threads search scraper that runs a Threads keyword search for each query you give it and saves the matching public posts as structured data. Think of it as the search box on threads.com with an export button.

#### Do I need an account, cookies or an API key?

No. The Actor reads what Threads shows a logged-out visitor, so there is nothing to log in with and no account of yours at risk.

#### Do I need a proxy?

The default uses Apify datacenter proxies and rotates sessions automatically, which is enough for normal use. Threads rate limits a single IP after many searches in a short time, so keep a proxy on when you run long query lists.

#### How many results can I get per run?

`maxItems` caps posts per search query. Threads shows a logged-out visitor one page per search tab, roughly 15 to 35 posts, and offers no further pages, so a single tab cannot exceed that. Use `searchType: "all"` to read the Top, Recent and Tags tabs together; in our runs that returns several dozen distinct posts per query. Broad queries return more than niche ones, and a query with no matching posts is listed under `ERRORS` in the run's key-value store.

#### What is the difference between Top, Recent and Tags?

Top is what Threads ranks highest for the query, usually posts with the most engagement. Recent is the newest posts mentioning the query. Tags is the posts filed under the matching topic tag, which is what a `#hashtag` search shows on Threads.

#### Does it handle pagination automatically?

The Actor reads every result Threads serves for a tab and, with `searchType: "all"`, moves on to the next tab until `maxItems` is reached. Threads does not serve further pages to logged-out visitors, so there is nothing more to paginate.

#### Can I filter by author or date?

`postedAfter` and `postedBefore` keep only posts in a date window. They filter what Threads returned; they do not make Threads search further back in time. Author filtering is a logged-in Threads feature and is not available here; filter on `username` in the exported data instead.

#### Why does the Recent tab return posts that only loosely match my query?

Threads search matches on words, tags and topics it associates with the query, so results can include broadly related posts. Narrow the query or add a hashtag when that happens.

#### Can I schedule it or integrate it with my app?

Yes — every Apify Actor exposes a REST API, webhooks, and integrations with Zapier, Make, Google
Sheets and Slack, and can be called from an AI agent via the Apify MCP server.

#### Is it legal to scrape Threads?

This Actor accesses only publicly available pages. You are responsible for making sure your use
complies with Threads' terms of service and the laws in your jurisdiction.

#### What if the site changes and the Actor breaks?

Open an issue on the Actor's **Issues** tab. Threads changes its site regularly and the Actor is updated when it does.

***

### 🧩 Part of the Threads Scraper Suite

The suite covers public Threads data: posts with their replies, profiles, hashtags and search. Also try:

- [Threads Post Scraper](https://apify.com/logical_scrapers/threads-post-scraper) — full data and every reply for a single post URL
- [Threads Profile Scraper](https://apify.com/logical_scrapers/threads-profile-scraper) — follower count, bio and the latest posts of a profile
- [Threads Hashtag Scraper](https://apify.com/logical_scrapers/threads-hashtag-scraper) — posts under a hashtag for trend tracking

See every Goldmine Actor at [apify.com/logical\_scrapers](https://apify.com/logical_scrapers).

***

### 📷 Image Credit

Image credit: [threads.com](https://www.threads.com/)

***

### 📬 Contact & Support

- **Issues & feature requests**: use the Issues tab on this Actor's page — that is where every fix starts.
- **Email**: `coredev.dan@gmail.com`
- **If this Actor saved you time, please leave a ⭐ rating on the Apify Store.** Ratings are the
  main signal Apify uses to recommend Actors, and every one helps us keep this maintained.

# Actor input Schema

## `searchQueries` (type: `array`):

Keywords, phrases, hashtags (with or without #) or Threads search URLs (https://www.threads.com/search?q=...). Each query is searched separately.

## `searchType` (type: `string`):

Which Threads search tab to read. Top returns the posts Threads ranks highest, Recent the newest posts, Tags the posts filed under the matching topic tag. All reads the three tabs in that order and removes duplicates, which returns the most posts per query.

## `maxItems` (type: `integer`):

Maximum number of posts to save per search query. Threads shows a logged-out visitor one page per search tab, so a single tab returns roughly 15 to 35 posts; use the All search type to get more.

## `includeReplies` (type: `boolean`):

Search results sometimes carry a reply underneath the matching post. Turn this on to save those replies as their own items; off saves only the top-level posts.

## `postedAfter` (type: `string`):

Keep only posts published on or after this date (YYYY-MM-DD, UTC). Applied to the posts Threads returns; it does not make Threads search further back.

## `postedBefore` (type: `string`):

Keep only posts published before this date (YYYY-MM-DD, UTC).

## `proxyConfiguration` (type: `object`):

Proxy for Threads requests. Apify datacenter proxies are enough; Threads rate limits a single IP after many searches, so the Actor rotates sessions automatically.

## Actor input object example

```json
{
  "searchQueries": [
    "nature"
  ],
  "searchType": "top",
  "maxItems": 20,
  "includeReplies": false,
  "proxyConfiguration": {
    "useApifyProxy": true
  }
}
```

# Actor output Schema

## `overview` (type: `string`):

No description

# API

You can run this Actor programmatically using our API. Below are code examples in JavaScript, Python, and CLI, as well as the OpenAPI specification and MCP server setup.

## JavaScript example

```javascript
import { ApifyClient } from 'apify-client';

// Initialize the ApifyClient with your Apify API token
// Replace the '<YOUR_API_TOKEN>' with your token
const client = new ApifyClient({
    token: '<YOUR_API_TOKEN>',
});

// Prepare Actor input
const input = {
    "searchQueries": [
        "nature"
    ]
};

// Run the Actor and wait for it to finish
const run = await client.actor("logical_scrapers/threads-search-scraper").call(input);

// Fetch and print Actor results from the run's dataset (if any)
console.log('Results from dataset');
console.log(`💾 Check your data here: https://console.apify.com/storage/datasets/${run.defaultDatasetId}`);
const { items } = await client.dataset(run.defaultDatasetId).listItems();
items.forEach((item) => {
    console.dir(item);
});

// 📚 Want to learn more 📖? Go to → https://docs.apify.com/api/client/js/docs

```

## Python example

```python
from apify_client import ApifyClient

# Initialize the ApifyClient with your Apify API token
# Replace '<YOUR_API_TOKEN>' with your token.
client = ApifyClient("<YOUR_API_TOKEN>")

# Prepare the Actor input
run_input = { "searchQueries": ["nature"] }

# Run the Actor and wait for it to finish
run = client.actor("logical_scrapers/threads-search-scraper").call(run_input=run_input)

# Fetch and print Actor results from the run's dataset (if there are any)
print(f"💾 Check your data here: https://console.apify.com/storage/datasets/{run.default_dataset_id}")
for item in client.dataset(run.default_dataset_id).iterate_items():
    print(item)

# 📚 Want to learn more 📖? Go to → https://docs.apify.com/api/client/python/docs/quick-start

```

## CLI example

```bash
echo '{
  "searchQueries": [
    "nature"
  ]
}' |
apify call logical_scrapers/threads-search-scraper --silent --output-dataset

```

## MCP server setup

```json
{
    "mcpServers": {
        "apify": {
            "type": "http",
            "url": "https://mcp.apify.com/?tools=fetch-actor-details,logical_scrapers/threads-search-scraper"
        }
    }
}

```

The hosted server signs you in with OAuth on first connect, so no API token belongs in this config. Clients without OAuth support can send an `Authorization: Bearer <APIFY_API_TOKEN>` header instead, using a token from API & Integrations in Apify Console (https://console.apify.com/settings/integrations).

## OpenAPI specification

Download the OpenAPI definition: https://api.apify.com/v2/actors/NdVPGw4hZJN6XLoVb/builds/Q90OJjNIexoUXidHp/openapi.json
