How seo.rank works
seo.rank fetches the page you give it, once, the way a crawler would: plain HTML, no JavaScript run. It also reads /robots.txt, looks for your XML sitemap, and checks that http:// redirects to https://. Then it scores about 25 on-page checks, weighted by how much they matter to search engines, and lists the fixes in the order that moves the score most.
Everything runs in one small process on one box. There are no paid APIs behind it and no headless browser, which is why it can be free.
The free limit
10 audits per visitor per day, and the whole site does at most a few thousand a day so it can never run up a bill. Re-opening a result from the last hour is free: audits of the same URL are kept in memory for an hour. Over the limit, the page says so and the API answers 429 with Retry-After.
No limit at all if you run it yourself: bunx seorank audit --local example.com, or clone the repo.
Privacy
- No cookies, no accounts, no analytics, no third-party scripts. The pages have no JavaScript.
- No access log, and the app logs nothing per request.
- The daily limit counts an HMAC of your IP under a secret that lives only in memory and is replaced every midnight (UTC); the counts cannot be turned back into addresses.
- The one-hour cache holds URLs and their results, nothing about who asked.
The crawler
Audits arrive with the user agent Mozilla/5.0 (compatible; seorank/0.1; +https://seo.rank.pit.world/about#bot). One audit is at most a handful of requests (the page, its redirects, robots.txt, a sitemap, the http check). It only fetches public addresses on ports 80 and 443, and it only fetches when a person or an agent asks it to.
API
GET https://seo.rank.pit.world/api/audit?url=example.com GET https://seo.rank.pit.world/api/quota GET https://seo.rank.pit.world/health
/api/audit returns the full audit: score, grade, checks[] (id, group, label, status, weight, message, fix), fixes[] in priority order, page (title, description, canonical, headings, images, links, Open Graph, JSON-LD types, hreflang), robotsTxt, sitemap and keywords, plus your quota. Headers: X-RateLimit-Limit, X-RateLimit-Remaining, X-RateLimit-Reset. CORS is open; no key.
CLI and TUI
bun add -g seorank # or: bunx seorank … seorank audit example.com # score, fixes, checks seorank audit example.com --json seorank audit example.com --local # on your machine, no limit seorank quota seorank # interactive TUI
SEORANK_URL points the CLI, TUI and MCP server at another instance.
MCP server
claude mcp add seorank -- bunx seorank mcp
{ "mcpServers": { "seorank": { "command": "bunx", "args": ["seorank", "mcp"] } } }
Tools: audit (one URL; returns the score, prioritized fixes and every check) and quota. Set SEORANK_LOCAL=1 to run audits in-process instead of through seo.rank.
Source
MIT licensed: https://github.com/moshcoder/seo.rank. Bun, Hono, and Bun's built-in HTML parser.