Datasets API endpoint
Returns aggregate Product Hunt launch trends from the dataset id enum value `producthunt-trends`. Aggregate-only: each row is a category-over-time cell (a topic, optionally within a calendar period), reporting launch count, total and average upvotes, average rating and the top product — never an individual product record. Thin cells are suppressed. group_by enum: `topic_month`, `topic_year`, `topic`. Sort enum: `period_desc`, `period_asc`, `launch_count_desc`, `sum_votes_desc`. Billing: this search costs 1 credit per record returned, with a minimum of 2 (an empty result costs 2, a full page of 100 costs 100).
/datasets/producthunt-trends/searchReturns aggregate Product Hunt launch trends rolled up from an archive of Product Hunt launches. Each result row is a trend cell — a topic (category), optionally within a calendar period — reporting the launch count, total and average upvotes, average rating and the single top product for that cell. It is aggregate-only: it never returns individual product or maker records, and cells below the small-cell suppression floor are omitted entirely.
Dataset id enum:
producthunt-trendsQuery parameters:
group_by: optional aggregate cell dimension. Allowed values: topic_month, topic_year, topic. Defaults to topic_month. topic_month and topic_year return one cell per topic per calendar period; topic returns one all-time cell per topic (with an empty period).topic: optional exact topic-slug filter, e.g. artificial-intelligence, max 128 characters.launched_after: optional lower bound on first-launch date, an ISO-8601 date (YYYY-MM-DD); only products first launched on or after it are counted.launched_before: optional upper bound on first-launch date, an ISO-8601 date (YYYY-MM-DD); only products first launched on or before it are counted.min_votes: optional minimum product upvotes, 0 or greater.min_launches: optional minimum launches per cell; raises the small-cell suppression floor. It can only raise the floor, never lower it below the built-in minimum.sort: optional sort order. Allowed values: period_desc, period_asc, launch_count_desc, sum_votes_desc. Defaults to period_desc.page: optional page number, defaults to 1.page_size: optional page size, defaults to 20 and maxes at 100.Response behavior:
topic, period (YYYY-MM for topic_month, YYYY for topic_year, omitted for topic), launches, total_votes, avg_votes, avg_rating and top_product.avg_rating is reported only for cells with enough rated launches, so a handful of reviews never swings the figure; it is omitted otherwise.top_product is the single highest-upvoted product in the cell (slug, name, votes).min_launches field in the response echoes the effective suppression floor that was applied.10000, so page * page_size must not exceed 10000.items array (not an error) when no cell clears the suppression floor or the dataset has no data yet.1 credit per record returned, minimum 2. A search that returns 20 records costs 20 credits, a full page of 100 costs 100, and an empty or one-record result costs 2. You are charged for what comes back, not for the page_size you ask for, but your balance must cover the requested page_size for the call to be accepted. The response header x-credit-cost shows what a call was charged.
| Field | Filled in, of 20 checked | Values in the sample |
|---|---|---|
| topic | 20 | |
| period | 20 | |
| launches | 20 | 3 to 177, median 5 |
| total_votes | 20 | 363 to 33,891, median 808 |
| avg_votes | 20 | 90.8 to 293.3, median 169.7 |
| avg_rating | 6 | 4.56 to 5, median 4.7 |
| top_product | 20 |
| Parameter | Type | Required | Default | Description | Example |
|---|---|---|---|---|---|
| group_by | string | No | topic_month | Aggregate cell dimension enum: topic_month, topic_year, topic. Defaults to topic_month Allowed values: topic_month, topic_year, topic. | |
| topic | string | No | Exact topic-slug filter, e.g. artificial-intelligence, max 128 characters | ||
| launched_after | string | No | Lower bound on first-launch date, an ISO-8601 date (YYYY-MM-DD) | ||
| launched_before | string | No | Upper bound on first-launch date, an ISO-8601 date (YYYY-MM-DD) | ||
| min_votes | integer | No | Minimum product upvotes, 0 or greater | ||
| min_launches | integer | No | Minimum launches per cell; raises the small-cell suppression floor (never lowered below the built-in minimum) | ||
| sort | string | No | Sort enum: period_desc, period_asc, launch_count_desc, sum_votes_desc Allowed values: period_desc, period_asc, launch_count_desc, sum_votes_desc. | ||
| page | integer | No | 1 | Page number, defaults to 1 | |
| page_size | integer | No | 20 and maxes at 100 | Page size, defaults to 20 and maxes at 100; page * page_size must be <= 10000 | |
| x-api-key (header) | string | Yes | API key required |
curl -X GET "https://api.crawlora.net/api/v1/datasets/producthunt-trends/search?group_by=topic_month&sort=period_desc&page=1" \ -H "x-api-key: $CRAWLORA_API_KEY"
{
"code": 200,
"msg": "OK",
"data": {
"dataset": "producthunt-trends",
"group_by": "topic_month",
"items": [
{
"topic": "artificial-intelligence",
"period": "2024-01",
"launches": 312,
"total_votes": 84210,
"avg_votes": 269.9,
"avg_rating": 4.61,
"top_product": {
"slug": "chatgpt",
"name": "ChatGPT",
"votes": 4120
}
}
],
"page": 1,
"page_size": 20,
"total": 1,
"sort": "period_desc",
"min_launches": 3
}
}Request schema
No body schema
Response schema
#/definitions/datasets.producthuntTrendsSearchResponseDoc
| Field | Type | Required | Enum | Bounds | Example | Description |
|---|---|---|---|---|---|---|
| code | integer | No | 200 | |||
| data | datasets.ProductHuntTrendsSearchResponse | No | ||||
| data.dataset | string | No | Identifier of the dataset queried (`producthunt-trends`). | |||
| data.group_by | string | No | Dimension the cells are grouped by: `topic_month`, `topic_year` or `topic`. | |||
| data.items | array | No | Aggregate launch-trend cells on this page, one per group. | |||
| data.items[].avg_rating | number | No | Average review rating out of 5 across the cell's launches. Omitted when too few launches have ratings. | |||
| data.items[].avg_votes | number | No | Average upvotes per launched product in the cell. | |||
| data.items[].launches | integer | No | Number of product launches in the cell. | |||
| data.items[].period | string | No | "2024-01" | "2024" | "" for all-time | |||
| data.items[].top_product | object | No | Product with the most upvotes in the cell. | |||
| data.items[].top_product.name | string | No | Product name as shown on Product Hunt. | |||
| data.items[].top_product.slug | string | No | URL slug of the product on Product Hunt. | |||
| data.items[].top_product.votes | integer | No | Upvote count of the product. | |||
| data.items[].topic | string | No | Slug of the Product Hunt topic the cell covers. | |||
| data.items[].total_votes | integer | No | Total upvotes across the launches in the cell. | |||
| data.min_launches | integer | No | Minimum number of launches a cell needs to be included. | |||
| data.page | integer | No | Page number returned. | |||
| data.page_size | integer | No | Number of items per page. | |||
| data.sort | string | No | Sort order applied. | |||
| data.total | integer | No | Total number of cells. | |||
| msg | string | No | OK |
| Status | Description | Schema |
|---|---|---|
| 400 | Bad Request | #/definitions/app.Response |
| 429 | Too Many Requests | #/definitions/app.Response |
| 500 | Internal Server Error | #/definitions/app.Response |
Use environment variables for secrets and keep Crawlora API keys server-side.
curl -X GET "https://api.crawlora.net/api/v1/datasets/producthunt-trends/search?group_by=topic_month&sort=period_desc&page=1" \
-H "x-api-key: $CRAWLORA_API_KEY"