Purpose
Surface 5–10 products from Product Hunt's current daily launches that are worth sharing with people who rely on free tools — i.e. products whose pricing label is Free or Free Options (freemium / has a usable free tier). For each product the skill returns name, tagline, topics, vote count, the canonical product URL, and the pricing label that justifies the "free" classification. Read-only — never signs in, votes, comments, follows, or submits anything.
When to Use
- A daily "free tools roundup" feed: pull the day's top launches and keep only the free / freemium ones.
- Curating a newsletter or social post of free tools for a budget-conscious audience.
- Any flow that needs today's Product Hunt launches filtered by price (the leaderboard itself does not expose pricing).
- Substitute
dailywithweekly/monthly/yearlyleaderboards (same parsing) for longer-horizon roundups.
Workflow
Product Hunt sits behind a Cloudflare managed challenge, and there is no usable public data path without an OAuth token (the official GraphQL API at api.producthunt.com/v2/api/graphql requires a developer access token; the plain HTTP/fetch path — even /robots.txt — returns the Cloudflare "Just a moment…" interstitial). The honest, reliable method is a stealth browser session. A bare session is blocked; a stealth + residential-proxy browserless_agent call clears the challenge consistently. There is one unavoidable extra cost: the daily leaderboard and homepage do not show pricing per card, so the "free" decision requires opening each candidate's /products/{slug} page and reading its pricing label.
Use a stealth + residential-proxy session (mandatory): call
browserless_agentwith a top-levelproxy: { "proxy": "residential", "proxyCountry": "us" }. Batching the whole leaderboard → per-product flow inside one call'scommandsarray is the convenient default — it saves round-trips and avoids accidentally dropping the session config. But the session persists across calls, keyed byproxy: repeat the sameproxyarg on any follow-up call to reconnect to the same warmed session (Cloudflare cookie intact), while dropping or changingproxyputs you back on the blocked bare path. There's no explicit release step to manage.Open today's daily leaderboard. Leaderboards run on US/Pacific time; build the dated URL accordingly:
https://www.producthunt.com/leaderboard/daily/{yyyy}/{m}/{d}(e.g.
.../daily/2026/6/20). The homepagehttps://www.producthunt.com/"Top Products Launching Today" section is an equivalent fallback. Then:{ "method": "goto", "params": { "url": "https://www.producthunt.com/leaderboard/daily/2026/6/20", "waitUntil": "load", "timeout": 45000 } } { "method": "waitForTimeout", "params": { "time": 3000 } }(the
waitForTimeoutcovers Cloudflare + progressive render). Confirm you're through Cloudflare: the page title should be likeBest of Product Hunt: June 20, 2026 | Product Hunt, notJust a moment....Extract the ranked launch list with a
text/htmlread ofbody(or fold the parse into anevaluatecommand). Each launch row renders as:[1\. WorkClaw](/products/workclaw)Collaborative, proactive AI coworkers who work in Slack [Productivity](/topics/productivity)•[Artificial Intelligence](/topics/...)•[Business](/topics/...) 40 208Parse per row: rank (the
N\.prefix), name, slug (from/products/{slug}), tagline (text immediately after the product link), topics (the/topics/links), and the two trailing integers — the larger is the vote count, the smaller is the comment count. SkipPromotedrows that have no rank number (sponsor slots).Classify pricing per product (2 turns each). The label is not on the leaderboard — open each candidate top-down (highest votes first), all within the same
browserless_agentcall:{ "method": "goto", "params": { "url": "https://www.producthunt.com/products/{slug}", "waitUntil": "load", "timeout": 45000 } } { "method": "text", "params": { "selector": "body" } }In the returned text, the pricing/availability label sits immediately before the string
Launch tags:. It is one of:Free→free: trueFree Options(freemium / free tier) →free: truePaid/Payment Required→free: false- (no label before
Launch tags:) → unknown; skip and move on.
Stop early. As soon as you have 5–6 confirmed free / Free Options products, stop opening pages and emit the JSON. Six is a complete result; collecting more just burns turns/cost.
Emit the JSON in the Expected Output shape. There's no explicit session-release step — the session persists across calls keyed by
proxy, so nothing needs to be torn down.
Site-Specific Gotchas
- Stealth + residential proxy is mandatory. A bare
gotoand the plain fetch/curlpath both return the CloudflareJust a moment...managed challenge (the homepage returns HTTP 403 on direct fetch; even/robots.txtis challenged). Abrowserless_agentcall withproxy: { "proxy": "residential" }clears it reliably. Always verify the page title before trusting any extracted content. - No free API path. The official Product Hunt GraphQL API (
api.producthunt.com/v2/api/graphql) needs an OAuth developer token — out of scope for an unauthenticated agent. Don't waste time trying the API orfetch; the browser is the only reliable surface. - Pricing is NOT on the leaderboard/homepage cards. You must open
/products/{slug}and read the label beforeLaunch tags:. This is the single biggest cost driver — budget ~2 turns per product and stop at 5–6 free hits. /llms.txtis open and documents every leaderboard URL pattern.https://www.producthunt.com/llms.txt(loads fine in the stealth session) gives the canonical paths: daily/leaderboard/daily/{yyyy}/{m}/{d}, weekly/leaderboard/weekly/{yyyy}/{ww}(ISO week), monthly/leaderboard/monthly/{yyyy}/{mm}, yearly/leaderboard/yearly/{yyyy}, products/products/{slug}, categories/categories/{slug}. It also states the attribution requirement: "Data sourced from Product Hunt (https://www.producthunt.com/)".- Leaderboards are Pacific-time. Build the dated daily URL from the current US/Pacific date, or you'll fetch the wrong (or an empty/future) day. The homepage "Top Products Launching Today" tracks the same day if you'd rather not compute the date.
Promotedsponsor rows are interleaved into the list without a rank number — they are ads; skip them.- An
Interactivetag can sit next to the pricing label on the product page (e.g....InteractiveFree OptionsLaunch tags:...). Anchor on the text immediately beforeLaunch tags:so you don't mistakeInteractive(a demo flag) for a price. - Some products show no pricing label (e.g. open-source dev tools like "Mellum by JetBrains" surfaced only
Launch tags:with no preceding price). Treat as unknown and skip rather than guessingfree. - Don't use
snapshotfor the list — atext/htmlread ofbody(or anevaluatethat parses the rendered rows) renders the ranked rows far more cleanly and cheaply than walking the accessibility tree. - Vote vs. comment count: the two trailing integers per row are comment-count then vote-count; the larger one is votes. Votes are the better "worth sharing" signal.
Expected Output
Validated 2026-06-20 (two consecutive runs converged on identical classifications). Vote counts are a snapshot — they climb during the day.
{
"success": true,
"source": "https://www.producthunt.com/leaderboard/daily/2026/6/20",
"date": "2026-06-20",
"count": 6,
"products": [
{
"rank": 1,
"name": "WorkClaw",
"tagline": "Collaborative, proactive AI coworkers who work in Slack",
"url": "https://www.producthunt.com/products/workclaw",
"topics": ["Productivity", "Artificial Intelligence", "Business"],
"votes": 208,
"pricing": "Free Options",
"free": true
},
{
"rank": 2,
"name": "Reframe",
"tagline": "Surf like it's 1999",
"url": "https://www.producthunt.com/products/reframe-7",
"topics": ["Open Source", "User Experience", "GitHub"],
"votes": 149,
"pricing": "Free",
"free": true
},
{
"rank": 3,
"name": "Slackbot's MCP Client",
"tagline": "Work across 20+ apps in Slack with multiplayer collaboration",
"url": "https://www.producthunt.com/products/slack",
"topics": ["Slack", "Task Management", "Artificial Intelligence"],
"votes": 144,
"pricing": "Free Options",
"free": true
},
{
"rank": 5,
"name": "pumaDB",
"tagline": "a small hosted memory layer for AI agents",
"url": "https://www.producthunt.com/products/pumadb",
"topics": ["Developer Tools", "Artificial Intelligence", "Database"],
"votes": 120,
"pricing": "Free",
"free": true
},
{
"rank": 6,
"name": "Foyer",
"tagline": "Build a room of ambient sound that lives in your notch",
"url": "https://www.producthunt.com/products/foyer-4",
"topics": ["Mac", "Productivity", "Music"],
"votes": 101,
"pricing": "Free Options",
"free": true
},
{
"rank": 7,
"name": "Are you in the Weights?",
"tagline": "Find out if you live forever in the brain of the LLMs",
"url": "https://www.producthunt.com/products/are-you-in-the-weights",
"topics": ["Artificial Intelligence", "Tech", "Games"],
"votes": 100,
"pricing": "Free",
"free": true
}
],
"error_reasoning": null
}Failure shape (Cloudflare wall not cleared, or fewer than 5 free products found that day):
{
"success": false,
"source": "https://www.producthunt.com/leaderboard/daily/2026/6/20",
"date": "2026-06-20",
"count": 0,
"products": [],
"error_reasoning": "Stuck on Cloudflare 'Just a moment...' — browserless_agent call was missing the residential proxy."
}