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

\[Only $0.80💰] Scrape Product Hunt launches, daily leaderboards, topics, and maker profiles in one actor. For every product, contact emails are auto-harvested from its website. 50+ fields per product · auto-classifies any PH URL · JSON or CSV out. No browser, no third-party services.

- **URL**: https://apify.com/memo23/producthunt-scraper.md
- **Developed by:** [Muhamed Didovic](https://apify.com/memo23) (community)
- **Categories:** Lead generation, Automation, Agents
- **Stats:** 2 total users, 1 monthly users, 100.0% runs succeeded, NaN bookmarks
- **User rating**: No ratings yet

## 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/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 — Launches, Makers, Topics & Contact Emails

Auto-classify any Product Hunt URL — daily leaderboards, topic pages, individual products, or maker profiles — and get a clean structured dataset with **50+ fields per product** plus contact emails harvested directly from each product's website. Pure HTTP, no browser, no third-party services.

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

---

### Why use this scraper

- **All Product Hunt URL kinds in one input** — paste a daily leaderboard, a topic page, a product URL, and a maker profile in the same array. Each is auto-classified and routed to the right handler. No separate actors per URL shape.
- **Contact emails included** — for every product, the scraper fetches the product's own website and extracts emails (mailto: links + plain-text patterns + obfuscation decode), with a junk filter for image filenames, tracking sentinels, and retina `@2x.png` patterns. Cached per-URL so duplicate websites aren't refetched.
- **50+ fields per product** — name, tagline, description, websiteUrl, social links (Twitter / Facebook / Instagram / LinkedIn / AngelList / Threads / Medium / GitHub / iOS / Android), follower count, reviews count + rating, categories, latest launch summary (launch number, scheduled date, launch state, vote score), pros/cons sentiment tags (Positive vs Negative with counts), alternatives, funding amount, Y Combinator alumni flag, "is top product" flag, employee size band.
- **Cloudflare-clean** — uses [`impit`](https://github.com/apify/impit)'s Chrome TLS fingerprint. No proxy required for most runs; supports your own residential pool when you need geo-locked output.
- **Honest cost** — pure HTTP, single fetch per page, deduped website cache. A daily leaderboard run (17–30 products + email harvest) typically completes in 15–30 seconds.

---

### Overview

Product Hunt indexes thousands of new product launches every month. Anyone serious about competitive intel, deal sourcing, or B2B prospecting eventually needs the data in CSV — not in their browser tab. This actor turns any Product Hunt URL into a structured dataset, and goes one step further by following each product's `websiteUrl` to harvest contact emails directly from the source.

The actor uses Product Hunt's server-rendered Apollo cache (the same data the page UI reads) rather than scraping rendered HTML — so the parser is resilient to PH's frequent visual redesigns. The 5 supported URL kinds (leaderboard / topic / product / post / maker) are auto-classified by URL shape; you don't tell the actor "what kind of URL this is", you just paste URLs.

---

### Supported inputs

| Input | Row(s) emitted |
|---|---|
| **Daily leaderboard** — `/leaderboard/daily/YYYY/M/D` | Fans out to every product on the leaderboard (typically 17–30 launches per day). Each emits 1 product row (`rowType: "product"`) with the full schema + harvested emails. |
| **Topic page** — `/topics/{slug}` | Fans out to all products in the topic. Auto-paginates until `maxItems` is reached. Examples: `/topics/artificial-intelligence`, `/topics/developer-tools`, `/topics/saas`. |
| **Product detail URL** — `/products/{slug}` | 1 product row, no pagination. Useful for refreshing a known product or scraping a list of bookmarked products. |
| **Launch post URL** — `/posts/{slug}` | Same shape as `/products/{slug}` — Product Hunt aliases them. Both work. |
| **Maker profile URL** — `/@{username}` | 1 maker row (`rowType: "maker"`) — name, username, headline, avatar, Twitter username, followers count, products count, list of launched products. No email harvest (PH doesn't expose personal websites for makers). |

Mix any of these in the same `startUrls[]` array — the actor auto-classifies each one. JSON + CSV output.

> Pure HTTP. No Playwright, no Puppeteer, no headless Chromium, no third-party services.

---

### Use cases

- **Competitive intel** — pull every product launched in your category last month (via topic pages), see launch counts, vote scores, founder backgrounds, websites.
- **B2B prospecting** — daily leaderboard runs + email harvest = a ready-to-use lead list of newly launched SaaS founders.
- **Deal sourcing** — VCs and operators track new launches in AI, dev tools, fintech, etc. Filter the output by funding amount, YC alumni flag, employee size.
- **Market research** — track follower growth, review counts, pros/cons sentiment over time by re-running daily leaderboards.
- **Press/PR list-building** — every product on the daily leaderboard with its tagline, description, founder names, contact email — straight into your outreach CRM.
- **Trend tracking** — pros/cons sentiment tags surface what users love (and complain about) on each launch.

---

### How it works (under the hood)

Five stages, all pure HTTP, ~15-30 seconds per leaderboard run:

1. **Classify URL** — every input URL is matched against a deterministic regex set. Five URL shapes, one classifier function.
2. **Fetch via impit Chrome** — Product Hunt is hosted behind Cloudflare. `impit`'s real Chrome TLS fingerprint passes the challenge directly; no proxy required for most runs. Apify Proxy is wired up as a fallback when you need geo-locked output.
3. **Parse Apollo SSR data transports** — every PH page ships a server-rendered Apollo Client cache as `window[Symbol.for("ApolloSSRDataTransport")].push({...})` script blocks. The parser extracts those blocks (bracket-balanced JSON arg parser handles multi-line nested objects), sanitizes Apollo's `undefined`/`NaN`/`Infinity` literals so `JSON.parse` succeeds, and picks the richest data block for each entity type.
4. **Harvest product emails** — for each parsed product with a `websiteUrl`, we fetch the site (via the same impit Chrome stack) and extract emails. Cached per URL so multiple launches of the same SaaS only fetch the website once.
5. **Push enriched row to dataset** — one row per product or maker. CSV-flat, JSON-rich.

End-to-end live smoke test (May 2026): **5/5 products + 1 maker** scraped from a mixed input (leaderboard + product + maker URL), 1 contact email harvested, 0 hard failures.

---

### Input configuration

Field | Type | Required | Notes
--- | --- | --- | ---
`startUrls` | `string[]` | yes | Any mix of leaderboard / topic / product / maker URLs. Auto-classified.
`enrichMakerEmails` | `boolean` | no | Default `true`. For each parsed product, follow the product's `websiteUrl` and harvest emails (mailto + plain-text, junk-filtered, capped at 10 per site). Cached per URL. Disable for pure PH metadata (~30% faster).
`maxItems` | `integer` | no | Safety cap on **total dataset rows**, not URLs. A topic URL with 500 results emits up to 500 product rows. Default `200`. Free-tier users are capped at `100`.
`maxConcurrency` | `integer` | no | Detail pages fetched in parallel. Default `8`. PH's anti-bot is forgiving; 6–10 is the sweet spot.
`minConcurrency` | `integer` | no | Minimum parallelism. Default `1`.
`maxRequestRetries` | `integer` | no | Per-URL retry budget. Transient errors (CF soft-blocks, thin bodies) are auto-detected and don't count against this. Default `5`.
`proxy` | `object` | no | Default: Apify Proxy. Provide your own residential pool if you encounter rate limits or want geo-locked output.

#### Example input

```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,
  "maxItems": 200
}
````

That yields up to **200 rows**: the daily leaderboard fans out to ~20 products, the AI topic page fans out and paginates through up to 180 more, the bolt.new direct URL adds 1 (deduped against the leaderboard if already seen), and the maker profile adds 1 standalone maker row.

***

### Output overview

Two row shapes, distinguished by the `rowType` field: `product` and `maker`.

#### `rowType: "product"` — every product page

```jsonc
{
  "rowType":            "product",
  "sourceUrl":          "https://www.producthunt.com/products/bolt-new",
  "canonicalUrl":       "https://www.producthunt.com/products/bolt-new",

  "productId":          "599447",
  "slug":               "bolt-new",
  "name":               "bolt.new",
  "tagline":            "Prompt, run, edit & deploy full-stack web apps",
  "description":        "Build, run, edit, and deploy full-stack apps...",
  "logoUuid":           "ed53e95b-37b8-4a87-aa0f-...",

  "websiteUrl":         "https://bolt.new",
  "cleanUrl":           "bolt.new",
  "githubUrl":          null,
  "iosUrl":             null,
  "androidUrl":         null,

  "twitterUrl":         "https://twitter.com/stackblitz",
  "facebookUrl":        null,
  "instagramUrl":       null,
  "linkedinUrl":        "https://www.linkedin.com/company/stackblitz",
  "angellistUrl":       null,
  "threadsUrl":         null,
  "mediumUrl":          null,

  "reviewsCount":       43,
  "reviewsRating":      4.6,
  "followersCount":     28495,
  "postsCount":         7,
  "addonsCount":        0,
  "founderDetailedReviewsCount": 0,
  "categoriesCount":    5,

  "employeeSize":       "11-50",
  "fundingAmount":      105800000,
  "wasInYCombinator":   false,

  "isNoLongerOnline":   false,
  "isClaimed":          true,
  "isTopProduct":       true,
  "firstLaunch":        false,

  "categories": [
    { "id": "44", "name": "Artificial Intelligence", "slug": "artificial-intelligence", "path": "/topics/artificial-intelligence" },
    { "id": "267", "name": "Developer Tools",        "slug": "developer-tools",        "path": "/topics/developer-tools" }
  ],

  "latestLaunch": {
    "id": "608123",
    "slug": "bolt-new",
    "name": "bolt.new",
    "tagline": "Prompt, run, edit & deploy...",
    "launchNumber": 7,
    "launchState": "default",
    "launchedThisWeek": false,
    "isMaker": false,
    "isHunter": false,
    "createdAt": "2026-05-22T07:01:00Z",
    "scheduledAt": "2026-05-22T07:01:00Z",
    "thumbnailImageUuid": "...",
    "primaryLinkUrl": "https://bolt.new"
  },

  "firstPost": { "...same shape as latestLaunch..." },

  "proConTags": [
    { "id": "1", "name": "Fast",        "count": 18, "type": "Positive" },
    { "id": "2", "name": "Reliable",    "count": 12, "type": "Positive" },
    { "id": "3", "name": "Limited",     "count": 4,  "type": "Negative" }
  ],

  "alternatives": [
    { "id": "...", "name": "v0",           "slug": "v0-by-vercel",  "path": "/products/v0-by-vercel" },
    { "id": "...", "name": "Replit Agent", "slug": "replit-agent",  "path": "/products/replit-agent" }
  ],

  "harvestedEmails": ["founders@generalcompute.com"],
  "makersEnriched":  [],          // reserved — see FAQ

  "searchContext": {
    "discoveryUrl":     "https://www.producthunt.com/leaderboard/daily/2026/5/22",
    "resultPosition":   1,
    "leaderboardDate":  { "year": 2026, "month": 5, "day": 22 },
    "topicSlug":        null
  },

  "raw": { /* full Apollo product block, 56 fields */ },

  "scrapedAt": "2026-05-25T01:02:14.123Z"
}
```

#### `rowType: "maker"` — for direct `/@username` URLs

```jsonc
{
  "rowType":         "maker",
  "sourceUrl":       "https://www.producthunt.com/@ericsimons40",

  "userId":          "3660",
  "username":        "ericsimons40",
  "name":            "Eric Simons",
  "headline":        "CEO @StackBlitz",
  "avatarUrl":       "https://ph-avatars.imgix.net/3660/bdf5be7a-60eb-44a5-9193-0316c3d4db7d.jpeg",
  "twitterUsername": "ericsimons40",
  "websiteUrl":      null,       // PH doesn't expose personal websiteUrl on profiles

  "productsCount":   8,
  "followersCount":  1944,

  "products": [
    { "id": "599447", "name": "bolt.new",     "username": null, "headline": null, "avatarUrl": null, "twitterUsername": null, "websiteUrl": null, "profileUrl": null },
    { "id": "...",    "name": "StackBlitz",   "username": null, "headline": null, "avatarUrl": null, "twitterUsername": null, "websiteUrl": null, "profileUrl": null }
  ],

  "emails":    [],
  "raw":       { /* full Apollo profile block, 28 fields */ },
  "scrapedAt": "2026-05-25T01:02:14.123Z"
}
```

***

### Key output fields

The most-used fields for filtering / scoring:

- **`followersCount`** — primary popularity metric for products. Bolt.new = 28,495. WordPress 7.0 = 333. Use to filter "top-tier launches".
- **`reviewsCount` + `reviewsRating`** — community signal. Products with 5+ reviews + ≥4.0 rating are typically validated.
- **`proConTags`** — Product Hunt's AI-curated sentiment tags. Count of Positive vs Negative gives a quick read on community reception.
- **`latestLaunch.launchNumber`** — `1` = first-ever launch, `7` = launched 7 times (re-launches signal sustained traction).
- **`fundingAmount`** — surfaced when PH has it. Useful for VC deal sourcing.
- **`wasInYCombinator`** — boolean alumni flag.
- **`harvestedEmails`** — `string[]` of plausible contact emails extracted from the product's `websiteUrl`. Empty when the site is gated, hides emails, or has none.
- **`searchContext.leaderboardDate`** — the date of the leaderboard the row came from (when fanned out from `/leaderboard/daily/...`). Use to group rows by launch day.

***

### FAQ

**Q: Why is `makersEnriched` always `[]`?**
A: Product Hunt does NOT server-render the `makers` list onto product or launch pages (verified empirically — the GraphQL fragments reference `Maker` / `Hunter` types but the data is fetched lazily after page hydration, only visible to a real browser). We kept the field on the row for output-shape continuity but it's always empty. The recommended workflow for "founder emails" is to use the `harvestedEmails` field (which pulls from the product's own website, where the founders' email typically IS published).

**Q: Why does the maker row have `websiteUrl: null`?**
A: Product Hunt doesn't store a personal website for makers — only Twitter and the makers' own product pages. The maker row exists for profile-context use cases (founder name, follower count, list of products); for email harvest, pass product URLs instead.

**Q: Some product rows have `harvestedEmails: []` even though the site looks like it has emails. Why?**
A: Common causes: (1) the site is gated behind Cloudflare's interactive challenge (the email harvester uses a simpler impit fetch and won't bypass interactive challenges), (2) the email is rendered by JavaScript after page load (we read server HTML only), (3) the email is image-encoded or obfuscated in a non-standard way. Realistic harvest rate: **30–50% of product sites** yield at least one email.

**Q: Can I scrape historical leaderboards?**
A: Yes — `/leaderboard/daily/YYYY/M/D` accepts any past date. Topic pages also paginate backward.

**Q: Does this work for Product Hunt's weekly / monthly / yearly leaderboards?**
A: Daily leaderboards (`/leaderboard/daily/...`) are confirmed working. Weekly / monthly / yearly leaderboards use a different page structure — not currently in scope. Submit feedback if you want them added.

**Q: What's the rate limit?**
A: Product Hunt doesn't publish official rate limits. We run at `maxConcurrency=8` cleanly in testing. If you see soft-blocks in logs, drop concurrency to 4 or supply a residential proxy pool.

**Q: Do I need a Product Hunt account / OAuth token?**
A: No. Everything in scope here is publicly accessible without auth. The OAuth-gated GraphQL API (developers.producthunt.com) is a different surface — out of scope.

**Q: Output format?**
A: JSON (Apify Dataset default) or CSV via the Apify Console "Export" tab. CSV flattens nested arrays into JSON-encoded strings.

***

### Support

Found a bug, hit a soft-block pattern we don't detect, or want a new URL kind supported? File feedback via the Apify Console "Issues" tab on this actor's page.

***

### Additional services

Open to building custom scrapers, data enrichment pipelines, or co-developing actors. Reach out via the Apify Console contact form on the [memo23 profile](https://apify.com/memo23).

***

### Explore more scrapers

If you scrape Product Hunt, you're probably tracking competitive launches, founders, and B2B prospects. These pair well:

- **[Y Combinator Scraper](https://apify.com/memo23/y-combinator-scraper)** — pull jobs + companies from YC's directory. Cross-reference with the `wasInYCombinator` flag on PH product rows to find founded-by-YC alums.
- **[G2 Scraper](https://apify.com/memo23/g2-scraper)** — see how a SaaS surfaced on Product Hunt ranks on G2 reviews + comparison categories.
- **[Trustpilot Scraper](https://apify.com/memo23/trustpilot-scraper-ppe)** — customer sentiment + reviews for the products you discover via PH.
- **[LinkedIn Profiles Scraper](https://apify.com/memo23/linkedin-profiles-cheerio)** — backfill founder profiles for the makers behind interesting launches.
- **[Clutch.co Scraper](https://apify.com/memo23/apify-clutch-cheerio)** — when a PH founder is looking for agency partners, find them here.
- **[PagesJaunes Leads Scraper](https://apify.com/memo23/pagesjaunes-scraper-cheerio)** — bulk B2B leads with emails included, complement the PH harvest.

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

***

### ⚠️ Disclaimer

This scraper accesses publicly available data on producthunt.com. It does NOT bypass authentication, scrape private content, or access content not intended for public consumption.

Users are responsible for ensuring their use of this scraper complies with:

- **Product Hunt Terms of Service** — review at [producthunt.com/legal/terms](https://www.producthunt.com/legal/terms)
- **Applicable data protection laws** including GDPR (Europe), CCPA (California), and equivalent regulations in your jurisdiction. Email harvesting falls under data-protection obligations — process responsibly, honor opt-outs, and consult legal counsel if using harvested emails for outbound marketing.
- **`robots.txt`** and rate-limiting guidance from Product Hunt
- **Local jurisdiction laws** regarding web scraping and data collection

The scraper is provided for legitimate purposes such as market research, competitive intelligence, product discovery, and personal use. Commercial use, redistribution, or use that violates Product Hunt's Terms of Service is the user's responsibility.

This actor is independently built and is not affiliated with, endorsed by, or sponsored by Product Hunt or AngelList.

By using this scraper, you acknowledge that you understand and accept these responsibilities.

***

### SEO Keywords

product hunt scraper, producthunt scraper, product hunt api, product hunt data extraction, product hunt leaderboard scraper, product hunt launches, product hunt makers scraper, product hunt maker emails, product hunt topic scraper, product hunt daily leaderboard, product hunt csv export, product hunt founder contacts, saas launch tracker, ai product tracker, indie maker tracker, b2b prospecting product hunt, vc deal sourcing product hunt, yc alumni tracker, product hunt competitive intel, product hunt market research, product hunt trends, new saas launches, daily product launches, top products today, product hunt website scraper, product hunt apify, product hunt automation, scrape product hunt without api, product hunt without oauth, no-code product hunt scraper.

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

## `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`):

Defaults to Apify Proxy. Product Hunt is hosted behind Cloudflare; impit's Chrome TLS fingerprint typically passes the challenge without a proxy. Provide your own residential pool here if you encounter rate-limits or want geo-locked output.

## 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,
  "maxItems": 2000,
  "maxConcurrency": 8,
  "minConcurrency": 1,
  "maxRequestRetries": 5,
  "proxy": {
    "useApifyProxy": true
  }
}
```

# 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"
    ],
    "proxy": {
        "useApifyProxy": true
    }
};

// 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",
    ],
    "proxy": { "useApifyProxy": True },
}

# 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("💾 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 '{
  "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"
  ],
  "proxy": {
    "useApifyProxy": true
  }
}' |
apify call memo23/producthunt-scraper --silent --output-dataset

```

## MCP server setup

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

```

## OpenAPI specification

```json
{
    "openapi": "3.0.1",
    "info": {
        "title": "Product Hunt [Only $0.80💰] Scraper · Launches + Emails",
        "description": "[Only $0.80💰] Scrape Product Hunt launches, daily leaderboards, topics, and maker profiles in one actor. For every product, contact emails are auto-harvested from its website. 50+ fields per product · auto-classifies any PH URL · JSON or CSV out. No browser, no third-party services.",
        "version": "0.0",
        "x-build-id": "NP6RmiRil30FFTtfN"
    },
    "servers": [
        {
            "url": "https://api.apify.com/v2"
        }
    ],
    "paths": {
        "/acts/memo23~producthunt-scraper/run-sync-get-dataset-items": {
            "post": {
                "operationId": "run-sync-get-dataset-items-memo23-producthunt-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/memo23~producthunt-scraper/runs": {
            "post": {
                "operationId": "runs-sync-memo23-producthunt-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/memo23~producthunt-scraper/run-sync": {
            "post": {
                "operationId": "run-sync-memo23-producthunt-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": {
                    "startUrls": {
                        "title": "Product Hunt URLs",
                        "type": "array",
                        "description": "Full producthunt.com URLs to crawl. Leaderboard and topic URLs fan out automatically until `Maximum items to scrape` is reached.",
                        "items": {
                            "type": "string"
                        }
                    },
                    "enrichMakerEmails": {
                        "title": "Harvest contact emails from each product's website",
                        "type": "boolean",
                        "description": "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.\n\nNote: 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.",
                        "default": true
                    },
                    "maxItems": {
                        "title": "Maximum items to scrape",
                        "minimum": 1,
                        "type": "integer",
                        "description": "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.",
                        "default": 2000
                    },
                    "maxConcurrency": {
                        "title": "Max concurrency",
                        "minimum": 1,
                        "type": "integer",
                        "description": "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.",
                        "default": 8
                    },
                    "minConcurrency": {
                        "title": "Min concurrency",
                        "minimum": 1,
                        "type": "integer",
                        "description": "Minimum number of detail pages processed in parallel.",
                        "default": 1
                    },
                    "maxRequestRetries": {
                        "title": "Max request retries",
                        "minimum": 0,
                        "type": "integer",
                        "description": "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.",
                        "default": 5
                    },
                    "proxy": {
                        "title": "Proxy configuration",
                        "type": "object",
                        "description": "Defaults to Apify Proxy. Product Hunt is hosted behind Cloudflare; impit's Chrome TLS fingerprint typically passes the challenge without a proxy. Provide your own residential pool here if you encounter rate-limits or want geo-locked output."
                    }
                }
            },
            "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
                                    }
                                }
                            }
                        }
                    }
                }
            }
        }
    }
}
```
