# Threads Scraper - Posts, Profiles & Search (`futurizerush/meta-threads-scraper`) Actor

Best Threads scraper for public posts, profiles, and account discovery. Search keywords or usernames and collect posts, profiles, and view counts for research, lead generation, and monitoring.

- **URL**: https://apify.com/futurizerush/meta-threads-scraper.md
- **Developed by:** [Rush](https://apify.com/futurizerush) (community)
- **Categories:** Social media, AI, Agents
- **Stats:** 1,570 total users, 303 monthly users, 47.6% runs succeeded, 29 bookmarks
- **User rating**: 3.76 out of 5 stars

## Pricing

from $4.00 / 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/platform/actors/running/actors-in-store#pay-per-event

## What's an Apify Actor?

Actors are a software tools running on the Apify platform, for all kinds of web data extraction and automation use cases.
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.

In JavaScript/TypeScript projects, use official [JavaScript/TypeScript client](https://docs.apify.com/api/client/js.md):

```bash
npm install apify-client
```

In Python projects, use official [Python client library](https://docs.apify.com/api/client/python.md):

```bash
pip install apify-client
```

In shell scripts, use [Apify CLI](https://docs.apify.com/cli/docs.md):

````bash
# MacOS / Linux
curl -fsSL https://apify.com/install-cli.sh | bash
# Windows
irm https://apify.com/install-cli.ps1 | iex
```bash

In AI frameworks, you might use the [Apify MCP server](https://docs.apify.com/platform/integrations/mcp.md).

If your project is in a different language, use 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 Scraper - Posts, Profiles & Search

Turn public Threads activity into a clean dataset for social listening, influencer research, lead generation, and competitor analysis. Collect posts from accounts, search public conversations by keyword or hashtag, or discover matching profiles without requiring a Threads login.

> **Note**: Threads can change what it shows publicly. Start with a small sample for a new account or keyword, then scale once the output matches your needs.

### What It Helps You Do

- Monitor public Threads topics, brands, competitors, and campaigns
- Build creator, prospect, or account lists from public profile information
- Compare public engagement across posts, keywords, and accounts
- Export post, profile, media, contact, and conversation fields for analysis

### Choose Your Workflow

| Goal | Use this mode | What you enter |
|---|---|---|
| Collect posts from one or more accounts | `user` | Threads usernames or profile URLs |
| Search public posts by topic | `search` | Keywords or hashtags |
| Discover account matches by keyword | `profiles` | Keywords, niches, or local phrases |
| Monitor fresh public mentions | `search` + `recent` | Brand, topic, or competitor keywords |
| Research a time window | `search` + date filters | Keyword plus start/end date |

### Use Cases

- **Social Media Monitoring**: Track brand mentions and conversations
- **Influencer Discovery**: Find content creators with follower metrics
- **Competitor Research**: Monitor competitor activity and engagement
- **Content Analysis**: Analyze trending topics and hashtags
- **Lead Generation**: Discover profiles in your niche
- **Market Research**: Collect posts for downstream sentiment analysis

### How To Use

#### Input Configuration

| Parameter | Type | Description | Example |
|-----------|------|-------------|---------|
| `mode` | string | Scraping mode: `user`, `search`, or `profiles` | `"user"` |
| `usernames` | array | Target usernames (for user mode, max 20). Accepts bare name, with `@`, or full Threads URL. | `["zuck", "@nike", "https://threads.com/@meta"]` |
| `keywords` | array | Keywords or hashtags (for search & profiles modes, max 20) | `["AI", "tech"]` |
| `search_filter` | string | Search mode only. `top` shows popular posts. `recent` shows newest matching public posts first; some older related posts may still appear. | `"top"` |
| `start_date` | string | Search mode only. Show posts from this date onward (YYYY-MM-DD or "7 days") | `"2026-01-01"` |
| `end_date` | string | Search mode only. Show posts up to this date (inclusive). Use an absolute date for clarity. | `"2026-02-28"` |
| `max_posts` | number | Results per user or keyword. In User Posts, high limits need enough public posts on that account. In Search, this is a cap and available public results may be lower. In Find Profiles, this means public account matches per keyword and is capped at 10; some keywords may return fewer. | `50` |

Note: Date options and sort order are only for **Search** mode. If you use date filters in **User Posts** or **Find Profiles**, the run will stop and show a clear reminder.

#### Mode 1: Scrape User Posts (with Profile Data)

Extract posts and available public profile information from a specific user:

```json
{
  "mode": "user",
  "usernames": ["zuck"],
  "max_posts": 50
}
````

##### Optional: flag a user's posts by keyword

Add `keywords` in User Posts mode to flag which returned posts mention your terms. Posts are **not** removed; each row gets a `keyword_match` value you can filter later.

```json
{
  "mode": "user",
  "usernames": ["zuck"],
  "keywords": ["AI"],
  "max_posts": 100
}
```

##### Batch Scraping Multiple Users

Scrape posts from multiple users in one run (up to 20 usernames):

```json
{
  "mode": "user",
  "usernames": ["zuck", "instagram", "nike"],
  "max_posts": 50
}
```

This returns:

- Each user's bio and follower count
- Contact information extracted from bio (emails, phones, links)
- Recent public posts with engagement metrics when publicly available (likes, replies, reposts, shares, views)
- Profile verification status
- Media attachments
- Mentions and hashtags

#### Mode 2: Search Posts by Keyword or Hashtag

Find public posts about a keyword or hashtag. Result volume depends on what Threads shows publicly for that term at run time.

> **Tip**: Include or omit the `#` — both `AI` and `#AI` work. Very specific or cross-language phrases may return fewer public results, so try a shorter focused term when you need a larger result set.

##### Understanding Search Filters

| Filter | Best For | What You Get |
|--------|----------|--------------|
| **Top** (`top`) | Discovering viral content | Popular posts with high engagement |
| **Recent** (`recent`) | Monitoring new activity | Newest matching public posts first; some older related posts may still appear |

##### Top/Popular Posts

```json
{
  "mode": "search",
  "keywords": ["artificial intelligence", "#startup"],
  "search_filter": "top",
  "max_posts": 50
}
```

##### Recent Posts

```json
{
  "mode": "search",
  "keywords": ["AI"],
  "search_filter": "recent",
  "max_posts": 50
}
```

#### Mode 3: Find Profiles (Discover Account Matches by Keyword)

Discover public Threads **account matches** for a keyword. Each keyword can return up to 10 accounts with public profile fields such as follower count, bio when present, links, and extracted contacts. Some keywords may return fewer than 10. Use related keywords to discover more accounts.

```json
{
  "mode": "profiles",
  "keywords": ["coffee roaster", "specialty coffee"],
  "max_posts": 10
}
```

Output rows are **account profiles** (not posts), with key fields such as `username`, `display_name`, `bio`, `followers_count`, `is_verified`, `profile_url`, `external_links`, `emails`, `phones`, and `search_keyword`. Empty bio/contact fields usually mean the account did not publish that information.

Every row includes `record_type`: `post` for User Posts/Search rows and `profile` for Find Profiles rows.

> **Local search tip**: For local account discovery, include the place name in the keyword (e.g. `台北 餐廳` rather than only `餐廳`). The keyword itself helps narrow the matching accounts.

#### Periodic Topic Monitoring

If you want to monitor keywords on a schedule — for lead generation, brand-mention tracking, or competitor monitoring — pair `mode: "search"` with `search_filter: "recent"` and run the actor automatically:

```json
{
  "mode": "search",
  "keywords": ["YOUR_KEYWORD_1", "YOUR_KEYWORD_2"],
  "search_filter": "recent",
  "max_posts": 30
}
```

**Suggested workflow**

1. **Schedule the actor** — Use [Apify Schedules](https://docs.apify.com/platform/schedules) to trigger regular runs.
2. **Review each run's dataset** — every post includes a unique identifier and timestamp.
3. **Handle your own downstream workflow**:
   - Deduplicate against your existing database using each post's unique identifier
   - Optionally filter by post timestamp to keep entries within your time window
   - Trigger your automation on new posts (AI reply drafting, Slack/email notifications, etc.)
   - Append new entries to your database / Google Sheet

**Tips**

- Each run returns a finite batch of matching public posts. For high-volume keywords, review the returned timestamps and adjust your schedule to match your monitoring needs.
- The actor does **not** perform cross-run deduplication — this is intentional, so you keep full control over data retention and storage.

#### Date Filtering (Search Mode Only)

Filter search results by date range. Supports absolute dates and relative dates.
Only posts within your selected date range are kept.
Date filters apply to Search mode only — using them in other modes stops the run with a clear reminder.

```json
{
  "mode": "search",
  "keywords": ["AI"],
  "search_filter": "top",
  "start_date": "2026-01-01",
  "end_date": "2026-02-28",
  "max_posts": 100
}
```

```json
{
  "mode": "search",
  "keywords": ["AI"],
  "start_date": "7 days",
  "max_posts": 50
}
```

### Output Format

#### Viewing Your Data

Use the dataset views to quickly inspect posts, profiles, engagement fields, or contact fields. Switch to "All fields" when you need the complete record.

- 🧵 **Posts**: post content, dates, media, author, and search fields
- 📊 **Engagement**: likes, replies, reposts, shares, views, and analysis flags
- 👥 **Profiles**: accounts found in Find Profiles mode
- 🔗 **Contacts**: public profile links and contact fields

#### Complete Post Record Example

Each post is saved as a separate record. Below is an illustrative example of the fields from **user mode**. The account, URL, text, dates, and numbers are fictional placeholders.

```json
{
  "record_type": "post",
  "post_url": "https://www.threads.com/@example_creator/post/EXAMPLE01",
  "post_code": "EXAMPLE01",
  "text_content": "Launching a new research note today...",
  "created_at": "2026-01-12T18:00:30+00:00",
  "created_at_display": "2026-01-12 18:00 UTC",
  "created_at_timestamp": 1768240830,
  "like_count": 268,
  "reply_count": 81,
  "repost_count": 12,
  "quote_count": 4,
  "share_count": 22,
  "view_count": 41651,
  "has_media": false,
  "media_type": "text",
  "media_url": "",
  "media_urls": [],
  "media_width": null,
  "media_height": null,
  "has_audio": null,
  "is_ai_generated": false,
  "is_gif": false,
  "is_sticker_post": false,
  "sticker_count": 0,
  "sticker_ids": [],
  "sticker_urls": [],
  "hashtags": [],
  "mentions": [],
  "urls": [],
  "is_pinned": false,
  "is_edited": false,
  "is_paid_partnership": false,
  "accessibility_caption": "",
  "is_reply": false,
  "reply_to_username": "",
  "reply_control": "everyone",
  "is_quote_post": false,
  "quoted_post_url": "",
  "is_repost": false,
  "reposted_post_url": "",
  "is_spoiler": false,
  "language": "",
  "topic_tag": "",
  "location_name": "",
  "location_id": "",
  "link_title": "",
  "mentioned_users": [],
  "scraped_at": "2026-04-25T10:00:00+00:00",
  "username": "example_creator",
  "display_name": "Example Creator",
  "profile_url": "https://www.threads.com/@example_creator",
  "is_verified": true,
  "followers_count": 54000,
  "bio": "Research notes and product updates",
  "profile_pic_url": "https://...",
  "profile_pic_hd_url": "https://...",
  "fediverse_enabled": true,
  "external_links": ["https://example.com"],
  "emails": [],
  "phones": [],
  "bio_links": [],
  "profile_tags": ["AI", "Tech"],
  "podcast_name": "",
  "podcast_url": "",
  "podcast_platform": "",
  "search_filter": null,
  "search_keyword": null,
  "keyword_match": null
}
```

> In User Posts mode, `search_keyword`, `search_filter`, and `keyword_match` are always present so the columns line up with Search mode. `search_filter` stays `null` (it applies only to Search); `search_keyword` and `keyword_match` are `null` unless you supply `keywords` to tag matching posts.

#### Short Example: Reply + Quote + Sponsored Signal

An illustrative fictional record showing the conversation-context and partnership fields populated together (abbreviated — only selected fields shown; every record carries the full field set from Sample 1):

```json
{
  "record_type": "post",
  "post_url": "https://www.threads.com/@example_brand/post/EXMPL_REPLY01",
  "post_code": "EXMPL_REPLY01",
  "text_content": "Loved the new collab piece — wearing it tomorrow!",
  "created_at": "2026-04-22T14:30:00+00:00",
  "like_count": 412,
  "reply_count": 23,
  "repost_count": 9,
  "view_count": 18750,
  "is_paid_partnership": true,
  "accessibility_caption": "Athletic shoe in red colorway on a wooden surface",
  "media_width": 1200,
  "media_height": 1600,
  "has_audio": null,
  "is_ai_generated": false,
  "is_reply": true,
  "reply_to_username": "athleteX",
  "reply_control": "followers_only",
  "is_quote_post": true,
  "quoted_post_url": "https://www.threads.com/@brandY/post/QUOTED_ORIG",
  "is_repost": false,
  "reposted_post_url": "",
  "username": "example_brand",
  "display_name": "Example Brand",
  "is_verified": true,
  "followers_count": 1250000,
  "fediverse_enabled": true
}
```

**Search mode** post rows include three additional fields:

- `search_keyword`: the searched keyword or hashtag
- `search_filter`: the sort order used (top or recent)
- `keyword_match`: whether the post text directly matches the searched term

Use `keyword_match: true` to filter for posts whose caption clearly mentions your keyword. In Search mode, author profile fields are included when public profile data is available.

### Example Use Cases

#### 1. Competitor Analysis with Engagement Metrics

```json
{
  "mode": "user",
  "usernames": ["competitor_brand_a", "competitor_brand_b"],
  "max_posts": 100
}
```

Pull a deep post history with engagement metrics when publicly available (likes, replies, reposts, quotes, shares, views) for side-by-side competitor analysis. Each post also carries sponsored-content, quote/repost, and reply-context flags so you can slice organic vs paid content quickly.

#### 2. Influencer Discovery

```json
{
  "mode": "user",
  "usernames": ["creator_a", "creator_b", "creator_c"],
  "max_posts": 50
}
```

Collect profile fields (bio, followers, tags, podcast link, contact info from bio) plus recent posts to build an influencer shortlist in one run. The Fediverse and verified indicators are included when publicly shown.

#### 3. Brand Mention Monitoring

```json
{
  "mode": "search",
  "keywords": ["#YourBrand", "#CompetitorBrand"],
  "max_posts": 50
}
```

Follow brand and competitor conversations. Each row includes a `keyword_match` flag so you can separate direct matches from broader context.

#### 4. Trend & Content Research (Search, Top)

```json
{
  "mode": "search",
  "keywords": ["AI tools", "machine learning"],
  "search_filter": "top",
  "max_posts": 50
}
```

Discover high-engagement posts on topic keywords. The paid-partnership flag lets you isolate sponsored content; quote/repost URLs let you map conversation graphs.

#### 5. Date-bounded Research (Search with Date Filter)

```json
{
  "mode": "search",
  "keywords": ["climate policy"],
  "search_filter": "top",
  "start_date": "30 days",
  "max_posts": 50
}
```

Narrow a topic to the last 30 days for time-sensitive research. Date filtering is available only in Search mode.

### Notes

**Input limits**:

- Up to 20 usernames or 20 keywords per run
- `max_posts` accepts 10–10000 per user or search keyword. Find Profiles returns up to 10 accounts per keyword.

**Result availability**:

- Result volume depends on public availability, account activity, topic activity, and Threads' current public results behavior
- Different modes and queries can return different amounts; if a run looks lighter than expected, check **Run Results**, then broaden the query or adjust the search/filter
- In a batch run, one username or keyword can fail while others still save results. Check **Run Results** for `failed_items` and `failed_reasons` to see what should be retried and why.

**Search Relevance**:

- Threads search ranking does not guarantee exact keyword-only matching
- "Top" mode surfaces popular results and may include broadly related content
- "Recent" mode lists the newest matching public posts first, but older related posts may still appear
- In `search` mode, results are returned on a best-effort basis from what is publicly available
- Use `keyword_match` to quickly separate direct matches from broader context results
- For a tighter date window, combine `search` with `start_date` / `end_date`; only posts inside your range will be kept

**When You Get Few or No Results**:

This actor works *without logging in*, so it can return only content that Threads exposes publicly.

What this means in practice:

- **Niche / uncommon keywords** may return very few or zero results — even when you see those posts while logged in
- **Broader single keywords** often return more public results than highly specific phrases
- If a niche multi-word phrase returns 0, try a shorter or more common term
- A run that returns 0 rows ends as **SUCCEEDED** (not failed) with a clear "no public posts found" status message — try a broader or more popular keyword, or adjust the search/filter

If you specifically need content that is visible only inside your own logged-in account, this actor is not the right tool.

### FAQ

**Q: What engagement metrics can I get?**
A: The scraper extracts likes, replies, reposts, quotes, shares, and views when publicly available. On some posts, `share_count` and `view_count` can be `null`.

**Q: How does contact information extraction work?**
A: Contact extraction is best effort and depends on the public bio text and profile links. It does not read text inside images or on linked pages.

**Q: How do I see all available data fields?**
A: In the Apify console, switch from "Preview" to "All fields" view. You will see the full schema, including fields that may be `null` for some records.

**Q: Does it support batch scraping of multiple users or keywords?**
A: Yes. You can enter up to 20 usernames or 20 keywords in one run. Results are combined into the same dataset.

**Q: Can I tell which posts are sponsored / paid partnerships?**
A: Every post includes an `is_paid_partnership` field. `true` means a paid-partnership or branded-content signal is publicly shown for that row. `false` means that signal was not present in the public data returned for that row.

**Q: Can I see quote posts and reposts, and the original they reference?**
A: Yes, when that relationship is present in the returned public data. `is_quote_post` + `quoted_post_url` mark quotes; `is_repost` + `reposted_post_url` mark reposts.

**Q: Can I distinguish top-level posts from replies?**
A: Yes, when reply context is present in the returned public data. `is_reply` marks replies, `reply_to_username` shows who is being replied to, and `reply_control` reflects the reply-audience setting when available.

**Q: What about image alt text and media size?**
A: When available, `accessibility_caption` returns the image description and `media_width` / `media_height` return the original pixel dimensions.

**Q: Can I tell if a post is AI-generated or whether a video has sound?**
A: `is_ai_generated` is true when the post carries an AI-content label, false when the checked public post has no such label, and null when it cannot be determined. `has_audio` is true/false for checked video posts and null for non-video posts or unavailable detail.

**Q: Is there a Fediverse / ActivityPub signal?**
A: Yes. `fediverse_enabled` is true when a Fediverse sharing indicator is publicly shown on the profile; otherwise it is false or null, depending on whether profile details were available for that row.

**Q: Do I need to choose between hashtag and full-text search?**
A: No. Enter your keyword with or without `#`, then pick a `top` or `recent` sort order. Results depend on what Threads makes publicly available.

**Q: How does Find Profiles work, and how many accounts can it return?**
A: Find Profiles (`mode: "profiles"`) returns up to 10 public account matches per keyword with profile fields such as follower count, bio when present, links, and contacts. Some keywords may return fewer than 10. To reach more accounts, use several related keywords.

**Q: How can I find local accounts?**
A: Put the place name directly in the keyword (e.g. `台北 餐廳`) so the search phrase itself narrows the matching accounts. Geo-targeting is not supported.

**Q: Why do search results seem unrelated to the keyword?**
A: Threads search ranking is not strict keyword-only matching. Results can include broadly related content and sometimes unrelated content. Use `keyword_match` to separate direct matches in downstream filtering.

**Q: Why do I get fewer results than my max\_posts limit?**
A: The actual number of available public posts varies by account, keyword, date range, and Threads' current public results behavior.

**Q: Why are bio or follower\_count sometimes empty in Search mode?**
A: Some accounts expose limited public profile fields in search results. When a field is not publicly available for that account at run time, it may be empty.

### Need Another Threads Workflow?

- [Threads Scraper - Posts, Profiles & Search](https://apify.com/futurizerush/meta-threads-scraper?fpr=rush): collect public posts, search keywords, discover profiles, and export account data.
- [Threads Replies Scraper](https://apify.com/futurizerush/threads-replies-scraper?fpr=rush): collect public replies and comments for conversation analysis.

### Disclaimer

This Actor is provided for research and educational purposes. You are solely responsible for how you use it and for ensuring that your use of the Actor and any data it returns complies with all laws and regulations applicable to you. Data availability and accuracy may vary over time. The developers accept no liability for how this tool or the data it returns is used.

***

**Keywords**: Threads scraper, Threads search scraper, Threads data scraper, Meta Threads scraper, Threads post extractor, Threads profile scraper, Threads hashtag search, Threads keyword search, Threads search without login, Threads data extraction, export Threads posts, download Threads data, Threads exporter, Threads posts, Threads engagement metrics, follower count scraper, Threads bio email extractor, Threads account finder, influencer discovery, Threads influencer research, social media scraper, social media monitoring, brand monitoring, competitor analysis, competitor intelligence, trend research, content research tool, social listening tool, market research, Instagram Threads, public Threads data, Threads automation, Threads search, OpenClaw, Claude Code, Gemini CLI, Antigravity, Codex, ChatGPT

# Actor input Schema

## `mode` (type: `string`):

Pick one, then fill the matching field below:
• 👤 User Posts → fill 👤 Usernames — public posts from listed accounts.
• 🔎 Search → fill 🏷️ Keywords — public posts about your keywords or hashtags.
• 👥 Find Profiles → fill 🏷️ Keywords — public account matches for your keywords. Tip: add a place name, e.g. '台北 餐廳', for local account discovery.

## `usernames` (type: `array`):

Required in 👤 User Posts mode (ignored in other modes). One or more Threads usernames — bare name (zuck), @-prefixed (@zuck), or full URL (https://threads.com/@zuck or https://threads.net/@zuck).

## `keywords` (type: `array`):

Use in 🔎 Search and 👥 Find Profiles mode. The # is optional, e.g. 'AI', 'tech', '台北 餐廳'. Optional in 👤 User Posts mode: adds a keyword\_match flag without dropping posts.

## `max_posts` (type: `integer`):

Per user or keyword. Multiple inputs are processed separately and combined into one dataset. In 👤 User Posts: up to 10000 when the account has enough public posts. In 🔎 Search: this is a cap over the public results available at run time; actual results may be lower. In 👥 Find Profiles: up to 10 public account matches per keyword; actual results may be lower.

## `search_filter` (type: `string`):

Only used in 🔎 Search mode. 'Top' shows popular posts. 'Recent' shows the newest matching public posts first; some older related posts may still appear.

## `start_date` (type: `string`):

Used in 🔎 Search mode to show posts from this date onward. Supports YYYY-MM-DD or relative values such as '7 days' and '1 month'. Leave empty in other modes — a date set there will stop the run with a reminder.

## `end_date` (type: `string`):

Used in 🔎 Search mode to show posts up to this date (inclusive). YYYY-MM-DD is recommended for clarity. Relative values such as '7 days' mean that long ago. Leave empty in other modes — a date set there will stop the run with a reminder.

## Actor input object example

```json
{
  "mode": "user",
  "usernames": [
    "zuck"
  ],
  "max_posts": 50,
  "search_filter": "top"
}
```

# Actor output Schema

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

Scraped results — posts (User Posts / Search) or accounts (Find Profiles)

# 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 = {
    "mode": "user",
    "usernames": [
        "zuck"
    ],
    "max_posts": 50,
    "search_filter": "top"
};

// Run the Actor and wait for it to finish
const run = await client.actor("futurizerush/meta-threads-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 = {
    "mode": "user",
    "usernames": ["zuck"],
    "max_posts": 50,
    "search_filter": "top",
}

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

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

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

```

## CLI example

```bash
echo '{
  "mode": "user",
  "usernames": [
    "zuck"
  ],
  "max_posts": 50,
  "search_filter": "top"
}' |
apify call futurizerush/meta-threads-scraper --silent --output-dataset

```

## MCP server setup

```json
{
    "mcpServers": {
        "apify": {
            "command": "npx",
            "args": [
                "mcp-remote",
                "https://mcp.apify.com/?tools=futurizerush/meta-threads-scraper",
                "--header",
                "Authorization: Bearer <YOUR_API_TOKEN>"
            ]
        }
    }
}

```

## OpenAPI specification

```json
{
    "openapi": "3.0.1",
    "info": {
        "title": "Threads Scraper - Posts, Profiles & Search",
        "description": "Best Threads scraper for public posts, profiles, and account discovery. Search keywords or usernames and collect posts, profiles, and view counts for research, lead generation, and monitoring.",
        "version": "0.0",
        "x-build-id": "FXNEYkYVyzBJ3AA66"
    },
    "servers": [
        {
            "url": "https://api.apify.com/v2"
        }
    ],
    "paths": {
        "/acts/futurizerush~meta-threads-scraper/run-sync-get-dataset-items": {
            "post": {
                "operationId": "run-sync-get-dataset-items-futurizerush-meta-threads-scraper",
                "x-openai-isConsequential": false,
                "summary": "Executes an Actor, waits for its completion, and returns Actor's dataset items in response.",
                "tags": [
                    "Run Actor"
                ],
                "requestBody": {
                    "required": true,
                    "content": {
                        "application/json": {
                            "schema": {
                                "$ref": "#/components/schemas/inputSchema"
                            }
                        }
                    }
                },
                "parameters": [
                    {
                        "name": "token",
                        "in": "query",
                        "required": true,
                        "schema": {
                            "type": "string"
                        },
                        "description": "Enter your Apify token here"
                    }
                ],
                "responses": {
                    "200": {
                        "description": "OK"
                    }
                }
            }
        },
        "/acts/futurizerush~meta-threads-scraper/runs": {
            "post": {
                "operationId": "runs-sync-futurizerush-meta-threads-scraper",
                "x-openai-isConsequential": false,
                "summary": "Executes an Actor and returns information about the initiated run in response.",
                "tags": [
                    "Run Actor"
                ],
                "requestBody": {
                    "required": true,
                    "content": {
                        "application/json": {
                            "schema": {
                                "$ref": "#/components/schemas/inputSchema"
                            }
                        }
                    }
                },
                "parameters": [
                    {
                        "name": "token",
                        "in": "query",
                        "required": true,
                        "schema": {
                            "type": "string"
                        },
                        "description": "Enter your Apify token here"
                    }
                ],
                "responses": {
                    "200": {
                        "description": "OK",
                        "content": {
                            "application/json": {
                                "schema": {
                                    "$ref": "#/components/schemas/runsResponseSchema"
                                }
                            }
                        }
                    }
                }
            }
        },
        "/acts/futurizerush~meta-threads-scraper/run-sync": {
            "post": {
                "operationId": "run-sync-futurizerush-meta-threads-scraper",
                "x-openai-isConsequential": false,
                "summary": "Executes an Actor, waits for completion, and returns the OUTPUT from Key-value store in response.",
                "tags": [
                    "Run Actor"
                ],
                "requestBody": {
                    "required": true,
                    "content": {
                        "application/json": {
                            "schema": {
                                "$ref": "#/components/schemas/inputSchema"
                            }
                        }
                    }
                },
                "parameters": [
                    {
                        "name": "token",
                        "in": "query",
                        "required": true,
                        "schema": {
                            "type": "string"
                        },
                        "description": "Enter your Apify token here"
                    }
                ],
                "responses": {
                    "200": {
                        "description": "OK"
                    }
                }
            }
        }
    },
    "components": {
        "schemas": {
            "inputSchema": {
                "type": "object",
                "required": [
                    "mode"
                ],
                "properties": {
                    "mode": {
                        "title": "🎯 Scrape Mode",
                        "type": "string",
                        "description": "Pick one, then fill the matching field below:\n• 👤 User Posts → fill 👤 Usernames — public posts from listed accounts.\n• 🔎 Search → fill 🏷️ Keywords — public posts about your keywords or hashtags.\n• 👥 Find Profiles → fill 🏷️ Keywords — public account matches for your keywords. Tip: add a place name, e.g. '台北 餐廳', for local account discovery.",
                        "default": "user"
                    },
                    "usernames": {
                        "title": "👤 Usernames",
                        "minItems": 0,
                        "maxItems": 20,
                        "uniqueItems": true,
                        "type": "array",
                        "description": "Required in 👤 User Posts mode (ignored in other modes). One or more Threads usernames — bare name (zuck), @-prefixed (@zuck), or full URL (https://threads.com/@zuck or https://threads.net/@zuck).",
                        "items": {
                            "type": "string"
                        }
                    },
                    "keywords": {
                        "title": "🏷️ Keywords",
                        "minItems": 0,
                        "maxItems": 20,
                        "uniqueItems": true,
                        "type": "array",
                        "description": "Use in 🔎 Search and 👥 Find Profiles mode. The # is optional, e.g. 'AI', 'tech', '台北 餐廳'. Optional in 👤 User Posts mode: adds a keyword_match flag without dropping posts.",
                        "items": {
                            "type": "string"
                        }
                    },
                    "max_posts": {
                        "title": "📦 Max Results",
                        "minimum": 10,
                        "maximum": 10000,
                        "type": "integer",
                        "description": "Per user or keyword. Multiple inputs are processed separately and combined into one dataset. In 👤 User Posts: up to 10000 when the account has enough public posts. In 🔎 Search: this is a cap over the public results available at run time; actual results may be lower. In 👥 Find Profiles: up to 10 public account matches per keyword; actual results may be lower.",
                        "default": 50
                    },
                    "search_filter": {
                        "title": "🔎 Sort Order",
                        "enum": [
                            "top",
                            "recent"
                        ],
                        "type": "string",
                        "description": "Only used in 🔎 Search mode. 'Top' shows popular posts. 'Recent' shows the newest matching public posts first; some older related posts may still appear.",
                        "default": "top"
                    },
                    "start_date": {
                        "title": "📅 Start Date",
                        "type": "string",
                        "description": "Used in 🔎 Search mode to show posts from this date onward. Supports YYYY-MM-DD or relative values such as '7 days' and '1 month'. Leave empty in other modes — a date set there will stop the run with a reminder."
                    },
                    "end_date": {
                        "title": "📅 End Date",
                        "type": "string",
                        "description": "Used in 🔎 Search mode to show posts up to this date (inclusive). YYYY-MM-DD is recommended for clarity. Relative values such as '7 days' mean that long ago. Leave empty in other modes — a date set there will stop the run with a reminder."
                    }
                }
            },
            "runsResponseSchema": {
                "type": "object",
                "properties": {
                    "data": {
                        "type": "object",
                        "properties": {
                            "id": {
                                "type": "string"
                            },
                            "actId": {
                                "type": "string"
                            },
                            "userId": {
                                "type": "string"
                            },
                            "startedAt": {
                                "type": "string",
                                "format": "date-time",
                                "example": "2025-01-08T00:00:00.000Z"
                            },
                            "finishedAt": {
                                "type": "string",
                                "format": "date-time",
                                "example": "2025-01-08T00:00:00.000Z"
                            },
                            "status": {
                                "type": "string",
                                "example": "READY"
                            },
                            "meta": {
                                "type": "object",
                                "properties": {
                                    "origin": {
                                        "type": "string",
                                        "example": "API"
                                    },
                                    "userAgent": {
                                        "type": "string"
                                    }
                                }
                            },
                            "stats": {
                                "type": "object",
                                "properties": {
                                    "inputBodyLen": {
                                        "type": "integer",
                                        "example": 2000
                                    },
                                    "rebootCount": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "restartCount": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "resurrectCount": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "computeUnits": {
                                        "type": "integer",
                                        "example": 0
                                    }
                                }
                            },
                            "options": {
                                "type": "object",
                                "properties": {
                                    "build": {
                                        "type": "string",
                                        "example": "latest"
                                    },
                                    "timeoutSecs": {
                                        "type": "integer",
                                        "example": 300
                                    },
                                    "memoryMbytes": {
                                        "type": "integer",
                                        "example": 1024
                                    },
                                    "diskMbytes": {
                                        "type": "integer",
                                        "example": 2048
                                    }
                                }
                            },
                            "buildId": {
                                "type": "string"
                            },
                            "defaultKeyValueStoreId": {
                                "type": "string"
                            },
                            "defaultDatasetId": {
                                "type": "string"
                            },
                            "defaultRequestQueueId": {
                                "type": "string"
                            },
                            "buildNumber": {
                                "type": "string",
                                "example": "1.0.0"
                            },
                            "containerUrl": {
                                "type": "string"
                            },
                            "usage": {
                                "type": "object",
                                "properties": {
                                    "ACTOR_COMPUTE_UNITS": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "DATASET_READS": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "DATASET_WRITES": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "KEY_VALUE_STORE_READS": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "KEY_VALUE_STORE_WRITES": {
                                        "type": "integer",
                                        "example": 1
                                    },
                                    "KEY_VALUE_STORE_LISTS": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "REQUEST_QUEUE_READS": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "REQUEST_QUEUE_WRITES": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "DATA_TRANSFER_INTERNAL_GBYTES": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "DATA_TRANSFER_EXTERNAL_GBYTES": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "PROXY_RESIDENTIAL_TRANSFER_GBYTES": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "PROXY_SERPS": {
                                        "type": "integer",
                                        "example": 0
                                    }
                                }
                            },
                            "usageTotalUsd": {
                                "type": "number",
                                "example": 0.00005
                            },
                            "usageUsd": {
                                "type": "object",
                                "properties": {
                                    "ACTOR_COMPUTE_UNITS": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "DATASET_READS": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "DATASET_WRITES": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "KEY_VALUE_STORE_READS": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "KEY_VALUE_STORE_WRITES": {
                                        "type": "number",
                                        "example": 0.00005
                                    },
                                    "KEY_VALUE_STORE_LISTS": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "REQUEST_QUEUE_READS": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "REQUEST_QUEUE_WRITES": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "DATA_TRANSFER_INTERNAL_GBYTES": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "DATA_TRANSFER_EXTERNAL_GBYTES": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "PROXY_RESIDENTIAL_TRANSFER_GBYTES": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "PROXY_SERPS": {
                                        "type": "integer",
                                        "example": 0
                                    }
                                }
                            }
                        }
                    }
                }
            }
        }
    }
}
```
