# Threads Scraper — Posts, Profiles & Metrics (`sleek_waveform/threads-scraper`) Actor

Scrape Meta Threads profiles, posts, hashtags & search results with engagement metrics. No login required. Export JSON, CSV, or Excel.

- **URL**: https://apify.com/sleek\_waveform/threads-scraper.md
- **Developed by:** [Daniel Dimitrov](https://apify.com/sleek_waveform) (community)
- **Categories:** Social media, Lead generation
- **Stats:** 3 total users, 1 monthly users, 40.0% runs succeeded, NaN bookmarks
- **User rating**: No ratings yet

## Pricing

from $2.00 / 1,000 basic-results

This Actor is paid per event. You are not charged for the Apify platform usage, but only a fixed price for specific events.

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

The **Threads Scraper** extracts public data from Meta's [Threads](https://www.threads.net) — user profiles, posts, replies, hashtag feeds, and search results — and returns structured JSON with calculated engagement metrics. No login, no Threads API key, no manual work. Built for social media analysts, influencer marketers, brand monitoring teams, and data researchers who need reliable Threads data at scale.

This Apify Actor uses a **hybrid Cheerio + Playwright crawler** to cut costs. HTTP-only scraping runs first for speed, and a stealth browser automatically takes over when a page requires JavaScript rendering or hits anti-bot protection. Residential proxies, request deduplication, and exponential backoff are built in.

### Features

- **Scrape Threads profiles** — followers, following, post count, bio, verification status, profile picture, link in bio
- **Extract Threads posts** — text, likes, replies, reposts, quotes, media URLs, language, hashtags, mentions, timestamps
- **Monitor Threads hashtag feeds** — pull every public post under any hashtag
- **Search Threads by keyword** — find posts matching any query or phrase
- **Scrape replies and reposts** — optional, toggle per run
- **Engagement metrics** — engagement rate, virality score, like-to-follower ratio, engagement velocity, median likes, peak posting hour
- **Aggregated profile analytics** — top hashtags, top mentions, best-performing post, followers-per-post
- **Automatic proxy rotation** — residential proxies enabled by default to avoid IP blocks
- **Export data** — download the dataset in JSON, CSV, Excel, HTML, or XML

### Why use this Threads Scraper

Threads has no public API for scraping, aggressively blocks datacenter IPs, and serves different HTML to logged-in vs logged-out users. This Threads Scraper solves all three problems:

| Challenge on Threads | How the Threads Scraper handles it |
|---|---|
| No official API for bulk export | Parses public pages and intercepts internal GraphQL payloads |
| Datacenter IP blocks | Residential proxy group by default, with rotation |
| JavaScript-rendered content | Automatic Playwright fallback when HTTP-only fails |
| Rate limiting and 429s | Exponential backoff with jitter and tunable delays |
| No engagement analytics | 10+ metrics computed per post + aggregated per profile |

### How to use the Threads Scraper (tutorial)

#### Step 1 — Open the Actor

Click **Try for free** on this page to open the Threads Scraper in the [Apify Console](https://console.apify.com/).

#### Step 2 — Pick a scrape mode

Pick one of five modes in the **Scrape Mode** dropdown:

- `profile` — user profile with aggregated metrics and recent posts
- `posts` — a user's posts only (faster, no profile record)
- `hashtag` — every public post under a hashtag
- `post_urls` — scrape specific posts by direct URL
- `search` — Threads search results for a keyword or phrase

#### Step 3 — Enter targets

Add usernames, hashtags, post URLs, or search queries depending on the mode you picked. You can add many per run.

#### Step 4 — Click Start

Set **Max Items** and click **Start**. Results stream into the dataset as they're scraped. Export the finished dataset in JSON, CSV, Excel, HTML, or XML from the **Dataset** tab.

#### Run the Threads Scraper locally

```bash
apify run --input='{ "scrapeMode": "profile", "usernames": ["zuck"], "maxItems": 5, "includeMetrics": true }'
````

#### Call the Threads Scraper from the Apify API

```bash
curl -X POST "https://api.apify.com/v2/acts/YOUR_USERNAME~threads-scraper/runs?token=YOUR_APIFY_TOKEN" \
  -H "Content-Type: application/json" \
  -d '{
    "scrapeMode": "hashtag",
    "hashtags": ["ai"],
    "maxItems": 100,
    "includeMetrics": true,
    "proxyConfiguration": { "useApifyProxy": true, "apifyProxyGroups": ["RESIDENTIAL"] }
  }'
```

### Pricing — how much does the Threads Scraper cost

The Threads Scraper is priced per result with two tiers, so cheap jobs stay cheap and you only pay the higher rate when a job actually requires the heavier crawling path. Every dataset row tells you which tier billed it.

| Tier | When it's used | Price |
|---|---|---|
| **Basic** | HTTP fast-path scrapes — most profile, posts, post-URL, and small (≤10 result) hashtag/search jobs | **~$2 / 1,000 results** |
| **Premium** | Headless-browser scrapes — large hashtag/search jobs, deep scrolling, pages that need JS rendering or anti-bot evasion | **~$5 / 1,000 results** |
| Error rows | Diagnostic rows pushed when a URL fails (login wall, rate limit, etc.) | Free |

Residential proxies and Apify platform compute are included in the per-result prices. No monthly subscription, no setup fee. Exact prices are shown in the Apify Console **Pricing** tab on the Actor page.

#### Rough volume examples

| Job | Likely tier | Estimated cost |
|---|---|---|
| 1 profile + ~4 posts | Basic | ~$0.01 |
| 5 profiles + ~20 posts | Basic | ~$0.05 |
| Hashtag feed, ≤10 posts | Basic | ~$0.02 |
| Hashtag feed, 100 posts | Premium | ~$0.50 |
| Search, 1,000 posts | Premium | ~$5 |
| Creator audit, 10,000 posts | Mixed | ~$25 |

### Input

Open the **Input** tab on the Actor page for the interactive form. Here are the main fields:

| Field | Type | Default | Description |
|---|---|---|---|
| `scrapeMode` | string | `profile` | `profile`, `posts`, `hashtag`, `post_urls`, or `search` |
| `usernames` | string\[] | `[]` | Threads handles without `@` |
| `profileUrls` | string\[] | `[]` | Direct profile URLs as an alternative to usernames |
| `postUrls` | string\[] | `[]` | Direct post URLs for `post_urls` mode |
| `hashtags` | string\[] | `[]` | Hashtags without `#` for `hashtag` mode |
| `searchQueries` | string\[] | `[]` | Terms for `search` mode |
| `maxItems` | integer | `50` | Hard cap on results |
| `includeReplies` | boolean | `false` | Include reply posts |
| `includeReposts` | boolean | `false` | Include reposted content |
| `includeMetrics` | boolean | `true` | Calculate engagement metrics |
| `useCheerioFastPath` | boolean | `true` | Try cheap HTTP-only scraping first |
| `requestDelaySecs` | number | `2` | Minimum delay between requests |
| `maxConcurrency` | integer | `5` | Maximum parallel pages |
| `maxRequestRetries` | integer | `3` | Retry attempts on failure |
| `proxyConfiguration` | object | Residential | Proxy group — residential strongly recommended |
| `webhookUrl` | string | — | Called when the run completes |

#### Required fields per mode

- `profile` / `posts` — `usernames` or `profileUrls`
- `post_urls` — `postUrls`
- `hashtag` — `hashtags`
- `search` — `searchQueries`

### Output example

The Threads Scraper writes two record types to the dataset. Each profile row is followed by the post rows scraped for that profile.

#### Profile record

```json
{
  "type": "profile",
  "username": "zuck",
  "displayName": "Mark Zuckerberg",
  "biography": "Mostly superintelligence and MMA takes",
  "followersCount": 5449802,
  "isVerified": true,
  "profilePicUrl": "https://instagram.fgru4-1.fna.fbcdn.net/v/t51.82787-19/...",
  "linkInBio": "",
  "profileUrl": "https://www.threads.net/@zuck",
  "avgLikes": 4284,
  "medianLikes": 2855,
  "engagementRate": 0.1,
  "likeToFollowerRatio": 0.0024,
  "topHashtags": [],
  "topMentions": [],
  "peakPostingHourUtc": 15,
  "bestPerformingPostCode": "DVrwsE5EdSz",
  "bestPerformingPostLikes": 7213,
  "scrapedPostCount": 3,
  "scrapedAt": "2026-04-24T04:15:08.648Z"
}
```

#### Post record

```json
{
  "type": "post",
  "postId": "3808602590024938729",
  "code": "DTa3-B1EbTp",
  "url": "https://www.threads.net/@zuck/post/DTa3-B1EbTp",
  "authorUsername": "zuck",
  "authorDisplayName": "Mark Zuckerberg",
  "authorFollowersCount": 5449802,
  "text": "Today we're establishing a new top-level initiative called Meta Compute...",
  "language": "en",
  "mediaType": "text",
  "likeCount": 2855,
  "replyCount": 958,
  "repostCount": 145,
  "quoteCount": 38,
  "totalInteractions": 3996,
  "engagementRate": 0.073,
  "engagementVelocity": 1.64,
  "viralityScore": 0.97,
  "hashtags": [],
  "mentions": [],
  "postedAt": "2026-01-12T18:00:30.000Z",
  "scrapedAt": "2026-04-24T04:15:08.843Z"
}
```

### Scrape modes explained

#### Profile info + posts (`profile`)

Best for influencer analysis, competitor audits, creator discovery.

```json
{ "scrapeMode": "profile", "usernames": ["zuck", "mosseri"], "maxItems": 10, "includeMetrics": true }
```

#### User posts only (`posts`)

Faster when you only want content, not profile headers.

```json
{ "scrapeMode": "posts", "usernames": ["zuck"], "maxItems": 20, "includeReplies": true }
```

#### Hashtag feed (`hashtag`)

Ideal for trend monitoring, campaign tracking, and content discovery.

```json
{ "scrapeMode": "hashtag", "hashtags": ["ai", "machinelearning"], "maxItems": 15 }
```

#### Specific post URLs (`post_urls`)

Backfill or enrich posts you already know about.

```json
{ "scrapeMode": "post_urls", "postUrls": ["https://www.threads.net/@zuck/post/AbCdEfGh"], "includeMetrics": true }
```

#### Search (`search`)

Brand monitoring, topic research, lead discovery.

```json
{ "scrapeMode": "search", "searchQueries": ["openai", "artificial intelligence"], "maxItems": 10 }
```

### Use cases

- **Creator marketing** — shortlist Threads creators by engagement rate, virality score, and posting cadence
- **Competitor monitoring** — track rival brands' Threads posts, replies, and hashtag mentions
- **Social listening** — stream hashtag or keyword results into BI tools, alerting systems, or LLM pipelines
- **Lead generation** — build lists of engaged creators in your niche using the `search` mode
- **Content research** — find top-performing post formats for any topic or audience

### Integrations

The Threads Scraper's dataset plugs into:

- **Zapier, Make, n8n** — trigger workflows on run completion via `webhookUrl`
- **Google Sheets, Airtable, Notion** — use the official [Apify integrations](https://docs.apify.com/platform/integrations)
- **Webhooks, REST API, JS/Python SDKs** — programmatic control via the [Apify API](https://docs.apify.com/api/v2)

### Other Apify Actors you may like

- **Yelp Scraper — Leads, Reviews & Contacts** — pull business contact info and reviews from Yelp for B2B lead generation
- **Instagram Scraper** — scrape Instagram profiles, posts, and hashtags
- **TikTok Scraper** — download TikTok videos, profiles, and trending hashtags
- **Google Maps Scraper** — extract business leads from Google Maps
- **X (Twitter) Scraper** — collect tweets, followers, and profile data

### FAQ

#### Is scraping Threads legal?

The Threads Scraper only extracts **publicly available data** — profiles and posts visible without logging in. It does not access private accounts, messages, or content behind authentication. Always comply with [Threads Terms of Use](https://help.instagram.com/769983657850450) and applicable data-protection laws.

#### Do I need a Threads account or API key?

No. The Threads Scraper works without any login credentials or developer key. Threads does not currently offer a public scraping API, which is exactly the gap this Actor fills.

#### Threads API vs Threads Scraper — which should I use?

The official [Threads API](https://developers.facebook.com/docs/threads) is posting-focused and requires an approved Meta developer app to read third-party data. For bulk read access to profiles, posts, hashtags, or search — without Meta review — the Threads Scraper is the fastest path.

#### How does the Threads Scraper avoid blocks?

Three layers: (1) residential proxies by default, (2) hybrid Cheerio→Playwright fallback so pages that trigger anti-bot protection are retried in a stealth browser, and (3) exponential backoff with jitter on 429s and empty responses.

#### Can I scrape replies, reposts, and quote reposts?

Yes. Set `includeReplies` or `includeReposts` to `true`. Quote reposts are flagged in the output with `quotedPostId` and `quotedPostAuthor`.

#### How do I export the Threads data as CSV or Excel?

After the run finishes, open the **Dataset** tab, click **Export**, and pick JSON, CSV, Excel, HTML, or XML. The dataset also ships with preset views (Overview, Profiles, Posts) for a cleaner spreadsheet shape.

#### What engagement metrics does the Threads Scraper calculate?

- **Engagement rate** — total interactions divided by author followers (%)
- **Virality score** — `(likes + 2·replies + 3·reposts + 2·quotes) / followers`, normalized
- **Engagement velocity** — interactions per hour since the post went live
- **Like-to-follower ratio** — likes over followers
- **Reply-to-like** and **repost-to-like** ratios — content-type fingerprint
- **Peak posting hour (UTC)** and **median likes** — profile-level aggregates

#### How do I schedule daily or weekly runs?

Open the Actor page → click **Schedule** → choose a cron interval. The Threads Scraper runs at the scheduled time and pushes new results into the same or a fresh dataset depending on your configuration. See the [Apify Schedules docs](https://docs.apify.com/platform/schedules).

#### Can I use this Threads Scraper from Python or Node.js?

Yes. Use the [apify-client-js](https://docs.apify.com/api/client/js/) or [apify-client-python](https://docs.apify.com/api/client/python/) SDK. A minimal Node example:

```js
import { ApifyClient } from 'apify-client';
const client = new ApifyClient({ token: 'YOUR_APIFY_TOKEN' });
const run = await client.actor('YOUR_USERNAME/threads-scraper').call({
  scrapeMode: 'posts', usernames: ['zuck'], maxItems: 50, includeMetrics: true,
});
const { items } = await client.dataset(run.defaultDatasetId).listItems();
```

#### My Threads Scraper run returns empty or partial results — what do I do?

Check the troubleshooting section below, then raise the `requestDelaySecs`, lower `maxConcurrency` to 2–3, and confirm `proxyConfiguration` is set to the `RESIDENTIAL` group. Threads routinely blocks datacenter IPs.

### Troubleshooting

#### Rate limits or empty results

- Raise `requestDelaySecs` to 3–5 seconds
- Switch to **RESIDENTIAL** proxies (default)
- Drop `maxConcurrency` to 2–3
- Keep `useCheerioFastPath` on — Cheerio traffic gets rate-limited less than browser traffic

#### Login walls

- The Actor automatically falls back from Cheerio to Playwright when a login wall is detected
- If both fail, rotate to a fresh residential proxy pool and retry

#### IP blocks

- Always use residential proxies for production scraping
- The Actor auto-detects blocks and applies exponential backoff (base 5s, max 60s with jitter)

#### Cheerio vs Playwright behavior

| Symptom | Likely cause | Fix |
|---|---|---|
| Cheerio fails, Playwright succeeds | Login wall or JS-required page | Normal — fallback is working |
| Cheerio succeeds but posts missing | `data-sjs` payload truncated | Lower `maxItems` or retry |
| Both fail | IP block | Rotate proxy group or add delay |

### Support

- Review the **Troubleshooting** section above
- Read the [Apify Actor development docs](https://docs.apify.com/platform/actors/development)
- Open an issue on GitHub or contact the developer through the Actor page

### Changelog

#### 1.0

- Initial release of the Threads Scraper
- Five scrape modes: `profile`, `posts`, `hashtag`, `post_urls`, `search`
- Hybrid Cheerio + Playwright crawling with automatic fallback
- GraphQL payload interception for structured data
- Engagement metrics: rate, velocity, virality, like-to-follower ratio
- Stealth Chrome args, fingerprinting defenses, automation-flag removal
- Dataset views for Profiles, Posts, and a mixed Overview
- Exponential backoff on rate limits with jitter

### License

MIT

# Actor input Schema

## `scrapeMode` (type: `string`):

What to scrape: user profiles with posts, posts from specific users, hashtag feeds, specific post URLs, or search results.

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

Threads usernames to scrape (e.g., zuck, mosseri). Required for 'profile' and 'posts' modes.

## `profileUrls` (type: `array`):

Direct Threads profile URLs to scrape (e.g., https://www.threads.net/@zuck). Alternative to usernames for 'profile' and 'posts' modes.

## `postUrls` (type: `array`):

Direct Threads post URLs to scrape. Required for 'post\_urls' mode.

## `hashtags` (type: `array`):

Hashtags to search (without # prefix). Required for 'hashtag' mode.

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

Search terms to find posts on Threads. Required for 'search' mode.

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

Maximum number of items to scrape. Local runs are capped at 50.

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

Include reply posts when scraping user posts.

## `includeReposts` (type: `boolean`):

Include reposted content from other users.

## `includeMetrics` (type: `boolean`):

Calculate engagement rate, like-to-follower ratio, and other derived metrics.

## `useCheerioFastPath` (type: `boolean`):

Try CheerioCrawler (HTTP-only) first for lower cost. Falls back to PlaywrightCrawler if blocked.

## `requestDelaySecs` (type: `number`):

Minimum delay between requests. Increase if you encounter rate limiting.

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

Maximum concurrent browser pages. Lower values use less memory.

## `maxRequestRetries` (type: `integer`):

How many times to retry a failed request.

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

Residential proxies are strongly recommended for Threads to avoid IP blocks.

## `webhookUrl` (type: `string`):

Optional URL to notify when the Actor run completes.

## Actor input object example

```json
{
  "scrapeMode": "profile",
  "usernames": [
    "zuck",
    "mosseri"
  ],
  "profileUrls": [
    "https://www.threads.net/@zuck"
  ],
  "postUrls": [
    "https://www.threads.net/@zuck/post/AbCdEfGh"
  ],
  "hashtags": [
    "ai",
    "machinelearning"
  ],
  "searchQueries": [
    "artificial intelligence",
    "OpenAI"
  ],
  "maxItems": 5,
  "includeReplies": false,
  "includeReposts": false,
  "includeMetrics": true,
  "useCheerioFastPath": true,
  "requestDelaySecs": 2,
  "maxConcurrency": 5,
  "maxRequestRetries": 3,
  "proxyConfiguration": {
    "useApifyProxy": true,
    "apifyProxyGroups": [
      "RESIDENTIAL"
    ]
  }
}
```

# Actor output Schema

## `datasetUrl` (type: `string`):

Download the full dataset in JSON, CSV, or Excel.

## `consoleUrl` (type: `string`):

View the run results in the Apify Console.

# 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 = {
    "usernames": [
        "zuck"
    ],
    "profileUrls": [],
    "postUrls": [],
    "hashtags": [],
    "searchQueries": [],
    "maxItems": 5
};

// Run the Actor and wait for it to finish
const run = await client.actor("sleek_waveform/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 = {
    "usernames": ["zuck"],
    "profileUrls": [],
    "postUrls": [],
    "hashtags": [],
    "searchQueries": [],
    "maxItems": 5,
}

# Run the Actor and wait for it to finish
run = client.actor("sleek_waveform/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 '{
  "usernames": [
    "zuck"
  ],
  "profileUrls": [],
  "postUrls": [],
  "hashtags": [],
  "searchQueries": [],
  "maxItems": 5
}' |
apify call sleek_waveform/threads-scraper --silent --output-dataset

```

## MCP server setup

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

```

## OpenAPI specification

```json
{
    "openapi": "3.0.1",
    "info": {
        "title": "Threads Scraper — Posts, Profiles & Metrics",
        "description": "Scrape Meta Threads profiles, posts, hashtags & search results with engagement metrics. No login required. Export JSON, CSV, or Excel.",
        "version": "1.0",
        "x-build-id": "R4VqnQRCspnKwdOXd"
    },
    "servers": [
        {
            "url": "https://api.apify.com/v2"
        }
    ],
    "paths": {
        "/acts/sleek_waveform~threads-scraper/run-sync-get-dataset-items": {
            "post": {
                "operationId": "run-sync-get-dataset-items-sleek_waveform-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/sleek_waveform~threads-scraper/runs": {
            "post": {
                "operationId": "runs-sync-sleek_waveform-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/sleek_waveform~threads-scraper/run-sync": {
            "post": {
                "operationId": "run-sync-sleek_waveform-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": [
                    "scrapeMode"
                ],
                "properties": {
                    "scrapeMode": {
                        "title": "Scrape Mode",
                        "enum": [
                            "profile",
                            "posts",
                            "hashtag",
                            "post_urls",
                            "search"
                        ],
                        "type": "string",
                        "description": "What to scrape: user profiles with posts, posts from specific users, hashtag feeds, specific post URLs, or search results.",
                        "default": "profile"
                    },
                    "usernames": {
                        "title": "Usernames",
                        "type": "array",
                        "description": "Threads usernames to scrape (e.g., zuck, mosseri). Required for 'profile' and 'posts' modes.",
                        "items": {
                            "type": "string"
                        }
                    },
                    "profileUrls": {
                        "title": "Profile URLs",
                        "type": "array",
                        "description": "Direct Threads profile URLs to scrape (e.g., https://www.threads.net/@zuck). Alternative to usernames for 'profile' and 'posts' modes.",
                        "items": {
                            "type": "string"
                        }
                    },
                    "postUrls": {
                        "title": "Post URLs",
                        "type": "array",
                        "description": "Direct Threads post URLs to scrape. Required for 'post_urls' mode.",
                        "items": {
                            "type": "string"
                        }
                    },
                    "hashtags": {
                        "title": "Hashtags",
                        "type": "array",
                        "description": "Hashtags to search (without # prefix). Required for 'hashtag' mode.",
                        "items": {
                            "type": "string"
                        }
                    },
                    "searchQueries": {
                        "title": "Search Queries",
                        "type": "array",
                        "description": "Search terms to find posts on Threads. Required for 'search' mode.",
                        "items": {
                            "type": "string"
                        }
                    },
                    "maxItems": {
                        "title": "Max Items",
                        "minimum": 1,
                        "maximum": 50000,
                        "type": "integer",
                        "description": "Maximum number of items to scrape. Local runs are capped at 50.",
                        "default": 50
                    },
                    "includeReplies": {
                        "title": "Include Replies",
                        "type": "boolean",
                        "description": "Include reply posts when scraping user posts.",
                        "default": false
                    },
                    "includeReposts": {
                        "title": "Include Reposts",
                        "type": "boolean",
                        "description": "Include reposted content from other users.",
                        "default": false
                    },
                    "includeMetrics": {
                        "title": "Include Calculated Metrics",
                        "type": "boolean",
                        "description": "Calculate engagement rate, like-to-follower ratio, and other derived metrics.",
                        "default": true
                    },
                    "useCheerioFastPath": {
                        "title": "Enable Cheerio Fast Path",
                        "type": "boolean",
                        "description": "Try CheerioCrawler (HTTP-only) first for lower cost. Falls back to PlaywrightCrawler if blocked.",
                        "default": true
                    },
                    "requestDelaySecs": {
                        "title": "Request Delay (seconds)",
                        "minimum": 0,
                        "maximum": 30,
                        "type": "number",
                        "description": "Minimum delay between requests. Increase if you encounter rate limiting.",
                        "default": 2
                    },
                    "maxConcurrency": {
                        "title": "Max Concurrency",
                        "minimum": 1,
                        "maximum": 15,
                        "type": "integer",
                        "description": "Maximum concurrent browser pages. Lower values use less memory.",
                        "default": 5
                    },
                    "maxRequestRetries": {
                        "title": "Max Request Retries",
                        "minimum": 0,
                        "maximum": 10,
                        "type": "integer",
                        "description": "How many times to retry a failed request.",
                        "default": 3
                    },
                    "proxyConfiguration": {
                        "title": "Proxy Configuration",
                        "type": "object",
                        "description": "Residential proxies are strongly recommended for Threads to avoid IP blocks.",
                        "default": {
                            "useApifyProxy": true,
                            "apifyProxyGroups": [
                                "RESIDENTIAL"
                            ]
                        }
                    },
                    "webhookUrl": {
                        "title": "Webhook URL",
                        "type": "string",
                        "description": "Optional URL to notify when the Actor run completes."
                    }
                }
            },
            "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
                                    }
                                }
                            }
                        }
                    }
                }
            }
        }
    }
}
```
