/api/x402/scanAgent Ready website scan — up to 25 pages
Overview
Runs an AI agent-readability scan of any public website and returns a scored
report — no account, no subscription, no API key.
Pay per call with x402: POST {"url":"https://example.com"} with a signedX-PAYMENT header. This tier scans up to **25 pages**.
Response
201 with { scan, shareUrl, claim }. scan carries the score breakdown;shareUrl is a permalink to the human-readable report. Settlement confirmation
is returned in the X-PAYMENT-RESPONSE header.
Payment
- Network: Base mainnet (CAIP-2 eip155:8453)
- Asset: USDC
- Tiers: $0.02 (25 pages) · $0.25 (250 pages)
Send no payment header to receive a 402 listing the full requirements.
No API key required. Payment is handled through x402 v2 — send a signed X-PAYMENT header (EIP-3009 USDC authorization on Base mainnet, CAIP-2 eip155:8453). MPP is also accepted via Authorization: Payment. Without a payment header the endpoint returns a 402 challenge carrying the payment requirements in the PAYMENT-REQUIRED header and JSON body.
{
"url": {
"description": "Public http(s) URL of the site to scan. Private, reserved and IP-literal addresses are rejected.",
"required": true,
"type": "string"
}
}{
"properties": {
"url": {
"description": "Public http(s) URL of the site to scan. Private, reserved and IP-literal addresses are rejected with 400.",
"format": "uri",
"type": "string"
}
},
"required": [
"url"
],
"type": "object"
}{
"definitions": {
"CheckResult": {
"properties": {
"checkId": {
"type": "string"
},
"details": {
"type": "object"
},
"howToFix": {
"type": [
"string",
"null"
]
},
"message": {
"type": "string"
},
"name": {
"type": "string"
},
"status": {
"description": "pass | fail | warn | absent",
"type": "string"
}
},
"type": "object"
}
},
"properties": {
"claim": {
"description": "Signed token letting the payer claim this scan against an account. Present when claim signing is configured.",
"type": "string"
},
"paymentSettlement": {
"description": "Present and set to \"failed\" only if the scan succeeded but on-chain settlement did not. The result is still returned.",
"type": "string"
},
"scan": {
"properties": {
"accessibilityScore": {
"type": [
"integer",
"null"
]
},
"completedAt": {
"format": "date-time",
"type": [
"string",
"null"
]
},
"corpusTotal": {
"description": "Size of the corpus the percentile is measured against.",
"type": [
"integer",
"null"
]
},
"createdAt": {
"format": "date-time",
"type": "string"
},
"id": {
"type": "string"
},
"llmstxtChecks": {
"items": {
"$ref": "#/definitions/CheckResult"
},
"type": "array"
},
"llmstxtScore": {
"description": "llms.txt conformance score, 0–100.",
"type": "integer"
},
"pageResults": {
"items": {
"properties": {
"checks": {
"items": {
"$ref": "#/definitions/CheckResult"
},
"type": "array"
},
"url": {
"format": "uri",
"type": "string"
}
},
"type": "object"
},
"type": "array"
},
"pagesDiscovered": {
"type": "integer"
},
"pagesScanned": {
"type": "integer"
},
"percentile": {
"description": "Corpus percentile; null when the corpus is too thin to quote.",
"type": [
"integer",
"null"
]
},
"protocolResults": {
"items": {
"$ref": "#/definitions/CheckResult"
},
"type": "array"
},
"rootUrl": {
"format": "uri",
"type": "string"
},
"shareToken": {
"type": "string"
},
"siteChecks": {
"items": {
"$ref": "#/definitions/CheckResult"
},
"type": "array"
},
"status": {
"description": "completed | running | failed",
"type": "string"
},
"vercelRating": {
"description": "Letter grade, e.g. A, B, C.",
"type": "string"
},
"vercelScore": {
"description": "Agent-readability score, 0–100.",
"type": "integer"
}
},
"required": [
"id",
"rootUrl",
"status",
"createdAt",
"completedAt",
"pagesDiscovered",
"pagesScanned",
"vercelScore",
"vercelRating",
"llmstxtScore",
"accessibilityScore",
"percentile",
"corpusTotal",
"siteChecks",
"llmstxtChecks",
"pageResults",
"shareToken"
],
"type": "object"
},
"shareUrl": {
"description": "Permalink path to the human-readable report, e.g. /scan/<shareToken>.",
"type": "string"
}
},
"required": [
"scan",
"shareUrl"
],
"type": "object"
}{
"Authorization": {
"description": "Alternative to X-PAYMENT: an MPP credential in the form 'Payment <credential>'.",
"type": "string"
},
"Content-Type": {
"description": "application/json",
"type": "string"
},
"X-PAYMENT": {
"description": "Base64-encoded x402 v2 payment payload. Omit to receive the 402 challenge.",
"type": "string"
}
}{
"url": "https://example.com"
}{
"claim": "eyJ0IjoiYTFiMmMzZDRlNWY2IiwiZXhwIjoxNzk...",
"scan": {
"accessibilityScore": 88,
"completedAt": "2026-07-24T02:15:31.000Z",
"corpusTotal": 523,
"createdAt": "2026-07-24T02:15:04.000Z",
"id": "scn_9f3a1c8e",
"llmstxtChecks": [
{
"checkId": "L8",
"details": {},
"howToFix": null,
"message": "No llms.txt to evaluate.",
"name": "Sections use H2 headings",
"status": "absent"
}
],
"llmstxtScore": 40,
"pageResults": [
{
"checks": [
{
"checkId": "P11",
"details": {},
"howToFix": null,
"message": "Meta description found (142 chars).",
"name": "Meta description present",
"status": "pass"
}
],
"url": "https://example.com/"
}
],
"pagesDiscovered": 18,
"pagesScanned": 18,
"percentile": 81,
"protocolResults": [
{
"checkId": "C1",
"details": {},
"howToFix": "Publish an MCP server card so agents can discover your tools.",
"message": "No MCP server card at /.well-known/mcp.json.",
"name": "MCP server card",
"status": "fail"
}
],
"rootUrl": "https://example.com",
"shareToken": "a1b2c3d4e5f6",
"siteChecks": [
{
"checkId": "S4",
"details": {},
"howToFix": "Publish an llms.txt file at the root describing your key pages.",
"message": "No /llms.txt found at the site root.",
"name": "llms.txt present",
"status": "fail"
}
],
"status": "completed",
"vercelRating": "B",
"vercelScore": 72
},
"shareUrl": "/scan/a1b2c3d4e5f6"
}