Product Hunt Product Search API and MCP — Find Products by Keyword
Send a keyword and get the matching Product Hunt products back as a list: name, tagline, rating, review count, logo and a link to each product page. Set max_items to cap how many come back (up to 250) and start_page to begin further into the results.
- You send
- a keyword, and how many results to return
- You get back
- one entry per matching product: name, tagline, rating, review count, logo and link
- 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. |
keyword | string | The keyword you sent. |
max_items | number | The cap you sent on returned records. |
start_page | number | Page the run started from. |
partial | boolean | Whether the run stopped before reaching everything that matched. |
human | string | Readable summary of the run. |
total_points | number | Points charged for the run: 1 per returned record. |
machine.total_items | number | Number of records returned in this response. |
machine.total_found | null | Empty in the sample because the platform gave no total for this request. |
machine.page_count | number | Pages read for the run. |
machine.first_item | object | The first returned record, repeated from items[]. Fields below are described on items[]. |
machine.blocked | boolean | Whether the platform refused the request. |
machine.proxy_traffic_bytes | number | Size of the data transferred for the run, in bytes. |
machine.items[].id | string | Product id or slug on the platform. |
machine.items[].name | string | Product name. |
machine.items[].url | string | Link to the product page. |
machine.items[].alias | string | The product slug. |
machine.items[].product_id | string | Numeric product id. |
machine.items[].tagline | string | One-line tagline. |
machine.items[].rating | number | Average review rating. |
machine.items[].review_count | number | Number of reviews. |
machine.items[].post_count | null | Empty in the sample; the launch count is not given on this card. |
machine.items[].image | string | Logo image link. |
machine.items[].categories[] | array | Categories the product is listed in: name, slug and url. |
machine.items[].is_no_longer_online | boolean | Whether the platform marks the product as no longer online. Null when not stated. |
Example response
A real response, as returned.
{
"session_id": "11111111-1111-1111-1111-111111111111",
"kind": "producthunt_products_search",
"keyword": "crm",
"max_items": 2,
"start_page": 1,
"partial": false,
"human": "# Product Hunt — products search\n\n- **Query:** keyword=crm\n- **Results:** 2\n- **Proxy traffic:** 212.2 KB",
"machine": {
"total_items": 2,
"first_item": {
"id": "doplac-crm",
"name": "Doplac CRM",
"url": "https://www.producthunt.com/products/doplac-crm",
"alias": "doplac-crm",
"product_id": "561231",
"tagline": "Your CRM Partner",
"rating": 5,
"review_count": 7,
"post_count": null,
"image": "https://ph-files.imgix.net/604baef1-62aa-4544-88ba-cf142fecaf05.jpeg?auto=format&fit=crop&w=128&h=128",
"categories": [],
"is_no_longer_online": false
},
"items": [
{
"id": "doplac-crm",
"name": "Doplac CRM",
"url": "https://www.producthunt.com/products/doplac-crm",
"alias": "doplac-crm",
"product_id": "561231",
"tagline": "Your CRM Partner",
"rating": 5,
"review_count": 7,
"post_count": null,
"image": "https://ph-files.imgix.net/604baef1-62aa-4544-88ba-cf142fecaf05.jpeg?auto=format&fit=crop&w=128&h=128",
"categories": [],
"is_no_longer_online": false
},
{
"id": "folk-2",
"name": "folk",
"url": "https://www.producthunt.com/products/folk-2",
"alias": "folk-2",
"product_id": "480793",
"tagline": "folk is the AI CRM for your entire sales motion.",
"rating": 4.79,
"review_count": 81,
"post_count": null,
"image": "https://ph-files.imgix.net/ccb84135-f373-453d-b4de-837f8b77d00f.png?auto=format&fit=crop&w=128&h=128",
"categories": [],
"is_no_longer_online": false
}
],
"total_found": null,
"page_count": 1,
"blocked": false,
"proxy_traffic_bytes": 217324
},
"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-products-search \
-H "Authorization: Bearer YOUR_API_KEY" \
-H "Content-Type: application/json" \
-d '{"keyword":"crm","max_items":2}'What teams use it for
Where this field shows up in an actual workflow.
List the products that match a category keyword and see how they are rated and reviewed.
Search the words your product is described by and find who else the platform lists.
Collect product names and links by theme, then enrich each with the product lookup.
Turn a product name into the slug the other Product Hunt sources expect.
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 sample returned no total match count (total_found is null), so plan on max_items rather than a known total.
- —Category lists on search cards can be empty; the product lookup returns the full category list.
- —Results depend on how the platform's own search ranks a keyword; the list is not filtered further.
Questions, answered
Up to 250 through max_items. Use start_page to continue from a later page.
Related sources
Full profile of one product: rating, followers, categories, makers and similar products.
Alternatives the platform lists for a product, with similarity score.
Products whose makers say they use a given product.
Startup directories, funding databases, launch platforms and investor data.
Try product hunt product search on your own data
One request format across every source in the catalog.