# BlackHatWorld scraper & Search — Threads & Full Posts, No Proxy (`red_crawler/blackhatworld-scraper-search`) Actor

Scrape any BlackHatWorld thread straight from its URL — full posts with their images, formatting, links, reactions (and who reacted) and author details — or search the forum and scrape every matching thread. No login or proxy required.

- **URL**: https://apify.com/red\_crawler/blackhatworld-scraper-search.md
- **Developed by:** [Red Crawler](https://apify.com/red_crawler) (community)
- **Categories:** Social media, Automation, Lead generation
- **Stats:** 2 total users, 1 monthly users, 100.0% runs succeeded, 0 bookmarks
- **User rating**: No ratings yet

## Pricing

$5.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.

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

## BlackHatWorld Scraper & Search — Threads & Full Posts

<img src="https://img.shields.io/badge/Modes-Search%20%2B%20Scrape%20by%20URL-1f6feb" alt="Modes" height="22" />
<img src="https://img.shields.io/badge/Login-not%20required-2ea043" alt="No login" height="22" />
<img src="https://img.shields.io/badge/Proxy-not%20required-2ea043" alt="No proxy" height="22" />
<img src="https://img.shields.io/badge/Output-JSON%20%7C%20CSV%20%7C%20Excel%20%7C%20API-e3742f" alt="Output formats" height="22" />
<img src="https://img.shields.io/badge/Pricing-%245%20%2F%201%2C000%20results-8957e5" alt="Pricing" height="22" />

Pull clean, structured data out of **BlackHatWorld** — either by **searching** the forum and grabbing every matching result, or by **scraping the exact thread URLs** you paste in. Threads come back with their **full posts**: the complete content (with formatting and embedded images preserved), every link, who wrote each post, and the reactions on it — including the full list of who reacted. No account, no login, and no proxy required.

---

### Two ways to use it

Pick one at the top of the input with the **Mode** selector. Only the fields for the mode you pick are used — everything else is ignored.

| Mode | What it does | You provide |
|---|---|---|
| **Search BlackHatWorld** | Runs a keyword search and returns every matching result. For threads, each match is fully scraped. | A **Search query** + optional filters |
| **Scrape thread URLs** | Skips search entirely and scrapes the exact threads you paste. | One or more **Thread URLs** |

---

### What you can search

In **Search** mode, choose a **Search type**:

| Search type | What you get |
|---|---|
| **Search everything** | Matches across every content type at once — each row tagged with its `type`. |
| **Search threads** | Discussion threads, each scraped for its full post content. |
| **Search media** | Image-gallery items: title, category, uploader, image URL, tags. |
| **Search media comments** | Comments left on gallery items. |
| **Search profile posts** | Status posts left on member profiles. |
| **Search tags** | Threads carrying a given tag (enter the tag as the query). |

---

### Quick start

**To search:**
1. Set **Mode** to **Search BlackHatWorld**.
2. Type a **Search query** (e.g. `instagram automation`).
3. Pick a **Search type** (default: *Search threads*).
4. (Optional) Narrow with sort order, date range, forum, minimum replies, etc.
5. Click **Save & start**.

**To scrape specific threads:**
1. Set **Mode** to **Scrape thread URLs**.
2. Paste one or more thread URLs into **Thread URLs**, e.g.
   `https://www.blackhatworld.com/seo/the-three-commandments-of-bhw.950872/`
3. Choose **What to scrape from each thread** — *First post only* or *All posts (post + replies)*.
4. Click **Save & start**.

---

### Input fields

| Field | Applies to | Description |
|---|---|---|
| **Mode** | both | `Search BlackHatWorld` or `Scrape thread URLs`. |
| **Search query** | Search | Keywords to search for. |
| **Thread URLs** | Scrape | One or more BlackHatWorld thread URLs to scrape directly. |
| **Search type** | Search | Everything / threads / media / media comments / profile posts / tags. |
| **Sort results by** | Search | Relevance, most recent, or most replies. |
| **Search titles only** | Search (threads) | Match the query against thread titles only. |
| **Only threads newer / older than** | Search | Limit by last-activity date. |
| **Started by (usernames)** | Search | Only threads started by these members. |
| **Posted on profile of (members)** | Search (profile posts) | Only posts left on these members' profiles. |
| **Limit to forum(s)** | Search (threads) | Restrict to one or more forums. |
| **Search sub-forums as well** | Search (threads) | Also search forums nested inside the chosen ones. |
| **Search in categories** | Search (media) | Restrict media search to gallery categories. |
| **Search child categories as well** | Search (media) | Also search categories nested inside the chosen ones. |
| **Comments on** | Search (media comments) | Limit to comments on media items and/or albums. |
| **What to scrape from each thread** | both (threads) | *First post only* or *All posts (post + replies)*. |
| **Include who reacted** | both (threads) | Also fetch the full reactor list per post (extra time per post). |
| **Max posts per thread** | both (threads) | Cap posts pulled per thread. `0` = no cap. |
| **Minimum replies** | Search (threads) | Only threads with at least this many replies. |
| **Max results** | Search | Stop after this many results. |

---

### Examples

#### Scrape a thread by URL

**Input**

```json
{
  "mode": "scrape",
  "threadUrls": ["https://www.blackhatworld.com/seo/the-three-commandments-of-bhw.950872/"],
  "threadScope": "all_posts",
  "includeReactors": true
}
````

**Output** *(one dataset record — one post shown, trimmed)*

```json
{
  "title": "The Three Commandments of BHW",
  "url": "https://www.blackhatworld.com/seo/the-three-commandments-of-bhw.950872/",
  "forum": "Brand New to BHW",
  "author": "BlackHat World",
  "date": "2017-06-27T16:33:12+0100",
  "replyCount": 235,
  "viewCount": 81114,
  "locked": false,
  "threadId": "950872",
  "tags": [],
  "contentFetched": true,
  "posts": [
    {
      "postNumber": "#1",
      "postId": "10170993",
      "permalink": "https://www.blackhatworld.com/seo/the-three-commandments-of-bhw.950872/post-10170993",
      "date": "2017-06-27T16:33:12+0100",
      "author": {
        "username": "BlackHat World",
        "profileUrl": "https://www.blackhatworld.com/members/blackhat-world.8/",
        "userId": "8",
        "userTitle": "Administrator",
        "banners": ["Staff member", "Moderator"],
        "joined": "Nov 8, 2005",
        "messages": "157",
        "reactionScore": "514",
        "avatarUrl": "https://www.blackhatworld.com/data/avatars/m/0/8.jpg"
      },
      "bodyText": "Hi there! Welcome to BlackHatWorld. It's nice to see another new member looking to join the community…",
      "bodyHtml": "<span style=\"font-size: 18px\">Hi there! Welcome to BlackHatWorld…</span> … <span style=\"color: rgb(184, 49, 47)\">1) Don't sell</span> …",
      "images": ["https://cdn.blackhatworld.com/img155/o/g/s/h/u/j/9/OGsHUJ9.jpg"],
      "links": [
        { "text": "read the rules", "url": "https://www.blackhatworld.com/help/terms" }
      ],
      "quotes": [],
      "reactions": {
        "count": 291,
        "types": [ { "id": "1", "label": "Like" }, { "id": "3", "label": "Haha" } ],
        "reactorsInline": ["oth0s", "S234", "InariSunflower"],
        "reactionsUrl": "https://www.blackhatworld.com/posts/10170993/reactions",
        "reactors": [
          { "username": "oth0s", "profileUrl": "https://www.blackhatworld.com/members/oth0s.2333832/", "userId": "2333832", "reaction": "Like", "reactedAt": "2026-06-06T18:12:49+0100" }
        ]
      }
    }
  ]
}
```

> `bodyHtml` keeps the original formatting, so colored text (e.g. a red rule heading) and in-text links (e.g. *read the rules*) survive intact. `bodyText` is the same content as clean plain text. Set **Include who reacted** to fill the `reactors` list; otherwise you still get the reaction `count`, the reaction `types`, and the first few `reactorsInline` names.

#### Search threads

**Input**

```json
{
  "mode": "search",
  "query": "apify",
  "searchType": "threads",
  "order": "relevance",
  "maxResults": 25,
  "searchThreadScope": "all_posts"
}
```

**Output** *(one dataset record — same thread shape as above, with its `posts` array)*

```json
{
  "query": "apify",
  "title": "Custom Apify Agent for Instagram: 200 Profiles/3x Daily",
  "url": "https://www.blackhatworld.com/seo/custom-apify-agent-for-instagram….1796383/",
  "forum": "AI - Artificial Intelligence in Digital Marketing",
  "author": "vittorianicolosi1994",
  "date": "2026-02-25T09:23:15+0000",
  "replyCount": 6,
  "threadId": "1796383",
  "snippet": "Im looking for custom agent using the Apify framework…",
  "contentFetched": true,
  "posts": [ "… full post objects, same shape as the Scrape example …" ]
}
```

#### Search media

**Input**

```json
{ "mode": "search", "query": "logo", "searchType": "media", "maxResults": 25 }
```

**Output** *(one dataset record)*

```json
{
  "query": "logo",
  "type": "media",
  "title": "IMG_3679.jpeg",
  "url": "https://www.blackhatworld.com/media/img_3679-jpeg.31355/",
  "mediaId": "31355",
  "category": "Marketplace",
  "author": "JessicaSergey",
  "date": "2026-02-09T13:54:30+0000",
  "commentCount": 0,
  "tags": ["logo", "logo & brand identity", "rebranding", "mockup"],
  "thumbnail": "https://www.blackhatworld.com/data/xfmg/thumbnail/31/31355-….jpg",
  "snippet": "Logo, Brand Work and Graphic Designing"
}
```

> **Search everything**, **media comments**, **profile posts**, and **tags** each return their own row shape with a `type` (or `contentType`) field telling you what kind of result it is.

***

### Output

Every result is one dataset row. You can view, filter, and export it as **JSON, CSV, Excel, HTML table, RSS, or via API**.

**Thread record** (search-threads and scrape modes):
`title` · `url` · `forum` · `author` · `avatar` · `date` · `replyCount` · `viewCount` · `locked` · `postCount` · `threadId` · `tags` · `snippet` · `contentFetched` · `posts[]`

**Each post in `posts[]`:**
`postNumber` · `postId` · `permalink` · `date` · `lastEdited` · `author{username, profileUrl, userId, userTitle, banners, joined, messages, reactionScore, avatarUrl}` · `bodyText` · `bodyHtml` · `images[]` · `links[]` · `quotes[]` · `reactions{count, types, reactorsInline, reactionsUrl, reactors[]}`

**Media / comment / profile-post / tag records** carry their own scalar columns (title, url, author, date, category/forum, tags, snippet…) plus a `type` field.

***

### Status & error reference

| Status | What it means | What to do |
|---|---|---|
| <img src="https://img.shields.io/badge/Succeeded-2ea043" alt="Succeeded" height="22" /> | Run finished. Some or zero results pushed. | Open the dataset to view results. |
| <img src="https://img.shields.io/badge/Failed-c92a2a" alt="Failed" height="22" /> | Bad input or an upstream fault. | Check the run log. You are not charged for failed runs. |
| <img src="https://img.shields.io/badge/Timed%20out-d68910" alt="Timed out" height="22" /> | Run exceeded its timeout. | Re-run; narrow inputs or lower **Max results**. |
| <img src="https://img.shields.io/badge/Aborted-6e7781" alt="Aborted" height="22" /> | You stopped the run manually. | No charge for unpushed results. |

If a run finishes with a single `{ "success": false, "error": "…" }` row, the message tells you what to fix (most often: Search mode with no query, or Scrape mode with no URLs).

***

### Tips & limits

- **One mode at a time.** In Search mode the Thread URLs are ignored; in Scrape mode the query and search filters are ignored.
- **Cost scales with results.** In Search mode each thread is fully scraped, so **Max results** controls run time and cost. Use *First post only* and **Max posts per thread** to keep big threads cheap.
- **Who-reacted is opt-in.** Leave **Include who reacted** off unless you need the full reactor list — it adds time per post. The reaction count and types are always included.
- **Media comments / profile posts** are sparse on BlackHatWorld — many keywords return zero of those types. Threads and media are the richest.

***

### Why this scraper is fast

- **Speed — a few seconds per page.** No browser to boot, no Playwright / Selenium / Puppeteer overhead. Browser-based scrapers typically take 15–60 seconds per page.
- **Reliability — zero browser flakiness.** No headless-Chromium crashes, no JS-render timeouts, no surprise mid-run failures from a browser quirk.
- **Footprint — under 100 MB RAM per run.** Lightweight and cheap to run; most browser-based scrapers need 1–4 GB.

***

### Pricing

**$5 per 1,000 results.** You pay only for results actually returned to your dataset — pay-per-result, billed by Apify. Failed and aborted runs are not charged for unpushed results.

***

### Support

Questions, a data shape you need, or a bug to report? Open an issue on the actor's **Issues** tab and we'll get back to you.

# Actor input Schema

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

Pick what the actor does. "Scrape thread URLs" ignores the search entirely and scrapes the exact thread URLs you paste — fill in Thread URLs below. "Search BlackHatWorld" runs a keyword search and returns every matching result — fill in the Search query and the search options below. Only the fields for the mode you pick are used; everything for the other mode is ignored.

## `threadUrls` (type: `array`):

Scrape mode only. Paste one or more BlackHatWorld thread URLs to scrape them directly. Each thread is returned with its full posts (content, images, links, reactions and author details). Ignored in Search mode.

## `threadScope` (type: `string`):

Scrape mode. Applies to the threads you paste above. "First post only" returns just the opening post; "All posts" returns the opening post plus every reply.

## `includeReactors` (type: `boolean`):

Scrape mode. Also fetch the full list of members who reacted to each post (username, profile and reaction type). This costs extra requests per post, so leave it off unless you need the reactor list — the reaction count and the first few reactor names are always included anyway.

## `maxPostsPerThread` (type: `integer`):

Scrape mode. When scraping all posts, cap how many posts are pulled from each thread. 0 = no cap (all posts). Ignored when "First post only" is selected.

## `query` (type: `string`):

Search mode only. Keywords to search for across BlackHatWorld (e.g. "apify", "instagram automation", "reddit upvotes"). Ignored in Scrape mode.

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

What to search on BlackHatWorld. "Search everything" returns matches across all content types at once (threads, media, profile posts…), each row tagged with its type. "Search threads" returns discussion threads with their full post content. "Search media" returns image-gallery items (title, category, uploader, image URL, tags). "Search media comments" returns the comments left on gallery items. "Search profile posts" returns status posts left on member profiles. "Search tags" returns the threads carrying a given tag (enter the tag as the search query). Some fields below apply to one search type only — they are ignored for the others.

## `order` (type: `string`):

How to order results. "Most replies" applies to thread search only.

## `titleOnly` (type: `boolean`):

Match the query against thread titles only, ignoring post bodies.

## `newerThan` (type: `string`):

Optional. Only include threads with activity on or after this date. Leave blank for no lower limit.

## `olderThan` (type: `string`):

Optional. Only include threads with activity on or before this date. Leave blank for no upper limit.

## `users` (type: `string`):

Optional. Only threads started by these BlackHatWorld usernames (comma-separated).

## `profileRecipients` (type: `string`):

Optional (profile-post search only). Only profile posts left on these members' profiles (comma-separated usernames). Leave blank for any profile.

## `forums` (type: `array`):

Optional (thread search only). Pick one or more BlackHatWorld forums to search. Leave empty to search the whole site. (Indented entries are sub-forums; pick a top-level section plus "Include sub-forums" to cover everything under it.)

## `searchSubForums` (type: `boolean`):

Thread search only. When forum(s) are selected above, also search the forums nested inside them.

## `mediaCategories` (type: `array`):

Optional (media search only). Limit the media search to these BlackHatWorld gallery categories. Leave empty to search all categories.

## `searchMediaChildCategories` (type: `boolean`):

Media search only. When categories are selected above, also search the categories nested inside them.

## `commentTypes` (type: `array`):

Optional (media-comment search only). Limit to comments left on these item types. Leave both selected (the default) to include every comment.

## `maxResults` (type: `integer`):

Stop after this many results. For thread search, each result is fully scraped (all posts), so this controls run time and cost.

## `minReplies` (type: `integer`):

Thread search only. Only include threads with at least this many replies. 0 = no minimum.

## `searchThreadScope` (type: `string`):

Search mode. Applies to every thread your search returns. "First post only" returns just the opening post; "All posts" returns the opening post plus every reply.

## `searchIncludeReactors` (type: `boolean`):

Search mode. Also fetch the full list of members who reacted to each post (username, profile and reaction type). This costs extra requests per post, so leave it off unless you need the reactor list — the reaction count and the first few reactor names are always included anyway.

## `searchMaxPostsPerThread` (type: `integer`):

Search mode. When scraping all posts, cap how many posts are pulled from each thread your search returns. 0 = no cap (all posts). Ignored when "First post only" is selected.

## Actor input object example

```json
{
  "mode": "scrape",
  "threadUrls": [
    "https://www.blackhatworld.com/seo/the-three-commandments-of-bhw.950872/"
  ],
  "threadScope": "all_posts",
  "includeReactors": false,
  "maxPostsPerThread": 0,
  "query": "apify",
  "searchType": "threads",
  "order": "relevance",
  "titleOnly": false,
  "searchSubForums": false,
  "searchMediaChildCategories": true,
  "commentTypes": [
    "media",
    "albums"
  ],
  "maxResults": 25,
  "minReplies": 0,
  "searchThreadScope": "all_posts",
  "searchIncludeReactors": false,
  "searchMaxPostsPerThread": 0
}
```

# 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 = {
    "threadUrls": [
        "https://www.blackhatworld.com/seo/the-three-commandments-of-bhw.950872/"
    ],
    "query": "apify"
};

// Run the Actor and wait for it to finish
const run = await client.actor("red_crawler/blackhatworld-scraper-search").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 = {
    "threadUrls": ["https://www.blackhatworld.com/seo/the-three-commandments-of-bhw.950872/"],
    "query": "apify",
}

# Run the Actor and wait for it to finish
run = client.actor("red_crawler/blackhatworld-scraper-search").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 '{
  "threadUrls": [
    "https://www.blackhatworld.com/seo/the-three-commandments-of-bhw.950872/"
  ],
  "query": "apify"
}' |
apify call red_crawler/blackhatworld-scraper-search --silent --output-dataset

```

## MCP server setup

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

```

## OpenAPI specification

```json
{
    "openapi": "3.0.1",
    "info": {
        "title": "BlackHatWorld scraper & Search — Threads & Full Posts, No Proxy",
        "description": "Scrape any BlackHatWorld thread straight from its URL — full posts with their images, formatting, links, reactions (and who reacted) and author details — or search the forum and scrape every matching thread. No login or proxy required.",
        "version": "0.15",
        "x-build-id": "T6amrPgjavwafWLlL"
    },
    "servers": [
        {
            "url": "https://api.apify.com/v2"
        }
    ],
    "paths": {
        "/acts/red_crawler~blackhatworld-scraper-search/run-sync-get-dataset-items": {
            "post": {
                "operationId": "run-sync-get-dataset-items-red_crawler-blackhatworld-scraper-search",
                "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/red_crawler~blackhatworld-scraper-search/runs": {
            "post": {
                "operationId": "runs-sync-red_crawler-blackhatworld-scraper-search",
                "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/red_crawler~blackhatworld-scraper-search/run-sync": {
            "post": {
                "operationId": "run-sync-red_crawler-blackhatworld-scraper-search",
                "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",
                "properties": {
                    "mode": {
                        "title": "Mode",
                        "enum": [
                            "scrape",
                            "search"
                        ],
                        "type": "string",
                        "description": "Pick what the actor does. \"Scrape thread URLs\" ignores the search entirely and scrapes the exact thread URLs you paste — fill in Thread URLs below. \"Search BlackHatWorld\" runs a keyword search and returns every matching result — fill in the Search query and the search options below. Only the fields for the mode you pick are used; everything for the other mode is ignored.",
                        "default": "scrape"
                    },
                    "threadUrls": {
                        "title": "Thread URLs — Scrape mode",
                        "type": "array",
                        "description": "Scrape mode only. Paste one or more BlackHatWorld thread URLs to scrape them directly. Each thread is returned with its full posts (content, images, links, reactions and author details). Ignored in Search mode.",
                        "items": {
                            "type": "string"
                        }
                    },
                    "threadScope": {
                        "title": "What to scrape from each thread",
                        "enum": [
                            "all_posts",
                            "first_post"
                        ],
                        "type": "string",
                        "description": "Scrape mode. Applies to the threads you paste above. \"First post only\" returns just the opening post; \"All posts\" returns the opening post plus every reply.",
                        "default": "all_posts"
                    },
                    "includeReactors": {
                        "title": "Include who reacted",
                        "type": "boolean",
                        "description": "Scrape mode. Also fetch the full list of members who reacted to each post (username, profile and reaction type). This costs extra requests per post, so leave it off unless you need the reactor list — the reaction count and the first few reactor names are always included anyway.",
                        "default": false
                    },
                    "maxPostsPerThread": {
                        "title": "Max posts per thread",
                        "minimum": 0,
                        "type": "integer",
                        "description": "Scrape mode. When scraping all posts, cap how many posts are pulled from each thread. 0 = no cap (all posts). Ignored when \"First post only\" is selected.",
                        "default": 0
                    },
                    "query": {
                        "title": "Search query — Search mode",
                        "type": "string",
                        "description": "Search mode only. Keywords to search for across BlackHatWorld (e.g. \"apify\", \"instagram automation\", \"reddit upvotes\"). Ignored in Scrape mode."
                    },
                    "searchType": {
                        "title": "Search type",
                        "enum": [
                            "everything",
                            "threads",
                            "media",
                            "comments",
                            "profiles",
                            "tags"
                        ],
                        "type": "string",
                        "description": "What to search on BlackHatWorld. \"Search everything\" returns matches across all content types at once (threads, media, profile posts…), each row tagged with its type. \"Search threads\" returns discussion threads with their full post content. \"Search media\" returns image-gallery items (title, category, uploader, image URL, tags). \"Search media comments\" returns the comments left on gallery items. \"Search profile posts\" returns status posts left on member profiles. \"Search tags\" returns the threads carrying a given tag (enter the tag as the search query). Some fields below apply to one search type only — they are ignored for the others.",
                        "default": "threads"
                    },
                    "order": {
                        "title": "Sort results by",
                        "enum": [
                            "relevance",
                            "date",
                            "replies"
                        ],
                        "type": "string",
                        "description": "How to order results. \"Most replies\" applies to thread search only.",
                        "default": "relevance"
                    },
                    "titleOnly": {
                        "title": "Search titles only",
                        "type": "boolean",
                        "description": "Match the query against thread titles only, ignoring post bodies.",
                        "default": false
                    },
                    "newerThan": {
                        "title": "Only threads newer than",
                        "type": "string",
                        "description": "Optional. Only include threads with activity on or after this date. Leave blank for no lower limit."
                    },
                    "olderThan": {
                        "title": "Only threads older than",
                        "type": "string",
                        "description": "Optional. Only include threads with activity on or before this date. Leave blank for no upper limit."
                    },
                    "users": {
                        "title": "Started by (usernames)",
                        "type": "string",
                        "description": "Optional. Only threads started by these BlackHatWorld usernames (comma-separated)."
                    },
                    "profileRecipients": {
                        "title": "Posted on profile of (members) — profile posts only",
                        "type": "string",
                        "description": "Optional (profile-post search only). Only profile posts left on these members' profiles (comma-separated usernames). Leave blank for any profile."
                    },
                    "forums": {
                        "title": "Limit to forum(s) — threads only",
                        "type": "array",
                        "description": "Optional (thread search only). Pick one or more BlackHatWorld forums to search. Leave empty to search the whole site. (Indented entries are sub-forums; pick a top-level section plus \"Include sub-forums\" to cover everything under it.)",
                        "items": {
                            "type": "string",
                            "enum": [
                                "23",
                                "311",
                                "242",
                                "261",
                                "262",
                                "263",
                                "265",
                                "299",
                                "24",
                                "25",
                                "26",
                                "226",
                                "31",
                                "303",
                                "73",
                                "203",
                                "310",
                                "193",
                                "194",
                                "195",
                                "308",
                                "196",
                                "197",
                                "198",
                                "18",
                                "112",
                                "43",
                                "199",
                                "206",
                                "200",
                                "302",
                                "201",
                                "1",
                                "252",
                                "28",
                                "9",
                                "3",
                                "2",
                                "101",
                                "103",
                                "280",
                                "270",
                                "32",
                                "86",
                                "215",
                                "214",
                                "87",
                                "211",
                                "301",
                                "279",
                                "217",
                                "216",
                                "210",
                                "77",
                                "95",
                                "168",
                                "173",
                                "53",
                                "169",
                                "171",
                                "108",
                                "209",
                                "224",
                                "170",
                                "172",
                                "94",
                                "30",
                                "11",
                                "107",
                                "15",
                                "66",
                                "71",
                                "72",
                                "225",
                                "96",
                                "50",
                                "218",
                                "68",
                                "69",
                                "76",
                                "65",
                                "12",
                                "175",
                                "106",
                                "158",
                                "167",
                                "208",
                                "132",
                                "13",
                                "83",
                                "219",
                                "93",
                                "85",
                                "125",
                                "205",
                                "102",
                                "141",
                                "75",
                                "174",
                                "165",
                                "40",
                                "79",
                                "128",
                                "60",
                                "61",
                                "62",
                                "131",
                                "59",
                                "129",
                                "80",
                                "127",
                                "130",
                                "126",
                                "212",
                                "207",
                                "221",
                                "269",
                                "235",
                                "222",
                                "213"
                            ],
                            "enumTitles": [
                                "BlackHatWorld",
                                "— BlackHat World News & Updates",
                                "— Newbie Guide",
                                "— — Brand New to BHW",
                                "— — Newbies",
                                "— — Newbie+",
                                "— — Marketplace Sellers",
                                "— — New to Marketplace",
                                "— Introductions",
                                "— BlackHat Lounge",
                                "— Forum Suggestions & Feedback",
                                "— — BHW Beta Testers",
                                "— Dispute Resolution",
                                "— Free Review Copies For Marketplace Approvals",
                                "The Marketplace",
                                "— BHW Marketplace rules and how to post",
                                "— Account Selling / Renting Services",
                                "— Affiliate programs - CPA networks",
                                "— Content / Copywriting",
                                "— Domains & websites for sale",
                                "— eBooks, methods and courses",
                                "— Hosting",
                                "— Hot Deals",
                                "— Images, logos & videos",
                                "— Misc",
                                "— Proxies For Sale",
                                "— SEO - Link building",
                                "— SEO - Other",
                                "— SEO - Packages",
                                "— Social Media",
                                "— Social Media - Panels",
                                "— Web Design",
                                "Black Hat SEO",
                                "— AI - Artificial Intelligence in Digital Marketing",
                                "— Black Hat SEO",
                                "— Black Hat SEO Tools",
                                "— Blogging",
                                "— Cloaking and Content Generators",
                                "— Proxies",
                                "— — Proxy Lists",
                                "— Voice Search",
                                "Social Media",
                                "— General Social Media Chat",
                                "— FaceBook",
                                "— Instagram",
                                "— Linkedin",
                                "— Myspace",
                                "— Pinterest",
                                "— Reddit",
                                "— TikTok",
                                "— Tumblr",
                                "— Weibo",
                                "— X (formerly Twitter)",
                                "— YouTube",
                                "White Hat SEO",
                                "— Copywriting & Sales Persuasion",
                                "— — Downloads - Copywriting & Sales",
                                "— Domain Names & Parking",
                                "— Graphic Design",
                                "— — Downloads - Graphic design",
                                "— Link Building",
                                "— Local SEO",
                                "— Online Reputation Management (ORM)",
                                "— Video Production",
                                "— — Downloads - Video production",
                                "— Web Hosting",
                                "— White Hat SEO",
                                "Making Money",
                                "— Associated Content & Writing Articles",
                                "— Affiliate Programs",
                                "— — Clickbank",
                                "— — CJ Affiliate",
                                "— — Other Affiliate Programs",
                                "— — Zero Parallel & T.UK",
                                "— Business & Tax Advice",
                                "— CPA",
                                "— CryptoCurrency",
                                "— Dropshipping & Wholesale Hookups",
                                "— Ebay",
                                "— Hire a Freelancer",
                                "— Joint Ventures",
                                "— Making Money",
                                "— Media Buying",
                                "— Membership Sites",
                                "— Mobile Marketing",
                                "— My Journey Discussions",
                                "— New Markets",
                                "— Offline Marketing",
                                "— Pay Per Click",
                                "— — Google Ads",
                                "— — Facebook",
                                "— — Yahoo & Bing MSN",
                                "— — Other PPC Networks",
                                "— — General PPC Discussion",
                                "— Pay Per Install",
                                "— Pay Per View",
                                "— Site Flipping",
                                "— Torrents",
                                "— Freebies / Giveaways",
                                "— Service Reviews & Beta Testers Help Wanted",
                                "Programming & Web Design",
                                "— Programming",
                                "— — General Programming Chat",
                                "— — C, C++, C#",
                                "— — Visual Basic 6",
                                "— — Visual Basic .NET",
                                "— — Other Languages",
                                "— Scripting",
                                "— — General Scripting Chat",
                                "— — HTML & JavaScript",
                                "— — PHP & Perl",
                                "— — Other Scripting Languages",
                                "— Web Design",
                                "Conferences / Events",
                                "— BHW Events",
                                "— — UnGagged",
                                "— — — UnGagged Los Angeles",
                                "— — — UnGagged Las Vegas",
                                "— — — UnGagged London",
                                "— — — UnGagged 2014 - Las Vegas"
                            ]
                        }
                    },
                    "searchSubForums": {
                        "title": "Search sub-forums as well — threads only",
                        "type": "boolean",
                        "description": "Thread search only. When forum(s) are selected above, also search the forums nested inside them.",
                        "default": false
                    },
                    "mediaCategories": {
                        "title": "Search in categories — media only",
                        "type": "array",
                        "description": "Optional (media search only). Limit the media search to these BlackHatWorld gallery categories. Leave empty to search all categories.",
                        "items": {
                            "type": "string",
                            "enum": [
                                "",
                                "4",
                                "3"
                            ],
                            "enumTitles": [
                                "All categories",
                                "Marketplace",
                                "Signature images"
                            ]
                        }
                    },
                    "searchMediaChildCategories": {
                        "title": "Search child categories as well — media only",
                        "type": "boolean",
                        "description": "Media search only. When categories are selected above, also search the categories nested inside them.",
                        "default": true
                    },
                    "commentTypes": {
                        "title": "Comments on — media comments only",
                        "type": "array",
                        "description": "Optional (media-comment search only). Limit to comments left on these item types. Leave both selected (the default) to include every comment.",
                        "items": {
                            "type": "string",
                            "enum": [
                                "media",
                                "albums"
                            ],
                            "enumTitles": [
                                "Media items",
                                "Albums"
                            ]
                        },
                        "default": [
                            "media",
                            "albums"
                        ]
                    },
                    "maxResults": {
                        "title": "Max results",
                        "minimum": 1,
                        "maximum": 500,
                        "type": "integer",
                        "description": "Stop after this many results. For thread search, each result is fully scraped (all posts), so this controls run time and cost.",
                        "default": 25
                    },
                    "minReplies": {
                        "title": "Minimum replies — threads only",
                        "minimum": 0,
                        "type": "integer",
                        "description": "Thread search only. Only include threads with at least this many replies. 0 = no minimum.",
                        "default": 0
                    },
                    "searchThreadScope": {
                        "title": "What to scrape from each thread",
                        "enum": [
                            "all_posts",
                            "first_post"
                        ],
                        "type": "string",
                        "description": "Search mode. Applies to every thread your search returns. \"First post only\" returns just the opening post; \"All posts\" returns the opening post plus every reply.",
                        "default": "all_posts"
                    },
                    "searchIncludeReactors": {
                        "title": "Include who reacted",
                        "type": "boolean",
                        "description": "Search mode. Also fetch the full list of members who reacted to each post (username, profile and reaction type). This costs extra requests per post, so leave it off unless you need the reactor list — the reaction count and the first few reactor names are always included anyway.",
                        "default": false
                    },
                    "searchMaxPostsPerThread": {
                        "title": "Max posts per thread",
                        "minimum": 0,
                        "type": "integer",
                        "description": "Search mode. When scraping all posts, cap how many posts are pulled from each thread your search returns. 0 = no cap (all posts). Ignored when \"First post only\" is selected.",
                        "default": 0
                    }
                }
            },
            "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
                                    }
                                }
                            }
                        }
                    }
                }
            }
        }
    }
}
```
