Product Hunt Categories API and MCP — Full Category Tree with Parents and Descriptions
Send an empty request and get the Product Hunt category list back as JSON: each category with its name, slug, link, numeric category id, a short description and, for sub-categories, the parent it sits under.
- You send
- nothing; the request body is empty
- You get back
- every Product Hunt category with its slug, link, numeric id, description and parent category
- Coverage
- Product Hunt records with a public page.
- Price
- 5 pts — $5 per 1,000
- Charged only when the record resolves. A request that finds nothing is not billed.
Ways to get this data
Three approaches teams use today, and where each one runs into trouble.
| Approach | What it takes | Cost | Trade-off |
|---|---|---|---|
| Product Hunt directly | Browse Product Hunt and note each entry | Free, and slow | Fine for one record, useless across a list, and the layout differs on every platform |
| Building a scraper | Write it, host it, and repair it when Product Hunt changes its pages | Engineering time | A maintenance commitment for something that isn't your product |
| NeuralVerge | One request, the same shape as every other source in the catalog | $5 per 1,000, misses not billed | Returns what Product Hunt publishes at request time. Other platforms are separate sources with the same request format |
What you get back
Every field in the example response below.
| Field | Type | Description |
|---|---|---|
session_id | string | Id of this run, for tracing. |
kind | string | Source type of the response. |
max_items | number | The cap on returned records, as run. |
start_page | number | Page the run started from. |
partial | boolean | True when the run stopped before reaching max_items. |
human | string | Readable summary: the query, how many results came back and how many were found. |
total_points | number | Points charged for the run. |
machine.total_items | number | Number of categories returned in this response. |
machine.total_found | null | Total matches reported by the platform, when it reports one. Null in the sample. |
machine.first_item.id | string | Category slug. |
machine.first_item.name | string | Category name. |
machine.first_item.url | string | Link to the category page. |
machine.first_item.alias | string | Slug as Product Hunt uses it. |
machine.first_item.category_id | string | Numeric category id, as a string. |
machine.first_item.description | null | Short description of the category. Null for top-level categories such as Productivity. |
machine.first_item.parent | null | Parent category with name, slug and url. Null for top-level categories. |
machine.items[] | array | All categories returned, same shape as first_item. |
machine.page_count | number | Pages read for the run. |
machine.blocked | boolean | Whether the platform refused the request. |
machine.proxy_traffic_bytes | number | Size of the data transferred for the run, in bytes. |
Example response
A real response, as returned.
{
"session_id": "11111111-1111-1111-1111-111111111111",
"kind": "producthunt_categories_list",
"max_items": 1000,
"start_page": 1,
"partial": false,
"human": "# Product Hunt — categories\n\n- **Query:** all\n- **Results:** 248\n- **Proxy traffic:** 537.9 KB",
"machine": {
"total_items": 248,
"first_item": {
"id": "productivity",
"name": "Productivity",
"url": "https://www.producthunt.com/categories/productivity",
"alias": "productivity",
"category_id": "34",
"description": null,
"parent": null
},
"items": [
{
"id": "productivity",
"name": "Productivity",
"url": "https://www.producthunt.com/categories/productivity",
"alias": "productivity",
"category_id": "34",
"description": null,
"parent": null
},
{
"id": "ai-meeting-notetakers",
"name": "AI notetakers",
"url": "https://www.producthunt.com/categories/ai-meeting-notetakers",
"alias": "ai-meeting-notetakers",
"category_id": "1288",
"description": "AI notetakers capture meetings, calls, and voice memos, then transcribe, summarize, and extract tasks for teams, sellers, and learners across tools and languages.",
"parent": {
"name": "Productivity",
"slug": "productivity",
"url": "https://www.producthunt.com/categories/productivity"
}
}
],
"total_found": null,
"page_count": 1,
"blocked": false,
"proxy_traffic_bytes": 550852
},
"total_points": 5
}How to run it
The same lookup works from the app, the API, or as a tool an agent can call mid-task.
One record per request. Results come back in the same envelope as every other source: a session id, a readable summary, the structured result and the points charged.
curl -X POST https://api.neuralverge.ai/functions/v1/run-producthunt-categories-list \
-H "Authorization: Bearer YOUR_API_KEY" \
-H "Content-Type: application/json" \
-d '{}'What teams use it for
Where this field shows up in an actual workflow.
Use the category tree and parent links as a controlled vocabulary for tagging products in your own database.
Collect category slugs once, then loop over them with the category products source to cover a market segment.
See which sub-categories exist under a parent such as Productivity before deciding where to look for competitors.
Coverage, freshness and limits
What this source covers, how fresh it is, and where it stops.
Product Hunt records with a public page.
Read at request time, so the answer reflects the platform as it stands when you ask.
This source returns information Product Hunt shows publicly. Every response carries the session id you can trace.
- —The categories are returned as the platform lists them at request time; there is no history of categories that were renamed or removed.
- —Top-level categories can come back without a description or a parent.
Questions, answered
Yes. This source is charged a flat 5 points per successful run, and the sample returned 248 categories for that price.
Related sources
Try product hunt categories on your own data
One request format across every source in the catalog.