ProductHunt API endpoint
Returns the Product Hunt leaderboard for a `scope` of `daily` (default), `weekly`, `monthly` or `yearly`, positioned with `date` (YYYY-MM-DD) or `year`, `month`, `day` and `week`. Only the first page is served, so a non-empty `cursor` returns an error. `featured` and `order` are accepted but do not change the default view.
/producthunt/leaderboardFetches Product Hunt leaderboard data for daily, weekly, monthly, or yearly scopes. The response contains the first page of results only.
Query parameters:
scope: optional. Leaderboard scope. Default: daily. Allowed values: daily, weekly, monthly, yearly.date: optional. Anchor date in YYYY-MM-DD format. Used to derive missing year/month/day/week values. Example: 2026-01-29.year: optional. Leaderboard year override. Example: 2026.month: optional. Daily/monthly month override. Example: 1.day: optional. Daily day override. Example: 29.week: optional. Weekly ISO week override. Example: 5.featured: optional. Featured products only. Default: true.order: optional. Ranking order override. Defaults to scope rank enum.cursor: optional. Pagination cursor. Currently unavailable — see below.Notable response behavior:
scope, date/year/month/day/week). has_next_page and end_cursor reflect whether Product Hunt has further pages.cursor returns an upstream error. Only the first page is served.featured and order are accepted for compatibility but reflect Product Hunt's default leaderboard view for the requested scope/date.| Field | Filled in, of 20 checked | Values in the sample |
|---|---|---|
| type | 20 | post (17), ad (3) |
| post | 17 | |
| ad | 3 |
| Parameter | Type | Required | Default | Description | Example |
|---|---|---|---|---|---|
| scope | string | No | Leaderboard scope: daily, weekly, monthly, yearly Allowed values: daily, weekly, monthly, yearly. | ||
| date | string | No | Anchor date in YYYY-MM-DD format. Used to derive missing year/month/day/week values. | 2026-01-29 | |
| year | integer | No | Leaderboard year override | 2026 | |
| month | integer | No | Daily/monthly month override | 1 | |
| day | integer | No | Daily day override | 29 | |
| week | integer | No | Weekly ISO week override | 5 | |
| featured | boolean | No | Featured products only | ||
| order | string | No | scope rank enum | Ranking order override. Defaults to scope rank enum. | |
| cursor | string | No | Pagination cursor |
curl -X GET "https://api.crawlora.net/api/v1/producthunt/leaderboard?scope=daily&featured=true" \ -H "x-api-key: $CRAWLORA_API_KEY"
{
"code": 200,
"msg": "OK",
"data": {
"scope": "daily",
"featured": true,
"order": "DAILY_RANK",
"year": 2026,
"month": 4,
"day": 27,
"week": 18,
"connection": "homefeedItems",
"has_next_page": false,
"items": [
{
"type": "post",
"post": {
"id": "1101061",
"name": "Kitty Points Leaderboard",
"slug": "kitty-points-leaderboard",
"tagline": "Find interesting community members and see how you stack up",
"latest_score": 140,
"daily_rank": 3,
"weekly_rank": 9,
"comments_count": 18,
"product": {
"id": "112572",
"slug": "producthunt",
"name": "Product Hunt"
}
}
}
]
}
}Request schema
No body schema
Response schema
#/definitions/producthunt.leaderboardResponseDoc
| Field | Type | Required | Enum | Bounds | Example | Description |
|---|---|---|---|---|---|---|
| code | integer | No | 200 | |||
| data | producthunt.LeaderboardPage | No | ||||
| data.connection | string | No | Name of the Product Hunt feed the items come from. | |||
| data.day | integer | No | 29 | Day of the month of the leaderboard period. Set for daily leaderboards. | ||
| data.end_cursor | string | No | Cursor that points to the end of this page, as Product Hunt returns it. | |||
| data.featured | boolean | No | Whether the leaderboard lists featured launches only. | |||
| data.golden_kitty_years | array | No | Years that have a Golden Kitty Awards hall of fame entry. | |||
| data.has_next_page | boolean | No | Whether Product Hunt has more leaderboard items after this page. | |||
| data.items | array | No | Leaderboard entries in ranked order. Each one is a launch, an ad or an empty ad slot. | |||
| data.items[].ad | object | No | Ad details. Set when `type` is `ad`. | |||
| data.items[].ad.channel_kind | string | No | Placement type of the ad, for example `feed`. | |||
| data.items[].ad.id | string | No | Product Hunt ID of the ad. | |||
| data.items[].ad.large_asset_uuid | string | No | Identifier of the large ad image on Product Hunt's image host. | |||
| data.items[].ad.name | string | No | Name shown on the ad. | |||
| data.items[].ad.post | object | No | Launch post the ad promotes, when it promotes one. | |||
| data.items[].ad.post.comments_count | integer | No | Number of comments on the launch. | |||
| data.items[].ad.post.created_at | string | No | ISO 8601 timestamp of when the launch was created. | |||
| data.items[].ad.post.disabled_when_scheduled | boolean | No | Whether upvoting is disabled while the launch is scheduled. | |||
| data.items[].ad.post.embargo_preview_at | string | No | ISO 8601 timestamp of the embargo preview, when the launch has one. | |||
| data.items[].ad.post.featured_at | string | No | ISO 8601 timestamp of when Product Hunt featured the launch. | |||
| data.items[].ad.post.featured_comment | object | No | Comment Product Hunt features on the launch. | |||
| data.items[].ad.post.featured_comment.body_text | string | No | Plain-text body of the comment. | |||
| data.items[].ad.post.featured_comment.id | string | No | Product Hunt id of the comment. | |||
| data.items[].ad.post.featured_comment.is_pinned | boolean | No | Whether the comment is pinned on the launch. | |||
| data.items[].ad.post.featured_comment.path | string | No | Path of the comment on Product Hunt. | |||
| data.items[].ad.post.featured_comment.subject_id | string | No | Product Hunt id of the launch post the comment is on. | |||
| data.items[].ad.post.featured_comment.user | object | No | Author of the comment. | |||
| data.items[].ad.post.featured_comment.user.avatar_url | string | No | URL of the user's profile picture. | |||
| data.items[].ad.post.featured_comment.user.id | string | No | Product Hunt id of the user. | |||
| data.items[].ad.post.featured_comment.user.name | string | No | Display name of the user. | |||
| data.items[].ad.post.featured_comment.user.username | string | No | Product Hunt username of the user. | |||
| data.items[].ad.post.has_voted | boolean | No | Whether the viewer has upvoted this launch. | |||
| data.items[].ad.post.hide_votes_count | boolean | No | Whether the maker hides the vote count for this launch. | |||
| data.items[].ad.post.id | string | No | Product Hunt ID of the promoted launch post. | |||
| data.items[].ad.post.latest_score | integer | No | Current upvote score of the launch. | |||
| data.items[].ad.post.launch_day_score | integer | No | Upvote score the launch had on its launch day. | |||
| data.items[].ad.post.name | string | No | Name of the promoted launch. | |||
| data.items[].ad.post.product | object | No | Product the launch belongs to. | |||
| data.items[].ad.post.product.id | string | No | Product Hunt ID of the product. | |||
| data.items[].ad.post.product.is_no_longer_online | boolean | No | Whether Product Hunt marks the product as no longer online. | |||
| data.items[].ad.post.product.is_subscribed | boolean | No | Whether the viewer follows this product. | |||
| data.items[].ad.post.product.is_top_product | boolean | No | Whether Product Hunt marks this as a top product. | |||
| data.items[].ad.post.product.logo_uuid | string | No | Identifier of the product logo on Product Hunt's image host. | |||
| data.items[].ad.post.product.name | string | No | Name of the product. | |||
| data.items[].ad.post.product.slug | string | No | URL slug of the product. Use it with the product endpoint. | |||
| data.items[].ad.post.randomization_status | object | No | Whether and when Product Hunt randomizes where this launch appears. | |||
| data.items[].ad.post.randomization_status.active | boolean | No | Whether randomization is currently in effect. | |||
| data.items[].ad.post.randomization_status.next_transition_at | string | No | ISO 8601 timestamp of the next change to the randomization state, when there is one. | |||
| data.items[].ad.post.randomization_status.random_day | boolean | No | Whether the launch day is randomized. | |||
| data.items[].ad.post.randomization_status.randomize_order | boolean | No | Whether the order of this launch among others is randomized. | |||
| data.items[].ad.post.slug | string | No | URL slug of the promoted launch post. | |||
| data.items[].ad.post.topics | array | No | Topics the launch is tagged with. | |||
| data.items[].ad.post.topics[].id | string | No | Product Hunt ID of the topic. | |||
| data.items[].ad.post.topics[].name | string | No | Display name of the topic. | |||
| data.items[].ad.post.topics[].slug | string | No | URL slug of the topic. | |||
| data.items[].ad.post.updated_at | string | No | ISO 8601 timestamp of the last update to the launch. | |||
| data.items[].ad.small_asset_uuid | string | No | Identifier of the small ad image on Product Hunt's image host. | |||
| data.items[].ad.subject | string | No | Kind of ad entry as Product Hunt labels it, for example `Channel`. | |||
| data.items[].ad.tagline | string | No | Short tagline shown on the ad. | |||
| data.items[].ad.thumbnail_uuid | string | No | Identifier of the ad thumbnail image on Product Hunt's image host. | |||
| data.items[].ad.url | string | No | Link the ad points to. | |||
| data.items[].ad.variation_id | string | No | Identifier of the ad variation shown. | |||
| data.items[].ghost_ad | object | No | Empty ad slot details. Set when `type` is `ghost_ad`. | |||
| data.items[].ghost_ad.id | string | No | Product Hunt ID of the empty ad slot. | |||
| data.items[].ghost_ad.subject | string | No | Kind of entry as Product Hunt labels it. Always `Ghost`. | |||
| data.items[].post | object | No | Launch details. Set when `type` is `post`. | |||
| data.items[].post.comments_count | integer | No | Number of comments on the launch. | |||
| data.items[].post.created_at | string | No | ISO 8601 timestamp of when the launch was created. | |||
| data.items[].post.daily_rank | integer | No | Rank on the daily leaderboard. `0` when Product Hunt gives no rank. | |||
| data.items[].post.disabled_when_scheduled | boolean | No | Whether upvoting is disabled while the launch is scheduled. | |||
| data.items[].post.embargo_preview_at | string | No | ISO 8601 timestamp of the embargo preview, when the launch has one. | |||
| data.items[].post.featured_at | string | No | ISO 8601 timestamp of when Product Hunt featured the launch. | |||
| data.items[].post.friend_voters_count | integer | No | Number of the viewer's friends who upvoted the launch. | |||
| data.items[].post.has_voted | boolean | No | Whether the viewer has upvoted this launch. | |||
| data.items[].post.hide_votes_count | boolean | No | Whether the maker hides the vote count for this launch. | |||
| data.items[].post.id | string | No | Product Hunt ID of the launch post. | |||
| data.items[].post.is_subscribed | boolean | No | Whether the viewer is subscribed to this launch. | |||
| data.items[].post.latest_score | integer | No | Current upvote score of the launch. | |||
| data.items[].post.launch_day_score | integer | No | Upvote score the launch had on its launch day. | |||
| data.items[].post.monthly_rank | integer | No | Rank on the monthly leaderboard. `0` when Product Hunt gives no rank. | |||
| data.items[].post.name | string | No | Name of the launch as shown on the leaderboard. | |||
| data.items[].post.product | object | No | Product the launch belongs to. | |||
| data.items[].post.product.id | string | No | Product Hunt ID of the product. | |||
| data.items[].post.product.is_no_longer_online | boolean | No | Whether Product Hunt marks the product as no longer online. | |||
| data.items[].post.product.is_subscribed | boolean | No | Whether the viewer follows this product. | |||
| data.items[].post.product.is_top_product | boolean | No | Whether Product Hunt marks this as a top product. | |||
| data.items[].post.product.logo_uuid | string | No | Identifier of the product logo on Product Hunt's image host. | |||
| data.items[].post.product.name | string | No | Name of the product. | |||
| data.items[].post.product.slug | string | No | URL slug of the product. Use it with the product endpoint. | |||
| data.items[].post.product_state | string | No | Product Hunt's state label for the product, for example `default`. | |||
| data.items[].post.randomization_status | object | No | Whether and when Product Hunt randomizes where this launch appears. | |||
| data.items[].post.randomization_status.active | boolean | No | Whether randomization is currently in effect. | |||
| data.items[].post.randomization_status.next_transition_at | string | No | ISO 8601 timestamp of the next change to the randomization state, when there is one. | |||
| data.items[].post.randomization_status.random_day | boolean | No | Whether the launch day is randomized. | |||
| data.items[].post.randomization_status.randomize_order | boolean | No | Whether the order of this launch among others is randomized. | |||
| data.items[].post.scheduled_at | string | No | ISO 8601 timestamp the launch is scheduled for. | |||
| data.items[].post.shortened_url | string | No | Short Product Hunt link to the launch. | |||
| data.items[].post.slug | string | No | URL slug of the launch post. | |||
| data.items[].post.tagline | string | No | Short tagline of the launch. | |||
| data.items[].post.thumbnail_image_uuid | string | No | Identifier of the launch thumbnail image on Product Hunt's image host. | |||
| data.items[].post.topics | array | No | Topics the launch is tagged with. | |||
| data.items[].post.topics[].id | string | No | Product Hunt ID of the topic. | |||
| data.items[].post.topics[].name | string | No | Display name of the topic. | |||
| data.items[].post.topics[].slug | string | No | URL slug of the topic. | |||
| data.items[].post.updated_at | string | No | ISO 8601 timestamp of the last update to the launch. | |||
| data.items[].post.weekly_rank | integer | No | Rank on the weekly leaderboard. `0` when Product Hunt gives no rank. | |||
| data.items[].type | string | No | Kind of entry: `post` for a launch, `ad` for an ad or `ghost_ad` for an empty ad slot. | |||
| data.month | integer | No | 1 | Month number from the requested date, 1 to 12. Only meaningful for daily and monthly leaderboards. | ||
| data.order | string | No | DAILY_RANK | Ranking order the leaderboard uses, for example `DAILY_RANK`. | ||
| data.raw_page_info | object | No | Pagination details for this page as Product Hunt returns them: `endCursor` and `hasNextPage`. | |||
| data.scope | string | No | daily | Leaderboard period: `daily`, `weekly`, `monthly` or `yearly`. | ||
| data.total_count | integer | No | Number of items returned on this page. | |||
| data.week | integer | No | 5 | ISO week number from the requested date. Only meaningful for weekly leaderboards. | ||
| data.year | integer | No | 2026 | Year of the leaderboard period. | ||
| msg | string | No | Request successful |
| Status | Description | Schema |
|---|---|---|
| 400 | Missing or invalid parameters | #/definitions/app.Response |
| 404 | Product not found | #/definitions/app.Response |
| 429 | Rate limit exceeded | #/definitions/app.Response |
| 500 | Internal server error | #/definitions/app.Response |
Use environment variables for secrets and keep Crawlora API keys server-side.
curl -X GET "https://api.crawlora.net/api/v1/producthunt/leaderboard?scope=daily&featured=true" \
-H "x-api-key: $CRAWLORA_API_KEY"