{
  "openapi": "3.0.1",
  "info": {
    "title": "Product Hunt – Products, Launches, Makers & Reviews",
    "description": "Extract producthunt.com data including products, launches, keyword search results, maker profiles, reviews, categories, media, social links, product websites, and optional public contact emails.",
    "version": "0.1",
    "x-build-id": "l38AYgewFo7OpEAWb"
  },
  "servers": [
    {
      "url": "https://api.apify.com/v2"
    }
  ],
  "paths": {
    "/acts/abotapi~product-hunt-launches-scraper/run-sync-get-dataset-items": {
      "post": {
        "operationId": "run-sync-get-dataset-items-abotapi-product-hunt-launches-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/abotapi~product-hunt-launches-scraper/runs": {
      "post": {
        "operationId": "runs-sync-abotapi-product-hunt-launches-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/abotapi~product-hunt-launches-scraper/run-sync": {
      "post": {
        "operationId": "run-sync-abotapi-product-hunt-launches-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",
        "properties": {
          "mode": {
            "title": "Input mode",
            "enum": [
              "url",
              "keyword"
            ],
            "type": "string",
            "description": "Select URL list for fixed Product Hunt pages or Keyword search for generated search pages. Precedence: the selected mode decides which input is used; Start URLs are ignored in Keyword search mode and keyword fields are ignored in URL list mode.",
            "default": "keyword"
          },
          "startUrls": {
            "title": "Product Hunt URLs",
            "type": "array",
            "description": "Paste Product Hunt homepage, search (including &page=N), leaderboard (daily, weekly, monthly), topic or topics index, category or categories index, collection, product (legacy /posts/ links are mapped to /products/), or maker profile URLs. Listing pages expand into product records. Maker profiles sit behind an access challenge on some connections: a profile that cannot be read logs a warning and returns no row.",
            "default": [
              {
                "url": "https://www.producthunt.com/"
              },
              {
                "url": "https://www.producthunt.com/search?q=ai"
              },
              {
                "url": "https://www.producthunt.com/search?q=ai&page=2"
              },
              {
                "url": "https://www.producthunt.com/leaderboard/daily/2026/5/22"
              },
              {
                "url": "https://www.producthunt.com/leaderboard/weekly/2026/20"
              },
              {
                "url": "https://www.producthunt.com/leaderboard/monthly/2026/4"
              },
              {
                "url": "https://www.producthunt.com/topics"
              },
              {
                "url": "https://www.producthunt.com/topics/artificial-intelligence"
              },
              {
                "url": "https://www.producthunt.com/topics/artificial-intelligence?page=2"
              },
              {
                "url": "https://www.producthunt.com/categories"
              },
              {
                "url": "https://www.producthunt.com/categories/ai-coding-agents"
              },
              {
                "url": "https://www.producthunt.com/collections"
              },
              {
                "url": "https://www.producthunt.com/collections/0-design-tools"
              },
              {
                "url": "https://www.producthunt.com/products/bolt-new"
              }
            ],
            "items": {
              "type": "object",
              "required": [
                "url"
              ],
              "properties": {
                "url": {
                  "type": "string",
                  "title": "URL of a web page",
                  "format": "uri"
                }
              }
            }
          },
          "searchTerms": {
            "title": "Keyword search terms",
            "type": "array",
            "description": "Product Hunt keywords to search. Each term is converted to a Product Hunt search URL and expanded into product rows.",
            "items": {
              "type": "string"
            }
          },
          "searchSort": {
            "title": "Keyword search sort",
            "enum": [
              "relevance",
              "popular",
              "newest"
            ],
            "type": "string",
            "description": "Sort applied to generated keyword search URLs.",
            "default": "relevance"
          },
          "searchCategories": {
            "title": "Keyword categories",
            "type": "array",
            "description": "Restrict generated keyword searches to one or more common Product Hunt categories. Leave empty to search all categories.",
            "items": {
              "type": "string",
              "enum": [
                "ai-coding-agents",
                "vibe-coding",
                "ai-code-editors",
                "llms",
                "ai-chatbots",
                "ai-infrastructure",
                "prompt-engineering-tools",
                "productivity",
                "ai-workflow-automation",
                "lead-generation",
                "marketing-automation",
                "design-creative",
                "video-editing",
                "design-resources",
                "graphic-design-tools",
                "social-networking",
                "professional-networking",
                "finance",
                "accounting",
                "fundraising-resources",
                "investing",
                "no-code-platforms",
                "figma-plugins",
                "static-site-generators",
                "automation",
                "engineering-development"
              ],
              "enumTitles": [
                "AI Coding Agents",
                "Vibe Coding Tools",
                "AI Code Editors",
                "LLMs",
                "AI Chatbots",
                "AI Infrastructure Tools",
                "Prompt Engineering Tools",
                "Productivity",
                "AI Workflow Automation",
                "Lead generation software",
                "Marketing automation platforms",
                "Design & Creative",
                "Video editing",
                "Design resources",
                "Graphic design tools",
                "Social Networking",
                "Professional networking platforms",
                "Finance",
                "Accounting software",
                "Fundraising resources",
                "Investing",
                "No-code Platforms",
                "Figma Plugins",
                "Static site generators",
                "Automation tools",
                "Engineering & Development"
              ]
            },
            "default": []
          },
          "searchCategorySlugs": {
            "title": "Custom categories (name or slug)",
            "type": "array",
            "description": "Advanced: Product Hunt categories not listed above, as a name shown on the Product Hunt categories page (for example AI Engineer) or a slug (ai-engineer). Names are resolved against the live categories page; an unknown name stops the run with a clear error. Combined with Keyword categories.",
            "items": {
              "type": "string"
            }
          },
          "enrichEmails": {
            "title": "Find contact emails on product websites",
            "type": "boolean",
            "description": "When enabled, the Actor checks each product website for public contact emails. Disable for faster Product Hunt-only metadata.",
            "default": true
          },
          "includeReviews": {
            "title": "Include product reviews",
            "type": "boolean",
            "description": "Include review summaries that are publicly present on Product Hunt product pages.",
            "default": true
          },
          "outputReviewsAsRows": {
            "title": "Output reviews as separate rows",
            "type": "boolean",
            "description": "When enabled, each extracted review is also saved as its own dataset row after the product row.",
            "default": false
          },
          "maxReviewsPerProduct": {
            "title": "Max reviews per product",
            "minimum": 0,
            "maximum": 100,
            "type": "integer",
            "description": "Upper bound on review rows per product. The product page embeds only about 3 reviews, so more are loaded from the product's reviews pages (10 per page) until this cap or the product's review count is reached. Defaults to 20; set 0 to omit review details while keeping review counts. Capped at 100.",
            "default": 20
          },
          "maxItems": {
            "title": "Max items",
            "minimum": 1,
            "maximum": 100000,
            "type": "integer",
            "description": "Hard cap on total dataset rows. This is the only finite default cap.",
            "default": 20
          },
          "maxSearchResultsPerTerm": {
            "title": "Max search candidates per keyword",
            "minimum": 1,
            "maximum": 100000,
            "type": "integer",
            "description": "Maximum search candidates scanned per keyword before record-level filters are applied. Leave empty to scan enough candidates to satisfy Max items."
          },
          "minReviewsCount": {
            "title": "Minimum reviews",
            "minimum": 0,
            "type": "integer",
            "description": "Only keep product rows with at least this many Product Hunt reviews. Leave empty for no review-count filter."
          },
          "minFollowersCount": {
            "title": "Minimum followers",
            "minimum": 0,
            "type": "integer",
            "description": "Only keep product rows with at least this many Product Hunt followers. Leave empty for no follower-count filter."
          },
          "websiteRequired": {
            "title": "Require product website",
            "type": "boolean",
            "description": "Only keep products that expose an external website URL.",
            "default": false
          },
          "socialLinkRequired": {
            "title": "Require social or source link",
            "type": "boolean",
            "description": "Only keep products that expose at least one external social or source-code link.",
            "default": false
          },
          "scrapeMakers": {
            "title": "Include makers",
            "type": "boolean",
            "description": "Include the launch makers (name, username, profile URL, avatar) on every product row, read from the product page. No extra requests are made.",
            "default": true
          },
          "saveWebsiteContent": {
            "title": "Save website text",
            "type": "boolean",
            "description": "Also save the visible text of each product's own website (first 5,000 characters) in websiteRawText. Off by default; adds one website fetch per product when email harvesting is off.",
            "default": false
          },
          "archiveDate": {
            "title": "Archive: day (YYYY-MM-DD)",
            "type": "string",
            "description": "Scrape that day's leaderboard (adds https://www.producthunt.com/leaderboard/daily/YYYY/M/D to the URLs). Works in any input mode."
          },
          "archiveWeek": {
            "title": "Archive: week number (1-53)",
            "minimum": 1,
            "maximum": 53,
            "type": "integer",
            "description": "Scrape that week's leaderboard. The year comes from Archive year, or the current year when empty."
          },
          "archiveYear": {
            "title": "Archive: year",
            "minimum": 2013,
            "maximum": 2100,
            "type": "integer",
            "description": "Alone: the yearly leaderboard. With Archive week: the year of that week."
          },
          "filter": {
            "title": "Launch filter (JSON)",
            "type": "object",
            "description": "Optional launch filter: minVotes and maxVotes keep products whose latest launch upvotes fall in the range; topNProducts caps the number of products (never above Max items).",
            "default": {}
          },
          "proxy": {
            "title": "Proxy configuration",
            "type": "object",
            "description": "Apify Proxy is optional for light runs. If Product Hunt rate-limits your run, enable proxy or choose Residential."
          },
          "resumeFromRunId": {
            "title": "Resume from a previous run",
            "type": "string",
            "description": "Paste a previous run ID or dataset ID to continue a large crawl without returning or charging for rows already collected there. Use this after an interrupted run, or when continuing a big pull across another run. For recurring monitoring of the same search, use Incremental mode below instead."
          },
          "incrementalMode": {
            "title": "Incremental changes for scheduled runs",
            "type": "boolean",
            "description": "Turn this on for daily or recurring monitoring. The first run returns all matching products as NEW. Later runs normally return only NEW, UPDATED, and REAPPEARED products. Turn on \"Emit unchanged\" or \"Emit expired\" only when you also want those products returned (and billed). Maker and review rows are never suppressed by this mode. State is kept separately for each search/URL and filter/enrichment setup; use State key when you want to name or deliberately share a monitoring campaign. To continue one specific interrupted run instead, use Resume from a previous run above. A product counts as UPDATED when any returned field changes (for example description, tagline, topics, links, followers, review count, rating or reviews). Scrape timestamps, rotating image URL query strings and the order of harvested emails never count; use \"Ignore fields when detecting changes\" to exclude more.",
            "default": false
          },
          "stateKey": {
            "title": "State key (optional, incremental mode only)",
            "type": "string",
            "description": "Optional. Name this monitoring campaign to keep its state stable, or to deliberately share state across differently-configured runs. Leave empty to let the actor derive a key automatically from the search/URL and filter/enrichment settings — different searches then never mix state with each other."
          },
          "emitUnchanged": {
            "title": "Emit unchanged products (incremental mode only)",
            "type": "boolean",
            "description": "Off by default. Turn on to also return products that have not changed since the last run, marked UNCHANGED. This returns — and bills — extra rows you already have, so leave it off unless you specifically want the full snapshot every run.",
            "default": false
          },
          "emitExpired": {
            "title": "Emit expired products (incremental mode only)",
            "type": "boolean",
            "description": "Off by default. Turn on to also return products that were present in a previous run but are no longer found, marked EXPIRED. Only produced once a run has fully scanned the tracked search/URL set — not when Max items or Max search candidates capped it, when a pasted URL starts at a page after the first, or when Resume was used. This returns — and bills — extra synthetic rows, so leave it off unless you need expiry tracking.",
            "default": false
          },
          "ignoreFieldsForChanges": {
            "title": "Ignore fields when detecting changes (incremental mode only)",
            "type": "array",
            "description": "Field names that must NOT make a product count as UPDATED in incremental mode, for example reviews, media or followersCount. Matches top-level and nested field names; the fields are still returned in the output. Rotating image/CDN URL query strings, scrape timestamps and the order of harvested emails are already ignored automatically. Leave empty to compare every field.",
            "default": [],
            "items": {
              "type": "string"
            }
          },
          "mcpConnectors": {
            "title": "Pipe results into your apps (optional)",
            "type": "array",
            "description": "Optionally send the scraped results into the apps you already use, via Model Context Protocol (MCP) connectors. Authorize a connector once under Apify → Settings → Integrations, then select it here. The connector receives a condensed, human-readable summary per item (title + key fields), not the full JSON; the complete record stays in the dataset. Leave empty to skip. Supported: Notion (https://mcp.notion.com/mcp), Linear (https://mcp.linear.app/sse), Airtable (https://mcp.airtable.com/mcp), Apify (https://mcp.apify.com)."
          },
          "notionParentPageUrl": {
            "title": "Notion parent page (Notion connector only)",
            "type": "string",
            "description": "URL (or id) of the Notion page under which item pages are created. Required to enable the Notion export; ignored by other connectors."
          },
          "maxNotifyListings": {
            "title": "Max items to export per connector",
            "minimum": 1,
            "maximum": 1000,
            "type": "integer",
            "description": "Cap on items written to each connector per run. Does not affect the dataset.",
            "default": 50
          }
        }
      },
      "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
                  },
                  "PROXY_UNBLOCKER_UNITS": {
                    "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
                  },
                  "PROXY_UNBLOCKER_UNITS": {
                    "type": "integer",
                    "example": 0
                  }
                }
              }
            }
          }
        }
      }
    }
  }
}