Indie Hackers Products Scraper
Pricing
Pay per event
Indie Hackers Products Scraper
Scrape the Indie Hackers product directory — name, tagline, logo, and self-reported monthly revenue for every bootstrapped SaaS product. Filter by category and sort by revenue. Export to JSON or CSV. We handle the blocks so your dataset stays clean.
Pricing
Pay per event
Rating
0.0
(0)
Developer
DevilScrapes
Maintained by CommunityActor stats
0
Bookmarked
2
Total users
1
Monthly active users
5 hours ago
Last modified
Categories
Share
Indie Hackers Products Scraper
💰 $5.00 / 1 000 results · pay only for results · no credit card to try
The devil's in the data. 😈
Indie Hackers is where bootstrapped founders publish their product and, often, their real self-reported monthly revenue. This Actor turns that directory into clean rows — name, tagline, logo, MRR, category — so you can screen the bootstrapped SaaS market without opening a single tab.
🎯 What this scrapes
The Indie Hackers /products directory, filtered by zero or more
categories and sorted the way you choose (recently updated, recently
added, highest revenue, or lowest revenue). Each row is one product card:
its slug, name, tagline, logo, and self-reported monthly revenue (when the
founder chose to publish one).
🔥 Features
- 🛡️ We rotate browser fingerprints (curl-cffi impersonation across Chrome, Firefox, and Safari profiles) so every request looks like a real browser, not a script.
- 🔁 We retry with exponential backoff on
408 / 429 / 503and honourRetry-After— up to 5 attempts per category page. - 🧱 We isolate faults, not runs. A malformed card is skipped and logged; a category that fails to load is skipped too. Your run only fails outright when every requested category is unreachable.
- 🧊 Dedup you can trust. A product that shows up under two categories you requested is emitted once, attributed to whichever category you listed first.
- 💰 You pay only for results that land. No data → no charge beyond the small warm-up fee.
💡 Use cases
- SaaS founders scouting competitor pricing and positioning inside a specific category before they launch.
- Acquirers and brokers screening bootstrapped products by self-reported MRR for acquisition leads.
- Investors and researchers tracking how the indie/bootstrapped SaaS market is trending category by category.
- Growth marketers building a target list of tools in a niche to pitch affiliate or integration partnerships.
⚙️ How to use it
- Pick one or more
categories(leave empty for the unfiltered directory) and asortingorder —highest-revenuesurfaces the biggest self-reported earners first. - Set
maxProductsto cap how many rows you want across all requested categories, after dedup. - Run it, then export to JSON, CSV, or Excel — or pull the dataset straight from the Apify API.
- Re-run on a schedule to track how self-reported revenue for a category moves over time.
📥 Input
| Field | Type | Required | Default | Notes |
|---|---|---|---|---|
categories | array<string> | no | ["ai", "productivity"] | Zero or more of the 57 valid Indie Hackers category slugs. Empty array = the unfiltered directory. |
sorting | string | no | "highest-revenue" | One of recently-updated, recently-added, highest-revenue, lowest-revenue. |
maxProducts | integer | no | 40 | Hard cap on total rows across all requested categories, after dedup (1-500). |
proxyConfiguration | object | no | {"useApifyProxy": false} | Apify Proxy configuration. No anti-bot surface confirmed on this target, so proxy is optional. |
Example input
{"categories": ["ai", "productivity"],"sorting": "highest-revenue","maxProducts": 10}
📤 Output
One row per product matching your filters.
| Field | Type | Notes |
|---|---|---|
product_slug | string | Slug parsed from the product's /product/<slug> URL. |
product_url | string | Full absolute URL to the product's Indie Hackers page. |
name | string | Product display name. |
tagline | string | null | Product tagline, if present. |
logo_url | string | null | Product logo/avatar image URL. |
monthly_revenue_usd | integer | null | Self-reported monthly revenue in USD. null when the product did not self-report — never faked as 0. |
revenue_period | string | null | Revenue period label (e.g. "month"). null when revenue is absent. |
matched_category | string | null | First category slug this product was discovered under this run. |
matched_sorting | string | The sorting value used for the request that found this row. |
scraped_at | string | ISO-8601 UTC timestamp this row was scraped. |
Example output
{"product_slug": "jotlee","product_url": "https://www.indiehackers.com/product/jotlee","name": "Jotlee","tagline": "Everything job seekers need in one AI-powered platform","logo_url": "https://storage.googleapis.com/indie-hackers.appspot.com/product-avatars/jotlee/128x128_jotlee.webp","monthly_revenue_usd": 0,"revenue_period": "month","matched_category": "ai","matched_sorting": "highest-revenue","scraped_at": "2026-09-14T10:00:00+00:00"}
💰 Pricing
Pay-Per-Event — you pay only when these events fire:
| Event | USD | What it is |
|---|---|---|
actor-start | $0.20 | One-off warm-up charge per run |
result | $0.0048 | Per product row written to the dataset |
Example: 1 000 products = $5.00 per run ($0.20 start + 1000 x $0.0048). No subscription, no minimum, no card required to try it.
🚧 Limitations
- Revenue is self-reported and unvalidated. Indie Hackers never audits
the numbers founders publish — treat
monthly_revenue_usdas a signal of what a founder is willing to claim, not audited financials. - ~17-18 cards per category page, no deep pagination in v1. The site's own "Load More" pagination runs through an undocumented client-side index that could change without notice; iterating multiple categories is how you get breadth today. Deeper pagination is a candidate for a future version.
maxProductscounts post-dedup rows. If two requested categories share a product, it only counts once against your cap.- No product detail-page enrichment. This Actor scrapes the directory card only (name, tagline, logo, revenue) — founder story and milestone data from the individual product page are out of scope for v1.
❓ FAQ
Is the revenue data accurate? It's exactly what the founder chose to publish on their own product page — self-reported, not verified by Indie Hackers or by us. Use it as a directional signal, not a financial statement.
Can I filter by more than one category in a single run?
Yes. Pass an array to categories; each one is fetched as its own
request, and products that appear under more than one requested category
are only counted once.
What happens if a category has no self-reported revenue for some
products?
Those rows come back with monthly_revenue_usd and revenue_period both
null — never a fabricated 0.
Do I need to configure a proxy?
No. We didn't find any anti-bot surface on this target during testing, so
proxyConfiguration defaults to a direct connection. You can still turn
on Apify Proxy if you want the extra layer.
🙋 Your feedback
Found a category slug that changed, a card layout we mis-parse, or a feature you wish this Actor had? Open an issue on the Actor's Apify Store page or message DevilScrapes directly — we ship fixes fast.