Product Hunt API — Daily & Weekly Leaderboards
Documentation menu
FetchLayer FetchLayer API

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.

POST /leaderboard Launches
https://api.fetchlayer.dev/producthunt/leaderboard
OpenAPI JSON

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"
      }
    }
  ]
}