Indie Hackers APIindiehackers.com ↗
Access Indie Hackers product listings, revenue milestones, and founder profiles via API. Filter by date, search by query, and retrieve Stripe-verified MRR history.
What is the Indie Hackers API?
The Indie Hackers API covers 5 endpoints that expose product revenue figures, founder contact signals, and monthly revenue milestone histories from the Indie Hackers product database. The list_top_products endpoint returns products sorted by highest revenue with Twitter handles, website URLs, and taglines. You can also pull Stripe-verified monthly revenue timelines per product, search founder profiles, and filter products by launch date range.
curl -X GET 'https://api.parse.bot/scraper/8fae9faa-c67a-430f-900a-962508d18d3c/list_top_products?page=0&limit=5' \ -H 'X-API-Key: $PARSE_API_KEY'
Typed, relational, agent-ready
A generated client with real types, enums, and the links between objects — the structure a flat JSON response can't carry. Autocompletes in your editor and reads cleanly to coding agents.
- Fully typed · autocompletes
- Objects link to objects
- Typed errors & pagination
Typed Python client. Set up the SDK in your uv project, then pull this API’s typed client:
uv add parse-sdk uv run parse init uv run parse add --marketplace indiehackers-com-api
uv run parse add --marketplace pulls a pinned snapshot of this canonical API — it won’t change underneath you. To customize it, subscribe and swap to your own copy.
"""Walkthrough: Indie Hackers Products API — bounded, re-runnable; every call capped."""
from parse_apis.Indie_Hackers_Products_API import IndieHackers, ProductNotFound
client = IndieHackers()
# Search top products by query, capped at 3
for product in client.product_summaries.search(query="analytics", limit=3):
print(product.name, product.revenue, product.linkedin_url, product.business_model)
# Filter products by start date range
for product in client.product_summaries.by_date(start_date="2025-01", end_date="2025-03", slim=True, limit=3):
print(product.product_id, product.name)
# Navigate from summary to full detail with founder info
summary = client.product_summaries.search(query="ghost", limit=1).first()
if summary:
try:
full = summary.details()
print(full.name, full.business_model, full.num_employees, full.milestone_type)
for founder in full.founders:
print(founder.user_joined_date, founder.products_owned)
except ProductNotFound as e:
print("not found:", e.product_id)
# Access revenue milestones via sub-resource on a constructible Product
ghost = client.products.get(product_id="ghost")
for milestone in ghost.revenue_milestones.list(start_date="2025-01", end_date="2025-06", limit=3):
print(milestone.date, milestone.revenue, milestone.pageviews, milestone.sessions)
# Search for users/founders
for user in client.users.search(query="AI", limit=3):
print(user.username, user.twitter_handle)
print("exercised: product_summaries.search / by_date / details / products.get / revenue_milestones.list / users.search")
List indie hacker products sorted by highest revenue. Returns products with revenue figures, Twitter handles, website URLs, and other metadata including LinkedIn URL, product logo, business model, and employee count. Supports search filtering and pagination.
| Param | Type | Description |
|---|---|---|
| page | integer | Zero-based page number for pagination. |
| limit | integer | Number of products per page. Must be between 1 and 50. |
| query | string | Search query to filter products by name, description, or tagline. Empty string returns all products. |
{
"type": "object",
"fields": {
"page": "integer",
"products": "array of product objects with linkedin_url, product_logo_url, business_model, num_employees fields",
"total_hits": "integer",
"total_pages": "integer"
}
}About the Indie Hackers API
Product Listings and Revenue Data
The list_top_products endpoint returns a paginated list of indie products sorted by revenue descending. Each product object includes a revenue integer, tagline, product_id slug, and contact signals like Twitter handles and website URLs. Pagination is zero-based via the page parameter, with limit accepting values between 1 and 50. A query string filters results by product name, description, or tagline.
get_product_detail accepts a product_id slug (obtainable from list results) and returns the full record for a single product: tags, city, region, country, start_date, user_ids, and revenue. This is useful when you need to resolve location data or associated founder user IDs for a known product.
Revenue Milestones and Date Filtering
get_product_revenue_milestones returns a chronological array of monthly data points — each with a date, revenue integer, and description — for products that have connected a Stripe account to Indie Hackers. Products without verified Stripe data return an empty milestones array. You can scope the timeline using start_date and end_date in YYYY-MM format.
list_products_by_date filters the full product catalog to those whose start_date falls within a given YYYY-MM range. Both start_date and end_date are required. Results are sorted by revenue and return the same full detail fields as get_product_detail, including Stripe-verification status.
Founder and User Search
The search_users endpoint searches the Indie Hackers user database by username or bio text. Each user object includes a username, Twitter handle, bio, and location data. Like the product endpoints, it supports zero-based pagination and a limit of up to 50 per page.
The Indie Hackers API is a managed, monitored endpoint for indiehackers.com — not a raw scraper you maintain. Every endpoint is automatically health-checked on a schedule, and when indiehackers.com changes and a check fails, the API is automatically queued for repair and re-verified. It is built to keep working as the site underneath it changes.
This isn't an official indiehackers.com API — it's an independent, maintained REST wrapper over public data. Where the source has no official API (or only a limited one), Parse gives you a stable contract over a source that never promised one, and keeps it current. Need a new endpoint or field? You can revise it yourself in plain English and the agent rebuilds it against the live site in minutes — contributing the change back to the shared API is free.
Will this API break when the source site changes?+
Is this an official API from the source site?+
Can I fix or extend this API myself if I need a new endpoint or field?+
What happens if I call an endpoint that has an issue?+
- Build a leaderboard of highest-revenue indie products using
list_top_productsrevenue figures - Track month-over-month MRR growth for a specific product using
get_product_revenue_milestonesdate-scoped data - Identify founders by Twitter handle or website URL for outreach using product detail contact fields
- Filter products launched within a specific quarter using
list_products_by_datewith YYYY-MM bounds - Enrich a startup database with Indie Hackers revenue and tag data by resolving
product_idslugs - Search for founders in a particular niche by querying
search_userswith keyword terms from bios - Analyze which product categories generate the highest revenue by combining
tagsandrevenuefields
| Tier | Price | Credits/month | Rate limit |
|---|---|---|---|
| Free | $0/mo | 100 | 5 req/min |
| Hobby | $30/mo | 1,000 | 20 req/min |
| Developer | $100/mo | 5,000 | 100 req/min |
One credit = one API call regardless of which marketplace API you call. Exceeding the rate limit returns a 429 response. Authenticate with the X-API-Key header.
Does Indie Hackers have an official developer API?+
Which products return revenue milestone data, and what does that response look like?+
get_product_revenue_milestones returns an array of objects each containing a date (YYYY-MM), a revenue integer, and a description string. Products without Stripe verification return an empty milestones array alongside the product name and product_id.Does the API expose product forum posts, comments, or interview content from Indie Hackers?+
What contact signals are available for founders, and are email addresses included?+
search_users include Twitter handle and bio. Email addresses are not exposed. The available contact signals are limited to what appears in the public product and user data.How does pagination work across the listing endpoints?+
list_top_products, search_users, list_products_by_date) use zero-based page numbering via the page parameter. Each response returns total_hits and total_pages alongside the current page number, so you can determine iteration bounds without a separate count call. The limit parameter caps at 50 records per page.