# Product Hunt Scraper $0.8 💰 | Leaderboards | Clean JSON (`ahmed_jasarevic/producthunt-scraper`) Actor

Scrape Product Hunt leaderboards & launches into clean typed JSON. Get daily, weekly, monthly & yearly ranks, upvotes, categories & topics. $0.8/run.

- **URL**: https://apify.com/ahmed\_jasarevic/producthunt-scraper.md
- **Developed by:** [Ahmed Jasarevic](https://apify.com/ahmed_jasarevic) (community)
- **Categories:**
- **Stats:** 2 total users, 1 monthly users, 100.0% runs succeeded, 0 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/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 — pull Product Hunt leaderboard & launch data — products, upvotes, ranks, categories — clean typed JSON

Pull Product Hunt leaderboard and launch data — products, upvotes, ranks, categories, topics — as clean typed JSON. Scrape daily, weekly, monthly, yearly leaderboards plus category and topic pages, with optional comments, reviews, BuiltWith and website fields.

### Main Use Cases

- **Product discovery:** surface the top daily, weekly, monthly, and yearly launches across Product Hunt with upvotes and rank.
- **Market research:** analyze product categories, topics, and trending features to understand what's gaining traction.
- **Launch tracking:** monitor your own launches and compare day/week/month/year rank performance over time.
- **Competitor monitoring:** watch rival products, their upvotes, categories, and promoted vs organic status.
- **Startup intelligence:** feed structured leaderboard data into dashboards, reports, and AI analysis pipelines.

### How It Works

Product Hunt is a launch platform where makers ship products and the community upvotes them, generating daily, weekly, monthly, and yearly leaderboards ranked by upvotes.

This actor scrapes leaderboard pages and category/topic pages, plus Product Hunt's internal GraphQL query, returning each launch as a clean typed JSON record. For the **full daily list**, the actor uses an optional browser + residential proxy to defeat Cloudflare Turnstile — the `browserForDaily` flag (default `true`) with Apify Residential proxy ensures you get the complete daily leaderboard, not a truncated captcha-limited view.

### Input

| Field | Type | Required | Default | Notes |
|---|---|---|---|---|
| `target` | string enum | No | `daily` | One of: `daily`, `weekly`, `monthly`, `yearly`, `category`, `topic` |
| `startDate` | string | No | — | YYYY-MM-DD start (for `daily`) |
| `endDate` | string | No | — | YYYY-MM-DD end (for `daily`) |
| `startWeek` | string | No | — | YYYY-WW start (for `weekly`) |
| `endWeek` | string | No | — | YYYY-WW end (for `weekly`) |
| `startMonth` | string | No | — | YYYY-MM start (for `monthly`) |
| `endMonth` | string | No | — | YYYY-MM end (for `monthly`) |
| `startYear` | integer | No | — | Start year (for `yearly`) |
| `endYear` | integer | No | — | End year (for `yearly`) |
| `categorySlugs` | array | No | — | Category page slugs (for `category`) |
| `topicSlugs` | array | No | — | Topic page slugs (for `topic`) |
| `maxNbItemsToScrape` | integer | No | `0` | Max launches to return; `0` = all |
| `shouldIncludePromotedListings` | boolean | No | `false` | Include promoted listings |
| `shouldScrapeOnlyFeaturedLaunches` | boolean | No | `false` | Only featured launches |
| `shouldScrapeComments` | boolean | No | `false` | Add `commentsCount` effort |
| `shouldScrapeReviews` | boolean | No | `false` | Add review data |
| `shouldScrapeBuiltWith` | boolean | No | `false` | Add BuiltWith tech data |
| `shouldScrapeLaunches` | boolean | No | `false` | Scrape launch detail pages |
| `shouldScrapeWebsite` | boolean | No | `false` | Scrape launch websites |
| `debugDumpHtml` | boolean | No | `false` | Dump HTML for debugging |
| `browserForDaily` | boolean | No | `true` | Browser + residential proxy to solve Cloudflare Turnstile for full daily list |
| `proxyConfiguration` | object | No | Apify Residential | Proxy configuration |

### Output

Each dataset record is a typed JSON object containing launch + ranking data:

| Field | Type | Description |
|---|---|---|
| `isPromoted` | boolean | Whether the listing is promoted |
| `thumbnailUrl` | string | Product thumbnail URL |
| `name` | string | Product name |
| `url` | string | Product Hunt launch URL |
| `slug` | string | Product slug |
| `tagline` | string | Product tagline |
| `categories` | array | Category slugs |
| `commentsCount` | integer | Number of comments |
| `dayRank` | integer | Daily leaderboard rank |
| `weekRank` | integer | Weekly leaderboard rank |
| `monthRank` | integer | Monthly leaderboard rank |
| `yearRank` | integer | Yearly leaderboard rank |
| `upvotesCount` | integer | Number of upvotes |
| `topics` | array | Topic slugs |
| `pageKind` | string | Page kind scraped |
| `pageLabel` | string | Page label |
| `date` | string | Launch date |

### Example Input

```json
{
  "target": "daily",
  "startDate": "2026-08-21",
  "endDate": "2026-08-28",
  "maxNbItemsToScrape": 50,
  "browserForDaily": true,
  "proxyConfiguration": {
    "useApifyProxy": true
  }
}
```

### Example Output

```json
{
  "isPromoted": false,
  "thumbnailUrl": "https://ph-files.imgix.net/example.png",
  "name": "Sample Product",
  "url": "https://www.producthunt.com/posts/sample-product",
  "slug": "sample-product",
  "tagline": "The easiest way to do the thing",
  "categories": ["productivity"],
  "commentsCount": 42,
  "dayRank": 1,
  "weekRank": 3,
  "monthRank": 12,
  "yearRank": null,
  "upvotesCount": 856,
  "topics": ["ai", "saas"],
  "pageKind": "leaderboard",
  "pageLabel": "daily",
  "date": "2026-08-25"
}
```

### Scheduling, Monitoring & Automation

Set up a recurring schedule (daily, e.g. at 01:00 UTC) to track each day's leaders before they rotate off the front page. Use it to:

- Capture a persistent daily-leaders dataset for historical rank/upvote analysis.
- Watch for new #1 launches and category trends.
- Combine with a second scheduled run targeting `weekly`/`monthly` for broader trend tracking.

Apify schedules run automatically on your chosen cadence, storing each run's output in a new dataset you can consume via API.

### FAQ

#### Why use this actor instead of the official Product Hunt API?

The official Product Hunt API is limited, requires authentication, and does not expose a clean public dataset feed for leaderboards over time. This actor returns structured, typed JSON with day/week/month/year ranks, upvotes, categories, and topics — ready for analysis without API keys or rate-limit plumbing.

#### Can I get the full daily leaderboard?

Yes — set `browserForDaily: true` (default) with Apify Residential proxy to solve Cloudflare Turnstile and get the complete daily list.

#### How do I scrape weekly, monthly, or yearly leaders?

Set `target` to `weekly`, `monthly`, or `yearly` and provide the corresponding start/end date fields (`startWeek/endWeek`, `startMonth/endMonth`, `startYear/endYear`).

#### Which data fields do I get?

Each record includes name, slug, tagline, thumbnail, upvotes, daily/weekly/monthly/yearly ranks, categories, topics, comments count, page kind/label, and date.

#### Is this a public dataset or does it include promoted listings?

By default only regular listings are returned. Enable `shouldIncludePromotedListings: true` to include promoted listings.

#### Is this actor suitable for feeding an LLM or AI pipeline?

Yes. The clean typed JSON output is ideal for RAG, analytics dashboards, and AI agents.

### For AI Agents & LLM Apps

**Purpose:** provide AI agents and LLM applications with structured Product Hunt leaderboard and launch data — upvotes, ranks, categories, topics — as clean typed JSON.

**Minimal working input:**

```json
{
  "target": "daily",
  "startDate": "2026-08-21",
  "endDate": "2026-08-28",
  "browserForDaily": true
}
```

**Output fields your app can rely on:** `name`, `url`, `slug`, `tagline`, `upvotesCount`, `dayRank`, `weekRank`, `monthRank`, `yearRank`, `categories`, `topics`, `commentsCount`, `isPromoted`, `date`, `pageKind`, `pageLabel`.

**Non-obvious behaviors:**

- **Residential proxy requirement:** for the **full daily list**, keep `browserForDaily: true` (default) with the Apify Residential proxy to solve Cloudflare Turnstile. Disabling it may return a truncated list.
- **Each optional scrape flag adds slower runs:** enabling `shouldScrapeComments`, `shouldScrapeReviews`, `shouldScrapeBuiltWith`, `shouldScrapeLaunches`, or `shouldScrapeWebsite` increases runtime. Only enable what your task needs.
- **`maxNbItemsToScrape` 0 = all:** the default returns every item found (subject to billing). Set it to a number to cap output and cost. Default the total to a reasonable limit unless you truly intend "all".
- **Pricing:** $0.8 per run (pay-per-event), so cap `maxNbItemsToScrape` on scheduled runs to control spend.

### Legal & Compliance Disclaimer

This actor is an independent tool and is not affiliated with, endorsed by, or sponsored by Product Hunt. It accesses only publicly available pages and data on `producthunt.com`. It does not bypass login walls, and you are responsible for ensuring your use complies with Product Hunt's Terms of Service and applicable laws. Respect website terms, robots directives, and data-privacy regulations (e.g., GDPR) when storing or redistributing scraped data.

### SEO Keywords

product hunt scraper, scrape producthunt, product hunt api, product hunt leaderboard, product hunt daily, top product launches, product launch data, product hunt upvotes, product hunt rankings, producthunt.com scraper, product hunt dataset, scrape product hunt reviews, product hunt categories, product hunt topics, product hunt comments, startup product tracker, product launch tracker, scraping product hunt, product hunt market research, product hunt data extraction, ph leaderboard, top products today, product discovery data, product hunt weekly, product hunt monthly

### Related Actors

Verified related actors on Apify that pair well with this one. All links point to real, publicly available actors.

- [Apify Web Scraper](https://apify.com/apify/web-scraper)
- [Google Search Scraper](https://apify.com/apify/google-search-scraper)
- [Google Maps Places](https://apify.com/compass/crawler-google-places)

# Actor input Schema

## `target` (type: `string`):

Choose what to scrape. Daily/weekly/monthly/yearly scrape leaderboard pages. Category/topic scrape pages for a specific slug.

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

First daily leaderboard date in YYYY-MM-DD. Leave empty for today (California time).

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

Last date in an inclusive daily range. Leave empty for startDate only.

## `startWeek` (type: `string`):

First weekly leaderboard in YYYY-WW format (e.g. 2026-01).

## `endWeek` (type: `string`):

Last weekly leaderboard in YYYY-WW. Leave empty for startWeek only.

## `startMonth` (type: `string`):

First monthly leaderboard in YYYY-MM format (e.g. 2026-01).

## `endMonth` (type: `string`):

Last monthly leaderboard in YYYY-MM. Leave empty for startMonth only.

## `startYear` (type: `integer`):

First yearly leaderboard year (e.g. 2026).

## `endYear` (type: `integer`):

Last yearly leaderboard year. Leave 0 for startYear only.

## `categorySlugs` (type: `array`):

Product Hunt category slugs (e.g. ai-code-editors, developer-tools). Used with 'category' target.

## `topicSlugs` (type: `array`):

Product Hunt topic slugs (e.g. developer-tools, open-source). Used with 'topic' target.

## `maxNbItemsToScrape` (type: `integer`):

Positive limit for launches saved. Leave 0 to scrape all available until the source is exhausted.

## `shouldIncludePromotedListings` (type: `boolean`):

Include listings that Product Hunt marks as promoted.

## `shouldScrapeOnlyFeaturedLaunches` (type: `boolean`):

Keep only launches in Product Hunt's featured feed (the default leaderboard view, equivalent to leaving off the /all URL suffix). Disabled (default) scrapes EVERY launch of the day from the /all view.

## `shouldScrapeComments` (type: `boolean`):

Collect available comments for each launch. Makes the run slower.

## `shouldScrapeReviews` (type: `boolean`):

Collect available reviews for each launch. Makes the run slower.

## `shouldScrapeBuiltWith` (type: `boolean`):

Collect Product Hunt's Built With data when available. Makes the run slower.

## `shouldScrapeLaunches` (type: `boolean`):

Collect the product's visible Product Hunt launch history. Makes the run slower.

## `shouldScrapeWebsite` (type: `boolean`):

Visit each product website for title, description, visible text, and public emails. Makes the run slower.

## `debugDumpHtml` (type: `boolean`):

Diagnostic: save the raw leaderboard page HTML to the key-value store as debug-<date>.html (and debug-<date>-browser.html from the browser path). Intended for development/debugging only.

## `browserForDaily` (type: `boolean`):

Use a headless Chromium (patched with the free, open-source rebrowser-patches to defeat Turnstile's automation detection) through the residential proxy to solve Cloudflare's challenge and obtain a cf\_clearance cookie, then replay the internal GraphQL query (featured:false on the /all view) for the COMPLETE ranked daily list — every launch of the day. No paid solver needed. Falls back to the SSR/embedded + Atom-feed rows if Turnstile still blocks. Requires a residential proxy.

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

Residential proxy is REQUIRED for the full daily list: the browser path routes Chromium through it to solve Cloudflare's Turnstile and obtain a cf\_clearance cookie. The Unblocker group does NOT work for the GraphQL POST (it strips cookies), so use RESIDENTIAL. For non-daily targets a proxy is optional.

## Actor input object example

```json
{
  "target": "daily",
  "startDate": "",
  "endDate": "",
  "startWeek": "",
  "endWeek": "",
  "startMonth": "",
  "endMonth": "",
  "startYear": 0,
  "endYear": 0,
  "categorySlugs": [],
  "topicSlugs": [],
  "maxNbItemsToScrape": 0,
  "shouldIncludePromotedListings": false,
  "shouldScrapeOnlyFeaturedLaunches": false,
  "shouldScrapeComments": false,
  "shouldScrapeReviews": false,
  "shouldScrapeBuiltWith": false,
  "shouldScrapeLaunches": false,
  "shouldScrapeWebsite": false,
  "debugDumpHtml": false,
  "browserForDaily": true,
  "proxyConfiguration": {
    "useApifyProxy": true,
    "apifyProxyGroups": [
      "RESIDENTIAL"
    ]
  }
}
```

# Actor output Schema

## `dataset` (type: `string`):

No description

# API

You can run this Actor programmatically using our API. Below are code examples in JavaScript, Python, and CLI, as well as the OpenAPI specification and MCP server setup.

## JavaScript example

```javascript
import { ApifyClient } from 'apify-client';

// Initialize the ApifyClient with your Apify API token
// Replace the '<YOUR_API_TOKEN>' with your token
const client = new ApifyClient({
    token: '<YOUR_API_TOKEN>',
});

// Prepare Actor input
const input = {};

// Run the Actor and wait for it to finish
const run = await client.actor("ahmed_jasarevic/producthunt-scraper").call(input);

// Fetch and print Actor results from the run's dataset (if any)
console.log('Results from dataset');
console.log(`💾 Check your data here: https://console.apify.com/storage/datasets/${run.defaultDatasetId}`);
const { items } = await client.dataset(run.defaultDatasetId).listItems();
items.forEach((item) => {
    console.dir(item);
});

// 📚 Want to learn more 📖? Go to → https://docs.apify.com/api/client/js/docs

```

## Python example

```python
from apify_client import ApifyClient

# Initialize the ApifyClient with your Apify API token
# Replace '<YOUR_API_TOKEN>' with your token.
client = ApifyClient("<YOUR_API_TOKEN>")

# Prepare the Actor input
run_input = {}

# Run the Actor and wait for it to finish
run = client.actor("ahmed_jasarevic/producthunt-scraper").call(run_input=run_input)

# Fetch and print Actor results from the run's dataset (if there are any)
print(f"💾 Check your data here: https://console.apify.com/storage/datasets/{run.default_dataset_id}")
for item in client.dataset(run.default_dataset_id).iterate_items():
    print(item)

# 📚 Want to learn more 📖? Go to → https://docs.apify.com/api/client/python/docs/quick-start

```

## CLI example

```bash
echo '{}' |
apify call ahmed_jasarevic/producthunt-scraper --silent --output-dataset

```

## MCP server setup

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