Build with WebAnalyzer

Everything on this page is free, open and keyless: a REST API, an MCP server for AI agents, and a set of machine-readable files. No signup, no API key, no OAuth — abuse is handled with per-IP rate limits. Analyses run 290+ deterministic checks and score 0–100 on a deliberately demanding curve.

Quickstart

One request. Typically completes in 5–20 seconds.

curl -X POST https://webanalyzer.dev/api/v1/analyze \
  -H "Content-Type: application/json" \
  -d '{"url": "https://example.com"}'

Response (abridged):

{
  "id": "cm0x…",
  "url": "https://example.com/",
  "score": 62,
  "grade": "C",
  "dimensions": [
    { "key": "seo", "label": "SEO", "score": 71, "grade": "B" },
    { "key": "geo", "label": "AI readiness", "score": 55, "grade": "C" }
  ],
  "topIssues": [ { "dimension": "SEO", "title": "Meta description missing" } ],
  "badgeUrl": "https://webanalyzer.dev/api/badge/cm0x…",
  "reportUrl": "https://webanalyzer.dev/report/cm0x…"
}

Endpoints

The full contract lives in the OpenAPI spec at /openapi.json — flat schemas, typed errors, ready for function-calling. Index at /api/v1.

SDK & CLI

The official package is @webanalyzer/cli (npm, zero dependencies, Node 18+) — CLI and SDK in one, MIT-licensed, source at github.com/Gechu03/webanalyzer-js (with ready-made agent configs: AGENTS.md, CLAUDE.md, .cursorrules, plugin.json).

npx @webanalyzer/cli https://example.com   # score a page from the terminal

import { analyze } from "@webanalyzer/cli";
const report = await analyze("https://example.com");

MCP server (for AI agents)

A Model Context Protocol server runs at https://mcp.webanalyzer.dev (also at https://webanalyzer.dev/.well-known/mcp) over Streamable HTTP with tools analyze_website, get_leaderboard and get_analysis. A separate docs server answers questions about how scoring works at https://webanalyzer.dev/mcp/docs. Listed in the official MCP registry as dev.webanalyzer/webanalyzer. Claude Desktop / Cursor config:

{
  "mcpServers": {
    "webanalyzer": {
      "type": "http",
      "url": "https://mcp.webanalyzer.dev"
    }
  }
}

Rate limits

Analysis endpoints allow 8 runs per minute per IP (shared across the website form, the API and the MCP server); read endpoints allow more. Every API response carries standard RateLimit-Limit / RateLimit-Remaining / RateLimit-Reset headers, and 429s include Retry-After — pace yourself by the headers instead of discovering the limit.

Errors

Every non-2xx response is structured JSON — never an HTML error page: {"error": {"code", "message", "status"}}. Codes: invalid_request (400), blocked_host / fetch_failed (422 — the target URL is unreachable, private or not allowed), rate_limited (429), not_found (404), internal_error (500). The code values are stable — branch on them, not on messages.

Versioning & deprecation policy

The API is path-versioned. /api/v1 is stable: fields are only ever added, never renamed or removed. Backwards-incompatible changes ship under /api/v2, and v1 keeps working for at least 6 months after a deprecation notice is published on this page. During that grace period, deprecated operations also announce themselves in-band with Deprecation and Sunset response headers, so unattended integrations learn about the change before it breaks them. Nothing is deprecated today. Full policy: /deprecation-policy.md.

Authentication

None required, deliberately — every endpoint works with no credential at all. For agent stacks that insist on an OAuth flow, a real optional one exists: register at POST /api/v1/oauth/register (RFC 7591), exchange for a bearer token at POST /api/v1/oauth/token (client_credentials) — it grants no extra privilege. Discovery: /auth.md, /.well-known/oauth-protected-resource (RFC 9728) and /.well-known/oauth-authorization-server (RFC 8414). The full report behind the email gate is a human product feature; everything agent-facing is open.

Machine-readable index

Questions or something broken? Contact us or email hello@webanalyzer.dev.