# Threads Search Scraper: Posts by Keyword & Hashtag (`s_actors/threads-search-scraper`) Actor

Search Threads posts by keyword, phrase or #hashtag without login: newest first or top, any date range, one author only. Text, likes, replies, reposts, exact views, media, links. Only new posts since the last run for brand and topic monitoring.

- **URL**: https://apify.com/s_actors/threads-search-scraper.md
- **Developed by:** [Superior Actors](https://apify.com/s_actors) (community)
- **Categories:** Social media, Marketing, AI
- **Stats:** 6 total users, 4 monthly users, 67.6% runs succeeded, 1 bookmarks
- **User rating**: No ratings yet

## Pricing

from $1.99 / 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

### Threads Search Scraper: Posts by Keyword & Hashtag

Search **Threads posts by keyword, phrase or #hashtag** and export them to CSV, Excel or JSON: text, **likes, replies, reposts, quotes, shares**, the **exact view count**, engagement rate, posting time, **images and videos**, links, mentions, topic tags and the author. Get the **newest posts first** (Recent) or the **top posts** (Top), search **any past period** with a date range, search **one account's posts only**, keep posts with **minimum likes**, and get **only new posts** since the last run for brand and topic monitoring.

```json
{ "searchQueries": ["ai agents", "#marketing"], "sortBy": "recent", "maxPostsPerQuery": 500 }
```

No Threads or Instagram login, no cookies, no browser extension. Use it as a **Threads keyword search API**: one call returns clean JSON. Threads shows a visitor only about 20 results per search; this Actor pages back through time, so one search returns hundreds or thousands of posts (100 newest posts about "ai agents" in about 25 seconds).

#### What you get

One row per post. Real example, October 2026 (Top, "nasa artemis"):

| author | text | viewCount | likeCount | replyCount | repostCount | engagementRate | createdAt | mediaType |
|---|---|---|---|---|---|---|---|---|
| nasa | This is a Public Service Annnouncement! NASA does… | 1,171,851 | 64,461 | 1,200 | 2,366 | 5.83 | 2026-04-12 | text |
| nasaspaceflight_ig | LAUNCH! ARTEMIS II LAUNCHES WITH A CREW OF 4… | 559,682 | 12,884 | 217 | 1,021 | 2.56 | 2026-04-01 | video |
| barackobama | It was inspiring to watch the Artemis II launch… | 355,527 | 34,921 | 722 | 855 | 10.28 | 2026-04-02 | carousel |

| Field | Description |
|---|---|
| `searchQuery`, `sortBy`, `positionInSearch`, `input` | Which search found the post, Recent or Top, and its place in the results (1 = first) |
| `postId`, `postCode`, `postUrl`, `text`, `createdAt` | Post ID, short code, link, full text and exact posting time (UTC) |
| `viewCount` | **Exact** views from the post page (Threads shows them rounded, like 1.1M) |
| `likeCount`, `replyCount`, `repostCount`, `quoteCount`, `shareCount` | Likes, replies, reposts, quotes and shares |
| `engagementRate` | (likes + replies + reposts + quotes) / views, in % |
| `mediaType`, `imageUrl`, `imageUrls`, `videoUrls`, `mediaCount` | `text`, `image`, `video` or `carousel`; every image (the cover for videos) and video file |
| `links`, `linkPreviewTitle`, `linkPreviewDomain` | Links in the text and the link card, as real addresses (not `l.threads.com` redirects) |
| `mentions`, `hashtags`, `topicTag` | Mentioned @usernames, #hashtags in the text, and the post's topic tag (`AI Threads`) |
| `postType`, `isReply` | `post`, or `reply` when the matching post answers someone |
| `isQuote`, `quotedPostUrl`, `quotedPostAuthor`, `quotedPostText` | The post this one quotes |
| `isPinned`, `isEdited`, `isPaidPartnership`, `countsHidden` | Pinned, edited, paid partnership label, likes and views hidden by the author |
| `authorUsername`, `authorFullName`, `authorId`, `authorIsVerified`, `authorProfilePicUrl` | The author of the post |

A summary of every search (posts scraped, posts filtered out, errors) is in the run's **Output** tab → *Searches (JSON)*.

#### How it works

1. Add **search keywords**: words, phrases, `#hashtags` or Threads search links
2. Pick **Recent** or **Top**, set **Max posts per search** (`0` = all), optional dates and filters
3. Run, then download the dataset as CSV, Excel, JSON or HTML

| Input | What it does |
|---|---|
| **Search keywords** | Any number of searches, run in parallel; a post found by two searches is written and charged once |
| **Sort** | **Recent**: the newest matching posts, going back hour by hour. **Top**: the posts Threads ranks highest, first overall, then the top of each day going back |
| **Max posts per search** | Default 100, `0` = all that Threads gives |
| **Posted after / Posted before** | A date (`2026-01-01`) or a period (`24 hours`, `7 days`, `6 months`): search any past week, month or year |
| **Only posts by this profile** | Search inside one account's posts, like Threads' own `from:` filter |
| **Minimum likes / Skip replies** | Only popular posts; only original posts |
| **View counts** | On by default: exact views and engagement rate; off = faster runs |
| **Only new posts since the previous run** | For schedules: only posts published since the last check |

Posts left out by a filter are not charged.

#### Why this Actor

| | |
|---|---|
| 🔍 **Hundreds of posts per search, not 20** | Threads shows a visitor about 20 results; the Actor moves back through time and keeps going until your limit |
| 🕒 **Real newest-first and any past period** | Recent returns posts from the last minutes; a date range searches any week or month, even years back |
| 👤 **Search one account** | Find what a brand, creator or competitor said about a topic |
| 👁️ **Exact view counts** | Views from each post page, not rounded, with the engagement rate per post |
| 🔔 **Mention alerts** | Schedule it hourly: each run returns only new posts with your brand, product or hashtag; a run with nothing new costs only the start |
| 💰 **$2.49 per 1,000 posts** | Views, filters, dates and monitoring included, no start fee per GB, no add-ons |

#### Monitor keywords: only new posts

1. Add your brand, product names, competitors or hashtags
2. Keep **Sort** on Recent, turn on **Only new posts since the previous run**, save as a task and add a schedule, e.g. every hour
3. **First run** returns the latest posts and remembers the newest one. **Every later run** returns only posts published since then

What was seen is kept in your account (key-value store `threads-search-state`), per search, sort and author, and is shared by all your runs and tasks. Connect [Google Sheets](https://apify.com/s_actors/google-sheets-import-export), Slack or email with an integration to be notified.

#### Pricing

Pay per result, no subscription needed. Apify Scale and Business plans pay less:

| Event | Free and Starter plans | Scale plan | Business plan |
|---|---|---|---|
| Run start | $0.001 | $0.001 | $0.001 |
| Post in the results | $0.00249 | $0.002241 | $0.001992 |

| Task | Cost |
|---|---|
| 100 newest posts about one keyword | ~$0.25 |
| 1,000 posts with a hashtag | ~$2.49 |
| Top posts of 10 keywords, 50 each (500 posts) | ~$1.25 |
| Hourly mention alert for 5 keywords for a month | ~$0.72 + $0.00249 per new post |

Posts left out by filters and searches that find nothing are not charged.

#### Ready-made tasks

Open it, change the keywords, and run:

| Task | What you get |
|---|---|
| [Search Threads Posts by Keyword Without an Account](https://apify.com/s_actors/threads-search-scraper/examples/search-threads-posts-by-keyword-without-account) | The newest posts for your keywords with views, likes and replies |

#### FAQ

**How many posts can one search return?** As many as Threads has for it. Busy keywords (`ai`, `#marketing`) give thousands; rare ones give what exists. Recent goes back hour by hour, Top day by day; `0` = all that Threads gives.

**Is it the same as the Threads search?** Yes, the results are Threads' own search results (Threads also matches topic tags and close forms of a word, so a few posts may not contain the exact keyword). Without login the website shows only the first ~20; the Actor gets the rest by moving back through time.

**Why is `viewCount` empty for some posts?** Threads counts views a few minutes after a post is published, so very fresh posts have no views yet. Accounts can also hide likes and views (`countsHidden` is true).

**Can I search hashtags?** Yes: write `#marketing`. A plain word finds posts with the word and with the hashtag.

**Do I need a Threads or Instagram account or cookies?** No. The Actor uses the public search the way the Threads website does for a visitor.

**How long do the image and video links work?** `imageUrls` and `videoUrls` are Threads' own CDN links and expire after a few days: download the files you need soon after the run.

#### Use with the API and AI agents

Run it via the [Apify API](https://docs.apify.com/api/v2) from Python, Node.js or any HTTP client, or connect it to Claude, ChatGPT and other AI agents through the [Apify MCP server](https://mcp.apify.com): "What are people on Threads saying about our new product this week, and which posts got the most views?"

#### Other Threads tools

| Tool | What it does |
|---|---|
| [Threads Scraper](https://apify.com/s_actors/threads-scraper) | All posts, views and profiles of Threads accounts |
| [Threads Replies Scraper](https://apify.com/s_actors/threads-replies-scraper) | All replies under Threads posts |
| [TikTok Profile Scraper](https://apify.com/s_actors/tiktok-profile-scraper) | All videos and stats of TikTok profiles |
| [YouTube Channel Scraper](https://apify.com/s_actors/youtube-channel-scraper) | Exact views, subscribers and all videos of YouTube channels |
| [Telegram Channel Analytics](https://apify.com/s_actors/telegram-channel-analytics) | Subscribers, reach and ads of Telegram channels |
| [Google Sheets Import & Export](https://apify.com/s_actors/google-sheets-import-export) | Send the posts to a Google Sheet |

#### Is it legal?

The Actor collects only public posts and stats that Threads shows to any visitor in its search, without logging in. Posts are their authors' content: respect copyright when you reuse texts and images, and use personal data such as usernames in line with GDPR and other privacy laws.

# Actor input Schema

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

One per line: a keyword, a phrase, a #hashtag or a Threads search link (threads.com/search?q=...). Each search is run separately; a post found by two searches is written and charged once.

## `sortBy` (type: `string`):

Recent = the newest matching posts, going back hour by hour (best for monitoring and brand mentions). Top = the posts Threads ranks highest: first the overall top, then the top of each day going back (best with a date range).

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

How many posts to scrape for each search. 0 = all that Threads gives (up to a few thousand for busy keywords; rare keywords have fewer posts).

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

Only posts published after this: a date like 2026-01-01 or a period like 24 hours, 7 days, 2 weeks, 6 months (ago). The search stops there.

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

Only posts published before this: a date like 2026-03-01 or a period like 30 days (ago). Together with Posted after = search any past period.

## `fromAuthor` (type: `string`):

Optional: search only one account's posts (@username, a username or a profile link), like Threads' own "from:" filter.

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

Only posts with at least this many likes. Leave empty for all.

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

Leave out matching posts that are replies to someone else's post (keep only original posts).

## `includeViews` (type: `boolean`):

Exact view count of each post (and the engagement rate from it). Threads shows views only on the post page, so the Actor reads the start of each page: about 0.2 seconds per post. Turn off for the fastest runs.

## `onlyNewPosts` (type: `boolean`):

Recent: output only posts newer than the newest post of the previous run for the same search and author (key-value store threads-search-state); the search stops there. Top: only posts no earlier run delivered. The first run outputs posts as usual and remembers them. A run with no new posts costs only the start.

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

How many searches run in parallel. Each search pages back on its own (12-20 posts a call).

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

Requests go direct first and switch to Apify datacenter proxies (then residential) when Threads refuses them. The default works for most runs.

## `debugLog` (type: `boolean`):

Log every retried request (for troubleshooting).

## Actor input object example

```json
{
  "searchQueries": [
    "ai agents",
    "#marketing"
  ],
  "sortBy": "recent",
  "maxPostsPerQuery": 30,
  "excludeReplies": false,
  "includeViews": true,
  "onlyNewPosts": false,
  "maxConcurrency": 3,
  "proxyConfiguration": {
    "useApifyProxy": true
  },
  "debugLog": false
}
```

# Actor output Schema

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

Every matching post: search, author, text, views, likes, replies, reposts, quotes, shares, engagement, date, media.

## `searches` (type: `string`):

One line per search: posts scraped, posts filtered out, search calls, errors.

## `all` (type: `string`):

Every field of every row.

# 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": [
        "ai agents",
        "#marketing"
    ],
    "maxPostsPerQuery": 30
};

// Run the Actor and wait for it to finish
const run = await client.actor("s_actors/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": [
        "ai agents",
        "#marketing",
    ],
    "maxPostsPerQuery": 30,
}

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

```

## MCP server setup

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