ProductHunt API endpoint
Lists the launch posts of a Product Hunt product, looked up by its slug in `id`. `order` defaults to `DATE`; pass the returned `end_cursor` as `cursor` for the next page. Each launch has its name, tagline, ranks, scores, comment count, badges and dates. An unknown slug returns 404.
/producthunt/product/{id}/launchesid: required. Product Hunt product slug. Example: "openai".cursor: optional. Pagination cursor returned as end_cursor.order: optional. Product Hunt launch order. Default: "DATE".404 when Product Hunt does not return a product for the slug.503 when Product Hunt omits the launches/posts connection or returns a blocked/malformed upstream payload.| Field | Filled in, of 10 checked | Values in the sample |
|---|---|---|
| id | 10 | |
| created_at | 10 | 2026-07-09 to 2026-10-03 |
| slug | 10 | |
| name | 10 | “GPT-6 Sol and and Luna” and 9 other values |
| tagline | 10 | “Near-Astra intelligence for a fifth of the price” and 9 other values |
| shortened_url | 10 | “/r/p/1264892” and 9 other values |
| daily_rank | 10 | 1 to 45, median 5 |
| weekly_rank | 10 | 3 to 434, median 26 |
| monthly_rank | 10 | 11 to 701, median 112 |
| product | 10 | |
| randomization_status | 10 | |
| thumbnail_image_uuid | 10 | |
| product_state | 10 | default in all 10 |
| hide_votes_count | 10 | true in 0 of 10 |
| disabled_when_scheduled | 10 | true in 10 of 10 |
| latest_score | 10 | 6 to 527, median 212 |
| launch_day_score | 10 | 4 to 394, median 199 |
| has_voted | 10 | true in 0 of 10 |
| updated_at | 10 | 2026-09-09 to 2026-10-13 |
| comments_count | 10 | 0 to 20, median 6 |
| redirect_to_product | 9 | |
| featured_at | 9 | 2026-07-09 to 2026-09-27 |
| badges | 5 | median 1 entry |
| Parameter | Type | Required | Default | Description | Example |
|---|---|---|---|---|---|
| id (path) | string | Yes | Product Hunt slug | "openai" | |
| cursor | string | No | Pagination cursor | ||
| order | string | No | Product Hunt launch order | DATE | |
| x-api-key (header) | string | Yes | API key required |
curl -X GET "https://api.crawlora.net/api/v1/producthunt/product/%22openai%22/launches" \ -H "x-api-key: $CRAWLORA_API_KEY"
{
"code": 200,
"msg": "OK",
"data": {
"product_id": "594550",
"slug": "openai",
"name": "OpenAI",
"order": "DATE",
"connection": "posts",
"total_count": 2,
"end_cursor": "cursor-1",
"has_next_page": true,
"items": [
{
"id": "1087490",
"slug": "openai-o3",
"name": "OpenAI o3",
"tagline": "A reasoning model",
"daily_rank": 1,
"comments_count": 12
}
]
}
}Request schema
No body schema
Response schema
#/definitions/producthunt.launchesResponseDoc
| Field | Type | Required | Enum | Bounds | Example | Description |
|---|---|---|---|---|---|---|
| code | integer | No | 200 | |||
| data | producthunt.ProductLaunchesPage | No | ||||
| data.connection | string | No | posts | Kind of list the items come from, for example `posts`. | ||
| data.end_cursor | string | No | Cursor of the last launch on this page. Pass it as `cursor` to get the next page. | |||
| data.has_next_page | boolean | No | Whether another page of launches follows this one. | |||
| data.items | array | No | Launch posts of the product, one per entry. | |||
| data.items[].badges | array | No | Badges the launch has earned, such as leaderboard awards. | |||
| data.items[].badges[].category | string | No | Award category of the badge, for example `Product of the Year`. Omitted for daily and weekly badges. | |||
| data.items[].badges[].date | string | No | Date the badge refers to. | |||
| data.items[].badges[].id | string | No | Product Hunt id of the badge. | |||
| data.items[].badges[].period | string | No | Period the badge covers, for example `daily` or `weekly`. | |||
| data.items[].badges[].position | integer | No | Rank the product placed at for this badge. | |||
| data.items[].badges[].post_id | string | No | Product Hunt id of the launch post the badge was earned on. | |||
| data.items[].badges[].post_name | string | No | Name of the launch post the badge was earned on. | |||
| data.items[].badges[].post_slug | string | No | URL slug of the launch post the badge was earned on. | |||
| data.items[].badges[].year | string | No | Year of the award the badge belongs to. | |||
| data.items[].comments_count | integer | No | Number of comments on the launch. | |||
| data.items[].created_at | string | No | ISO 8601 timestamp of when the launch was created. | |||
| data.items[].daily_rank | integer | No | Rank on the daily leaderboard. `0` when Product Hunt gives no rank. | |||
| data.items[].disabled_when_scheduled | boolean | No | Whether upvoting is disabled while the launch is scheduled. | |||
| data.items[].embargo_preview_at | string | No | ISO 8601 timestamp of the embargo preview, when the launch has one. | |||
| data.items[].featured_at | string | No | ISO 8601 timestamp of when Product Hunt featured the launch. | |||
| data.items[].has_voted | boolean | No | Whether the viewer has upvoted this launch. | |||
| data.items[].hide_votes_count | boolean | No | Whether the maker hides the vote count for this launch. | |||
| data.items[].id | string | No | Product Hunt ID of the launch post. | |||
| data.items[].latest_score | integer | No | Current upvote score of the launch. | |||
| data.items[].launch_day_score | integer | No | Upvote score the launch had on its launch day. | |||
| data.items[].monthly_rank | integer | No | Rank on the monthly leaderboard. `0` when Product Hunt gives no rank. | |||
| data.items[].name | string | No | Name of the launch. | |||
| data.items[].product | object | No | Product the launch belongs to. | |||
| data.items[].product.id | string | No | Product Hunt ID of the product. | |||
| data.items[].product.is_no_longer_online | boolean | No | Whether Product Hunt marks the product as no longer online. | |||
| data.items[].product.is_subscribed | boolean | No | Whether the viewer follows this product. | |||
| data.items[].product.is_top_product | boolean | No | Whether Product Hunt marks this as a top product. | |||
| data.items[].product.logo_uuid | string | No | Identifier of the product logo on Product Hunt's image host. | |||
| data.items[].product.name | string | No | Name of the product. | |||
| data.items[].product.slug | string | No | URL slug of the product. Use it with the product endpoint. | |||
| data.items[].product_state | string | No | Product Hunt's state label for the product, for example `default`. | |||
| data.items[].randomization_status | object | No | Whether and when Product Hunt randomizes where this launch appears. | |||
| data.items[].randomization_status.active | boolean | No | Whether randomization is currently in effect. | |||
| data.items[].randomization_status.next_transition_at | string | No | ISO 8601 timestamp of the next change to the randomization state, when there is one. | |||
| data.items[].randomization_status.random_day | boolean | No | Whether the launch day is randomized. | |||
| data.items[].randomization_status.randomize_order | boolean | No | Whether the order of this launch among others is randomized. | |||
| data.items[].redirect_to_product | object | No | Product the launch redirects to, when it redirects. | |||
| data.items[].redirect_to_product.id | string | No | Product Hunt ID of the product. | |||
| data.items[].redirect_to_product.is_no_longer_online | boolean | No | Whether Product Hunt marks the product as no longer online. | |||
| data.items[].redirect_to_product.is_subscribed | boolean | No | Whether the viewer follows this product. | |||
| data.items[].redirect_to_product.is_top_product | boolean | No | Whether Product Hunt marks this as a top product. | |||
| data.items[].redirect_to_product.logo_uuid | string | No | Identifier of the product logo on Product Hunt's image host. | |||
| data.items[].redirect_to_product.name | string | No | Name of the product. | |||
| data.items[].redirect_to_product.slug | string | No | URL slug of the product. Use it with the product endpoint. | |||
| data.items[].shortened_url | string | No | Short Product Hunt link to the launch. | |||
| data.items[].slug | string | No | URL slug of the launch post. | |||
| data.items[].tagline | string | No | Short tagline of the launch. | |||
| data.items[].thumbnail_image_uuid | string | No | Identifier of the launch thumbnail image on Product Hunt's image host. | |||
| data.items[].updated_at | string | No | ISO 8601 timestamp of the last update to the launch. | |||
| data.items[].weekly_rank | integer | No | Rank on the weekly leaderboard. `0` when Product Hunt gives no rank. | |||
| data.name | string | No | OpenAI | Name of the product. | ||
| data.order | string | No | DATE | Order the launches are sorted in, for example `DATE`. | ||
| data.product_id | string | No | 1191613 | Product Hunt id of the product. | ||
| data.raw_page_info | object | No | Pagination details for this page as Product Hunt returns them. | |||
| data.slug | string | No | openai | URL slug of the product on Product Hunt. | ||
| data.total_count | integer | No | 12 | Total number of launches the product has. | ||
| msg | string | No | OK |
| 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/product/%22openai%22/launches" \
-H "x-api-key: $CRAWLORA_API_KEY"