{"criteria_id":"agent-readiness/v1","service":"agent-readiness-audit","version":"1.0.0","what_is_checked":"Whether the submitted website can be found, read, and acted on by AI agents, graded on the machine surfaces an agent actually fetches — under nine published criteria. The operator submits a URL of their own site; the audit fetches only the bounded set in the fetch contract.","scope":"This audit grades the machine-readiness signals it can fetch from the submitted URL and its bounded same-origin companion files. It does NOT certify the business behind the site, its safety, or its honesty, and it says nothing about pages or behaviour beyond the fetched documents.","fix_discipline":"Every fix in the report is an ADDITIVE machine surface (a file, a document, a link, structured data). The audit never recommends hiding content from human visitors or serving different content to agents (cloaking).","retention":"Fetched page content is processed in memory only and is never stored. The payments ledger records only the payer, the time, the price, the submitted hostname (never the full URL, path, or query), and the per-criterion outcomes. Because nothing is kept, a paid retry re-sends the URL.","fetch_contract":{"method":"Read-only GET requests, each resource fetched at most once per audit, following redirects; the submitted page is graded at its final URL, and the companion files are read from the final URL's origin root.","user_agent":"ExchangeRebel-AgentReadiness/1.0 (agent-readiness audit; read-only check of public machine-readable surfaces; contact: toll-api)","urls_fetched":["the submitted URL","{origin}/robots.txt","{origin}/sitemap.xml","{origin}/llms.txt","{origin}/agents.json","{origin}/.well-known/x402","at most one OpenAPI document linked from the submitted page (an href naming an OpenAPI/Swagger document, same origin only)"],"never_fetched":"No crawling, no other paths, no form submission, no login, no POSTs to the audited site. The audit fetches the published machine surfaces even where robots.txt disallows them — grading those directives is the product; it identifies itself, fetches each resource once, and puts no load on the site beyond these seven reads.","caps":{"per_document_bytes":524288,"per_document_timeout_ms":10000,"documents_truncated_at_cap":"a document larger than the cap is graded on its first 524288 bytes and the report says so"},"url_rules":"http/https only; no embedded credentials; no localhost or .local/.internal names; IP literals in private, loopback, link-local, or reserved ranges are rejected; ports 80, 443, 8080, 8443 only. An invalid URL is rejected before any payment is verified and never consumes a payment."},"input_contract":{"format":"JSON POST body","fields":{"url":"the page to audit (required) — its public http/https URL","caller":"Solana base58 wallet of the operator (required for the free pre-check; keys the free allowance). On the paid audit the payer is read from the payment itself."},"caps":{"max_body_bytes":16384}},"scoring":{"per_criterion_points":{"present":2,"misshaped":1,"absent":0},"not_applicable":"Two criteria are conditional by definition — mcp_discoverable (graded only when the site's machine surfaces claim an MCP endpoint) and action_path (graded only when the site offers anything to act on: transaction signals on the page or action/payment prose in the machine files). A not_applicable criterion is excluded from both the points and the maximum.","score":"points = sum over applicable criteria; max_points = 2 x applicable criteria; percent = round(100 x points / max_points)","verdict_line_rule":{"80-100":"AGENT-READY — agents can find, read, and act on this site: the graded machine surfaces are in place.","50-79":"PARTIALLY AGENT-READY — agents can reach this site, but some machine surfaces are missing or misshaped; the fix list names them.","0-49":"NOT AGENT-READY — most machine surfaces an agent needs are missing or misshaped; the fix list names them."},"could_not_fetch":"If the submitted URL does not return a readable document (transport error, timeout, or a non-200 final status), the report is the could-not-fetch shape: verdict 'COULD NOT FETCH — the submitted URL did not return a readable document, so no criterion could be graded. Reachability is the first readiness failure: an agent that cannot fetch the page cannot use the site.', the fetch reason, every criterion marked not_graded, and no score. The audit handler checks reachability BEFORE verifying any payment, so an unreachable site never consumes a payment.","reproducibility":"Given the same fetched documents, anyone applying these rules by hand reaches the same statuses, score, and verdict line. The full report (paid) shows the per-criterion evidence the statuses rest on, and the fetch log of exactly what was read."},"criteria":{"robots_access":{"question":"Does robots.txt let agent crawlers fetch the submitted page?","method":"Fetch {origin}/robots.txt and evaluate the submitted page's final path under a simplified RFC 9309: a specific user-agent group's rules override the * group; the longest matching rule path decides; ties go to Allow; an empty Disallow is allow-all.","present":"No robots.txt exists (nothing is published, so nothing blocks), OR generic (*) agents may fetch the path and no named AI-agent crawler group (gptbot, claudebot, google-extended, ccbot, perplexitybot, bytespider, meta-externalagent, amazonbot, applebot-extended, cohere-ai) fully blocks it.","misshaped":"Generic agents may fetch the path, but at least one named AI-agent crawler group fully blocks it — or robots.txt exists but cannot be read (a non-200, non-404 status), so the rules cannot be verified.","absent":"The * group disallows the submitted page's path — generic agent crawlers are told not to fetch the page at all."},"sitemap_present":{"question":"Can an agent find the site's pages from a sitemap at the conventional location?","present":"/sitemap.xml returns 200 and is a valid sitemap document: a <urlset> or <sitemapindex> root and at least one <loc> entry.","misshaped":"/sitemap.xml is served but is not a valid sitemap document, OR it is missing while robots.txt declares a Sitemap: at another location.","absent":"No /sitemap.xml and no Sitemap: declaration in robots.txt."},"llms_txt":{"question":"Does the site publish an llms.txt orientation file for agents?","present":"/llms.txt returns 200 as a non-empty plain-text document (not an HTML page) whose first non-empty line is an H1 heading (# …).","misshaped":"/llms.txt is served but is empty, is served as HTML, or does not start with the H1 summary line.","absent":"/llms.txt is not served (404)."},"agents_json":{"question":"Does the site publish an agents.json describing itself to agents?","present":"/agents.json returns 200 and parses as a single JSON object.","misshaped":"/agents.json is served but does not parse as a JSON object.","absent":"/agents.json is not served (404). (Equivalent agent-card files at other paths are outside this audit's bounded fetch set; the fix list names them.)"},"machine_service_description":{"question":"Is the service described in machine-readable form — an OpenAPI document or structured data?","method":"At most one OpenAPI document linked from the submitted page (same origin) is fetched and validated: JSON documents are validated in full (an openapi string field and a paths object; operations and write operations are counted); YAML documents are validated shallowly (openapi: 3.x and paths: markers). JSON-LD blocks embedded in the page are extracted and parsed.","present":"A valid OpenAPI document was fetched, OR at least one JSON-LD block on the page parses.","misshaped":"A description is advertised but does not validate: the linked OpenAPI document could not be fetched or parsed, or JSON-LD blocks are present but none parses.","absent":"No OpenAPI link and no JSON-LD structured data on the page."},"mcp_discoverable":{"question":"Where the site claims MCP, can an agent find the MCP endpoint?","method":"The fetched machine surfaces (llms.txt, agents.json, the page) are scanned for an MCP claim (the string 'mcp', case-insensitive, anywhere in them) and for a discoverable endpoint: a URL whose path is or ends with /mcp, or a URL-valued MCP key in agents.json. Discoverability only — the audit never connects to the endpoint.","present":"At least one MCP endpoint URL is discoverable in the machine surfaces.","misshaped":"MCP is claimed but no endpoint URL is discoverable in the machine surfaces.","not_applicable":"The site's machine surfaces make no MCP claim."},"readable_structure":{"question":"Can an agent read the page's content from the document itself, without executing JavaScript?","method":"Visible text = the HTML with script/style/noscript/template contents removed and tags stripped. Landmarks = <main>, <article>, <h1>. Thresholds: present needs at least 500 characters of visible text AND at least one landmark; misshaped is 200-499 characters, or 500+ characters with no landmark; absent is under 200 characters. A JSON document at the submitted URL counts as inherently machine-readable (present when it parses); a non-HTML, non-JSON document is absent.","present":"At least 500 characters of visible text AND at least one semantic landmark — or a parseable JSON document.","misshaped":"Content is present but thin (200-499 characters) or landmark-free.","absent":"Under 200 characters of visible text (for example a client-rendered app shell), or the URL serves neither HTML nor JSON."},"action_path":{"question":"Where the site offers anything to act on, is the action/payment path described in machine terms?","method":"Machine paths checked: a valid /.well-known/x402 document listing at least one resource, or at least one non-GET operation in the validated OpenAPI document. Signals checked: action/payment prose (x402, payment, checkout, pay, pricing) in llms.txt/agents.json, and transaction offers on the page (checkout, add to cart, buy now, subscribe now, pricing, a $ price).","present":"A machine-readable action path is published: a valid x402 document with resources, or OpenAPI write operations.","misshaped":"The machine files describe actions or payments in prose, but no machine-readable action path is published.","absent":"The page offers transactions to humans but no machine surface describes any action at all.","not_applicable":"No transaction signals anywhere in the fetched set — a purely informational site has no action path to grade."},"identity_contact":{"question":"Can an agent find who operates the site and how to reach them?","present":"A contact is machine-findable: an email address in llms.txt, agents.json, or the page; a mailto: link on the page; or a contact/support/operator key in agents.json.","misshaped":"Only a human contact-page link (/contact) exists — nothing machine-findable.","absent":"No contact surface in any fetched document."}},"prices":{"precheck":"free — headline only, 100/day per caller wallet, rate-limited (minimum interval between free pre-checks)","audit":{"usd":0.05,"includes":"$0.05 buys one full agent-readiness audit of one submitted URL — every criterion result with evidence and a fix list. The audit fetches only the submitted URL plus its bounded same-origin companion files (robots.txt, sitemap.xml, llms.txt, agents.json, .well-known/x402, and one linked OpenAPI document if present), grades them under the published criteria (GET /criteria), and returns a signed report. This audit grades the machine-readiness signals it can fetch from the submitted URL and its bounded same-origin companion files. It does NOT certify the business behind the site, its safety, or its honesty, and it says nothing about pages or behaviour beyond the fetched documents."}}}