Product Hunt Scraper (/w EMAILS)
Pricing
from $3.50 / 1,000 scraped products
Product Hunt Scraper (/w EMAILS)
Scrapes Product Hunt's launches for a specific date. Extracts the product names, descriptions, makers info (name + links), and emails.
Pricing
from $3.50 / 1,000 scraped products
Rating
5.0
(2)
Developer
Maxime
Actor stats
3
Bookmarked
160
Total users
42
Monthly active users
5.3 hours
Issues response
17 hours ago
Last modified
Categories
Share
Find startup leads from Product Hunt
Product Hunt Scraper turns Product Hunt daily, weekly, monthly, yearly, category, and topic pages into startup rows you can sort, research, and use for outreach. It keeps launch ranks, follower counts, reviews, past launches, and optional website details in the same row when you turn those extras on.
- ✅ Lead-ready rows - keep Product Hunt links, ranks, launch history, and optional website details together in one dataset.
- ✅ Daily, historical, and slug pages - scrape leaderboards or category/topic pages without assembling Product Hunt URLs yourself.
- ✅ Website enrichment when you need it - add the site title, description, raw text, and public emails for deeper outreach research.
- ✅ Cache-first cost control - choose
cached,fallback, orfreshbased on how much live crawling you want. - ✅ Deeper launch research on demand - switch on comments, reviews, and launch history only for the runs that need them.
🏆 Benefits
- 🎯 Build startup lead lists from Product Hunt without opening each launch by hand.
- 🗓️ Pull one leaderboard, category, or topic page at a time so you can check the results before you scale up.
- 🌐 Add website enrichment only when you want outreach-ready context in the same row.
- 📊 Keep rank, follower, review, and launch-history context attached to each product for research and prioritization.
- 💸 Start with cache-first pulls, then use live recrawls only for the pages worth deeper analysis.
🚀 Quick start
- Open the Input tab and leave every target section empty to run today's California-time leaderboard.
- Set
Maximum items across the whole runto5or25for a small first run. - Keep
Scrape modeonFallback (use saved rows, then fetch missing ones)for the default balance of cost and freshness. - Leave
Include promoted listings?,Scrape comments?,Scrape reviews?,Scrape built-with tools?,Scrape past launches?, andScrape website enrichment?off unless you already need those extra fields. - Run the actor and review the dataset in the finished run or via the API.
⚙️ Features
- 🗂️ Supports one page type per run: daily, weekly, monthly, and yearly leaderboards, plus category and topic pages.
- 🕒 Defaults to today's Product Hunt daily leaderboard in
America/Los_Angeleswhen every target section is empty. - ♻️
cacheduses saved rows only,fallbackstarts with saved rows and fetches the missing rows now, andfreshfetches every requested row now for this run. - 📣 Includes or excludes promoted listings with one toggle.
- 🧩 Adds reviews, comments, launch history, built-with tools, and website enrichment only when you switch them on.
- 📦 Emits one Product Hunt-specific row per product, with missing scalars set to
nulland missing lists set to[].
📊 Output
Every emitted row keeps the same Product Hunt-specific fields, with missing scalars set to null and missing lists set to []. Object arrays show one real item followed by "..." when more items were present. website.rawText is excerpted here only so the README stays readable. See the full Output tab for the complete contract.
Example
This example is from the ai-code-editors category.
{"isPromoted": false,"thumbnailUrl": "https://ph-files.imgix.net/7cdee0cb-3f0f-4def-92c0-7137df568438.png?auto=compress&codec=mozjpeg&cs=strip&auto=format&w=64&h=64&fit=crop&frame=1","name": "Codebuff","url": "https://www.producthunt.com/products/codebuff","tagline": "Better code generation than Cursor, from your CLI","categories": ["AI Coding Agents","Command line tools","AI Code Editors"],"followers": 227,"commentsCount": 52,"reviewsCount": 3,"launchesCount": 1,"dayRank": 7,"weekRank": 38,"monthRank": 183,"yearRank": null,"launchDate": "2024-10-22","description": "Codebuff is a tool for editing codebases via natural language. Just npm install it, point it at your directory, and you're off to the races! Codebuff automatically pulls any files it needs for context, so it has the most accurate data to solve your problems. It also runs terminal commands for you, to speed up your own development. Our users have found that they can build apps in hours that used to take weeks. Some even use it to build in languages they've never used before!","upvotesCount": 270,"links": ["https://codebuff.com/?ref=producthunt"],"xAccountHandle": "@codebuffai","imageUrls": ["https://ph-files.imgix.net/a217b57d-2b5f-4413-a50c-4e928a2edfc5.gif","https://ph-files.imgix.net/2add5932-49fa-48f6-a2ea-cb9bff5966ed.png","https://ph-files.imgix.net/37ee0625-16e5-45fc-af76-fccf3100bdcc.png","https://ph-files.imgix.net/3d3d16c0-8ceb-44b3-ad4b-3f087dcc343e.jpeg"],"tags": ["Software Engineering","AI Coding Agents","Artificial Intelligence"],"team": [{"avatarUrl": "https://ph-avatars.imgix.net/7686611/09ebef1d-d2f0-4037-8bd4-839ac15e363d.jpeg?auto=compress&codec=mozjpeg&cs=strip&auto=format&w=40&h=40&fit=crop&frame=1","type": "Maker","name": "Brandon Chen","username": "brandon_at_manicode","headline": null,"about": null,"followersCount": 1,"links": []},"..."],"builtWith": [{"name": "Claude by Anthropic","url": "https://www.producthunt.com/products/claude","tagline": null,"thumbnailUrl": "https://ph-files.imgix.net/ae49ce7d-30a4-457b-823a-2e1ee8d44dbb.png?auto=compress&codec=mozjpeg&cs=strip&auto=format&w=40&h=40&fit=crop&frame=1"},"..."],"launches": [{"title": "Codebuff","url": "https://www.producthunt.com/products/codebuff/launches/codebuff","tagline": "Better code generation than Cursor, from your CLI","launchDate": "2024-10-22","dayRank": 7,"weekRank": 38,"monthRank": 183,"yearRank": null,"upvotesCount": 270,"commentsCount": 52,"thumbnailUrl": "https://ph-files.imgix.net/a7c2b93c-18fa-48ee-9a9f-1f3664b17039.png"}],"comments": [{"user": {"isMaker": false,"username": "dhunten","name": "Derek Hunten","avatarUrl": "https://ph-avatars.imgix.net/128459/original.jpeg","headline": null,"links": [],"followersCount": null},"text": "i personally was not a fan of the usability of Cursor, so plan on checking this out. is it good when starting from scratch, too?","upvotesCount": 2,"timeAgo": null},"..."],"reviews": [{"user": {"username": "dexter_horthy","name": "Dexter Horthy","avatarUrl": "https://ph-avatars.imgix.net/7575784/4562c776-2031-4f71-9de1-a99d573b3e2f.jpeg","headline": "hacking on safe + reliable AI Agents","links": [],"followersCount": null,"reviewsCount": 5},"rating": 5,"text": "watching codebuff debug infrastructure problems by running aws cli commands is both terrifying and delightful","viewsCount": 57,"timeAgo": null},"..."],"website": {"url": "https://codebuff.com/?ref=producthunt","title": "Codebuff – AI Coding Assistant for Your Terminal","description": "Code faster with AI using Codebuff. Edit your codebase and run terminal commands via natural language instruction.","emails": [],"rawText": "Docs Pricing GitHub Toggle menu Better agents. Better code. Higher quality output and 100+ seconds faster than Claude Code Get Started npm install -g codebuff EXPLORER 📁 src 📄 index.ts 📁 api 📄 auth.ts 📄 users.ts 📄 projects.ts 📁 utils 📄 helpers.ts 📄 types.ts 📄 constants.ts 📄 validation.ts..."}}
Params
| Field | Type | Description |
|---|---|---|
isPromoted | boolean | true for sponsored Product Hunt placements and false for organic rows. |
name, tagline, description | string | null | Core Product Hunt product copy from the row and product page. |
url | string | null | Product Hunt row URL. This is a product URL or launch URL, never the external website URL. |
thumbnailUrl, imageUrls | string | null, string[] | Primary thumbnail plus any additional Product Hunt gallery images from the current product page metadata that Product Hunt exposes. |
categories, tags | string[] | Product Hunt categories plus the current product page metadata tags that Product Hunt exposes. |
followers, upvotesCount, commentsCount, reviewsCount, launchesCount | number | null | Buyer-visible Product Hunt engagement counts for that row. |
dayRank, weekRank, monthRank, yearRank, launchDate | number | null, string | null | Leaderboard ranks plus the ISO YYYY-MM-DD launch date when available. |
links, xAccountHandle | string[], string | null | External company links from Product Hunt plus the X account handle when available. |
team, builtWith, launches | array | Related maker/team, built-with, and launch-history objects. |
comments, reviews | array | Comment and review objects when those enrichments are enabled and Product Hunt exposes them on the page. |
website | object | Always present with url, title, description, emails, and rawText. |
🛠️ Input
Example
This input produced the output example above.
{"categorySlugs": ["ai-code-editors"],"scrapeMode": "fresh","maxNbItemsToScrape": 20,"shouldIncludePromotedListings": false,"shouldScrapeComments": true,"shouldScrapeReviews": true,"shouldScrapeBuiltWith": true,"shouldScrapeLaunches": true,"shouldScrapeWebsite": true}
Params
| Field | Type | Description | Default / empty behavior |
|---|---|---|---|
maxNbItemsToScrape | integer | Optional cap applied across the whole run, even when the input resolves to multiple Product Hunt pages. | Defaults to 0, which means scrape all available items. The Input tab prefills 25 for a bounded starter run. |
scrapeMode | string | Chooses how Product Hunt cache and live crawling are combined: cached, fallback, or fresh. | Defaults to fallback. |
shouldIncludePromotedListings | boolean | Includes sponsored Product Hunt placements from the same page. | Defaults to false. |
shouldScrapeComments | boolean | Scrapes Product Hunt comments when available for the selected products. | Defaults to false. |
shouldScrapeReviews | boolean | Scrapes Product Hunt reviews when they exist. | Defaults to false. |
shouldScrapeBuiltWith | boolean | Scrapes the Product Hunt Built With section when it is available. | Defaults to false. |
shouldScrapeLaunches | boolean | Scrapes the product's visible Product Hunt launch history. | Defaults to false. |
shouldScrapeWebsite | boolean | Enriches the external website with title, description, visible text, and emails. | Defaults to false. |
startDate | string | Daily pages only. First day in YYYY-MM-DD format. | Leave empty unless you want the daily target section. If every target field is empty, the actor defaults to today's California-time daily leaderboard. |
endDate | string | Daily pages only. Optional inclusive end date in YYYY-MM-DD format. | Empty means one day. |
startWeek | string | Weekly pages only. First week in YYYY-WW format. | Leave empty unless you want the weekly target section. |
endWeek | string | Weekly pages only. Optional inclusive end week in YYYY-WW format. | Empty means one week. |
startMonth | string | Monthly pages only. First month in YYYY-MM format. | Leave empty unless you want the monthly target section. |
endMonth | string | Monthly pages only. Optional inclusive end month in YYYY-MM format. | Empty means one month. |
startYear | integer | Yearly pages only. First year to scrape. | Leave empty unless you want the yearly target section. |
endYear | integer | Yearly pages only. Optional inclusive end year. | Empty means one year. |
categorySlugs | string[] | Category pages only. Add one Product Hunt category slug per item, such as ai-code-editors. | Leave empty unless you want the category target section. Category runs do not support date ranges. |
topicSlugs | string[] | Topic pages only. Add one Product Hunt topic slug per item, such as developer-tools or open-source. | Leave empty unless you want the topic target section. opensource is normalized to open-source. |
Important
- Pick one page type per run.
Start date,Start week,Start month, andStart yearopen date-based leaderboard pages.Category slugsandTopic slugsopen slug pages. Leave every target section empty for today's California-time daily leaderboard, or fill only the fields for one page type. - The same-day daily cache usually covers Product Hunt basics only. If you also want comments, reviews, launch history, or website enrichment,
fallbackorfreshis usually the better fit. cacheduses saved rows only.fallbackstarts with saved rows and then fetches the missing rows now.freshskips saved Product Hunt rows and fetches every requested row now for this run.- If you ask for comments, reviews, built-with tools, launch history, or website enrichment, older cached rows may not be enough. Use
fallbackorfreshwhen you need those extra fields. - Example daily run:
Start date: "2026-03-20",Maximum items across the whole run: 3,Scrape mode: "fresh", and all five enrichment toggles set totrueis a good way to inspect one past leaderboard day in depth. - Example category run:
Category slugs: ["ai-code-editors"],Maximum items across the whole run: 20,Scrape mode: "fresh", and all five enrichment toggles set totrueproduced the realCodebuffrow used in this README. - Example first daily run: leave every target section empty, set
Maximum items across the whole runto5, keepScrape modeonfallback, and leave the enrichments off. - Pricing depends on whether a row came from cache, a fresh Product Hunt crawl, and whether website email enrichment found any public email addresses. See the Pricing tab for current rates.
🔍 Error handling
- If you mix fields from more than one page type, or a date/week/month/year value is invalid, the actor stops before crawl with a clear user-facing error.
- In
cachedmode, pages with no reusable Product Hunt cache finish cleanly with a warning that tells you to usefallbackorfreshif you want live rows. - If Product Hunt blocks the initial page after all retries, the run log explains that access was blocked and advises restarting the actor.
- If Product Hunt does not return the complete ranked leaderboard data for a daily, weekly, monthly, or yearly page, the actor stops that page with a clear retry message instead of guessing from partial page content.
- Once a product is discovered, product-page extraction, comments, reviews, launches, and website enrichment are best-effort. The actor still emits the row with missing fields set to
nullor[]. - When a request fails, the actor saves a diagnostic screenshot and error message on a best-effort basis for later inspection.
🆘 Support
For issues, questions, or feature requests, file a ticket and I'll fix or implement it in less than 24h 🫡
🔗 Other actors
- Website Emails Scraper - turn company sites into one row per unique public email.
- Uneed Scraper - find fresh startup launches from Uneed with optional website enrichment.
- Tiny Startups Scraper - pull startup rows from Tiny Startups for prospecting and research.
- TinySeed Scraper - collect TinySeed portfolio companies for founder and market research.
- Twitter Scraper - search X for launch chatter, mentions, and social proof around companies you find.
- Reddit Scraper - collect Reddit posts and comments for market research, objections, and audience language.
Made with ❤️ by Maxime Dupré