Datasets API endpoint
Searches individual Product Hunt launches from the dataset id enum value `producthunt-products` — the searchable launch archive. Each result is one product with its topics, upvotes, ranks and launch history; description/website/twitter_url/pricing/makers are filled in over time. Sort enum: `relevance`, `votes_desc`, `launched_desc`, `launched_asc`, `rating_desc`, `best_rank_asc`. 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-products/searchSearches the Product Hunt launch archive — individual products with their topics, upvotes, ranks and launch history. Description, website, pricing and makers are filled in over time, so they may be absent on newly-archived products.
Dataset id enum:
producthunt-productsQuery parameters:
q: optional full-text query over product name and tagline, max 256 characters.topic: optional exact topic-slug filter, e.g. artificial-intelligence, max 128 characters.maker: optional exact maker-username filter, max 128 characters.launched_after: optional lower bound on first-launch date, an ISO-8601 date (YYYY-MM-DD).launched_before: optional upper bound on first-launch date, an ISO-8601 date (YYYY-MM-DD).min_votes: optional minimum upvotes, 0 or greater.min_rating: optional minimum review rating, from 0 through 5.pricing_type: optional exact pricing-type filter, e.g. free, paid, freemium.has_website: optional website presence filter.is_online: optional lifecycle filter; true keeps only products still online, false only retired products.sort: optional sort order. Allowed values: relevance, votes_desc, launched_desc, launched_asc, rating_desc, best_rank_asc. Defaults to relevance with q, otherwise votes_desc.page: optional page number, defaults to 1.page_size: optional page size, defaults to 20 and maxes at 100.Response behavior:
product_id, slug, name, tagline, topics/topic_slugs, latest_score (upvotes), best_daily_rank/best_weekly_rank/best_monthly_rank, first_launch_date, launches (launch history), and — once hydrated — description, website, twitter_url, pricing_type, reviews_rating and makers.10000; page * page_size must not exceed 10000.items array (not an error) when nothing matches 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 |
|---|---|---|
| product_id | 20 | |
| slug | 20 | |
| name | 20 | |
| tagline | 20 | |
| website | 18 | streaksapp.com and 14 other hosts |
| logo_uuid | 19 | |
| url | 20 | producthunt.com |
| topics | 17 | median 3 entries |
| topic_slugs | 17 | median 3 entries |
| primary_topic | 17 | |
| latest_score | 17 | 75 to 632, median 142 |
| reviews_rating | 5 | 4.5 to 5, median 5 |
| reviews_count | 4 | 1 to 14, median 1 |
| followers_count | 20 | 1 to 1,337, median 26 |
| comments_count | 17 | 2 to 116, median 19 |
| best_daily_rank | 17 | 1 to 19, median 7 |
| best_weekly_rank | 17 | 2 to 124, median 54 |
| best_monthly_rank | 17 | 14 to 567, median 214 |
| won_daily | 3 | true in 3 of 3 |
| launches | 17 | median 1 entry |
| first_launch_date | 17 | 2015-01-01 to 2026-01-12 |
| latest_launch_date | 17 | 2015-01-01 to 2026-01-12 |
| launch_count | 17 | 1 to 2, median 1 |
| launch_year | 17 | 2,015 to 2,026, median 2,022 |
| makers | 18 | median 1 entry |
| product_state | 17 | |
| description | 14 | median 222 characters |
| pricing_type | 11 |
| Parameter | Type | Required | Default | Description | Example |
|---|---|---|---|---|---|
| q | string | No | Full-text query over product name and tagline, max 256 characters | ||
| topic | string | No | Exact topic-slug filter, e.g. artificial-intelligence, max 128 characters | ||
| maker | string | No | Exact maker-username filter (populated by hydration), 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 upvotes, 0 or greater | ||
| min_rating | number | No | Minimum review rating, from 0 through 5 (populated by hydration) | ||
| pricing_type | string | No | Exact pricing-type filter (populated by hydration), e.g. free, paid, freemium | ||
| has_website | boolean | No | Website presence filter (populated by hydration) | ||
| is_online | boolean | No | true keeps only products still online, false only retired products | ||
| sort | string | No | Sort enum: relevance, votes_desc, launched_desc, launched_asc, rating_desc, best_rank_asc Allowed values: relevance, votes_desc, launched_desc, launched_asc, rating_desc, best_rank_asc. | ||
| 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-products/search?q=coffee&has_website=true&is_online=true&sort=relevance&page=1" \ -H "x-api-key: $CRAWLORA_API_KEY"
{
"code": 200,
"msg": "OK",
"data": {
"dataset": "producthunt-products",
"items": [
{
"product_id": "94418",
"slug": "streaks",
"name": "Streaks",
"tagline": "The to-do list that helps you form good habits.",
"topic_slugs": [
"ios",
"task-management",
"tech"
],
"latest_score": 414,
"best_daily_rank": 1,
"won_daily": true,
"first_launch_date": "2015-06-01",
"launch_count": 1
}
],
"page": 1,
"page_size": 20,
"total": 1,
"sort": "votes_desc"
}
}Request schema
No body schema
Response schema
#/definitions/datasets.producthuntProductsSearchResponseDoc
| Field | Type | Required | Enum | Bounds | Example | Description |
|---|---|---|---|---|---|---|
| code | integer | No | 200 | |||
| data | datasets.ProductHuntProductsSearchResponse | No | ||||
| data.dataset | string | No | Identifier of the dataset queried (`producthunt-products`). | |||
| data.items | array | No | Matching Product Hunt product records on this page. | |||
| data.items[].best_daily_rank | integer | No | Best position the product reached on a Product Hunt daily leaderboard. | |||
| data.items[].best_monthly_rank | integer | No | Best position the product reached on a Product Hunt monthly leaderboard. | |||
| data.items[].best_weekly_rank | integer | No | Best position the product reached on a Product Hunt weekly leaderboard. | |||
| data.items[].comments_count | integer | No | Number of comments on the product's Product Hunt page. | |||
| data.items[].description | string | No | Product description as the maker wrote it on Product Hunt. | |||
| data.items[].first_launch_date | string | No | Date of the product's earliest launch, in YYYY-MM-DD format. | |||
| data.items[].followers_count | integer | No | Number of Product Hunt users following the product. | |||
| data.items[].is_no_longer_online | boolean | No | Whether Product Hunt marks the product as no longer online. | |||
| data.items[].is_top_product | boolean | No | Whether Product Hunt flags the product as a top product. | |||
| data.items[].latest_launch_date | string | No | Date of the product's most recent launch, in YYYY-MM-DD format. | |||
| data.items[].latest_score | integer | No | Current upvote count of the product. | |||
| data.items[].launch_count | integer | No | Number of times the product has launched on Product Hunt. | |||
| data.items[].launch_year | integer | No | Year of the product's first launch. | |||
| data.items[].launches | array | No | Each launch of the product on Product Hunt, with its date, ranks and score. | |||
| data.items[].launches[].daily_rank | integer | No | Rank on the Product Hunt daily leaderboard for the launch day. | |||
| data.items[].launches[].date | string | No | Launch date, in YYYY-MM-DD format. | |||
| data.items[].launches[].launch_day_score | integer | No | Score the launch had on its launch day. | |||
| data.items[].launches[].launch_number | integer | No | Sequence number of this launch among the product's Product Hunt launches. | |||
| data.items[].launches[].monthly_rank | integer | No | Rank on the Product Hunt monthly leaderboard. | |||
| data.items[].launches[].post_id | string | No | Product Hunt identifier of the launch post. | |||
| data.items[].launches[].post_slug | string | No | URL slug of the launch post on Product Hunt. | |||
| data.items[].launches[].score | integer | No | Upvote count of the launch post. | |||
| data.items[].launches[].weekly_rank | integer | No | Rank on the Product Hunt weekly leaderboard. | |||
| data.items[].logo_uuid | string | No | Identifier of the product logo image on Product Hunt. | |||
| data.items[].makers | array | No | People credited as makers of the product. | |||
| data.items[].makers[].avatar_url | string | No | URL of the maker's profile picture. | |||
| data.items[].makers[].headline | string | No | Short headline from the maker's Product Hunt profile. | |||
| data.items[].makers[].maker_id | string | No | Product Hunt identifier of the maker. | |||
| data.items[].makers[].name | string | No | Maker's display name. | |||
| data.items[].makers[].username | string | No | Maker's Product Hunt username. Use it with the maker item endpoint. | |||
| data.items[].name | string | No | Product name as shown on Product Hunt. | |||
| data.items[].pricing_type | string | No | Pricing model of the product, such as `free`, `paid` or `freemium`. | |||
| data.items[].primary_topic | string | No | Slug of the product's main topic. | |||
| data.items[].product_id | string | No | Product Hunt identifier of the product. | |||
| data.items[].product_state | string | No | Lifecycle state of the product as Product Hunt reports it. | |||
| data.items[].reviews_count | integer | No | Number of reviews the product has on Product Hunt. | |||
| data.items[].reviews_rating | number | No | Average review rating out of 5. | |||
| data.items[].slug | string | No | URL slug of the product on Product Hunt. Use it with the product item endpoint. | |||
| data.items[].tagline | string | No | One-line tagline of the product. | |||
| data.items[].topic_slugs | array | No | Slugs of all topics the product is filed under. | |||
| data.items[].topics | array | No | Topics the product is filed under. | |||
| data.items[].topics[].id | string | No | Product Hunt identifier of the topic. | |||
| data.items[].topics[].name | string | No | Topic name as Product Hunt shows it. | |||
| data.items[].topics[].slug | string | No | URL slug of the topic on Product Hunt. | |||
| data.items[].twitter_url | string | No | URL of the product's X (Twitter) profile. | |||
| data.items[].url | string | No | URL of the product's page on Product Hunt. | |||
| data.items[].website | string | No | URL of the product's own website. | |||
| data.items[].won_daily | boolean | No | Whether the product ranked first on a Product Hunt daily leaderboard. | |||
| 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 records matching the filters. | |||
| 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-products/search?q=coffee&has_website=true&is_online=true&sort=relevance&page=1" \
-H "x-api-key: $CRAWLORA_API_KEY"