Ranked launches for a period
Get the ranked Product Hunt launches for any day, week, month or year, back to 2013. Address the period with a date, or with year plus month, day or week. Promoted entries — Product Hunt places three per twenty in the feed — are dropped from the results, and the number dropped is reported in notes, so a count that differs from the website has an explanation.
/leaderboard Launches https://api.fetchlayer.dev/producthunt/leaderboard Headers
Authorization string required Bearer token — your FetchLayer API key.
Parameters
period string optional daily, weekly, monthly, or yearly. (default: daily)
date string optional YYYY-MM-DD — the day, or any day inside the week, month or year wanted. (default: today)
year number optional Year (2013-2100), instead of date.
month number optional Month 1-12, with year.
day number optional Day of month, with year and month.
week number optional ISO week 1-53, with year.
sortBy string optional DAILY_RANK, WEEKLY_RANK, MONTHLY_RANK, YEARLY_RANK, VOTES, or SCORE.
limit number optional Maximum entries returned (max 500), or -1 for everything available. (default: 30)
pages number optional Pages of results to collect in one request (max 100), or -1 for the maximum allowed. Each page walked counts as one request. (default: 1)
cursor string optional Resume from a previous response's nextCursor.
delayMs number optional Milliseconds to wait between pages (max 30000).
format string optional json or markdown. Markdown returns the same result rendered as text. (default: json)
timeoutMs number optional Per-request time limit in milliseconds (max 600000).
Response Fields
leaderboard
Ranked launches for a period
period string The period the board covers.
year number Year of the board, with month, day and week filled in where they apply.
date string | null YYYY-MM-DD for a daily board, null otherwise.
entries object[] The ranked launches, promoted placements removed.
entries[].rank number | null The launch's rank for this period.
entries[].launch object The launch: slug, name, tagline, thumbnail, upvotes, comment count, launch date, ranks, product slug and topics.
entryCount number Number of entries in this response.
pagesScraped number Pages actually collected. Each page counts as one request against your plan.
pagesRequested number Pages the request asked for.
nextCursor string | null Pass back as cursor to continue, or null when the listing is exhausted.
hasNextPage boolean Whether more results are available beyond this response.
requestedUrl string The Product Hunt page this result corresponds to.
scrapedAt string ISO timestamp the result was collected at.
notes string[] Read this. Caveats about this specific result — a walk that stopped early, an upstream ceiling, or promoted entries that were dropped. An empty array means nothing was held back.
blocked boolean Always false on a successful response.
Request
curl -X POST "https://api.fetchlayer.dev/producthunt/leaderboard" \
-H "Authorization: Bearer ss-your-key" \
-H "Content-Type: application/json" \
-d '{"period":"daily","date":"2026-09-01","limit":20}'Response
{
"period": "daily",
"date": "2026-09-01",
"entryCount": 20,
"notes": [
"Dropped 3 promoted entries from the feed."
],
"entries": [
{
"rank": 1,
"launch": {
"slug": "granola-2-0",
"name": "Granola 2.0",
"upvotes": 1842,
"commentsCount": 214,
"productSlug": "granola"
}
}
]
}