Product Hunt Leaderboards API and MCP — Ranked Launches by Day, Week, Month or Year
Send a period and a date and get that leaderboard back as JSON, one record per launch in rank order: rank, name, tagline, votes, comments, topics, product slug and link, and when it was featured. The date format follows the period: 2024/1/15 for daily, 2024/3 for weekly or monthly, 2024 for yearly.
- You send
- a period (daily, weekly, monthly or yearly) and a date in the matching format, such as 2024/1/15 for a day, plus an optional featured-only flag and a max_items cap (up to 250)
- You get back
- the ranked launches for that period with rank, name, tagline, votes, comments, topics and product 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 | Open the page on Product Hunt and scroll through the list | 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. |
period | string | The period used for the run; daily in the sample. |
date | string | The date you sent. |
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 launches 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 | Launch slug. |
machine.first_item.name | string | Launch name. |
machine.first_item.url | string | Link to the launch page. |
machine.first_item.alias | string | Launch slug as Product Hunt uses it. |
machine.first_item.launch_id | string | Numeric launch id, as a string. |
machine.first_item.rank | number | Position on the leaderboard. |
machine.first_item.tagline | string | One-line tagline. |
machine.first_item.votes_count | number | Votes on the launch. |
machine.first_item.comments_count | number | Comments on the launch. |
machine.first_item.topics | array | Topics, each with name, slug and url. |
machine.first_item.image | string | Launch image URL. |
machine.first_item.product_slug | string | Slug of the product behind the launch. |
machine.first_item.product_url | string | Link to the product page. |
machine.first_item.featured_at | string | When the launch was featured, ISO 8601 with offset. |
machine.items[] | array | Launches in rank order, 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_leaderboards",
"period": "daily",
"date": "2024/1/15",
"max_items": 2,
"start_page": 1,
"partial": false,
"human": "# Product Hunt — leaderboards\n\n- **Query:** period=daily, date=2024/1/15\n- **Results:** 2\n- **Proxy traffic:** 31.4 KB",
"machine": {
"total_items": 2,
"first_item": {
"id": "ai-picasso-ai-dance",
"name": "AI Picasso - AI dance",
"url": "https://www.producthunt.com/posts/ai-picasso-ai-dance",
"alias": "ai-picasso-ai-dance",
"launch_id": "434214",
"rank": 1,
"tagline": "Full body AI dance from photos",
"votes_count": 314,
"comments_count": 275,
"topics": [
{
"name": "Android",
"slug": "android",
"url": "https://www.producthunt.com/topics/android"
},
{
"name": "iOS",
"slug": "ios",
"url": "https://www.producthunt.com/topics/ios"
}
],
"image": "https://ph-files.imgix.net/6fac80c0-fafa-4033-9374-9c7d1e30437d.png?auto=format&fit=crop&w=128&h=128",
"product_slug": "ai-picasso",
"product_url": "https://www.producthunt.com/products/ai-picasso",
"featured_at": "2024-01-15T00:23:23-08:00"
},
"items": [
{
"id": "ai-picasso-ai-dance",
"name": "AI Picasso - AI dance",
"url": "https://www.producthunt.com/posts/ai-picasso-ai-dance",
"alias": "ai-picasso-ai-dance",
"launch_id": "434214",
"rank": 1,
"tagline": "Full body AI dance from photos",
"votes_count": 314,
"comments_count": 275,
"topics": [
{
"name": "Android",
"slug": "android",
"url": "https://www.producthunt.com/topics/android"
},
{
"name": "iOS",
"slug": "ios",
"url": "https://www.producthunt.com/topics/ios"
}
],
"image": "https://ph-files.imgix.net/6fac80c0-fafa-4033-9374-9c7d1e30437d.png?auto=format&fit=crop&w=128&h=128",
"product_slug": "ai-picasso",
"product_url": "https://www.producthunt.com/products/ai-picasso",
"featured_at": "2024-01-15T00:23:23-08:00"
},
{
"id": "team-analytics-by-codemonk-ai",
"name": "Team Analytics by CodeMonk.ai",
"url": "https://www.producthunt.com/posts/team-analytics-by-codemonk-ai",
"alias": "team-analytics-by-codemonk-ai",
"launch_id": "434333",
"rank": 2,
"tagline": "Uncover gaps in your tech team and hire the best fit with AI",
"votes_count": 279,
"comments_count": 264,
"topics": [
{
"name": "Hiring",
"slug": "hiring",
"url": "https://www.producthunt.com/topics/hiring"
},
{
"name": "Freelance",
"slug": "freelance",
"url": "https://www.producthunt.com/topics/freelance"
}
],
"image": "https://ph-files.imgix.net/34c51888-34fb-4b51-b6e9-9ec03661319d.png?auto=format&fit=crop&w=128&h=128",
"product_slug": "codemonk",
"product_url": "https://www.producthunt.com/products/codemonk",
"featured_at": "2024-01-15T03:59:30-08:00"
}
],
"total_found": null,
"page_count": 1,
"blocked": false,
"proxy_traffic_bytes": 32196
},
"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-leaderboards \
-H "Authorization: Bearer YOUR_API_KEY" \
-H "Content-Type: application/json" \
-d '{"date":"2024/1/15","max_items":2}'What teams use it for
Where this field shows up in an actual workflow.
See what votes and comment counts it took to place on a given day.
Pull the top launches of each month or year to track which product types appear.
Read a period's list and filter by topic to find launches in your space.
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 date format must match the period (day, week or month, or year); a mismatched date will not resolve.
- —The source returns the leaderboard as the platform shows it for the period, with no extra scoring.
- —total_found is null in the sample, so the total length of a leaderboard is not reported.
Questions, answered
Daily 2024/1/15, weekly 2024/3, monthly 2024/3, yearly 2024.
Related sources
Try product hunt leaderboards on your own data
One request format across every source in the catalog.