Product Hunt API — Products by Topic
Documentation menu
FetchLayer FetchLayer API

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.

POST /topic-products Discovery
https://api.fetchlayer.dev/producthunt/topic-products
OpenAPI JSON

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"
      }
    }
  ]
}