ProductHunt API endpoint
Retrieve Product Hunt category details
Returns the category page payload for a Product Hunt category slug.
GETapiKey2 credits/requestproducthunt.categoryResponseDoc
/producthunt/category/{slug}Parameters
| Name | In | Type | Required | Enum | Example | Description |
|---|---|---|---|---|---|---|
| slug | path | string | Yes | "vibe-coding" | Product Hunt category slug | |
| x-api-key | header | string | Yes | API key required |
Authentication
Send your scraping API key in the x-api-key header. Use the console API Keys page to rotate or select the active key.
Billing
Endpoint usage is metered in credits. The plan prices, included credits, limits, and overage rates below match the active backend billing configuration.
- Credit cost
- 2 credits/request
- Charged response
- Successful 2xx responses
| Plan | Price | Included credits | Daily cap | Rate limit | Overage |
|---|---|---|---|---|---|
| Free | $0/mo | 2,000 | 500 daily credits | 5/min | No overage |
| Starter | $9/mo | 20,000 | 5,000 daily credits | 15/min | $0.75/1,000 overage credits when enabled |
| Growth | $29/mo | 100,000 | 25,000 daily credits | 45/min | $0.45/1,000 overage credits when enabled |
| Pro | $79/mo | 400,000 | No daily cap | 120/min | $0.30/1,000 overage credits |
| Business | $199/mo | 1,200,000 | No daily cap | 300/min | $0.20/1,000 overage credits |
| Enterprise | $499/mo | 5,000,000 | No daily cap | 1,000/min | $0.12/1,000 overage credits |
Failure responses
| 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 |
Example response
{
"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 | ||||
| data.discussions | array | No | ||||
| data.discussions[].comments_count | integer | No | ||||
| data.discussions[].created_at | string | No | ||||
| data.discussions[].description_preview | string | No | ||||
| data.discussions[].has_voted | boolean | No | ||||
| data.discussions[].id | string | No | ||||
| data.discussions[].path | string | No | ||||
| data.discussions[].pinned | boolean | No | ||||
| data.discussions[].primary_forum | producthunt.ProductAlternativeDiscussionForum | No | ||||
| data.discussions[].primary_forum.id | string | No | ||||
| data.discussions[].primary_forum.slug | string | No | ||||
| data.discussions[].primary_forum.subject_id | string | No | ||||
| data.discussions[].primary_forum.subject_name | string | No | ||||
| data.discussions[].slug | string | No | ||||
| data.discussions[].title | string | No | ||||
| data.discussions[].user | producthunt.ProductAlternativeDiscussionUser | No | ||||
| data.discussions[].user.avatar_url | string | No | ||||
| data.discussions[].user.id | string | No | ||||
| data.discussions[].user.name | string | No | ||||
| data.discussions[].user.username | string | No | ||||
| data.discussions[].votes_count | integer | No | ||||
| data.discussions_has_next_page | boolean | No | ||||
| data.expandable_html | string | No | ||||
| data.hero_products | array | No | ||||
| data.hero_products[].id | string | No | ||||
| data.hero_products[].is_no_longer_online | boolean | No | ||||
| data.hero_products[].logo_uuid | string | No | ||||
| data.hero_products[].name | string | No | ||||
| data.hero_products_count | integer | No | ||||
| data.id | string | No | ||||
| data.last_updated_at | string | No | ||||
| data.meta_title | string | No | ||||
| data.name | string | No | ||||
| data.parent | producthunt.ProductCategoryParent | No | ||||
| data.parent.id | string | No | ||||
| data.parent.name | string | No | ||||
| data.parent.path | string | No | ||||
| data.parent.sub_categories | array | No | ||||
| data.parent.sub_categories[].id | string | No | ||||
| data.parent.sub_categories[].name | string | No | ||||
| data.parent.sub_categories[].path | string | No | ||||
| data.parent.sub_categories[].slug | string | No | ||||
| data.path | string | No | /categories/vibe-coding | |||
| data.questions | array | No | ||||
| data.questions[].body | producthunt.ProductCategoryMarkdown | No | ||||
| data.questions[].body.markdown | string | No | ||||
| data.questions[].body.text | string | No | ||||
| data.questions[].id | string | No | ||||
| data.questions[].top_answer | producthunt.ProductCategoryAnswer | No | ||||
| data.questions[].top_answer.body | producthunt.ProductCategoryMarkdown | No | ||||
| data.questions[].top_answer.body.markdown | string | No | ||||
| data.questions[].top_answer.body.text | string | No | ||||
| data.questions[].top_answer.id | string | No | ||||
| data.questions[].top_answer.sources | array | No | ||||
| data.questions[].top_answer.sources[].badges | array | No | ||||
| data.questions[].top_answer.sources[].id | string | No | ||||
| data.questions[].top_answer.sources[].path | string | No | ||||
| data.questions[].top_answer.sources[].subject_id | string | No | ||||
| data.questions[].top_answer.sources[].type | string | No | ||||
| data.questions[].top_answer.sources[].user | producthunt.ProductCategoryUser | No | ||||
| data.questions[].top_answer.sources[].user.avatar_url | string | No | ||||
| data.questions[].top_answer.sources[].user.id | string | No | ||||
| data.questions[].top_answer.sources[].user.name | string | No | ||||
| data.questions[].top_answer.sources[].user.username | string | No | ||||
| data.questions[].top_answer.sources[].visible_at | string | No | ||||
| data.raw_relevant_reviews | array | No | ||||
| data.recent_launches_count | integer | No | ||||
| data.recent_summary | producthunt.ProductCategoryRecentSummary | No | ||||
| data.recent_summary.products | array | No | ||||
| data.recent_summary.products[].badges | array | No | ||||
| data.recent_summary.products[].badges[].date | string | No | ||||
| data.recent_summary.products[].badges[].id | string | No | ||||
| data.recent_summary.products[].badges[].period | string | No | ||||
| data.recent_summary.products[].badges[].position | integer | No | ||||
| data.recent_summary.products[].badges[].post_name | string | No | ||||
| data.recent_summary.products[].badges[].post_slug | string | No | ||||
| data.recent_summary.products[].categories | array | No | ||||
| data.recent_summary.products[].categories[].id | string | No | ||||
| data.recent_summary.products[].categories[].name | string | No | ||||
| data.recent_summary.products[].categories[].path | string | No | ||||
| data.recent_summary.products[].categories[].slug | string | No | ||||
| data.recent_summary.products[].followers_count | integer | No | ||||
| data.recent_summary.products[].id | string | No | ||||
| data.recent_summary.products[].is_no_longer_online | boolean | No | ||||
| data.recent_summary.products[].is_subscribed | boolean | No | ||||
| data.recent_summary.products[].is_top_product | boolean | No | ||||
| data.recent_summary.products[].latest_launch | producthunt.ProductCategoryLatestLaunch | No | ||||
| data.recent_summary.products[].latest_launch.id | string | No | ||||
| data.recent_summary.products[].latest_launch.scheduled_at | string | No | ||||
| data.recent_summary.products[].logo_uuid | string | No | ||||
| data.recent_summary.products[].name | string | No | ||||
| data.recent_summary.products[].reviews_count | integer | No | ||||
| data.recent_summary.products[].reviews_rating | number | No | ||||
| data.recent_summary.products[].slug | string | No | ||||
| data.recent_summary.products[].tagline | string | No | ||||
| data.recent_summary.products[].tags | array | No | ||||
| data.recent_summary.summary | string | No | ||||
| data.reviews_count | integer | No | ||||
| data.slug | string | No | vibe-coding | |||
| data.sub_categories | array | No | ||||
| data.sub_categories[].id | string | No | ||||
| data.sub_categories[].name | string | No | ||||
| data.sub_categories[].path | string | No | ||||
| data.sub_categories[].slug | string | No | ||||
| data.targeted_ad | producthunt.ProductCategoryAd | No | ||||
| data.targeted_ad.channel_kind | string | No | ||||
| data.targeted_ad.id | string | No | ||||
| data.targeted_ad.large_asset_uuid | string | No | ||||
| data.targeted_ad.name | string | No | ||||
| data.targeted_ad.post | producthunt.ProductCategoryAdPost | No | ||||
| data.targeted_ad.post.comments_count | integer | No | ||||
| data.targeted_ad.post.created_at | string | No | ||||
| data.targeted_ad.post.disabled_when_scheduled | boolean | No | ||||
| data.targeted_ad.post.embargo_preview_at | string | No | ||||
| data.targeted_ad.post.featured_at | string | No | ||||
| data.targeted_ad.post.featured_comment | producthunt.ProductCategoryAdComment | No | ||||
| data.targeted_ad.post.featured_comment.body_text | string | No | ||||
| data.targeted_ad.post.featured_comment.id | string | No | ||||
| data.targeted_ad.post.featured_comment.is_pinned | boolean | No | ||||
| data.targeted_ad.post.featured_comment.path | string | No | ||||
| data.targeted_ad.post.featured_comment.subject_id | string | No | ||||
| data.targeted_ad.post.featured_comment.user | producthunt.ProductCategoryUser | No | ||||
| data.targeted_ad.post.featured_comment.user.avatar_url | string | No | ||||
| data.targeted_ad.post.featured_comment.user.id | string | No | ||||
| data.targeted_ad.post.featured_comment.user.name | string | No | ||||
| data.targeted_ad.post.featured_comment.user.username | string | No | ||||
| data.targeted_ad.post.has_voted | boolean | No | ||||
| data.targeted_ad.post.hide_votes_count | boolean | No | ||||
| data.targeted_ad.post.id | string | No | ||||
| data.targeted_ad.post.latest_score | integer | No | ||||
| data.targeted_ad.post.launch_day_score | integer | No | ||||
| data.targeted_ad.post.name | string | No | ||||
| data.targeted_ad.post.product_id | string | No | ||||
| data.targeted_ad.post.product_slug | string | No | ||||
| data.targeted_ad.post.product_subscribed | boolean | No | ||||
| data.targeted_ad.post.randomization_status | producthunt.ProductCategoryRandomizationStatus | No | ||||
| data.targeted_ad.post.randomization_status.active | boolean | No | ||||
| data.targeted_ad.post.randomization_status.next_transition_at | string | No | ||||
| data.targeted_ad.post.randomization_status.random_day | boolean | No | ||||
| data.targeted_ad.post.slug | string | No | ||||
| data.targeted_ad.post.topics | array | No | ||||
| data.targeted_ad.post.topics[].id | string | No | ||||
| data.targeted_ad.post.topics[].name | string | No | ||||
| data.targeted_ad.post.topics[].slug | string | No | ||||
| data.targeted_ad.post.updated_at | string | No | ||||
| data.targeted_ad.small_asset_uuid | string | No | ||||
| data.targeted_ad.subject | string | No | ||||
| data.targeted_ad.tagline | string | No | ||||
| data.targeted_ad.thumbnail_uuid | string | No | ||||
| data.targeted_ad.url | string | No | ||||
| data.targeted_ad.variation_id | string | No | ||||
| msg | string | No | OK |
Example request
curl -X GET "https://api.crawlora.net/api/v1/producthunt/category/%22vibe-coding%22" -H "x-api-key: <api-key>"
TypeScript fetch
const url = new URL("https://api.crawlora.net/api/v1/producthunt/category/%22vibe-coding%22");
const headers = new Headers();
headers.set("x-api-key", "<api-key>");
const response = await fetch(url, {
method: "GET",
headers,
});
const payload = await response.json();