# Product Hunt Scraper — Launches, Upvotes & Makers (`northglasslabs/producthunt-scraper`) Actor

Scrape Product Hunt's current ranked or newest server-rendered listings. Returns product names, taglines, URLs, upvotes, makers, topics, and dates. Optionally filter the visible listing by name, tagline, or topic.

- **URL**: https://apify.com/northglasslabs/producthunt-scraper.md
- **Developed by:** [North Glass Labs](https://apify.com/northglasslabs) (community)
- **Categories:** Social media
- **Stats:** 2 total users, 0 monthly users, 100.0% runs succeeded, 0 bookmarks
- **User rating**: No ratings yet

## Pricing

from $2.34 / 1,000 result storeds

This Actor is paid per event. You are not charged for the Apify platform usage, but only a fixed price for specific events.
Since this Actor supports Apify Store discounts, the price gets lower the higher subscription plan you have.

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/docs.md):

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

In Python projects, use official [Python client library](https://docs.apify.com/api/client/python/docs.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/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 — Launches, Upvotes, Makers & Topics

Scrape **Product Hunt's current server-rendered listings** with structured metadata: product name, tagline, URL, upvote count, makers, topic tags, and launch dates. Pull the current ranked or newest listing and optionally filter those visible launches by keyword. Export clean data for market research, lead generation, and competitive analysis.

### What it does

The Product Hunt Scraper actor extracts structured data from Product Hunt's current ranked or newest server-rendered listings. Leave the filter empty to return the visible launches, or provide a keyword to filter those launches by product name, tagline, or topic. It does not claim to search Product Hunt's entire historical catalog, whose dedicated search page is currently client-rendered.

Each launch returned includes the product name, one-line tagline, direct Product Hunt URL, upvote count (a key signal of market traction), the makers behind the product with links to their Product Hunt profiles, topical category tags (e.g. "Artificial Intelligence", "Productivity"), and the launch date. The actor parses both listing pages and individual product pages, using JSON-LD structured data as the primary source and falling back to HTML element parsing for robustness.

This makes the actor ideal for market intelligence, startup research, lead generation (discover makers for outreach), competitive monitoring (track upvotes and launch timing), and content curation (build newsletters and roundups of trending products).

### Input parameters

| Parameter | Type | Required | Default | Description |
|-----------|------|----------|---------|-------------|
| `searchQuery` | string | No | `""` | Optional local filter applied to the current listing's product names, taglines, and topics. Leave empty to return all visible launches. |
| `maxResults` | integer | No | `50` | Maximum number of launches to scrape (1–500). |
| `sortBy` | string | No | `popular` | Sort order for results. One of: `newest`, `popular`, `top`. |

### Output fields

Each result item pushed to the dataset contains:

| Field | Type | Description |
|-------|------|-------------|
| `name` | string | Product name as shown on Product Hunt |
| `tagline` | string \| null | One-line product description / tagline |
| `url` | string | Direct URL to the product page on producthunt.com |
| `upvotes` | integer | Upvote count the launch has received |
| `makers` | array of objects | List of makers, each with `name` (string) and `profile` (Product Hunt profile URL) |
| `topics` | array of strings | Topic / category tags (e.g. `["Artificial Intelligence", "Productivity"]`) |
| `launchDate` | string \| null | Launch date (ISO-8601 or human-readable, depending on source) |

### Use cases

- **Market research** — track current launches and emerging themes in the ranked or newest listings
- **Lead generation** — discover product makers and their profiles for sales outreach or recruiting
- **Competitive analysis** — monitor competitor upvotes, launch timing, and market reception
- **Investment scouting** — discover promising startups early, before they appear on mainstream radars
- **Content curation** — build newsletters, blog roundups, and social media posts featuring top launches
- **Trend tracking** — identify which product categories are gaining the most traction over time

### How it works

The actor uses **httpx** (an async HTTP client) and **BeautifulSoup4** (an HTML parser) to scrape Product Hunt. The process works in two stages:

1. **Discovery** — The actor fetches Product Hunt's server-rendered ranked homepage or newest listing. It parses modern listing cards for launch URLs, names, upvotes, taglines, and topics. If `searchQuery` is supplied, the Actor applies it locally to those fields. JSON-LD is used as a supplementary source, and review sub-pages are excluded.

2. **Detail enrichment** — For each matching launch (up to `maxResults`), the actor visits the individual product page and extracts additional metadata when available: structured product data, dates, maker profile links, and topic links. Listing-level and page-level data are merged.

A polite 1-second delay is applied between launch-page requests to respect Product Hunt's servers. Browser-like User-Agent headers reduce the likelihood of interstitials.

### Example usage

#### Example input

```json
{
    "searchQuery": "AI tools",
    "maxResults": 25,
    "sortBy": "newest"
}
````

#### Example output

```json
{
    "name": "AI Photo Enhancer Pro",
    "tagline": "Upscale and restore photos with AI in seconds",
    "url": "https://www.producthunt.com/posts/ai-photo-enhancer-pro",
    "upvotes": 234,
    "makers": [
        { "name": "Jane Doe", "profile": "https://www.producthunt.com/@janedoe" }
    ],
    "topics": ["Artificial Intelligence", "Photography", "Productivity"],
    "launchDate": "2025-06-15"
}
```

### Pricing

This actor uses the **pay-per-event (PPE)** pricing model on Apify. You are charged a small fee for each successful actor run. Because this actor scrapes individual product pages sequentially (with a polite 1-second delay between requests), runs take longer than pure API-based actors — a typical 50-launch scrape takes about 1 minute. The cost scales with the number of pages fetched, so `maxResults` directly impacts run time and price. Check the actor's Apify Store page for the current per-run pricing.

### Tips

- **Use the optional filter narrowly** — `searchQuery` filters the products currently visible in the ranked or newest listing; it is not a full-catalog Product Hunt search.
- **Choose the listing** — `newest` uses Product Hunt's newest page. `popular` and `top` currently use the server-rendered ranked homepage because Product Hunt does not expose a separate server-rendered all-time view.
- **Keep `maxResults` reasonable for speed** — each launch requires a separate page fetch with a 1-second delay. A `maxResults` of 50 takes about 1 minute; 500 takes about 8 minutes. Start small and scale up as needed.

# Actor input Schema

## `searchQuery` (type: `string`):

Optional local filter for the current ranked/newest listing. Matches product names, taglines, and topics; this is not a full-catalog Product Hunt search.

## `maxResults` (type: `integer`):

Maximum number of launches to scrape.

## `sortBy` (type: `string`):

How to sort results: newest, popular, or top.

## Actor input object example

```json
{
  "searchQuery": "",
  "maxResults": 50,
  "sortBy": "popular"
}
```

# 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 = {};

// Run the Actor and wait for it to finish
const run = await client.actor("northglasslabs/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 = {}

# Run the Actor and wait for it to finish
run = client.actor("northglasslabs/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 '{}' |
apify call northglasslabs/producthunt-scraper --silent --output-dataset

```

## MCP server setup

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

```

## OpenAPI specification

```json
{
    "openapi": "3.0.1",
    "info": {
        "title": "Product Hunt Scraper — Launches, Upvotes & Makers",
        "description": "Scrape Product Hunt's current ranked or newest server-rendered listings. Returns product names, taglines, URLs, upvotes, makers, topics, and dates. Optionally filter the visible listing by name, tagline, or topic.",
        "version": "0.0",
        "x-build-id": "d4XZUFkuxTfu3pPUE"
    },
    "servers": [
        {
            "url": "https://api.apify.com/v2"
        }
    ],
    "paths": {
        "/acts/northglasslabs~producthunt-scraper/run-sync-get-dataset-items": {
            "post": {
                "operationId": "run-sync-get-dataset-items-northglasslabs-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/northglasslabs~producthunt-scraper/runs": {
            "post": {
                "operationId": "runs-sync-northglasslabs-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/northglasslabs~producthunt-scraper/run-sync": {
            "post": {
                "operationId": "run-sync-northglasslabs-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": {
                    "searchQuery": {
                        "title": "Search query",
                        "type": "string",
                        "description": "Optional local filter for the current ranked/newest listing. Matches product names, taglines, and topics; this is not a full-catalog Product Hunt search.",
                        "default": ""
                    },
                    "maxResults": {
                        "title": "Maximum results",
                        "minimum": 1,
                        "maximum": 500,
                        "type": "integer",
                        "description": "Maximum number of launches to scrape.",
                        "default": 50
                    },
                    "sortBy": {
                        "title": "Sort by",
                        "enum": [
                            "newest",
                            "popular",
                            "top"
                        ],
                        "type": "string",
                        "description": "How to sort results: newest, popular, or top.",
                        "default": "popular"
                    }
                }
            },
            "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
                                    }
                                }
                            }
                        }
                    }
                }
            }
        }
    }
}
```
