# Product Hunt Scraper - Launches, Makers & Contacts (`toptock/product-hunt-scraper`) Actor

Product Hunt launches for any day, week, month or year with votes, ranks, website, pricing, makers and their roles - plus public contact emails and social links from each product's own website.

- **URL**: https://apify.com/toptock/product-hunt-scraper.md
- **Developed by:** [Elijah Friederick](https://apify.com/toptock) (community)
- **Categories:** Lead generation, Marketing, Business
- **Stats:** 2 total users, 1 monthly users, 81.8% runs succeeded, 0 bookmarks
- **User rating**: No ratings yet

## Pricing

from $0.50 / 1,000 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/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 — Launches, Makers & Contacts

Get every Product Hunt launch for **any day, week, month or year** — ranked, with votes, website, pricing, the makers and their roles — and, if you want, the **public contact emails and social links from each product's own website**.

Built for people who use Product Hunt as a source of leads, market research or deal flow: one run turns a date range into a clean, ranked list of new products and who to talk to.

### What you can do with it

- **Lead lists of fresh startups** — "every AI launch this month with 200+ votes, with founder names, roles and a contact email".
- **Daily launch monitoring** — schedule it each morning for yesterday's leaderboard.
- **Market and competitor research** — a whole year of launches in a topic, with pricing model, reviews and follower counts.
- **Investor deal flow** — filter by votes and topic; see the `wasInYCombinator` flag and team size where Product Hunt has it.
- **Look up specific products** — paste Product Hunt URLs and get full details.

### Input

```json
{
  "mode": "leaderboard",
  "period": "daily",
  "startDate": "2026-10-01",
  "endDate": "2026-10-04",
  "featuredOnly": true,
  "maxLaunchesPerPeriod": 30,
  "minVotes": 100,
  "topics": ["Artificial Intelligence"],
  "includeDetails": true,
  "includeMakerProfiles": false,
  "enrichContacts": true
}
```

| Option | Meaning |
|---|---|
| `mode` | `leaderboard` (by date) or `products` (specific URLs). |
| `period` | `daily`, `weekly`, `monthly` or `yearly` leaderboard. |
| `startDate`, `endDate` | Date range. Every day / week / month in the range is scraped. Both empty = yesterday. |
| `featuredOnly` | On: the launches Product Hunt features (about 15–40 a day). Off: every launch submitted, often 300+ a day. |
| `maxLaunchesPerPeriod` | Cap per leaderboard, from the top. Default 30, max 1000. |
| `minVotes`, `topics` | Filters. Topics match Product Hunt's topic names. |
| `includeDetails` | Website, description, pricing, promo code, categories, socials, hunter, makers, reviews, followers. |
| `includeMakerProfiles` | Each maker's X/Twitter handle, personal links and bio from their public profile. |
| `enrichContacts` | Contact emails and social links published on the product's own website. |
| `productUrls` | For `products` mode. |

### Output

One row per launch:

```json
{
  "leaderboard": "daily",
  "leaderboardPeriod": "2026-10-04",
  "position": 1,
  "name": "CoreSpeed",
  "tagline": "One MCP for everything your agents need: apps, memory, tools",
  "votes": 327,
  "comments": 61,
  "dailyRank": 1, "weeklyRank": 12, "monthlyRank": 4,
  "launchedAt": "2026-10-04T00:01:00-07:00",
  "topics": ["Productivity", "Marketing", "Developer Tools"],
  "categories": ["Unified API", "AI Infrastructure Tools"],
  "websiteUrl": "https://corespeed.io",
  "pricingType": "free",
  "promo": {"text": "30% off", "code": "PRODUCTHUNT"},
  "socialLinks": {"twitter": "https://twitter.com/corespeedhq"},
  "hunter": {"name": "Justin Jincaid", "headline": "Maker of GNGM & Forget", "profileUrl": "https://www.producthunt.com/@justin2025"},
  "makers": [
    {"name": "Milton Yan", "headline": "Founder&CEO@CoreSpeed", "profileUrl": "https://www.producthunt.com/@miltonheyan"},
    {"name": "Hao Su", "headline": "Co-founder and CTO @ CoreSpeed", "profileUrl": "https://www.producthunt.com/@haocorespeed"}
  ],
  "productFollowers": 627,
  "reviewsCount": 0,
  "isFirstLaunch": true,
  "wasInYCombinator": false,
  "contactEmails": ["contact@corespeed.io"],
  "websiteSocialLinks": {"linkedin": "https://www.linkedin.com/company/corespeedhq", "github": "https://github.com/corespeed-io"},
  "url": "https://www.producthunt.com/products/corespeed"
}
```

### Good to know

- **Ranks and votes are live values** at the time of the run. For a finished day they are final; today's leaderboard is still moving.
- **`position`** is the order on the leaderboard you asked for. `dailyRank` / `weeklyRank` / `monthlyRank` are Product Hunt's own ranks for that launch.
- **Website contacts are best-effort.** The Actor reads the product's home page and its contact/about pages. Many startups list no email at all; expect an address for roughly half to three-quarters of launches. When a site lists addresses on its own domain, sample addresses from demos and testimonials are filtered out.
- **Makers are the people the team listed on the launch.** Big-company launches often list none.
- **Dates are UTC** for the default "yesterday"; Product Hunt days run on Pacific time, so set dates explicitly if the boundary matters to you.
- **Fast.** A day's leaderboard takes a few seconds. A full month of daily leaderboards with details (about 600 launches) takes roughly a minute. Website contacts add about a second per launch.
- In `products` mode, `productName` is the product ("Notion") and `name` is its latest launch ("Ship OS by Notion").

### Data sources and responsible use

- **Product Hunt data** is read from publicly visible Product Hunt pages; no login is used. Images are linked, not copied.
- **Contact details** are only those a company publishes on its own public website. No guessing, no email-pattern generation, no private data.
- **You are responsible for how you use contact details.** Laws such as CAN-SPAM, GDPR and CASL apply to outreach, and so do Product Hunt's terms. Use business contact details for relevant, lawful communication and honour opt-outs.
- **Not affiliated with or endorsed by Product Hunt.** Product and company names are trademarks of their owners and are used only to identify them.
- Information is provided as-is and may be incomplete or out of date.

# Actor input Schema

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

<b>Launch leaderboards</b>: every launch for a day, week, month or year, in ranked order. <b>Specific products</b>: full details for the Product Hunt URLs you list.

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

Which leaderboard to read. With a date range, every day / week / month in the range is scraped.

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

First day of the range (YYYY-MM-DD). Leave empty to use the 'To date' only.

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

Last day of the range (YYYY-MM-DD). Leave empty for yesterday (UTC) - the most recent finished day.

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

On = the launches Product Hunt features on its leaderboard (about 15-40 a day). Off = every launch submitted that day, often 300+.

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

Cap per day / week / month / year, taken from the top of the ranking.

## `minVotes` (type: `integer`):

Skip launches with fewer votes than this.

## `topics` (type: `array`):

Only launches tagged with at least one of these Product Hunt topics, e.g. <b>Artificial Intelligence</b>, <b>Developer Tools</b>, <b>Marketing</b>. Empty = all topics.

## `productUrls` (type: `array`):

For 'Specific products' mode: Product Hunt product or launch URLs (or bare slugs), e.g. <b>https://www.producthunt.com/products/notion</b>.

## `includeDetails` (type: `boolean`):

Adds website, description, pricing, promo code, categories, social links, the hunter, the makers with their roles, reviews and followers. One extra page per launch.

## `includeMakerProfiles` (type: `boolean`):

Opens each maker's public Product Hunt profile for their X/Twitter handle, personal links and bio. One extra page per maker (up to 10 per launch).

## `enrichContacts` (type: `boolean`):

Visits each product's own website (home page plus contact/about pages) and collects the publicly listed contact emails and social links.

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

How many launches are enriched in parallel.

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

Product Hunt blocks cloud servers, so a proxy is required. The default (Apify datacenter proxy, with automatic US residential fallback) works well - only change this if you want to force a specific group or your own proxies.

## Actor input object example

```json
{
  "mode": "leaderboard",
  "period": "daily",
  "featuredOnly": true,
  "maxLaunchesPerPeriod": 30,
  "minVotes": 0,
  "includeDetails": true,
  "includeMakerProfiles": false,
  "enrichContacts": false,
  "maxConcurrency": 10,
  "proxyConfiguration": {
    "useApifyProxy": true
  }
}
```

# Actor output Schema

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

All launches as JSON: rank, votes, topics and links, plus website, pricing, makers and website contacts when those options are on.

## `launchesCsv` (type: `string`):

The same rows as a CSV download, ready for a spreadsheet or CRM import.

## `leadList` (type: `string`):

A compact CSV with just the outreach columns: product, website, votes, launch date, makers count and contact emails.

# 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 = {
    "proxyConfiguration": {
        "useApifyProxy": true
    }
};

// Run the Actor and wait for it to finish
const run = await client.actor("toptock/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 = { "proxyConfiguration": { "useApifyProxy": True } }

# Run the Actor and wait for it to finish
run = client.actor("toptock/product-hunt-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 '{
  "proxyConfiguration": {
    "useApifyProxy": true
  }
}' |
apify call toptock/product-hunt-scraper --silent --output-dataset

```

## MCP server setup

```json
{
    "mcpServers": {
        "apify": {
            "type": "http",
            "url": "https://mcp.apify.com/?tools=fetch-actor-details,toptock/product-hunt-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/je8g82YyZIlwW3rxE/builds/NprWTNlmXQYZ506Fu/openapi.json
