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

LayerChecksWeight
Discovery DSC1025
Semantics SEM420
Entity ENT515
Facts FCT420
Freshness FRS15
Agent interfaces AGI410
Actionability ACT35

Only in the full audit: Trust, Reputation, Transactions.

Checks

CodeCheckRulewCritical
DSC-01HTTPSThe 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.3yes
DSC-02Content without JavaScriptContent 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-03robots.txtrobots.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-04AI crawler accessAI 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.3when Googlebot, Bingbot, OAI-SearchBot is disallowed
DSC-05Google-ExtendedGoogle-Extended is allowed (it affects grounding in the Gemini app) → pass; disallowed → warn.1—
DSC-06SitemapA 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-07No noindexNo noindex on the homepage (meta robots, X-Robots-Tag) → pass; otherwise fail.3yes
DSC-08Canonical URLrel=canonical is present and points to the same host → pass; missing or unparseable → warn; points to another host → fail.1—
DSC-09Title 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-10CDN/firewall blocking signalCDN/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-01Valid JSON-LDAt least one application/ld+json block and all blocks parse → pass; some blocks do not parse → warn; no blocks → fail.3—
SEM-02OrganizationOrganization or a subtype (LocalBusiness, Corporation, Hotel, …) with name and url → pass; one of the two fields missing → warn; no Organization → fail.3—
SEM-03Offering 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-04WebSiteA WebSite entity is present → pass; otherwise warn.1—
ENT-01Consistent nameOrganization.name (normalized) appears in <title> or og:site_name → pass; otherwise warn; no Organization → not applicable.2—
ENT-02Machine-readable contactThe contact is machine-readable: email, telephone or contactPoint in JSON-LD → pass; only mailto: or tel: links → warn; nothing → fail.2—
ENT-03Official profilessameAs lists at least 2 URLs → pass; 1 → warn; 0 → fail.2—
ENT-04LogoOrganization.logo or og:image → pass; otherwise fail.1—
ENT-05Location or service areaaddress, areaServed or geo → pass; otherwise warn.1—
FCT-01Prices in dataA 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-02Prices on the pageA 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-03Data vs page matchConsistency: 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-04Policy linksLinks to policies (terms, privacy, refund/returns, cancellation): at least 2 kinds → pass; 1 → warn; 0 → fail.1—
FRS-01Last-modified dateslastmod 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-01Markdown versionMarkdown: a text/markdown response to "Accept: text/markdown", or rel=alternate type=text/markdown, or /index.md → pass; otherwise fail.2—
AGI-02API catalog / OpenAPIThe 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-03llms.txt/llms.txt returns 200 as text → pass; otherwise warn (low impact; checkers look for it).1—
AGI-04Agent 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-01Detectable main actionA 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-02Labeled form fieldsEvery visible input in forms has a label, aria-label or aria-labelledby → pass; only some → warn; no forms → not applicable.1—
ACT-03No CAPTCHA on step oneNo 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.