Pricing
$1.00 / 1,000 results
Product Hunt Daily Products Scraper
Scrape Product Hunt for daily/top products with votes, reviews, descriptions, and maker information. Perfect for competitive analysis, market research, and founder intelligence.
Pricing
$1.00 / 1,000 results
Rating
0.0
(0)
Developer
Actor stats
0
Bookmarked
2
Total users
0
Monthly active users
25 days ago
Last modified
Categories
Share
Product Hunt Scraper โ Apify Actor
Scrape Product Hunt for daily and top products, including upvotes, comment counts, descriptions, maker information, tags, and more. This actor is perfect for:
- Competitive analysis โ track new product launches in your niche.
- Market research โ discover trending products and categories.
- Founder intelligence โ build lead lists of makers and their projects.
- Content curation โ aggregate Product Hunt data for newsletters or dashboards.
How it works
- The actor sends a standard HTTP GET request to the Product Hunt collection page of your choice (e.g.
https://www.producthunt.com/tech). - Product Hunt is built with Next.js, so the initial page state is serialised into a
<script id="__NEXT_DATA__">tag. - The actor parses this JSON payload to extract products without needing a headless browser โ making it fast and resource-efficient.
- Each product is normalised, filtered (by minimum upvotes), limited, and pushed to the Apify dataset.
Input parameters
| Field | Type | Default | Description |
|---|---|---|---|
date | string | today | The date to scrape (YYYY-MM-DD). Used for reference; Product Hunt often returns currently featured products. |
collection | enum | tech | Which Product Hunt collection to scrape. |
min_votes | int | 0 | Minimum number of upvotes โ products below this threshold are dropped. |
limit | int | 25 | Maximum number of products to return (capped at 100). |
Available collections
techgamespodcastsbooksdeveloper-toolsartificial-intelligenceall(home page / trending)
Example output
Each item in the dataset is a JSON object like this:
{"name":"Not Diamond","tagline":"The AI model router that improves every LLM output","description":"Not Diamond automatically routes each query to the best LLM, saving costs and improving quality.","url":"https://www.producthunt.com/posts/not-diamond","slug":"not-diamond","upvotes":987,"comments_count":42,"maker_name":"Tommy Sun","thumbnail_url":"https://ph-files.imgix.net/...","website_url":"https://notdiamond.ai","tags":["artificial-intelligence","developer-tools","open-source"],"featured_at":"2025-05-26T07:01:00Z","id":"123456"}
Field descriptions
| Field | Type | Description |
|---|---|---|
name | string | Product name |
tagline | string | Short one-line description |
description | string | Full description (often same as tagline) |
url | string | Product Hunt post URL |
slug | string | URL slug |
upvotes | integer | Number of upvotes โฒ |
comments_count | integer | Number of comments |
maker_name | string | Name of the first listed maker |
thumbnail_url | string | Thumbnail image URL |
website_url | string | Product's external website |
tags | array | List of topic/category tags |
featured_at | string | ISO 8601 timestamp when featured |
id | string | Unique Product Hunt ID |
Example usage (Apify client)
Python
from apify_client import ApifyClientclient = ApifyClient("YOUR_API_TOKEN")run_input ={"collection":"tech","min_votes":50,"limit":10,"date":"2025-05-26",}run = client.actor("your-actor-id").call(run_input=run_input)dataset_items = client.dataset(run["defaultDatasetId"]).list_items().itemsfor item in dataset_items:print(f"{item['name']} โ โฒ {item['upvotes']} by {item['maker_name']}")
JavaScript / TypeScript
import{ ApifyClient }from'apify-client';const client =newApifyClient({token:'YOUR_API_TOKEN'});const input ={collection:'developer-tools',min_votes:100,limit:5,};const run =await client.actor('your-actor-id').call(input);const{ items }=await client.dataset(run.defaultDatasetId).listItems();items.forEach(item=>{console.log(`${item.name} โ โฒ ${item.upvotes}`);});
Local development
# 1. Clone the repositorygit clone <repo-url> product-hunt-scrapercd product-hunt-scraper# 2. Create a virtual environmentpython -m venv venvsource venv/bin/activate # or venv\Scripts\activate on Windows# 3. Install dependenciespip install-r requirements.txt# 4. Run the actor locallypython -m src
Note: When running locally without the Apify platform,
Actor.push_data()andActor.get_input()require either the Apify CLI (apify run) or environment variables. For quick tests, you can setAPIFY_LOCAL_EMULATION=trueor use the Apify CLI.
Technical details
- Language: Python 3.14
- HTTP client:
httpx(async) - HTML parsing:
BeautifulSoupis declared as a dependency, but the primary extraction path uses the__NEXT_DATA__JSON payload โ no full DOM parsing needed. - Scraping approach: Static HTTP request with a real browser User-Agent. No headless browser (Puppeteer/Playwright) required.
- Dataset: Each product is pushed individually via
Actor.push_data().
Limitations
- Product Hunt rate-limits aggressive requests. Adding randomised delays between multiple runs is recommended.
- The
__NEXT_DATA__JSON structure may change when Product Hunt updates their frontend. The actor includes fallback logic to find product data by key name, but occasional breakage is possible. - Only publicly visible data on collection pages is extracted. Authentication-gated data (e.g. private follow feeds) is not supported.
License
MIT
