Product Hunt – Products, Launches, Makers & Reviews avatar

Product Hunt – Products, Launches, Makers & Reviews

Pricing

from $1.00 / 1,000 results

Go to Apify Store
Product Hunt – Products, Launches, Makers & Reviews

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

Abot API

Maintained by Community

Actor stats

0

Bookmarked

4

Total users

1

Monthly active users

7 days ago

Last modified

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 rowType field 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 resumeFromRunId at 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. maxItems caps the dataset size and maxSearchResultsPerTerm caps 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.

FieldExample
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 / sourceUrlProduct Hunt link to the product page
websiteUrl"https://sample-ai-assistant.example.com"
logoUrlproduct logo image URL
votesCount / commentsCountalways null (Product Hunt reports these per launch, not per product)
followersCount1240
reviewsCount18
averageRating4.6
postsCount3 (times this product has launched on Product Hunt)
media[] / mediaCountproduct gallery screenshot URLs
categories[][{ "name": "AI Coding Agents", "path": "/topics/ai-coding-agents", "slug": "ai-coding-agents" }]
reviews[] / reviewsExtractedembedded review objects, capped by maxReviewsPerProduct (when includeReviews is on)
harvestedEmails[]public contact emails found on websiteUrl (when enrichEmails is on)
searchContextdiscovery metadata: {"sourceType": "product"} only for a pasted product URL, plus discoveryUrl/resultPosition/keyword when the product was found via a listing or search
scrapedAtISO timestamp of the scrape
changeTypeincremental mode only: "NEW", "UPDATED", "UNCHANGED", "REAPPEARED", or "EXPIRED"
changedFields / firstSeenAt / lastSeenAtincremental 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

  1. Pick a mode: keyword (search by term) or url (paste Product Hunt homepage, search, leaderboard, topic, collection, product, or maker profile links).
  2. Turn on the filters and enrichment you need: minimum reviews or followers, requiring a website or social link, contact-email discovery, and review extraction.
  3. Set Max items to control run size and cost, and raise Max search candidates per keyword if strict filters are narrowing results too much.
  4. 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 ApifyClient
client = 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 classified NEW, UPDATED (with changedFields), or UNCHANGED (suppressed and not billed unless emitUnchanged is on). REAPPEARED only ever appears for a product whose stored state was already marked absent by an earlier complete scan that had emitExpired on; it never happens on a first run, and it is never the default outcome for a returning product. EXPIRED rows are synthesized only when emitExpired is on AND the current run reaches the natural end of every tracked source, uncapped by maxItems or maxSearchResultsPerTerm and without resumeFromRunId in use; an interrupted or capped scan cannot tell "gone" apart from "not reached yet", so it leaves the previous state untouched instead. stateKey names 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 as UNCHANGED.

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.

  1. Authorize a connector once under Apify → Settings → Integrations (Notion, Linear, Airtable, or Apify).
  2. Select it in the "Pipe results into your apps" input field. (If the picker is empty, you haven't authorized a connector yet.)
  3. For Notion, also set notionParentPageUrl to 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

ParameterTypeDefaultDescription
modestringkeywordkeyword (generate searches) or url (paste Product Hunt links).
startUrlsarrayno default (prefill: sample Product Hunt URLs)Product Hunt URLs to scrape directly (url mode).
searchTermsarrayno default (prefill: ["ai"])Keywords to search (keyword mode); each expands into product rows.
searchSortstringrelevanceSort applied to generated keyword search URLs: relevance, popular, or newest.
searchCategoriesarray[]Restrict generated keyword searches to one or more listed Product Hunt categories.
searchCategorySlugsarrayno defaultAdvanced: custom Product Hunt category slugs not in the list above.
enrichEmailsbooleantrueCheck each product's own website for public contact emails.
includeReviewsbooleantrueInclude review summaries published on each product's page.
outputReviewsAsRowsbooleanfalseAlso save each extracted review as its own dataset row.
maxReviewsPerProductintegerno 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.
maxItemsinteger20Hard cap on total dataset rows.
maxSearchResultsPerTermintegerno default (falls back to max(maxItems × 5, 20))Total candidate products scanned across all keywords and URLs combined, before filters apply.
minReviewsCountintegerno defaultKeep only products with at least this many Product Hunt reviews.
minFollowersCountintegerno defaultKeep only products with at least this many Product Hunt followers.
websiteRequiredbooleanfalseKeep only products that expose an external website URL.
socialLinkRequiredbooleanfalseKeep only products that expose a social or source-code link.
resumeFromRunIdstringno defaultContinue one interrupted run or dataset without re-collecting or re-billing its rows.
incrementalModebooleanfalseTurn on recurring monitoring: classify products as NEW / UPDATED / UNCHANGED / REAPPEARED / EXPIRED.
stateKeystringno defaultName or share an incremental-mode monitoring campaign.
emitUnchangedbooleanfalseAlso return (and bill) products unchanged since the last incremental run.
emitExpiredbooleanfalseAlso return (and bill) products no longer found, after a complete scan.
proxyobjectno default (prefill: Apify Proxy on)Connection settings.
mcpConnectorsarrayno defaultOptional: send a summary of each record to apps you authorized under Integrations.
notionParentPageUrlstringno defaultNotion connector only: page under which records are created.
maxNotifyListingsinteger50Cap 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.

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...

👉 Browse all abotapi scrapers

💬 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.