I was trying to answer a boring question: is the market I'm entering already saturated with content?
There's a two-minute test for this. You open domain.com/sitemap.xml for each competitor and count the URLs. It costs nothing, and it tells you more than a keyword tool will, because it shows you what someone actually shipped rather than what someone might search.
So I ran it on eleven companies selling social media data APIs. Here's what came back.
The numbers
| URLs | Domain |
|---|---|
| 2,581 | scrapecreators.com |
| 1,118 | scrapingbee.com |
| 620 | getphyllo.com |
| 610 | firecrawl.dev |
| 485 | sociavault.com |
| 452 | socialcrawl.dev |
| 283 | twitterapi.io |
| 220 | xpoz.ai |
| 4 | socialdata.tools |
| — | ensembledata.com (no accessible sitemap) |
Two things jumped out immediately, and neither was what I expected.
The company everyone talks about isn't the one with the content
I'd been reading about SocialCrawl — 64 platforms, 556 endpoints, a well-told origin story, and real revenue. Every write-up frames them as the one running the content machine.
They're mid-table. ScrapeCreators has 5.7× more pages. SociaVault, which I'd barely heard of, has more than SocialCrawl too.
And EnsembleData — the mature, expensive one that the newer entrants position themselves against — has no accessible sitemap at all. They charge $100/month and appear to do no SEO whatsoever.
That last one reframed the whole exercise for me. I'd been treating content as the way into this market. It's one of at least two.
Then I looked at what the 2,236 pages actually were
ScrapeCreators' sitemap is 87% one directory: /tutorials/. So I pulled the slugs.
/tutorials/how-to-scrape-amazon-shop-shop-with-csharp
/tutorials/how-to-scrape-amazon-shop-shop-with-go
/tutorials/how-to-scrape-amazon-shop-shop-with-java
/tutorials/how-to-scrape-amazon-shop-shop-with-javascript
/tutorials/how-to-scrape-amazon-shop-shop-with-kotlin
...
There it is. It's a template with two variables:
how-to-scrape-{resource}-with-{language}
I split every slug on the last -with- and counted both axes:
- 172 unique resources
- 13 languages — csharp, go, java, javascript, kotlin, nodejs, php, python, r, ruby, rust, swift, typescript
172 × 13 = 2,236.
Not approximately. Exactly. Every single language has precisely 172 pages — no gaps, no manual exceptions, no one-off posts. It's a cross product, generated.
Why this is the useful finding
I'd been reading "2,236 tutorials" as a content team wrote 2,236 tutorials — which would mean the SEO route in this market is closed to anyone without a content budget.
It isn't a content team. It's one template and a code-sample generator.
Which flips the constraint. The ceiling on this kind of SEO isn't how much you can write. It's how many endpoints you have. A new endpoint doesn't produce one page — it produces thirteen.
And that cuts the encouraging way too:
| Endpoints | × 13 languages | Pages |
|---|---|---|
| 10 | 130 | |
| 20 | 260 | |
| 40 | 520 |
Twenty endpoints generates more pages than SocialCrawl's entire sitemap. The work is writing one template well, not writing 2,236 things.
The catch, which is the whole point
You need the endpoints first.
Every one of those 2,236 pages exists because there's a working thing behind it. The page is a demonstration. Publish the template without the product and you get pages that rank for "how to scrape TikTok comments with Python" and then disappoint everyone who arrives.
Which is a slower way of failing than not ranking at all.
What I'm not claiming
This measured occupation, not demand. I counted who publishes what. I did not measure how many people search for any of it, and it's entirely possible that most of those 2,236 pages get no traffic at all. Volume of pages is not volume of visitors, and I'd be doing exactly what I just criticized if I pretended otherwise.
I also only counted sitemaps that were publicly accessible. EnsembleData might have a thousand pages behind a sitemap I couldn't fetch. I doubt it, but I don't know it.
Run it yourself
The whole thing is a fetch and a regex. Point it at your own competitors:
const res = await fetch(`https://${host}/sitemap.xml`);
const xml = await res.text();
const urls = [...xml.matchAll(/<loc>\s*([^<\s]+)\s*<\/loc>/g)].map(m => m[1]);
console.log(host, urls.length);
Watch for <sitemapindex> — some sites point to sub-sitemaps, and counting the index gives you twenty URLs for a site with twenty thousand pages.
Then group by the first path segment. Where a site concentrates 80%+ of its URLs is where it decided to compete. That single number tells you more about a competitor's strategy than their homepage does.
I'm building HonestHook in public — a tool that tracks what's rising and dying in your niche over time, so you know what to post before you write it. The measurements above are the kind of thing it's meant to do automatically.