Product Hunt API — Search Products by Keyword
Documentation menu
FetchLayer FetchLayer API

Search products by keyword

Search Product Hunt for products matching a keyword or phrase. Each match comes back with its slug, tagline, logo, review count and average rating, plus a cursor to page deeper. Use it to find the slug that product-detail and product-comments take.

POST /search-products Products
https://api.fetchlayer.dev/producthunt/search-products
OpenAPI JSON

Headers

Authorization string required

Bearer token — your FetchLayer API key.

Parameters

query string required

Keyword or phrase to search Product Hunt for.

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

search-products

Search products by keyword

query string

The keyword the search ran with.

products object[]

The matching products.

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.

productCount number

Number of products in this response.

pagesAvailable number | null

Total pages Product Hunt reports for this query, where it reports one.

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/search-products" \
  -H "Authorization: Bearer ss-your-key" \
  -H "Content-Type: application/json" \
  -d '{"query":"ai note taking","limit":30}'

Response

{
  "query": "ai note taking",
  "productCount": 30,
  "pagesScraped": 1,
  "hasNextPage": true,
  "notes": [],
  "products": [
    {
      "slug": "granola",
      "name": "Granola",
      "tagline": "The AI notepad for people in back-to-back meetings",
      "reviewsCount": 214,
      "reviewsRating": 4.9,
      "launchesCount": 3
    }
  ]
}