Product Hunt – Products, Launches, Makers & Reviews
Pricing
from $1.00 / 1,000 results
Product Hunt – Products, Launches, Makers & Reviews
Extract producthunt.com data including products, launches, keyword search results, maker profiles, reviews, categories, media, social links, product websites, and optional public contact emails.
Pricing
from $1.00 / 1,000 results
Rating
0.0
(0)
Developer
Abot API
Maintained by CommunityActor stats
0
Bookmarked
4
Total users
1
Monthly active users
7 days ago
Last modified
Categories
Share
Product Hunt Scraper: Launches, Makers, Reviews & Contact Emails
Product Hunt Scraper turns Product Hunt into structured data you can act on. Pull product launches, maker profiles and reviews by pasting Product Hunt links or searching by keyword, optionally enrich each product with the reviews already on its page and public contact emails found on its own website, then export to JSON, CSV or Excel, or read the results straight through the API.
Why This Scraper?
- Two ways to find products. Pick keyword mode to auto-generate Product Hunt search URLs, or url mode to paste homepage, search, leaderboard, topic, collection, product, or maker profile links directly.
- Three record types, one dataset. Product listings and single product pages, maker profiles, and (optionally) individual reviews all land in the same dataset with a
rowTypefield to tell them apart. - Optional detail enrichment on demand. Turn on public contact-email discovery on each product's own website, and/or pull the reviews already published on its Product Hunt page, and only pay the enrichment surcharge on rows actually returned.
- Record-level filters. Keep only products above a minimum review or follower count, or that expose a website or a social/source-code link, so a run returns only what you need.
- Built for recurring runs. Incremental mode returns only new and changed products on repeat runs against the same search or URL set, and unchanged rows are not billed.
- Resume a big pull. Point
resumeFromRunIdat an interrupted run or dataset and the next run skips everything it already collected, so a large crawl never restarts from zero. - Cost control built in.
maxItemscaps the dataset size andmaxSearchResultsPerTermcaps how many candidates are scanned before filters apply, so a run's cost stays predictable.
Use Cases
- Lead generation and outreach: collect maker names, product websites and public contact emails for tools in a category you sell into.
- Market and competitor research: track which products launch or gain traction in a topic or category over time.
- Content and newsletter curation: pull recent launches, taglines and descriptions to summarize a day's or week's top products.
- Investor and trend scouting: filter by minimum followers or reviews to surface products gaining real traction, not just noise.
- Directory and profile building: collect maker profiles and the full list of products each maker has shipped.
Data You Get
Sample shape: values are illustrative placeholders, not from a live record.
| Field | Example |
|---|---|
rowType | "product" (also "maker", and "review" when outputReviewsAsRows is on) |
id | "product:sample-ai-assistant" |
slug | "sample-ai-assistant" |
name | "Sample AI Assistant" |
tagline | "Ship features while you sleep" |
description | "An AI pair programmer that opens pull requests for you." |
canonicalUrl / sourceUrl | Product Hunt link to the product page |
websiteUrl | "https://sample-ai-assistant.example.com" |
logoUrl | product logo image URL |
votesCount / commentsCount | always null (Product Hunt reports these per launch, not per product) |
followersCount | 1240 |
reviewsCount | 18 |
averageRating | 4.6 |
postsCount | 3 (times this product has launched on Product Hunt) |
media[] / mediaCount | product gallery screenshot URLs |
categories[] | [{ "name": "AI Coding Agents", "path": "/topics/ai-coding-agents", "slug": "ai-coding-agents" }] |
reviews[] / reviewsExtracted | embedded review objects, capped by maxReviewsPerProduct (when includeReviews is on) |
harvestedEmails[] | public contact emails found on websiteUrl (when enrichEmails is on) |
searchContext | discovery metadata: {"sourceType": "product"} only for a pasted product URL, plus discoveryUrl/resultPosition/keyword when the product was found via a listing or search |
scrapedAt | ISO timestamp of the scrape |
changeType | incremental mode only: "NEW", "UPDATED", "UNCHANGED", "REAPPEARED", or "EXPIRED" |
changedFields / firstSeenAt / lastSeenAt | incremental mode only: which fields changed, and when the product was first/last seen |
Maker-profile rows (one per pasted /@username URL) carry username, headline, avatarUrl, productUrls[] and productsCount instead of the product fields above. Review rows, embedded inside a product's reviews[] by default or pushed as their own dataset rows when outputReviewsAsRows is on, carry reviewId, reviewUrl, rating, ratingMax, reviewText, positiveNotes[], negativeNotes[], reviewDate, authorName, authorUrl and authorImage. A product's social and app links, when present, add twitterUrl, githubUrl, linkedinUrl, facebookUrl, instagramUrl, iosUrl and androidUrl alongside websiteUrl.
How to Use
- Pick a mode:
keyword(search by term) orurl(paste Product Hunt homepage, search, leaderboard, topic, collection, product, or maker profile links). - Turn on the filters and enrichment you need: minimum reviews or followers, requiring a website or social link, contact-email discovery, and review extraction.
- Set Max items to control run size and cost, and raise Max search candidates per keyword if strict filters are narrowing results too much.
- Click Start, then download the dataset as JSON, CSV or Excel, or read it through the API.
Keyword search in one category:
{"mode": "keyword","searchTerms": ["ai coding assistant"],"searchCategories": ["ai-coding-agents"],"maxItems": 10}
Leaderboard day, with follower and website filters:
{"mode": "url","startUrls": [{ "url": "https://www.producthunt.com/leaderboard/daily/2025/1/1" }],"minFollowersCount": 50,"websiteRequired": true,"maxItems": 15}
Recurring incremental run with expiry tracking (caps raised so the scan can reach the natural end and the EXPIRED gate can fire):
{"mode": "keyword","searchTerms": ["productivity tools"],"incrementalMode": true,"emitExpired": true,"maxItems": 500,"maxSearchResultsPerTerm": 500}
Paste a product and a maker profile directly, with enrichment on:
{"mode": "url","startUrls": [{ "url": "https://www.producthunt.com/products/sample-ai-assistant" },{ "url": "https://www.producthunt.com/@sample_maker" }],"enrichEmails": true,"includeReviews": true}
Run it from your code
Python:
from apify_client import ApifyClientclient = ApifyClient("<YOUR_APIFY_TOKEN>")run = client.actor("abotapi/product-hunt-launches-scraper").call(run_input={"mode": "keyword", "searchTerms": ["ai"], "maxItems": 10})for item in client.dataset(run["defaultDatasetId"]).iterate_items():print(item["rowType"], item.get("name"))
JavaScript:
import { ApifyClient } from 'apify-client';const client = new ApifyClient({ token: '<YOUR_APIFY_TOKEN>' });const run = await client.actor('abotapi/product-hunt-launches-scraper').call({ mode: 'keyword', searchTerms: ['ai'], maxItems: 10 });const { items } = await client.dataset(run.defaultDatasetId).listItems();
Or connect it to Make, Zapier, n8n, Google Sheets or webhooks from the Integrations tab.
How maxSearchResultsPerTerm and maxItems shape a run
Keyword and listing URLs are expanded into candidate product links first, then each candidate is fetched and run through the record-level filters (minReviewsCount, minFollowersCount, websiteRequired, socialLinkRequired). maxSearchResultsPerTerm bounds how many candidates are scanned before filtering; left empty, the actor scans roughly five candidates per row you asked for (at least 20). maxItems then caps how many rows actually get pushed after filtering and enrichment. If a strict filter combination returns fewer rows than expected, raise maxSearchResultsPerTerm so more candidates get a chance to pass.
Resume and recurring updates
Two different features, both optional and off by default:
- Resume (
resumeFromRunId) continues ONE specific interrupted run or dataset: paste its run or dataset id and this run skips every row already collected there, so you don't pay twice. - Incremental mode (
incrementalMode) is for recurring runs over the SAME search or URL set (e.g. daily). Each tracked product is classifiedNEW,UPDATED(withchangedFields), orUNCHANGED(suppressed and not billed unlessemitUnchangedis on).REAPPEAREDonly ever appears for a product whose stored state was already marked absent by an earlier complete scan that hademitExpiredon; it never happens on a first run, and it is never the default outcome for a returning product.EXPIREDrows are synthesized only whenemitExpiredis on AND the current run reaches the natural end of every tracked source, uncapped bymaxItemsormaxSearchResultsPerTermand withoutresumeFromRunIdin use; an interrupted or capped scan cannot tell "gone" apart from "not reached yet", so it leaves the previous state untouched instead.stateKeynames or shares a monitoring campaign; left empty, the actor derives one automatically from the search/URL set and the filter/enrichment settings, so differently configured runs never mix state. Only product rows are classified. Maker rows are never suppressed; review rows are returned only alongside their parent product, so a review's rows are hidden whenever the parent product is suppressed asUNCHANGED.
Send results into your apps (MCP connectors)
Optionally pipe the scraped results into the apps you already use, via Model Context Protocol (MCP) connectors. This is an extra delivery step after the scrape: the Apify dataset is never changed.
What gets written to the connector: a condensed, human-readable summary of each record, not the full JSON. Each item becomes one entry with a title and its key fields flattened to plain text. The complete record always stays in the Apify dataset.
- Authorize a connector once under Apify → Settings → Integrations (Notion, Linear, Airtable, or Apify).
- Select it in the "Pipe results into your apps" input field. (If the picker is empty, you haven't authorized a connector yet.)
- For Notion, also set
notionParentPageUrlto the page where items should be created.
The connection is mediated by Apify's MCP proxy, so this actor never sees your third-party credentials. Leave the field empty to skip.
Input Parameters
| Parameter | Type | Default | Description |
|---|---|---|---|
mode | string | keyword | keyword (generate searches) or url (paste Product Hunt links). |
startUrls | array | no default (prefill: sample Product Hunt URLs) | Product Hunt URLs to scrape directly (url mode). |
searchTerms | array | no default (prefill: ["ai"]) | Keywords to search (keyword mode); each expands into product rows. |
searchSort | string | relevance | Sort applied to generated keyword search URLs: relevance, popular, or newest. |
searchCategories | array | [] | Restrict generated keyword searches to one or more listed Product Hunt categories. |
searchCategorySlugs | array | no default | Advanced: custom Product Hunt category slugs not in the list above. |
enrichEmails | boolean | true | Check each product's own website for public contact emails. |
includeReviews | boolean | true | Include review summaries published on each product's page. |
outputReviewsAsRows | boolean | false | Also save each extracted review as its own dataset row. |
maxReviewsPerProduct | integer | no default (falls back to 3 when left empty or 0) | Cap on review rows per product. Turning Include reviews off empties reviews[] but keeps reviewsCount. |
maxItems | integer | 20 | Hard cap on total dataset rows. |
maxSearchResultsPerTerm | integer | no default (falls back to max(maxItems × 5, 20)) | Total candidate products scanned across all keywords and URLs combined, before filters apply. |
minReviewsCount | integer | no default | Keep only products with at least this many Product Hunt reviews. |
minFollowersCount | integer | no default | Keep only products with at least this many Product Hunt followers. |
websiteRequired | boolean | false | Keep only products that expose an external website URL. |
socialLinkRequired | boolean | false | Keep only products that expose a social or source-code link. |
resumeFromRunId | string | no default | Continue one interrupted run or dataset without re-collecting or re-billing its rows. |
incrementalMode | boolean | false | Turn on recurring monitoring: classify products as NEW / UPDATED / UNCHANGED / REAPPEARED / EXPIRED. |
stateKey | string | no default | Name or share an incremental-mode monitoring campaign. |
emitUnchanged | boolean | false | Also return (and bill) products unchanged since the last incremental run. |
emitExpired | boolean | false | Also return (and bill) products no longer found, after a complete scan. |
proxy | object | no default (prefill: Apify Proxy on) | Connection settings. |
mcpConnectors | array | no default | Optional: send a summary of each record to apps you authorized under Integrations. |
notionParentPageUrl | string | no default | Notion connector only: page under which records are created. |
maxNotifyListings | integer | 50 | Cap on items written to each connector per run. |
Output Example
Sample shape: values are illustrative placeholders, not from a live record.
{"rowType": "product","id": "product:sample-ai-assistant","sourceUrl": "https://www.producthunt.com/products/sample-ai-assistant","canonicalUrl": "https://www.producthunt.com/products/sample-ai-assistant","slug": "sample-ai-assistant","name": "Sample AI Assistant","tagline": "Ship features while you sleep","description": "An AI pair programmer that opens pull requests for you.","logoUrl": "https://ph-files.example.com/sample-logo.png","websiteUrl": "https://sample-ai-assistant.example.com","twitterUrl": "https://twitter.com/sampleaiassistant","githubUrl": "https://github.com/sample-org/sample-ai-assistant","votesCount": null,"commentsCount": null,"followersCount": 1240,"reviewsCount": 18,"postsCount": 3,"media": [{ "type": "image", "url": "https://ph-files.example.com/shot-1.png", "alt": "Product screenshot", "width": 1280, "height": 800 }],"mediaCount": 1,"categories": [{ "name": "AI Coding Agents", "path": "/topics/ai-coding-agents", "slug": "ai-coding-agents" }],"reviews": [{"rowType": "review","id": "review:sample-ai-assistant:https://www.producthunt.com/products/sample-ai-assistant#review-1","productSlug": "sample-ai-assistant","productUrl": "https://www.producthunt.com/products/sample-ai-assistant","reviewId": "https://www.producthunt.com/products/sample-ai-assistant#review-1","reviewUrl": "https://www.producthunt.com/products/sample-ai-assistant#review-1","rating": 5,"ratingMax": 5,"reviewText": "Cut our release time in half.","positiveNotes": ["Fast setup", "Great support"],"negativeNotes": [],"reviewDate": "2026-01-14","dateModified": "2026-01-14","authorName": "Jordan Reviewer","authorUrl": "https://www.producthunt.com/@jordan_reviewer","authorImage": "https://ph-avatars.example.com/jordan.png","scrapedAt": "2026-01-20T09:15:00+00:00"}],"reviewsExtracted": 1,"averageRating": 4.6,"searchContext": {"sourceType": "search","discoveryUrl": "https://www.producthunt.com/search?q=ai%20assistant","resultPosition": 3,"keyword": "ai assistant"},"scrapedAt": "2026-01-20T09:15:00+00:00","harvestedEmails": ["hello@sample-ai-assistant.example.com"]}
Plan Requirement
Apify Proxy is optional for light runs and is used automatically unless you turn it off. If Product Hunt rate-limits a run, enable Apify Proxy or switch to the Residential group under Connection; datacenter or free proxy configurations can be less reliable for larger runs.
FAQ
How much does it cost?
You pay per record returned, plus a one-time run-start fee. An optional detail-enrichment charge applies once per product row when email checking or review extraction is switched on (both are on by default); filtered-out rows and rows suppressed as unchanged in incremental mode are never charged for enrichment. The Pricing tab shows the current rates. Use Max items to cap the cost of any run.
Is it legal to scrape Product Hunt?
This actor collects only publicly available Product Hunt pages. You are responsible for how you use the data: follow Product Hunt's terms and the privacy laws that apply to you, especially around maker names and public contact emails, and get legal advice if you plan commercial redistribution.
Can I get only new or changed launches on a schedule?
Yes. Schedule the actor from the Schedules tab and turn on Incremental mode. Repeat runs against the same search or URL set then return only new and updated products; unchanged ones are suppressed and not billed unless you turn on Emit unchanged.
Why are votesCount and commentsCount always null?
Product Hunt's vote and comment counts are tracked per launch, not per product, so there is no reliable product-level number to report. This holds whether or not Incremental mode is on, and it is unrelated to scrapedAt, which is excluded from change detection because it is generated at scrape time rather than read from the page.
Why did my run return an empty dataset instead of failing?
A page that fails to load, or a product page the actor could not read after retries, is logged and skipped rather than failing the whole run: you still get every product that did load. The run stops outright in three cases: an unreadable resumeFromRunId; turning on Incremental mode with resumeFromRunId against a search that already has saved incremental state; or invalid input, such as URL mode with no startUrls, keyword mode with no searchTerms, or an unrecognized mode. Each case gives a clear error message telling you what to change.
Can I use it with AI agents or MCP?
Yes. Call it from any Apify integration or MCP client, and use the connector field to push results into Notion, Linear or Airtable.
🔗 Want more leads data?
Pair this actor with these related scrapers from the same team:
| 📇 BetaList Scraper Scrape BetaList.com startup profiles with founder and contact enrichment. Extract startup... | 🛒 ProductReview.com.au Scraper Scrape ProductReview.com.au products, businesses and customer reviews. Search by... |
| 📇 2GIS From $1/1K. Extract business and place data from 2GIS.com at scale. Get names, addresses... | 🛒 Dealroom Startup & Market Map Scraper Scrape Dealroom.net market maps, company lookup results, live signals, and newly founded... |
| 🛒 Naver Shopping Scraper Scrape Naver Shopping products by Korean or English keyword, or by URL. Returns 190+... | 🛒 Costco AU Scraper Scrape Costco.com.au products with full details and customer reviews. Search by keyword... |
💬 Support & custom scrapers
- 🐞 Found a bug or a missing field? Open a ticket on the Issues tab. We usually reply within hours.
- 🛠️ Need another site, extra fields or a private build? Email abotapi@proton.me or message Telegram @abotapi.
- ⭐ Enjoying it? A quick review on the actor page helps other users find it.