datagrit

datagrit › Guides › Product Hunt Launch Pricing & Website Intel

Guide

How to track Product Hunt launches and what each product charges

Pull Product Hunt leaderboards with each launch's real website, pricing page, plan tiers and lowest paid price, from Python or cURL.

Published 2026-10-06 · uses the Product Hunt Launch Pricing & Website Intel Actor

Every day Product Hunt shows a dozen or two new products, and the question that follows is rarely "what is it called". It is "who is this for, and what does it cost?" Founders want to know what competitors charge. Sales teams want the website of every fresh launch in their category. Analysts want a benchmark: how many launches this month are freemium, and what is the usual first paid tier?

Product Hunt answers the first half. The second half lives on each product's own website, one pricing page at a time. This post shows what it takes to connect the two, where a homemade version breaks, and how to run the whole thing through the Apify API.

Where the data comes from

Two public sources, no login:

  1. The leaderboard page. Product Hunt renders the daily, weekly, monthly and yearly leaderboards on the server, so rank, name, tagline, topics, votes, comment count and launch time are embedded in the page. It lists only the launches of its first page, about 15 to 20, so a "top 100 of the month" is not available this way. To cover more, ask for several dates.
  2. The product's own website. Product Hunt links every launch through a short redirect (/r/p/<id>). Following it, without staying on Product Hunt, gives the real website. The Product Hunt Launch Pricing & Website Intel Actor then opens that site, looks for a pricing link in the page, falls back to /pricing, and reads the prices from the visible text.

The traps this removes:

Step by step

1. Define the input

Yesterday's launches, keeping only products with at least 100 votes, a freemium model and a developer topic:


{
  "period": "daily",
  "fetchPricing": true,
  "minVotes": 100,
  "topics": ["Developer Tools"],
  "pricingModel": "freemium",
  "maxItems": 20
}

With no dates, the latest finished period is read: yesterday in Pacific time for daily, last week, last month or last year for the other periods. To read specific pages, list them in the format of the period: 2026-10-04, 2026-W40, 2026-09 or 2025. To look up single products, put Product Hunt links or slugs in productUrls.

2. Run it from Python


from apify_client import ApifyClient

client = ApifyClient("YOUR_APIFY_TOKEN")

run = client.actor("datagrit/product-hunt-launch-pricing-intel").call(run_input={
    "period": "weekly",
    "dates": ["2026-W38", "2026-W39", "2026-W40"],
    "fetchPricing": True,
    "maxItems": 60,
})

for row in client.dataset(run["defaultDatasetId"]).iterate_items():
    if row["found"]:
        print(row["rank"], row["productName"], row["pricingModel"], row["lowestPaidPrice"], row["lowestPaidPeriod"])

3. Or with cURL


curl -s -X POST \
  "https://api.apify.com/v2/acts/datagrit~product-hunt-launch-pricing-intel/run-sync-get-dataset-items?token=YOUR_APIFY_TOKEN" \
  -H "Content-Type: application/json" \
  -d '{"period":"daily","maxItems":20}'

The fields that matter

FieldExampleMeaning
rank, votes1, 334Position and votes on the leaderboard page
topics["Productivity", "Developer Tools"]Product Hunt topics of the launch
websiteUrl, websiteDomainhttps://corespeed.io/, corespeed.ioReal site behind the launch, without tracking parameters
pricingStatusparsedparsed, notFound, blocked, noPrices, or notRequested when pricing is off
pricingModelfreemiumfreemium, paid, free, usageBased or contactSales
lowestPaidPrice, lowestPaidPeriod20, monthCheapest paid plan and its billing period
pricingConfidencemediumhigh, medium or low: how clear the page was
plans[{"name": "Pro", "price": 20, "period": "month"}]Every plan found, with perSeat and the original priceText

Three recipes

A daily sheet for competitor watching. Schedule the Actor every morning with onlyNew: true and the topics you care about. The Actor remembers which launches it returned for that exact combination of period, products, topics, votes and pricing model, so each launch arrives once. Send the dataset to Google Sheets or a Slack channel through an Apify integration.

A pricing benchmark in pandas. Read a month of weekly pages and group by model:


import pandas as pd

df = pd.DataFrame(client.dataset(run["defaultDatasetId"]).list_items().items)
df = df[df["found"] & (df["pricingStatus"] == "parsed")]
print(df["pricingModel"].value_counts(normalize=True))
print(df[df["lowestPaidPeriod"] == "month"]["lowestPaidPrice"].describe())

A lead list. Use fetchPricing: false for a faster run that returns only the launch and the website, then enrich websiteDomain in the tool you already use for outreach.

Limits, honestly

Wrapping up

If you need what launched and what it costs in one row, billing is pay per result, the Actor is on Apify, and the full field list is in the documentation.

Try Product Hunt Launch Pricing & Website Intel on ApifyActor documentation

More guides