Website checks
Find out what a scan looks for. Each check explains its rule, supporting proof and limits. Scored checks can affect your result. Advisory and experimental checks provide context without changing the score.
Showing 215 of 215 checks
access-crawl-control/agent-governanceGrade AScoredAI crawler vs conversational agent separation
Not all AI bots are the same. Training crawlers like GPTBot, CCBot, and Google-Extended scrape your content to build datasets, while conversational and retrieval agents like ChatGPT-User, Claude-User, and OAI-SearchBot fetch pages live to answer real user questions and can send referral traffic back to you. Many sites want to block the former while welcoming the latter — but a single catch-all User-agent: * cannot express that distinction. Granular robots.txt governance names both categories explicitly so each gets the access policy you actually intend.
Access & Crawl Control
access-crawl-control/ai-bot-directivesGrade BScoredAI bot directives are explicit
Reports your robots.txt stance on five long-tail AI bot tokens in one place. Only the bots whose operator publishes crawler documentation — YouBot (You.com) and AI2Bot (Allen Institute) — affect the score, because only those directives have a documented reader. Bytespider, cohere-ai and Diffbot are listed for information: blocking them is a legitimate operational choice that costs no AI-answer visibility.
Access & Crawl Control
access-crawl-control/ai-content-declarationGrade DExperimentalAI usage-preference declaration
Where a site declares how AI systems may use its content. The IETF AIPREF work attaches that preference to a Content-Usage response header or a robots.txt rule, and explicitly leaves the HTML head out of scope; the head-level noai/noimageai convention has real adoption but no AI vendor documents honoring it. This audit reports what a site declares and where, and never treats declaring nothing as a defect.
Access & Crawl Control
access-crawl-control/ai-crawler-edge-parityGrade AScoredAI crawlers get the same response from the edge that browsers get
Fetches the homepage, sampled content URLs and /llms.txt once as a browser and once per published AI crawler User-Agent, then classifies every difference: Cloudflare challenge, pay-per-crawl 402, proof-of-work wall, rate limit, opaque 403, or a 200 carrying a fraction of the text. Reports per crawler and per URL, and scores a block only where robots.txt said the crawler was welcome.
Access & Crawl Control
access-crawl-control/ai-usage-signal-coherence-across-channelsGrade BScoredAI usage signals agree across every channel that carries them
Normalizes every AI-usage signal the site emits — robots.txt Allow/Disallow for training crawlers, AIPREF Content-Usage, Cloudflare Content-Signal, TDM-Rep in its three transports, and inline RSL permits/prohibits — into one comparable model, and reports where two channels contradict each other for the same category over overlapping paths.
Access & Crawl Control
access-crawl-control/aipref-content-usage-declaration-validityGrade BScoredAIPREF Content-Usage declarations are valid and can be read
Parses every `Content-Usage` declaration — in robots.txt at file scope and inside each group, and in the response header — as the RFC 8941 dictionary AIPREF defines, validates its categories and values, and checks that the paths it attaches to are actually crawlable. A preference attached to a disallowed path has no effect: attach-05 gives disallowed paths no usage preferences at all.
Access & Crawl Control
access-crawl-control/amazonbotGrade AScoredAmazonbot allowed
Without an explicit robots.txt rule, Amazonbot may still crawl your site but has no signal that it is welcome. Adding an explicit allow rule improves your visibility in AI-powered search and ensures consistent crawler behavior.
Access & Crawl Control
access-crawl-control/anthropic-aiGrade AScoredClaudeBot crawl access
ClaudeBot collects web content that may contribute to Anthropic's model training, and Anthropic states its bots honour robots.txt. This check reads the robots.txt rules that actually apply to ClaudeBot — its own group if it has one, otherwise the catch-all — and reports whether they let it fetch the site root. A named group is not required: under RFC 9309 §2.2.1 an open catch-all grants the same access. The legacy `anthropic-ai` and `Claude-Web` tokens are reported when present but never scored, because Anthropic's current crawler documentation names neither.
Access & Crawl Control
access-crawl-control/applebot-extendedGrade AScoredApplebot-Extended allowed
Without an explicit robots.txt rule, Applebot-Extended may still crawl your site but has no signal that it is welcome. Adding an explicit allow rule improves your visibility in AI-powered search and ensures consistent crawler behavior.
Access & Crawl Control
access-crawl-control/bot-content-delta-declaredGrade AScoredContent served to AI crawlers matches the browser, or is declared
Fetches sampled content URLs as a browser and as GPTBot, ClaudeBot and PerplexityBot, then measures the difference two ways — main-text length ratio and 5-gram shingle similarity — because a stub and a rewritten page look identical on length alone. Where a difference exists, requires Google's restricted-content markup and checks that the declared cssSelector resolves against the served DOM.
Access & Crawl Control
access-crawl-control/bravebotGrade CAdvisoryBravebot allowed
Without an explicit robots.txt rule, Bravebot may still crawl your site but has no signal that it is welcome. Adding an explicit allow rule improves your visibility in AI-powered search and ensures consistent crawler behavior.
Access & Crawl Control
access-crawl-control/canonicalGrade AScoredCanonical URLs point at the right page
A `<link rel="canonical">` tells crawlers which URL is the authoritative version of a page, and the URL they pick is the one eligible to be shown — and cited — in AI answers. The value matters more than the presence: pages that all canonicalize onto the homepage remove themselves from the index.
Access & Crawl Control
access-crawl-control/ccbotGrade AScoredCCBot allowed
Without an explicit robots.txt rule, CCBot may still crawl your site but has no signal that it is welcome. Adding an explicit allow rule improves your visibility in AI-powered search and ensures consistent crawler behavior.
Access & Crawl Control
access-crawl-control/chatgpt-userGrade CAdvisoryChatGPT-User allowed
Without an explicit robots.txt rule, ChatGPT-User may still crawl your site but has no signal that it is welcome. Adding an explicit allow rule improves your visibility in AI-powered search and ensures consistent crawler behavior.
Access & Crawl Control
access-crawl-control/claude-searchbotGrade AScoredClaude-SearchBot allowed
Without an explicit robots.txt rule, Claude-SearchBot may still crawl your site but has no signal that it is welcome. Adding an explicit allow rule improves your visibility in AI-powered search and ensures consistent crawler behavior.
Access & Crawl Control
access-crawl-control/claude-userGrade AScoredClaude-User allowed
Without an explicit robots.txt rule, Claude-User may still crawl your site but has no signal that it is welcome. Adding an explicit allow rule improves your visibility in AI-powered search and ensures consistent crawler behavior.
Access & Crawl Control
access-crawl-control/crawl-delayGrade CAdvisoryCrawl-delay is reasonable
Excessive Crawl-delay values (over 10 seconds) dramatically slow AI indexing, meaning your latest content may take days or weeks to appear in AI search results.
Access & Crawl Control
access-crawl-control/duckassistbotGrade AScoredDuckAssistBot allowed
Without an explicit robots.txt rule, DuckAssistBot may still crawl your site but has no signal that it is welcome. Adding an explicit allow rule improves your visibility in AI-powered search and ensures consistent crawler behavior.
Access & Crawl Control
access-crawl-control/google-extendedGrade AScoredGoogle-Extended allowed
Without an explicit robots.txt rule, Google-Extended may still crawl your site but has no signal that it is welcome. Adding an explicit allow rule improves your visibility in AI-powered search and ensures consistent crawler behavior.
Access & Crawl Control
access-crawl-control/gptbotGrade AScoredGPTBot allowed
Without an explicit robots.txt rule, GPTBot may still crawl your site but has no signal that it is welcome. Adding an explicit allow rule improves your visibility in AI-powered search and ensures consistent crawler behavior.
Access & Crawl Control
access-crawl-control/https-enabledGrade AScoredHTTPS enabled
Enterprise AI frameworks refuse to interact with non-HTTPS sites due to security policies. GPTBot, ClaudeBot, and enterprise RAG systems all skip HTTP-only sites entirely, making your content invisible to AI-generated answers. Enable HTTPS with a valid TLS certificate.
Access & Crawl Control
access-crawl-control/machine-actionable-402-paid-accessGrade BScoredA 402 tells a crawler how to pay
Looks at every 402 the crawler-UA probes and the browser baseline received, and asks whether any machine-readable payment mechanism came with it: a `crawler-price` header, an x402 `PAYMENT-REQUIRED` challenge, or an RSL licence with a crawl payment covering the path. A 402 carrying only an HTML page is a price tag no crawler can read.
Access & Crawl Control
access-crawl-control/meta-external-agentGrade AScoredMeta-ExternalAgent allowed
Meta-ExternalAgent collects pages for Meta's foundation-model training and for indexing content directly into Meta products, and Meta documents it as respecting robots.txt. This check reads the robots.txt rules that actually apply to it — its own group if it has one, otherwise the catch-all — and reports whether they let it fetch the site root. A named group is not required: under RFC 9309 an open catch-all grants the same access.
Access & Crawl Control
access-crawl-control/meta-external-fetcherGrade AScoredMeta-ExternalFetcher allowed
Without an explicit robots.txt rule, Meta-ExternalFetcher may still crawl your site but has no signal that it is welcome. Adding an explicit allow rule improves your visibility in AI-powered search and ensures consistent crawler behavior.
Access & Crawl Control
access-crawl-control/mistralai-userGrade AScoredMistralAI-User allowed
Without an explicit robots.txt rule, MistralAI-User may still crawl your site but has no signal that it is welcome. Adding an explicit allow rule improves your visibility in AI-powered search and ensures consistent crawler behavior.
Access & Crawl Control
access-crawl-control/no-blanket-blockGrade BScoredNo blanket AI block
A blanket Disallow: / under User-agent: * blocks every crawler, including all AI agents. Your site becomes invisible to AI search engines, ChatGPT Browse, Perplexity, and others.
Access & Crawl Control
access-crawl-control/no-bot-detectionGrade AScoredNo aggressive bot-detection blocking agents
Bot-detection services like Cloudflare Turnstile, DataDome, and reCAPTCHA can block legitimate AI agents from accessing your content. Configure your service to allowlist known AI user-agents.
Access & Crawl Control
access-crawl-control/no-nofollowGrade AScoredNo nofollow on important links
A site-wide nofollow directive prevents AI crawlers from following links to discover your content. Important internal links should be followable.
Access & Crawl Control
access-crawl-control/no-redirect-chainsGrade AScoredNo redirect chains
Redirect chains waste AI crawler budget and slow down content discovery. Each page should resolve in a single redirect at most.
Access & Crawl Control
access-crawl-control/oai-searchbotGrade AScoredOAI-SearchBot allowed
Without an explicit robots.txt rule, OAI-SearchBot may still crawl your site but has no signal that it is welcome. Adding an explicit allow rule improves your visibility in AI-powered search and ensures consistent crawler behavior.
Access & Crawl Control
access-crawl-control/perplexitybotGrade AScoredPerplexityBot allowed
Without an explicit robots.txt rule, PerplexityBot may still crawl your site but has no signal that it is welcome. Adding an explicit allow rule improves your visibility in AI-powered search and ensures consistent crawler behavior.
Access & Crawl Control
access-crawl-control/robots-ai-group-shadowingGrade AScoredrobots.txt AI group shadowing
Detects the RFC 9309 group-precedence trap: adding ANY named group for an AI product token silently voids every rule in the `User-agent: *` group for that bot. Evaluates each AI token twice — under its own merged group and under the wildcard group — with longest-match-wins and Allow-wins-on-tie, and reports three failure classes: a wildcard-protected path reopened for the bot, a named group with no rules at all, and a named group that blocks a bot the wildcard allowed.
Access & Crawl Control
access-crawl-control/robots-directivesGrade AScoredRobots directives do not block AI indexing
Robots directives — `<meta name="robots">`, per-bot meta tags and the `X-Robots-Tag` header — decide whether a page can be indexed at all and whether it can be quoted in an AI answer. A `noindex` on a content page removes it from the index AI Overviews and AI Mode draw on; `nosnippet` and `max-snippet:0` leave it indexed but unquotable.
Access & Crawl Control
access-crawl-control/rsl-licensing-terms-conformanceGrade BScoredRSL licensing terms are discoverable and conformant
Looks for an RSL licence in all four channels the specification defines — the robots.txt `License:` directive, a `Link: rel=license` response header, an HTML `<link>`, and an inline `<script type="application/rsl+xml">` — then validates the document: its namespace, its media type, the paths its `<content url>` covers, and the enumerated attributes on every permits, prohibits, payment and amount element.
Access & Crawl Control
access-crawl-control/sensitive-pathsGrade AScoredLow-value URLs excluded from AI crawls
AI crawlers honour path-level Disallow rules (RFC 9309), so robots.txt is the lever for keeping low-value URL spaces — carts, checkouts, site-search results, login and account pages — out of AI crawls and out of the answers built from them. This is crawl hygiene, not access control.
Access & Crawl Control
access-crawl-control/tdm-repGrade CExperimentalTDM-Rep declaration
TDM-Rep is a W3C Community Group Final Report — explicitly not a W3C Standard — that defines a machine-readable text-and-data-mining reservation, anchored in EU DSM Directive Article 4. Its value is legal evidence of an opt-out, not agent behaviour: no major AI crawler operator documents honouring it. This audit reports what a site declares and in which direction, and never scores it either way.
Access & Crawl Control
access-crawl-control/web-bot-auth-request-toleranceGrade BScoredA signed agent request is not rejected for being signed
Fetches the site root twice: once plainly, and once with the RFC 9421 `Signature`, `Signature-Input` and `Signature-Agent` headers a Web Bot Auth agent sends, signed with a per-scan ephemeral Ed25519 key. Reports when the signed request is refused, truncated, or answered differently without `Vary` naming the headers that changed the answer.
Access & Crawl Control
agent-interfaces/agents-jsonGrade CAdvisoryagents.json at /.well-known/agents.json
agents.json (Wild Card AI, spec v0.1.0) layers agent-facing flows over OpenAPI at `/.well-known/agents.json`. No AI vendor documents consuming it, the spec never moved past v0.1.0, both of its project domains are offline and the path is absent from the IANA Well-Known URIs registry — so this check never asks a site to publish the file. It reports, with no score effect, whether what is served at that path is a real agents.json document or an HTML shell.
Agent Interfaces
agent-interfaces/ai-catalog-existsGrade CAdvisoryAI Catalog exists
The AI catalog is the ARD discovery manifest that tells AI agents which MCP servers, agent cards, skills and API descriptions your site offers. Hugging Face's hf-discover resolves it at /.well-known/ai-catalog.json and reads its entries; without it, agents must probe endpoints to work out what your site can do.
Agent Interfaces
agent-interfaces/ai-catalog-metadataGrade BScoredAI Catalog complete metadata
Consumers rank AI catalog entries on their metadata: Hugging Face's hf-discover builds its match text from each entry's description, tags, capabilities and representativeQueries. An entry with only an identifier and a type is legal ARD but is nearly unmatchable, so agents searching for what you offer will not surface it.
Agent Interfaces
agent-interfaces/ai-catalog-urlsGrade BScoredAI Catalog entry URLs valid
Every AI catalog entry either embeds its artifact inline or points at one with a url. Consumers dereference those urls to load MCP server cards, agent cards and nested catalogs, so a dead url silently truncates a whole branch of discovery and breaks any agent that trusted the manifest.
Agent Interfaces
agent-interfaces/cors-api-routesGrade CAdvisoryCORS on declared API routes
CORS matters for one class of AI consumer: agent code running inside a browser origin, such as an OpenAI Apps SDK widget in an isolated iframe under a strict CSP. Server-side crawlers and MCP clients are not browsers and are unaffected. This audit reads the endpoints out of your published OpenAPI document and probes those, and applies only to sites that publish one.
Agent Interfaces
agent-interfaces/mcp-discoveryGrade CAdvisoryMCP server discovery file
Reports whether the site publishes an MCP discovery document at `/.well-known/mcp/servers.json` or `/.well-known/ucp`, and whether what it publishes can be parsed. Neither path is registered or specified, and no shipping MCP client is documented as fetching either, so this is reported rather than scored: a site with a working MCP server discovered by any other route is not less agent-ready for having no such file.
Agent Interfaces
agent-interfaces/mcp-endpointGrade CAdvisoryMCP endpoint functional
One MCP endpoint audit: it finds the endpoint your site declares, speaks a spec-compliant JSON-RPC 2.0 initialize handshake to it, reports the capabilities the server negotiates on the wire, and checks that the tools it lists carry safety annotations.
Agent Interfaces
agent-interfaces/mcp-modern-era-reachabilityGrade AScoredModern-Era Reachability Probe (server/discover)
Determine, with one unauthenticated stateless POST, whether the site's MCP endpoint can be used at all by a client built on the current protocol revision (2026-07-28). Classifies the endpoint into modern / dual-era / legacy-only / deprecated-HTTP+SSE / unreachable, and extracts supportedVersions, capabilities, instructions and serverInfo from the DiscoverResult.
Agent Interfaces
agent-interfaces/mcp-oauth-discovery-chainGrade AScoredOAuth Discovery Chain Integrity (RFC 9728 → RFC 8414)
Walks the full credential-free authorization discovery path an MCP client must traverse — 401 challenge, WWW-Authenticate resource_metadata, Protected Resource Metadata document, authorization server metadata — and asserts every MUST-level validation gate the client will apply. Ends before any token is requested, so it needs no credentials.
Agent Interfaces
agent-interfaces/mcp-origin-validation-corsGrade BScoredThe MCP endpoint validates Origin and its CORS policy matches its auth posture
Sends the discover call twice — once with a throwaway `Origin`, once without — and one CORS preflight, then compares. An endpoint that reflects an arbitrary Origin into `Access-Control-Allow-Origin` while also allowing credentials has authorized every page the user visits to call it on the user’s behalf. Permissive CORS on an endpoint with no auth surface is reported and not scored.
Agent Interfaces
agent-interfaces/mcp-registry-listing-ownershipGrade BScoredThe MCP server is listed in the official registry under a namespace this domain owns
Searches the official MCP Registry for servers whose `remotes[].url` lives on this domain, classifies each listing by namespace — reverse-DNS of this domain, an individual’s GitHub account, or a third-party aggregator — and checks that the domain-control proof the reverse-DNS namespace requires is actually being served at `/.well-known/mcp-registry-auth`.
Agent Interfaces
agent-interfaces/mcp-tool-contract-validityGrade AScoredTool Contract Validity and Silent-Drop Risk
Static validation of every tool definition returned by tools/list against the MUST/SHOULD-level structural rules in the 2026-07-28 tools spec — with special weight on x-mcp-header violations, which oblige conforming clients to silently remove the offending tool from the list they show the model.
Agent Interfaces
agent-interfaces/mcp-tool-description-coverageGrade BScoredTool Self-Description Coverage
Counts, over the tool surface the endpoint already returned, what fraction of tools carry a description, what fraction of every input parameter carries one — walking `properties` recursively and into `items.properties` for arrays of objects — and reports the advisory ratios alongside: constrained string parameters, declared output schemas, titles and the server’s own `instructions`.
Agent Interfaces
agent-interfaces/mcp-tools-list-determinismGrade AScoredtools/list Determinism and Cache-Hint Compliance
Repeatedly fetches tools/list and asserts three things the spec ties directly to agent cost and latency: caching hints are present and well-formed (ttlMs >= 0, cacheScope in {public, private}), tool ordering is stable across calls, and the tool set does not vary per connection.
Agent Interfaces
agent-interfaces/mcp-version-downgradeGrade AScoredVersion Downgrade Recoverability
Negative-path probe that verifies the server fails correctly when handed a protocol version it does not support, and when the MCP-Protocol-Version header disagrees with the body's _meta. Both are MUST-level behaviors whose absence strands otherwise-compatible clients.
Agent Interfaces
agent-interfaces/openapi-description-qualityGrade AScoredOpenAPI description quality for tool-calling
When an AI agent converts your OpenAPI spec into callable tools, the description fields become the prompt the LLM uses to decide when and how to call each function. A one-word description like "search" tells the model nothing about what the endpoint does, what the parameter means, or what values are valid — so the agent guesses, calls the wrong tool, or fills parameters with hallucinated values. Every operation and every parameter needs a verbose description (more than 15 characters) that explains purpose, expected input, and behavior.
Agent Interfaces
agent-interfaces/openapi-endpointsGrade BScoredOpenAPI has endpoints
An OpenAPI spec without endpoints is like a menu with no items. AI agents need at least one path with an operation to know what actions they can perform on your site. Add your most important endpoints first.
Agent Interfaces
agent-interfaces/openapi-existsGrade BAdvisoryAPI description discoverable
One discovery audit over the mechanisms that actually exist: the RFC 9727 /.well-known/api-catalog linkset, an OpenAPI document at a probed root path, and a <link rel="service-desc"> advertising one. A site with no API surface is not applicable rather than failing.
Agent Interfaces
agent-interfaces/openapi-operation-idsGrade BScoredOpenAPI has operationIds
AI agents use operationIds as stable function names when calling your API. Without unique operationIds, agents must guess endpoint names from paths, leading to ambiguity and errors. An operationId that is not a legal function name (spaces, punctuation, or more than 64 characters) cannot be registered as a tool at all.
Agent Interfaces
agent-interfaces/openapi-schemasGrade BScoredOpenAPI request/response schemas
Without request/response schemas, AI agents must guess the data format for your endpoints. This leads to malformed requests and failed API calls. Define JSON schemas for all request bodies and responses.
Agent Interfaces
agent-interfaces/openapi-serversGrade BScoredOpenAPI servers array valid
Without a servers array, AI agents do not know the base URL for your API. They cannot construct valid request URLs, rendering the entire spec unusable. Add at least your production server URL.
Agent Interfaces
agent-interfaces/search-endpointGrade CAdvisorySite search reachable by agents
A declared search endpoint lets an AI agent find specific content on your site without crawling every page. This audit covers both halves of that declaration: the Schema.org SearchAction URL template, and a GET search operation in your OpenAPI spec — and it probes the template rather than trusting it.
Agent Interfaces
agent-interfaces/webmcp-declarative-formsGrade BScoredWebMCP declarative form tools
WebMCP's Declarative API turns an HTML <form> into an agent-callable tool: add toolname and tooldescription and the browser synthesizes a JSON Schema from the form's controls, which an in-browser agent can discover and invoke without any JavaScript. toolname is what registers the tool — a description on its own registers nothing.
Agent Interfaces
agent-interfaces/webmcp-registered-toolsGrade BExperimentalWebMCP registered tools
WebMCP lets a page register agent-callable tools at runtime through navigator.modelContext, which is what Chrome exposes to an in-browser agent and what Lighthouse reports as "Registered WebMCP tools". This scanner has no JavaScript runtime, so it reports the registrations visible in the served document and treats silence as unknown rather than as absence — which is why it is experimental and never scores.
Agent Interfaces
agentic-commerce/acp-policy-link-surfaceGrade AScoredACP link-surface completeness
Verifies the merchant can populate the `links` array that every ACP CheckoutSession response is required to carry, by resolving each of the 8 enum link types to a stable, HTTPS, no-JS-required, non-soft-404 URL on the merchant's own site.
Agentic Commerce
agentic-commerce/agent-ua-commerce-parityGrade AScoredShopping agents can fetch the commerce paths
Issues paired requests to the homepage, sampled product pages, the cart and the linked policy pages with a browser User-Agent and with the ChatGPT-User and OAI-SearchBot User-Agents, detecting WAF blocks, challenge interstitials and stub pages that a robots.txt-only audit cannot see. Reads the OpenAI robots.txt tokens separately, so opting out of training while staying in search is reported as the deliberate posture it is.
Agentic Commerce
agentic-commerce/buyable-variant-resolutionGrade BScoredBuyable Variant Resolution
Finds product pages that offer a shopper a size or colour choice but publish no per-variant purchasable identifier with its own price and availability, so an agent cannot turn "the blue one in medium" into a line item. Variants are established from the rendered HTML, then the structured data is required to resolve them.
Agentic Commerce
agentic-commerce/cart-handoff-reachabilityGrade BScoredCart Handoff Reachability
Reads the storefront cart and checkout paths — the URL an agent hands a buyer to, whether through an ACP `continue_url` or a computer-use agent driving the storefront — as a browser and as ChatGPT-User, and reports an account wall, a bot challenge on the checkout document, or a hard block. Read-only: every request is a GET, nothing is ever added to a cart.
Agentic Commerce
agentic-commerce/checkout-offer-field-mappingGrade AScoredCheckout-eligible offer field mapping
Audits each PDP against the exact required-and-conditional field set of the OpenAI product feed spec, including its character caps and its conditional triggers, so the merchant learns which rows will be rejected before uploading a feed.
Agentic Commerce
agentic-commerce/landed-cost-and-returnsGrade AScoredLanded-cost and returns machine readability
Requires structured, agent-parsable shipping cost, handling and transit times, and a return window expressed as an integer — the exact inputs an agent needs to rank offers and the exact fields the ACP checkout session must compute.
Agentic Commerce
agentic-commerce/offer-schemaGrade AScoredOffer schema on pricing pages
AI agents use Offer schema to answer pricing queries with exact numbers. Without price and priceCurrency in structured data, agents must scrape and guess pricing from page text, which often produces inaccurate or outdated results in AI-generated comparisons.
Agentic Commerce
agentic-commerce/offer-truth-consistencyGrade BScoredOffer Truth Consistency
Reconciles the Offer in a product page’s structured data against what the same page actually renders: the price, the currency, whether the item can be bought, whether the offer window has closed, and whether two Product nodes describing the same URL disagree. Every rule is a value comparison, not a presence check, and extraction is confined to the product region so a related-products carousel cannot fire it.
Agentic Commerce
agentic-commerce/product-identifiersGrade AScoredProduct identifiers (GTIN/UPC/MPN)
AI agents use unique identifiers like GTIN, UPC, or MPN to de-duplicate products across different sources and confirm they are looking at the exact item the user wants. Without them, agents may confuse similar products or fail to find specific pricing.
Agentic Commerce
agentic-commerce/product-transaction-certaintyGrade AScoredProduct transactional certainty
AI shopping assistants need more than a product name and price to make an authoritative recommendation: they must know whether the item is in stock, how long the quoted price is valid, and what the return policy is before they commit a user to a purchase. A Product schema that only carries name and price forces agents to guess at availability, quote potentially stale prices, and stay silent on returns — all of which erode transactional certainty in agentic commerce flows. Complete your Offer with availability, priceValidUntil, and a valid price + priceCurrency pair, and attach hasMerchantReturnPolicy to the Product or Offer.
Agentic Commerce
answer-readiness/about-credentialsGrade CAdvisoryAbout page with credentials
AI engines crawl your about page to build an organizational authority profile. Without an about page containing team credentials, expertise, and experience details, agents cannot assess your organization's authority, reducing your content's trust score in AI-generated recommendations.
Answer Readiness
answer-readiness/author-pageGrade CAdvisoryAuthor page exists
AI engines follow author page links to verify credentials and build author expertise profiles. A dedicated author page strengthens E-E-A-T signals.
Answer Readiness
answer-readiness/author-same-asGrade CAdvisoryAuthor schema with sameAs
AI RAG systems cross-reference author identity across platforms via sameAs URLs. Without external profile links, agents cannot verify author expertise.
Answer Readiness
answer-readiness/brand-nameGrade CAdvisoryBrand name in body text
AI engines build entity graphs by matching Organization schema names to in-content mentions. If your brand name only appears in schema but not body text, agents cannot associate your content with your entity.
Answer Readiness
answer-readiness/chunk-boundary-referent-integrityGrade BScoredChunk-boundary referent integrity
Splits the page into heading-led chunks, the way a retriever does, and checks each one for the three ways a chunk loses its meaning when it arrives alone: opening on a demonstrative with no referent, never naming the page's subject, and pointing at a position in the document ("as described above") that a retrieved chunk no longer has.
Answer Readiness
answer-readiness/comparison-tablesGrade CAdvisoryComparison tables present
AI answer engines extract structured table data to generate comparison answers. Add HTML tables to your content where appropriate.
Answer Readiness
answer-readiness/content-without-clickthroughGrade BScoredContent answers without click-through
AI answer engines skip teaser content that gates answers behind sign-ups or downloads. Provide substantive answers directly on the page.
Answer Readiness
answer-readiness/core-open-graphGrade AScoredCore Open Graph tags
Link-preview crawlers — facebookexternalhit and Slack's unfurler are documented by name — read og:title, og:description, og:image and og:url to build the card shown when your page is shared, and Google names og:site_name as one input to the site name on a result. This audit scores those Open Graph properties; the Twitter Card tags it also reports are informational only, because every content-bearing twitter:* tag falls back to its og:* counterpart.
Answer Readiness
answer-readiness/dates-on-contentGrade AScoredDates on content pages
Date extractors read the byline date off a content page from <time datetime>, JSON-LD datePublished/dateModified, article:*_time meta tags or a clearly labelled visible date; a page carrying none of them has no date any downstream consumer can attach to it. A modification date (or a visible "last updated" label with a date beside it) is the full signal; a publication date alone is a partial one.
Answer Readiness
answer-readiness/descriptive-urlsGrade CAdvisoryDescriptive URL slugs
AI engines use URL text as a content signal. Descriptive slugs help agents understand page topics before fetching the content.
Answer Readiness
answer-readiness/direct-definitionsGrade CAdvisoryDefinition markup on definitional pages
HTML-AAM maps <dfn> and <dt>/<dd> to the term and definition roles, and WHATWG requires the definition to sit alongside the term it defines, so the pairing survives extraction intact. No consumer is documented as acting on that mapping, and prose definitions are read perfectly well, so this is reported as upside on pages that already answer a definitional question — never as a defect.
Answer Readiness
answer-readiness/external-citationsGrade BScoredExternal citations
Linking to authoritative sources signals expertise. AI RAG systems cross-reference your citations to validate claims and assess content quality.
Answer Readiness
answer-readiness/extractor-survival-recallGrade BScoredExtractor survival recall
Names the spans that carry the page's facts — the `h1`, each section's opening sentences, every `caption`, `dt` and `th`, and the structured-data strings the prose repeats — then runs the page through `@mozilla/readability` and through a Firecrawl/Jina-style stripper and reports which spans did not survive, and what dropped them.
Answer Readiness
answer-readiness/faq-sectionsGrade CAdvisoryFAQ sections present
AI answer engines like Perplexity extract FAQ-structured content with higher confidence for direct answers. FAQ sections with clear question headings are the top extraction target for "People Also Ask" results and conversational AI responses.
Answer Readiness
answer-readiness/first-paragraph-answersGrade CAdvisoryFirst paragraph answers primary question
AI search engines score the first paragraph highest for extractive QA. Preamble text like "In this article" or "Welcome" wastes this prime position, causing agents to extract low-value content as your page's representative answer.
Answer Readiness
answer-readiness/last-modified-schemaGrade BScoredLast modified date in schema
AI engines use dateModified in JSON-LD to determine content freshness. Content that shows recent updates is prioritized over stale content.
Answer Readiness
answer-readiness/meta-authorGrade CAdvisoryMeta author present
AI agents use the meta author tag to attribute content to a specific person or organization for E-E-A-T scoring. Without it, your content appears authorless, which reduces trust signals in AI ranking systems that prioritize named expertise.
Answer Readiness
answer-readiness/meta-descriptionGrade BScoredMeta description quality
Google may reproduce <meta name="description"> verbatim as the snippet for a page when it describes the page better than the body text does, and the same snippet pipeline feeds AI Overviews and AI Mode source cards. This audit checks the properties Google documents: the tag is present, it is a usable length, it reads as prose rather than a keyword string, and it actually describes this page.
Answer Readiness
answer-readiness/named-authorGrade CAdvisoryNamed author attribution
AI systems assign higher confidence to content from named experts. Generic authors like "Staff" or "Admin" reduce trust scoring because agents cannot verify expertise.
Answer Readiness
answer-readiness/og-image-altGrade CAdvisoryog:image:alt present
AI agents cannot process images directly and rely on og:image:alt text to understand your page's visual content. Without alt text, the OG image is invisible to text-based AI systems that generate answers and summaries about your page.
Answer Readiness
answer-readiness/og-typeGrade BScoredog:type set and appropriate
AI agents use og:type to classify page content as either a website, article, product, or other entity type. Without it, agents default to treating the page as generic content, missing opportunities for type-specific handling like article freshness scoring.
Answer Readiness
answer-readiness/publication-dateGrade BScoredPublication date visible
AI engines use visible dates to assess content freshness. Undated content is deprioritized for recency-weighted queries.
Answer Readiness
answer-readiness/question-headingsGrade CAdvisoryQuestion-formatted headings
AI answer engines directly match user questions to heading text. Question-formatted headings (ending with "?") are the primary signal AI systems use to identify which section answers a specific query.
Answer Readiness
answer-readiness/review-signalsGrade BScoredReview/testimonial signals
Google parses schema.org Review/AggregateRating to render review rich results, and attributed quotations are the best-measured lever in the GEO literature. This audit passes on machine-readable social proof — review structured data, or quotations carried in <blockquote> with attribution — and warns when review UI is on the page but nothing machine-readable is behind it.
Answer Readiness
answer-readiness/section-split-risk-profileGrade BScoredSection split-risk profile
Counts each `h2`/`h3` section with a real BPE tokenizer and reports the four ways a page chunks badly: sections over the 512-token window (each producing headless tail chunks), a long page with no headings to cut on, sections too thin to embed distinctly, and single tables or lists whose serialization exceeds the window on its own.
Answer Readiness
answer-readiness/site-wide-passage-uniqueness-ratioGrade BScoredSite-wide passage uniqueness ratio
Measures two things no single-page check can see: what share of each page’s sentences are its own rather than repeated across its siblings, and which pages are near-duplicates of each other at five-gram Jaccard 0.9 or above. Near-duplicate pages that all name themselves canonical compete against each other for one slot.
Answer Readiness
answer-readiness/snippet-gate-coverageGrade AScoredSnippet-gate coverage analysis
Computes the site's effective snippet permissions per crawler — merging <meta name="robots">, per-bot meta tags, and X-Robots-Tag response headers — then measures those permissions against the page's actual answer content: is max-snippet numerically smaller than the primary answer span, and does data-nosnippet coverage overlap the answer span, the FAQ answers, or the main-content tables. Reports the specific suppressed text, not just the directive.
Answer Readiness
answer-readiness/specific-numbersGrade BScoredSpecific numbers and data points
AI engines prefer answers with concrete data points over vague statements. Include specific numbers, percentages, and metrics in your content.
Answer Readiness
answer-readiness/table-markdown-round-trip-lossGrade BScoredTables survive conversion to markdown
Converts every main-content table to GFM markdown — the representation an answer engine’s reader emits — reads it back, and diffs it cell for cell against the source grid. Reports every cell lost or displaced by coordinate, plus the tables whose numbers carry no header and whose units live only in the caption.
Answer Readiness
answer-readiness/text-fragment-addressabilityGrade AScoredText-fragment citation addressability
Determines whether a citing surface can construct a working `#:~:text=` deep link to the page's actual answer sentences. Hard-fails on the documented `Document-Policy: force-load-at-top` opt-out header, then simulates the spec's matching algorithm over the parsed DOM to prove each candidate answer span is (a) contained in a single block-level element, (b) unambiguous or disambiguable with a same-block prefix/suffix, and (c) free of characters that break normalization. Outputs the working fragment URLs as a fix artifact.
Answer Readiness
answer-readiness/trust-signalsGrade BScoredTrust and evidence signals on homepage
A 252,000-trial controlled study across six LLMs (arXiv 2605.25517) measured two page factors that shift which source an AI answer engine cites: quantified social proof (OR 2.14, significant in 4 of 6 models) and claims paired with evidence (OR 2.09, 5 of 6 models). The same study found promotional tone's effect too small and inconsistent to guide, and it named comparison content in its practical implications without measuring it. This audit scores those two page factors and nothing else.
Answer Readiness
answer-readiness/unique-dataGrade BScoredUnique data or statistics
AI generative engines prioritize content with original, citable data points over vague claims. Include specific statistics and metrics.
Answer Readiness
answer-readiness/unique-metaGrade CAdvisoryUnique meta per page
AI crawlers use title and description pairs to distinguish between pages. Duplicate meta across pages causes agents to merge or skip content, meaning some of your pages will be invisible in AI-generated answers. Give each page a unique title and description.
Answer Readiness
content-extraction/article-elementGrade AScored<article> used for content
RAG systems chunk content by <article> boundaries for vector embedding, treating each article as an independent retrieval unit. Without <article> tags, AI chunking algorithms fall back to arbitrary text splitting, which fragments related content across multiple embeddings and reduces answer quality.
Content Extraction
content-extraction/aside-elementGrade BScored<aside> for supplementary content
Mozilla Readability and trafilatura delete <aside> subtrees before extraction, and Chromium exposes <aside> as a complementary landmark in the accessibility tree agents read. Wrapping sidebars, promos and related-links blocks in <aside> is what keeps them out of the text an LLM ingests; a sidebar left in a bare <div> is extracted as if it were article body.
Content Extraction
content-extraction/boilerplate-taxGrade BScoredBoilerplate tax across the crawl (unique tokens per fetch)
Samples pages across the crawl, finds the five-word windows that appear on at least 80% of them, and reports how many of the tokens an agent pays for are distinct information rather than repeated chrome. Site-level rather than page-level: the cost of boilerplate is only visible across fetches.
Content Extraction
content-extraction/code-languageGrade CAdvisoryCode blocks have language annotations
AI agents use language annotations on code blocks to apply the correct syntax understanding and provide accurate code explanations. Without them, agents must guess the programming language, which can lead to incorrect interpretations in AI-generated code answers.
Content Extraction
content-extraction/content-depthGrade BScoredSufficient content depth
AI RAG systems need sufficient content depth to generate accurate, detailed answers. Pages with fewer than 300 words provide too little context for meaningful vector embeddings, causing your content to rank poorly in retrieval and be excluded from AI-generated responses.
Content Extraction
content-extraction/css-hidden-ghost-contentGrade AScoredGhost content: CSS-hidden text ingested as visible
Find text that is hidden from human readers by an external stylesheet class but is invisible-as-hidden to every extractor an agent uses, and size it in tokens. Fail if class-hidden text exceeds 15% of the page's total text tokens or 1,000 tokens absolute; separately fail on near-duplicate hidden blocks (a mobile nav or tab-panel set duplicating visible content). Report contradiction risk when hidden text contains prices, availability, or dated claims.
Content Extraction
content-extraction/data-tablesGrade BScoredData tables properly structured
AI agents use <thead> and <th> elements to understand column headers and interpret table data correctly. Without proper structure, agents cannot map cell values to their column meanings, leading to garbled data extraction in AI-generated comparisons and summaries.
Content Extraction
content-extraction/extraction-determinismGrade BScoredExtraction determinism (multi-extractor agreement)
Runs three independent main-content extractors over the page — `@mozilla/readability`, a semantic-container selector, and a text-density scorer — and compares their output pairwise with five-word shingles. Where they disagree, what an agent quotes from this page is decided by its pipeline rather than by the page.
Content Extraction
content-extraction/fake-headingsGrade BScoredNo fake headings
AI agents chunk and outline page content by reading real <h1>–<h6> tags. When a page styles a <div>, <span>, <p>, or <b> to look like a heading (large text, bold weight, "heading" classes) instead of using a semantic heading element, that text is invisible to the agent's document outline — sections cannot be navigated, summarized, or cited correctly. This audit is distinct from the sequential-heading check (content-extraction/sequential-headings), which verifies that real headings appear in the right order, while this audit catches content that impersonates headings without using heading tags at all. Replace styled generic elements with the appropriate <h1>–<h6> level.
Content Extraction
content-extraction/figure-figcaptionGrade CAdvisory<figure> + <figcaption> usage
AI agents use <figcaption> to understand the purpose and context of figures beyond what alt text provides. Without captions, agents treat figures as opaque image containers with no semantic meaning, missing opportunities to cite your visual data in AI-generated answers.
Content Extraction
content-extraction/header-footerGrade AScored<header> and <footer> landmarks
AI agents use <header> and <footer> landmarks to identify and exclude boilerplate content (navigation, copyright, links) from primary content extraction. Without these landmarks, agents may include footer disclaimers or nav menus in their content summaries.
Content Extraction
content-extraction/hydration-payload-shareGrade AScoredInlined hydration-state payload share
Detect and size serialized framework state inlined in the HTML document: <script id="__NEXT_DATA__">, self.__next_f.push( flight chunks, window.__NUXT__, __remixContext, window.__APOLLO_STATE__, window.__INITIAL_STATE__, <script type="application/json"> islands, and Astro/Svelte island props. Three independent failure conditions: (1) any single state payload > 128 kB, (2) total state payload > 30% of document tokens, (3) state payload duplicates > 50% of the main-content text (content shipped twice in one response).
Content Extraction
content-extraction/image-alt-textGrade AScoredImage text-alternative coverage
An image with no text alternative has no accessible name, so it is an unnamed node in the accessibility-tree snapshots agent toolkits send to a model — Playwright MCP, Claude-in-Chrome read_page, Chrome DevTools take_snapshot — and it carries no subject matter for Google Images, which states it uses alt text to understand what an image shows. A multimodal agent that fetches the image bytes can caption it without one; a text-only crawler or a snapshot-driven agent cannot.
Content Extraction
content-extraction/json-ld-duplication-massGrade CAdvisoryJSON-LD duplication mass
Counts what the page's JSON-LD costs in `o200k_base` tokens, finds nodes declared twice across blocks, and measures how much of any long prose property — `articleBody`, `description`, `reviewBody` — repeats text already present in the DOM. Reported, not scored: duplication is a cost an operator may have chosen, and no consumer path proves it changes an answer.
Content Extraction
content-extraction/language-attributeGrade AScoredLanguage attribute
AI agents use the lang attribute to select the correct language model and tokenizer when processing your content. Without it, agents may misinterpret content language, leading to poor translations or incorrect answers in multilingual AI systems.
Content Extraction
content-extraction/main-elementGrade AScored<main> element present
AI scrapers use <main> to identify primary content and discard nav/footer chrome, reducing hallucination risk from boilerplate text. Without <main>, agents must guess which content is primary versus navigational, often ingesting menus and footers into their context window.
Content Extraction
content-extraction/markdown-alternateGrade AScoredMarkdown alternate: resolvable, faithful, cheaper
Where a site serves a markdown alternate of a page — by a declared `alternate` link, by `url + ".md"`, or by `Accept: text/markdown` — checks that it resolves as `text/markdown`, still carries the page's headings and prose, and costs fewer tokens than the HTML. A site that serves no markdown alternate at all is reported as not applicable: the documented consumers are interactive coding agents, and no cited source measures a cost to a site that serves none.
Content Extraction
content-extraction/preamble-taxGrade BScoredPreamble tax: tokens before the first content token
Measures how many `o200k_base` tokens an agent must stream past before the first sentence of the main content appears, by locating the extracted content inside the raw response body. Reports the offset in tokens and as a share of the document, and names the single heaviest block sitting in front of the content.
Content Extraction
content-extraction/section-headingsGrade BScored<section> elements have headings or labels
AI agents use section headings to build a topic map of your page for retrieval-augmented generation (RAG). Unlabeled sections are opaque to AI systems that chunk content by semantic boundaries, reducing the quality of retrieved context for answer generation.
Content Extraction
content-extraction/semantic-listsGrade BScoredSemantic list usage
AI agents recognize <ul>, <ol>, and <dl> as structured data lists and extract them as bullet points, numbered steps and term/definition pairs in generated answers. Content formatted as styled divs or manually numbered paragraphs is invisible to list-extraction algorithms, so your feature lists, how-to steps and glossary entries will not be surfaced as structured answers.
Content Extraction
content-extraction/sequential-headingsGrade BScoredSequential heading hierarchy
AI systems build content outlines from headings to understand document structure. Skipped levels (e.g., h1 to h3 without h2) break the hierarchy, causing agents to misinterpret section nesting and produce inaccurate content summaries. Fix heading levels to follow a sequential order.
Content Extraction
content-extraction/server-renderedGrade BScoredServer-rendered content
AI crawlers like GPTBot and ClaudeBot do not execute JavaScript. Content only visible after JS execution is completely invisible to them, meaning your site effectively has no content in AI knowledge bases. Use SSR (server-side rendering) or SSG (static site generation) to serve content in the initial HTML response.
Content Extraction
content-extraction/server-responsivenessGrade BScoredServer responsiveness
AI crawlers fetch fewer pages per session from a slow origin, and a user-triggered agent fetch that outlasts the client budget is abandoned before bytes arrive. This measures the median time to first byte across the crawled pages, not a single cold sample.
Content Extraction
content-extraction/single-h1Grade BScoredSingle h1 per page
AI agents use the single <h1> as the authoritative title of the page for content indexing and answer generation. Ensure exactly one <h1> per page.
Content Extraction
content-extraction/svg-bloatGrade BScoredSVGs not bloating agent context
When an LLM converts your HTML to Markdown or reads raw markup, every inline SVG is inlined as thousands of path-data tokens, and every base64 data URI is inlined verbatim. Decorative icon sprites, charts, and complex illustrations can silently consume tens of thousands of tokens of agent context per page — "SVG context poisoning" — crowding out the actual content the agent should read. SVGs marked aria-hidden="true" or role="presentation" are stripped by most accessibility-tree extractors and do not count. Keep visible SVGs small, move decorative ones behind aria-hidden, and prefer raster images or CSS for complex graphics. Inlined base64 assets are priced in real `o200k_base` tokens and reported separately, because their fix differs: move the asset to a real URL with descriptive alt text.
Content Extraction
content-extraction/time-elementGrade CAdvisory<time datetime=""> used for dates
AI agents use <time datetime> elements to reliably parse dates for freshness scoring and temporal reasoning. Without machine-readable dates, agents must regex-parse human-readable date formats, which frequently fails across locales and ambiguous formats like "01/02/2025".
Content Extraction
content-extraction/token-ratioGrade BScoredLean token-to-content ratio
AI agents pay for every token of raw HTML they download, but only the main content carries meaning. This audit counts both sides with a real BPE tokenizer (`o200k_base`): the numerator is the text `@mozilla/readability` extracts — the extractor most of the industry deploys — and the denominator is the whole delivered document. The result is a signal-density index, and the report breaks the denominator into script, style, comment, content and structure tokens so the finding names the bucket to attack. A ratio under 5% means an agent parses 20 tokens of noise for every token of content; under 15% still wastes most of the context window on boilerplate.
Content Extraction
machine-discovery/agent-commerce-feed-parityGrade AScoredProduct pages carry the fields an agent-commerce feed needs
Samples product pages from the sitemap and audits each against the union of OpenAI's Product Feed Spec and Google Merchant Center's required attributes, using the PDP's structured data as the auditable proxy for feed eligibility. Reports a per-field pass rate plus a separate agent-commerce gap for the fields Google's rich-result validator never asks for, and cross-checks the JSON-LD price against the price the page renders.
Machine Discovery
machine-discovery/ai-crawler-surface-reachabilityGrade AScoredAI crawlers can reach the discovery surfaces the site advertises
Evaluates robots.txt per named AI user-agent against the exact URLs the site advertises for indexing — the Sitemap: targets, the autodiscovered RSS/Atom/JSON feeds, and a sample of the URLs listed inside the sitemap tree — and flags the self-contradiction of advertising a discovery surface the same file forbids.
Machine Discovery
machine-discovery/ai-file-deliveryGrade BAdvisoryAI files are delivered correctly
AI agents use the Content-Type header to decide how to parse a file, and caching headers to avoid re-downloading one that has not changed. This audit reports both for every AI file the scan fetched.
Machine Discovery
machine-discovery/conditional-request-supportGrade BScoredDiscovery surfaces answer conditional requests
Fetches robots.txt, the sitemaps and the feeds twice identically, then once with `If-None-Match` and once with `If-Modified-Since`, and reports what came back. A surface with no validator cannot be revalidated at all; one whose `ETag` changes while its body does not is worse, because every poll looks like a change.
Machine Discovery
machine-discovery/cors-ai-filesGrade CAdvisoryCORS on AI files
Without CORS headers, AI agents running in browser contexts cannot fetch your llms.txt or API spec. Browser-based AI tools, ChatGPT plugins, and MCP clients are all blocked by same-origin policy, making your AI-facing files completely inaccessible to cross-origin agents.
Machine Discovery
machine-discovery/discovery-index-coverageGrade BScoredPages are covered by a discovery index
Every scanned page should be listed in a discovery index — the sitemap (including its sub-sitemaps) or llms.txt — so AI crawlers can find it without relying on the link graph.
Machine Discovery
machine-discovery/feed-entry-identity-and-canonical-integrityGrade BScoredFeed entries have stable identities that resolve to their canonical pages
Checks the identity half of a feed: that every entry carries exactly the id and timestamp its format requires, that no id repeats, and that item links are absolute HTTPS URLs which match the `rel="canonical"` of the page they open — no redirect, no tracking parameters the canonical does not carry.
Machine Discovery
machine-discovery/in-content-linksGrade AScoredIn-content internal links
Contextual links inside the page body — not the nav or footer — are how AI crawlers discover related pages and read the relationships between them. Crawlers that do not execute JavaScript see only the links present as <a href> in the served HTML.
Machine Discovery
machine-discovery/llms-full-txtGrade CAdvisoryllms-full.txt present
llms-full.txt provides the complete content of your site in a single file, allowing AI agents to ingest everything in one request instead of crawling page by page.
Machine Discovery
machine-discovery/llms-txt-existsGrade CAdvisoryllms.txt exists
llms.txt is a community convention: a markdown index of your site at /llms.txt. No AI vendor documents a crawler or agent that reads it, and Google states Search ignores it, so this check is reported and never scored. Chrome Lighthouse checks the same three conformance rules and treats a missing file as not applicable.
Machine Discovery
machine-discovery/llms-txt-link-descriptionsGrade CAdvisoryllms.txt links include descriptions
Link descriptions help AI agents understand what each page covers without visiting it, reducing unnecessary crawling.
Machine Discovery
machine-discovery/llms-txt-links-validGrade CAdvisoryllms.txt links are valid
Reports whether the links inside a published llms.txt resolve. Link validity is spec-optional and no known consumer enforces it — Chrome Lighthouse, the only shipping checker, fetches no link at all — so this check is reported and never scored.
Machine Discovery
machine-discovery/llms-txt-structureGrade CAdvisoryllms.txt is well-formed
The llms.txt format defines a blockquote summary under the H1 and H2 sections grouping the link lists. Both are optional in the spec, so this check is advisory: it reports the shape of the file, it does not score it.
Machine Discovery
machine-discovery/no-broken-ai-endpointsGrade AScoredNo broken AI endpoints
AI agents follow URLs in your ai-catalog.json, llms.txt, and navigation.json to build a map of your site's AI-consumable resources. Broken links cause agents to lose trust in your manifest files entirely, potentially ignoring all listed endpoints. Fix or remove broken URLs.
Machine Discovery
machine-discovery/no-broken-linksGrade AScoredNo broken internal links
Broken internal links create dead ends for AI crawlers and waste their limited crawl budget.
Machine Discovery
machine-discovery/root-text-file-resolution-integrityGrade BScoredThe origin serves and correctly 404s root-level .txt resources
Fetches two root-level `.txt` files with random names that cannot exist. Both must answer 404 or 410. An origin that answers 200 instead has a catch-all, which makes every probe-based discovery file — `llms.txt`, `ai.txt`, `security.txt`, the IndexNow key file — impossible to tell apart from a soft 404. Also checks that `/robots.txt` is served as `text/plain`.
Machine Discovery
machine-discovery/rss-feedGrade BScoredRSS/Atom feed link present
RSS/Atom feeds let AI agents track new and updated content without re-crawling your entire site. The <head> autodiscovery link is reported alongside the feed, not scored on its own.
Machine Discovery
machine-discovery/rss-feed-contentGrade CAdvisoryRSS feed content complete
Full-content feeds allow AI agents to index your articles without visiting each page, reducing crawl load and improving content quality in AI responses.
Machine Discovery
machine-discovery/sitemap-absolute-urlsGrade BScoredSitemap uses absolute URLs
Sitemap URLs must be absolute (starting with https://) so AI crawlers can resolve them without ambiguity.
Machine Discovery
machine-discovery/sitemap-existsGrade AScoredsitemap.xml exists
AI crawlers use your sitemap to discover all pages without following links. Without it, pages may never be indexed by AI search engines.
Machine Discovery
machine-discovery/sitemap-lastmodGrade AScoredSitemap has lastmod dates
AI crawlers use <lastmod> to decide which pages to re-index and which to skip. Without these dates, crawlers must re-fetch every page on every visit.
Machine Discovery
machine-discovery/sitemap-lastmod-verifiabilityGrade AScoredSitemap lastmod values are verifiable against the pages
Cross-validates sampled sitemap <lastmod> values against three independent page-level modification signals — the Last-Modified response header, JSON-LD dateModified/datePublished, and article:modified_time — and scores agreement rather than presence. Detects the two dominant failure modes: the build stamp (every URL updated on every deploy) and the frozen value (the CMS never updates it).
Machine Discovery
machine-discovery/three-way-freshness-lagGrade BScoredThe sitemap and the feed are as fresh as the site itself
Compares the newest date the pages themselves publish against the newest `<lastmod>` in the sitemap and the newest entry in the feed. A surface that trails the site by more than a week is regenerated on a slower cadence than publication, so a crawler polling it sees a site that stopped publishing. Also checks that a feed’s own build timestamp is not older than its newest item, and that its items are in newest-first order.
Machine Discovery
machine-discovery/websub-hub-advertisementGrade CAdvisoryFeeds advertise a WebSub hub and exactly one canonical self link
Reads the WebSub discovery links on each feed — the `Link:` response headers first, as the specification requires, then the document — and checks the shape the W3C Recommendation asks for: exactly one absolute `rel=self` equal to the URL the feed was fetched from, and at least one `rel=hub` over HTTPS that answers a HEAD. Advisory only: no AI answer engine is documented as a WebSub subscriber, so this audit never affects the score.
Machine Discovery
operability-safety/accessible-namesGrade AScoredButtons and links have accessible names
AI browser agents identify clickable elements by their accessible name in the accessibility tree. Buttons and links (including icon-only controls) without text, aria-label, or aria-labelledby are invisible to agents, so they cannot navigate the site or trigger actions.
Agent Operability & Safety
operability-safety/agent-ua-content-divergence-diffGrade BScoredAgent-UA Content Divergence Diff
Compares the main content, and the JSON-LD, that each AI-crawler User-Agent receives against the same URL fetched as Chrome, and reports where they diverge. An unrecognised control bot is probed too, so bot management is told apart from deliberate agent-specific branching, and a crawler that is simply blocked is reported without lowering the score.
Agent Operability & Safety
operability-safety/aria-attributesGrade AScoredValid ARIA attributes
ARIA states and properties carry the machine-readable state agents act on (expanded, checked, disabled, labels). Invalid attributes or values corrupt that state.
Agent Operability & Safety
operability-safety/aria-hidden-bodyGrade AScoredPage exposed to the accessibility tree
aria-hidden="true" on the document body removes the entire page from the accessibility tree. AI browser agents that navigate via the accessibility tree would see nothing at all.
Agent Operability & Safety
operability-safety/aria-landmarksGrade AScoredARIA landmarks complete
Claude computer use and browser agents rely on ARIA landmarks to identify page regions (navigation, main content, footer). Missing landmarks force agents to guess page structure from raw HTML, leading to misclicked elements and incorrect content extraction.
Agent Operability & Safety
operability-safety/aria-layer-injection-scanGrade AScoredAccessibility-Layer Injection Scan
Audit the text that reaches an agent through the accessibility tree and non-visual attributes rather than through body copy: alt, aria-label, aria-labelledby targets, aria-description, title, placeholder, hidden input values, <option> labels, document title and og:* metadata. Flag instruction-shaped content, anomalously long values, and aria-label/visible-text divergence.
Agent Operability & Safety
operability-safety/aria-relationshipsGrade AScoredComplete ARIA relationships
Composite widgets (menus, listboxes, tabs, grids) require specific child/parent roles and attributes. Missing pieces break the structure agents traverse.
Agent Operability & Safety
operability-safety/aria-rolesGrade AScoredValid ARIA roles
AI agents map elements to behaviors by their ARIA role. Invalid, deprecated, or disallowed roles make an element’s purpose ambiguous, so agents may mis-classify or skip it.
Agent Operability & Safety
operability-safety/autocompleteGrade AScoredForm fields use valid autocomplete tokens
Form-filling agents map fields to known data (name, email, address, payment) via autocomplete tokens. Invalid tokens break that mapping.
Agent Operability & Safety
operability-safety/c2pa-manifest-survives-deliveryGrade BScoredContent Credentials survive the image delivery pipeline
Fetches the images a page actually serves and looks for a C2PA manifest store in the bytes. Where a served image is a transformed variant — Next.js image optimization, Cloudflare Image Resizing, a WordPress rendition — the origin asset is fetched too and the two are compared. An origin that carries a manifest whose variant does not is a pipeline stripping provenance in transit.
Agent Operability & Safety
operability-safety/c2pa-signer-trust-statusGrade BScoredContent Credentials are signed by a certificate that can be trusted
Reads the signing certificate out of each Content Credential and reports what the certificate itself says: self-signed or CA-issued, inside its validity window or outside it, and whether a timestamp token is present. A self-signed or expired signer surfaces as untrusted in every conforming validator, however well-formed the manifest is.
Agent Operability & Safety
operability-safety/contact-formGrade CAdvisoryContact/lead form endpoint
AI agents increasingly handle tasks like "contact this company for a quote" on behalf of users. Without a machine-submittable contact form, agents cannot complete these requests, sending users to competitors who have one. Provide an HTML form or an API endpoint.
Agent Operability & Safety
operability-safety/dialog-nameGrade AScoredDialogs have accessible names
AI browser agents detect modals via role="dialog"/"alertdialog" and need an accessible name to understand the dialog’s purpose. Unlabeled dialogs trap agents in unknown UI states, blocking confirmations, forms, or cookie-consent flows.
Agent Operability & Safety
operability-safety/document-titleGrade AScoredPage has a non-empty <title>
The document title is the page’s identity in the accessibility tree and in agent context windows. A missing/empty title leaves the page unnamed.
Agent Operability & Safety
operability-safety/drag-and-slider-dependencyGrade BScoredGesture-only controls with no discrete alternative
Flags interactions on task-critical paths whose only operation path is a continuous pointer gesture — range sliders, drag-to-reorder lists, drag-only upload zones, swipe carousels — with no click, keyboard, or typed-value alternative. Each finding names the discrete control that is missing.
Agent Operability & Safety
operability-safety/duplicate-idGrade AScoredUnique IDs for ARIA references
aria-labelledby / aria-describedby / for resolve by id. Duplicate ids make resolution ambiguous, so an agent may read the wrong label or description.
Agent Operability & Safety
operability-safety/first-contact-consent-gate-operabilityGrade CAdvisoryFirst-contact consent gate: cost to get past it
Reports the cold-session consent layer an agent meets before any task work: whether the primary content exists in the served HTML behind it, whether the accept and reject controls carry accessible names and live in the top document rather than a cross-origin iframe, whether main content is hidden from the accessibility tree while the layer is open, and how many clicks a refusal costs. Diagnostic only — it never moves the score.
Agent Operability & Safety
operability-safety/form-actionabilityGrade AScoredForm backend actionability
Autonomous agents fill forms by reading the DOM directly — they cannot see placeholders rendered visually or guess what a custom div-based widget expects. Fields without a native element, a name attribute, an explicit label (label[for], wrapping label, aria-label, or aria-labelledby), or a standard autocomplete attribute for identity data (email, phone, name, address) force agents to guess, producing failed or incorrect submissions. Keep every fillable field a native input/select/textarea with a name, an explicit label and standard autocomplete tokens.
Agent Operability & Safety
operability-safety/form-autofill-token-coverageGrade AScoredForm Autofill Token Coverage
Per-form score for whether every field an agent must populate carries the machine-readable identity an agent needs: a stable name/id, a correct input type, a WHATWG autocomplete token when the field maps to a standard autofill concept, programmatic constraints, and error wiring via aria-invalid/aria-describedby. Scored as covered-fields / autofillable-fields per form.
Agent Operability & Safety
operability-safety/form-error-messagesGrade AScoredForm fields wired to their validation messages
An agent filling a form reads the accessibility tree, where a message is attached to a field by aria-errormessage or aria-describedby. Fields the server rendered as aria-invalid are checked directly; where a page carries no invalid state — the normal case on a GET, since error markup is injected after a failed submit — the required fields are checked instead, because those are the ones that can fail.
Agent Operability & Safety
operability-safety/forms-no-jsGrade CAdvisoryForms work without JavaScript
Many AI agents do not execute JavaScript, so forms that rely on JS for submission are invisible to them. Adding standard HTML action and method attributes ensures forms work via simple HTTP requests, making them accessible to all AI agents.
Agent Operability & Safety
operability-safety/frame-titleGrade CAdvisoryFrames are titled
Agents need a title to understand what each iframe contains. Untitled or duplicate-titled frames are opaque embedded contexts.
Agent Operability & Safety
operability-safety/ghost-clickable-element-ratioGrade BScoredGhost-clickable elements: click targets an agent cannot address
Measures the share of on-page click targets that a DOM/accessibility-tree agent cannot address at all: elements that look and behave clickable to a human or a vision model but expose no native or ARIA role and no accessible name, so they never appear in a Playwright-MCP style snapshot. Reported as semantic / (semantic + ghost) over the served markup and its same-origin stylesheets, with the reason each ghost is unaddressable.
Agent Operability & Safety
operability-safety/hover-only-content-and-navigationGrade BScoredHover-only navigation and content
Detects navigation subtrees and information that exist in the DOM only while a pointer hovers — `:hover`-revealed submenus with no focus or `aria-expanded` equivalent, and content carried solely in `title` attributes or hover cards. Reports each destination URL an agent never discovers.
Agent Operability & Safety
operability-safety/invisible-instruction-scanGrade AScoredInvisible Instruction Payload Scan
Detect text that is present in the byte stream or DOM but not perceivable by a human, and that reads like an instruction addressed to an AI. Covers CSS-hidden text (color ≈ background, font-size:0, opacity:0, off-screen absolute positioning, zero-size + overflow:hidden, visibility:hidden, display:none), plus channels that never render at all: HTML comments, <noscript>, <template>, oversized data-* attribute values, <script type="text/plain">/application/json blobs, non-standard <meta name> content, and inline <svg><text> with fill-opacity:0 or display:none.
Agent Operability & Safety
operability-safety/labelGrade AScoredForm inputs have associated labels
AI agents filling forms identify fields by their accessible name (label, aria-label, or aria-labelledby). Unlabeled inputs are invisible to form-filling agents, so automated workflows like "sign me up" or "submit a contact request" fail.
Agent Operability & Safety
operability-safety/landmark-uniqueGrade AScoredLandmarks are uniquely identifiable
AI browser agents traverse the accessibility tree and use a landmark’s role plus accessible name to target the right region. Two landmarks of the same role (e.g. a primary <nav> and a footer <nav>) without unique labels are indistinguishable, causing agents to act on the wrong region. A single unlabeled landmark is unambiguous and is not flagged.
Agent Operability & Safety
operability-safety/meta-refreshGrade AScoredNo time-based auto-refresh/redirect
A <meta http-equiv="refresh"> that reloads/redirects after a delay disrupts an agent mid-read and can trap it in unexpected navigation.
Agent Operability & Safety
operability-safety/native-control-substitutionGrade AScoredNative Control Substitution Index
Counts choice, date, and file-input controls implemented as custom div widgets instead of the native HTML elements, weighted by whether they sit on a conversion-critical path (search, filter, checkout, signup). Reports each substituted control with the number of agent actions it costs versus its native equivalent.
Agent Operability & Safety
operability-safety/nested-interactiveGrade AScoredNo nested interactive controls
Interactive elements nested inside other interactive elements (e.g. a button inside a link) create ambiguous targets in the accessibility tree.
Agent Operability & Safety
operability-safety/no-blocking-captchaGrade AScoredForms don't use blocking CAPTCHA
Blocking CAPTCHAs like reCAPTCHA and hCaptcha prevent AI agents from completing forms on behalf of users. When someone asks an AI assistant to "fill out the contact form on Example.com," the CAPTCHA blocks the action entirely. Use honeypot fields or invisible server-side validation instead.
Agent Operability & Safety
operability-safety/organization-identifier-registry-resolutionGrade BScoredThe organization identifier resolves in the authoritative registry
Reads `leiCode` / `iso6523Code` off the Organization markup, checks the identifier’s shape and ISO/IEC 7064 check digits locally, then resolves it against GLEIF’s public registry: exactly one record, an active entity, an issued registration, and a registered legal name that agrees with the name in the markup.
Agent Operability & Safety
operability-safety/presentation-conflictGrade AScoredNo presentation-role conflicts
An element marked role="presentation"/"none" while still focusable or carrying ARIA sends contradictory signals about whether it exists in the accessibility tree.
Agent Operability & Safety
operability-safety/reflected-parameter-injection-canaryGrade BScoredReflected-Parameter Injection Canary
Sends at most five read-only GET probes carrying a random per-scan token, then reports whether the site echoes that token back into its title, meta description, canonical link, JSON-LD, or rendered text — the fields an answer engine lifts verbatim, which would let any third party mint a URL on this domain that shows a visiting agent arbitrary text.
Agent Operability & Safety
operability-safety/security-header-hygieneGrade CAdvisorysecurity.txt (RFC 9116)
Reports whether a published /.well-known/security.txt conforms to RFC 9116 — plain text, a Contact field, and an Expires date in the future. RFC 9116 is an Informational document whose stated consumers are human security researchers and vulnerability-notification tooling; no AI crawler, retrieval pipeline or answer engine is documented to read it, so this audit is informative only — it carries weight 0 and never affects your score. A site that publishes no security.txt is reported as not applicable rather than warned.
Agent Operability & Safety
operability-safety/stateful-control-introspectabilityGrade BScoredStateful controls: current state readable by an agent
Checks that every control whose purpose is to hold a state — toggles, switches, checkboxes, radio groups, tabs, accordions, disclosure triggers, sort direction, filter chips — exposes that state through a machine-readable attribute rather than a CSS class alone. Reports the count of state-bearing controls whose current value an agent cannot read, each with the class that carries the state instead.
Agent Operability & Safety
operability-safety/synthetic-media-disclosure-validityGrade BScoredAI-generated-image disclosure is machine-readable and self-consistent
Reads `Iptc4xmpExt:DigitalSourceType` out of each image’s XMP packet and tests it against the ratified IPTC NewsCodes vocabulary. The property is typed as a URI, so a bare token, an `https` variant of the `http` vocabulary URI, a trailing slash or free text all read as nothing to a consumer. Also compares the XMP declaration against what the asset’s own C2PA manifest says.
Agent Operability & Safety
operability-safety/tabindexGrade CAdvisoryNo positive tabindex (logical focus order)
Positive tabindex values force a non-DOM focus order. Agents that traverse the page by focus order then encounter a confusing, non-linear sequence.
Agent Operability & Safety
operability-safety/table-headersGrade BScoredData tables have header associations
Agents extracting tabular data rely on header↔cell associations (th scope / headers attr) to know what each value means. Missing associations make tables ambiguous.
Agent Operability & Safety
operability-safety/third-party-dom-write-blast-radiusGrade BScoredThird-party DOM-write blast radius
Counts how many separate companies can write text into the DOM an agent reads: every registrable domain shipping a script or stylesheet into the page, judged against whether the Content-Security-Policy actually constrains what may run, and whether each resource is pinned with an `integrity` hash. Cross-origin frames with no `sandbox` are reported alongside. The origin list is the deliverable.
Agent Operability & Safety
operability-safety/trust-txt-reciprocity-coherenceGrade CAdvisorytrust.txt associations are reciprocated and agree with robots.txt
For publishers who maintain a trust.txt: validates the attribute names, resolves each `belongto=` against that association’s own trust.txt to see whether it lists this domain back, and compares `datatrainingallowed=` against what robots.txt actually tells AI crawlers. Reported as a trust signal only — no AI engine is documented as a trust.txt consumer, so nothing here affects the score.
Agent Operability & Safety
operability-safety/ugc-trust-boundary-markersGrade BScoredUGC Trust-Boundary Markers
Locates visitor-contributed regions — comments, reviews, Q&A, forum posts, submission forms — and checks whether any machine-readable boundary separates them from editorial copy: `data-nosnippet` containment on a span, div or section, `rel="ugc"` on their outbound links, and whether raw markup survives the sanitizer inside them.
Agent Operability & Safety
operability-safety/unicode-covert-channel-scanGrade BScoredInvisible codepoints carrying hidden text
Scans rendered text, the attributes an agent reads, every JSON-LD string value and the site’s root files for codepoints that carry information invisibly: the Unicode Tags block (U+E0000–U+E007F), bidirectional overrides and isolates (U+202A–U+202E, U+2066–U+2069), and zero-width or filler characters (U+200B–U+200D, U+2060, U+FEFF, U+00AD, U+115F, U+1160, U+3164, U+FFA0). Decodes any tag-block run back to ASCII and prints the invisible sentence sitting on the page.
Agent Operability & Safety
operability-safety/unsafe-agent-triggerable-affordancesGrade BScoredState-changing links an agent can trigger by fetching them
Finds links and GET forms whose URL changes state on the server — delete, cancel, revoke, unsubscribe, logout, add-to-cart, confirm — with no POST, no confirmation affordance and no `rel="nofollow"` in the way. Markup analysis only: a flagged URL is reported, never fetched.
Agent Operability & Safety
operability-safety/url-addressable-state-and-pagination-fallbackGrade BScoredListings walkable by URL: pagination and facet fallback
Checks that a listing exposes its later pages through real `href` pagination or a `rel="next"` link rather than infinite-scroll machinery alone, and that each facet changes what the server returns rather than only what the browser shows. Reports the deepest item index reachable by URL alone, and any facet that turns out to be client-only.
Agent Operability & Safety
operability-safety/wikidata-round-trip-verificationGrade BScoredThe Wikidata entity this site claims points back at this site
Takes the Wikidata Q-id the site claims in its Organization or Person `sameAs`, asks Wikidata what that entity gives as its official website (P856), and compares registrable domains. A `sameAs` is self-asserted and any site can claim any entity; only the round trip is evidence.
Agent Operability & Safety
structured-data/advanced-product-detailsGrade AScoredAdvanced product details
AI agents use a product's name, brand, category, and availability status to filter search results and answer availability queries. A Product without a name cannot be matched to a catalog entry at all; missing brand, category or availability makes it less likely to surface in filtered AI recommendations.
Structured Data
structured-data/article-schemaGrade AScoredArticle schema
AI agents extract Article schema to identify content freshness (datePublished/dateModified), authorship, and topic (headline). Without it, your blog content is treated as generic text with no provenance, reducing its chances of being cited in AI-generated answers.
Structured Data
structured-data/author-schemaGrade CAdvisoryAuthor schema with credentials
AI systems assign higher confidence to content from named experts with verifiable credentials. Person schema with jobTitle, sameAs, and affiliation lets AI agents cross-reference author identity across platforms, boosting your content in RAG trust scoring.
Structured Data
structured-data/breadcrumb-schemaGrade AScoredBreadcrumbList schema
AI agents use BreadcrumbList to understand your site hierarchy and navigate between parent/child pages. Without breadcrumbs, agents cannot infer where a page sits in your content tree, making it harder to provide contextual answers that reference related pages.
Structured Data
structured-data/claimreview-advisoryGrade AAdvisoryClaimReview investment advisory
ADVISORY / UNSCORED. Detects ClaimReview markup and tells the operator the truth about its status rather than rewarding coverage: Google is phasing out ClaimReview support in Search, while the Fact Check Explorer still consumes it. Also validates the required shape and the one-per-page constraint for sites that keep it.
Structured Data
structured-data/faqpage-schemaGrade CAdvisoryFAQPage schema
AI answer engines like Perplexity and Google SGE extract FAQ-structured content with higher confidence for direct answers. FAQPage schema makes your Q&A content machine-readable, giving it priority in AI-generated responses over unstructured text.
Structured Data
structured-data/howto-schemaGrade CAdvisoryHowTo schema
AI agents use HowTo schema to present step-by-step instructions as structured answers. Without it, agents must parse your numbered headings heuristically, which often breaks step ordering or misses steps entirely.
Structured Data
structured-data/json-ld-presentGrade AScoredJSON-LD present
AI agents rely on JSON-LD structured data to understand what your site offers, who runs it, and how to interact with it. Without any JSON-LD, agents like ChatGPT and Perplexity treat your site as unstructured text with no machine-readable identity. Add Organization and WebSite schemas to your homepage <head> as a starting point.
Structured Data
structured-data/local-business-schemaGrade AScoredLocalBusiness/ProfessionalService schema
AI agents use LocalBusiness schema to answer location-based queries like "find a [service] near me." Without it, your business is invisible to location-aware AI systems. Add address, telephone, and openingHours to help agents provide accurate local recommendations.
Structured Data
structured-data/organization-schemaGrade AScoredOrganization schema
AI agents use Organization schema to identify your brand, logo, and contact info. Without it, agents cannot confidently attribute content to your organization or display your branding in AI-generated answers. Add this JSON-LD to your homepage <head>.
Structured Data
structured-data/review-schemaGrade AScoredReview/AggregateRating schema
AI agents use Review/AggregateRating schema as social proof when comparing options. When a user asks "what is the best X?", agents surface structured ratings from schema rather than parsing unstructured testimonial text. Add this schema to make your reviews machine-readable.
Structured Data
structured-data/schema-validationGrade AScoredSchema validation
AI agents parse @context and @type to identify entity types in your structured data. Blocks missing these properties are silently ignored by every schema consumer, including Google, ChatGPT plugins, and RAG pipelines. Add "@context": "https://schema.org" and a valid @type to each block.
Structured Data
structured-data/service-schemaGrade AScoredService schema
AI agents use Service schema to understand what you offer and who provides it. Without it, agents must infer your offerings from unstructured text, which leads to inaccurate or incomplete descriptions in AI-generated recommendations.
Structured Data
structured-data/speakable-schemaGrade BScoredSpeakable schema
Google Assistant uses the speakable property to pick which sentences of a news article it reads aloud on Assistant-enabled devices. Without it, the assistant has to guess, and often vocalizes navigation or boilerplate instead of your headline and summary. Mark the headline and summary with cssSelector on your Article or WebPage node.
Structured Data
No checks match. Try a broader term or select all categories and check types.