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

NameInTypeRequiredEnumExampleDescription
slugpathstringYes"vibe-coding"Product Hunt category slug
x-api-keyheaderstringYesAPI 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
PlanPriceIncluded creditsDaily capRate limitOverage
Free$0/mo2,000500 daily credits5/minNo overage
Starter$9/mo20,0005,000 daily credits15/min$0.75/1,000 overage credits when enabled
Growth$29/mo100,00025,000 daily credits45/min$0.45/1,000 overage credits when enabled
Pro$79/mo400,000No daily cap120/min$0.30/1,000 overage credits
Business$199/mo1,200,000No daily cap300/min$0.20/1,000 overage credits
Enterprise$499/mo5,000,000No daily cap1,000/min$0.12/1,000 overage credits

Failure responses

StatusDescriptionSchema
400Missing or invalid parameters#/definitions/app.Response
404Category not found#/definitions/app.Response
429Rate limit exceeded#/definitions/app.Response
500Internal 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

FieldTypeRequiredEnumBoundsExampleDescription
codeintegerNo200
dataproducthunt.ProductCategoryPageNo
data.descriptionstringNo
data.discussionsarrayNo
data.discussions[].comments_countintegerNo
data.discussions[].created_atstringNo
data.discussions[].description_previewstringNo
data.discussions[].has_votedbooleanNo
data.discussions[].idstringNo
data.discussions[].pathstringNo
data.discussions[].pinnedbooleanNo
data.discussions[].primary_forumproducthunt.ProductAlternativeDiscussionForumNo
data.discussions[].primary_forum.idstringNo
data.discussions[].primary_forum.slugstringNo
data.discussions[].primary_forum.subject_idstringNo
data.discussions[].primary_forum.subject_namestringNo
data.discussions[].slugstringNo
data.discussions[].titlestringNo
data.discussions[].userproducthunt.ProductAlternativeDiscussionUserNo
data.discussions[].user.avatar_urlstringNo
data.discussions[].user.idstringNo
data.discussions[].user.namestringNo
data.discussions[].user.usernamestringNo
data.discussions[].votes_countintegerNo
data.discussions_has_next_pagebooleanNo
data.expandable_htmlstringNo
data.hero_productsarrayNo
data.hero_products[].idstringNo
data.hero_products[].is_no_longer_onlinebooleanNo
data.hero_products[].logo_uuidstringNo
data.hero_products[].namestringNo
data.hero_products_countintegerNo
data.idstringNo
data.last_updated_atstringNo
data.meta_titlestringNo
data.namestringNo
data.parentproducthunt.ProductCategoryParentNo
data.parent.idstringNo
data.parent.namestringNo
data.parent.pathstringNo
data.parent.sub_categoriesarrayNo
data.parent.sub_categories[].idstringNo
data.parent.sub_categories[].namestringNo
data.parent.sub_categories[].pathstringNo
data.parent.sub_categories[].slugstringNo
data.pathstringNo/categories/vibe-coding
data.questionsarrayNo
data.questions[].bodyproducthunt.ProductCategoryMarkdownNo
data.questions[].body.markdownstringNo
data.questions[].body.textstringNo
data.questions[].idstringNo
data.questions[].top_answerproducthunt.ProductCategoryAnswerNo
data.questions[].top_answer.bodyproducthunt.ProductCategoryMarkdownNo
data.questions[].top_answer.body.markdownstringNo
data.questions[].top_answer.body.textstringNo
data.questions[].top_answer.idstringNo
data.questions[].top_answer.sourcesarrayNo
data.questions[].top_answer.sources[].badgesarrayNo
data.questions[].top_answer.sources[].idstringNo
data.questions[].top_answer.sources[].pathstringNo
data.questions[].top_answer.sources[].subject_idstringNo
data.questions[].top_answer.sources[].typestringNo
data.questions[].top_answer.sources[].userproducthunt.ProductCategoryUserNo
data.questions[].top_answer.sources[].user.avatar_urlstringNo
data.questions[].top_answer.sources[].user.idstringNo
data.questions[].top_answer.sources[].user.namestringNo
data.questions[].top_answer.sources[].user.usernamestringNo
data.questions[].top_answer.sources[].visible_atstringNo
data.raw_relevant_reviewsarrayNo
data.recent_launches_countintegerNo
data.recent_summaryproducthunt.ProductCategoryRecentSummaryNo
data.recent_summary.productsarrayNo
data.recent_summary.products[].badgesarrayNo
data.recent_summary.products[].badges[].datestringNo
data.recent_summary.products[].badges[].idstringNo
data.recent_summary.products[].badges[].periodstringNo
data.recent_summary.products[].badges[].positionintegerNo
data.recent_summary.products[].badges[].post_namestringNo
data.recent_summary.products[].badges[].post_slugstringNo
data.recent_summary.products[].categoriesarrayNo
data.recent_summary.products[].categories[].idstringNo
data.recent_summary.products[].categories[].namestringNo
data.recent_summary.products[].categories[].pathstringNo
data.recent_summary.products[].categories[].slugstringNo
data.recent_summary.products[].followers_countintegerNo
data.recent_summary.products[].idstringNo
data.recent_summary.products[].is_no_longer_onlinebooleanNo
data.recent_summary.products[].is_subscribedbooleanNo
data.recent_summary.products[].is_top_productbooleanNo
data.recent_summary.products[].latest_launchproducthunt.ProductCategoryLatestLaunchNo
data.recent_summary.products[].latest_launch.idstringNo
data.recent_summary.products[].latest_launch.scheduled_atstringNo
data.recent_summary.products[].logo_uuidstringNo
data.recent_summary.products[].namestringNo
data.recent_summary.products[].reviews_countintegerNo
data.recent_summary.products[].reviews_ratingnumberNo
data.recent_summary.products[].slugstringNo
data.recent_summary.products[].taglinestringNo
data.recent_summary.products[].tagsarrayNo
data.recent_summary.summarystringNo
data.reviews_countintegerNo
data.slugstringNovibe-coding
data.sub_categoriesarrayNo
data.sub_categories[].idstringNo
data.sub_categories[].namestringNo
data.sub_categories[].pathstringNo
data.sub_categories[].slugstringNo
data.targeted_adproducthunt.ProductCategoryAdNo
data.targeted_ad.channel_kindstringNo
data.targeted_ad.idstringNo
data.targeted_ad.large_asset_uuidstringNo
data.targeted_ad.namestringNo
data.targeted_ad.postproducthunt.ProductCategoryAdPostNo
data.targeted_ad.post.comments_countintegerNo
data.targeted_ad.post.created_atstringNo
data.targeted_ad.post.disabled_when_scheduledbooleanNo
data.targeted_ad.post.embargo_preview_atstringNo
data.targeted_ad.post.featured_atstringNo
data.targeted_ad.post.featured_commentproducthunt.ProductCategoryAdCommentNo
data.targeted_ad.post.featured_comment.body_textstringNo
data.targeted_ad.post.featured_comment.idstringNo
data.targeted_ad.post.featured_comment.is_pinnedbooleanNo
data.targeted_ad.post.featured_comment.pathstringNo
data.targeted_ad.post.featured_comment.subject_idstringNo
data.targeted_ad.post.featured_comment.userproducthunt.ProductCategoryUserNo
data.targeted_ad.post.featured_comment.user.avatar_urlstringNo
data.targeted_ad.post.featured_comment.user.idstringNo
data.targeted_ad.post.featured_comment.user.namestringNo
data.targeted_ad.post.featured_comment.user.usernamestringNo
data.targeted_ad.post.has_votedbooleanNo
data.targeted_ad.post.hide_votes_countbooleanNo
data.targeted_ad.post.idstringNo
data.targeted_ad.post.latest_scoreintegerNo
data.targeted_ad.post.launch_day_scoreintegerNo
data.targeted_ad.post.namestringNo
data.targeted_ad.post.product_idstringNo
data.targeted_ad.post.product_slugstringNo
data.targeted_ad.post.product_subscribedbooleanNo
data.targeted_ad.post.randomization_statusproducthunt.ProductCategoryRandomizationStatusNo
data.targeted_ad.post.randomization_status.activebooleanNo
data.targeted_ad.post.randomization_status.next_transition_atstringNo
data.targeted_ad.post.randomization_status.random_daybooleanNo
data.targeted_ad.post.slugstringNo
data.targeted_ad.post.topicsarrayNo
data.targeted_ad.post.topics[].idstringNo
data.targeted_ad.post.topics[].namestringNo
data.targeted_ad.post.topics[].slugstringNo
data.targeted_ad.post.updated_atstringNo
data.targeted_ad.small_asset_uuidstringNo
data.targeted_ad.subjectstringNo
data.targeted_ad.taglinestringNo
data.targeted_ad.thumbnail_uuidstringNo
data.targeted_ad.urlstringNo
data.targeted_ad.variation_idstringNo
msgstringNoOK

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();