# Product Hunt Scraper (Daily Launches, Votes, Makers) (`webdatatools/producthunt-scraper`) Actor

Scrape Product Hunt launches: the daily leaderboard with rank, votes, comments, topics and makers, or the newest posts from the public feed. One row per product.

- **URL**: https://apify.com/webdatatools/producthunt-scraper.md
- **Developed by:** [Murat Uzun](https://apify.com/webdatatools) (community)
- **Categories:** News
- **Security:** Limited permissions
- **Stats:** 2 total users, 1 monthly users, 0.0% runs succeeded, 0 bookmarks
- **User rating**: No ratings yet

## Pricing

from $0.90 / 1,000 products

This Actor is paid per event. You are not charged for the Apify platform usage, but only a fixed price for specific events.
Since this Actor supports Apify Store discounts, the price gets lower the higher subscription plan you have.

Learn more: https://docs.apify.com/actors/running/actors-in-store.md#pay-per-event

## What's an Apify Actor?

An Actor is a serverless cloud program that runs on the Apify platform. It has two run modes.
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.

Apify vocabulary and the platform model are defined once, in the agent quickstart at https://apify.com/agents.md.

## 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.

Do not guess an integration path. Every one of them is in the agent quickstart at https://apify.com/agents.md: the Apify MCP server, Agent Skills with the Apify CLI, the JavaScript and Python clients, the REST API, and the account-free path for an agent with no human to sign in. It also carries the rule on stating cost before the first paid run.

For examples already wired to this Actor's own input schema, see the [API](#api) section below.

Each client library has reference documentation the quickstart does not restate: [JavaScript/TypeScript](https://docs.apify.com/api/client/js/docs.md) (`npm install apify-client`) and [Python](https://docs.apify.com/api/client/python/docs.md) (`pip install apify-client`).

# README

## Product Hunt Scraper (Daily Launches, Votes, Makers)

### What is Product Hunt Scraper?

Product Hunt Scraper collects product launches from Product Hunt. Two sources are available. The **daily leaderboard** gives, for each day you choose, the ranked launches with votes, comments, topics and the Product Hunt page. The **newest posts feed** gives the 50 latest posts with name, tagline, maker and links, but no votes or comments.

Use it for launch monitoring, competitor research, lists of the day's top products and trend tracking by topic. It reads public Product Hunt pages and the public feed. No login is used.

### What data does Product Hunt Scraper extract?

| Field | Type | Meaning |
|---|---|---|
| postId | string or null | Product Hunt post id (null on the Markdown view) |
| position | number | Row position in this run |
| source | string | `daily` or `feed` |
| date | string or null | Launch day (daily) or post date (feed), YYYY-MM-DD |
| rank | number or null | Daily rank on that board (1 = top); null in the feed |
| name | string | Product name |
| tagline | string or null | One-line description |
| url | string or null | Product Hunt product page |
| discussionUrl | string or null | Feed only: the product link |
| externalUrl | string or null | Product website, from the Markdown view or the feed redirect link |
| maker | string or null | Feed only: author name as the feed shows it |
| votes | number or null | Daily only: current score ("latestScore") |
| comments | number or null | Daily only: comment count |
| topics | string or null | Topics, separated by semicolons |
| publishedAt | string or null | Feed: publish time. Daily: time the post was featured |
| updatedAt | string or null | Feed only: last update |
| scrapedAt | string | ISO timestamp of the scrape |

### How to use Product Hunt Scraper

1. Choose the source: "Daily leaderboard" for ranked launches, or "Newest posts feed" for the latest posts.
2. Daily only: enter the dates, one per line, as YYYY-MM-DD. Leave it empty for yesterday (UTC), the last full daily board.
3. Set "Max products" (default 20).
4. Start the run, then download the dataset or read it through the API.

### Example input

```json
{
    "source": "daily",
    "dates": ["2026-10-22"],
    "maxResults": 20
}
```

### Example output

Real row from a daily run on 23 Oct 2026 (board of 22 Oct 2026):

```json
{
    "postId": "1286749",
    "position": 1,
    "source": "daily",
    "date": "2026-10-22",
    "rank": 1,
    "name": "DeepCell",
    "tagline": "Your deadline survival kit for office work",
    "url": "https://www.producthunt.com/products/deepcell",
    "discussionUrl": null,
    "externalUrl": null,
    "maker": null,
    "votes": 334,
    "comments": 75,
    "topics": "Productivity; Artificial Intelligence; Business",
    "publishedAt": "2026-10-22T00:01:00-07:00",
    "updatedAt": null,
    "scrapedAt": "2026-10-23T10:26:49.909Z"
}
```

### Input parameters

| Parameter | Default | Description |
|---|---|---|
| source | daily | `daily` (leaderboard with votes) or `feed` (newest 50 posts) |
| dates | empty (yesterday, UTC) | Daily only. Launch days as YYYY-MM-DD, up to 31 |
| maxResults | 20 | Products per run, 1 to 500 |
| debug | false | Saves the fetched board HTML to the key-value store. For troubleshooting only |

### Pricing

Pay per product: **$1.50 per 1,000 products** on the free plan ($0.0015 per product). Volume tiers lower the price on paid Apify plans.

Measured on 23 Oct 2026 at 256 MB: a run for two daily boards (34 products, one residential page per board) used $0.001 of platform usage in 16 seconds. The CLI prints usage to three decimals, so this is a rounded figure. A feed run for 10 posts used no visible usage (direct request).

### Product Hunt Scraper vs. alternatives

The daily leaderboard here is the same ranked list Product Hunt shows for that day, with the score and comment counts from its page data. The feed is the public Atom feed and carries no counts. Product Hunt's API needs an access token; this Actor uses only the public pages.

### Using Product Hunt Scraper with AI agents / MCP

An agent sends `source`, `dates` and `maxResults` and reads the dataset rows. For daily launches, ask for one date at a time to keep each run small.

### FAQ

**Is this legal?** The Actor reads public Product Hunt pages and the public feed. It does not log in and does not solve challenges. Check Product Hunt's terms for your use, and respect the rights of the makers for any reuse of their text.

**Why does the daily run use a residential proxy?** From Apify datacenter IPs, the leaderboard page answered with a Cloudflare challenge (HTTP 403). The Actor tries a direct request first, then uses a residential proxy for that board only. Measured on 23 Oct 2026: direct was challenged for both test dates and the residential proxy returned the board.

**Why is maker empty for daily rows?** The leaderboard page data does not include the maker. In the test (34 rows), 0 daily rows had a maker. Feed rows include the author name.

**Why is externalUrl empty for daily rows from the HTML page?** The HTML page does not carry the product website link in the data the Actor reads. The Markdown view does (top 10 only).

**What about dates with no board?** A date with no launches returns an error for that date and the run continues with the next date.

**Can I call it from n8n, Make or Zapier?** Those tools can start any Apify Actor through their Apify integrations. This was not tested for this Actor.

**What about errors and limits?** A run fails only when no product is collected. Each run stops at the caller's maximum charge or at `maxResults`.

### Related Actors

Other Actors from the same publisher are listed on its Apify profile.

### Support

Open an issue on the Actor's Issues tab on Apify. Include the run ID, the input and the log lines.

### Limitations

- Daily boards list about 17 to 20 ranked launches on the test dates. Some days may show fewer.
- Votes are the current score at scrape time, not the final score of the day.
- The feed has no votes, comments or topics.
- Makers are not in the daily data, so maker is empty for daily rows.
- The residential path depends on Product Hunt's current page layout. The parser was checked against two layouts (HTML page and Markdown view) on 23 Oct 2026; a future layout change would need a parser update.

# Actor input Schema

## `source` (type: `string`):

daily: the leaderboard of each date you give (votes, comments, rank, topics, maker). feed: the 50 newest posts (no votes or comments).

## `dates` (type: `array`):

Daily only. Launch days as YYYY-MM-DD, one per line, e.g. 2026-10-22. Leave empty for yesterday (UTC).

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

How many products to return in total, e.g. 50. A daily board lists about 20 to 30 products.

## `debug` (type: `boolean`):

Saves the fetched daily board HTML to the key-value store for inspection. Off for normal runs.

## Actor input object example

```json
{
  "source": "daily",
  "dates": [],
  "maxResults": 20,
  "debug": false
}
```

# Actor output Schema

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

All products from this run.

# 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("webdatatools/producthunt-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("webdatatools/producthunt-scraper").call(run_input=run_input)

# Fetch and print Actor results from the run's dataset (if there are any)
print(f"💾 Check your data here: https://console.apify.com/storage/datasets/{run.default_dataset_id}")
for item in client.dataset(run.default_dataset_id).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 webdatatools/producthunt-scraper --silent --output-dataset

```

## MCP server setup

```json
{
    "mcpServers": {
        "apify": {
            "type": "http",
            "url": "https://mcp.apify.com/?tools=fetch-actor-details,webdatatools/producthunt-scraper"
        }
    }
}
```

The hosted server signs you in with OAuth on first connect, so no API token belongs in this config. Clients without OAuth support can send an `Authorization: Bearer <APIFY_API_TOKEN>` header instead, using a token from API & Integrations in Apify Console (https://console.apify.com/settings/integrations).

## OpenAPI specification

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