# Indie Hackers Scraper (`solidcode/indiehackers-scraper`) Actor

\[💰 $8.0 / 1K] Extract Indie Hackers products with self-reported monthly revenue, followers, founders, taglines, verticals, revenue models, funding, and tags. Search by keyword, sort by newest or revenue, filter by revenue range, or paste specific product URLs.

- **URL**: https://apify.com/solidcode/indiehackers-scraper.md
- **Developed by:** [SolidCode](https://apify.com/solidcode) (community)
- **Categories:** Developer tools, Lead generation, Other
- **Stats:** 1 total users, 0 monthly users, 100.0% runs succeeded, 0 bookmarks
- **User rating**: No ratings yet

## Pricing

from $8.00 / 1,000 results

This Actor is paid per event. You are not charged for the Apify platform usage, but only a fixed price for specific events.
Since this Actor supports Apify Store discounts, the price gets lower the higher subscription plan you have.

Learn more: https://docs.apify.com/actors/running/actors-in-store.md#pay-per-event

## What's an Apify Actor?

Actors are web data automations that power AI and operations. They run on the Apify platform to scrape websites, process data, connect APIs, and automate workflows.
In Batch mode, an Actor accepts a well-defined JSON input, performs an action which can take anything from a few seconds to a few hours,
and optionally produces a well-defined JSON output, datasets with results, or files in key-value store.
In Standby mode, an Actor provides a web server which can be used as a website, API, or an MCP server.
Actors are written with capital "A".

## How to integrate an Actor?

If asked about integration, you help developers integrate Actors into their projects.
You adapt to their stack and deliver integrations that are safe, well-documented, and production-ready.
The best way to integrate Actors is as follows.

- **AI agents and MCP clients** — the [Apify MCP server](https://docs.apify.com/integrations/mcp.md) at `https://mcp.apify.com` (remote, streamable HTTP, OAuth on first use).
- **Agentic workflows and local Actor development** — [Agent Skills](https://apify.com/.well-known/agent-skills/index.json) with the [Apify CLI](https://docs.apify.com/cli/docs.md): `npm install -g apify-cli`, then `apify login`.
- **JavaScript/TypeScript projects** — the official [JS/TS client](https://docs.apify.com/api/client/js/docs.md): `npm install apify-client`.
- **Python projects** — the official [Python client](https://docs.apify.com/api/client/python/docs.md): `pip install apify-client`.
- **Any other language** — the [REST API](https://docs.apify.com/api/v2.md).

For usage examples, see the [API](#api) section below.

For more details, see Apify documentation as [Markdown index](https://docs.apify.com/llms.txt) and [Markdown full-text](https://docs.apify.com/llms-full.txt).

# README

## Indie Hackers Scraper

Pull the full Indie Hackers product directory at scale — self-reported monthly revenue, follower counts, founder profiles, taglines, verticals, revenue models, and funding type across the whole 35,000+ product catalog. Search by keyword, sort by revenue, or paste exact product links. Built for indie founders, angel investors, and market researchers who need structured revenue data on bootstrapped SaaS without manually combing thousands of product pages one at a time.

### Why This Scraper?

- **Self-reported monthly revenue on 95–100% of rows** — the headline number indie founders publish, captured as `monthlyRevenueUSD` so you can rank, filter, and benchmark earners across the whole directory.
- **35,000+ products in the catalog** — extract the entire Indie Hackers directory, not just the first page. Set `maxResults` to 0 with Newest First and you get every product; with a revenue sort you get every product that reports a revenue figure (about 33,800 — 5.4% of the catalog reports none, so no revenue ranking can place them).
- **Founder enrichment built in** — 99.9% of founder records resolve to a `username`, display name and full Indie Hackers profile URL, not just an opaque internal ID.
- **Three sort orders that hold at any size** — Newest First returns the genuinely newest products, not the most relevant ones, and Highest/Lowest Revenue return the true top or bottom earners even past 1,000 rows (verified on a 1,500-row pull: 0 of the 1,323 real top earners missing).
- **Revenue band filter, applied at the source** — `minRevenue` and `maxRevenue` set a floor and a ceiling on reported monthly revenue. Both cutoffs are applied before results are collected, so the joke entries at the very top of the ranking (15 products claim $10M+/month, one claims $10 quadrillion) never reach your dataset and never appear on your bill.
- **Four category dimensions broken out** — `verticals` (B2B, SaaS, e-commerce…), `revenueModels` (subscription, ads…), `funding` (bootstrapped, seed…), and `platforms` (web, iOS, Chrome extension…) split into clean structured fields. `verticals` and `funding` land on 100% of rows, `revenueModels` on 98%+, and `platforms` wherever the founder tagged one (94% of rows).
- **Target exact products by URL** — paste a list of `indiehackers.com/product/<slug>` links to pull specific products instead of, or alongside, a keyword search.
- **Reach signals on every row** — product website URL and logo image on 100% of rows, Indie Hackers follower count on 99.7%, plus the founder's Twitter/X handle wherever one has been published — this one varies by slice (25–65% of products) and Indie Hackers keeps backfilling it.

### Use Cases

**Market & Competitor Research**

- Benchmark monthly revenue across an entire vertical (AI, newsletters, dev tools)
- Track which revenue models (subscription vs. one-time vs. ads) earn the most
- Map the bootstrapped vs. seed-funded split within a category
- Identify newly launched products in your niche before they trend

**Investor & Deal Sourcing**

- Build a shortlist of products earning above a revenue threshold
- Surface the highest-revenue indie startups in a single sorted pull
- Spot founders shipping multiple products by cross-referencing profiles
- Monitor follower growth as an early traction signal

**Lead Generation & Outreach**

- Collect founder profile URLs and Twitter handles for warm outreach
- Build lists of products on a specific platform (web, iOS, Chrome)
- Target founders by funding stage for partnership or service offers
- Enrich an existing prospect list with revenue and category data

**Trend & Content Analysis**

- Track the rise of categories like AI tooling over time using `createdAt`
- Compile "top earners" roundups for newsletters and blog posts
- Analyze tagline language across thousands of products
- Feed structured indie-startup data into dashboards and research reports

### Getting Started

#### Search by Keyword

The simplest run — find products matching a topic:

```json
{
    "query": "AI",
    "maxResults": 100
}
```

#### Find the Top Earners

Combine a minimum-revenue floor with the Highest Revenue sort to surface the biggest indie startups:

```json
{
    "query": "SaaS",
    "sortBy": "revenue_desc",
    "minRevenue": 10000,
    "maxRevenue": 10000000,
    "maxResults": 200
}
```

The `maxRevenue` ceiling is what makes this list usable. Revenue is entered by founders with no checks, and a handful of entries claim figures no indie product earns. A $10,000,000/month ceiling removes all 15 of them while keeping every genuine top earner, from Nextiva and Envato down.

#### Target Specific Products

Paste exact product links to pull just those products:

```json
{
    "productUrls": [
        "https://www.indiehackers.com/product/nomad-list",
        "https://www.indiehackers.com/product/bannerbear"
    ]
}
```

#### Full Catalog Pull

Leave the query blank, keep Newest First, and set `maxResults` to 0 to extract every product in the directory:

```json
{
    "query": "",
    "sortBy": "newest",
    "maxResults": 0
}
```

Newest First is the sort that reaches the whole catalog. An unlimited run on Highest or Lowest Revenue returns roughly 33,800 products — the ones that report a revenue figure — because the 5.4% who report none have no place in a revenue ranking.

### Input Reference

#### Search

| Parameter | Type | Default | Description |
|-----------|------|---------|-------------|
| `query` | string | `""` | Keyword to filter products, such as "AI", "SaaS", or "newsletter". Leave empty to scrape all products. |
| `productUrls` | string\[] | `[]` | Specific Indie Hackers product page URLs (e.g. `https://www.indiehackers.com/product/your-product`). Use this to pull exact products instead of, or in addition to, a search. |
| `sortBy` | select | `Newest First` | Order in which products are collected: Newest First, Highest Revenue, or Lowest Revenue. |

#### Limits & Filters

| Parameter | Type | Default | Description |
|-----------|------|---------|-------------|
| `maxResults` | integer | `100` | Maximum number of products to return. Set to 0 for no limit (the full catalog is over 35,000 products). Start with 100–1,000 to keep costs reasonable. |
| `minRevenue` | integer | `0` | Only return products reporting at least this much monthly revenue in US dollars. Set to 0 to include all products. |
| `maxRevenue` | integer | *(empty)* | Only return products reporting at most this much monthly revenue in US dollars. Leave empty for no upper limit. Setting a limit also leaves out products that report no revenue at all. |

### Output

Each result is one product, returned as a flat record:

```json
{
    "productId": "nomad-list",
    "name": "Nomad List",
    "tagline": "The largest community of remote workers and digital nomads",
    "description": "Nomad List helps you find the best places to live and work remotely, with cost-of-living and internet-speed data for 1,000+ cities.",
    "url": "https://www.indiehackers.com/product/nomad-list",
    "websiteUrl": "https://nomadlist.com/",
    "avatarUrl": "https://storage.googleapis.com/indie-hackers.appspot.com/product-avatars/nomad-list/avatar",
    "monthlyRevenueUSD": 45000,
    "numFollowers": 1820,
    "twitterHandle": "nomadlist",
    "facebookUrl": null,
    "founders": [
        {
            "userId": "8z9ZIo2WVZYI5SeYZUY6bvh8Yjy2",
            "username": "levelsio",
            "name": "levelsio",
            "profileUrl": "https://www.indiehackers.com/levelsio"
        }
    ],
    "verticals": ["b2c", "community"],
    "revenueModels": ["subscription"],
    "funding": ["bootstrapped"],
    "platforms": ["web"],
    "allTags": ["vertical-b2c", "vertical-community", "revenue-model-subscription", "funding-bootstrapped", "platform-web"],
    "startDate": "2014-11",
    "endDate": null,
    "createdAt": "2018-03-25T02:15:00Z",
    "publishedAt": "2018-03-25T02:15:00Z",
    "updatedAt": "2026-03-25T02:17:29Z",
    "scrapedAt": "2026-06-03T20:25:04Z"
}
```

#### Core Fields

| Field | Type | Description |
|-------|------|-------------|
| `productId` | string | Unique Indie Hackers product identifier (matches the URL slug) |
| `name` | string | Product name |
| `tagline` | string | Short one-line pitch |
| `description` | string | Longer product description (occasionally empty — present on 91–100% of rows) |
| `url` | string | Indie Hackers product page URL |
| `websiteUrl` | string | The product's own website |
| `avatarUrl` | string | Product logo / avatar image URL |

#### Revenue & Reach

| Field | Type | Description |
|-------|------|-------------|
| `monthlyRevenueUSD` | number | Self-reported monthly revenue in USD (nullable; reported by founders, not verified) |
| `numFollowers` | number | Follower count on Indie Hackers |
| `twitterHandle` | string | Product or founder Twitter/X handle, when one has been published — varies by slice, typically 25–65% of rows, otherwise null |
| `facebookUrl` | string | Social link from the product's Facebook field — usually a Facebook page, occasionally another social profile. Present on 9–45% of rows |

#### Founders & Categories

| Field | Type | Description |
|-------|------|-------------|
| `founders` | object\[] | Founder records — each with `userId`, `username`, `name`, and `profileUrl` |
| `verticals` | string\[] | Product verticals/categories (B2B, SaaS, e-commerce…) |
| `revenueModels` | string\[] | Revenue model tags (subscription, ads, one-time…) |
| `funding` | string\[] | Funding sources (bootstrapped, seed, vc…) — products often declare more than one |
| `platforms` | string\[] | Platforms the product runs on (web, iOS, Chrome extension…) — empty when the founder tagged none (about 6% of rows) |
| `allTags` | string\[] | Every raw tag attached to the product |

#### Timestamps

| Field | Type | Description |
|-------|------|-------------|
| `startDate` | string | When the product started, as reported by the founder (YYYY-MM) |
| `endDate` | string | When the product ended, if reported (nullable) |
| `createdAt` | string | ISO timestamp when the product record was created on Indie Hackers |
| `publishedAt` | string | ISO timestamp when the product was published |
| `updatedAt` | string | ISO timestamp of the last update |
| `scrapedAt` | string | ISO timestamp of when this record was collected |

### Tips for Best Results

- **Find the biggest earners fast** — pair `minRevenue` with `sortBy: revenue_desc`. The minimum-revenue floor trims the long tail at the source, and the sort puts the top earners first, so a small `maxResults` returns the most valuable rows.
- **Always add a `maxRevenue` ceiling to a Highest Revenue pull** — without one, the first 15 rows are placeholder figures ($10M/month and up, including a $10 quadrillion entry). A ceiling of `10000000` cuts every one of them and still keeps the real leaders. Raise or lower it to taste; it is applied before collection, so a tighter ceiling also costs you less.
- **Revenue is self-reported, not audited** — `monthlyRevenueUSD` is whatever the founder entered, and a small number of products also report negative figures. Use `minRevenue` and `maxRevenue` to bound the range you trust, and sanity-check outliers before relying on them.
- **Leave `query` blank to scan everything** — an empty keyword matches the entire directory; combine with a sort order to walk the whole catalog in a meaningful sequence.
- **Set `maxResults` to 0 only when you mean it** — on Newest First that pulls the full 35,000+ product catalog (about 33,800 on a revenue sort) and bills per result, so start with 100–1,000 to validate your filters first.
- **Mix URLs and search in one run** — paste known `productUrls` and add a `query`; the scraper collects both the exact products and the keyword matches in a single pass.
- **Use `createdAt` to track emerging trends** — sort by Newest First and watch which verticals are launching most often to spot momentum early.
- **Read the finish line before you trust the count** — a run that has to stop short says so plainly in its status message and tells you why, so you never mistake a truncated pull for a complete one.
- **Filter categories after the pull** — `verticals`, `revenueModels`, `funding`, and `platforms` are clean structured arrays, so you can slice your dataset by category in a spreadsheet without re-running.

### Pricing

**From $8.00 per 1,000 results** — undercuts the going rate for Indie Hackers data while delivering founder enrichment and full-catalog reach. No compute or time-based charges — you pay per result, plus a small fixed per-run start fee. Bronze, Silver, and Gold subscribers pay progressively less; the table below shows total cost at each discount tier.

| Results | No discount | Bronze | Silver | Gold |
|---------|-------------|--------|--------|------|
| 100 | $0.96 | $0.91 | $0.85 | $0.80 |
| 1,000 | $9.60 | $9.05 | $8.50 | $8.00 |
| 10,000 | $96.00 | $90.50 | $85.00 | $80.00 |
| 100,000 | $960.00 | $905.00 | $850.00 | $800.00 |

A "result" is one product row in the output dataset. Platform fees depend on your Apify plan.

### Integrations

Export data in JSON, CSV, Excel, XML, or RSS. Connect to 1,500+ apps via:

- **Zapier** / **Make** / **n8n** — Workflow automation
- **Google Sheets** — Direct spreadsheet export
- **Slack** / **Email** — Notifications on new results
- **Webhooks** — Trigger custom APIs on run completion
- **Apify API** — Full programmatic access

### Legal & Ethical Use

This actor collects publicly available product information from Indie Hackers for legitimate market research, investment analysis, and lead generation. Self-reported revenue figures are provided by founders and are not independently verified. Users are responsible for complying with applicable laws and Indie Hackers' Terms of Service. Do not use collected data for spam, harassment, or any unlawful purpose, and handle any personal data (such as founder profiles) responsibly.

# Actor input Schema

## `query` (type: `string`):

Keyword to filter products, such as 'AI', 'SaaS', or 'newsletter'. Leave empty to scrape all products.

## `productUrls` (type: `array`):

Specific Indie Hackers product page URLs, for example https://www.indiehackers.com/product/your-product. Use this to scrape exact products instead of, or in addition to, a search.

## `sortBy` (type: `string`):

Order in which products are collected.

## `maxResults` (type: `integer`):

Maximum number of products to return. Set to 0 for no limit (the full catalog is over 35,000 products). Recommended: 100-1000 to keep costs reasonable.

## `minRevenue` (type: `integer`):

Only return products reporting at least this much monthly revenue in US dollars. Set to 0 to include all products.

## `maxRevenue` (type: `integer`):

Only return products reporting at most this much monthly revenue in US dollars. Useful for hiding the handful of joke or placeholder figures at the very top of the revenue ranking (a few products claim millions or even billions per month). Leave empty for no upper limit. Note: when you set a limit, products that report no revenue at all are left out.

## Actor input object example

```json
{
  "query": "AI",
  "productUrls": [],
  "sortBy": "newest",
  "maxResults": 100,
  "minRevenue": 0
}
```

# Actor output Schema

## `overview` (type: `string`):

Table of scraped products with key fields.

# API

You can run this Actor programmatically using our API. Below are code examples in JavaScript, Python, and CLI, as well as the OpenAPI specification and MCP server setup.

## JavaScript example

```javascript
import { ApifyClient } from 'apify-client';

// Initialize the ApifyClient with your Apify API token
// Replace the '<YOUR_API_TOKEN>' with your token
const client = new ApifyClient({
    token: '<YOUR_API_TOKEN>',
});

// Prepare Actor input
const input = {
    "query": "AI",
    "productUrls": [],
    "sortBy": "newest",
    "maxResults": 100,
    "minRevenue": 0
};

// Run the Actor and wait for it to finish
const run = await client.actor("solidcode/indiehackers-scraper").call(input);

// Fetch and print Actor results from the run's dataset (if any)
console.log('Results from dataset');
console.log(`💾 Check your data here: https://console.apify.com/storage/datasets/${run.defaultDatasetId}`);
const { items } = await client.dataset(run.defaultDatasetId).listItems();
items.forEach((item) => {
    console.dir(item);
});

// 📚 Want to learn more 📖? Go to → https://docs.apify.com/api/client/js/docs

```

## Python example

```python
from apify_client import ApifyClient

# Initialize the ApifyClient with your Apify API token
# Replace '<YOUR_API_TOKEN>' with your token.
client = ApifyClient("<YOUR_API_TOKEN>")

# Prepare the Actor input
run_input = {
    "query": "AI",
    "productUrls": [],
    "sortBy": "newest",
    "maxResults": 100,
    "minRevenue": 0,
}

# Run the Actor and wait for it to finish
run = client.actor("solidcode/indiehackers-scraper").call(run_input=run_input)

# Fetch and print Actor results from the run's dataset (if there are any)
print(f"💾 Check your data here: https://console.apify.com/storage/datasets/{run.default_dataset_id}")
for item in client.dataset(run.default_dataset_id).iterate_items():
    print(item)

# 📚 Want to learn more 📖? Go to → https://docs.apify.com/api/client/python/docs/quick-start

```

## CLI example

```bash
echo '{
  "query": "AI",
  "productUrls": [],
  "sortBy": "newest",
  "maxResults": 100,
  "minRevenue": 0
}' |
apify call solidcode/indiehackers-scraper --silent --output-dataset

```

## MCP server setup

```json
{
    "mcpServers": {
        "apify": {
            "type": "http",
            "url": "https://mcp.apify.com/?tools=fetch-actor-details,solidcode/indiehackers-scraper"
        }
    }
}

```

The hosted server signs you in with OAuth on first connect, so no API token belongs in this config. Clients without OAuth support can send an `Authorization: Bearer <APIFY_API_TOKEN>` header instead, using a token from API & Integrations in Apify Console (https://console.apify.com/settings/integrations).

## OpenAPI specification

Download the OpenAPI definition: https://api.apify.com/v2/actors/yo2BZwwBgbF0Ybo4Z/builds/7K2JsyH7OCOmM1r57/openapi.json
