# Product Hunt Scraper: Daily Launches & Leaderboards (`symphonic_mullite/product-hunt-launches`) Actor

Scrape Product Hunt daily, weekly, monthly and yearly leaderboards for any dates: rank, name, tagline, votes, comments, topics, launch time and the product's website. Reliable plain-HTTP scraping, $1.50 per 1,000 launches.

- **URL**: https://apify.com/symphonic\_mullite/product-hunt-launches.md
- **Developed by:** [Damian Boni](https://apify.com/symphonic_mullite) (community)
- **Categories:** Lead generation, Business
- **Stats:** 2 total users, 1 monthly users, 100.0% runs succeeded, 0 bookmarks
- **User rating**: No ratings yet

## Pricing

from $1.50 / 1,000 launch results

This Actor is paid per event. You are not charged for the Apify platform usage, but only a fixed price for specific events.

Learn more: https://docs.apify.com/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 & Leaderboards

Scrape **Product Hunt leaderboards** for any day, week, month or year: every launch with its **rank, name, tagline, votes, comments, topics, launch time and the product's own website**. Pick a date range ("the last 30 days", "every week of 2025") and get one clean row per launch.

Built to be reliable: fast plain-HTTP requests (no browser), Product Hunt's own leaderboard data, automatic IP rotation when Cloudflare challenges a request, and clear errors instead of silent empty datasets. **$1.50 per 1,000 launches**, nothing charged for retries or failed requests.

### What you can do with it

- **Startup and trend research**: see which products and topics win each day, week or month.
- **Lead lists of new startups**: every launch comes with its website, ready for enrichment in your CRM.
- **Competitor monitoring**: schedule a daily run on "yesterday" and get an alert when a product in your space launches.
- **Investor deal flow**: track top launches by votes and comments across months or years.
- **Datasets for AI and newsletters**: names, taglines and topics of thousands of launches, ranked.

### What data you get

| Field | Example |
| --- | --- |
| Leaderboard and period | daily, 2026-09-22 |
| Rank on that leaderboard, plus daily/weekly/monthly ranks | 1 (daily 1, weekly 1, monthly 6) |
| Name and tagline | Clueso MCP, "Create and edit videos by chatting" |
| Votes, launch-day votes, comments | 548 / 480 / 161 |
| Topics | Artificial Intelligence, Animation, Video |
| Product website | https://clueso.io/mcp |
| Launch page, product page | producthunt.com/posts/clueso-mcp-2, producthunt.com/products/clueso |
| Launch time, featured time, featured flag | 2026-09-22T07:01:00Z |
| Thumbnail, IDs and slugs | ph-files.imgix.net/... |

### How to use it

1. Choose the **Leaderboard**: daily, weekly, monthly or yearly.
2. Set the **Start date** (a date, `today`, `yesterday` or relative like `30 days`) and optionally an **End date**. Every day, week, month or year in between is scraped.
3. Choose **Featured launches only** (Product Hunt's official ranked board, default) or all launches of the period.
4. Set **Max launches per day/week/month/year**.
5. Run it and download the data as JSON, CSV or Excel, or use the API, Google Sheets, Make, Zapier or webhooks.

#### Input examples

Yesterday's top 20 (the default):

```json
{ "period": "daily", "startDate": "yesterday", "maxLaunchesPerPeriod": 20 }
```

The last 30 daily leaderboards, top 50 each, with websites:

```json
{ "period": "daily", "startDate": "30 days", "endDate": "yesterday", "maxLaunchesPerPeriod": 50, "includeWebsite": true }
```

Top 100 of every month in 2025:

```json
{ "period": "monthly", "startDate": "2025-01-01", "endDate": "2025-12-31", "maxLaunchesPerPeriod": 100 }
```

| Input | Description | Default |
| --- | --- | --- |
| `period` | `daily`, `weekly` (ISO weeks, Monday to Sunday), `monthly`, `yearly` | `daily` |
| `startDate` | `YYYY-MM-DD`, `today`, `yesterday` or relative (`7 days`, `2 weeks`, `3 months`) | `yesterday` |
| `endDate` | Last day of the range (inclusive); empty = only the start date's leaderboard | empty |
| `featuredOnly` | Featured board with official ranks, or all launches ordered by votes | `true` |
| `maxLaunchesPerPeriod` | Launches per day/week/month/year (max 5,000) | 50 |
| `includeWebsite` | Resolve each launch's outbound link to the product website | `true` |
| `proxyConfiguration` | Apify Proxy settings | datacenter |

Product Hunt days run on Pacific Time, so `yesterday` means yesterday in California.

### Output example

```json
{
  "period": "daily",
  "periodLabel": "2026-09-22",
  "periodStart": "2026-09-22",
  "featuredOnly": true,
  "rank": 1,
  "dailyRank": 1,
  "weeklyRank": 1,
  "monthlyRank": 6,
  "id": "1252189",
  "name": "Clueso MCP",
  "tagline": "Create and edit videos by chatting",
  "slug": "clueso-mcp-2",
  "url": "https://www.producthunt.com/posts/clueso-mcp-2",
  "productId": "737461",
  "productSlug": "clueso",
  "productUrl": "https://www.producthunt.com/products/clueso",
  "website": "https://clueso.io/mcp",
  "votes": 548,
  "launchDayVotes": 480,
  "comments": 161,
  "topics": ["Artificial Intelligence", "Animation", "Video"],
  "topicSlugs": ["artificial-intelligence", "animation", "video"],
  "thumbnailUrl": "https://ph-files.imgix.net/5fb08d1c-01a1-43a5-a993-958aec64788b.png",
  "launchedAt": "2026-09-22T07:01:00.000Z",
  "featuredAt": "2026-09-22T07:01:00.000Z",
  "isFeatured": true,
  "redirectUrl": "https://www.producthunt.com/r/p/1252189",
  "scrapedAt": "2026-09-27T21:51:01.742Z"
}
```

A run summary (launches per leaderboard, errors, requests and traffic) is saved to the key-value store as `SUMMARY`.

### Pricing

Pay per event: you pay only for launches saved to your dataset. Apify platform usage and proxy traffic are included.

| Event | Price | When it is charged |
| --- | --- | --- |
| `launch-result` | **$0.0015 per launch** ($1.50 per 1,000) | Once for each launch saved to the dataset |
| `apify-actor-start` | $0.00005 per run | Once when a run starts (Apify's standard start event) |

Website lookups, retries, blocked requests and promoted listings are not charged. Examples: yesterday's top 20 costs $0.03; the top 50 of every day for a month (about 1,500 launches) costs about $2.25.

Set **Max total charge** on a run to cap spending: the Actor stops as soon as the next launch would go over it and never saves launches it has not charged for.

### FAQ

**Do I need a Product Hunt account or API token?**
No. The Actor reads the public leaderboards that anyone can see without logging in.

**How is this different from the Product Hunt API?**
The official API needs a developer token and an OAuth app. This Actor returns the leaderboards exactly as shown on producthunt.com, with the site's daily, weekly and monthly ranks and each product's website, without any setup.

**Why do some days have fewer launches than my maximum?**
Product Hunt features fewer products on some days (weekends especially). Turn off **Featured launches only** to get every launch of the day, ordered by votes.

**Are promoted listings included?**
No. Promoted listings (ads) on the leaderboard are skipped and not charged.

**Why is `votes` empty for some launches?**
Makers can hide the vote count; Product Hunt then does not publish it.

**Is it legal to scrape Product Hunt?**
The Actor collects public information about products (names, taglines, votes, topics, websites) that anyone can see without logging in, and does not collect personal data about individuals. Check the terms that apply to your use case and jurisdiction, and consult a lawyer if unsure.

**Can I use it from Python, JavaScript, Make, Zapier or an AI agent?**
Yes. Like every Apify Actor it can be started via the Apify API and clients, scheduled, and connected to integrations and webhooks. The dataset schema describes every field for AI agents and MCP clients.

### Limitations

- Maker names, reviews, comments text and launch galleries are not included.
- Websites are the link the maker gave Product Hunt (sometimes an app-store or landing page rather than a homepage).
- A date range can cover at most 400 leaderboards per run; split longer ranges.

### Changelog

See [CHANGELOG.md](./CHANGELOG.md).

# Changelog

This Actor's version history is a separate document: https://apify.com/symphonic\_mullite/product-hunt-launches/changelog.md

# Actor input Schema

## `period` (type: `string`):

Which Product Hunt leaderboard to scrape. Every day, week, month or year between the start and end dates is scraped.

## `startDate` (type: `string`):

First day to scrape: YYYY-MM-DD, 'today', 'yesterday' or relative such as '7 days' (7 days ago). Product Hunt days run on Pacific Time. For weekly/monthly/yearly boards, the week/month/year containing this date.

## `endDate` (type: `string`):

Last day to scrape (inclusive). Leave empty to scrape only the start date's leaderboard. Example: start '30 days', end 'yesterday' = the last 30 daily leaderboards.

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

On: Product Hunt's featured leaderboard with its official ranks. Off: all launches of the period, ordered by votes.

## `maxLaunchesPerPeriod` (type: `integer`):

How many launches to save from each leaderboard. Product Hunt pages 20 at a time (including promoted listings, which are skipped).

## `includeWebsite` (type: `boolean`):

Resolve each launch's outbound link to the product's own website (one small extra request per launch, not charged).

## `maxConcurrency` (type: `integer`):

Maximum parallel requests.

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

Apify Proxy settings. The Actor rotates IPs automatically if Product Hunt's Cloudflare protection challenges a request; switch to RESIDENTIAL if runs keep getting blocked.

## Actor input object example

```json
{
  "period": "daily",
  "startDate": "yesterday",
  "featuredOnly": true,
  "maxLaunchesPerPeriod": 20,
  "includeWebsite": true,
  "maxConcurrency": 10,
  "proxyConfiguration": {
    "useApifyProxy": true
  }
}
```

# Actor output Schema

## `launches` (type: `string`):

One row per launch with rank, votes, comments, topics and website.

## `summary` (type: `string`):

Launches per leaderboard, errors, requests and traffic.

# 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 = {
    "period": "daily",
    "startDate": "yesterday",
    "maxLaunchesPerPeriod": 20,
    "proxyConfiguration": {
        "useApifyProxy": true
    }
};

// Run the Actor and wait for it to finish
const run = await client.actor("symphonic_mullite/product-hunt-launches").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 = {
    "period": "daily",
    "startDate": "yesterday",
    "maxLaunchesPerPeriod": 20,
    "proxyConfiguration": { "useApifyProxy": True },
}

# Run the Actor and wait for it to finish
run = client.actor("symphonic_mullite/product-hunt-launches").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 '{
  "period": "daily",
  "startDate": "yesterday",
  "maxLaunchesPerPeriod": 20,
  "proxyConfiguration": {
    "useApifyProxy": true
  }
}' |
apify call symphonic_mullite/product-hunt-launches --silent --output-dataset

```

## MCP server setup

```json
{
    "mcpServers": {
        "apify": {
            "type": "http",
            "url": "https://mcp.apify.com/?tools=fetch-actor-details,symphonic_mullite/product-hunt-launches"
        }
    }
}
```

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/VaPHsGT0wM2R3P20K/builds/AJ3xAhcfxh4GqXCz6/openapi.json
