API & MCP
The corpus is the product, and most of what wants it is not a browser. Public reads need no key. Everything returns JSON; every list tells you what it filtered on, so a misspelled parameter is visible rather than silently ignored.
MCP
One command, then your agent can read the whole library.
claude mcp add --transport http stealpage https://stealpage.com/api/mcp
search_contentHybrid search across the whole corpus, or one company.list_contentFaceted list — technicality, format, audience, funnel stage.get_pageOne page's markdown plus everything we scored about it.get_domainA company: coverage, health, languages, sitemaps, recent changes.index_domainCrawl a domain we do not have yet.job_statusPoll a crawl.
Content
/api/contentFaceted list. Every filter is a column scored at index time, not a text match.
qdomaintypeformataudiencelocaletopicstechnicality_mindepth_minoriginality_minpromotional_maxhas_codewords_minpublished_aftersortlimitoffsetcurl "https://stealpage.com/api/content?technicality_min=4&promotional_max=2&sort=cited"
/api/content/:idOne page: markdown, facets, assets with alt text, screenshots, crawl history, and who cites it.
markdown=false to omit the bodycurl https://stealpage.com/api/content/pg_abc123
/api/searchHybrid vector + full text over page chunks, fused on rank. Filters apply inside both engines.
qmode=hybrid|vector|textdomainlocaletypetopicstechnicality_minlimitcurl "https://stealpage.com/api/search?q=retrying+failed+webhooks&technicality_min=4"
Companies
/api/domains/:rootCoverage, health, properties per language, their sitemaps, what changed, who they link to.
curl https://stealpage.com/api/domains/stripe.com
Crawling
/api/crawlIndex a domain. Returns a job id immediately — a crawl is minutes to hours, so nothing is held open.
domainbudgetrefreshforceshotscurl -X POST https://stealpage.com/api/crawl -H 'content-type: application/json' -d '{"domain":"stripe.com","budget":500}'/api/jobs/:idLive status: indexed, pending, discovered, elapsed, pages/min, eta, and the coverage buckets.
curl https://stealpage.com/api/jobs/job_abc123
What the numbers mean
- coverage.buckets
- Every URL we know about lands in exactly one bucket, and
unaccountedis always zero. If pages went unfetched they are inbudgetorstoppedEarlywith the reason attached — a crawl cannot report partial work as complete. - inlinks_body
- Internal citations from the BODY of other pages, with template links excluded. Raw
inlinksranks /login top on every site on the web. - estimate
- A range with a confidence, never a single number. Sitemaps under-report orphans and over-report dead URLs at the same time.