ProductHunt API endpoint
Lists the customer products of a Product Hunt product, looked up by its slug in `id`. `order` is `customers` (default) or `latest_launch`, `page` defaults to 1 and `page_size` to 10. Each item has its name, categories, badges, review and follower counts, and founder shoutouts. An unknown slug returns 404.
/producthunt/product/{id}/customersReturns paginated customer products for a Product Hunt product.
id: required. Product Hunt product slug. Example: "openai".order: optional. Product Hunt customer order. Default: customers. Allowed values: customers, latest_launch.page: optional. Page number. Default: 1.page_size: optional. Results per page. Default: 10.404 when Product Hunt does not return a product for the slug.503 when Product Hunt omits the customers/products connection or returns a blocked/malformed upstream payload.| Field | Filled in, of 20 checked | Values in the sample |
|---|---|---|
| id | 20 | |
| detailed_reviews_count | 20 | 0 |
| posts_count | 20 | 0 |
| slug | 20 | |
| name | 20 | “Supabase” and 19 other values |
| tagline | 20 | “The open source Firebase alternative” and 19 other values |
| logo_uuid | 20 | |
| reviews_rating | 20 | 4.39 to 4.98, median 4.79 |
| reviews_count | 20 | 7 to 1,091, median 67 |
| categories | 19 | median 3 entries |
| tags | 20 | median 20 entries |
| is_top_product | 20 | true in 2 of 20 |
| badges | 20 | median 3 entries |
| followers_count | 20 | 692 to 144,630, median 3,205 |
| is_subscribed | 20 | true in 0 of 20 |
| is_no_longer_online | 20 | true in 0 of 20 |
| founder_reviews_count | 20 | 0 |
| Parameter | Type | Required | Default | Description | Example |
|---|---|---|---|---|---|
| id (path) | string | Yes | Product Hunt slug | "openai" | |
| order | string | No | Product Hunt customers order Allowed values: customers, latest_launch. | ||
| page | integer | No | Page number | ||
| page_size | integer | No | Results per page | ||
| x-api-key (header) | string | Yes | API key required |
curl -X GET "https://api.crawlora.net/api/v1/producthunt/product/%22openai%22/customers?order=customers&page=1" \ -H "x-api-key: $CRAWLORA_API_KEY"
{
"code": 200,
"msg": "OK",
"data": {
"product_id": "594550",
"slug": "openai",
"name": "OpenAI",
"order": "customers",
"page": 1,
"page_size": 10,
"connection": "customers",
"total_count": 120,
"pages_count": 12,
"has_previous_page": false,
"has_next_page": true,
"items": [
{
"id": "1192159",
"slug": "sheet-ninja-2",
"name": "Sheet Ninja",
"tagline": "Ship vibe-coded apps. Your data stays in Google Sheets.",
"reviews_rating": 4.8,
"reviews_count": 42
}
]
}
}Request schema
No body schema
Response schema
#/definitions/producthunt.customersResponseDoc
| Field | Type | Required | Enum | Bounds | Example | Description |
|---|---|---|---|---|---|---|
| code | integer | No | 200 | |||
| data | producthunt.ProductCustomersPage | No | ||||
| data.connection | string | No | customers | Kind of list the items come from, for example `customers`. | ||
| data.end_cursor | string | No | Cursor of the last item on this page. Omitted when Product Hunt returns none. | |||
| data.has_next_page | boolean | No | Whether another page of customers follows this one. | |||
| data.has_previous_page | boolean | No | Whether a page of customers precedes this one. | |||
| data.items | array | No | Products that are customers of the product, one per entry. | |||
| data.items[].badges | array | No | Badges the product has earned on Product Hunt. | |||
| data.items[].badges[].category | string | No | Award category of the badge, for example `Product of the Year`. Omitted for daily and weekly badges. | |||
| data.items[].badges[].date | string | No | Date the badge refers to. | |||
| data.items[].badges[].id | string | No | Product Hunt id of the badge. | |||
| data.items[].badges[].period | string | No | Period the badge covers, for example `daily` or `weekly`. | |||
| data.items[].badges[].position | integer | No | Rank the product placed at for this badge. | |||
| data.items[].badges[].post_id | string | No | Product Hunt id of the launch post the badge was earned on. | |||
| data.items[].badges[].post_name | string | No | Name of the launch post the badge was earned on. | |||
| data.items[].badges[].post_slug | string | No | URL slug of the launch post the badge was earned on. | |||
| data.items[].badges[].year | string | No | Year of the award the badge belongs to. | |||
| data.items[].categories | array | No | Product Hunt categories the product is listed in. | |||
| data.items[].categories[].id | string | No | Product Hunt id of the category. | |||
| data.items[].categories[].name | string | No | Name of the category as shown on Product Hunt. | |||
| data.items[].categories[].path | string | No | Path of the category page on Product Hunt. | |||
| data.items[].categories[].slug | string | No | URL slug of the category. | |||
| data.items[].detailed_reviews_count | integer | No | Number of detailed reviews the product has. | |||
| data.items[].followers_count | integer | No | Number of Product Hunt users following the product. | |||
| data.items[].founder_reviews_count | integer | No | Number of reviews written by the product's founders. | |||
| data.items[].founder_shoutouts | array | No | Shoutouts the product received from other founders. | |||
| data.items[].founder_shoutouts[].from_post | object | No | Launch post of the founder who gave the shoutout. | |||
| data.items[].founder_shoutouts[].from_post.badges | array | No | Badges the launch post has earned. | |||
| data.items[].founder_shoutouts[].from_post.badges[].category | string | No | Award category of the badge, for example `Product of the Year`. Omitted for daily and weekly badges. | |||
| data.items[].founder_shoutouts[].from_post.badges[].date | string | No | Date the badge refers to. | |||
| data.items[].founder_shoutouts[].from_post.badges[].id | string | No | Product Hunt id of the badge. | |||
| data.items[].founder_shoutouts[].from_post.badges[].period | string | No | Period the badge covers, for example `daily` or `weekly`. | |||
| data.items[].founder_shoutouts[].from_post.badges[].position | integer | No | Rank the product placed at for this badge. | |||
| data.items[].founder_shoutouts[].from_post.badges[].post_id | string | No | Product Hunt id of the launch post the badge was earned on. | |||
| data.items[].founder_shoutouts[].from_post.badges[].post_name | string | No | Name of the launch post the badge was earned on. | |||
| data.items[].founder_shoutouts[].from_post.badges[].post_slug | string | No | URL slug of the launch post the badge was earned on. | |||
| data.items[].founder_shoutouts[].from_post.badges[].year | string | No | Year of the award the badge belongs to. | |||
| data.items[].founder_shoutouts[].from_post.id | string | No | Product Hunt id of the launch post. | |||
| data.items[].founder_shoutouts[].from_post.name | string | No | Name of the launch post. | |||
| data.items[].founder_shoutouts[].from_post.product_id | string | No | Product Hunt id of the product the post belongs to. | |||
| data.items[].founder_shoutouts[].from_post.product_slug | string | No | URL slug of the product the post belongs to. | |||
| data.items[].founder_shoutouts[].from_post.product_state | string | No | State of the product on Product Hunt, for example `default`. | |||
| data.items[].founder_shoutouts[].from_post.slug | string | No | URL slug of the launch post. | |||
| data.items[].founder_shoutouts[].from_post.thumbnail_image_uuid | string | No | Identifier of the launch post's thumbnail image file. | |||
| data.items[].founder_shoutouts[].id | string | No | Product Hunt id of the shoutout. | |||
| data.items[].founder_shoutouts[].product_id | string | No | Product Hunt id of the product that received the shoutout. | |||
| data.items[].id | string | No | Product Hunt id of the product. | |||
| data.items[].is_no_longer_online | boolean | No | Whether Product Hunt marks the product as no longer online. | |||
| data.items[].is_subscribed | boolean | No | Whether the requesting viewer follows the product. | |||
| data.items[].is_top_product | boolean | No | Whether Product Hunt flags the product as a top product. | |||
| data.items[].latest_launch | object | No | Most recent launch of the product. | |||
| data.items[].latest_launch.id | string | No | Product Hunt id of the product's latest launch. | |||
| data.items[].latest_launch.scheduled_at | string | No | Time the latest launch was scheduled for, in ISO 8601 with a UTC offset. | |||
| data.items[].logo_uuid | string | No | Identifier of the product's logo image file. | |||
| data.items[].name | string | No | Name of the product as shown on Product Hunt. | |||
| data.items[].posts_count | integer | No | Number of launch posts the product has. | |||
| data.items[].reviews_count | integer | No | Number of reviews the product has. | |||
| data.items[].reviews_rating | number | No | Average review rating of the product. | |||
| data.items[].slug | string | No | URL slug of the product on Product Hunt. | |||
| data.items[].structured_data | object | No | Schema.org structured data Product Hunt publishes for the product. | |||
| data.items[].structured_data.application_category | string | No | Schema.org application category of the product. | |||
| data.items[].structured_data.context | string | No | Schema.org context URL of the product's structured data block. | |||
| data.items[].structured_data.date_modified | string | No | Date the product page was last modified. | |||
| data.items[].structured_data.date_published | string | No | Date the product was published on Product Hunt. | |||
| data.items[].structured_data.description | string | No | Product description as given in its structured data. | |||
| data.items[].structured_data.id | string | No | Identifier of the product in its structured data block. | |||
| data.items[].structured_data.image | string | No | URL of the product's main image. | |||
| data.items[].structured_data.name | string | No | Product name as given in its structured data. | |||
| data.items[].structured_data.operating_system | string | No | Operating systems the product runs on, as listed in its structured data. | |||
| data.items[].structured_data.screenshot | array | No | URLs of the product's screenshots. | |||
| data.items[].structured_data.url | string | No | Product Hunt page URL of the product. | |||
| data.items[].tagline | string | No | Short tagline of the product. | |||
| data.items[].tags | array | No | Tags describing the product. | |||
| data.name | string | No | OpenAI | Name of the product. | ||
| data.order | string | No | customers | Order the customers are sorted in, `customers` or `latest_launch`. | ||
| data.page | integer | No | 1 | Page number returned. | ||
| data.page_size | integer | No | 10 | Number of customers requested per page. | ||
| data.pages_count | integer | No | 12 | Total number of pages of customers. | ||
| data.product_id | string | No | 594550 | Product Hunt id of the product. | ||
| data.raw_page_info | object | No | Pagination details for this page as Product Hunt returns them. | |||
| data.slug | string | No | openai | URL slug of the product on Product Hunt. | ||
| data.total_count | integer | No | 120 | Total number of customers the product has. | ||
| msg | string | No | OK |
| Status | Description | Schema |
|---|---|---|
| 400 | Missing or invalid parameters | #/definitions/app.Response |
| 404 | Product not found | #/definitions/app.Response |
| 429 | Rate limit exceeded | #/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/producthunt/product/%22openai%22/customers?order=customers&page=1" \
-H "x-api-key: $CRAWLORA_API_KEY"