# 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:** 1 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 web data automations that power AI and operations. They run on the Apify platform to scrape websites, process data, connect APIs, and automate workflows.
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.

- **AI agents and MCP clients** — the [Apify MCP server](https://docs.apify.com/integrations/mcp.md) at `https://mcp.apify.com` (remote, streamable HTTP, OAuth on first use).
- **Agentic workflows and local Actor development** — [Agent Skills](https://apify.com/.well-known/agent-skills/index.json) with the [Apify CLI](https://docs.apify.com/cli/docs.md): `npm install -g apify-cli`, then `apify login`.
- **JavaScript/TypeScript projects** — the official [JS/TS client](https://docs.apify.com/api/client/js/docs.md): `npm install apify-client`.
- **Python projects** — the official [Python client](https://docs.apify.com/api/client/python/docs.md): `pip install apify-client`.
- **Any other language** — 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

Download the OpenAPI definition: https://api.apify.com/v2/actors/ziPUD005zx8Ec0NzD/builds/jYoH6eH6pzESim5ec/openapi.json
