Scoring method — AgentsReadable
Scoring version 2026.10-2. The instant check runs 31 checks across 7 layers; the facts it compares against are at /facts.json.
Layers and weights
| Layer | Checks | Weight |
|---|---|---|
Discovery DSC | 10 | 25 |
Semantics SEM | 4 | 20 |
Entity ENT | 5 | 15 |
Facts FCT | 4 | 20 |
Freshness FRS | 1 | 5 |
Agent interfaces AGI | 4 | 10 |
Actionability ACT | 3 | 5 |
Only in the full audit: Trust, Reputation, Transactions.
Checks
| Code | Check | Rule | w | Critical |
|---|---|---|---|---|
DSC-01 | HTTPS | The homepage is reachable over HTTPS: a final 200 after at most 5 redirects → pass; a final 200 over plain http: while https://<host>/ also answers 200 → warn (the site does not redirect to HTTPS); otherwise fail. | 3 | yes |
DSC-02 | Content without JavaScript | Content is in the source HTML, without JavaScript: at least 150 visible words and an <h1> → pass; 150+ words without an <h1> → warn; 50–149 words → warn; otherwise fail. | 3 | — |
DSC-03 | robots.txt | robots.txt returns 200 and parses, or returns 404 or any 4xx other than 429, or a 200 that is not a robots file → pass; a 5xx response, a 429 or a timeout → fail. | 1 | — |
DSC-04 | AI crawler access | AI search and user-triggered agents are not disallowed for /: OAI-SearchBot, ChatGPT-User, Claude-SearchBot, Claude-User, PerplexityBot, Perplexity-User, Googlebot, Bingbot. All allowed → pass; only user-triggered agents disallowed → warn; any search bot disallowed → fail. Critical when Googlebot, Bingbot or OAI-SearchBot is disallowed. | 3 | when Googlebot, Bingbot, OAI-SearchBot is disallowed |
DSC-05 | Google-Extended | Google-Extended is allowed (it affects grounding in the Gemini app) → pass; disallowed → warn. | 1 | — |
DSC-06 | Sitemap | A sitemap is declared with "Sitemap:" in robots.txt or served at /sitemap.xml with a 200, is valid XML and has at least one <loc> → pass; no lastmod → warn; no sitemap → fail. | 2 | — |
DSC-07 | No noindex | No noindex on the homepage (meta robots, X-Robots-Tag) → pass; otherwise fail. | 3 | yes |
DSC-08 | Canonical URL | rel=canonical is present and points to the same host → pass; missing or unparseable → warn; points to another host → fail. | 1 | — |
DSC-09 | Title and description | <title> is 10–70 characters and the meta description is 50–170 characters → pass; present but out of range → warn; missing → fail. | 1 | — |
DSC-10 | CDN/firewall blocking signal | CDN/WAF signal: our checker's user agent gets a 200 while the OAI-SearchBot, ClaudeBot or PerplexityBot user agent gets a 403, a 429 or a challenge → warn ("possible edge blocking — verify in CDN settings"); otherwise pass. Never fail: a spoofed user agent may be handled differently from a verified bot. | 2 | — |
SEM-01 | Valid JSON-LD | At least one application/ld+json block and all blocks parse → pass; some blocks do not parse → warn; no blocks → fail. | 3 | — |
SEM-02 | Organization | Organization or a subtype (LocalBusiness, Corporation, Hotel, …) with name and url → pass; one of the two fields missing → warn; no Organization → fail. | 3 | — |
SEM-03 | Offering type (Service, Product, App, Hotel…) | An offering entity is present: Product, Service, Offer, AggregateOffer, SoftwareApplication (Mobile/WebApplication), LodgingBusiness/Hotel, Restaurant, Event, Course → pass; otherwise fail. | 3 | — |
SEM-04 | WebSite | A WebSite entity is present → pass; otherwise warn. | 1 | — |
ENT-01 | Consistent name | Organization.name (normalized) appears in <title> or og:site_name → pass; otherwise warn; no Organization → not applicable. | 2 | — |
ENT-02 | Machine-readable contact | The contact is machine-readable: email, telephone or contactPoint in JSON-LD → pass; only mailto: or tel: links → warn; nothing → fail. | 2 | — |
ENT-03 | Official profiles | sameAs lists at least 2 URLs → pass; 1 → warn; 0 → fail. | 2 | — |
ENT-04 | Logo | Organization.logo or og:image → pass; otherwise fail. | 1 | — |
ENT-05 | Location or service area | address, areaServed or geo → pass; otherwise warn. | 1 | — |
FCT-01 | Prices in data | A structured price: Offer, PriceSpecification or AggregateOffer with a numeric price, lowPrice or minPrice and a priceCurrency → pass; a price without a currency → warn; none → fail. | 3 | — |
FCT-02 | Prices on the page | A visible price (currency + number) in the source HTML of the homepage or of one same-host page whose link or path matches pricing|prices|plans|rates|tariffs → pass; otherwise fail. | 2 | — |
FCT-03 | Data vs page match | Consistency: every structured price (price, lowPrice or minPrice, as a normalized number) appears in the visible text of the homepage or the pricing page → pass; any mismatch → fail; FCT-01 is not a pass → not applicable. | 3 | — |
FCT-04 | Policy links | Links to policies (terms, privacy, refund/returns, cancellation): at least 2 kinds → pass; 1 → warn; 0 → fail. | 1 | — |
FRS-01 | Last-modified dates | lastmod in the sitemap or dateModified in JSON-LD is at most 180 days old → pass; 181–365 days → warn; older or missing → fail. | 1 | — |
AGI-01 | Markdown version | Markdown: a text/markdown response to "Accept: text/markdown", or rel=alternate type=text/markdown, or /index.md → pass; otherwise fail. | 2 | — |
AGI-02 | API catalog / OpenAPI | The API is discoverable: /.well-known/api-catalog returns 200, or a Link header with rel=api-catalog or rel=service-desc, or a link to openapi.(json|yaml) → pass; otherwise fail. | 2 | — |
AGI-03 | llms.txt | /llms.txt returns 200 as text → pass; otherwise warn (low impact; checkers look for it). | 1 | — |
AGI-04 | Agent protocol endpoint (MCP, UCP, A2A) | An agent protocol endpoint: /.well-known/ucp, an MCP server card at /.well-known/mcp, /.well-known/agent-card.json (or the legacy agent.json) → pass; otherwise warn (early ecosystem). | 1 | — |
ACT-01 | Detectable main action | A detectable main action: a form (at least one input and a submit) or a link whose text or path matches book|reserve|buy|checkout|subscribe|sign up|get started|start trial|contact|quote|download|App Store|Google Play → pass; otherwise fail. | 2 | — |
ACT-02 | Labeled form fields | Every visible input in forms has a label, aria-label or aria-labelledby → pass; only some → warn; no forms → not applicable. | 1 | — |
ACT-03 | No CAPTCHA on step one | No reCAPTCHA, hCaptcha or Turnstile scripts on the homepage → pass; present → warn. | 1 | — |
Score
Every check scores points: pass = 1, warn = 0.5, fail = 0. A check that is not applicable (na) is left out of the calculation.
A layer score is the weighted share of points its checks earned: 100 × Σ(w × points) / Σ w over the applicable checks, rounded half up. A layer with no applicable checks has no score.
The overall score is the weighted average of the layer scores with the layer weights above, rounded half up, over the layers that have a score.
In integer arithmetic:
p2: pass = 2, warn = 1, fail = 0; na excluded
N = Σ w × p2; W = Σ w (applicable checks of the layer)
layer_score = floor((100 × N + W) / (2 × W)); W = 0 → no score
S = Σ LW × layer_score; L = Σ LW (layers with a score)
overall = floor((2 × S + L) / (2 × L))Readiness level
- Level 0 · Invisible: any critical check fails (DSC-01, DSC-07, or DSC-04 when Googlebot, Bingbot, OAI-SearchBot is disallowed), or Discovery scores below 60.
- Level 1 · Discoverable: otherwise.
- Level 2 · Understandable: Level 1 and Semantics ≥ 60 and Entity ≥ 60 and Facts ≥ 50.
- Levels 3–7 are never assigned by the instant check: they depend on trust, reputation and transactions, which need the full audit.
AI snapshot
The AI snapshot is reported separately and never changes the score.
One AI engine, one question, at one moment. A point-in-time sample, not official analytics from any AI platform.