# Product Hunt Scraper — Launches, Comments & Leads (`philzx/ph-launch-intelligence`) Actor

Scrape Product Hunt launches, full comments, makers, videos, built-with tools, momentum scores, websites, and lead signals via fast HTTP-only extraction.

- **URL**: https://apify.com/philzx/ph-launch-intelligence.md
- **Developed by:** [Filipe Alves](https://apify.com/philzx) (community)
- **Categories:** Lead generation, Developer tools, Automation
- **Stats:** 2 total users, 1 monthly users, 100.0% runs succeeded, 0 bookmarks
- **User rating**: No ratings yet

## Pricing

$0.45 / 1,000 enriched product launches

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

## Product Hunt Scraper — Launches, Comments & Leads

Fast HTTP-only Product Hunt scraper for launch intelligence, startup lead generation, competitor research, founder discovery, and deal-flow monitoring.

Extract ranked Product Hunt launches with **full comment threads** (via HTTP-only GraphQL pagination — no Playwright, no Product Hunt API token), scores, followers, topics, makers, reviews, screenshots, videos/media metadata, built-with tools, website URLs, launch history, website text, tech-stack detection, maker profiles, commenter profiles, momentum scores, promoted/ad signals, and email discovery.

### Why this Actor

- **Same price as the cheapest serious competitor:** $0.45 / 1,000 records
- **No browser required:** pure HTTP scraping — fast, reliable, low-cost
- **Full comments:** ALL comment threads via Apollo persisted GraphQL pagination (not just SSR-visible)
- **Any URL supported:** product pages, leaderboards (daily/weekly/monthly/yearly), topics, collections, maker profiles, search — all auto-detected
- **Ranks included:** daily, weekly, monthly, and yearly leaderboard ranks
- **Momentum scores:** score_per_hour, comment_rate, launch_age_hours, momentum_signal (breakout/trending/steady/slow)
- **Commenter lead generation:** extract commenter profiles with bio, social links, and roles
- **Built-with tools:** Product Hunt launch shoutouts (GitHub, Figma, AWS, etc.)
- **Media/videos:** Product Hunt gallery images plus video platform/ID/URL metadata
- **Explicit promoted/ad signals:** conservative `is_promoted` + `promoted_ads_on_page`
- **Multi-category feed mode:** scrape multiple Product Hunt categories in one run
- **Historical data:** scrape past daily/weekly/monthly/yearly leaderboards

### Supported input URLs

The Actor auto-detects and routes any Product Hunt URL type:

| URL pattern | What it does |
|---|---|
| `https://www.producthunt.com/products/{slug}` | Scrape a single product |
| `https://www.producthunt.com/leaderboard/daily/2026/7/6` | Scrape a daily leaderboard |
| `https://www.producthunt.com/leaderboard/weekly/2026/28` | Scrape a weekly leaderboard |
| `https://www.producthunt.com/leaderboard/monthly/2026/7` | Scrape a monthly leaderboard |
| `https://www.producthunt.com/leaderboard/yearly/2026` | Scrape a yearly leaderboard |
| `https://www.producthunt.com/topics/{topic}` | Scrape all products from a topic page |
| `https://www.producthunt.com/collections/{id}` | Scrape all products from a collection |
| `https://www.producthunt.com/@{username}` | Scrape all products from a maker profile |
| `https://www.producthunt.com/all?q={query}` | Scrape products from search results |

### What it does

1. Fetches Product Hunt leaderboard pages, product URLs, topic/collection/maker/search pages, or Atom feeds.
2. Extracts rank from leaderboard HTML.
3. Extracts Apollo SSR data: `latestScore`, `launchDayScore`, `commentsCount`, `followersCount`, `featuredAt`, `websiteUrl`, `topics`, etc.
4. Enriches product pages via JSON-LD + Apollo SSR.
5. Fetches **ALL comments** via Apollo persisted GraphQL with cursor pagination (no Playwright, no OAuth token).
6. Extracts Product Hunt built-with/shoutout tools from `detailedReviews`.
7. Extracts media gallery entries including video URL/platform/video ID.
8. Extracts explicit promoted/ad blocks without guessing.
9. Computes momentum scores: `score_per_hour`, `comment_rate`, `launch_age_hours`, `momentum_signal`.
10. Optionally enriches commenter profiles for lead generation.
11. Optionally fetches `/products/{slug}/launches` for launch history.
12. Optionally fetches product websites for cleaned text + tech stack.
13. Optionally fetches maker profile pages for headline/followers/social links.
14. Optionally scans product websites for emails.

### Input

| Field | Type | Default | Description |
|---|---|---:|---|
| `startUrls` | array | `[]` | Any Product Hunt URLs — products, leaderboards, topics, collections, maker profiles, search. Auto-detected. |
| `mode` | string | `leaderboard` | `leaderboard`, `feed`, or `both`. Ignored when `startUrls` is set. |
| `leaderboardType` | string | `daily` | `daily`, `weekly`, `monthly`, `yearly` |
| `date` | string | `""` | Date path: daily=`2026/7/4`, weekly=`2026/27`, monthly=`2026/6`, yearly=`2026` |
| `categories` | array | `[]` | Feed categories: `ai-software`, `tech`, `design-tools`, `developer-tools`, etc. |
| `maxEntries` | integer | `50` | Max entries per feed category |
| `enrichProducts` | boolean | `true` | Fetch product pages for full data |
| `maxProducts` | integer | `0` | Limit products to enrich (`0` = all) |
| `includeComments` | boolean | `false` | Extract full comment text via GraphQL pagination |
| `maxCommentsPerProduct` | integer | `20` | Max comments per product |
| `includeMomentum` | boolean | `true` | Compute momentum scores (score_per_hour, comment_rate, etc.) |
| `enrichCommenters` | boolean | `false` | Fetch commenter profiles for lead generation |
| `maxCommentersPerProduct` | integer | `50` | Max commenter profiles to enrich per product |
| `includeBuiltWith` | boolean | `true` | Extract Product Hunt built-with/shoutout tools |
| `includeMedia` | boolean | `true` | Extract Product Hunt images/videos/media metadata |
| `includePromotedAds` | boolean | `true` | Extract explicit promoted/ad blocks and conservative `is_promoted` |
| `enrichMakers` | boolean | `false` | Fetch maker profile pages for extra founder data |
| `maxMakersPerProduct` | integer | `3` | Max makers to enrich per product (`0` = all) |
| `featuredOnly` | boolean | `false` | Keep only featured/ranked launches |
| `excludePromoted` | boolean | `false` | Exclude only when an explicit promoted marker is exposed |
| `minScore` | integer | `0` | Keep only products with `latestScore >= minScore` |
| `minComments` | integer | `0` | Keep only products with `commentsCount >= minComments` |
| `includeLaunchHistory` | boolean | `false` | Fetch launch history from `/products/{slug}/launches` |
| `includeWebsiteText` | boolean | `false` | Add cleaned visible text from product website |
| `maxWebsiteTextChars` | integer | `5000` | Max chars to keep in `website_text` |
| `detectTechStack` | boolean | `false` | Detect Next.js, Vercel, Webflow, Shopify, WordPress, Stripe, etc. |
| `extractEmails` | boolean | `false` | Scan product websites for email addresses |

### Example: full competitive intelligence

```json
{
  "startUrls": ["https://www.producthunt.com/products/vida-5"],
  "enrichProducts": true,
  "includeComments": true,
  "maxCommentsPerProduct": 100,
  "includeMomentum": true,
  "enrichCommenters": true,
  "maxCommentersPerProduct": 20,
  "includeBuiltWith": true,
  "includeMedia": true,
  "includeLaunchHistory": true,
  "includeWebsiteText": true,
  "detectTechStack": true,
  "enrichMakers": true,
  "maxMakersPerProduct": 2
}
````

### Output example

```json
{
  "name": "PhoneDeck",
  "slug": "phonedeck",
  "product_url": "https://www.producthunt.com/products/phonedeck",
  "dailyRank": 3,
  "latestScore": 258,
  "launchDayScore": 226,
  "commentsCount": 22,
  "followersCount": 323,
  "featuredAt": "2026-07-04T00:01:00-07:00",
  "websiteUrl": "https://phonedeck.io",
  "topics": ["iOS", "Mac", "Productivity", "Artificial Intelligence", "Business"],
  "launch_age_hours": 48.5,
  "score_per_comment": 11.73,
  "score_per_hour": 5.32,
  "comment_rate": 0.45,
  "momentum_signal": "steady",
  "comments": [
    {"id": "5511611", "text": "Congrats on the launch!", "author": {"username": "itsluo", "name": "Luo"}}
  ],
  "commenters": [
    {"commenter_username": "itsluo", "name": "Luo", "headline": "Building things", "followers_count": 40, "roles": ["commenter"]}
  ],
  "built_with": [{"name": "GitHub", "slug": "github"}],
  "videos": [{"platform": "youtube", "video_id": "INgBoXo1flI"}],
  "makers": [{"name": "Vansh Parihar", "username": "vanshmparihar", "headline": "Built PhoneDeck in 7 days."}],
  "scraped_at": "2026-07-06T..."
}
```

### Pricing

**Pay per result:** $0.45 per 1,000 enriched Product Hunt records.

No charge for failed lookups. Free trial available.

# Actor input Schema

## `startUrls` (type: `array`):

Optional Product Hunt product or leaderboard URLs to scrape directly. Supports /products/{slug} and /leaderboard/{daily|weekly|monthly|yearly}/... URLs. When provided, these URLs override mode/date/category inputs.

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

leaderboard = fetch ranked products from leaderboard pages. feed = fetch from Atom feed by category. both = fetch from leaderboard then add feed categories. Ignored when startUrls is set.

## `leaderboardType` (type: `string`):

Type of leaderboard to scrape. Only used when mode is leaderboard or both.

## `date` (type: `string`):

Date for the leaderboard. Format: daily='2026/7/4', weekly='2026/27', monthly='2026/6', yearly='2026'. Leave empty for today (daily only).

## `categories` (type: `array`):

Product Hunt categories for feed mode. Examples: ai-software, tech, design-tools, developer-tools, marketing, productivity.

## `maxEntries` (type: `integer`):

Maximum entries per category from Atom feed (max 50).

## `enrichProducts` (type: `boolean`):

Fetch each product page for full data: scores, followers, makers, reviews, ratings, pricing, screenshots, topics, and website.

## `maxProducts` (type: `integer`):

Limit number of products to enrich (0 = all). Useful to control time/cost.

## `includeComments` (type: `boolean`):

Extract visible Product Hunt comments from Apollo SSR data when available. Some launch comments are loaded separately by Product Hunt and may not be SSR-visible.

## `maxCommentsPerProduct` (type: `integer`):

Maximum number of SSR-visible comments to return per product.

## `includeBuiltWith` (type: `boolean`):

Extract tools/products shown in Product Hunt Built With / launch shoutouts, e.g. GitHub, Figma, AWS.

## `includeMedia` (type: `boolean`):

Extract Product Hunt media gallery entries including images, videos, platforms, video IDs, and thumbnails.

## `includePromotedAds` (type: `boolean`):

Extract explicit Product Hunt promoted ad blocks found on the page and mark the current product as promoted only if the ad slug matches.

## `enrichCommenters` (type: `boolean`):

Fetch profile pages for unique commenters to extract headline, bio, follower counts, and social links. Useful for lead generation from comment sections.

## `maxCommentersPerProduct` (type: `integer`):

Maximum number of commenter profiles to enrich per product (0 = all).

## `includeMomentum` (type: `boolean`):

Compute derived momentum signals: launch\_age\_hours, score\_per\_comment, score\_per\_hour, comment\_rate, momentum\_signal.

## `enrichMakers` (type: `boolean`):

Fetch maker profile pages to extract headline, follower counts, review counts, product counts, Twitter handle, and external links.

## `maxMakersPerProduct` (type: `integer`):

Maximum number of maker profiles to enrich per product (0 = all).

## `featuredOnly` (type: `boolean`):

Keep only products with a featuredAt timestamp or leaderboard rank.

## `excludePromoted` (type: `boolean`):

Exclude products only when Product Hunt exposes an explicit promoted marker. Conservative: does not guess from hideVotesCount.

## `minScore` (type: `integer`):

Keep only products with latestScore >= this value. 0 disables the filter.

## `minComments` (type: `integer`):

Keep only products with commentsCount >= this value. 0 disables the filter.

## `includeLaunchHistory` (type: `boolean`):

Fetch /products/{slug}/launches and extract best-effort historical launch records from Apollo SSR.

## `includeWebsiteText` (type: `boolean`):

Fetch each product website and add cleaned visible text as website\_text. Useful for lead scoring and search.

## `maxWebsiteTextChars` (type: `integer`):

Maximum characters to keep from the cleaned website text.

## `detectTechStack` (type: `boolean`):

Detect common website technologies from HTML and response headers: Next.js, Vercel, Webflow, Shopify, WordPress, Stripe, PostHog, GA, Cloudflare, etc.

## `extractEmails` (type: `boolean`):

Visit product websites and scan for email addresses.

## Actor input object example

```json
{
  "startUrls": [],
  "mode": "leaderboard",
  "leaderboardType": "daily",
  "date": "",
  "categories": [],
  "maxEntries": 50,
  "enrichProducts": true,
  "maxProducts": 0,
  "includeComments": false,
  "maxCommentsPerProduct": 20,
  "includeBuiltWith": true,
  "includeMedia": true,
  "includePromotedAds": true,
  "enrichCommenters": false,
  "maxCommentersPerProduct": 50,
  "includeMomentum": true,
  "enrichMakers": false,
  "maxMakersPerProduct": 3,
  "featuredOnly": false,
  "excludePromoted": false,
  "minScore": 0,
  "minComments": 0,
  "includeLaunchHistory": false,
  "includeWebsiteText": false,
  "maxWebsiteTextChars": 5000,
  "detectTechStack": false,
  "extractEmails": false
}
```

# Actor output Schema

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

No description

# API

You can run this Actor programmatically using our API. Below are code examples in JavaScript, Python, and CLI, as well as the OpenAPI specification and MCP server setup.

## JavaScript example

```javascript
import { ApifyClient } from 'apify-client';

// Initialize the ApifyClient with your Apify API token
// Replace the '<YOUR_API_TOKEN>' with your token
const client = new ApifyClient({
    token: '<YOUR_API_TOKEN>',
});

// Prepare Actor input
const input = {
    "startUrls": [],
    "categories": []
};

// Run the Actor and wait for it to finish
const run = await client.actor("philzx/ph-launch-intelligence").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 = {
    "startUrls": [],
    "categories": [],
}

# Run the Actor and wait for it to finish
run = client.actor("philzx/ph-launch-intelligence").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 '{
  "startUrls": [],
  "categories": []
}' |
apify call philzx/ph-launch-intelligence --silent --output-dataset

```

## MCP server setup

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

```

## OpenAPI specification

```json
{
    "openapi": "3.0.1",
    "info": {
        "title": "Product Hunt Scraper — Launches, Comments & Leads",
        "description": "Scrape Product Hunt launches, full comments, makers, videos, built-with tools, momentum scores, websites, and lead signals via fast HTTP-only extraction.",
        "version": "0.0",
        "x-build-id": "jYoH6eH6pzESim5ec"
    },
    "servers": [
        {
            "url": "https://api.apify.com/v2"
        }
    ],
    "paths": {
        "/acts/philzx~ph-launch-intelligence/run-sync-get-dataset-items": {
            "post": {
                "operationId": "run-sync-get-dataset-items-philzx-ph-launch-intelligence",
                "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/philzx~ph-launch-intelligence/runs": {
            "post": {
                "operationId": "runs-sync-philzx-ph-launch-intelligence",
                "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/philzx~ph-launch-intelligence/run-sync": {
            "post": {
                "operationId": "run-sync-philzx-ph-launch-intelligence",
                "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": {
                    "startUrls": {
                        "title": "Product Hunt URLs",
                        "type": "array",
                        "description": "Optional Product Hunt product or leaderboard URLs to scrape directly. Supports /products/{slug} and /leaderboard/{daily|weekly|monthly|yearly}/... URLs. When provided, these URLs override mode/date/category inputs.",
                        "items": {
                            "type": "string"
                        }
                    },
                    "mode": {
                        "title": "Mode",
                        "enum": [
                            "leaderboard",
                            "feed",
                            "both"
                        ],
                        "type": "string",
                        "description": "leaderboard = fetch ranked products from leaderboard pages. feed = fetch from Atom feed by category. both = fetch from leaderboard then add feed categories. Ignored when startUrls is set.",
                        "default": "leaderboard"
                    },
                    "leaderboardType": {
                        "title": "Leaderboard type",
                        "enum": [
                            "daily",
                            "weekly",
                            "monthly",
                            "yearly"
                        ],
                        "type": "string",
                        "description": "Type of leaderboard to scrape. Only used when mode is leaderboard or both.",
                        "default": "daily"
                    },
                    "date": {
                        "title": "Date",
                        "type": "string",
                        "description": "Date for the leaderboard. Format: daily='2026/7/4', weekly='2026/27', monthly='2026/6', yearly='2026'. Leave empty for today (daily only).",
                        "default": ""
                    },
                    "categories": {
                        "title": "Categories (feed mode)",
                        "type": "array",
                        "description": "Product Hunt categories for feed mode. Examples: ai-software, tech, design-tools, developer-tools, marketing, productivity.",
                        "items": {
                            "type": "string"
                        }
                    },
                    "maxEntries": {
                        "title": "Max entries per category (feed)",
                        "minimum": 1,
                        "maximum": 50,
                        "type": "integer",
                        "description": "Maximum entries per category from Atom feed (max 50).",
                        "default": 50
                    },
                    "enrichProducts": {
                        "title": "Enrich product pages",
                        "type": "boolean",
                        "description": "Fetch each product page for full data: scores, followers, makers, reviews, ratings, pricing, screenshots, topics, and website.",
                        "default": true
                    },
                    "maxProducts": {
                        "title": "Max products to enrich",
                        "minimum": 0,
                        "type": "integer",
                        "description": "Limit number of products to enrich (0 = all). Useful to control time/cost.",
                        "default": 0
                    },
                    "includeComments": {
                        "title": "Include comments text",
                        "type": "boolean",
                        "description": "Extract visible Product Hunt comments from Apollo SSR data when available. Some launch comments are loaded separately by Product Hunt and may not be SSR-visible.",
                        "default": false
                    },
                    "maxCommentsPerProduct": {
                        "title": "Max comments per product",
                        "minimum": 0,
                        "maximum": 200,
                        "type": "integer",
                        "description": "Maximum number of SSR-visible comments to return per product.",
                        "default": 20
                    },
                    "includeBuiltWith": {
                        "title": "Include Product Hunt Built With tools",
                        "type": "boolean",
                        "description": "Extract tools/products shown in Product Hunt Built With / launch shoutouts, e.g. GitHub, Figma, AWS.",
                        "default": true
                    },
                    "includeMedia": {
                        "title": "Include media and videos",
                        "type": "boolean",
                        "description": "Extract Product Hunt media gallery entries including images, videos, platforms, video IDs, and thumbnails.",
                        "default": true
                    },
                    "includePromotedAds": {
                        "title": "Include explicit promoted/ad signals",
                        "type": "boolean",
                        "description": "Extract explicit Product Hunt promoted ad blocks found on the page and mark the current product as promoted only if the ad slug matches.",
                        "default": true
                    },
                    "enrichCommenters": {
                        "title": "Enrich commenter profiles",
                        "type": "boolean",
                        "description": "Fetch profile pages for unique commenters to extract headline, bio, follower counts, and social links. Useful for lead generation from comment sections.",
                        "default": false
                    },
                    "maxCommentersPerProduct": {
                        "title": "Max commenters per product",
                        "minimum": 0,
                        "maximum": 500,
                        "type": "integer",
                        "description": "Maximum number of commenter profiles to enrich per product (0 = all).",
                        "default": 50
                    },
                    "includeMomentum": {
                        "title": "Include momentum scores",
                        "type": "boolean",
                        "description": "Compute derived momentum signals: launch_age_hours, score_per_comment, score_per_hour, comment_rate, momentum_signal.",
                        "default": true
                    },
                    "enrichMakers": {
                        "title": "Enrich maker profiles",
                        "type": "boolean",
                        "description": "Fetch maker profile pages to extract headline, follower counts, review counts, product counts, Twitter handle, and external links.",
                        "default": false
                    },
                    "maxMakersPerProduct": {
                        "title": "Max makers per product",
                        "minimum": 0,
                        "maximum": 20,
                        "type": "integer",
                        "description": "Maximum number of maker profiles to enrich per product (0 = all).",
                        "default": 3
                    },
                    "featuredOnly": {
                        "title": "Featured launches only",
                        "type": "boolean",
                        "description": "Keep only products with a featuredAt timestamp or leaderboard rank.",
                        "default": false
                    },
                    "excludePromoted": {
                        "title": "Exclude promoted products",
                        "type": "boolean",
                        "description": "Exclude products only when Product Hunt exposes an explicit promoted marker. Conservative: does not guess from hideVotesCount.",
                        "default": false
                    },
                    "minScore": {
                        "title": "Minimum score / votes proxy",
                        "minimum": 0,
                        "type": "integer",
                        "description": "Keep only products with latestScore >= this value. 0 disables the filter.",
                        "default": 0
                    },
                    "minComments": {
                        "title": "Minimum comments count",
                        "minimum": 0,
                        "type": "integer",
                        "description": "Keep only products with commentsCount >= this value. 0 disables the filter.",
                        "default": 0
                    },
                    "includeLaunchHistory": {
                        "title": "Include launch history",
                        "type": "boolean",
                        "description": "Fetch /products/{slug}/launches and extract best-effort historical launch records from Apollo SSR.",
                        "default": false
                    },
                    "includeWebsiteText": {
                        "title": "Include website raw text",
                        "type": "boolean",
                        "description": "Fetch each product website and add cleaned visible text as website_text. Useful for lead scoring and search.",
                        "default": false
                    },
                    "maxWebsiteTextChars": {
                        "title": "Max website text chars",
                        "minimum": 0,
                        "maximum": 50000,
                        "type": "integer",
                        "description": "Maximum characters to keep from the cleaned website text.",
                        "default": 5000
                    },
                    "detectTechStack": {
                        "title": "Detect website tech stack",
                        "type": "boolean",
                        "description": "Detect common website technologies from HTML and response headers: Next.js, Vercel, Webflow, Shopify, WordPress, Stripe, PostHog, GA, Cloudflare, etc.",
                        "default": false
                    },
                    "extractEmails": {
                        "title": "Extract emails from websites",
                        "type": "boolean",
                        "description": "Visit product websites and scan for email addresses.",
                        "default": false
                    }
                }
            },
            "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
                                    }
                                }
                            }
                        }
                    }
                }
            }
        }
    }
}
```
