Product Hunt needs a developer token on the deployment: its GraphQL API has no anonymous mode. On Nephia’s hosted API it is configured; if you self-host, create an application at producthunt.com/v2/oauth/applications and set
PRODUCTHUNT_DEVELOPER_TOKEN. GET /account reports which Sources a deployment offers in capabilities.liveSources.The launch
A Product Hunt search emits a Launch: the product on the page, not a comment about it. Called a Launch and not a Post because that is what Product Hunt calls the thing a reader lands on, and becausepost belongs to Reddit throughout this API.
url is the Product Hunt page, where the votes and the discussion are. website is the maker’s own site, through Product Hunt’s redirect, and stays its own field.
featuredAt is a date (2026-09-01), not an instant: it names the day the launch was on the front page, which is how Product Hunt itself talks about it. null means it was never featured, which is true of plenty of posts.
votesCount is the only audience number the API reports, and it is what a Feed row shows as reach.
Coverage
A search takes atopic and/or a query, and neither is required. “The newest launches” is a real thing to watch on a feed that publishes about a hundred items a day, unlike, say, “everything on Hacker News”, which is fifty an hour. topic is this Source’s own criterion: on the keyword it goes in the search’s overrides.filters (see Keywords).
The two work differently, and the difference is visible in what you get:
topicnarrows what Product Hunt sends. It is the only narrowing the API offers, and it is applied server-side.queryis matched here, over the newest page. Product Hunt’s GraphQL v2 has no text search on launches. So a search fetches the newest launches (in the topic, if one is set) and keeps the ones whose name, tagline or description carry your term.
developer-tools, never “Developer Tools”: the API 404s on the display name.
The match is a case-insensitive substring rather than a whole word, because product names are compounds: Nephia, NephiaAI and nephia.cc are all the same brand appearing in a tagline.
Interval: 300 to 86400 seconds. At most 20 active Product Hunt searches per Account. Each tick costs 1 credit.
The floor is five minutes because of what the Source is rather than because of a quota: a page of twenty launches covers hours on a feed this size, and polling faster would re-read the same page. The complexity budget agrees: a developer token allows roughly 6 250 points per 15 minutes and twenty searches at this floor spend about 1 000.
What an event carries
The first tick asks for the last 24 hours, establishes a silent baseline and emits nothing. A wider first window would swallow a week of launches and leave the first real tick with nothing to report. Later ticks emitlaunch.created.
webhookUrl is optional: without it the keyword still records every match, readable through GET /v1/keywords/{id}/events in the same shape. See Webhooks.
Not covered: comments on a launch. Deferred rather than silently missing.
Errors
A temporary Product Hunt failure is 503 and is not charged. Product Hunt’s GraphQL server answers200 with an errors array rather than a status code when a query fails; Nephia reads that and treats it as a platform failure, so the tick is refunded rather than charged for a page it did not get. The keyword reports it in its activity, readable through GET /v1/keywords/{id}/activity.
A deployment with no PRODUCTHUNT_DEVELOPER_TOKEN omits producthunt from capabilities.liveSources.