How to track Bilibili anime rankings, follower counts and release dates with Python
Pull Bilibili's Top 100 anime ranking, a filterable catalog with follower and rating counts, and the release calendar as clean JSON using Python or cURL.
datagrit › Guides › Product Hunt Launch Pricing & Website Intel
GuidePull 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.
Two public sources, no login:
/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:
ref=producthunt and utm_* parameters. The Actor strips them so websiteUrl and websiteDomain are clean keys for joins and deduplication.Accept header and treats a leaderboard without embedded data as a failure of the run, not as an empty day.$20/month, some $199/year, some Free, some Contact sales, some price by usage. The Actor returns every plan it finds with name, price, currency and period, plus a summary: pricingModel (freemium, paid, free, usageBased or contactSales), hasFreeTier, hasFreeTrial, lowestPaidPrice and its period.pricingStatus and still carries the website.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.
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"])
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}'
| Field | Example | Meaning |
|---|---|---|
rank, votes | 1, 334 | Position and votes on the leaderboard page |
topics | ["Productivity", "Developer Tools"] | Product Hunt topics of the launch |
websiteUrl, websiteDomain | https://corespeed.io/, corespeed.io | Real site behind the launch, without tracking parameters |
pricingStatus | parsed | parsed, notFound, blocked, noPrices, or notRequested when pricing is off |
pricingModel | freemium | freemium, paid, free, usageBased or contactSales |
lowestPaidPrice, lowestPaidPeriod | 20, month | Cheapest paid plan and its billing period |
pricingConfidence | medium | high, medium or low: how clear the page was |
plans | [{"name": "Pro", "price": 20, "period": "month"}] | Every plan found, with perSeat and the original priceText |
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.
noPrices or notFound. On a live run of the latest daily page, 13 of 17 launches had a parsed pricing page and 4 had none, so expect gaps.pricingConfidence: low means the page was ambiguous. Use the pricingPageUrl to check by hand before you put a figure in a report.perSeat and the original priceText; the Actor does not convert currencies.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.
Pull Bilibili's Top 100 anime ranking, a filterable catalog with follower and rating counts, and the release calendar as clean JSON using Python or cURL.
Pull TikTok Creative Center Top Ads for several countries and industries, merge the lists, and get only the ads that are new since your last run.
Pull startup job postings with pay ranges from Ashby boards, annualised to yearly amounts, with currency and remote filters and an only-new feed.