Product Hunt Scraper (official API): launches, leaderboard

Returns Product Hunt posts as structured rows: daily launches and leaderboards, topic feeds, votes, rank, makers, hunter, media, resolved website and comments, plus a new-launches monitor mode. Official Product Hunt API, so no anti-bot failures. Pay per result.

Run on Apify Pricing API docs

Categories: LEAD_GENERATION, MARKETING, AGENTS. Pay per result, no subscription; Apify's free plan includes $5 of monthly usage.

Run it from the command line

curl -sS -X POST "https://api.apify.com/v2/acts/brenton8907~product-hunt-data/run-sync-get-dataset-items?token=$APIFY_TOKEN" \
  -H 'Content-Type: application/json' \
  -d '{"mode": "launches", "days": 1, "order": "ranking", "featuredOnly": true, "topics": ["artificial-intelligence"], "minVotes": 0}'

Run it from Python

from apify_client import ApifyClient
client = ApifyClient("YOUR_APIFY_TOKEN")
run = client.actor("brenton8907/product-hunt-data").call(run_input={
  "mode": "launches",
  "days": 1,
  "order": "ranking",
  "featuredOnly": true,
  "topics": [
    "artificial-intelligence"
  ],
  "minVotes": 0
})
for item in client.dataset(run.default_dataset_id).iterate_items():
    print(item)

Use it as an MCP tool (Claude, Cursor, any MCP client)

The actor is listed in the official MCP registry as io.github.brenton-keller/product-hunt-data and served by Apify's hosted MCP server:

{
  "mcpServers": {
    "product-hunt-data": {
      "url": "https://mcp.apify.com/?tools=brenton8907/product-hunt-data",
      "headers": {
        "Authorization": "Bearer YOUR_APIFY_TOKEN"
      }
    }
  }
}

Pricing (pay per event)

eventwhatpricedetails
post-recordPost record$0.0010One launch/post row: votes, rank, makers, hunter, topics, media, resolved website.
enriched-post-recordEnriched post record$0.0030One post row with comments attached.
topic-recordTopic record$0.0005One topic row (followers, post count).

Documentation

Daily launches and leaderboards, topic feeds, full post details and comments from Product Hunt, built on the official Product Hunt API instead of scraping the website. producthunt.com sits behind a bot challenge, which is why scraper-based actors fail a quarter of their runs. This actor talks to the API, so runs finish.

What it does

Who it's for

Input examples

Today's Product Hunt leaderboard (US Pacific day, default):

{ "days": 1, "order": "ranking" }

Last 7 days of AI launches with at least 100 votes:

{ "days": 7, "topics": ["artificial-intelligence"], "minVotes": 100, "order": "votes" }

A specific month, developer tools, with top 20 comments each:

{ "dateFrom": "2026-08-01", "dateTo": "2026-08-31", "topics": ["developer-tools"], "includeComments": true, "commentsLimit": 20, "maxItems": 300 }

Specific posts, or a product by website:

{ "mode": "posts", "postUrls": ["https://www.producthunt.com/posts/notion-3-0"], "websiteUrls": ["https://linear.app"] }

Monitor: run hourly, only report new launches or posts that gained 25+ votes:

{ "days": 1, "changesOnly": true, "minVoteDelta": 25, "monitorStoreName": "ph-today" }

The first monitor run outputs every post in the window (all are new) and seeds the store. Later runs output only changes.

List topics:

{ "mode": "topics", "topicQuery": "design", "maxItems": 50 }

Output

One row per post.

Field Description
id, slug, url, name, tagline, description Post identity and copy
website Product Hunt redirect link as returned by the API
website_resolved The real product URL after following the redirect (tracking stripped); null if it could not be resolved
votes, comments_count, reviews_count, reviews_rating Engagement
daily_rank, weekly_rank, monthly_rank Leaderboard positions (null when not ranked)
launch_date, created_at, featured_at, is_featured Timing (UTC)
topics, topic_names Topic slugs and names
makers List of { id, name, username, headline, twitter, website, url }; maker_count
hunter_name, hunter_username, hunter_url Who submitted the post
thumbnail_url, media Thumbnail and gallery items { type, url, video_url }
product_links { type, url } such as app store links
comments With includeComments: { id, body, created_at, votes, url, parent_id, user_name, user_username, user_headline }
is_new, previous_votes, previous_seen_at, votes_delta, rank_changed Monitor mode only
enrichment_error Set if the comments call failed; the base row is still returned and billed at the base rate
raw With includeRaw: the untouched API object
fetched_at When the row was fetched (UTC)

Topics mode rows: id, name, slug, description, url, followers_count, posts_count, created_at.

Pricing

Pay per result. You are charged only for rows written to the dataset.

Event Price When
Post record $1.00 per 1,000 rows Standard run
Enriched post record $3.00 per 1,000 rows Row has comments attached (includeComments)
Topic record $0.50 per 1,000 rows Topics mode

Examples: a day's leaderboard (about 50 to 100 posts) costs under $0.10. A month of developer-tools launches with comments (300 rows) costs $0.90. A monitor run that finds 8 changed posts costs $0.008.

Rows are billed by what they contain: a post whose comments call failed is billed at the base rate. The first run in monitor mode charges every row, because every post is new to the store. Set Maximum total charge on the run to cap spend; the actor stops cleanly at the cap.

Limits and notes

Use from an AI agent (MCP)

Every Apify actor is available as a tool through the Apify MCP server. Suggested agent pattern: schedule a run with changesOnly: true and a topic, then act only on the rows returned.

Support

Open an issue on the actor page with the run ID and input.