product-hunt-scraper-api
A Product Hunt scraper for Python, built on ScrapingBee's Product Hunt scraper API. It returns the ranked leaderboard as objects with rank, name, slug and URL.
Verified against the live site on 2026-08-25: the homepage returned 70 ranked products and Auto-Mode charged 1 credit for the call.
Install
pip install product-hunt-scraper-api
Today's launches
from product_hunt_scraper_api import ProductHuntScraper
scraper = ProductHuntScraper("YOUR-API-KEY")
for product in scraper.leaderboard()[:10]:
print(product.rank, product.name, product.url)
1 akta.pro https://www.producthunt.com/products/akta-pro
2 Diet Claude https://www.producthunt.com/products/diet-claude
3 Jotform AI Data Assistant https://www.producthunt.com/products/jotform
Key from app.scrapingbee.com, 1,000 credits free.
Why this costs 1 credit and not 25
Product Hunt public listing pages render their product links server-side. That means no headless browser is needed, and the cheapest proxy tier is enough.
Rather than guessing that, the client sends mode=auto. ScrapingBee then tries configurations
from cheapest to most expensive and charges only for the one that returns the page. On the
homepage that settled at 1 credit. Confirm it yourself:
products, charged = scraper.leaderboard_with_cost()
print(len(products), "products for", charged, "credits")
If a page ever hardens, Auto-Mode climbs on its own up to max_cost without a code change. Raise
the ceiling for a stubborn page:
scraper.leaderboard(max_cost=75)
What a Product object holds
Product Hunt uses Tailwind utility classes with no stable card identifier, so the dependable
anchor is the product link, a[href^="/products/"]. Its text carries the rank inline, as
"1. akta.pro". The client splits that apart for you:
| Attribute | Value |
|---|---|
rank |
1, parsed from the link text |
name |
"akta.pro", with the rank prefix stripped |
slug |
"akta-pro" |
url |
absolute https://www.producthunt.com/products/akta-pro |
product.as_dict() returns all four, ready for a dataframe or a JSON column.
Tracking a topic
for product in scraper.topic("developer-tools")[:10]:
print(product.rank, product.name)
Any Product Hunt listing URL works through leaderboard(url=...), so category, topic and
date-archive pages all behave the same way.
Rolling your own parse
When the four fields are not enough, take the HTML and parse it yourself:
html = scraper.page_html("https://www.producthunt.com/products/akta-pro")
render_js=True is available but rarely needed on listing pages, and it raises the floor from
1 credit to 5.
Watching launch day
Product Hunt rankings move all day. A poll every 30 minutes at 1 credit is 48 credits a day, which makes a full launch-day watch effectively free:
import time
seen = {}
for _ in range(12):
for product in scraper.leaderboard():
previous = seen.get(product.slug)
if previous and previous != product.rank:
print(f"{product.name}: #{previous} -> #{product.rank}")
seen[product.slug] = product.rank
time.sleep(1800)
Check the balance first with scraper.usage(), which is free and capped at 6 calls a minute.
Cost
| Call | Credits |
|---|---|
| Leaderboard via Auto-Mode | 1 observed |
| Same page forced to JavaScript rendering | 5 |
| Premium proxy with JavaScript | 25 |
| Failed request (HTTP 500) | 0 |
Tiers at scrapingbee.com/pricing.
Related scrapers
For adjacent launch and startup research the same key reaches Google search, Google News and AI extraction, which is handy when a page changes shape and you would rather describe fields than maintain selectors.
Scope
Public, pre-login pages only. Scraping behind login credentials is prohibited by the ScrapingBee terms. Keep API keys out of AI coding assistants.
MIT licensed. Repository . extraction rules
Download files
Download the file for your platform. If you're not sure which to choose, learn more about installing packages.
Source Distribution
Built Distribution
Filter files by name, interpreter, ABI, and platform.
If you're not sure about the file name format, learn more about wheel file names.
Copy a direct link to the current filters
File details
Details for the file product_hunt_scraper_api-0.1.0.tar.gz.
File metadata
- Download URL: product_hunt_scraper_api-0.1.0.tar.gz
- Upload date:
- Size: 6.7 kB
- Tags: Source
- Uploaded using Trusted Publishing? No
- Uploaded via:
twine/6.2.0 CPython/3.14.3
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
d42304467aa168194f93c592a7207d1ae858bceca41a94c8690173e62c7f5d6c
|
|
| MD5 |
9a9fe6947096692f487a34e6e438bde5
|
|
| BLAKE2b-256 |
985899500d395b7846d976ff4120b5952d563a883c3e6d70fb2e60cbc7465e7d
|
File details
Details for the file product_hunt_scraper_api-0.1.0-py3-none-any.whl.
File metadata
- Download URL: product_hunt_scraper_api-0.1.0-py3-none-any.whl
- Upload date:
- Size: 7.0 kB
- Tags: Python 3
- Uploaded using Trusted Publishing? No
- Uploaded via:
twine/6.2.0 CPython/3.14.3
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
cd98fd5a41d956915b4f251cee566e0258fd51bd7b18374ab9db5ebdc450cdd0
|
|
| MD5 |
3b8e06382462e9bd6980307b62491d8f
|
|
| BLAKE2b-256 |
dbb1907dd090f5492577ef2510fd0ec314b935e87c1556368f7d193bd9946f8d
|