{
  "openapi": "3.0.1",
  "info": {
    "title": "Product Hunt Scraper",
    "description": "Scrape Product Hunt launches in bulk via the official API: name, tagline, upvotes, comments, review count and rating, topics, makers, hunter and launch date. Filter by topic and date range; sort by ranking, votes or newest; paginate deep. Export to JSON, CSV or Excel.",
    "version": "0.1",
    "x-build-id": "OsMUvabwdYpaBzmRf"
  },
  "servers": [
    {
      "url": "https://api.apify.com/v2"
    }
  ],
  "paths": {
    "/acts/scrapeworks~product-hunt-scraper/run-sync-get-dataset-items": {
      "post": {
        "operationId": "run-sync-get-dataset-items-scrapeworks-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/scrapeworks~product-hunt-scraper/runs": {
      "post": {
        "operationId": "runs-sync-scrapeworks-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/scrapeworks~product-hunt-scraper/run-sync": {
      "post": {
        "operationId": "run-sync-scrapeworks-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": {
          "developerToken": {
            "title": "Product Hunt Developer Token (easiest auth)",
            "type": "string",
            "description": "A Product Hunt API access token. THE EASIEST way to authenticate. Get one free in ~2 minutes: go to https://www.producthunt.com/v2/oauth/applications, click 'Add an application' (any name/redirect URL, e.g. https://example.com), open the app, and click 'Create Developer Token'. Paste that token here. Leave this empty ONLY if you are using the API Client ID + Secret fields instead."
          },
          "apiClientId": {
            "title": "API Client ID (alternative auth)",
            "type": "string",
            "description": "Alternative to the Developer Token: the 'API Key' (Client ID) of your Product Hunt application from https://www.producthunt.com/v2/oauth/applications. Provide this together with the API Client Secret and the actor will fetch a read-only access token for you (OAuth client_credentials - no login needed). Ignored if a Developer Token is set."
          },
          "apiClientSecret": {
            "title": "API Client Secret (alternative auth)",
            "type": "string",
            "description": "The 'API Secret' (Client Secret) of your Product Hunt application, paired with the API Client ID above. Ignored if a Developer Token is set."
          },
          "topics": {
            "title": "Topics (optional)",
            "uniqueItems": true,
            "type": "array",
            "description": "Optional list of Product Hunt topic slugs to scrape - EACH topic is queried and paginated deep independently, so more topics = more launches. Use the slug from a topic's URL, e.g. https://www.producthunt.com/topics/artificial-intelligence -> 'artificial-intelligence'. Display names ('Developer Tools') and full topic URLs are also accepted. LEAVE EMPTY to scan the WHOLE global launch feed instead of specific topics.",
            "items": {
              "type": "string"
            }
          },
          "sortBy": {
            "title": "Sort order",
            "enum": [
              "ranking",
              "votes",
              "newest",
              "featured"
            ],
            "type": "string",
            "description": "How to order the launches within each query. 'ranking' = Product Hunt's ranking (best for a topic's top launches), 'votes' = most upvoted first, 'newest' = most recently created first, 'featured' = most recently featured on the homepage first.",
            "default": "ranking"
          },
          "postedAfter": {
            "title": "Posted after (optional)",
            "type": "string",
            "description": "Only include launches posted ON OR AFTER this date (UTC). Format YYYY-MM-DD, e.g. 2024-01-01. Combine with 'Posted before' to pull a specific historical window - great for bulk (e.g. every launch of 2024). Leave empty for no lower bound."
          },
          "postedBefore": {
            "title": "Posted before (optional)",
            "type": "string",
            "description": "Only include launches posted ON OR BEFORE this date (UTC). Format YYYY-MM-DD, e.g. 2024-12-31. Leave empty for no upper bound."
          },
          "featuredOnly": {
            "title": "Featured launches only",
            "type": "boolean",
            "description": "If enabled, only return launches that were FEATURED on the Product Hunt homepage (the curated ones), skipping unfeatured submissions.",
            "default": false
          },
          "maxResultsPerQuery": {
            "title": "Max results per topic / query",
            "minimum": 1,
            "maximum": 100000,
            "type": "integer",
            "description": "Maximum launches to return for EACH topic (or for the global feed when no topics are set). The actor paginates automatically (20 launches per API request) and stops at this cap or at the real end of the feed. Set high to pull a whole topic; lower it to sample.",
            "default": 1000
          },
          "maxResults": {
            "title": "Max results overall (optional)",
            "minimum": 1,
            "maximum": 500000,
            "type": "integer",
            "description": "Optional overall cap across ALL topics/queries combined. Leave empty for no overall cap (each topic is still bounded by 'Max results per topic / query'). Useful to cap total billed rows for a run."
          }
        }
      },
      "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
                  }
                }
              }
            }
          }
        }
      }
    }
  }
}