{
  "openapi": "3.0.1",
  "info": {
    "title": "Product Hunt Scraper",
    "description": "No-login Product Hunt scraper: daily/weekly/monthly/yearly leaderboards, full product & launch details, makers + hunter, comments, reviews & ratings, topic/category feeds, product search, and maker lead-gen (followers, Twitter, products). Optional BYO official API token.",
    "version": "0.0",
    "x-build-id": "drGsnrrZIvvQ4P8uh"
  },
  "servers": [
    {
      "url": "https://api.apify.com/v2"
    }
  ],
  "paths": {
    "/acts/brilliant_gum~producthunt-scraper/run-sync-get-dataset-items": {
      "post": {
        "operationId": "run-sync-get-dataset-items-brilliant_gum-producthunt-scraper",
        "x-openai-isConsequential": false,
        "summary": "Executes an Actor, waits for its completion, and returns Actor's dataset items in response.",
        "tags": [
          "Run Actor"
        ],
        "requestBody": {
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/inputSchema"
              }
            }
          }
        },
        "parameters": [
          {
            "name": "token",
            "in": "query",
            "required": true,
            "schema": {
              "type": "string"
            },
            "description": "Enter your Apify token here"
          }
        ],
        "responses": {
          "200": {
            "description": "OK"
          }
        }
      }
    },
    "/acts/brilliant_gum~producthunt-scraper/runs": {
      "post": {
        "operationId": "runs-sync-brilliant_gum-producthunt-scraper",
        "x-openai-isConsequential": false,
        "summary": "Executes an Actor and returns information about the initiated run in response.",
        "tags": [
          "Run Actor"
        ],
        "requestBody": {
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/inputSchema"
              }
            }
          }
        },
        "parameters": [
          {
            "name": "token",
            "in": "query",
            "required": true,
            "schema": {
              "type": "string"
            },
            "description": "Enter your Apify token here"
          }
        ],
        "responses": {
          "200": {
            "description": "OK",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/runsResponseSchema"
                }
              }
            }
          }
        }
      }
    },
    "/acts/brilliant_gum~producthunt-scraper/run-sync": {
      "post": {
        "operationId": "run-sync-brilliant_gum-producthunt-scraper",
        "x-openai-isConsequential": false,
        "summary": "Executes an Actor, waits for completion, and returns the OUTPUT from Key-value store in response.",
        "tags": [
          "Run Actor"
        ],
        "requestBody": {
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/inputSchema"
              }
            }
          }
        },
        "parameters": [
          {
            "name": "token",
            "in": "query",
            "required": true,
            "schema": {
              "type": "string"
            },
            "description": "Enter your Apify token here"
          }
        ],
        "responses": {
          "200": {
            "description": "OK"
          }
        }
      }
    }
  },
  "components": {
    "schemas": {
      "inputSchema": {
        "type": "object",
        "required": [
          "mode"
        ],
        "properties": {
          "mode": {
            "title": "Mode",
            "enum": [
              "leaderboard",
              "product-details",
              "search",
              "topic",
              "category",
              "collection",
              "maker-profile",
              "urls"
            ],
            "type": "string",
            "description": "What to scrape. 'leaderboard' = a daily/weekly/monthly/yearly ranked list of launches. 'product-details' = full launch + product records for productUrls/productSlugs. 'search' = product search for searchTerms. 'topic' = a topic feed for topics[]. 'category' = a category feed for categories[]. 'collection' = the products in curated collections for collectionUrls[]. 'maker-profile' = maker/hunter profiles for makerUsernames/makerUrls (lead-gen). 'urls' = mixed Product Hunt URLs in startUrls, auto-routed to the right handler.",
            "default": "leaderboard"
          },
          "leaderboardPeriod": {
            "title": "Leaderboard period",
            "enum": [
              "daily",
              "weekly",
              "monthly",
              "yearly"
            ],
            "type": "string",
            "description": "Leaderboard mode only. Which leaderboard to read: daily (a single day), weekly (an ISO week), monthly, or yearly.",
            "default": "daily"
          },
          "date": {
            "title": "Date (daily)",
            "pattern": "^\\d{4}-\\d{2}-\\d{2}$",
            "type": "string",
            "description": "Daily leaderboard date in YYYY-MM-DD (e.g. 2026-09-01). Leave empty for today's leaderboard (Product Hunt's day rolls over at midnight US Pacific time)."
          },
          "dateFrom": {
            "title": "Date from (daily range)",
            "pattern": "^\\d{4}-\\d{2}-\\d{2}$",
            "type": "string",
            "description": "Start date (YYYY-MM-DD) for an inclusive multi-day daily range. Overrides Date when set together with Date to."
          },
          "dateTo": {
            "title": "Date to (daily range)",
            "pattern": "^\\d{4}-\\d{2}-\\d{2}$",
            "type": "string",
            "description": "End date (YYYY-MM-DD) for an inclusive daily range. Used with Date from."
          },
          "week": {
            "title": "Week number (weekly)",
            "minimum": 1,
            "maximum": 53,
            "type": "integer",
            "description": "ISO week number 1-53 for the weekly leaderboard. Pair with Year. Leave empty for the current week."
          },
          "month": {
            "title": "Month (monthly)",
            "minimum": 1,
            "maximum": 12,
            "type": "integer",
            "description": "Month number 1-12 for the monthly leaderboard. Pair with Year. Leave empty for the current month."
          },
          "year": {
            "title": "Year (weekly/monthly/yearly)",
            "minimum": 2013,
            "maximum": 2035,
            "type": "integer",
            "description": "Four-digit year for weekly, monthly and yearly leaderboards (e.g. 2026). Leave empty for the current year."
          },
          "searchTerms": {
            "title": "Search terms",
            "type": "array",
            "description": "Search mode only. Product Hunt product search queries (e.g. \"AI\", \"note taking\"). One product-search record per result.",
            "items": {
              "type": "string"
            }
          },
          "topics": {
            "title": "Topic slugs",
            "type": "array",
            "description": "Topic mode only. Product Hunt topic slugs (e.g. artificial-intelligence, developer-tools, productivity). Find them in a topic page URL /topics/<slug>.",
            "items": {
              "type": "string"
            }
          },
          "categories": {
            "title": "Category slugs",
            "type": "array",
            "description": "Category mode only. Product Hunt category slugs (e.g. ai-code-editors). Find them in a category page URL /categories/<slug>.",
            "items": {
              "type": "string"
            }
          },
          "collectionUrls": {
            "title": "Collection URLs",
            "type": "array",
            "description": "Collection mode. Full Product Hunt collection URLs (e.g. https://www.producthunt.com/@user/collections/<slug> or /collections/<slug>). The products in each collection are returned.",
            "items": {
              "type": "string"
            }
          },
          "productUrls": {
            "title": "Product / launch URLs",
            "type": "array",
            "description": "Product-details mode. Full Product Hunt URLs: https://www.producthunt.com/products/<slug> or /posts/<slug>.",
            "items": {
              "type": "string"
            }
          },
          "productSlugs": {
            "title": "Product / launch slugs",
            "type": "array",
            "description": "Product-details mode. Bare product or launch slugs (e.g. kilocode or kilo-code-for-jetbrains-2), resolved as producthunt.com/products/<slug>.",
            "items": {
              "type": "string"
            }
          },
          "makerUsernames": {
            "title": "Maker usernames",
            "type": "array",
            "description": "Maker-profile mode. Product Hunt usernames, with or without the leading @ (e.g. fmerian or @fmerian).",
            "items": {
              "type": "string"
            }
          },
          "makerUrls": {
            "title": "Maker profile URLs",
            "type": "array",
            "description": "Maker-profile mode. Full Product Hunt profile URLs: https://www.producthunt.com/@<username>.",
            "items": {
              "type": "string"
            }
          },
          "startUrls": {
            "title": "Start URLs (mixed)",
            "type": "array",
            "description": "URLs mode. Mixed Product Hunt URLs — leaderboard, product/post, topic, category, search, or /@maker — each auto-routed to the correct handler. Advanced alternative to the fields above.",
            "items": {
              "type": "object",
              "required": [
                "url"
              ],
              "properties": {
                "url": {
                  "type": "string",
                  "title": "URL of a web page",
                  "format": "uri"
                }
              }
            }
          },
          "maxItems": {
            "title": "Max items",
            "minimum": 0,
            "type": "integer",
            "description": "Hard cap on the number of records saved for this run. 0 = unlimited (safety-capped). Counts launches + products + makers.",
            "default": 100
          },
          "maxPages": {
            "title": "Max feed pages per query",
            "minimum": 0,
            "type": "integer",
            "description": "For search/topic/category, the maximum number of result pages to page through per query (each page ~10-15 items). 0 = until Max items is reached or results run out.",
            "default": 0
          },
          "featuredOnly": {
            "title": "Featured launches only",
            "type": "boolean",
            "description": "Leaderboard mode: keep only launches Product Hunt marks as featured. Off = include every launch on the board.",
            "default": false
          },
          "includePromoted": {
            "title": "Include promoted listings",
            "type": "boolean",
            "description": "Include promoted / advertised launches (flagged with isPromoted:true). Off = strip promoted rows.",
            "default": false
          },
          "enrichLaunchDetails": {
            "title": "Enrich launch details",
            "type": "boolean",
            "description": "Leaderboard & URLs modes: fetch each launch's own page to add makers, hunter, media, product links, full description and product profile. One extra request per launch. Off = fast listing rows (rank, votes, comment count, topics, tagline, thumbnail).",
            "default": true
          },
          "enrichProductDetails": {
            "title": "Enrich product details (topic/category/search)",
            "type": "boolean",
            "description": "Topic, category and search modes return lightweight product cards (name, tagline, rating, review count, logo). Turn this on to fetch each product's page and upgrade it to a full launch record (votes, makers, description, media, socials). One extra request per product.",
            "default": false
          },
          "includeMakers": {
            "title": "Include makers & hunter",
            "type": "boolean",
            "description": "Include the makers[] array and the hunter for each launch (name, username, headline, avatar, profile URL). Available on enriched launch/product-detail records.",
            "default": true
          },
          "includeMedia": {
            "title": "Include media",
            "type": "boolean",
            "description": "Include the media[] gallery for each launch (screenshot image URLs and video metadata). Available on enriched records.",
            "default": true
          },
          "scrapeComments": {
            "title": "Scrape comments",
            "type": "boolean",
            "description": "Attach the launch's comments (body, author, votes, badges, replies) parsed from the public page — no API token needed. Only for enriched launch / product-detail records.",
            "default": false
          },
          "maxComments": {
            "title": "Max comments per launch",
            "minimum": 1,
            "type": "integer",
            "description": "Upper bound on comments attached per launch. The public page returns a sample of the most relevant comments (often far fewer than the total commentsCount); see commentsCaptured on the record.",
            "default": 20
          },
          "scrapeReviews": {
            "title": "Scrape reviews",
            "type": "boolean",
            "description": "Attach detailed product reviews: overall + per-dimension ratings (ease of use, reliability, value, customization), pros/cons, positive/negative feedback, author. Parsed from the public page.",
            "default": false
          },
          "maxReviews": {
            "title": "Max reviews per product",
            "minimum": 1,
            "type": "integer",
            "description": "Upper bound on reviews attached per product. The public page returns a sample of reviews (often far fewer than the total reviewsCount); see reviewsCaptured on the record.",
            "default": 20
          },
          "scrapeLaunchHistory": {
            "title": "Scrape launch history",
            "type": "boolean",
            "description": "Attach the product's visible past launches (name, slug, date, votes) to product-detail records.",
            "default": false
          },
          "scrapeAlternatives": {
            "title": "Scrape alternatives",
            "type": "boolean",
            "description": "Attach Product Hunt's listed alternative products to product-detail records.",
            "default": false
          },
          "includeBuiltWith": {
            "title": "Include product tech stack (built with)",
            "type": "boolean",
            "description": "Attach builtWith[] to product-detail records: the tools/products this product is built with (Product Hunt's 'built with' / product stack block), each with name, slug, url, tagline, logo, ratings and a shoutout note. Distinct from a maker's 'stacks' (tools a person uses). Off by default.",
            "default": false
          },
          "makerLeadEnrichment": {
            "title": "Maker lead enrichment",
            "type": "boolean",
            "description": "Maker-profile mode: include the maker's follower/following counts, Twitter handle, products they made, products they use (stacks), review activity and Kitty-coin rank for lead scoring.",
            "default": true
          },
          "enrichWebsiteEmails": {
            "title": "Harvest emails from product website",
            "type": "boolean",
            "description": "For each launch/product with a website, fetch that website and extract public contact emails (mailto: + text patterns, junk filtered). Cached per domain. Product Hunt does not expose personal maker emails, so this reads the product's own site only. Off by default.",
            "default": false
          },
          "verifyEmails": {
            "title": "Verify harvested emails (MX / SMTP)",
            "type": "boolean",
            "description": "Requires 'Harvest emails from product website'. Runs every harvested email through an MX + SMTP mailbox verifier (pure Node DNS/socket, no third-party service) and attaches emailsVerified[] = { email, status (valid/invalid/catch-all/role/disposable/unknown), confidence 0-100, mxFound, mxHost, smtpChecked, smtpBlocked, catchAll, note }. When outbound port 25 is blocked from the run host it degrades honestly to an MX-only verdict (mxFound true/false, smtpBlocked:true). Off by default.",
            "default": false
          },
          "apiToken": {
            "title": "Product Hunt API token (optional BYO)",
            "type": "string",
            "description": "Optional. YOUR OWN Product Hunt developer token (create free at producthunt.com/v2/oauth/applications -> Add an application -> Create developer token). When set, the actor can enrich launches via the official GraphQL API (api.producthunt.com/v2/api/graphql) for higher reliability and comment bodies at scale. Runs on your token / your rate limit. Left empty: the no-login website path is used, which already returns makers, comments and reviews."
          },
          "deduplicate": {
            "title": "Deduplicate",
            "type": "boolean",
            "description": "Drop records whose dedup key was already produced within this run.",
            "default": true
          },
          "maxConcurrency": {
            "title": "Max concurrency",
            "minimum": 1,
            "maximum": 20,
            "type": "integer",
            "description": "Number of detail pages fetched in parallel. 6-10 is a good range.",
            "default": 8
          },
          "maxRequestRetries": {
            "title": "Max request retries",
            "minimum": 0,
            "maximum": 12,
            "type": "integer",
            "description": "How many times to retry a page that could not be retrieved on the first attempt.",
            "default": 5
          },
          "proxy": {
            "title": "Proxy",
            "type": "object",
            "description": "Optional. Proxies are included and configured automatically — leave this empty and the actor picks the right route for each page on its own. Advanced users can pin their own proxy here."
          }
        }
      },
      "runsResponseSchema": {
        "type": "object",
        "properties": {
          "data": {
            "type": "object",
            "properties": {
              "id": {
                "type": "string"
              },
              "actId": {
                "type": "string"
              },
              "userId": {
                "type": "string"
              },
              "startedAt": {
                "type": "string",
                "format": "date-time",
                "example": "2025-01-08T00:00:00.000Z"
              },
              "finishedAt": {
                "type": "string",
                "format": "date-time",
                "example": "2025-01-08T00:00:00.000Z"
              },
              "status": {
                "type": "string",
                "example": "READY"
              },
              "meta": {
                "type": "object",
                "properties": {
                  "origin": {
                    "type": "string",
                    "example": "API"
                  },
                  "userAgent": {
                    "type": "string"
                  }
                }
              },
              "stats": {
                "type": "object",
                "properties": {
                  "inputBodyLen": {
                    "type": "integer",
                    "example": 2000
                  },
                  "rebootCount": {
                    "type": "integer",
                    "example": 0
                  },
                  "restartCount": {
                    "type": "integer",
                    "example": 0
                  },
                  "resurrectCount": {
                    "type": "integer",
                    "example": 0
                  },
                  "computeUnits": {
                    "type": "integer",
                    "example": 0
                  }
                }
              },
              "options": {
                "type": "object",
                "properties": {
                  "build": {
                    "type": "string",
                    "example": "latest"
                  },
                  "timeoutSecs": {
                    "type": "integer",
                    "example": 300
                  },
                  "memoryMbytes": {
                    "type": "integer",
                    "example": 1024
                  },
                  "diskMbytes": {
                    "type": "integer",
                    "example": 2048
                  }
                }
              },
              "buildId": {
                "type": "string"
              },
              "defaultKeyValueStoreId": {
                "type": "string"
              },
              "defaultDatasetId": {
                "type": "string"
              },
              "defaultRequestQueueId": {
                "type": "string"
              },
              "buildNumber": {
                "type": "string",
                "example": "1.0.0"
              },
              "containerUrl": {
                "type": "string"
              },
              "usage": {
                "type": "object",
                "properties": {
                  "ACTOR_COMPUTE_UNITS": {
                    "type": "integer",
                    "example": 0
                  },
                  "DATASET_READS": {
                    "type": "integer",
                    "example": 0
                  },
                  "DATASET_WRITES": {
                    "type": "integer",
                    "example": 0
                  },
                  "KEY_VALUE_STORE_READS": {
                    "type": "integer",
                    "example": 0
                  },
                  "KEY_VALUE_STORE_WRITES": {
                    "type": "integer",
                    "example": 1
                  },
                  "KEY_VALUE_STORE_LISTS": {
                    "type": "integer",
                    "example": 0
                  },
                  "REQUEST_QUEUE_READS": {
                    "type": "integer",
                    "example": 0
                  },
                  "REQUEST_QUEUE_WRITES": {
                    "type": "integer",
                    "example": 0
                  },
                  "DATA_TRANSFER_INTERNAL_GBYTES": {
                    "type": "integer",
                    "example": 0
                  },
                  "DATA_TRANSFER_EXTERNAL_GBYTES": {
                    "type": "integer",
                    "example": 0
                  },
                  "PROXY_RESIDENTIAL_TRANSFER_GBYTES": {
                    "type": "integer",
                    "example": 0
                  },
                  "PROXY_SERPS": {
                    "type": "integer",
                    "example": 0
                  }
                }
              },
              "usageTotalUsd": {
                "type": "number",
                "example": 0.00005
              },
              "usageUsd": {
                "type": "object",
                "properties": {
                  "ACTOR_COMPUTE_UNITS": {
                    "type": "integer",
                    "example": 0
                  },
                  "DATASET_READS": {
                    "type": "integer",
                    "example": 0
                  },
                  "DATASET_WRITES": {
                    "type": "integer",
                    "example": 0
                  },
                  "KEY_VALUE_STORE_READS": {
                    "type": "integer",
                    "example": 0
                  },
                  "KEY_VALUE_STORE_WRITES": {
                    "type": "number",
                    "example": 0.00005
                  },
                  "KEY_VALUE_STORE_LISTS": {
                    "type": "integer",
                    "example": 0
                  },
                  "REQUEST_QUEUE_READS": {
                    "type": "integer",
                    "example": 0
                  },
                  "REQUEST_QUEUE_WRITES": {
                    "type": "integer",
                    "example": 0
                  },
                  "DATA_TRANSFER_INTERNAL_GBYTES": {
                    "type": "integer",
                    "example": 0
                  },
                  "DATA_TRANSFER_EXTERNAL_GBYTES": {
                    "type": "integer",
                    "example": 0
                  },
                  "PROXY_RESIDENTIAL_TRANSFER_GBYTES": {
                    "type": "integer",
                    "example": 0
                  },
                  "PROXY_SERPS": {
                    "type": "integer",
                    "example": 0
                  }
                }
              }
            }
          }
        }
      }
    }
  }
}