# TrustMRR Scraper (`solidcode/trustmrr-scraper`) Actor

\[💰 $0.35 / 1K] Extract verified startup revenue from TrustMRR — MRR, total revenue, recent revenue, founders, tech stack, and for-sale asking prices. Scrape the full revenue leaderboard, any category, the acquisition marketplace, or paste specific startup and category URLs.

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

## Pricing

from $0.35 / 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

## TrustMRR Scraper

Pull payment-verified startup revenue from TrustMRR at scale — MRR, last-30-day revenue, lifetime totals, active subscription counts, founder handles, and tech stacks. Every revenue figure on TrustMRR is connected to a live payment provider (Stripe, RevenueCat, Superwall, Creem), so you skip the self-reported guesswork that fills most startup databases. Built for VC and angel investors, M\&A buyers, founders, and B2B sales teams who need real revenue numbers on indie SaaS companies without opening profiles one tab at a time.

### Why This Scraper?

- **Payment-verified revenue on 100% of rows** — `mrr`, `revenueLast30Days`, lifetime `totalRevenue` and `activeSubscriptions` are filled on every single record we measured (355 profile-enriched rows across three runs), each tied to a connected payment provider rather than a founder's estimate.
- **The full 450+ startup revenue leaderboard** — an uncapped leaderboard run returned 458 ranked companies in one pass, not just a top 100. Every one carries its exact TrustMRR `rank`.
- **31 categories, exact slugs included** — `saas`, `ai`, `developer-tools`, `fintech`, `ecommerce`, `crypto-web3`, `no-code`, `content-creation`, `health-fitness`, `real-estate` and 21 more, each paginated to the end.
- **The whole public acquisition marketplace — 135 listings** — with `forSale`, `askingPrice` and a formatted `revenueMultiple` (`"8.91x"`). TrustMRR states it holds 2,150 for-sale startups and shows 135 of them to non-members, and the run tells you that in its own status line instead of quietly implying it got everything.
- **Asking price on 98.5% of marketplace rows** — with **Include full startup profiles** on. Leave profiles off and it drops to 25.9%, because only the marketplace feed carries the price inline. The run's `forSale` flag is correct either way.
- **Founder outreach path on 56–84% of enriched rows** — `founderName`, X (Twitter) handle and a direct founder link. The gap is not a miss: TrustMRR lets a founder verify revenue while staying anonymous, and those profiles publish no founder at all.
- **Tech stack on 34–75% of enriched rows** — the tools each company runs on, comma-joined into `techStack` (`nextjs, supabase, stripe`). TrustMRR publishes an empty stack for the rest, so you get exactly what the site holds and nothing invented.
- **Two category signals, not one** — `sourceCategory` is the category page a startup was listed on, `category` is the one its founder declared. They disagree on 58% of rows, which is the difference between market sizing and positioning.
- **One flat row per startup** — 21 clean columns, spreadsheet-ready, no nested JSON to flatten before you analyze.

### Use Cases

**Investment Sourcing**

- Surface the highest-MRR indie startups from the 450+ leaderboard for deal flow
- Filter verticals like `ai` or `developer-tools` to build a watchlist
- Rank prospects by verified revenue instead of pitch-deck projections
- Track founder X handles to reach out before a company raises

**M\&A & Acquisition**

- Pull the 135 public for-sale listings with asking price and revenue multiple in one run
- Compare asking prices against verified MRR to spot fairly-priced deals
- Build a pipeline of targets with revenue, founding date, and tech stack attached
- Benchmark revenue multiples across categories to value your own deal

**Competitive Intelligence**

- Map a category's revenue distribution to size your market
- See which tools the top-earning startups in your space actually run on
- Monitor a competitor's verified MRR and subscriber count over time
- Spot fast-growing newcomers by founded date against current revenue

**Sales Lead Generation**

- Build B2B lead lists of revenue-positive SaaS companies, filtered by MRR band
- Capture founder name, X handle, and website for personalized outreach
- Qualify prospects on verified revenue before they ever reach your CRM
- Target startups in the categories that match your ideal customer profile

**Market Research & Benchmarking**

- Benchmark your own MRR against verified peers in the same category
- Study revenue-to-subscriber ratios across the directory
- Track which of the 31 categories concentrate the most verified revenue
- Analyze founding-year cohorts against their current revenue

### Getting Started

#### The Revenue Leaderboard (simplest)

Scrape TrustMRR's ranked revenue leaderboard, enriched with full profiles:

```json
{
    "source": "leaderboard",
    "maxResults": 100
}
```

Set `maxResults` to `0` and the same run returns the whole leaderboard — 458 startups when we last measured it. A capped run takes TrustMRR's homepage in its own order, which mixes trending and newest picks in with the ranked list, so sort on `rank` afterwards if you want a strict top-N.

#### A Specific Category

Pull every startup in one or more categories by slug:

```json
{
    "categorySlugs": ["ai", "developer-tools"],
    "scrapeProfiles": true,
    "maxResults": 200
}
```

#### The Acquisition Marketplace

Get the startups listed for sale, with asking price and revenue multiple. TrustMRR keeps most of its marketplace behind a member login, so the run reports how many of the site's listings were publicly reachable:

```json
{
    "source": "marketplace",
    "maxResults": 0
}
```

#### Paste TrustMRR URLs Directly

Mix category, leaderboard, marketplace, and individual startup pages:

```json
{
    "startUrls": [
        "https://trustmrr.com/category/fintech",
        "https://trustmrr.com/startup/stan",
        "https://trustmrr.com/acquire"
    ],
    "scrapeProfiles": true,
    "maxResults": 150
}
```

### Input Reference

#### What to Scrape

Pick at least one source — paste URLs, choose a built-in source, or list category slugs. You can combine them.

| Parameter | Type | Default | Description |
|-----------|------|---------|-------------|
| `startUrls` | string\[] | `[]` | Paste TrustMRR URLs directly. Accepts category pages (`trustmrr.com/category/saas`), the marketplace (`trustmrr.com/acquire`), the leaderboard (`trustmrr.com`), or individual startups (`trustmrr.com/startup/stan`). |
| `source` | select | `Revenue leaderboard` | A ready-made list to scrape without pasting URLs. Choose **Revenue leaderboard (full list)**, **For-sale marketplace**, or **None (use URLs or categories)**. |
| `categorySlugs` | string\[] | `[]` | Category slugs to scrape — the part after `/category/` in the URL. All 31: `ai`, `analytics`, `community`, `content-creation`, `crypto-web3`, `customer-support`, `design-tools`, `developer-tools`, `ecommerce`, `education`, `entertainment`, `fintech`, `games`, `green-tech`, `health-fitness`, `iot-hardware`, `legal`, `marketing`, `marketplace`, `mobile-apps`, `news-magazines`, `no-code`, `productivity`, `real-estate`, `recruiting`, `saas`, `sales`, `security`, `social-media`, `travel`, `utilities`. One per line; each category gets an equal share of `maxResults`. |

#### Enrichment & Limits

| Parameter | Type | Default | Description |
|-----------|------|---------|-------------|
| `scrapeProfiles` | boolean | `true` | When on, visits each startup's profile page to add the deeper fields: lifetime total revenue, active subscriptions, founder name and X handle, location, founded date, tech stack, TrustMRR rank, and the founder's declared category. When off you get the lighter list fields only — name, tagline, MRR, recent revenue, total revenue and `forSale`. |
| `maxResults` | integer | `100` | Cap on total startups across all sources. Set to `0` for no cap. With more than one source the cap is split evenly between them and unused share is passed on, so no source comes back empty. The actor stops loading new pages once a source's share is filled and keeps the full final page. |

### Output

Each startup is one flat row. Here's a real result from a `developer-tools` category run with profiles enabled:

```json
{
    "name": "Codédex",
    "tagline": "Start your coding adventure ⋆˙⟡",
    "description": "Start your coding adventure ⋆˙⟡",
    "mrr": 87334.97,
    "revenueLast30Days": 78386.86,
    "totalRevenue": 1370415.24,
    "activeSubscriptions": 6901,
    "rank": 70,
    "category": "Education",
    "sourceCategory": "Developer Tools",
    "foundedDate": "2022-11-07T00:00:00.000Z",
    "location": "US",
    "websiteUrl": "https://www.codedex.io/",
    "founderName": "Sonny Li",
    "founderXHandle": "sonnynomnom",
    "founderUrl": "https://trustmrr.com/founder/sonnynomnom",
    "techStack": "vercel, typescript, react, gcp",
    "forSale": false,
    "askingPrice": null,
    "revenueMultiple": null,
    "url": "https://trustmrr.com/startup/codedex"
}
```

And a real row from the acquisition marketplace, where the deal fields are filled:

```json
{
    "name": "POST BRIDGE",
    "tagline": "Post your content to multiple social media platforms at the same time, all-in one place.",
    "mrr": 45637.08,
    "revenueLast30Days": 39652.08,
    "totalRevenue": 467436.89,
    "activeSubscriptions": 1642,
    "rank": 183,
    "category": "Social Media",
    "foundedDate": "2024-09-30T00:00:00.000Z",
    "location": "CA",
    "websiteUrl": "https://www.post-bridge.com/",
    "founderName": "jack friks",
    "founderXHandle": "jackfriks",
    "techStack": "nextjs, supabase, stripe",
    "forSale": true,
    "askingPrice": 4206969,
    "revenueMultiple": "8.91x",
    "url": "https://trustmrr.com/startup/post-bridge"
}
```

#### Core Fields

| Field | Type | Description |
|-------|------|-------------|
| `name` | string | Startup name, with accents preserved (`Codédex`) |
| `tagline` | string | The startup's one-line summary, as published on TrustMRR |
| `description` | string | Long description. TrustMRR publishes a single summary per startup, so on today's site this always carries the same text as `tagline` |
| `url` | string | Direct TrustMRR profile URL |

#### Revenue

| Field | Type | Description |
|-------|------|-------------|
| `mrr` | number | Current monthly recurring revenue in USD. `0` for businesses whose verified revenue is not subscription-based — TrustMRR's own figure, passed through unchanged |
| `revenueLast30Days` | number | Revenue collected in the last 30 days, USD |
| `totalRevenue` | number | Lifetime all-time revenue, USD |
| `activeSubscriptions` | number | Count of currently active subscriptions |

#### Category

| Field | Type | Description |
|-------|------|-------------|
| `category` | string | The category the founder declared for their own startup (`"Education"`). Needs profiles on |
| `sourceCategory` | string | The category page this row was listed on, in TrustMRR's own wording (`"Developer Tools"`, `"Crypto & Web3"`). Filled on every category run whether profiles are on or off; empty for leaderboard, marketplace and single-startup rows |

#### Founder

| Field | Type | Description |
|-------|------|-------------|
| `founderName` | string | Founder's name |
| `founderXHandle` | string | Founder's X (Twitter) handle |
| `founderUrl` | string | Link to the founder's TrustMRR profile |

#### Deal Terms

| Field | Type | Description |
|-------|------|-------------|
| `forSale` | boolean | `true` only when the startup is on TrustMRR's live acquisition marketplace. This is the field to filter on |
| `askingPrice` | number | The founder's own stated asking price, USD. TrustMRR keeps a price on file after a listing closes, so a filled `askingPrice` with `forSale: false` is a closed or aspirational listing, not a live one — about 1 in 5 price-carrying rows on a category or leaderboard run |
| `revenueMultiple` | string | Asking price as a multiple of revenue, formatted (`"8.91x"`). Same caveat as `askingPrice`: read it together with `forSale` |

#### Profile & Meta

Filled when **Include full startup profiles** is on.

| Field | Type | Description |
|-------|------|-------------|
| `rank` | number | TrustMRR leaderboard rank |
| `location` | string | Two-letter country code, ISO-2 (`"US"`, `"GB"`, `"IN"`) |
| `websiteUrl` | string | The startup's own website |
| `foundedDate` | string | Founding date as a full ISO 8601 timestamp (`"2022-11-07T00:00:00.000Z"`) |
| `techStack` | string | Tools and platforms the startup runs on, comma-joined (`"nextjs, supabase, stripe"`) |

#### How Often Each Field Is Filled

Measured across three full runs with profiles on — 100 leaderboard rows, 135 marketplace rows, 120 category rows.

| Field | Leaderboard | Marketplace | Category |
|-------|-------------|-------------|----------|
| `mrr`, `revenueLast30Days`, `totalRevenue`, `activeSubscriptions`, `forSale`, `url` | 100% | 100% | 100% |
| `rank` | 100% | 97.8% | 100% |
| `foundedDate` | 83.0% | 93.3% | 97.5% |
| `location` | 75.0% | 85.2% | 94.2% |
| `websiteUrl` | 62.0% | 83.0% | 94.2% |
| `tagline` / `description` | 77.0% | 97.0% | 95.8% |
| `founderName` | 77.0% | 55.6% | 84.2% |
| `techStack` | 34.0% | 74.8% | 45.8% |
| `askingPrice` | 14.0% | 98.5% | 21.7% |

The nulls are the site's, not the run's: TrustMRR lets a founder publish verified revenue while hiding the name, website and description, and it serves an empty tech stack for any startup that never filled one in. Rows like that still carry a full set of verified revenue figures and a rank.

### Tips for Best Results

- **Leave profiles on for anything but a headcount** — `rank`, `category`, `location`, `websiteUrl`, `foundedDate`, `techStack`, `activeSubscriptions` and the founder fields only arrive with **Include full startup profiles** enabled, and marketplace `askingPrice` climbs from 25.9% to 98.5%. Turn it off only for a fast name-and-revenue sweep.
- **Filter acquisitions on `forSale`, never on `askingPrice`** — TrustMRR keeps a founder's stated price after the listing closes, so roughly 1 in 5 price-carrying rows outside the marketplace is a dead listing. `forSale: true` is the only field that means "buyable today".
- **`sourceCategory` and `category` answer different questions** — `sourceCategory` is the page a startup was listed on and arrives on every category run for free; `category` is what its founder declared. They disagree on 58% of rows, because TrustMRR lists a startup under every category that fits. Group by `sourceCategory` for market sizing, by `category` for how founders position themselves.
- **Copy category slugs exactly** — they are not always what you would guess. It is `ecommerce`, not `e-commerce`; `crypto-web3`, not `crypto`; `health-fitness`, `no-code`, `iot-hardware`. The full list of 31 is in the input reference above.
- **The marketplace is a partial view by design** — TrustMRR publishes 135 of its 2,150 for-sale startups to visitors and keeps the rest behind a member login. Run `source: "marketplace"` with `maxResults: 0` to take everything public, and read the run's closing note for the exact split.
- **Set `maxResults` to 0 for whole categories or the whole leaderboard** — uncapped runs follow pagination to the end, which is how you get all 458 ranked startups rather than the first page.
- **For a strict top-N, run uncapped and sort on `rank`** — TrustMRR's homepage interleaves trending, newest and sponsored picks with its ranked list, so `maxResults: 100` came back with ranks spread from 1 to 640 and only 52 rows inside the top 100. Uncapped plus a sort on `rank` is the reliable way to get the real top 50 or top 200.
- **Founder X handles power outreach** — `founderXHandle` plus `founderUrl` give you a contact path straight to the person behind the revenue, on roughly three quarters of enriched rows.

### Pricing

**From $0.35 per 1,000 results** — pay only for the verified startup records you collect, with no minimums. 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.041 | $0.039 | $0.037 | $0.035 |
| 1,000 | $0.41 | $0.39 | $0.37 | $0.35 |
| 10,000 | $4.10 | $3.90 | $3.70 | $3.50 |
| 100,000 | $41.00 | $39.00 | $37.00 | $35.00 |

A "result" is any startup row in the output dataset. No compute or time-based charges — you pay per result, plus a small fixed per-run start fee.

### 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 is designed for legitimate market research, investment sourcing, competitive analysis, and lead generation using publicly available startup data. Users are responsible for complying with applicable laws and TrustMRR's Terms of Service. Do not use extracted data for spam, harassment, or any unlawful purpose, and handle any personal data (such as founder names and contact handles) in line with applicable privacy regulations. </content> </invoke>

# Actor input Schema

## `startUrls` (type: `array`):

Paste one or more TrustMRR URLs to scrape directly. Accepts category pages (trustmrr.com/category/saas), the marketplace (trustmrr.com/acquire), the leaderboard (trustmrr.com), or individual startup pages (trustmrr.com/startup/stan). Leave empty to use the Source and Categories options below.

## `source` (type: `string`):

A ready-made list to scrape without pasting URLs. 'Revenue leaderboard' returns TrustMRR's whole ranked list of highest-revenue startups - several hundred companies, so set Maximum Results if you want a smaller slice. 'For-sale marketplace' returns the startups TrustMRR lists publicly for acquisition, with their asking price. Choose 'None' if you are only using URLs or categories below.

## `categorySlugs` (type: `array`):

TrustMRR category slugs to scrape — the part after /category/ in the URL. Examples: 'ai', 'saas', 'developer-tools', 'fintech', 'ecommerce' (no hyphen), 'crypto-web3'. Every category you list is scraped, each getting an equal share of the Maximum Results cap. Leave empty to skip category scraping.

## `scrapeProfiles` (type: `boolean`):

When on, each startup's profile page is visited to add deeper fields: total all-time revenue, active subscriptions, founder name and X (Twitter) handle, location, founded date, tech stack, and TrustMRR rank. When off, you only get the lighter fields shown on the list (name, MRR, recent revenue, total revenue). Turning this on adds one request per startup and increases run time.

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

Cap on total startups across all sources. Default 100 — increase for bigger runs, or set to 0 for no cap. When you scrape more than one source, the cap is split evenly between them, and any source that runs out early passes its unused share to the others — so nothing you asked for comes back empty. The actor stops loading new pages once a source's share is filled but keeps the full final page even if it slightly overshoots.

## Actor input object example

```json
{
  "startUrls": [],
  "source": "leaderboard",
  "categorySlugs": [],
  "scrapeProfiles": true,
  "maxResults": 100
}
```

# Actor output Schema

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

Compact table of startups with name, MRR, revenue, and rank.

## `detail` (type: `string`):

All fields including founder, location, tech stack, and for-sale data.

# 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 = {
    "startUrls": [],
    "source": "leaderboard",
    "categorySlugs": [],
    "scrapeProfiles": true,
    "maxResults": 100
};

// Run the Actor and wait for it to finish
const run = await client.actor("solidcode/trustmrr-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 = {
    "startUrls": [],
    "source": "leaderboard",
    "categorySlugs": [],
    "scrapeProfiles": True,
    "maxResults": 100,
}

# Run the Actor and wait for it to finish
run = client.actor("solidcode/trustmrr-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 '{
  "startUrls": [],
  "source": "leaderboard",
  "categorySlugs": [],
  "scrapeProfiles": true,
  "maxResults": 100
}' |
apify call solidcode/trustmrr-scraper --silent --output-dataset

```

## MCP server setup

```json
{
    "mcpServers": {
        "apify": {
            "type": "http",
            "url": "https://mcp.apify.com/?tools=fetch-actor-details,solidcode/trustmrr-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/qissJl1JA2pL8Dbaj/builds/heghEeiq2sMSiyOCO/openapi.json
