Use cases / Product Hunt API, Website Contacts API
Product Hunt launch tracking
Who
Who runs this, and what for
| Team | What they decide with it |
|---|---|
| Investors and scouts | Which new companies in their sectors got traction on launch day. |
| Product and competitive teams | Who launched in their category this week, and what users said in the comments. |
| Sales and partnerships | Which new companies to contact, and who the makers are. |
| Newsletters and communities | What to feature from the day's launches in their topic. |
Pipeline
The calls, step by step
01Read the leaderboard
Without a date, the launches endpoint returns today's homepage on Product Hunt's Pacific-time calendar, which is still changing. Pass yesterday's date with period=daily for final ranks, or period=weekly or monthly for the ISO week or month. Each launch has its daily, weekly, and monthly rank, votes, comment count, and topics. q and topic filter that one page in memory; they are not a search across Product Hunt.
GET /v1/launches?date=2026-09-23&period=daily · results.0
{ "rank": 1, "daily_rank": 1, "weekly_rank": 4, "monthly_rank": 20, "id": "1256789", "name": "Solid", "tagline": "Agents with their own computers, accounts, and budgets.", "slug": "solid-9", "url": "https://www.producthunt.com/posts/solid-9", "product": { "id": "1105902", "slug": "solid-3", "url": "https://www.producthunt.com/products/solid-3" }, "votes": 456, "launch_day_votes": 435, "comments": 46, "topics": [ { "name": "Productivity", "slug": "productivity" }, { "name": "Artificial Intelligence", "slug": "artificial-intelligence" } ], "launched_at": "2026-09-23T00:01:00-07:00" }Recorded response. Live values differ. 02Open each launch you keep
Pass the launch's /posts/ URL to the product endpoint. It returns the makers, the hunter, the product's website, media, alternatives Product Hunt links, awards, and, on that launch page, the comments with replies. A bare product slug returns the product page, which has no comments.
GET /v1/launches/product?slug=https%3A%2F%2Fwww.producthunt.com%2Fposts%2Fsolid-9 · product.makers
[ { "name": "Riley S", "username": "riley_ss", "headline": "A Hacker", "url": "https://www.producthunt.com/@riley_ss", "avatar": null }, { "name": "Trevor Keith", "username": "tkeith", "headline": "Founder of Solid", "url": "https://www.producthunt.com/@tkeith", "avatar": null } ]Recorded response. Live values differ. 03Enrich the company behind it
The website field is the company's own domain. Send it to the Website Contacts API for the emails, phones, and social profiles the company publishes, which Product Hunt profiles rarely include.
GET /v1/launches/product?slug=https%3A%2F%2Fwww.producthunt.com%2Fposts%2Fsolid-9 · product.website
"https://solid.tech"Recorded response. Live values differ.
Code
A script to start from
launch_digest.py
# Morning digest of yesterday's Product Hunt launches in chosen topics,
# with each product's makers and website.
import datetime, os, requests
from zoneinfo import ZoneInfo
API = "https://api.clair.im"
HEADERS = {"Authorization": f"Bearer {os.environ['CLAIR_API_KEY']}"}
TOPICS = {"artificial-intelligence", "developer-tools"}
TOP = 10
def get(path, **params):
r = requests.get(f"{API}{path}", headers=HEADERS, timeout=60, params=params)
r.raise_for_status()
return r.json()
# Product Hunt days run on Pacific time. Yesterday's board has final ranks;
# today's is still moving.
now = datetime.datetime.now(ZoneInfo("America/Los_Angeles"))
yesterday = (now - datetime.timedelta(days=1)).date().isoformat()
board = get("/v1/launches", date=yesterday, period="daily")
picked = [launch for launch in board["results"]
if TOPICS & {t["slug"] for t in launch["topics"]}][:TOP]
for launch in picked:
# The /posts/ URL opens that launch, with its hunter, makers, and comments.
product = get("/v1/launches/product", slug=launch["url"])["product"]
makers = ", ".join(m["name"] for m in product["makers"]) or "not listed"
print(f"#{launch['daily_rank']} {launch['name']}: {launch['tagline']}")
print(f" {launch['votes']} votes, {product['website']}, makers: {makers}")
Set CLAIR_API_KEY to a key subscribed to the Product Hunt API and Website Contacts API. Each call is one request against that API's monthly quota.
Cost
What it costs per month
| Schedule | Requests | Plan | Per month | Per 1,000 |
|---|---|---|---|---|
| Daily digest, top 10 in your topics1 leaderboard + 10 launch pages, × 30 days. | 330 | Pay as you go | $1.98 | $6 |
| Daily digest plus contact enrichmentAs above, plus 10 Website Contacts lookups a day. | 630 | Pay as you go + Pay as you go | $8.01 | $12.71 |
| Top 50 launches every day1 leaderboard + 50 launch pages, × 30 days. | 1,530 | Pay as you go | $9.18 | $6 |
| One-year backfill of daily leaderboardsOne call per day of the year, once. Launch pages extra. | 365 | Pay as you go | $2.19 | $6 |
Limits
What to plan for
- Today's board changes all day, until midnight Pacific time. Read the previous day for final ranks and vote counts.
- Weekly and monthly boards can hold more launches than one page returns; has_more says so, and the rest is not fetched.
- Comments come only from a launch's /posts/ page. Product pages list makers from the page's structured data when the full roster is not shown.
- q and topic filter the launches on the fetched board. They do not search Product Hunt's archive.
- Clair does not vote, comment, or log in, and it does not use Product Hunt's own API.
- Keep the Product Hunt link when you show a launch, and do not republish the leaderboard as a feed of your own.
FAQ
Common questions
Is this the Product Hunt API?
No. Product Hunt's own GraphQL API needs an application and has its own terms. Clair reads the public leaderboard and launch pages.
What timezone does date use?
Product Hunt's, which is Pacific time. A launch dated 2026-09-23 went live at 00:01 in Los Angeles.
Can I get the makers' email addresses?
Not from Product Hunt, which does not show them. The company's website often lists contact details, which the Website Contacts API returns.
What does the free tier cover?
200 requests a month per API. The top-10 digest uses 11 a day, so that covers about 18 days, enough to test it before choosing a plan.
Run it on your own products
200 requests a month free on each API, no card. Enough to run the pipeline on a short list before choosing a plan.