Product Hunt hub

Product Hunt User Posts API

One user's made, submitted or voted posts, 20 a page, with a cursor to continue.

GET /v1/product-hunt/users/{username}/posts

1 credit Failed requests are free

About this endpoint

GET /v1/product-hunt/users/{username}/posts returns data.posts, data.username, data.kind, data.totalCount and data.page. Choose the list with kind: made, submitted or voted. Each post is a reference with id, slug and name; pages hold up to 20.

Start from GET /v1/product-hunt/users/{username}, which returns the first page of each list and a nextCursor for it. Send that cursor here with the same username and kind to continue. A cursor belongs to the list it came from. A username with no public profile returns lookupStatus: not_found and an empty list.

Product Hunt pages these lists by position over an order with ties, so a post can appear on two pages and another can be skipped; de-duplicate by id.

Product Hunt User Posts API FAQ

How do I page a user's posts?

When data.page.hasMore is true, send data.page.nextCursor as cursor with the same username and kind. A cursor from one list does not work on another.

Which list does kind select?

made is what the user built, submitted is what they posted, and voted is what they upvoted. The response echoes the list in data.kind.

How do I get the full post for one of these rows?

Use the row's slug on GET /v1/product-hunt/posts/{slug}. A row only carries id, slug and name.

How do I tell a missing user from an empty list?

Check data.lookupStatus. A username with no public profile returns not_found; a real user with nothing in that list returns found with posts: [].

How much does it cost?

Pricing is documented on the operation in the API registry (shown on this page). Confirm on every response with meta.creditsCharged: that field is the billing source of truth. Each paginated page is a separate billed request.