Product Hunt Collections Search API and MCP — Find Curated Lists by Keyword
Send a keyword such as design, or leave it out to browse collections page by page, and get matching collections back as JSON: name, link, collection id, title, description, how many products it holds and the user who curates it.
- You send
- an optional keyword, a max_items cap (up to 250) and optionally a start page
- You get back
- collections with title, description, number of products and the user who curates them
- Coverage
- Product Hunt records with a public page.
- Price
- 1 point per returned record — $1 per 1,000
- Billed per record actually returned, capped by max_items. A request that returns nothing costs nothing.
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 | Type the query into Product Hunt and read the results | 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 | $1 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 collections 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 | Collection path as Product Hunt uses it. |
machine.first_item.name | string | Collection name. |
machine.first_item.url | string | Link to the collection. |
machine.first_item.collection_id | string | Numeric collection id, as a string. |
machine.first_item.title | string | Collection title line. |
machine.first_item.description | string | Collection description. |
machine.first_item.products_count | number | Number of products in the collection. |
machine.first_item.user | object | Curator: id, name, username, url, headline and image. |
machine.items[] | array | Collections 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_collections_search",
"max_items": 2,
"start_page": 1,
"partial": false,
"human": "# Product Hunt — collections\n\n- **Query:** all\n- **Results:** 2\n- **Proxy traffic:** 13.8 KB",
"machine": {
"total_items": 2,
"first_item": {
"id": "@rrhoover/collections/_-_",
"name": "¯\\_(ツ)_/¯",
"url": "https://www.producthunt.com/@rrhoover/collections/_-_",
"collection_id": "56173",
"title": "Express yourself with old-school ASCII emoticons",
"description": "Express yourself with old-school ASCII emoticons",
"products_count": 11,
"user": {
"id": "rrhoover",
"name": "Ryan Hoover",
"username": "rrhoover",
"url": "https://www.producthunt.com/@rrhoover",
"headline": null,
"image": "https://ph-avatars.imgix.net/2/original.jpeg"
}
},
"items": [
{
"id": "@rrhoover/collections/_-_",
"name": "¯\\_(ツ)_/¯",
"url": "https://www.producthunt.com/@rrhoover/collections/_-_",
"collection_id": "56173",
"title": "Express yourself with old-school ASCII emoticons",
"description": "Express yourself with old-school ASCII emoticons",
"products_count": 11,
"user": {
"id": "rrhoover",
"name": "Ryan Hoover",
"username": "rrhoover",
"url": "https://www.producthunt.com/@rrhoover",
"headline": null,
"image": "https://ph-avatars.imgix.net/2/original.jpeg"
}
},
{
"id": "collections/0-design-tools",
"name": "$0 Design Tools",
"url": "https://www.producthunt.com/collections/0-design-tools",
"collection_id": "183205",
"title": "A collection of $0 Design Tools to Help You Create Your Next Project",
"description": "A collection of $0 Design Tools to Help You Create Your Next Project",
"products_count": 122,
"user": {
"id": "producthunt",
"name": "Product Hunt",
"username": "producthunt",
"url": "https://www.producthunt.com/@producthunt",
"headline": null,
"image": "https://ph-avatars.imgix.net/92/original.jpeg"
}
}
],
"total_found": null,
"page_count": 1,
"blocked": false,
"proxy_traffic_bytes": 14157
},
"total_points": 2
}How to run it
The same lookup works from the app, the API, or as a tool an agent can call mid-task.
Results come back in the same envelope as every other source: a session id, a readable summary, the structured result and the points charged. max_items caps how many records are returned and billed.
curl -X POST https://api.neuralverge.ai/functions/v1/run-producthunt-collections-search \
-H "Authorization: Bearer YOUR_API_KEY" \
-H "Content-Type: application/json" \
-d '{"max_items":2}'What teams use it for
Where this field shows up in an actual workflow.
Search a keyword to see which collections already group the products you care about.
Read which accounts maintain large collections on a topic.
Take collection slugs from the results and read their products with the collection products source.
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.
- —Without a keyword the source returns collections page by page rather than a ranked search.
- —Each collection lists the name and username of the person who curates it. Use that for attribution of the list, and handle personal data in line with your own obligations.
- —total_found is null in the sample, so the total number of matches is not reported.
Questions, answered
No. Leave it out to browse collections page by page.
Related sources
Products inside one collection, in curator order.
Products listed in one category.
The full category tree with parents and descriptions.
Startup directories, funding databases, launch platforms and investor data.
Try product hunt collections search on your own data
One request format across every source in the catalog.