Products in a topic
List the products filed under a Product Hunt topic — developer-tools, artificial-intelligence, productivity and the rest — ordered by most recent launch, rating, followers, post count or shoutouts. Narrow it with tags, or drop featuredOnly to include products that never launched. Poll one topic on a schedule and it becomes a category watchlist.
/topic-products Discovery https://api.fetchlayer.dev/producthunt/topic-products Headers
Authorization string required Bearer token — your FetchLayer API key.
Parameters
topic string required Topic slug (for example "developer-tools"), or a Product Hunt topic URL.
sortBy string optional most_recent_launch, most_recent, oldest, posts_count, most_followed, best_rated, highest_rated, most_shoutouts, or no_order. (default: most_recent_launch)
featuredOnly boolean optional Only products that have launched on Product Hunt. (default: true)
tags string[] optional Narrow the topic to these tags (max 10).
limit number optional Maximum products returned (max 500), or -1 for everything available. (default: 30)
pages number optional Pages of results to collect in one request (max 100), or -1 for the maximum allowed. Each page walked counts as one request. (default: 1)
cursor string optional Resume from a previous response's nextCursor.
delayMs number optional Milliseconds to wait between pages (max 30000).
format string optional json or markdown. Markdown returns the same result rendered as text. (default: json)
timeoutMs number optional Per-request time limit in milliseconds (max 600000).
Response Fields
topic-products
Products in a topic
topic object The resolved topic: id, slug, name, description, url, parent topic and sub-topic slugs.
products object[] Products in the topic.
products[].slug string Product slug — the handle for product-detail and product-comments.
products[].name string | null Product name.
products[].tagline string | null The one-line pitch shown under the name.
products[].url string Public Product Hunt page for the product.
products[].logoUrl string | null Logo image URL. Pass it to GET /media to download the file.
products[].reviewsCount number | null How many reviews the product has.
products[].reviewsRating number | null Average review rating.
products[].followersCount number | null Followers on Product Hunt.
products[].launchesCount number | null How many times the product has launched.
products[].isNoLongerOnline boolean Whether Product Hunt has marked the product as dead.
products[].latestLaunch object | null The product's most recent launch. Present on a topic listing, absent on a keyword search.
productCount number Number of products in this response.
totalCount number | null Products in the topic overall, not just on this page.
pagesScraped number Pages actually collected. Each page counts as one request against your plan.
pagesRequested number Pages the request asked for.
nextCursor string | null Pass back as cursor to continue, or null when the listing is exhausted.
hasNextPage boolean Whether more results are available beyond this response.
requestedUrl string The Product Hunt page this result corresponds to.
scrapedAt string ISO timestamp the result was collected at.
notes string[] Read this. Caveats about this specific result — a walk that stopped early, an upstream ceiling, or promoted entries that were dropped. An empty array means nothing was held back.
blocked boolean Always false on a successful response.
Request
curl -X POST "https://api.fetchlayer.dev/producthunt/topic-products" \
-H "Authorization: Bearer ss-your-key" \
-H "Content-Type: application/json" \
-d '{"topic":"developer-tools","sortBy":"most_recent_launch","limit":50}'Response
{
"topic": {
"slug": "developer-tools",
"name": "Developer Tools"
},
"productCount": 50,
"totalCount": 8421,
"hasNextPage": true,
"notes": [],
"products": [
{
"slug": "warp",
"name": "Warp",
"tagline": "The terminal reimagined",
"latestLaunch": {
"slug": "warp-3",
"launchedAt": "2026-09-08"
}
}
]
}