# Product Hunt \[Only $0.80💰] Scraper ·Launches, Reviews & Emails (`memo23/producthunt-scraper`) Actor

\[Only $0.80💰] Product Hunt scraper — leaderboards (daily–yearly), topics, collections, products & makers, any URL auto-classified. 50+ fields plus optional detailed reviews, comments & contact emails harvested per site. Pure HTTP, JSON/CSV.

- **URL**: https://apify.com/memo23/producthunt-scraper.md
- **Developed by:** [Muhamed Didovic](https://apify.com/memo23) (community)
- **Categories:** Lead generation, Automation, Agents
- **Stats:** 117 total users, 22 monthly users, 100.0% runs succeeded, 0 bookmarks
- **User rating**: 5.00 out of 5 stars

## Pricing

from $0.80 / 1,000 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?

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, Reviews, Comments & Contact Emails

Turn any Product Hunt URL into a clean, structured dataset. Start from daily/weekly/monthly/yearly leaderboards, topics, collections, individual products, or maker profiles — all auto-classified from one input.

Get 50+ fields per product including votes, rank, comments, and a media gallery — plus optional **detailed reviews**, **discussion threads + comments**, contact emails harvested from each product's own website, and makers + hunter via the Product Hunt API. Pure HTTP, no browser.

### Why Use This Scraper?

- ✅ Every Product Hunt entry point in one input — paste leaderboards, topics, collections, products, and maker profiles together; each is auto-classified
- ✅ Rankings built in — vote counts, daily/weekly/monthly rank, comment counts, and the featured timestamp on every leaderboard-sourced row
- ✅ Optional detailed reviews — full review text, per-dimension ratings, and selected pros/cons per product
- ✅ Optional discussion threads + comments — launch discussions with author and comment counts (full comment bodies with a token)
- ✅ Contact emails harvested from each product's own website (mailto + plain-text, junk-filtered, deduped per site)
- ✅ Optional makers + hunter via your own free Product Hunt API token — data not available in the page HTML
- ✅ JSON or CSV output, ready for spreadsheets and CRMs

### Overview

The Product Hunt Scraper is built for founders, marketers, VCs, and researchers who need Product Hunt data in a spreadsheet instead of a browser tab.

The output is primarily **product-shaped rows**. Even when you start from a leaderboard, topic, or collection URL, the resulting dataset is a stream of product rows (`rowType: "product"`) — not separate leaderboard or collection rows. The exception is a direct maker profile URL (`/@username`), which emits a single maker row (`rowType: "maker"`).

The parser reads Product Hunt's server-rendered Apollo cache (the same data the page UI uses) rather than scraping rendered HTML, so it stays resilient to PH's frequent visual redesigns. URLs are auto-classified by shape — you just paste them, you don't tag them.

### Supported Inputs

#### URL types

| URL type | Pattern | Example |
|---|---|---|
| Homepage | `producthunt.com/` | `https://www.producthunt.com/` |
| Daily leaderboard | `/leaderboard/daily/YYYY/M/D` | `https://www.producthunt.com/leaderboard/daily/2026/5/22` |
| Weekly leaderboard | `/leaderboard/weekly/YYYY/WW` | `https://www.producthunt.com/leaderboard/weekly/2026/20` |
| Monthly leaderboard | `/leaderboard/monthly/YYYY/M` | `https://www.producthunt.com/leaderboard/monthly/2026/5` |
| Yearly leaderboard | `/leaderboard/yearly/YYYY` | `https://www.producthunt.com/leaderboard/yearly/2025` |
| Topic page | `/topics/{slug}` | `https://www.producthunt.com/topics/artificial-intelligence` |
| Collection | `/collections/{slug}` | `https://www.producthunt.com/collections/best-ai-tools` |
| Collections index | `/collections` | `https://www.producthunt.com/collections` |
| Product detail | `/products/{slug}` or `/posts/{slug}` | `https://www.producthunt.com/products/bolt-new` |
| Maker profile | `/@{username}` | `https://www.producthunt.com/@ericsimons40` |

Homepage and listing URLs (leaderboards, topics, collections) **fan out** to product rows and stop once `maxItems` is reached. The homepage walks recent daily leaderboards (newest first).

#### Copy-pasteable startUrls

```json
{
  "startUrls": [
    "https://www.producthunt.com/leaderboard/daily/2026/5/22",
    "https://www.producthunt.com/leaderboard/weekly/2026/20",
    "https://www.producthunt.com/topics/artificial-intelligence",
    "https://www.producthunt.com/collections/best-ai-tools",
    "https://www.producthunt.com/products/bolt-new",
    "https://www.producthunt.com/@ericsimons40"
  ]
}
```

`startUrls` accepts both plain strings (`"https://…"`) and request objects (`{ "url": "https://…" }`) — mix freely.

#### Unsupported inputs

- ❌ Keyword search (`/search?q=…`) — Product Hunt loads search results client-side after page load, so they aren't available to an HTML-based scraper
- ❌ Content behind a Product Hunt login (private/draft launches, account settings)
- ❌ Hosts outside `producthunt.com`

### Use Cases

| Audience | Use case |
|---|---|
| **Founders & indie makers** | Track competitor launches, benchmark votes/rank, study winning taglines, reviews, and media |
| **Marketing & growth teams** | Build outreach lists from new launches with contact emails attached |
| **VCs & scouts** | Source deals from daily/weekly leaderboards; filter by funding, YC alumni, traction, review sentiment |
| **Sales / lead-gen** | Turn leaderboards + collections into a ready-to-import prospect list |
| **Researchers & analysts** | Bulk-export launches, reviews, and discussions across topics and time periods |
| **Agencies** | Deliver client-ready Product Hunt datasets without writing a scraper |

### How It Works

<p align="center">
  <img src="https://raw.githubusercontent.com/muhamed-didovic/muhamed-didovic.github.io/main/assets/how-it-works-producthunt.png" alt="How It Works" width="100%" />
</p>

1. **Input** — paste any mix of Product Hunt URLs (homepage, leaderboards, topics, collections, products, makers)
2. **Auto-classify & fan out** — each URL is routed to the right handler; listing URLs expand to their products
3. **Fetch** — pages are retrieved over HTTP with a real Chrome TLS fingerprint (passes Cloudflare without a browser)
4. **Parse & enrich** — the Apollo cache is read for 50+ fields, votes/rank/comments, and the media gallery; optionally add reviews, discussion threads/comments, contact emails from each product's site, and makers/hunter
5. **Output** — one product row per launch (or one maker row per `/@username`), as JSON or CSV

### Input Configuration

| Field | Type | Required | Notes |
|---|---|---|---|
| `startUrls` | `array<string \| { url }>` | yes | Any mix of supported Product Hunt URLs. Auto-classified. |
| `enrichMakerEmails` | `boolean` | no | Default `true`. For each product, fetch its `websiteUrl` and harvest emails (junk-filtered, capped at 10/site, deduped per URL). Each unique email found is billed as a small add-on (see Store pricing). Disable for pure PH metadata (~30% faster). |
| `scrapeReviews` | `boolean` | no | Default `false`. Attach detailed reviews per product (one extra request each). |
| `maxReviews` | `integer` | no | Default `50`. PH server-renders ~10, so higher values rarely add more. |
| `scrapeComments` | `boolean` | no | Default `false`. Attach the launch's discussion threads (one extra request each). Full comment **bodies** require an API token. |
| `maxComments` | `integer` | no | Default `20`. Cap on comment bodies fetched per launch via the API. |
| `apiToken` | `string` (secret) | no | Your own Product Hunt developer token. Unlocks `makersEnriched` + `hunter`, and comment **bodies** when `scrapeComments` is on. Blank = skip. |
| `maxItems` | `integer` | no | Hard cap on **total dataset rows**. Default `2000`. Free-tier runs are capped at `100`. |
| `maxConcurrency` | `integer` | no | Detail pages fetched in parallel. Default `8` (6–10 is the sweet spot). |
| `minConcurrency` | `integer` | no | Minimum parallelism. Default `1`. |
| `maxRequestRetries` | `integer` | no | Per-URL retry budget. Soft-blocks/thin bodies auto-retried with a fresh session. Default `5`. |
| `proxy` | `object` | no | Defaults to Apify Proxy. Supply your own residential pool for geo-locked output or heavy runs. |

#### Common scenarios

**1. A day's launches with contact emails**

```json
{
  "startUrls": ["https://www.producthunt.com/leaderboard/daily/2026/5/22"],
  "enrichMakerEmails": true
}
```

**2. Launches with reviews and discussion threads**

```json
{
  "startUrls": ["https://www.producthunt.com/products/bolt-new"],
  "scrapeReviews": true,
  "scrapeComments": true
}
```

**3. Full enrichment — emails + makers + hunter + comment bodies**

```json
{
  "startUrls": ["https://www.producthunt.com/leaderboard/weekly/2026/20"],
  "enrichMakerEmails": true,
  "scrapeComments": true,
  "apiToken": "YOUR_PRODUCT_HUNT_DEVELOPER_TOKEN"
}
```

To get a token: log in to Product Hunt → [producthunt.com/v2/oauth/applications](https://www.producthunt.com/v2/oauth/applications) → **Add an application** → **Create Token**. Paste it into `apiToken`. It's used only for your runs.

### Output Overview

Each dataset item is one of two shapes, set by `rowType`:

- **`product`** — emitted for every product (from leaderboards, topics, collections, the homepage, or direct product URLs). Carries the full 50+ field schema, plus `reviews[]`, `discussionThreads[]`, and `comments[]` when enabled.
- **`maker`** — emitted only for a direct `/@username` URL. Profile + the maker's launched products.

Notes on when fields are populated:

- **Votes, rank, comments count, `featuredAt`** are present on rows discovered via a leaderboard/topic/collection. They're `null` on a direct `/products/{slug}` URL (no ranking context).
- **`reviews[]`** appears only with `scrapeReviews`; **`discussionThreads[]`** only with `scrapeComments`; **`comments[]`** (bodies) only when a token is available.
- **`makersEnriched` + `hunter`** require an `apiToken`. **`harvestedEmails`** requires `enrichMakerEmails` and a site that exposes an email.

Output is nested JSON by default; the Apify Console "Export" tab flattens it to CSV.

### Output Samples

#### Product row — leaderboard-discovered, with reviews + threads

```jsonc
{
  "rowType": "product",
  "slug": "bolt-new",
  "name": "bolt.new",
  "tagline": "Prompt, run, edit & deploy full-stack web apps",
  "websiteUrl": "https://bolt.new/",
  "votesCount": 661, "dailyRank": 1, "weeklyRank": 1, "commentsCount": 75,
  "featuredAt": "2026-05-15T00:01:00-07:00",
  "reviewsCount": 44, "reviewsRating": 4.7, "followersCount": 30226,
  "wasInYCombinator": false,
  "harvestedEmails": ["hello@stackblitz.com"],

  "reviews": [
    {
      "id": "535045", "overallRating": 4, "easeOfUseRating": 4, "valueForMoneyRating": 4,
      "overallExperience": null,
      "positiveFeedback": "bolt.new runs the whole thing in the browser, so you go from prompt to a running app with no local setup…",
      "negativeFeedback": null,
      "selectedPros": ["Fast prototyping", "No setup"], "selectedCons": ["Token usage"],
      "votesCount": 3, "createdAt": "2026-05-20T10:11:00-07:00",
      "reviewer": { "name": "Jane D.", "username": "janed", "isVerified": true }
    }
    /* … up to ~10 reviews … */
  ],
  "discussionThreads": [
    {
      "id": "717330", "title": "AMA w/ CEO of Bolt — from $0 to $20M",
      "descriptionPreview": "Live Feb 28th, 9am PT — drop your questions!",
      "commentsCount": 28, "isPinned": false, "createdAt": "2026-02-26T08:00:00-08:00",
      "author": { "username": "ericsimons40", "name": "Eric Simons" }
    }
  ],
  "comments": [
    /* present only with an API token: { id, body, createdAt, votesCount, url, author } */
  ],

  "scrapedAt": "2026-06-14T11:42:00.000Z"
  /* plus githubUrl/twitterUrl/etc., media[], categories[], proConTags[], makersEnriched[],
     hunter, business fields, latestLaunch, searchContext, and `raw` (full Apollo block) */
}
```

#### Maker row — direct `/@username`

```jsonc
{
  "rowType": "maker",
  "sourceUrl": "https://www.producthunt.com/@ericsimons40",
  "username": "ericsimons40",
  "name": "Eric Simons",
  "headline": "CEO @StackBlitz",
  "twitterUsername": "ericsimons40",
  "productsCount": 8,
  "followersCount": 1944,
  "products": [ { "id": "599447", "name": "bolt.new" } ],
  "scrapedAt": "2026-06-14T11:42:00.000Z"
}
```

### Key Output Fields

#### Identity & links

- `rowType`, `productId`, `slug`, `name`, `tagline`, `description`, `sourceUrl`, `canonicalUrl`
- `websiteUrl`, `githubUrl`, `iosUrl`, `androidUrl`, `twitterUrl`, `linkedinUrl`, `facebookUrl`, `instagramUrl`

#### Ranking, engagement & media

- `votesCount`, `launchDayScore`, `dailyRank`, `weeklyRank`, `monthlyRank`, `commentsCount`, `featuredAt`
- `reviewsCount`, `reviewsRating`, `followersCount`
- `media[]` — `mediaType` (`image`/`video`), `imageUuid`, `width`, `height`, `videoId`

#### Business, categories & sentiment

- `employeeSize`, `fundingAmount`, `wasInYCombinator`, `isTopProduct`, `isNoLongerOnline`
- `categories[]`, `latestLaunch`, `firstPost`, `alternatives[]`, `proConTags[]`

#### Reviews (with `scrapeReviews`)

- `reviews[].overallRating`, `.easeOfUseRating`, `.reliabilityRating`, `.valueForMoneyRating`, `.customizationRating`
- `reviews[].overallExperience`, `.positiveFeedback`, `.negativeFeedback`, `.selectedPros`, `.selectedCons`, `.votesCount`, `.reviewer`

#### Discussion & comments (with `scrapeComments`)

- `discussionThreads[].title`, `.descriptionPreview`, `.commentsCount`, `.isPinned`, `.author`
- `comments[].body`, `.votesCount`, `.url`, `.author` (require an API token)

#### Enrichment (optional)

- `harvestedEmails[]` (with `enrichMakerEmails`), `makersEnriched[]`, `hunter` (with `apiToken`)

#### Discovery context

- `searchContext.discoveryUrl`, `.resultPosition`, `.leaderboardDate`, `.topicSlug`, `.collectionSlug`

### FAQ

#### Which Product Hunt URLs are supported?

Homepage, daily/weekly/monthly/yearly leaderboards, topics, collections (and the `/collections` index), product detail (`/products/{slug}` or `/posts/{slug}`), and maker profiles (`/@username`). Mix any of them in `startUrls`. Keyword search (`/search`) is **not** supported — PH loads those results client-side.

#### Do I get product rows or leaderboard/collection rows?

Product rows. Leaderboards, topics, collections, and the homepage all **fan out** to product rows (`rowType: "product"`). Only a direct `/@username` URL produces a maker row.

#### What do `scrapeReviews` and `scrapeComments` add?

`scrapeReviews` attaches a `reviews[]` array (full text, five ratings, pros/cons, reviewer) from each product's reviews page. `scrapeComments` attaches `discussionThreads[]` (title, preview, count, author). Each adds one HTTP request per product and is off by default.

#### Do I need a token for comments?

Only for comment **bodies**. The discussion-thread metadata (`discussionThreads[]`) is in the page HTML and works with no token. The actual comment text (`comments[]`) is loaded by Product Hunt over its API, so it's fetched only when a token is available (your `apiToken`, or an operator-configured fallback).

#### How do I get makers and the hunter?

Supply your own free Product Hunt developer token in `apiToken` (see Input Configuration). Makers + hunter are not in Product Hunt's server-rendered HTML, so they appear only when a token is provided.

#### Why are `votesCount` / `dailyRank` sometimes null?

Those come from a leaderboard/topic/collection's ranking data. A direct `/products/{slug}` URL has no ranking context, so they're `null`. Reach a product via a leaderboard to get them.

#### Some products have `harvestedEmails: []` — why?

Email harvesting is best-effort. A site may not publish an email, may load it via JavaScript, or may obfuscate it. Realistic harvest rate is roughly 30–50% of product sites.

#### Can I scrape private or login-gated content?

No. The actor only reads publicly available pages. Anything behind a Product Hunt login is out of scope.

#### What about rate limits?

The scraper runs cleanly at `maxConcurrency=8`; lower it or add a residential proxy if you see soft-blocks. The optional `apiToken` enrichment (makers/hunter/comment bodies) is subject to Product Hunt's API limits (complexity-based, ~6250 units per 15 minutes) — large runs may enrich only part of the set, and the row is always emitted regardless.

### Support

Found a bug, hit a soft-block we don't detect, or want another URL kind supported? Open an issue on the actor's **Issues** tab, or reach out via the [memo23 profile](https://apify.com/memo23) on Apify.

### Additional Services

Need a custom export shape, a new entry point, or scheduled monitoring? I build tailored scrapers and enrichment pipelines — get in touch via the [memo23 profile](https://apify.com/memo23).

### Explore More Scrapers

If you track Product Hunt launches, founders, and prospects, these pair well:

- [**Y Combinator Scraper**](https://apify.com/memo23/y-combinator-scraper) — companies + jobs from YC; cross-reference the `wasInYCombinator` flag
- [**G2 Scraper**](https://apify.com/memo23/g2-scraper) — see how a launched SaaS ranks on G2 reviews
- [**Trustpilot Scraper**](https://apify.com/memo23/trustpilot-scraper-ppe) — customer sentiment for products you discover
- [**LinkedIn Profiles Scraper**](https://apify.com/memo23/linkedin-profile-scraper) — backfill founder profiles for makers
- [**PagesJaunes Leads Scraper**](https://apify.com/memo23/pagesjaunes-scraper-cheerio) — bulk B2B leads with emails

Full portfolio: [apify.com/memo23](https://apify.com/memo23).

***

### 🤖 For AI Agents & LLM Apps

Compact reference for AI agents calling this actor via the [Apify MCP server](https://mcp.apify.com) or the Apify API (actor: `memo23/producthunt-scraper`).

**Purpose:** Turn any Product Hunt URL (leaderboards, topics, collections, products, maker profiles) into structured product rows read from PH's server-rendered Apollo cache, with optional reviews, discussion threads, and contact emails.

**Minimal input:**

```json
{
  "startUrls": ["https://www.producthunt.com/leaderboard/daily/2026/5/22"],
  "maxItems": 20
}
```

**Output:** one row per product (`rowType: "product"`) with slug, name, tagline, websiteUrl, votesCount, dailyRank, weeklyRank, monthlyRank, commentsCount, featuredAt, reviewsCount, reviewsRating, followersCount, wasInYCombinator, media\[], categories\[], harvestedEmails\[], and (when enabled) reviews\[], discussionThreads\[], comments\[], makersEnriched\[], hunter, searchContext, scrapedAt. A direct `/@username` URL emits one maker row (`rowType: "maker"`) with username, name, headline, productsCount, followersCount, products\[].

**Behaviors an agent should know:**

- Always set `maxItems` (default 2000): a topic page can fan out to hundreds of products; a single daily leaderboard yields ~17-30. Free-tier runs cap at 100.
- `startUrls` are auto-classified; leaderboards/topics/collections/homepage fan out to product rows, `/products/{slug}` emits one product, `/@username` emits one maker row.
- `scrapeReviews` and `scrapeComments` are off by default and each add one request per product; comment bodies and `makersEnriched`/`hunter` require your own `apiToken`.
- `votesCount`/`dailyRank` are null on direct product URLs (no ranking context); reach a product via a leaderboard to populate them.
- Pay-per-event billing — see the Pricing tab on the actor page. The optional email enrichment (`enrichEmails`) is charged only per contact email found, never for misses.

***

### ⚠️ Disclaimer

This Actor is an independent tool and is not affiliated with, endorsed by, or sponsored by Product Hunt or any of its parent companies or subsidiaries. All trademarks mentioned are the property of their respective owners.

The scraper accesses only publicly available Product Hunt pages — no authenticated endpoints, private launches, or content behind the producthunt.com login wall. The optional API enrichment uses Product Hunt's official API with a token **you** supply under your own account. Users are responsible for ensuring their use complies with Product Hunt's Terms of Service, the Product Hunt API terms, applicable data-protection law (GDPR, CCPA, etc.), and any contractual obligations of their own organization. Harvested contact emails are personal data — process them responsibly, honor opt-outs, and seek legal advice before outbound marketing.

***

### SEO Keywords

product hunt scraper, scrape product hunt, producthunt scraper, product hunt api, product hunt.com scraper, Apify product hunt, product hunt leaderboard scraper, product hunt topic scraper, product hunt collections scraper, product hunt reviews scraper, product hunt comments scraper, maker profile scraper, product launch scraper, product hunt maker emails, founder contact scraper, saas launch tracker, b2b lead generation data, vc deal sourcing, ai product tracker, startup launch intelligence

# Actor input Schema

## `startUrls` (type: `array`):

Full producthunt.com URLs to crawl. Leaderboard and topic URLs fan out automatically until `Maximum items to scrape` is reached.

## `enrichMakerEmails` (type: `boolean`):

When enabled (default), each parsed product's `websiteUrl` is fetched and emails are extracted (mailto: links + plain-text patterns, junk filtered). Cached per URL — products sharing the same website (e.g. multiple launches of the same SaaS) are only fetched once. Adds ~0.3-1 s per unique website. Disable to ship pure Product Hunt metadata ~30% faster.

Note: Product Hunt does not expose personal websites for makers, so this enrichment harvests from product sites — not personal sites. Maker profile URLs (/@username) emit profile rows without email harvest.

## `enrichEmails` (type: `boolean`):

If enabled, finds a contact email for each result from its own website (or by discovering it from the name). Adds contactEmail + contactWebsite columns plus a detailed emailEnrichment object. Billed per contact email found; only charged when an email is returned, never for misses.

## `scrapeReviews` (type: `boolean`):

When enabled, each product's reviews page is fetched and the detailed reviews are attached to the product row: full review text (`overallExperience`), positive/negative feedback, per-dimension ratings (ease of use, reliability, value, customization), selected pros/cons, author, and vote count. Adds one HTTP request per product. Product Hunt server-renders the first ~10 reviews. Default off.

## `maxReviews` (type: `integer`):

Upper bound on reviews attached per product. PH server-renders only the first page (~10), so higher values have no effect unless PH changes that. Used only when `Scrape product reviews` is on.

## `scrapeComments` (type: `boolean`):

When enabled, the launch's discussion threads (title, preview, comment count, author) are attached from the server-rendered launch page (one extra HTTP per product). Full comment BODIES are not in PH's HTML — they are fetched from Product Hunt's official GraphQL API when a token is available (your run's `Product Hunt API token` below, or the operator's built-in token). Without a token you still get the discussion-thread metadata. Default off.

## `maxComments` (type: `integer`):

Upper bound on comment bodies fetched per launch via the API. Used only when `Scrape launch comments` is on and a token is available.

## `apiToken` (type: `string`):

Optional. Paste your own Product Hunt developer token (producthunt.com/v2/oauth/applications → Add an application → Create Token). When set, each product is enriched with its makers (name, username, headline, Twitter) and the hunter, and — if `Scrape launch comments` is on — the actual comment bodies. This data is NOT in PH's page HTML, so it needs the official API. Leave blank to skip (default); the actor still returns makers/hunter and comments if the operator has configured a built-in token. Used only for your runs; subject to PH's API rate limits (~6250 complexity / 15 min).

## `maxItems` (type: `integer`):

Hard cap on the number of products + makers collected. A single daily leaderboard typically yields 17-30 products; a topic page can yield hundreds across paginated pages.

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

Maximum number of detail pages processed in parallel. Higher = faster but more bandwidth. Product Hunt's anti-bot is forgiving; 6-10 is the sweet spot.

## `minConcurrency` (type: `integer`):

Minimum number of detail pages processed in parallel.

## `maxRequestRetries` (type: `integer`):

Number of retries before a failed request is given up. Transient errors (Cloudflare soft-blocks, thin bodies) are auto-detected and retried with a fresh proxy session; this counter covers other failures too.

## `proxy` (type: `object`):

Leave empty — the actor already routes all traffic through its own built-in residential proxy at no extra cost to you. Only set this if you want to use your own proxies.

## Actor input object example

```json
{
  "startUrls": [
    "https://www.producthunt.com/leaderboard/daily/2026/5/22",
    "https://www.producthunt.com/topics/artificial-intelligence",
    "https://www.producthunt.com/products/bolt-new",
    "https://www.producthunt.com/@ericsimons40"
  ],
  "enrichMakerEmails": true,
  "enrichEmails": false,
  "scrapeReviews": false,
  "maxReviews": 50,
  "scrapeComments": false,
  "maxComments": 20,
  "maxItems": 2000,
  "maxConcurrency": 8,
  "minConcurrency": 1,
  "maxRequestRetries": 5
}
```

# 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": [
        "https://www.producthunt.com/leaderboard/daily/2026/5/22",
        "https://www.producthunt.com/topics/artificial-intelligence",
        "https://www.producthunt.com/products/bolt-new",
        "https://www.producthunt.com/@ericsimons40"
    ]
};

// Run the Actor and wait for it to finish
const run = await client.actor("memo23/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 = { "startUrls": [
        "https://www.producthunt.com/leaderboard/daily/2026/5/22",
        "https://www.producthunt.com/topics/artificial-intelligence",
        "https://www.producthunt.com/products/bolt-new",
        "https://www.producthunt.com/@ericsimons40",
    ] }

# Run the Actor and wait for it to finish
run = client.actor("memo23/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 '{
  "startUrls": [
    "https://www.producthunt.com/leaderboard/daily/2026/5/22",
    "https://www.producthunt.com/topics/artificial-intelligence",
    "https://www.producthunt.com/products/bolt-new",
    "https://www.producthunt.com/@ericsimons40"
  ]
}' |
apify call memo23/producthunt-scraper --silent --output-dataset

```

## MCP server setup

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