ProductHunt API endpoint
Returns a Product Hunt category by its `slug`, such as `vibe-coding`: name, description, meta title, last update time, parent category and its sub-categories, hero products, questions with top answers, and related discussions.
/producthunt/category/{slug}Path parameters:
slug: required. Product Hunt category slug. Example: "vibe-coding".| Field | Filled in, of 12 checked | Values in the sample |
|---|---|---|
| id | 12 | |
| name | 12 | “Google” and 11 other values |
| logo_uuid | 12 | |
| is_no_longer_online | 12 | true in 0 of 12 |
| Parameter | Type | Required | Default | Description | Example |
|---|---|---|---|---|---|
| slug (path) | string | Yes | Product Hunt category slug | "vibe-coding" | |
| x-api-key (header) | string | Yes | API key required |
curl -X GET "https://api.crawlora.net/api/v1/producthunt/category/%22vibe-coding%22" \ -H "x-api-key: $CRAWLORA_API_KEY"
{
"code": 200,
"msg": "OK",
"data": {
"id": "1585",
"name": "Vibe Coding Tools",
"description": "Vibe Coding Tools bundle AI-first editors, app builders, proxies, and Python/web stacks to speed building...",
"slug": "vibe-coding",
"path": "/categories/vibe-coding",
"last_updated_at": "2026-04-27T23:10:55-07:00",
"reviews_count": 1650,
"meta_title": "The best vibe coding tools in 2026",
"hero_products": [
{
"id": "597151",
"name": "Cursor",
"logo_uuid": "d2edfb12-0064-4ea2-af46-12b43bbb2842.png",
"is_no_longer_online": false
}
],
"hero_products_count": 79,
"parent": {
"id": "72",
"name": "Engineering & Development",
"path": "/categories/engineering-development"
},
"recent_summary": {
"summary": "Recent launches cluster around fast app creation, agent orchestration, and workflow glue...",
"products": [
{
"id": "566141",
"slug": "lovable",
"name": "Lovable",
"tagline": "The world's first AI Fullstack Engineer",
"reviews_rating": 4.67,
"reviews_count": 178
}
]
},
"recent_launches_count": 79
}
}Request schema
No body schema
Response schema
#/definitions/producthunt.categoryResponseDoc
| Field | Type | Required | Enum | Bounds | Example | Description |
|---|---|---|---|---|---|---|
| code | integer | No | 200 | |||
| data | producthunt.ProductCategoryPage | No | ||||
| data.description | string | No | Description of the category. | |||
| data.discussions | array | No | Community discussions related to the category. | |||
| data.discussions[].comments_count | integer | No | Number of comments on the discussion. | |||
| data.discussions[].created_at | string | No | ISO 8601 timestamp of when the discussion was created. | |||
| data.discussions[].description_preview | string | No | Short preview of the discussion's opening text. | |||
| data.discussions[].has_voted | boolean | No | Whether the viewer has upvoted the discussion. | |||
| data.discussions[].id | string | No | Product Hunt ID of the discussion. | |||
| data.discussions[].path | string | No | Product Hunt path of the discussion. | |||
| data.discussions[].pinned | boolean | No | Whether the discussion is pinned. | |||
| data.discussions[].primary_forum | object | No | Main forum the discussion belongs to. | |||
| data.discussions[].primary_forum.id | string | No | Product Hunt id of the discussion forum. | |||
| data.discussions[].primary_forum.slug | string | No | URL slug of the discussion forum. | |||
| data.discussions[].primary_forum.subject_id | string | No | Product Hunt id of the product the forum belongs to. | |||
| data.discussions[].primary_forum.subject_name | string | No | Name of the product the forum belongs to. | |||
| data.discussions[].slug | string | No | URL slug of the discussion. | |||
| data.discussions[].title | string | No | Title of the discussion. | |||
| data.discussions[].user | object | No | Member who started the discussion. | |||
| data.discussions[].user.avatar_url | string | No | URL of the user's profile picture. | |||
| data.discussions[].user.id | string | No | Product Hunt id of the user who started the discussion. | |||
| data.discussions[].user.name | string | No | Display name of the user. | |||
| data.discussions[].user.username | string | No | Product Hunt username of the user. | |||
| data.discussions[].votes_count | integer | No | Number of upvotes on the discussion. | |||
| data.discussions_has_next_page | boolean | No | Whether more discussions exist beyond those returned. | |||
| data.expandable_html | string | No | HTML of the category's expandable description section. Omitted when the category has none. | |||
| data.hero_products | array | No | Featured products shown at the top of the category page. | |||
| data.hero_products[].id | string | No | Product Hunt id of the product. | |||
| data.hero_products[].is_no_longer_online | boolean | No | Whether Product Hunt marks the product as no longer online. | |||
| data.hero_products[].logo_uuid | string | No | Identifier of the product's logo image file. | |||
| data.hero_products[].name | string | No | Name of the product as shown on Product Hunt. | |||
| data.hero_products_count | integer | No | Total number of featured products in the category. | |||
| data.id | string | No | Product Hunt id of the category. | |||
| data.last_updated_at | string | No | Time the category page was last updated, in ISO 8601 with a UTC offset. | |||
| data.meta_title | string | No | Page title Product Hunt uses for the category. | |||
| data.name | string | No | Name of the category as shown on Product Hunt. | |||
| data.parent | object | No | Parent category, with its other sub-categories. | |||
| data.parent.id | string | No | Product Hunt id of the parent category. | |||
| data.parent.name | string | No | Name of the parent category. | |||
| data.parent.path | string | No | Path of the parent category page on Product Hunt. | |||
| data.parent.sub_categories | array | No | Sub-categories of the parent category, including this one. | |||
| data.parent.sub_categories[].id | string | No | Product Hunt id of the category. | |||
| data.parent.sub_categories[].name | string | No | Name of the category as shown on Product Hunt. | |||
| data.parent.sub_categories[].path | string | No | Path of the category page on Product Hunt. | |||
| data.parent.sub_categories[].slug | string | No | URL slug of the category. | |||
| data.path | string | No | /categories/vibe-coding | Path of the category page on Product Hunt. | ||
| data.questions | array | No | Questions asked about the category, each with its top answer. | |||
| data.questions[].body | object | No | Text of the question. | |||
| data.questions[].body.markdown | string | No | Text in Markdown format. | |||
| data.questions[].body.text | string | No | Same text as plain text. | |||
| data.questions[].id | string | No | Product Hunt id of the question. | |||
| data.questions[].top_answer | object | No | Highest-ranked answer to the question. | |||
| data.questions[].top_answer.body | object | No | Text of the answer. | |||
| data.questions[].top_answer.body.markdown | string | No | Text in Markdown format. | |||
| data.questions[].top_answer.body.text | string | No | Same text as plain text. | |||
| data.questions[].top_answer.id | string | No | Product Hunt id of the answer. | |||
| data.questions[].top_answer.sources | array | No | Product Hunt items the answer is based on. | |||
| data.questions[].top_answer.sources[].badges | array | No | Badges shown next to the source. | |||
| data.questions[].top_answer.sources[].id | string | No | Product Hunt id of the source item. | |||
| data.questions[].top_answer.sources[].path | string | No | Path of the source item on Product Hunt. | |||
| data.questions[].top_answer.sources[].subject_id | string | No | Product Hunt id of the item the source is attached to. | |||
| data.questions[].top_answer.sources[].type | string | No | Kind of Product Hunt item the source is, for example `Comment`. | |||
| data.questions[].top_answer.sources[].user | object | No | User who wrote the source item. | |||
| data.questions[].top_answer.sources[].user.avatar_url | string | No | URL of the user's profile picture. | |||
| data.questions[].top_answer.sources[].user.id | string | No | Product Hunt id of the user. | |||
| data.questions[].top_answer.sources[].user.name | string | No | Display name of the user. | |||
| data.questions[].top_answer.sources[].user.username | string | No | Product Hunt username of the user. | |||
| data.questions[].top_answer.sources[].visible_at | string | No | Time the source item became visible, as Product Hunt returns it. | |||
| data.raw_relevant_reviews | array | No | Reviews Product Hunt shows as relevant to the category, as Product Hunt returns them. | |||
| data.recent_launches_count | integer | No | Number of recent launches in the category. | |||
| data.recent_summary | object | No | Summary of recent launches in the category with the products it covers. | |||
| data.recent_summary.products | array | No | Products the summary covers. | |||
| data.recent_summary.products[].badges | array | No | Badges the product has earned on Product Hunt. | |||
| data.recent_summary.products[].badges[].date | string | No | Date the badge was awarded. | |||
| data.recent_summary.products[].badges[].id | string | No | Product Hunt ID of the badge. | |||
| data.recent_summary.products[].badges[].period | string | No | Leaderboard period of the badge, for example `daily` or `weekly`. | |||
| data.recent_summary.products[].badges[].position | integer | No | Leaderboard position the badge was awarded for. | |||
| data.recent_summary.products[].badges[].post_name | string | No | Name of the launch post the badge was awarded for. | |||
| data.recent_summary.products[].badges[].post_slug | string | No | URL slug of the launch post the badge was awarded for. | |||
| data.recent_summary.products[].categories | array | No | Product Hunt categories the product is listed in. | |||
| data.recent_summary.products[].categories[].id | string | No | Product Hunt id of the category. | |||
| data.recent_summary.products[].categories[].name | string | No | Name of the category as shown on Product Hunt. | |||
| data.recent_summary.products[].categories[].path | string | No | Path of the category page on Product Hunt. | |||
| data.recent_summary.products[].categories[].slug | string | No | URL slug of the category. | |||
| data.recent_summary.products[].followers_count | integer | No | Number of Product Hunt users following the product. | |||
| data.recent_summary.products[].id | string | No | Product Hunt id of the product. | |||
| data.recent_summary.products[].is_no_longer_online | boolean | No | Whether Product Hunt marks the product as no longer online. | |||
| data.recent_summary.products[].is_subscribed | boolean | No | Whether the requesting viewer follows the product. | |||
| data.recent_summary.products[].is_top_product | boolean | No | Whether Product Hunt flags the product as a top product. | |||
| data.recent_summary.products[].latest_launch | object | No | Most recent launch of the product. | |||
| data.recent_summary.products[].latest_launch.id | string | No | Product Hunt id of the product's latest launch. | |||
| data.recent_summary.products[].latest_launch.scheduled_at | string | No | Time the latest launch was scheduled for, in ISO 8601 with a UTC offset. | |||
| data.recent_summary.products[].logo_uuid | string | No | Identifier of the product's logo image file. | |||
| data.recent_summary.products[].name | string | No | Name of the product as shown on Product Hunt. | |||
| data.recent_summary.products[].reviews_count | integer | No | Number of reviews the product has. | |||
| data.recent_summary.products[].reviews_rating | number | No | Average review rating of the product. | |||
| data.recent_summary.products[].slug | string | No | URL slug of the product on Product Hunt. | |||
| data.recent_summary.products[].tagline | string | No | Short tagline of the product. | |||
| data.recent_summary.products[].tags | array | No | Tags describing the product. | |||
| data.recent_summary.summary | string | No | Short text summarising what recently launched in the category. | |||
| data.reviews_count | integer | No | Number of reviews across the category's products. | |||
| data.slug | string | No | vibe-coding | URL slug of the category. | ||
| data.sub_categories | array | No | Sub-categories of this category. | |||
| data.sub_categories[].id | string | No | Product Hunt id of the category. | |||
| data.sub_categories[].name | string | No | Name of the category as shown on Product Hunt. | |||
| data.sub_categories[].path | string | No | Path of the category page on Product Hunt. | |||
| data.sub_categories[].slug | string | No | URL slug of the category. | |||
| data.targeted_ad | object | No | Sponsored placement shown on the category page. Omitted when there is none. | |||
| data.targeted_ad.channel_kind | string | No | Placement of the ad, for example `feed`. | |||
| data.targeted_ad.id | string | No | Product Hunt id of the ad. | |||
| data.targeted_ad.large_asset_uuid | string | No | Identifier of the ad's large image asset. | |||
| data.targeted_ad.name | string | No | Name of the advertised product. | |||
| data.targeted_ad.post | object | No | Launch post of the advertised product. | |||
| data.targeted_ad.post.comments_count | integer | No | Number of comments on the launch post. | |||
| data.targeted_ad.post.created_at | string | No | Time the launch post was created, in ISO 8601 with a UTC offset. | |||
| data.targeted_ad.post.disabled_when_scheduled | boolean | No | Whether the post is disabled while its launch is still scheduled. | |||
| data.targeted_ad.post.embargo_preview_at | string | No | Time the launch post becomes visible as an embargo preview. Omitted when not set. | |||
| data.targeted_ad.post.featured_at | string | No | Time the launch post was featured, in ISO 8601 with a UTC offset. | |||
| data.targeted_ad.post.featured_comment | object | No | Comment featured on the launch post. | |||
| data.targeted_ad.post.featured_comment.body_text | string | No | Plain-text body of the comment. | |||
| data.targeted_ad.post.featured_comment.id | string | No | Product Hunt id of the comment. | |||
| data.targeted_ad.post.featured_comment.is_pinned | boolean | No | Whether the comment is pinned on the launch. | |||
| data.targeted_ad.post.featured_comment.path | string | No | Path of the comment on Product Hunt. | |||
| data.targeted_ad.post.featured_comment.subject_id | string | No | Product Hunt id of the launch post the comment is on. | |||
| data.targeted_ad.post.featured_comment.user | object | No | Author of the comment. | |||
| data.targeted_ad.post.featured_comment.user.avatar_url | string | No | URL of the user's profile picture. | |||
| data.targeted_ad.post.featured_comment.user.id | string | No | Product Hunt id of the user. | |||
| data.targeted_ad.post.featured_comment.user.name | string | No | Display name of the user. | |||
| data.targeted_ad.post.featured_comment.user.username | string | No | Product Hunt username of the user. | |||
| data.targeted_ad.post.has_voted | boolean | No | Whether the requesting viewer has upvoted the launch post. | |||
| data.targeted_ad.post.hide_votes_count | boolean | No | Whether Product Hunt hides the vote count for this post. | |||
| data.targeted_ad.post.id | string | No | Product Hunt id of the launch post. | |||
| data.targeted_ad.post.latest_score | integer | No | Latest vote score of the launch post. | |||
| data.targeted_ad.post.launch_day_score | integer | No | Vote score of the launch post on its launch day. | |||
| data.targeted_ad.post.name | string | No | Name of the launch post. | |||
| data.targeted_ad.post.product_id | string | No | Product Hunt id of the product the post belongs to. | |||
| data.targeted_ad.post.product_slug | string | No | URL slug of the product the post belongs to. | |||
| data.targeted_ad.post.product_subscribed | boolean | No | Whether the requesting viewer follows the product. | |||
| data.targeted_ad.post.randomization_status | object | No | Whether the post currently has randomized ordering in listings, and when that changes. | |||
| data.targeted_ad.post.randomization_status.active | boolean | No | Whether randomized ordering is currently active for the post. | |||
| data.targeted_ad.post.randomization_status.next_transition_at | string | No | Time the randomization status next changes. Omitted when none is scheduled. | |||
| data.targeted_ad.post.randomization_status.random_day | boolean | No | Whether the post's launch day uses randomized ordering. | |||
| data.targeted_ad.post.slug | string | No | URL slug of the launch post. | |||
| data.targeted_ad.post.topics | array | No | Topics the launch post is filed under. | |||
| data.targeted_ad.post.topics[].id | string | No | Product Hunt id of the topic. | |||
| data.targeted_ad.post.topics[].name | string | No | Name of the topic as shown on Product Hunt. | |||
| data.targeted_ad.post.topics[].slug | string | No | URL slug of the topic. | |||
| data.targeted_ad.post.updated_at | string | No | Time the launch post was last updated, in ISO 8601 with a UTC offset. | |||
| data.targeted_ad.small_asset_uuid | string | No | Identifier of the ad's small image asset. | |||
| data.targeted_ad.subject | string | No | Kind of Product Hunt item the ad is placed on, for example `Channel`. | |||
| data.targeted_ad.tagline | string | No | Short tagline shown on the ad. | |||
| data.targeted_ad.thumbnail_uuid | string | No | Identifier of the ad's thumbnail image file. | |||
| data.targeted_ad.url | string | No | Path of the ad's link on Product Hunt. | |||
| data.targeted_ad.variation_id | string | No | Identifier of the ad variation shown. | |||
| msg | string | No | OK |
| Status | Description | Schema |
|---|---|---|
| 400 | Missing or invalid parameters | #/definitions/app.Response |
| 404 | Category 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/category/%22vibe-coding%22" \
-H "x-api-key: $CRAWLORA_API_KEY"