# Product Hunt Scraper (`tidyharvest/product-hunt-scraper`) Actor

Product Hunt launches by day, week, month, topic, product URL or keyword: the product's real website and domain, votes, comments, reviews, daily/weekly/monthly ranks, topics, makers and media. Every query reported in a run summary. $1.20 per 1,000 products, down to $0.90 on paid plans.

- **URL**: https://apify.com/tidyharvest/product-hunt-scraper.md
- **Developed by:** [TidyHarvest](https://apify.com/tidyharvest) (community)
- **Categories:** Lead generation, Social media
- **Stats:** 2 total users, 1 monthly users, 100.0% runs succeeded, 0 bookmarks
- **User rating**: No ratings yet

## Pricing

from $0.90 / 1,000 product scrapeds

This Actor is paid per event. You are not charged for the Apify platform usage, but only a fixed price for specific events.
Since this Actor supports Apify Store discounts, the price gets lower the higher subscription plan you have.

Learn more: https://docs.apify.com/actors/running/actors-in-store.md#pay-per-event

## What's an Apify Actor?

An Actor is a serverless cloud program that runs on the Apify platform. It has two run modes.
In Batch mode, an Actor accepts a well-defined JSON input, performs an action which can take anything from a few seconds to a few hours,
and optionally produces a well-defined JSON output, datasets with results, or files in key-value store.
In Standby mode, an Actor provides a web server which can be used as a website, API, or an MCP server.

Apify vocabulary and the platform model are defined once, in the agent quickstart at https://apify.com/agents.md.

## How to integrate an Actor?

If asked about integration, you help developers integrate Actors into their projects.
You adapt to their stack and deliver integrations that are safe, well-documented, and production-ready.

Do not guess an integration path. Every one of them is in the agent quickstart at https://apify.com/agents.md: the Apify MCP server, Agent Skills with the Apify CLI, the JavaScript and Python clients, the REST API, and the account-free path for an agent with no human to sign in. It also carries the rule on stating cost before the first paid run.

For examples already wired to this Actor's own input schema, see the [API](#api) section below.

Each client library has reference documentation the quickstart does not restate: [JavaScript/TypeScript](https://docs.apify.com/api/client/js/docs.md) (`npm install apify-client`) and [Python](https://docs.apify.com/api/client/python/docs.md) (`pip install apify-client`).

# README

## Product Hunt Scraper: Daily, Weekly & Monthly Launches, Topics, Makers, Websites

Pull **Product Hunt launches** as clean JSON: **name, tagline, description, the product's real website, votes, comments, reviews, daily/weekly/monthly/yearly rank, launch date, topics, makers, media** and optional top comments. Ask by launch day, week, month or year, by topic, by product or launch URL, or by free text.

### What you can do with it

- **Daily launch feed:** schedule `yesterday` every morning and send the top products to Slack, a newsletter or a database.
- **Weekly and monthly leaderboards:** `last week`, `2026-W41`, `last month`, `2026-10`, or paste a leaderboard URL.
- **Competitor and market research:** follow every launch in a **topic** (`topic:artificial-intelligence`) or a theme (`crm`, `open source llm`) and see what gets votes.
- **Lead generation:** each product's **own website and domain** (not a Product Hunt redirect), plus makers' names, usernames, headlines, Twitter handles and profile links.
- **Trend and sentiment analysis:** turn on top comments to see what early users say.

### Input

| Field | What it does |
|---|---|
| `queries` | One per line, mix freely (see the table below). |
| `maxPerQuery` | Most products any one query returns (default 100). |
| `maxItems` | Cap for the whole run and your cost. Each query gets a fair share; what one query doesn't use goes to the next. |
| `order` | Automatic (leaderboard rank for one day, most votes for longer windows, newest for the rest), or Leaderboard rank, Most votes, Newest, Featured time. |
| `featuredOnly` | Only launches Product Hunt featured. |
| `topic`, `postedAfter` / `postedBefore` | Restrict `latest`, topic and text queries to a topic or a date window. |
| `includeComments`, `commentsPerProduct` | Add each product's most upvoted comments (default 10). |
| `keywords` | Keep only products that mention one of these words. Filtered products are not charged. |
| `maxWaitMinutes` | Longest total pause the run may take when Product Hunt asks it to slow down (see Limits). |

#### Query forms

| You type | You get |
|---|---|
| `today`, `yesterday`, `2026-10-14` | That launch day, in Pacific time like Product Hunt's own leaderboard. |
| `this week`, `last week`, `2026-W41` | That leaderboard week (Monday to Sunday). |
| `this month`, `last month`, `2026-10`, `year:2026` | That month or year. |
| `2026-10-01..2026-10-07`, `2026-W40..2026-W41` | Any range, both ends included. |
| `latest` | The newest launches. |
| `topic:developer-tools` or a `/topics/...` URL | Launches in that topic. A `/categories/...` URL is read as the topic of the same name. |
| `slug:notion`, a `/posts/...` or `/products/x/launches/...` URL | That one launch. |
| a `/products/raycast` URL | The launches listed on that product's page. |
| a daily, weekly, monthly or yearly `/leaderboard/...` URL | That leaderboard's featured launches (add `/all` for every launch). |
| anything else, e.g. `crm` | Launches whose name, tagline, description or topics contain every word, newest first. |

Example:

```json
{ "queries": ["yesterday", "last week", "topic:developer-tools", "crm"], "maxPerQuery": 50, "maxItems": 200 }
```

### Output

One item per product:

```json
{
  "id": "1100001", "name": "Beam.win", "slug": "beam-win", "tagline": "Do the thing faster", "description": "...",
  "url": "https://www.producthunt.com/products/beam-win",
  "website": "https://beam.win", "websiteDomain": "beam.win", "websiteRedirect": "https://www.producthunt.com/r/XR2QV6TXWMZHHX",
  "votesCount": 412, "commentsCount": 37, "reviewsCount": 3, "reviewsRating": 5,
  "dailyRank": 1, "weeklyRank": 4, "monthlyRank": 12, "yearlyRank": null,
  "launchDate": "2026-10-19T07:01:00Z", "featuredAt": "2026-10-19T07:01:00Z", "featured": true,
  "thumbnail": "https://ph-files.imgix.net/...", "media": [{ "type": "image", "url": "https://ph-files.imgix.net/...", "videoUrl": null }],
  "topics": ["Productivity", "Developer Tools"], "topicSlugs": ["productivity", "developer-tools"],
  "makers": [{ "name": "Jane Doe", "username": "janedoe", "headline": "Founder", "twitter": "jane", "website": null,
               "profileUrl": "https://www.producthunt.com/@janedoe" }],
  "makersHidden": 1, "hunter": "someone", "comments": [], "query": "yesterday"
}
```

- `website` is the product's own site with Product Hunt's tracking removed; `websiteRedirect` keeps the Product Hunt link.
- Product Hunt hides some makers' identities. Those are never returned as placeholder names: `makersHidden` counts them.
- A product that two of your queries both find is returned (and charged) once.

The run's **SUMMARY** record (in the key-value store) lists every query: what it is, how many launches the window holds, how many were returned, and its status (`ok`, `no results`, `failed`, or `not reached` when a cap stopped the run first).

### Pricing

Pay per result: **$1.20 per 1,000 products** on the Free plan, down to **$0.90 per 1,000** on paid Apify plans (`product-scraped`). Websites, ranks, media and comments are included. Keywords, duplicates and caps apply before you are charged. A run that finds nothing at all fails instead of silently returning an empty dataset; a query with no matches is simply reported as `no results`.

### Limits and notes

- **Speed:** Product Hunt serves about **1,200 products per 15 minutes** (about 600 with 10 comments each; measured Oct 2026). Runs within that finish in seconds to a few minutes; a larger run pauses until Product Hunt allows more, and logs how long it waits. `maxWaitMinutes` (default 30) caps the total pause; when it's reached the run stops with what it has and the summary says so. For a whole month (25,000+ launches), raise `maxWaitMinutes` and the run timeout.
- **Text search** finds launches in the best-matching topic (`crm` -> the CRM topic, newest first), or among the most recent launches when no topic matches. Use a topic, `slug:` or a URL when you know exactly what you want.
- **Not included:** promoted (paid) placements never appear in results. Product Hunt's newer category pages are read as the topic with the same name. The product websites themselves are not visited (no emails).
- Data is public Product Hunt launch data, subject to Product Hunt's terms.

### Feedback and requests

We welcome feedback: a field or option you wish this had, a change to how it works, or a scraper you would like us to build.
Open an issue in the **Issues** tab of this page and tell us what you need. We read every one, and we build the requests that
come up most. If this actor works well for you, a short review helps other people find it.

# Actor input Schema

## `queries` (type: `array`):

One per line. Launch days (Pacific time, like Product Hunt's leaderboards): `today`, `yesterday`, `2026-10-14`. Weeks, months, years: `this week`, `last week`, `2026-W41`, `this month`, `last month`, `2026-10`, `year:2026`. Ranges: join any two with `..`, e.g. `2026-10-01..2026-10-07`. `latest` for the newest launches. `topic:artificial-intelligence`. A Product Hunt URL (launch, product, topic, category or leaderboard page) or `slug:notion`. Any other text searches launches by name, tagline, description and topic.

## `maxPerQuery` (type: `integer`):

Most products any one query may return. Raise it for a whole week or month (a busy week has 6,000+ launches).

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

Cap for the whole run (also caps your cost). Every query gets a fair share; what one query doesn't use goes to the next. 0 or empty = no run cap.

## `order` (type: `string`):

Sort order. With a per-query cap, this decides which products you get first.

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

Only launches Product Hunt featured on its homepage and leaderboards. Leaderboard URLs return featured launches anyway (add /all to the URL for every launch).

## `topic` (type: `string`):

Restrict every query to one topic, e.g. `developer-tools` (the last part of a producthunt.com/topics/... URL).

## `postedAfter` (type: `string`):

Date (`2026-09-01`, Pacific time) or ISO datetime. Applies to `latest`, topic and text-search queries.

## `postedBefore` (type: `string`):

Date (`2026-10-01`, Pacific time) or ISO datetime. Applies to `latest`, topic and text-search queries.

## `includeComments` (type: `boolean`):

Add each product's most upvoted comments. No extra charge; large runs take longer.

## `commentsPerProduct` (type: `integer`):

How many top comments to add when comments are on.

## `keywords` (type: `array`):

Keep a product only if it contains one of these words anywhere. Empty = all. Filtered products are not charged.

## `maxWaitMinutes` (type: `integer`):

Product Hunt serves about 1,200 products per 15 minutes. Bigger runs pause until it allows more; this caps the total pause. When reached, the run stops and keeps what it has (the summary says so). Raise it, and the run timeout, for large backfills.

## Actor input object example

```json
{
  "queries": [
    "yesterday"
  ],
  "maxPerQuery": 20,
  "order": "AUTO",
  "featuredOnly": false,
  "includeComments": false,
  "commentsPerProduct": 10,
  "maxWaitMinutes": 30
}
```

# Actor output Schema

## `products` (type: `string`):

One item per launch: name, tagline, description, website, votes, comments, reviews, daily/weekly/monthly/yearly rank, launch date, topics, makers, media and optional top comments.

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

Every query with how many products it returned and its status (ok, no results, failed, or not reached because of a cap).

# 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 = {
    "queries": [
        "yesterday"
    ],
    "maxPerQuery": 20
};

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

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

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

```

## Python example

```python
from apify_client import ApifyClient

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

# Prepare the Actor input
run_input = {
    "queries": ["yesterday"],
    "maxPerQuery": 20,
}

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

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

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

```

## CLI example

```bash
echo '{
  "queries": [
    "yesterday"
  ],
  "maxPerQuery": 20
}' |
apify call tidyharvest/product-hunt-scraper --silent --output-dataset

```

## MCP server setup

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

The hosted server signs you in with OAuth on first connect, so no API token belongs in this config. Clients without OAuth support can send an `Authorization: Bearer <APIFY_API_TOKEN>` header instead, using a token from API & Integrations in Apify Console (https://console.apify.com/settings/integrations).

## OpenAPI specification

Download the OpenAPI definition: https://api.apify.com/v2/actors/mFpPPrBZkAFWSJpSc/builds/SElmvlYxxRjfWk0Cy/openapi.json
