{
  "openapi": "3.0.1",
  "info": {
    "title": "Product Hunt Scraper — Launches, Makers & Websites API",
    "description": "Scrape every Product Hunt launch (featured or all 300-800 per day) with upvotes, daily/weekly/monthly ranks, topics, and optional makers, websites, X/LinkedIn, followers, reviews, pricing, funding, and YC flag. Monitoring mode for daily alerts.",
    "version": "0.2",
    "x-build-id": "uP28bwkMxuSzu2200"
  },
  "servers": [
    {
      "url": "https://api.apify.com/v2"
    }
  ],
  "paths": {
    "/acts/spotless_studios~product-hunt-scraper/run-sync-get-dataset-items": {
      "post": {
        "operationId": "run-sync-get-dataset-items-spotless_studios-product-hunt-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/spotless_studios~product-hunt-scraper/runs": {
      "post": {
        "operationId": "runs-sync-spotless_studios-product-hunt-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/spotless_studios~product-hunt-scraper/run-sync": {
      "post": {
        "operationId": "run-sync-spotless_studios-product-hunt-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": {
          "launches": {
            "title": "Launches",
            "enum": [
              "featured",
              "all"
            ],
            "type": "string",
            "description": "Featured = the curated daily leaderboard (~15-40 per day). All = every launch posted that day, often 300-800, including unfeatured ones.",
            "default": "featured"
          },
          "dateFrom": {
            "title": "From date",
            "type": "string",
            "description": "First day (Pacific time, like Product Hunt). YYYY-MM-DD or relative, e.g. 7 days. Leave empty to use Start date + Days back."
          },
          "dateTo": {
            "title": "To date",
            "type": "string",
            "description": "Last day, YYYY-MM-DD or relative. Defaults to today."
          },
          "startDate": {
            "title": "Start date",
            "type": "string",
            "description": "Newest day to scrape when From date is empty (YYYY-MM-DD). Defaults to today, Pacific time."
          },
          "daysBack": {
            "title": "Days back",
            "minimum": 1,
            "maximum": 3650,
            "type": "integer",
            "description": "How many days to scrape counting back from Start date (1 = just that day).",
            "default": 1
          },
          "topics": {
            "title": "Topics",
            "type": "array",
            "description": "Keep launches tagged with any of these topics, e.g. Artificial Intelligence, Developer Tools, SaaS, Marketing.",
            "items": {
              "type": "string"
            }
          },
          "excludeTopics": {
            "title": "Exclude topics",
            "type": "array",
            "description": "Drop launches tagged with any of these topics.",
            "items": {
              "type": "string"
            }
          },
          "minVotes": {
            "title": "Min upvotes",
            "minimum": 0,
            "type": "integer",
            "description": "Keep launches with at least this many upvotes. Also stops paging early, because feeds are sorted by votes."
          },
          "maxVotes": {
            "title": "Max upvotes",
            "minimum": 0,
            "type": "integer",
            "description": "Keep launches with at most this many upvotes (find under-the-radar products)."
          },
          "minComments": {
            "title": "Min comments",
            "minimum": 0,
            "type": "integer",
            "description": "Keep launches with at least this many comments."
          },
          "maxDailyRank": {
            "title": "Top N of the day",
            "minimum": 1,
            "type": "integer",
            "description": "Keep only launches ranked this high or better on their day, e.g. 5 for the daily top 5."
          },
          "maxWeeklyRank": {
            "title": "Top N of the week",
            "minimum": 1,
            "type": "integer",
            "description": "Keep only launches ranked this high or better for their week."
          },
          "maxMonthlyRank": {
            "title": "Top N of the month",
            "minimum": 1,
            "type": "integer",
            "description": "Keep only launches ranked this high or better for their month."
          },
          "productUrls": {
            "title": "Direct product or launch URLs / slugs",
            "type": "array",
            "description": "Scrape specific Product Hunt products or posts directly (e.g. https://www.producthunt.com/products/linear or linear). When set without date inputs, skips leaderboard crawl.",
            "items": {
              "type": "string"
            }
          },
          "includeDetails": {
            "title": "Include product details",
            "type": "boolean",
            "description": "Adds the real website, description, makers and hunter (with headlines), X, LinkedIn, Facebook, Instagram, GitHub, app store links, followers, reviews, pricing type, categories, employee size, funding, and YC flag. Billed as an add-on per saved launch.",
            "default": false
          },
          "minFollowers": {
            "title": "Min followers",
            "minimum": 0,
            "type": "integer",
            "description": "Keep products with at least this many Product Hunt followers. Turns on details."
          },
          "minReviews": {
            "title": "Min reviews",
            "minimum": 0,
            "type": "integer",
            "description": "Keep products with at least this many reviews. Turns on details."
          },
          "minRating": {
            "title": "Min review rating",
            "type": "string",
            "description": "Average review rating from 0 to 5, e.g. 4.5. Turns on details."
          },
          "pricingTypes": {
            "title": "Pricing types",
            "type": "array",
            "description": "Keep launches with these pricing types: free, free_options (freemium), payment_required. Turns on details.",
            "items": {
              "type": "string"
            }
          },
          "yCombinatorOnly": {
            "title": "Y Combinator companies only",
            "type": "boolean",
            "description": "Keep products flagged as Y Combinator companies. Turns on details.",
            "default": false
          },
          "includeKeywords": {
            "title": "Include keywords",
            "type": "array",
            "description": "Keep launches whose name, tagline, topics, description, or maker headlines contain these words. /regex/ supported.",
            "items": {
              "type": "string"
            }
          },
          "excludeKeywords": {
            "title": "Exclude keywords",
            "type": "array",
            "description": "Drop launches containing any of these words or /regex/.",
            "items": {
              "type": "string"
            }
          },
          "keywordMatch": {
            "title": "Include keyword logic",
            "enum": [
              "any",
              "all"
            ],
            "type": "string",
            "description": "Require any or all include keywords.",
            "default": "any"
          },
          "onlyNewItems": {
            "title": "Only new launches (monitoring mode)",
            "type": "boolean",
            "description": "Remember launches from previous runs and save only new ones. Pair with a daily schedule.",
            "default": false
          },
          "stateKey": {
            "title": "Monitor name",
            "type": "string",
            "description": "Separate memory per saved search.",
            "default": "default"
          },
          "maxResults": {
            "title": "Max launches",
            "minimum": 1,
            "maximum": 1000000,
            "type": "integer",
            "description": "Stop after saving this many launches.",
            "default": 50
          },
          "outputPreset": {
            "title": "Data preset",
            "enum": [
              "full",
              "lean",
              "contacts"
            ],
            "type": "string",
            "description": "Quickly choose how much data to save per record: full record, lean summary, or contact & social links only.",
            "default": "full"
          },
          "outputFields": {
            "title": "Output fields",
            "type": "array",
            "description": "Save only these fields, in this order (e.g. name, tagline, votes, dailyRank, website, twitterUrl, makers). Supports nested dot-paths (e.g. makers.username). Empty keeps all fields from the selected preset.",
            "items": {
              "type": "string"
            }
          },
          "excludeFields": {
            "title": "Exclude fields",
            "type": "array",
            "description": "Remove specific fields (or nested dot-paths) from each saved record to keep datasets compact.",
            "items": {
              "type": "string"
            }
          },
          "includeEmptyFields": {
            "title": "Keep empty / null fields",
            "type": "boolean",
            "description": "When turned off, strips null, empty strings, empty arrays, and empty objects from every saved record.",
            "default": true
          },
          "requiredFields": {
            "title": "Required non-empty fields",
            "type": "array",
            "description": "Only save (and only pay for) records where every listed field or dot-path has a non-empty value (e.g. website, inquiryEmail).",
            "items": {
              "type": "string"
            }
          },
          "maxPagesPerDay": {
            "title": "Max pages per day",
            "minimum": 1,
            "maximum": 200,
            "type": "integer",
            "description": "About 17-20 launches per page.",
            "default": 60
          },
          "maxConcurrency": {
            "title": "Max concurrency",
            "minimum": 1,
            "maximum": 16,
            "type": "integer",
            "description": "Product pages fetched in parallel when details are on.",
            "default": 4
          },
          "minRequestIntervalMs": {
            "title": "Min delay between requests (ms)",
            "minimum": 0,
            "maximum": 10000,
            "type": "integer",
            "description": "Politeness delay; doubles automatically if Product Hunt rate-limits.",
            "default": 150
          },
          "maxRequestRetries": {
            "title": "Max retries",
            "minimum": 0,
            "maximum": 10,
            "type": "integer",
            "description": "Retries per request, rotating the browser fingerprint on bot checks.",
            "default": 4
          },
          "requestTimeoutSecs": {
            "title": "Request timeout (seconds)",
            "minimum": 5,
            "maximum": 180,
            "type": "integer",
            "description": "Timeout per request.",
            "default": 45
          },
          "proxyConfiguration": {
            "title": "Proxy",
            "type": "object",
            "description": "Optional. Runs usually work without a proxy.",
            "default": {
              "useApifyProxy": false
            }
          },
          "proxyEscalation": {
            "title": "Auto-escalate proxies when blocked",
            "type": "boolean",
            "description": "If the site blocks the run, automatically step up from a direct connection to Apify datacenter proxy, then residential proxy, only for the blocked site. Turn off to use exactly the proxy above.",
            "default": true
          }
        }
      },
      "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
                  }
                }
              }
            }
          }
        }
      }
    }
  }
}