Product Hunt Daily Products Scraper
Pricing
Pay per usage
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
Pay per usage
Rating
0.0
(0)
Developer
陈俊杰
Maintained by CommunityActor stats
0
Bookmarked
2
Total users
1
Monthly active users
3 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 = new ApifyClient({ 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