# Product Hunt Scraper (`junipr/product-hunt-scraper`) Actor

Scrape Product Hunt launches, upvotes, and comments. Get product name, tagline, URL, upvotes, makers, topics, launch date. Browse daily/weekly/monthly or search. GraphQL API with browser fallback.

- **URL**: https://apify.com/junipr/product-hunt-scraper.md
- **Developed by:** [junipr](https://apify.com/junipr) (community)
- **Categories:** Social media, Developer tools
- **Stats:** 2 total users, 1 monthly users, 100.0% runs succeeded, NaN bookmarks
- **User rating**: No ratings yet

## Pricing

from $3.90 / 1,000 product scrapeds

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

Extract product launches from Product Hunt without an API key. Scrape daily, weekly, and monthly leaderboards, search results, and topic pages. For each product you get upvotes, makers, topics, descriptions, launch dates, thumbnails, and optional comments — all exported as structured JSON ready for analysis, monitoring, or lead generation pipelines.

Product Hunt is a React single-page application that requires a JavaScript-capable browser to render content. This actor uses Playwright with Chromium to load pages fully before extracting data, ensuring accurate upvote counts, maker profiles, and topic tags even as Product Hunt's frontend evolves.

### Why Use This Actor

Product Hunt does not expose a public API. The closest alternative is their GraphQL API, which requires OAuth tokens, has strict rate limits (60 requests per hour on the free tier), and does not support leaderboard browsing. This actor bypasses those limitations entirely.

| Feature | This Actor | PH GraphQL API | Manual Export |
|---------|-----------|---------------|---------------|
| API key required | No | Yes (OAuth) | No |
| Leaderboard access | Daily, weekly, monthly | Limited | Manual only |
| Topic browsing | Yes | Partial | No |
| Search | Yes | Yes | No |
| Comments | Yes (optional) | Yes | No |
| Scheduled runs | Yes (Apify) | Build yourself | No |
| Cost | Pay per product | Free (rate-limited) | Time cost |

### How to Use

**Zero-config — scrape today's top products:**

```json
{
    "mode": "today"
}
````

**Search for AI products:**

```json
{
    "mode": "search",
    "searchQuery": "AI writing assistant",
    "maxProducts": 30
}
```

**Browse a topic page:**

```json
{
    "mode": "topic",
    "topic": "developer-tools",
    "maxProducts": 100
}
```

**Monthly leaderboard with comments:**

```json
{
    "mode": "month",
    "maxProducts": 50,
    "includeComments": true
}
```

### Input Parameters

| Parameter | Type | Default | Description |
|-----------|------|---------|-------------|
| `mode` | string | `"today"` | What to scrape: `today`, `week`, `month`, `search`, or `topic` |
| `searchQuery` | string | `""` | Search terms — required when `mode` is `"search"` |
| `topic` | string | `"artificial-intelligence"` | Topic slug — used when `mode` is `"topic"` |
| `maxProducts` | integer | `50` | Maximum number of products to return (1–1000) |
| `includeComments` | boolean | `false` | Fetch comments for each product (increases run time) |
| `requestTimeout` | integer | `60000` | Page load timeout in milliseconds (5000–300000) |
| `proxyConfiguration` | object | Apify residential | Proxy settings. Defaults to Apify residential proxy. See [Proxy Requirements](#proxy-requirements). |

#### Topic Slug Examples

Use the slug from Product Hunt topic URLs (`/topics/<slug>`):

- `artificial-intelligence`
- `developer-tools`
- `productivity`
- `design-tools`
- `marketing`
- `no-code`
- `saas`

### Proxy Requirements

This actor requires residential proxies because Product Hunt uses Cloudflare protection that blocks datacenter IP addresses.

- **Paid Apify plan users**: Works automatically with the default residential proxy configuration. No changes needed.
- **Free plan users**: Provide your own residential proxy URL in the Proxy Configuration input field. The Apify free plan only includes datacenter proxies, which Product Hunt blocks.
- Without a residential proxy, the actor will exit with a clear error message explaining how to fix the issue.

If you see a "Blocked by Cloudflare" or "Residential proxy required" error, it means the actor could not access Product Hunt through the available proxy. Either upgrade your Apify plan or provide a residential proxy URL.

### Output Format

Each record in the dataset represents one product launch:

```json
{
    "name": "Notion AI",
    "tagline": "The AI workspace that works for you",
    "description": "Notion AI helps you write, edit, summarize...",
    "url": "https://notion.so",
    "productHuntUrl": "https://www.producthunt.com/posts/notion-ai",
    "upvotes": 4200,
    "commentsCount": 312,
    "topics": ["AI", "Productivity", "Writing"],
    "makers": [
        { "name": "Ivan Zhao", "url": "https://www.producthunt.com/@ivanzhao" }
    ],
    "thumbnail": "https://ph-files.imgix.net/abc123.png",
    "launchDate": "2024-01-15",
    "isFeatured": true,
    "rating": null,
    "comments": null,
    "extractedAt": "2026-03-11T12:00:00.000Z"
}
```

When `includeComments` is `true`, the `comments` field contains an array of comment objects with `author`, `body`, `upvotes`, `createdAt`, and nested `replies`.

### Use Cases

**Competitive intelligence** — Monitor when competitors or adjacent products launch on Product Hunt. Schedule daily runs to catch new launches as they happen and alert your team via Apify webhooks to Slack or email.

**Lead generation** — Makers listed on product pages are founders and early-stage entrepreneurs. Extract maker profiles to build targeted outreach lists for developer tools, SaaS, or B2B offerings.

**Market research** — Analyze which categories of products attract the most upvotes over time. Run monthly leaderboard scrapes and aggregate the data to spot emerging trends before they go mainstream.

**Content monitoring** — Track how products in your space are described and positioned. Extract taglines and descriptions to analyze messaging patterns and gaps in the market.

**Investor deal flow** — Product Hunt is a consistent signal for early-stage product traction. Scrape weekly and monthly leaderboards to surface high-upvote products that may be raising.

### Related Actors

- [Hacker News Scraper](https://apify.com/junipr/hacker-news-scraper) — Scrape HN stories, comments, and user profiles
- [Reddit Scraper](https://apify.com/junipr/reddit-scraper) — Scrape Reddit posts and comments from any subreddit
- [RAG Web Extractor](https://apify.com/junipr/rag-web-extractor) — Extract clean markdown from any URL for LLM pipelines

### Pricing

This actor uses Pay-Per-Event (PPE) pricing: **$3.90 per 1,000 products scraped** ($0.0039 per event).

Pricing includes all platform compute costs — no hidden fees.

### FAQ

#### How current is the data?

The actor scrapes Product Hunt live each time it runs. Data is as current as the moment the actor executes. For daily leaderboards, run the actor once per day (after 12:01 AM Pacific) to get the previous day's final rankings.

#### Does this work without a proxy?

Product Hunt uses Cloudflare protection, so a residential proxy is strongly recommended. The actor defaults to Apify's residential proxy group, which requires a paid Apify plan ($49+/month). Free-plan users can provide their own residential proxy URL in the Proxy Configuration input. Without a residential proxy, scraping may be blocked by Cloudflare and the actor will exit with an actionable error message.

#### Why does including comments make runs slower?

Comments require a separate DOM interaction on each product page — scrolling down and waiting for the comment section to render. Each product page with comments adds 3–5 seconds to the run. For 50 products with comments enabled, expect 5–8 minutes total run time.

#### What happens if Product Hunt updates their frontend?

Product Hunt uses React with CSS module class names that can change. This actor uses multiple fallback selectors for each data field and gracefully degrades when a selector stops working — returning `null` for optional fields rather than failing. If a significant layout change breaks extraction, the actor will be updated.

#### Can I scrape historical leaderboards?

Yes. The daily leaderboard URL format is `/leaderboard/daily/YYYY/MM/DD`. While the actor defaults to today's date, you can pass any historical date in that format by running custom mode logic — or request this feature if you need it frequently.

# Actor input Schema

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

What to scrape from Product Hunt. 'today' = today's launches, 'week' = this week's top products, 'month' = this month's top products, 'search' = search results, 'topic' = products under a topic.

## `searchQuery` (type: `string`):

Search query string. Used when mode is 'search'.

## `topic` (type: `string`):

Topic slug to scrape. Used when mode is 'topic'. Examples: artificial-intelligence, developer-tools, productivity, design-tools.

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

Maximum number of products to scrape.

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

Fetch and include comments for each product. Increases run time significantly.

## `requestTimeout` (type: `integer`):

Timeout in milliseconds for each page load.

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

Residential proxy is recommended — Product Hunt uses Cloudflare protection. Defaults to Apify residential proxy (requires paid Apify plan). Free-plan users can provide their own residential proxy URL.

## Actor input object example

```json
{
  "mode": "today",
  "searchQuery": "",
  "topic": "artificial-intelligence",
  "maxProducts": 50,
  "includeComments": false,
  "requestTimeout": 60000,
  "proxyConfiguration": {
    "useApifyProxy": true,
    "apifyProxyGroups": [
      "RESIDENTIAL"
    ]
  }
}
```

# Actor output Schema

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

Product Hunt launches with upvotes, taglines, descriptions, makers, topics, thumbnails, and comment data.

# 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 = {};

// Run the Actor and wait for it to finish
const run = await client.actor("junipr/product-hunt-scraper").call(input);

// Fetch and print Actor results from the run's dataset (if any)
console.log('Results from dataset');
console.log(`💾 Check your data here: https://console.apify.com/storage/datasets/${run.defaultDatasetId}`);
const { items } = await client.dataset(run.defaultDatasetId).listItems();
items.forEach((item) => {
    console.dir(item);
});

// 📚 Want to learn more 📖? Go to → https://docs.apify.com/api/client/js/docs

```

## Python example

```python
from apify_client import ApifyClient

# Initialize the ApifyClient with your Apify API token
# Replace '<YOUR_API_TOKEN>' with your token.
client = ApifyClient("<YOUR_API_TOKEN>")

# Prepare the Actor input
run_input = {}

# Run the Actor and wait for it to finish
run = client.actor("junipr/product-hunt-scraper").call(run_input=run_input)

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

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

```

## CLI example

```bash
echo '{}' |
apify call junipr/product-hunt-scraper --silent --output-dataset

```

## MCP server setup

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

```

## OpenAPI specification

```json
{
    "openapi": "3.0.1",
    "info": {
        "title": "Product Hunt Scraper",
        "description": "Scrape Product Hunt launches, upvotes, and comments. Get product name, tagline, URL, upvotes, makers, topics, launch date. Browse daily/weekly/monthly or search. GraphQL API with browser fallback.",
        "version": "1.0",
        "x-build-id": "PLr3X9cgzXNul9i4b"
    },
    "servers": [
        {
            "url": "https://api.apify.com/v2"
        }
    ],
    "paths": {
        "/acts/junipr~product-hunt-scraper/run-sync-get-dataset-items": {
            "post": {
                "operationId": "run-sync-get-dataset-items-junipr-product-hunt-scraper",
                "x-openai-isConsequential": false,
                "summary": "Executes an Actor, waits for its completion, and returns Actor's dataset items in response.",
                "tags": [
                    "Run Actor"
                ],
                "requestBody": {
                    "required": true,
                    "content": {
                        "application/json": {
                            "schema": {
                                "$ref": "#/components/schemas/inputSchema"
                            }
                        }
                    }
                },
                "parameters": [
                    {
                        "name": "token",
                        "in": "query",
                        "required": true,
                        "schema": {
                            "type": "string"
                        },
                        "description": "Enter your Apify token here"
                    }
                ],
                "responses": {
                    "200": {
                        "description": "OK"
                    }
                }
            }
        },
        "/acts/junipr~product-hunt-scraper/runs": {
            "post": {
                "operationId": "runs-sync-junipr-product-hunt-scraper",
                "x-openai-isConsequential": false,
                "summary": "Executes an Actor and returns information about the initiated run in response.",
                "tags": [
                    "Run Actor"
                ],
                "requestBody": {
                    "required": true,
                    "content": {
                        "application/json": {
                            "schema": {
                                "$ref": "#/components/schemas/inputSchema"
                            }
                        }
                    }
                },
                "parameters": [
                    {
                        "name": "token",
                        "in": "query",
                        "required": true,
                        "schema": {
                            "type": "string"
                        },
                        "description": "Enter your Apify token here"
                    }
                ],
                "responses": {
                    "200": {
                        "description": "OK",
                        "content": {
                            "application/json": {
                                "schema": {
                                    "$ref": "#/components/schemas/runsResponseSchema"
                                }
                            }
                        }
                    }
                }
            }
        },
        "/acts/junipr~product-hunt-scraper/run-sync": {
            "post": {
                "operationId": "run-sync-junipr-product-hunt-scraper",
                "x-openai-isConsequential": false,
                "summary": "Executes an Actor, waits for completion, and returns the OUTPUT from Key-value store in response.",
                "tags": [
                    "Run Actor"
                ],
                "requestBody": {
                    "required": true,
                    "content": {
                        "application/json": {
                            "schema": {
                                "$ref": "#/components/schemas/inputSchema"
                            }
                        }
                    }
                },
                "parameters": [
                    {
                        "name": "token",
                        "in": "query",
                        "required": true,
                        "schema": {
                            "type": "string"
                        },
                        "description": "Enter your Apify token here"
                    }
                ],
                "responses": {
                    "200": {
                        "description": "OK"
                    }
                }
            }
        }
    },
    "components": {
        "schemas": {
            "inputSchema": {
                "type": "object",
                "properties": {
                    "mode": {
                        "title": "Scrape Mode",
                        "enum": [
                            "today",
                            "week",
                            "month",
                            "search",
                            "topic"
                        ],
                        "type": "string",
                        "description": "What to scrape from Product Hunt. 'today' = today's launches, 'week' = this week's top products, 'month' = this month's top products, 'search' = search results, 'topic' = products under a topic.",
                        "default": "today"
                    },
                    "searchQuery": {
                        "title": "Search Query",
                        "type": "string",
                        "description": "Search query string. Used when mode is 'search'.",
                        "default": ""
                    },
                    "topic": {
                        "title": "Topic Slug",
                        "type": "string",
                        "description": "Topic slug to scrape. Used when mode is 'topic'. Examples: artificial-intelligence, developer-tools, productivity, design-tools.",
                        "default": "artificial-intelligence"
                    },
                    "maxProducts": {
                        "title": "Max Products",
                        "minimum": 1,
                        "maximum": 1000,
                        "type": "integer",
                        "description": "Maximum number of products to scrape.",
                        "default": 50
                    },
                    "includeComments": {
                        "title": "Include Comments",
                        "type": "boolean",
                        "description": "Fetch and include comments for each product. Increases run time significantly.",
                        "default": false
                    },
                    "requestTimeout": {
                        "title": "Request Timeout (ms)",
                        "minimum": 5000,
                        "maximum": 300000,
                        "type": "integer",
                        "description": "Timeout in milliseconds for each page load.",
                        "default": 60000
                    },
                    "proxyConfiguration": {
                        "title": "Proxy Configuration",
                        "type": "object",
                        "description": "Residential proxy is recommended — Product Hunt uses Cloudflare protection. Defaults to Apify residential proxy (requires paid Apify plan). Free-plan users can provide their own residential proxy URL.",
                        "default": {
                            "useApifyProxy": true,
                            "apifyProxyGroups": [
                                "RESIDENTIAL"
                            ]
                        }
                    }
                }
            },
            "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
                                    }
                                }
                            }
                        }
                    }
                }
            }
        }
    }
}
```
