Tony Wang5 min readHow to Scrape TrustMRR in 2026 (API & Python)
Scrape TrustMRR's verified startup revenue, leaderboard, and marketplace data in 2026 — DIY Python, no-code tools, or one structured API — with real JSON.
TrustMRR is where the indie-SaaS and bootstrapped-startup community posts (and sells) their revenue numbers — a public leaderboard of MRR-verified businesses, plus a marketplace of startups actually for sale. The fastest way to get this data programmatically is a structured API call that returns clean JSON. You can also DIY it in Python, but the real obstacle isn't anti-bot — it's that the site's revenue data lives inside Next.js's React Server Component streaming format, not a page you can just parse with a CSS selector.
Why scrape TrustMRR
- Competitive benchmarking — see what indie SaaS products in your category actually earn (verified, not self-reported) and how fast they're growing.
- Acquisition and deal sourcing — the marketplace surfaces startups for sale with asking price, MRR, and a recency-aware deal score, ahead of manually browsing individual listings.
- Market research on the bootstrapped-SaaS economy — category breakdowns and leaderboard movement are a live signal of which product categories are growing.
- Alternative data for investors and researchers — verified small-business revenue at this granularity is rare outside a platform like this.
Is it legal to scrape TrustMRR?
TrustMRR's robots.txt allows crawling broadly (User-agent: * / Allow: /) and publishes a dedicated startup-sitemap.xml specifically for discovering every startup profile — a strong signal the public directory is meant to be crawled. No dedicated anti-scraping clause surfaced in its Terms of Service as of this writing, but terms change, and this guide only covers the public teaser fields a logged-out visitor already sees. Verify TrustMRR's current terms yourself before scraping at scale, and see Is web scraping legal in 2026? for the general framework. Not legal advice.
Option 1: DIY in Python (and why it breaks)
Slug discovery is genuinely easy — the sitemap is real, public, and exactly matches what you'd want:
import requests
import xml.etree.ElementTree as ET
resp = requests.get("https://trustmrr.com/startup-sitemap.xml", headers={"User-Agent": "Mozilla/5.0"})
root = ET.fromstring(resp.content)
ns = {"sm": "http://www.sitemaps.org/schemas/sitemap/0.9"}
slugs = [url.find("sm:loc", ns).text.rsplit("/", 1)[-1] for url in root.findall("sm:url", ns)]
print(len(slugs), "startups found, e.g.", slugs[:3])
Fetching a single profile page also works with a plain requests.get() — TrustMRR doesn't gate the initial HTML behind JavaScript execution:
page = requests.get("https://trustmrr.com/startup/gumroad", headers={"User-Agent": "Mozilla/5.0"})
Here's where it gets fragile: the page's <title> and meta description carry the headline revenue figure as plain text ("Gumroad - $7,143,938 last 30 days | TrustMRR"), which you can regex out for a single number. But the structured fields this guide actually wants — MRR, growth rate, asking price, category, tech stack — are not in a clean <script type="application/json"> block. They're streamed inside self.__next_f.push(...) calls, Next.js App Router's React Server Component flight format. It's technically parseable (the values are in there as escaped strings), but the format is undocumented, versioned to the exact Next.js build, and has no field-name stability guarantee across a redeploy. A regex that works today can silently return nothing after TrustMRR's next deploy — and you won't get an error, just empty fields.
Option 2: No-code / ready-made tools
A visual scraper (Octoparse-style point-and-click, or a spreadsheet-import browser extension) can pull the leaderboard table for a one-off export reasonably well, since it's a real HTML table by the time the page settles. It gets awkward fast for a recurring pipeline: every per-startup detail field still has to be located inside the same RSC payload structure DIY parsing has to handle, and most no-code tools don't have a built-in RSC-flight parser.
Option 3: A structured TrustMRR API
Crawlora's TrustMRR endpoints return the same data as normalized JSON — no sitemap crawling, no RSC-payload parsing, one auth header.
Revenue leaderboard, ranked by MRR (or last_30_days_revenue, all_time_revenue, growth, traffic, revenue_per_visitor):
curl "https://api.crawlora.net/api/v1/trustmrr/leaderboard?metric=mrr" \
-H "x-api-key: YOUR_API_KEY"
import requests
resp = requests.get(
"https://api.crawlora.net/api/v1/trustmrr/leaderboard",
params={"metric": "mrr"},
headers={"x-api-key": "YOUR_API_KEY"},
)
data = resp.json()["data"]
A real response (trimmed to one entry):
{
"code": 200,
"msg": "OK",
"data": {
"metric": "mrr",
"count": 100,
"entries": [
{
"rank": 1,
"name": "Stan",
"slug": "stan",
"url": "https://trustmrr.com/startup/stan",
"description": "Stan enables people to make living and work for themselves.",
"current_mrr": 3569654.22,
"current_total_revenue": 76627685.07,
"current_last_30_days_revenue": 3569654.22,
"on_sale": false,
"is_merchant_of_record": false,
"x_handle": "vitaliidodonov"
}
]
}
}
Enumerate every startup (this is the structured equivalent of the sitemap crawl above — paginated, no XML parsing):
curl "https://api.crawlora.net/api/v1/trustmrr/startups?page=1&page_size=100" \
-H "x-api-key: YOUR_API_KEY"
Then pull the full verified profile for any slug — revenue and MRR history, growth, asking price and marketplace status, tech stack, marketing channels, and TrustMRR's AI-generated summary:
curl "https://api.crawlora.net/api/v1/trustmrr/startup/gumroad" \
-H "x-api-key: YOUR_API_KEY"
And the marketplace snapshot — the 25 most recently listed startups for sale plus the current 25 best deals by TrustMRR's recency-aware deal score:
curl "https://api.crawlora.net/api/v1/trustmrr/marketplace" \
-H "x-api-key: YOUR_API_KEY"
What you can collect
- Leaderboard: rank, name, slug, description, current MRR, last-30-days revenue, all-time revenue, whether it's on sale, merchant-of-record status, X handle.
- Startup profiles: category, asking price (+ history), branding, tech stack, marketing channels, Ahrefs domain rating, AI-generated business summary.
- Categories: slug, label, description, and keywords for every startup vertical TrustMRR tracks.
- Marketplace: active subscriptions, asking price, category, country, customer count, and deal score for listings currently for sale.
Sources
Where this fits
See the TrustMRR platform page for the full endpoint list. For adjacent startup and deal data, how to scrape PitchBook covers VC/PE-grade company and investor profiles, and how to scrape Product Hunt covers where these same indie products launch before they show up on a revenue leaderboard. See the broader alternative data use case for how verified small-business revenue fits into a research pipeline.
Start collecting
Test the /trustmrr/* endpoints in the Playground before writing any code, or jump straight to the docs. See also how to scrape PitchBook and how to scrape Product Hunt for the rest of the startup-data picture.
Part of our how-to-scrape guide series — every platform we cover, in one index.
Frequently asked questions
Does TrustMRR have a public API?
Not a self-serve one for third-party developers. TrustMRR's own site is powered by an internal API; there's no published, documented public API for outside use, which is why the sitemap-plus-page-scrape (DIY) or a structured third-party API is the practical path.
Is it legal to scrape TrustMRR?
TrustMRR's robots.txt allows crawling broadly and publishes a dedicated startup sitemap, and no scraping-specific prohibition surfaced in its Terms of Service as of this writing — but always verify current terms yourself, and stick to the public teaser data a logged-out visitor already sees. Not legal advice.
Why does a plain requests.get() DIY scraper break on TrustMRR?
It doesn't break outright — the initial HTML does load without JavaScript execution — but the structured fields (MRR, growth, asking price, tech stack) are streamed inside Next.js App Router's React Server Component flight payload (self.__next_f.push(...) calls), not a clean JSON block. That format is undocumented and tied to the exact Next.js build, so a working parser can silently start returning empty fields after a redeploy.
How are TrustMRR's revenue figures verified?
Through connected payment providers (Stripe and similar) rather than self-reported numbers — that verification is what TrustMRR's leaderboard and marketplace pages both advertise, and it's the main reason the dataset is more trustworthy than a typical self-submitted indie-hacker revenue list.
Can I get TrustMRR's acquisition/marketplace listings through the API?
Yes — a dedicated marketplace endpoint returns the 25 most recently listed startups for sale plus the current 25 best deals ranked by TrustMRR's own recency-aware deal score, each with asking price, category, active subscriptions, and customer count.
What's the fastest way to enumerate every startup on TrustMRR?
A paginated structured endpoint that returns slug, URL, and last-modified date directly as JSON is faster to integrate than parsing the sitemap XML yourself, and it's the same underlying discovery mechanism — just without the XML-parsing step.