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

Collect Product Hunt launches from leaderboards, category or topic pages, and supported Product Hunt URLs. Review names, dates, ranks, votes, categories, media, and product details in structured rows. Leave the launch limit empty to collect all available launches until the source is exhausted.

- **URL**: https://apify.com/maximedupre/product-hunt-scraper.md
- **Developed by:** [Maxime Dupré](https://apify.com/maximedupre) (community)
- **Categories:** Lead generation, Marketing, Developer tools
- **Stats:** 865 total users, 122 monthly users, 88.7% runs succeeded, 11 bookmarks
- **User rating**: 4.33 out of 5 stars

## Pricing

from $1.65 / 1,000 launches

This Actor is paid per event. You are not charged for the Apify platform usage, but only a fixed price for specific events.

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

## What's an Apify Actor?

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

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

## How to integrate an Actor?

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

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

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

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

# README

### 🚀 Turn Product Hunt launches into structured research data

Product Hunt Scraper helps founders, marketers, researchers, and sales teams collect public launch data without opening every listing. Export launch names, descriptions, dates, categories, ranks, votes, and comment counts as structured rows.

- Collect Product Hunt launches from category pages with **[Product Hunt Category Scraper](https://apify.com/maximedupre/product-hunt-scraper/examples/product-hunt-category-scraper)**.
- Find Product Hunt launches by topic with **[Product Hunt Topic Scraper](https://apify.com/maximedupre/product-hunt-scraper/examples/product-hunt-topic-scraper)**.
- Spot possible launches with **[New Product Ideas](https://apify.com/maximedupre/product-hunt-scraper/examples/new-product-ideas)**.
- Get launch rows through the **[Producthunt API](https://apify.com/maximedupre/product-hunt-scraper/examples/producthunt-api)**.
- Compare daily pages over time with **[Product Hunt Launch Tracking](https://apify.com/maximedupre/product-hunt-scraper/examples/product-hunt-launch-tracking)**.
- Compare launches and engagement with **[Product Hunt Competitor Analysis](https://apify.com/maximedupre/product-hunt-scraper/examples/product-hunt-competitor-analysis)**.
- Inspect products, media, and launch history with **[Product Hunt Product Research](https://apify.com/maximedupre/product-hunt-scraper/examples/product-hunt-product-research)**.
- Review maker profiles and launch context with **[Product Hunt Maker Research](https://apify.com/maximedupre/product-hunt-scraper/examples/product-hunt-maker-research)**.
- Track launch patterns and ranks with **[Product Hunt Trend Research](https://apify.com/maximedupre/product-hunt-scraper/examples/product-hunt-trend-research)**.
- Find public emails on linked sites with **[Product Hunt Email Enrichment](https://apify.com/maximedupre/product-hunt-scraper/examples/product-hunt-email-enrichment)**.

#### 📦 Product Hunt launch data

Each saved row represents one Product Hunt launch, or its product identity when no launch identity is available. Repeated launches or product identities are skipped after the first saved match. Fields include:

- Product or launch name, tagline, description, Product Hunt URL, launch date, and thumbnail
- Upvotes, comments, reviews, followers, launch counts, and available daily, weekly, monthly, or yearly ranks
- Categories, topics, tags, gallery images, and Product Hunt video assets
- Exposed makers, hunters, team members, and public profile context
- External links and X account handle when Product Hunt exposes them
- The public schema also has fields for team profiles, product links, media, comments, reviews, Built With details, past launches, and website data

Unavailable values remain `null` or `[]`. A launch can still be saved when optional details or extra data are not available. If a long crawl stops early, rows already saved remain in the dataset and the run reports that it is incomplete.

#### 🚀 Run Product Hunt Scraper

1. Choose one **Target**: daily, weekly, monthly, yearly, category, topic, or Product Hunt page URLs.
2. Complete only that Target's options. Daily runs default to today's California-time leaderboard when no date is entered.
3. Set **Maximum launches to save** to a positive integer to bound the run. Leave it empty to save all available launches until the selected source is exhausted. Large runs use more memory, so use a smaller limit for a bounded run.
4. Choose whether to include promoted listings or keep only featured launches. These filters apply to leaderboards.
5. Turn on website details only if you need website titles, descriptions, visible text, or public emails.
6. Run the Actor and open the dataset from the **Output** tab.

If Product Hunt blocks every initial discovery attempt, the Actor reports that it could not access Product Hunt instead of treating the page as a normal empty result.

If one launch cannot be read after retries, the Actor skips it and keeps working on other launches it can read. Saved rows stay in the dataset. A launch that is not saved has no launch charge. The run reports an incomplete result when a launch remains unreadable. A failure to access the source ends the run only when it blocks all remaining work.

If a valid run reaches a source, enrichment, or resource limit before all requested launches are saved, saved rows remain in the dataset and the run completes with an incomplete result that explains the reason.

#### ⚙️ Input

Choose one source type per run. Fields for other Target sections are ignored. This example is copied from the public input of a successful run with the default input.

```json
{
  "target": "daily",
  "maxNbItemsToScrape": 2,
  "shouldIncludePromotedListings": false,
  "shouldScrapeOnlyFeaturedLaunches": false,
  "shouldScrapeWebsite": false
}
```

**Input fields**

| Field | Type | What it does |
| --- | --- | --- |
| `target` | string | Chooses `daily`, `weekly`, `monthly`, `yearly`, `category`, `topic`, or `pageUrls`. |
| `startDate` | string | Sets the first daily leaderboard date in `YYYY-MM-DD`. Leave it empty for today's California-time leaderboard. |
| `endDate` | string | Sets the last date in an inclusive daily range. Leave it empty to use only `startDate`. |
| `startWeek` | string | Sets the first weekly leaderboard in `YYYY-WW`. |
| `endWeek` | string | Sets the last weekly leaderboard in an inclusive range. Leave it empty to use only `startWeek`. |
| `startMonth` | string | Sets the first monthly leaderboard in `YYYY-MM`. |
| `endMonth` | string | Sets the last monthly leaderboard in an inclusive range. Leave it empty to use only `startMonth`. |
| `startYear` | integer | Sets the first yearly leaderboard. |
| `endYear` | integer | Sets the last yearly leaderboard in an inclusive range. Leave it empty to use only `startYear`. |
| `categorySlugs` | string\[] | Lists Product Hunt category slugs, such as `ai-code-editors`. |
| `topicSlugs` | string\[] | Lists Product Hunt topic slugs, such as `developer-tools`. The old `opensource` slug is also accepted and uses the `open-source` page. |
| `productHuntPageUrls` | string\[] | Lists supported Product Hunt launch detail, category, topic, or leaderboard page URLs, one per row. |
| `maxNbItemsToScrape` | integer | Sets a positive limit for launches saved in the run. Leave it empty to return all available results until the source is exhausted. |
| `shouldIncludePromotedListings` | boolean | Includes promoted listings from daily, weekly, monthly, and yearly leaderboards. Launch URL inputs are collected as given. |
| `shouldScrapeOnlyFeaturedLaunches` | boolean | Keeps only featured launches from daily, weekly, monthly, or yearly leaderboards. Launch URL inputs are collected as given. |
| `shouldScrapeWebsite` | boolean | Collects website titles, descriptions, visible text, and public emails when found. A saved launch with at least one public email adds one email charge. |

**Target choices**

For `daily`, `weekly`, `monthly`, and `yearly`, use the matching period fields. For `category`, add `categorySlugs`. For `topic`, add `topicSlugs`. For `pageUrls`, add supported Product Hunt launch detail, category, topic, or leaderboard URLs. Product Hunt post, search, home, and other URLs are not supported.

#### 🧾 Output

The default dataset contains one row per successfully saved Product Hunt launch or product identity. Optional arrays stay empty, and unavailable values stay `null`, when Product Hunt does not provide them. The table uses dotted paths for nested fields; `[]` means an array item.

**Output fields**

| Field | Type | What it does |
| --- | --- | --- |
| `isPromoted` | boolean | Says whether Product Hunt identified the placement as promoted. |
| `thumbnailUrl` | string or null | Gives the Product Hunt thumbnail URL. |
| `name` | string | Gives the product or launch name. |
| `url` | string | Gives the Product Hunt launch URL, or product URL when no launch URL is known. |
| `tagline` | string or null | Gives the Product Hunt tagline. |
| `categories` | string\[] | Lists Product Hunt categories in source order. |
| `followers` | number or null | Gives the visible product follower count. |
| `commentsCount` | number or null | Gives the visible comment count for the current launch. |
| `reviewsCount` | number or null | Gives the visible review count. |
| `launchesCount` | number or null | Gives the visible number of launches for the product. |
| `dayRank` | number or null | Gives the daily leaderboard rank when available. |
| `weekRank` | number or null | Gives the weekly leaderboard rank when available. |
| `monthRank` | number or null | Gives the monthly leaderboard rank when available. |
| `yearRank` | number or null | Gives the yearly leaderboard rank when available. |
| `launchDate` | string or null | Gives the launch date in `YYYY-MM-DD` when available. |
| `description` | string or null | Gives the readable product description. |
| `upvotesCount` | number or null | Gives the current launch upvote score. |
| `links` | string\[] | Lists company and product links shown by Product Hunt. |
| `xAccountHandle` | string or null | Gives the public X/Twitter handle when available. |
| `imageUrls` | string\[] | Lists Product Hunt gallery image URLs. |
| `videoUrls` | string\[] | Lists Product Hunt video asset URLs. |
| `tags` | string\[] | Lists Product Hunt topic and tag names in source order. |
| `team` | object\[] | Lists exposed makers, hunters, and other launch-team members. |
| `team[].avatarUrl` | string or null | Gives a public team member avatar URL. |
| `team[].type` | string or null | Gives the Product Hunt team role when available. |
| `team[].name` | string or null | Gives the public team member name. |
| `team[].username` | string or null | Gives the Product Hunt username. |
| `team[].headline` | string or null | Gives the public profile headline. |
| `team[].about` | string or null | Gives the public profile biography. |
| `team[].followersCount` | number or null | Gives the public follower count. |
| `team[].links` | string\[] | Lists public profile links. |
| `builtWith` | object\[] | Lists tools in Product Hunt's Built With section when available. |
| `builtWith[].name` | string or null | Gives the tool name. |
| `builtWith[].url` | string or null | Gives the Product Hunt URL for the tool when available. |
| `builtWith[].tagline` | string or null | Gives the tool tagline when available. |
| `builtWith[].thumbnailUrl` | string or null | Gives the tool thumbnail URL when available. |
| `launches` | object\[] | Lists visible prior Product Hunt launches for the same product when available. |
| `launches[].title` | string or null | Gives the prior launch name. |
| `launches[].url` | string or null | Gives the prior launch Product Hunt URL. |
| `launches[].tagline` | string or null | Gives the prior launch tagline. |
| `launches[].launchDate` | string or null | Gives the prior launch date when available. |
| `launches[].dayRank` | number or null | Gives the prior launch daily rank when available. |
| `launches[].weekRank` | number or null | Gives the prior launch weekly rank when available. |
| `launches[].monthRank` | number or null | Gives the prior launch monthly rank when available. |
| `launches[].yearRank` | number or null | Gives the prior launch yearly rank when available. |
| `launches[].upvotesCount` | number or null | Gives the prior launch upvote score when available. |
| `launches[].commentsCount` | number or null | Gives the prior launch comment count when available. |
| `launches[].thumbnailUrl` | string or null | Gives the prior launch thumbnail URL when available. |
| `comments` | object\[] | Lists Product Hunt comments when available. |
| `comments[].user` | object | Holds the public Product Hunt commenter profile. |
| `comments[].user.isMaker` | boolean or null | Says whether the commenter is a maker when known. |
| `comments[].user.username` | string or null | Gives the commenter's Product Hunt username. |
| `comments[].user.name` | string or null | Gives the commenter's public name. |
| `comments[].user.avatarUrl` | string or null | Gives the commenter's public avatar URL. |
| `comments[].user.headline` | string or null | Gives the commenter's public profile headline. |
| `comments[].user.links` | string\[] | Lists the commenter's public profile links. |
| `comments[].user.followersCount` | number or null | Gives the commenter's public follower count. |
| `comments[].text` | string or null | Gives the comment text. |
| `comments[].upvotesCount` | number or null | Gives the comment upvote count when available. |
| `comments[].timeAgo` | string or null | Gives the relative time shown for the comment. |
| `reviews` | object\[] | Lists Product Hunt reviews when available. |
| `reviews[].user` | object | Holds the public Product Hunt reviewer profile. |
| `reviews[].user.username` | string or null | Gives the reviewer's Product Hunt username. |
| `reviews[].user.name` | string or null | Gives the reviewer's public name. |
| `reviews[].user.avatarUrl` | string or null | Gives the reviewer's public avatar URL. |
| `reviews[].user.headline` | string or null | Gives the reviewer's public profile headline. |
| `reviews[].user.links` | string\[] | Lists the reviewer's public profile links. |
| `reviews[].user.followersCount` | number or null | Gives the reviewer's public follower count. |
| `reviews[].user.reviewsCount` | number or null | Gives the reviewer's review count when available. |
| `reviews[].rating` | number or null | Gives the review rating when available. |
| `reviews[].text` | string or null | Gives the review text. |
| `reviews[].viewsCount` | number or null | Gives the review view count when available. |
| `reviews[].timeAgo` | string or null | Gives the relative time shown for the review. |
| `website` | object | Holds the linked website and requested enrichment. |
| `website.url` | string or null | Gives the external product website URL. |
| `website.title` | string or null | Gives the website page title when enrichment succeeds. |
| `website.description` | string or null | Gives the website page description when enrichment succeeds. |
| `website.emails` | string\[] | Lists public website emails found by optional enrichment. |
| `website.rawText` | string or null | Gives readable visible website text when enrichment succeeds. |

This row came from a successful current beta run. It is shortened: each `"..."` marker stands for values omitted from a larger array.

```json
{
  "isPromoted": false,
  "thumbnailUrl": "https://ph-files.imgix.net/d2edfb12-0064-4ea2-af46-12b43bbb2842.png",
  "name": "Cursor",
  "url": "https://www.producthunt.com/products/cursor",
  "tagline": "AI coding agent",
  "categories": [
    "AI Coding Agents",
    "Vibe Coding Tools",
    "AI Code Editors"
  ],
  "followers": 66463,
  "commentsCount": 10,
  "reviewsCount": 959,
  "launchesCount": 11,
  "dayRank": 3,
  "weekRank": 11,
  "monthRank": 43,
  "yearRank": null,
  "launchDate": "2026-08-19",
  "description": "Cursor is the best way to build ambitious software.",
  "upvotesCount": 355,
  "links": [
    "https://cursor.com",
    "https://twitter.com/cursor_ai",
    "https://www.linkedin.com/company/cursorai/",
    "https://cursor.com/changelog/origin-code-hosting"
  ],
  "xAccountHandle": "@cursor_ai",
  "imageUrls": [
    "https://ph-files.imgix.net/f3171d81-83b0-479a-bff6-9007dc2176ee.png?auto=format&fit=crop",
    "https://ph-files.imgix.net/09a5ccf8-605f-49fc-b747-4414bce7d46e.png?auto=format&fit=crop",
    "https://ph-files.imgix.net/eb183572-53ad-4a7f-9d8b-2e40d981b8fc.png?auto=format&fit=crop"
  ],
  "videoUrls": [],
  "tags": [
    "Developer Tools"
  ],
  "team": [
    {
      "avatarUrl": "https://ph-avatars.imgix.net/42237/original.jpeg?auto=format&crop=faces&fit=crop&h=100&w=100",
      "type": "Maker",
      "name": "Michael Feldstein",
      "username": "msfeldstein",
      "headline": "Canopy",
      "about": null,
      "followersCount": 282,
      "links": [
        "https://twitter.com/msfeldstein"
      ]
    },
    {
      "avatarUrl": "https://ph-avatars.imgix.net/9042461/c5ad409b-6070-4c3e-8faa-0d951f920485.jpeg?auto=format&crop=faces&fit=crop&h=100&w=100",
      "type": "Maker",
      "name": "Jon Kaplan",
      "username": "jonk1",
      "headline": "Cursor",
      "about": null,
      "followersCount": 25,
      "links": []
    },
    "..."
  ],
  "builtWith": [],
  "launches": [
    {
      "title": "Origin by Cursor",
      "url": "https://www.producthunt.com/products/cursor/launches/origin-by-cursor",
      "tagline": "The Git forge built for the age of coding agents",
      "launchDate": "2026-08-19",
      "dayRank": 3,
      "weekRank": 11,
      "monthRank": 43,
      "yearRank": null,
      "upvotesCount": 355,
      "commentsCount": 10,
      "thumbnailUrl": "https://ph-files.imgix.net/d2edfb12-0064-4ea2-af46-12b43bbb2842.png"
    },
    "..."
  ],
  "comments": [
    {
      "user": {
        "isMaker": false,
        "username": "aditya_oberai",
        "name": "Aditya Oberai",
        "avatarUrl": "https://ph-avatars.imgix.net/2123829/2238e1c4-40f4-4967-907c-a09d9b2fc938.jpeg",
        "headline": "Appwrite",
        "links": [
          "https://twitter.com/adityaoberai1",
          "https://github.com/adityaoberai",
          "https://newsletter.oberai.dev/",
          "https://oberai.dev",
          "https://www.linkedin.com/in/adityaoberai1/"
        ],
        "followersCount": 620
      },
      "text": "Excited to see this launch, team! Definitely arrives at a necessary time. We're working on an integration to allow automatic deployments of sites and functions on Appwrite from Origin, would love to connect with any relevant engineering/DevRel team members about the same.",
      "upvotesCount": 5,
      "timeAgo": "49 days ago"
    },
    "..."
  ],
  "reviews": [
    {
      "user": {
        "username": "bryce_murray",
        "name": "Bryce Murray",
        "avatarUrl": "https://ph-avatars.imgix.net/3709763/c1f9942f-714a-419d-a401-98150d3f7226.jpeg",
        "headline": "I like to build cool things.",
        "links": [
          "https://twostory.com"
        ],
        "followersCount": 37,
        "reviewsCount": 2
      },
      "rating": 5,
      "text": "Cursor was instrumental in turning this into a native iOS app!",
      "viewsCount": 0,
      "timeAgo": "4 days ago"
    },
    "..."
  ],
  "website": {
    "url": "https://cursor.com",
    "title": null,
    "description": null,
    "emails": [],
    "rawText": null
  }
}
```

See the [Output schema](https://apify.com/maximedupre/product-hunt-scraper/output-schema) for the same fields in the public schema.

#### 💳 Pricing

This Actor uses pay-per-event pricing. The primary event is charged once for each saved launch or product identity. The email enrichment add-on is charged only for a saved launch where optional website enrichment finds at least one public email. A run with no saved launch is not charged for a launch. Website checks that find no public email do not add the email charge. See the [Pricing tab](https://apify.com/maximedupre/product-hunt-scraper/pricing) for current rates.

#### 🔌 Integrations

Use Apify datasets, API access, schedules, and webhooks to export or automate results. This walkthrough shows how to connect an Actor to other workflows:

https://www.youtube.com/watch?v=bNACk1_S_6w\&list=PLObrtcm1Kw6MUrlLNDbK9QRg8VDJg0gOW\&index=4

#### ❓ FAQ

##### What happens if one launch cannot be read after retries?

The Actor skips that launch and keeps working on other launches it can read. Rows already saved stay in the dataset. The skipped launch has no launch charge, and the run reports an incomplete result. The run ends only if a source access problem blocks all remaining work.

##### What happens if Product Hunt blocks every discovery attempt?

The Actor reports that it could not access Product Hunt instead of returning an ordinary successful empty scrape. Retry later because source access can change between runs.

##### What happens if a run reaches a source, enrichment, or resource limit?

Rows saved before the stop remain in the dataset, and charges for those saved rows remain. The run completes with an incomplete result and explains the reason. Set **Maximum launches to save** when you need a smaller bounded run.

##### How do I keep a large crawl manageable?

Leave website details off when you do not need the linked site data. Set a positive **Maximum launches to save** limit for a smaller run; leave it empty to return all available results until the source is exhausted.

##### Can I submit a Product Hunt launch URL?

Yes. Use the `pageUrls` Target to submit supported Product Hunt launch detail, category, topic, or leaderboard URLs. It does not accept post, search, home, or other URL types.

##### Why are some fields `null` or empty arrays?

Product Hunt does not expose every optional fact for every launch. Missing optional details or website data do not discard a valid launch, so unavailable values keep their schema-defined empty form. A launch that cannot be read after retries is skipped.

##### Can I use several target types in one run?

Choose one Target per run. The `pageUrls` Target accepts a list of supported Product Hunt pages. You can include launch detail, category, topic, and leaderboard URLs in the same list.

##### Are comments, reviews, launch history, Built With data, and website emails always included?

No. The public form has no separate switches for comments, reviews, Built With data, or launch history. It has one switch for website details. Product Hunt may not expose every field on each launch, so some values can be empty.

##### Can I run the Actor through an API?

Yes. Use the Apify API to start runs and get dataset rows.

##### How do I monitor new Product Hunt launches?

Run the daily Target on an Apify schedule and send completed datasets through the API or a webhook. Each run reads the selected Product Hunt page rather than reusing a saved inventory.

### 📝 Changelog

**v1.0** (07-10-2026)

- Category and topic targets use slug lists, and the URL list accepts their supported pages.
- Comments, reviews, Built With details, and launch history are collected without separate input switches.
- When a launch cannot be read, saved rows remain in the dataset, other launches continue, and the run reports an incomplete result.

**v0.0**

- Initial release with daily, weekly, monthly, yearly, category, topic, and supported page URL Targets.
- Initial release with optional comments, reviews, Built With, launch history, and website enrichment.
- Initial release.

### 🆘 Support

For issues, questions, or feature requests, [file a ticket](https://console.apify.com/actors/maximedupre~product-hunt-scraper/issues) and I'll fix or implement it in less than 24h 🫡

### 🔗 Related Actors

- [Website Email & Contact Scraper](https://apify.com/maximedupre/website-emails-scraper) finds public emails on product websites you already selected.
- [Tiny Startups Scraper](https://apify.com/maximedupre/tiny-startups-scraper) collects launches, rankings, and deals from another startup directory.
- [Uneed Scraper](https://apify.com/maximedupre/uneed-scraper) compares product launches, categories, and details from another product directory.
- [Product Hunt Leaderboard Scraper | Daily, Weekly, Monthly](https://apify.com/muzafferkadir/product-hunt-leaderboard) collects Product Hunt leaderboard rows for daily, weekly, and monthly pages.
- [Product Hunt Launches Scraper](https://apify.com/parseforge/producthunt-scraper) collects daily Product Hunt launches with votes, comments, ranks, topics, makers, and websites.

**Made with ❤️ by Maxime Dupré**

# Actor input Schema

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

Choose one Product Hunt source for this run. For the page URL choice, add supported launch detail, category, topic, or leaderboard URLs.

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

First daily leaderboard date in YYYY-MM-DD. Leave blank to scrape today's California-time leaderboard. Add an end date to include each day in a past date range.

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

Optional last date in an inclusive daily range, in YYYY-MM-DD. Leave blank to scrape only the start date.

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

First Product Hunt leaderboard week in YYYY-WW, such as 2026-52. Add an end week for an inclusive range.

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

Optional last week in an inclusive range, in YYYY-WW. Leave blank to scrape only the start week.

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

First Product Hunt leaderboard month in YYYY-MM, such as 2026-11. Add an end month for an inclusive range.

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

Optional last month in an inclusive range, in YYYY-MM. Leave blank to scrape only the start month.

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

First Product Hunt leaderboard year, such as 2026. Add an end year for an inclusive range.

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

Optional last year in an inclusive range. Leave blank to scrape only the start year.

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

Add one Product Hunt category slug per row, such as ai-code-editors.

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

Add one Product Hunt topic slug per row, such as developer-tools. The old opensource slug is also accepted and uses the open-source page.

## `productHuntPageUrls` (type: `array`):

Add one supported Product Hunt page URL per row. You can mix launch detail, category, topic, and leaderboard URLs.

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

Leave this empty to save all available launches until the source is exhausted. Set a positive number to stop after that many saved launches.

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

Include promoted listings from daily, weekly, monthly, and yearly leaderboards. Submitted launch URLs are collected as given.

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

Keep only featured launches from daily, weekly, monthly, or yearly leaderboards. Submitted launch URLs are collected as given.

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

Collect the title, description, visible text, and public emails found on each linked product website. A saved launch with at least one public email adds one email charge.

## Actor input object example

```json
{
  "target": "daily",
  "startWeek": "2026-52",
  "startMonth": "2026-11",
  "startYear": 2026,
  "categorySlugs": [
    "ai-code-editors"
  ],
  "topicSlugs": [
    "developer-tools"
  ],
  "productHuntPageUrls": [
    "https://www.producthunt.com/products/product-slug/launches/launch-slug",
    "https://www.producthunt.com/categories/ai-code-editors",
    "https://www.producthunt.com/topics/developer-tools"
  ],
  "maxNbItemsToScrape": 2,
  "shouldIncludePromotedListings": false,
  "shouldScrapeOnlyFeaturedLaunches": false,
  "shouldScrapeWebsite": false
}
```

# Actor output Schema

## `results` (type: `string`):

Open saved launch rows with names, links, counts, ranks, categories, team, media, comments, reviews, Built With, launch history, and website data.

# 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 = {
    "target": "daily",
    "maxNbItemsToScrape": 2
};

// Run the Actor and wait for it to finish
const run = await client.actor("maximedupre/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 = {
    "target": "daily",
    "maxNbItemsToScrape": 2,
}

# Run the Actor and wait for it to finish
run = client.actor("maximedupre/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 '{
  "target": "daily",
  "maxNbItemsToScrape": 2
}' |
apify call maximedupre/product-hunt-scraper --silent --output-dataset

```

## MCP server setup

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