# Product Hunt Scraper (`jungle_synthesizer/producthunt-scraper`) Actor

Scrape products, launch data, and maker profiles from Product Hunt via the official GraphQL API. Extract names, taglines, upvotes, maker details, and contact info. Filter by topics, date range, or browse all-time launches. Requires a free Product Hunt developer token.

- **URL**: https://apify.com/jungle\_synthesizer/producthunt-scraper.md
- **Developed by:** [BowTiedRaccoon](https://apify.com/jungle_synthesizer) (community)
- **Categories:** Lead generation, Developer tools, Business
- **Stats:** 2 total users, 1 monthly users, 0.0% runs succeeded, NaN bookmarks
- **User rating**: No ratings yet

## Pricing

Pay per event

This Actor is paid per event. You are not charged for the Apify platform usage, but only a fixed price for specific events.

Learn more: https://docs.apify.com/platform/actors/running/actors-in-store#pay-per-event

## What's an Apify Actor?

Actors are a software tools running on the Apify platform, for all kinds of web data extraction and automation use cases.
In Batch mode, an Actor accepts a well-defined JSON input, performs an action which can take anything from a few seconds to a few hours,
and optionally produces a well-defined JSON output, datasets with results, or files in key-value store.
In Standby mode, an Actor provides a web server which can be used as a website, API, or an MCP server.
Actors are written with capital "A".

## How to integrate an Actor?

If asked about integration, you help developers integrate Actors into their projects.
You adapt to their stack and deliver integrations that are safe, well-documented, and production-ready.
The best way to integrate Actors is as follows.

In JavaScript/TypeScript projects, use official [JavaScript/TypeScript client](https://docs.apify.com/api/client/js.md):

```bash
npm install apify-client
```

In Python projects, use official [Python client library](https://docs.apify.com/api/client/python.md):

```bash
pip install apify-client
```

In shell scripts, use [Apify CLI](https://docs.apify.com/cli/docs.md):

````bash
# MacOS / Linux
curl -fsSL https://apify.com/install-cli.sh | bash
# Windows
irm https://apify.com/install-cli.ps1 | iex
```bash

In AI frameworks, you might use the [Apify MCP server](https://docs.apify.com/platform/integrations/mcp.md).

If your project is in a different language, use the [REST API](https://docs.apify.com/api/v2.md).

For usage examples, see the [API](#api) section below.

For more details, see Apify documentation as [Markdown index](https://docs.apify.com/llms.txt) and [Markdown full-text](https://docs.apify.com/llms-full.txt).


# README

## Product Hunt Scraper

Extract product launch data, maker profiles, and engagement metrics from Product Hunt via the official GraphQL API. Filter by topic, date range, or browse all-time launches sorted by votes or recency.

### What you get

Each record contains:

| Field | Description |
|-------|-------------|
| `product_id` | Product Hunt internal product ID |
| `product_name` | Name of the product |
| `tagline` | Short one-liner |
| `description` | Full product description |
| `website_url` | Product's external website |
| `product_url` | Product Hunt listing URL |
| `thumbnail_url` | Product thumbnail image URL |
| `topics` | Comma-separated topic names |
| `launch_date` | ISO-8601 launch date on Product Hunt |
| `upvote_count` | Total upvotes |
| `comment_count` | Total comments |
| `review_count` | Total reviews |
| `rating` | Average rating (0-5) |
| `featured` | Whether the product was featured on the homepage |
| `pricing` | Pricing model (free, freemium, paid) |
| `maker_names` | Comma-separated maker names |
| `maker_usernames` | Comma-separated maker Product Hunt usernames |
| `maker_twitter` | Comma-separated maker Twitter/X handles |
| `hunter_name` | Name of the person who submitted the product |
| `hunter_username` | Product Hunt username of the hunter |
| `gallery_images` | Space-separated gallery image URLs |
| `scraped_at` | ISO-8601 scrape timestamp |

### Authentication — required

The Product Hunt GraphQL API requires a free developer bearer token. Get one in two steps:

1. Go to [producthunt.com/v2/oauth/applications](https://www.producthunt.com/v2/oauth/applications)
2. Create an application, then exchange your credentials for a bearer token:

```bash
curl -X POST https://api.producthunt.com/v2/oauth/token \
  -H "Content-Type: application/json" \
  -d '{
    "client_id": "YOUR_API_KEY",
    "client_secret": "YOUR_API_SECRET",
    "grant_type": "client_credentials"
  }'
````

Paste the returned `access_token` into the **API Token** input field.

### Input

| Parameter | Type | Default | Description |
|-----------|------|---------|-------------|
| `apiToken` | string | — | Required. Product Hunt developer bearer token |
| `filterMode` | select | `all` | `all`, `topic`, `date_range`, or `featured` |
| `topic` | string | — | Topic slug (e.g. `artificial-intelligence`). Required when `filterMode` is `topic` |
| `postedAfter` | string | — | ISO-8601 date (e.g. `2024-01-01T00:00:00Z`). Used with `date_range` mode |
| `postedBefore` | string | — | ISO-8601 date. Used with `date_range` mode |
| `sortOrder` | select | `VOTES` | `VOTES`, `NEWEST`, or `FEATURED` |
| `maxItems` | integer | 15 | Maximum records to return. Set to 0 for unlimited |

#### Example inputs

**All-time top products by votes:**

```json
{
  "apiToken": "your_token_here",
  "filterMode": "all",
  "sortOrder": "VOTES",
  "maxItems": 100
}
```

**AI products launched in 2024:**

```json
{
  "apiToken": "your_token_here",
  "filterMode": "topic",
  "topic": "artificial-intelligence",
  "sortOrder": "VOTES",
  "maxItems": 500
}
```

**Products launched in a specific month:**

```json
{
  "apiToken": "your_token_here",
  "filterMode": "date_range",
  "postedAfter": "2024-03-01T00:00:00Z",
  "postedBefore": "2024-03-31T23:59:59Z",
  "sortOrder": "NEWEST",
  "maxItems": 0
}
```

**Recently featured products:**

```json
{
  "apiToken": "your_token_here",
  "filterMode": "featured",
  "sortOrder": "NEWEST",
  "maxItems": 50
}
```

### Rate limits

The scraper uses a conservative 0.5-second delay between requests and fetches 20 products per page.

### Dataset views

Three pre-built views are available on the output dataset:

- **Product Overview** — name, tagline, upvotes, launch date, featured status, and URL
- **Full Product Record** — all 23 fields
- **Maker Contact Data** — product name, URL, maker names, usernames, Twitter handles, and hunter info

### Notes

- **No proxy required.** The Product Hunt API does not enforce geo or IP restrictions for authenticated requests.
- **`daily_rank`** is always `null`. This field is only available on the HTML leaderboard pages, which are protected by Cloudflare managed challenge. The GraphQL API does not expose it.
- **Maker emails and LinkedIn** are not exposed in the public API.
- **Pricing:** $0.10 per run + $0.001 per record.

# Actor input Schema

## `sp_intended_usage` (type: `string`):

Please describe how you plan to use the data extracted by this crawler.

## `sp_improvement_suggestions` (type: `string`):

Provide any feedback or suggestions for improvements.

## `sp_contact` (type: `string`):

Provide your email address so we can get in touch with you.

## `dry_run` (type: `boolean`):

If true, returns a single fixture record without calling the API. Used for validation and testing.

## `apiToken` (type: `string`):

Your Product Hunt developer access token. Get one free at producthunt.com/v2/oauth/applications — create an app and use the client\_credentials flow to obtain a bearer token.

## `filterMode` (type: `string`):

How to discover products. 'all' = browse all posts sorted by votes. 'topic' = posts within a topic. 'date\_range' = posts between two dates. 'featured' = only featured posts.

## `topic` (type: `string`):

Topic slug to filter by (e.g. 'artificial-intelligence', 'productivity', 'developer-tools'). Only used when filterMode is 'topic'.

## `postedAfter` (type: `string`):

ISO-8601 date — return products posted after this date (e.g. '2024-01-01T00:00:00Z'). Only used when filterMode is 'date\_range'.

## `postedBefore` (type: `string`):

ISO-8601 date — return products posted before this date (e.g. '2024-12-31T23:59:59Z'). Only used when filterMode is 'date\_range'.

## `sortOrder` (type: `string`):

Sort posts by votes (default), newest, or daily rank.

## `maxItems` (type: `integer`):

Maximum number of products to return. Set to 0 for unlimited (up to the API's full dataset).

## `proxyConfiguration` (type: `object`):

Proxy settings. The Product Hunt API does not require proxies for most regions.

## Actor input object example

```json
{
  "sp_intended_usage": "Describe your intended use...",
  "sp_improvement_suggestions": "Share your suggestions here...",
  "sp_contact": "Share your email here...",
  "dry_run": false,
  "filterMode": "all",
  "sortOrder": "VOTES",
  "maxItems": 15,
  "proxyConfiguration": {
    "useApifyProxy": false
  }
}
```

# Actor output Schema

## `results` (type: `string`):

No description

# API

You can run this Actor programmatically using our API. Below are code examples in JavaScript, Python, and CLI, as well as the OpenAPI specification and MCP server setup.

## JavaScript example

```javascript
import { ApifyClient } from 'apify-client';

// Initialize the ApifyClient with your Apify API token
// Replace the '<YOUR_API_TOKEN>' with your token
const client = new ApifyClient({
    token: '<YOUR_API_TOKEN>',
});

// Prepare Actor input
const input = {
    "sp_intended_usage": "Describe your intended use...",
    "sp_improvement_suggestions": "Share your suggestions here...",
    "sp_contact": "Share your email here...",
    "apiToken": "",
    "filterMode": "all",
    "topic": "",
    "postedAfter": "",
    "postedBefore": "",
    "sortOrder": "VOTES",
    "maxItems": 15,
    "proxyConfiguration": {
        "useApifyProxy": false
    }
};

// Run the Actor and wait for it to finish
const run = await client.actor("jungle_synthesizer/producthunt-scraper").call(input);

// Fetch and print Actor results from the run's dataset (if any)
console.log('Results from dataset');
console.log(`💾 Check your data here: https://console.apify.com/storage/datasets/${run.defaultDatasetId}`);
const { items } = await client.dataset(run.defaultDatasetId).listItems();
items.forEach((item) => {
    console.dir(item);
});

// 📚 Want to learn more 📖? Go to → https://docs.apify.com/api/client/js/docs

```

## Python example

```python
from apify_client import ApifyClient

# Initialize the ApifyClient with your Apify API token
# Replace '<YOUR_API_TOKEN>' with your token.
client = ApifyClient("<YOUR_API_TOKEN>")

# Prepare the Actor input
run_input = {
    "sp_intended_usage": "Describe your intended use...",
    "sp_improvement_suggestions": "Share your suggestions here...",
    "sp_contact": "Share your email here...",
    "apiToken": "",
    "filterMode": "all",
    "topic": "",
    "postedAfter": "",
    "postedBefore": "",
    "sortOrder": "VOTES",
    "maxItems": 15,
    "proxyConfiguration": { "useApifyProxy": False },
}

# Run the Actor and wait for it to finish
run = client.actor("jungle_synthesizer/producthunt-scraper").call(run_input=run_input)

# Fetch and print Actor results from the run's dataset (if there are any)
print("💾 Check your data here: https://console.apify.com/storage/datasets/" + run["defaultDatasetId"])
for item in client.dataset(run["defaultDatasetId"]).iterate_items():
    print(item)

# 📚 Want to learn more 📖? Go to → https://docs.apify.com/api/client/python/docs/quick-start

```

## CLI example

```bash
echo '{
  "sp_intended_usage": "Describe your intended use...",
  "sp_improvement_suggestions": "Share your suggestions here...",
  "sp_contact": "Share your email here...",
  "apiToken": "",
  "filterMode": "all",
  "topic": "",
  "postedAfter": "",
  "postedBefore": "",
  "sortOrder": "VOTES",
  "maxItems": 15,
  "proxyConfiguration": {
    "useApifyProxy": false
  }
}' |
apify call jungle_synthesizer/producthunt-scraper --silent --output-dataset

```

## MCP server setup

```json
{
    "mcpServers": {
        "apify": {
            "command": "npx",
            "args": [
                "mcp-remote",
                "https://mcp.apify.com/?tools=jungle_synthesizer/producthunt-scraper",
                "--header",
                "Authorization: Bearer <YOUR_API_TOKEN>"
            ]
        }
    }
}

```

## OpenAPI specification

```json
{
    "openapi": "3.0.1",
    "info": {
        "title": "Product Hunt Scraper",
        "description": "Scrape products, launch data, and maker profiles from Product Hunt via the official GraphQL API. Extract names, taglines, upvotes, maker details, and contact info. Filter by topics, date range, or browse all-time launches. Requires a free Product Hunt developer token.",
        "version": "1.0",
        "x-build-id": "Ay9h20bnrDbXdmcOW"
    },
    "servers": [
        {
            "url": "https://api.apify.com/v2"
        }
    ],
    "paths": {
        "/acts/jungle_synthesizer~producthunt-scraper/run-sync-get-dataset-items": {
            "post": {
                "operationId": "run-sync-get-dataset-items-jungle_synthesizer-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/jungle_synthesizer~producthunt-scraper/runs": {
            "post": {
                "operationId": "runs-sync-jungle_synthesizer-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/jungle_synthesizer~producthunt-scraper/run-sync": {
            "post": {
                "operationId": "run-sync-jungle_synthesizer-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",
                "properties": {
                    "sp_intended_usage": {
                        "title": "What is the intended usage of this data?",
                        "minLength": 1,
                        "type": "string",
                        "description": "Please describe how you plan to use the data extracted by this crawler."
                    },
                    "sp_improvement_suggestions": {
                        "title": "How can we improve this crawler for you?",
                        "minLength": 1,
                        "type": "string",
                        "description": "Provide any feedback or suggestions for improvements."
                    },
                    "sp_contact": {
                        "title": "Contact Email",
                        "minLength": 1,
                        "type": "string",
                        "description": "Provide your email address so we can get in touch with you."
                    },
                    "dry_run": {
                        "title": "Dry Run",
                        "type": "boolean",
                        "description": "If true, returns a single fixture record without calling the API. Used for validation and testing.",
                        "default": false
                    },
                    "apiToken": {
                        "title": "Product Hunt API Token",
                        "type": "string",
                        "description": "Your Product Hunt developer access token. Get one free at producthunt.com/v2/oauth/applications — create an app and use the client_credentials flow to obtain a bearer token."
                    },
                    "filterMode": {
                        "title": "Filter Mode",
                        "enum": [
                            "all",
                            "topic",
                            "date_range",
                            "featured"
                        ],
                        "type": "string",
                        "description": "How to discover products. 'all' = browse all posts sorted by votes. 'topic' = posts within a topic. 'date_range' = posts between two dates. 'featured' = only featured posts.",
                        "default": "all"
                    },
                    "topic": {
                        "title": "Topic Slug",
                        "type": "string",
                        "description": "Topic slug to filter by (e.g. 'artificial-intelligence', 'productivity', 'developer-tools'). Only used when filterMode is 'topic'."
                    },
                    "postedAfter": {
                        "title": "Posted After (UTC)",
                        "type": "string",
                        "description": "ISO-8601 date — return products posted after this date (e.g. '2024-01-01T00:00:00Z'). Only used when filterMode is 'date_range'."
                    },
                    "postedBefore": {
                        "title": "Posted Before (UTC)",
                        "type": "string",
                        "description": "ISO-8601 date — return products posted before this date (e.g. '2024-12-31T23:59:59Z'). Only used when filterMode is 'date_range'."
                    },
                    "sortOrder": {
                        "title": "Sort Order",
                        "enum": [
                            "VOTES",
                            "NEWEST",
                            "FEATURED"
                        ],
                        "type": "string",
                        "description": "Sort posts by votes (default), newest, or daily rank.",
                        "default": "VOTES"
                    },
                    "maxItems": {
                        "title": "Max Items",
                        "type": "integer",
                        "description": "Maximum number of products to return. Set to 0 for unlimited (up to the API's full dataset).",
                        "default": 15
                    },
                    "proxyConfiguration": {
                        "title": "Proxy configuration",
                        "type": "object",
                        "description": "Proxy settings. The Product Hunt API does not require proxies for most regions."
                    }
                }
            },
            "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
                                    }
                                }
                            }
                        }
                    }
                }
            }
        }
    }
}
```
