# Threads Search Scraper: Keywords & Hashtags, No Login (`scrape-lads/threads-search-scraper`) Actor

Search Threads by keyword or hashtag without login. Get posts with text, author, likes, replies, reposts, quotes, media, hashtags and mentions as JSON, CSV or Excel. Date and engagement filters. $2 per 1,000 posts.

- **URL**: https://apify.com/scrape-lads/threads-search-scraper.md
- **Developed by:** [Scrape Lads](https://apify.com/scrape-lads) (community)
- **Categories:** Social media
- **Stats:** 1 total users, 1 monthly users, 100.0% runs succeeded, 1 bookmarks
- **User rating**: No ratings yet

## Pricing

from $2.40 / 1,000 posts

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?

An Actor is a serverless cloud program that runs on the Apify platform. It has two run modes.
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.

Apify vocabulary and the platform model are defined once, in the agent quickstart at https://apify.com/agents.md.

## 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.

Do not guess an integration path. Every one of them is in the agent quickstart at https://apify.com/agents.md: the Apify MCP server, Agent Skills with the Apify CLI, the JavaScript and Python clients, the REST API, and the account-free path for an agent with no human to sign in. It also carries the rule on stating cost before the first paid run.

For examples already wired to this Actor's own input schema, see the [API](#api) section below.

Each client library has reference documentation the quickstart does not restate: [JavaScript/TypeScript](https://docs.apify.com/api/client/js/docs.md) (`npm install apify-client`) and [Python](https://docs.apify.com/api/client/python/docs.md) (`pip install apify-client`).

# README

### What does Threads Search Scraper do?

**Threads Search Scraper** lets you **search Threads by keyword** or hashtag and download the matching public posts as structured data. It reads [Threads](https://www.threads.com) the way a logged-out visitor does: no login, no cookies, no account of yours at risk. Each row has the post text, author, date, likes, replies, reposts, quotes, media URLs, hashtags, mentions and the keyword that found it. Run it from the Apify Console or call it as a **Threads posts API**, schedule it, and send results to Google Sheets, Zapier, Make, webhooks or your own database.

### What data can you extract from Threads?

| 📝 Post text | 🔗 Post URL | 📅 Created at |
|---|---|---|
| ❤️ Likes | 💬 Replies | 🔁 Reposts |
| 🗨️ Quotes | 🖼️ Images | 🎬 Videos |
| #️⃣ Hashtags and topic tag | 🏷️ Mentions | 🔗 Links |
| 👤 Author username and name | ✅ Verified | 👥 Author followers |
| 🪪 Author bio | 🖼️ Profile picture | 🔍 Search keyword |

### Why use Threads Search Scraper?

- **Brand and social listening:** track what people say about your brand, product or competitor.
- **Trend and hashtag research:** a **Threads hashtag scraper** for campaigns, creators and niches.
- **Lead and creator discovery:** find authors posting about a topic, with optional follower count and bio.
- **AI and research datasets:** clean, deduplicated post text with timestamps and engagement.
- **Cheap and predictable:** pay per post, no subscription.

### How to scrape Threads search results

1. Open the Actor and add one or more keywords, phrases or #hashtags under **Keywords or hashtags**.
2. Choose **Top** or **Recent**, and set **Max posts per search**.
3. Optional: add a date range, minimum likes, exclude replies, or turn on author details.
4. Click **Start**. Download the dataset as JSON, CSV, Excel or HTML, or read it through the API.

### How deep does it go?

Threads shows a logged-out visitor one page of about 15 to 20 posts per search, and never offers a second page. This Actor reads three different search pages for each term (top, fresh and topic tags) and re-reads the ones that change, which gives **about 30 to 65 distinct posts per keyword**. Searching several variants of a topic (`coffee`, `#coffee`, `espresso`) widens coverage, and the Actor removes duplicates across searches. Threads' own date and recent filters are not available without a login, so the date filter here is applied to the posts Threads returns.

### Input

| Field | What it does |
| --- | --- |
| Keywords or hashtags | Words, phrases, #hashtags, or a pasted threads.com search URL |
| Sort | Top, or Recent (starts with fresh posts, sorted newest first) |
| Max posts per search / per run | Caps; a run also stops at your maximum cost limit |
| Posted after / before | `2026-10-01`, an ISO time, or `7 days`, `12 hours` |
| Only posts that contain the keyword | Drops related posts that do not contain your words |
| Exclude replies, Minimum likes | Quality filters |
| Add author follower count and bio | Opens each unique author's profile (extra charge per author) |

Posts removed by a filter are never charged.

### Output

```json
{
    "id": "4007921579689875771",
    "url": "https://www.threads.com/@jess_vanderkuyp/post/Dee_3EdCZk7",
    "text": "What I baked today\n#sourdough",
    "createdAt": "2026-10-14T10:11:45.000Z",
    "authorUsername": "jess_vanderkuyp",
    "authorName": "Jessica van der Kuyp",
    "authorVerified": false,
    "authorFollowers": 131,
    "likes": 65,
    "replies": 8,
    "reposts": 0,
    "quotes": 0,
    "mediaType": "carousel",
    "images": ["https://..."],
    "hashtags": ["sourdough"],
    "mentions": [],
    "keyword": "sourdough",
    "keywordInText": true
}
```

You can download the dataset in various formats such as JSON, HTML, CSV, or Excel.

| Field | Meaning |
| --- | --- |
| id, code, url | Post identifiers and link |
| text, createdAt | Post text and UTC publish time |
| authorUsername, authorName, authorVerified, authorId, authorUrl | The author |
| authorFollowers, authorBio | Only with author details on |
| likes, replies, reposts, quotes | Engagement when read |
| mediaType, images, videos | text, image, video or carousel, with URLs (they expire after some days) |
| hashtags, mentions, links, topicTag | Entities in the post and Threads' topic tag |
| isReply, replyToUsername, quotedPostUrl | Conversation context |
| keyword, keywordInText, searchSurface | The search that found it, whether the text contains it, and which page |

Threads does not show view counts to logged-out visitors, so there is no views field.

### How much does it cost to scrape Threads?

Pay per event: **$3 per 1,000 posts**, plus $0.001 per unique author when author details are on (no run-start fee). 1,000 posts cost about $3.00. A single keyword with 50 posts costs about $0.15. Runs on the Apify free plan work within the monthly credit.

### Tips

- Use several related keywords and hashtags rather than one broad one.
- Turn on **Only posts that contain the keyword** for strict brand monitoring.
- Schedule daily runs with **Recent** to collect new posts over time.
- Memory is capped at 512 MB, and the default of 256 MB is enough.

### Run it on a schedule

Save your input as a task, then open **Schedules** in Apify Console and pick how often it runs. Daily keeps a brand or trend watch current. Each run creates a new dataset, so you can compare runs over time.

To send results somewhere automatically, use the **Integrations** tab: Google Sheets, Slack, Make, Zapier, n8n and webhooks are built in. AI agents such as Claude or ChatGPT can run it as a tool through the [Apify MCP server](https://mcp.apify.com).

### Related actors

| Actor | What it does |
| --- | --- |
| [Reddit Scraper](https://apify.com/scrape-lads/reddit-scraper) | Reddit posts, comments, search results and users. |
| [TikTok Scraper Pro](https://apify.com/scrape-lads/tiktok-scraper-pro) | TikTok hashtags, profiles, keyword search, comments and followers. |
| [Instagram Scraper](https://apify.com/apify/instagram-scraper) | Instagram posts, profiles, hashtags and comments. |
| [Tweet Scraper V2](https://apify.com/apidojo/tweet-scraper) | Tweets from X by search, profile or list. |
| [Video Transcript Scraper](https://apify.com/scrape-lads/video-transcript-scraper) | Transcripts from TikTok, Instagram, YouTube and X videos. |

### FAQ, limits and support

**Is it legal?** It collects only public posts that any visitor can see. You are responsible for using the data in line with Threads' terms and privacy laws such as GDPR.

**Why fewer posts than I asked for?** Threads limits logged-out search depth (see above). The run summary in the key-value store shows pages read and posts seen per search.

**Can it scrape profiles or replies?** Not in this version. Found a problem or want a field added? Open an Issue on the Actor's Issues tab; custom versions are available on request.

**Does Threads have an official API? Why use this instead?** Meta's Threads API only works for accounts that log in to your app, and its keyword search is limited to approved apps. This Actor reads public Threads search results with no login or app review.

**What are the alternatives to this Actor?** You can search Threads by hand or use a social listening tool. Threads has no export, and most listening tools cover it poorly or charge monthly. This Actor gives you the raw posts for a keyword or hashtag and you pay only for what you collect.

### Privacy

To see which searches are useful, this Actor sends anonymous run inputs (such as keywords, hashtags and usernames) and a hashed account ID to the developer. Tokens, cookies and proxy settings are never sent. Nothing from your results is collected.

# Actor input Schema

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

Words, phrases or #hashtags to search on Threads, one per line. A pasted Threads search URL (threads.com/search?q=...) also works.

## `searchMode` (type: `string`):

Top keeps Threads' own ranking, starting with the most engaged posts. Recent starts with Threads' fresh results and sorts each search newest first.

## `maxPostsPerQuery` (type: `integer`):

Stop a search once this many posts pass your filters. Threads shows a logged-out visitor about 30 to 70 distinct posts per search, so values above 100 rarely add more.

## `maxPosts` (type: `integer`):

Total cap across all searches. The run stops when it is reached.

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

Keep only posts published on or after this date. YYYY-MM-DD (UTC), an ISO timestamp, or a relative value such as "7 days" or "12 hours". Posts outside the range are not charged.

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

Keep only posts published on or before this date (a bare date includes that whole day). Same formats as Posted after.

## `requireKeywordInText` (type: `boolean`):

Threads also returns related posts that do not contain your words. Turn this on to keep only posts whose text contains every search word (or the hashtag). Dropped posts are not charged.

## `excludeReplies` (type: `boolean`):

Skip posts that are replies to another post.

## `minLikes` (type: `integer`):

Skip posts with fewer likes than this.

## `includeAuthorDetails` (type: `boolean`):

Open each unique author's profile to add their follower count and bio. Charged once per unique author (see Pricing) and makes the run slower.

## `dedupeAcrossQueries` (type: `boolean`):

When two searches find the same post, keep it only once (under the first search).

## `maxConcurrency` (type: `integer`):

How many searches run at the same time.

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

Proxy used to reach Threads. The default works for most runs.

## Actor input object example

```json
{
  "searchQueries": [
    "ai agents",
    "#sourdough"
  ],
  "searchMode": "top",
  "maxPostsPerQuery": 50,
  "maxPosts": 1000,
  "requireKeywordInText": false,
  "excludeReplies": false,
  "minLikes": 0,
  "includeAuthorDetails": false,
  "dedupeAcrossQueries": true,
  "maxConcurrency": 3,
  "proxyConfiguration": {
    "useApifyProxy": true
  }
}
```

# Actor output Schema

## `results` (type: `string`):

No description

## `allFields` (type: `string`):

No description

## `runSummary` (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": [
        "coffee",
        "#booktok"
    ]
};

// Run the Actor and wait for it to finish
const run = await client.actor("scrape-lads/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": [
        "coffee",
        "#booktok",
    ] }

# Run the Actor and wait for it to finish
run = client.actor("scrape-lads/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": [
    "coffee",
    "#booktok"
  ]
}' |
apify call scrape-lads/threads-search-scraper --silent --output-dataset

```

## MCP server setup

```json
{
    "mcpServers": {
        "apify": {
            "type": "http",
            "url": "https://mcp.apify.com/?tools=fetch-actor-details,scrape-lads/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/bvTV5Xy4RrcLD4GeV/builds/dm8ngryStwQxYteQE/openapi.json
