AI
WebAgentScan
van BuiltToWinWeb
TaalEnglishEspañolFrançaisDeutschItalianoPortuguês中文日本語한국어РусскийNederlands

Methodology

How WebAgentScan scores a site

Every check below is listed with what it measures, the bar for full marks and the published source it is based on. The page is generated from the scanner code itself, so it changes when the checks do.

AI Ranking

Whether an AI agent can find the site, read it, and use what it exposes. It is the weighted sum of the core pillars, renormalised over the pillars that apply.

Discovery 20, Machine-inhoud 15, Agenttoegang 12, MCP-kwaliteit 20, Agentbeveiliging 18, Autoriteit 15. Commerce voegt er 10 aan toe, en alleen als de site daadwerkelijk iets verkoopt. Een pijler zonder iets te beoordelen wordt uitgesloten in plaats van op nul gezet, zodat we een site nooit afrekenen op gegevens die we niet hebben.

Site Readiness

Whether the site is fit to launch. A weighted mean of category scores over every graded check; a category with nothing measured is left out, never scored zero. Clear 75 to pass the launch bar.

CategoryWeight
Search25%
Security25%
Compliance15%
Does it work20%
Speed & visual15%

Rules every check follows

  • Every result carries its evidence: what we measured, the bar and what we saw. A score you cannot verify is not worth having.
  • Grey means not measured: a data source was unavailable or the check did not apply. Grey checks are excluded from every score and never count against a site.
  • What to fix is ordered by impact divided by effort. Impact is the AI Ranking and Site Readiness points a fix recovers; effort S, M and L cost 1, 2 and 4.
  • Findings that would help an attacker are withheld until domain ownership is verified. The score is the same either way.
  • Scans are polite: a fixed request budget per scan, per-site rate limits, and no request to anything but the public site you name.

Every check, by category

AI visibility

AI Ranking

Whether answer engines and AI crawlers can find and read you.

llms.txt

llms_txt
Free

Whether /llms.txt is served at that exact path as text, is not a soft-404 HTML page, and indexes the site as Markdown links.

ThresholdServed as text/plain or text/markdown with at least 5 linked entries

Source: llmstxt.org specification

agents.txt

agents_txt
Free

Whether /agents.txt is served as a distinct, non-empty file stating how agents may use the site.

ThresholdA distinct non-empty file at /agents.txt

Source: IETF draft: agents.txt well-known

.well-known discovery files

well_known
Free

Which of ai-plugin.json, mcp.json, oauth-protected-resource, ai-catalog.json and agent.json answer under /.well-known/ with real content.

Threshold4 or more valid descriptors

Source: RFC 8615: Well-Known URIs

XML sitemap

sitemap
Free

Whether /sitemap.xml returns a sitemap with URL entries.

ThresholdA sitemap with at least one <loc> entry

Source: sitemaps.org protocol

A2A agent card

agent_card
Free

Whether an Agent2Agent card is published at one of the three common /.well-known paths and names the agent and its skills.

ThresholdA card with a name and a skills array; a card missing either earns half

Source: A2A protocol (a2aproject)

Markdown content negotiation

markdown_negotiation
Free

Whether the homepage answers Accept: text/markdown with Markdown, and says so with Vary: Accept.

ThresholdMarkdown returned for Accept: text/markdown, with Vary: Accept

Source: MDN: Content negotiation

Structured data

structured_data
Free

The JSON-LD types on the homepage and whether one of them identifies the site owner (Organization, Person, LocalBusiness, WebSite).

ThresholdValid JSON-LD including an identity node

Source: Google Search Central: structured data

Readable without JavaScript

render_independence
Free

Visible words in the server-rendered HTML, before any script runs.

Threshold300 words or more (100-299 earns half)

Source: Google: JavaScript SEO basics

Title and description

title_description
Free

Presence and length of the <title> and meta description.

ThresholdA title and a 50-320 character description

Source: Google: influencing title links

robots.txt

robots_present
Free

Whether /robots.txt exists as a real text file and names any AI crawler explicitly.

ThresholdA robots.txt that addresses AI crawlers by name

Source: RFC 9309: Robots Exclusion Protocol

Retrieval crawlers admitted

retrieval_bots
Free

Whether answer-time crawlers (OAI-SearchBot, ChatGPT-User, PerplexityBot, Claude-User, Claude-SearchBot) are blocked at the site root, by name or by the * group.

ThresholdNone of the five blocked at /; blocking training-only crawlers is not penalised

Source: OpenAI: overview of OpenAI crawlers

CORS on discovery files

cors_discovery
Free

Whether the agent discovery files that exist send Access-Control-Allow-Origin, so in-browser agents can read them.

ThresholdEvery present discovery file sends Access-Control-Allow-Origin

Source: MDN: Cross-Origin Resource Sharing

Neutral to non-browser agents

ua_neutrality
Free

Whether the homepage answers a non-browser user agent the way it answers a browser, instead of a block or challenge page.

ThresholdSame status for an agent user agent as for a browser

Source: Google spam policies: cloaking

AI search crawlers allowed

ai_retrieval_bots
Free

RFC 9309 evaluation of robots.txt for OAI-SearchBot, Claude-SearchBot and PerplexityBot on the homepage and the pages it links to, including blocks inherited from the User-agent: * group.

ThresholdAll three allowed on / and on >= 75% of internal links

Source: RFC 9309: Robots Exclusion Protocol

AI crawler policy (training vs retrieval)

ai_bot_policy
Free

How robots.txt treats 27 AI and search user agents, grouped into search engines, AI search, user-triggered fetchers, training crawlers and training-control tokens. Reported, not graded: blocking training is a legitimate choice.

ThresholdInformational

Source: Google Search Central: How Google interprets robots.txt

Homepage reachable as OAI-SearchBot

ai_fetch_oai_searchbot
Free

The homepage fetched with OAI-SearchBot's published User-Agent, compared with a browser fetch: HTTP status, bot-challenge or interstitial pages, and whether the page served is much thinner than the browser version. UA-based: a CDN verifying real bots by IP may treat the real crawler differently.

ThresholdHTTP 200, no challenge, >= 30% of the browser text

Source: OpenAI: Overview of OpenAI crawlers

Homepage reachable as ChatGPT-User

ai_fetch_chatgpt_user
Free

The homepage fetched with ChatGPT-User's published User-Agent, compared with a browser fetch: HTTP status, bot-challenge or interstitial pages, and whether the page served is much thinner than the browser version. UA-based: a CDN verifying real bots by IP may treat the real crawler differently.

ThresholdHTTP 200, no challenge, >= 30% of the browser text

Source: OpenAI: Overview of OpenAI crawlers

Homepage reachable as Claude-User

ai_fetch_claude_user
Free

The homepage fetched with Claude-User's published User-Agent, compared with a browser fetch: HTTP status, bot-challenge or interstitial pages, and whether the page served is much thinner than the browser version. UA-based: a CDN verifying real bots by IP may treat the real crawler differently.

ThresholdHTTP 200, no challenge, >= 30% of the browser text

Source: Anthropic: Does Anthropic crawl data from the web?

Homepage reachable as PerplexityBot

ai_fetch_perplexitybot
Free

The homepage fetched with PerplexityBot's published User-Agent, compared with a browser fetch: HTTP status, bot-challenge or interstitial pages, and whether the page served is much thinner than the browser version. UA-based: a CDN verifying real bots by IP may treat the real crawler differently.

ThresholdHTTP 200, no challenge, >= 30% of the browser text

Source: Perplexity: Perplexity crawlers

Homepage reachable as Googlebot

ai_fetch_googlebot
Free

The homepage fetched with Googlebot's published User-Agent, compared with a browser fetch: HTTP status, bot-challenge or interstitial pages, and whether the page served is much thinner than the browser version. UA-based: a CDN verifying real bots by IP may treat the real crawler differently.

ThresholdHTTP 200, no challenge, >= 30% of the browser text

Source: Google: Overview of Google crawlers and fetchers

Content in the HTML (not a JS shell)

ai_js_shell
Free

Whether the server HTML of the homepage carries readable text, or is an empty client-rendered app shell. Most AI crawlers do not run JavaScript.

Threshold>= 150 words in server HTML

Source: Vercel: The rise of the AI crawler

JSON-LD parses

ai_jsonld_parse
Free

Every <script type="application/ld+json"> block on the homepage decodes as JSON.

ThresholdAt least one block; none invalid

Source: W3C JSON-LD 1.1

llms.txt valid

ai_llms_txt
Free

/llms.txt served as text and checked against the llmstxt.org grammar: one H1 first, > summary, ## link sections, absolute well-formed links, no placeholders.

ThresholdPresent, no errors or warnings

Source: llmstxt.org: The /llms.txt file

llms-full.txt

ai_llms_full
Free

/llms-full.txt (the full-text companion to llms.txt) answers 200 as text.

ThresholdPresent as text

Source: llmstxt.org: The /llms.txt file

Sitemap freshness

ai_sitemap_freshness
Free

Age of the newest <lastmod> in the sitemap: a signal of whether content is maintained.

ThresholdNewest lastmod <= 90 days old

Source: Google Search Central blog: Sitemaps lastmod

Content-Signal / RSL licensing

ai_content_signal
Free

Content-Signal lines (search, ai-input, ai-train) and RSL License directives in robots.txt, and RSL <link rel="license"> on the homepage. Reported, not graded.

ThresholdInformational

Source: Content Signals Policy

Wikidata entity for the brand

ai_entity
Free

Organization sameAs links to Wikidata/Wikipedia, else a Wikidata wbsearchentities lookup of the brand name. A signal, not an obligation: not found is grey.

ThresholdAn entity whose label matches the brand

Source: Wikidata API: wbsearchentities

Answer-ready paragraph near the top

ai_answer_block
Free

Whether one of the first paragraphs of the homepage is a self-contained 40-60 word answer, the length answer engines and featured snippets most often quote.

ThresholdA 40-60 word paragraph in the first six

Source: Google Search Central: AI features and your website

Author byline / "who" entity

ai_author
Free

Article pages in the sample carry an author (JSON-LD author or Person, meta author, rel/itemprop author, byline markup); without article pages, the homepage names an Organization or Person.

ThresholdEvery article has an author

Source: Google Search Central: Article author markup best practices

Agent protocols & MCP

AI Ranking

MCP, A2A, agent cards and commerce protocols an agent can use.

MCP server reachable

mcp_present
Free

Whether an MCP server answers initialize over Streamable HTTP or SSE, found via /.well-known/mcp.json, /mcp, /api/mcp or the endpoint you give.

ThresholdA successful initialize handshake

Source: MCP specification: lifecycle

Tools advertised

mcp_tools
Free

Whether tools/list returns at least one tool.

ThresholdOne or more tools listed

Source: MCP spec: Tools

Tool descriptions

mcp_descriptions
Free

Share of tools with a description long enough to tell a model when to call them.

ThresholdEvery tool described in a useful sentence

Source: MCP spec: Tools

Parameter descriptions

mcp_params
Free

Share of tool input parameters that carry a description.

ThresholdEvery parameter described

Source: MCP spec: Tools

Output schemas

mcp_output
Free

Share of tools that declare an outputSchema, so results can be validated.

ThresholdEvery tool declares outputSchema

Source: MCP spec: Tools

Behaviour annotations

mcp_annotations
Free

Share of tools that declare readOnlyHint / destructiveHint / idempotentHint annotations.

ThresholdEvery tool annotated

Source: MCP spec: Tools

Tool naming

mcp_naming
Free

Whether tool names follow one consistent convention and avoid vague names such as run or do.

ThresholdOne convention, no vague names

Source: MCP spec: Tools

Sells something an agent could buy

com_applicable
Free

Whether the site shows commerce signals (Product or Offer markup, cart or checkout paths). The pillar is skipped when it does not.

ThresholdDetected commerce signals; otherwise not applicable

Source: schema.org: Product

Product and offer schema

com_schema
Free

Whether products are described with schema.org Product and Offer in JSON-LD.

ThresholdProduct with a nested Offer

Source: Google: merchant listing structured data

Machine-readable pricing

com_pricing
Free

Whether offers carry price, priceCurrency and availability.

ThresholdAll three present

Source: schema.org: Offer

Agentic commerce discovery

com_agentic
Free

Whether the site publishes agentic-commerce or payments descriptors an agent can use to check out. The specifications are young, so this carries few points.

ThresholdA discoverable commerce descriptor

Source: Agentic Commerce Protocol

Agent access sub-score

ai_ops_access
Free

Composite 0-100: AI search crawlers allowed in robots.txt (40), the homepage served to assistant User-Agents without a challenge (40), content present in the server HTML (20). Reported, not graded.

ThresholdInformational (100 = fully accessible)

Source: OpenAI: Overview of OpenAI crawlers

Agent comprehension sub-score

ai_ops_comprehension
Free

Composite 0-100 from landmarks, a single H1, page language, JSON-LD, image alt coverage and named links. Reported, not graded.

ThresholdInformational (100 = fully legible)

Source: W3C WAI-ARIA APG: Landmark regions

Agent operability sub-score

ai_ops_operability
Free

Composite 0-100 from labelled form controls, named buttons, absence of blocking overlays, and WebMCP/NLWeb bonuses. Reported, not graded.

ThresholdInformational (100 = fully operable)

Source: WCAG 2.2 Understanding 4.1.2 Name, Role, Value

Page landmarks

ai_ops_landmarks
Free

<main>, <nav>, <header>, <footer> (or the matching ARIA roles) that let an agent find the main content and navigation.

Thresholdmain plus at least two of nav/header/footer

Source: W3C WAI-ARIA APG: Landmark regions

Form controls are labelled

ai_ops_form_labels
Free

Share of visible inputs, selects and textareas with an accessible name (label, aria-label, aria-labelledby or title; placeholder alone counts half).

Threshold>= 90% labelled

Source: W3C WAI: Labeling controls

Buttons have names

ai_ops_button_names
Free

Share of buttons (<button>, role=button, input type=submit/button) with an accessible name an agent can target.

Threshold>= 90% named

Source: WCAG 2.2 Understanding 4.1.2 Name, Role, Value

No blocking overlay in the HTML

ai_ops_overlay
Free

Modal dialogs open in the initial HTML (open <dialog>, aria-modal, cookie walls) and whether they offer a named close/accept/reject control.

ThresholdNo open modal, or one with a named dismiss control

Source: W3C WAI-ARIA APG: Dialog (modal) pattern

WebMCP tools exposed

ai_ops_webmcp
Free

navigator.modelContext tool registration in inline scripts, or declarative WebMCP tool attributes on forms. A bonus: absent is informational.

ThresholdBonus when present

Source: W3C WebML CG: WebMCP explainer

NLWeb /ask endpoint

ai_ops_nlweb
Free

Whether /ask answers a natural-language query with JSON (the NLWeb protocol). A bonus: absent is informational.

ThresholdBonus when present

Source: NLWeb project

Security

Readiness 25%

Transport, headers, exposure, and what an agent could do to you.

HTTPS and HSTS

sec_tls
Free

Whether the site is served over HTTPS with a Strict-Transport-Security max-age.

ThresholdHTTPS with an HSTS max-age of at least 15768000 seconds (six months); 31536000 recommended

Source: MDN: Strict-Transport-Security

Security response headers

sec_headers
Free

Presence of Content-Security-Policy, X-Content-Type-Options, Referrer-Policy, X-Frame-Options and Permissions-Policy on the homepage.

ThresholdAll five present

Source: OWASP Secure Headers Project

No sensitive files exposed

sec_exposed
Free

Whether well-known secret files (.env, .git/config, config backups, phpinfo) are readable. Detail is shown only to a verified owner.

ThresholdNone readable

Source: OWASP WSTG: configuration and deployment testing

Origin address not disclosed

sec_origin_leak
Free

Behind Cloudflare, whether common diagnostic paths (phpinfo, server-status, status pages) print a public IP address that would let an attacker bypass the CDN. Detail is shown only to a verified owner.

ThresholdNo origin address disclosed

Source: Cloudflare: protect your origin server

OAuth resource metadata

sec_oauth
Free

When the MCP server requires auth, whether RFC 9728 protected-resource metadata tells a client where to authenticate.

ThresholdValid /.well-known/oauth-protected-resource

Source: RFC 9728: OAuth 2.0 Protected Resource Metadata

MCP authentication posture

sec_mcp_auth
Free

Whether an MCP server that exposes mutating tools accepts unauthenticated calls. Detail is shown only to a verified owner.

ThresholdAuth required wherever a tool can change something

Source: MCP specification: authorization

Destructive tools declared

sec_mcp_risk
Free

Whether tools whose names suggest they change or delete data declare destructiveHint.

ThresholdEvery mutating tool annotated

Source: MCP spec: Tools

Tool text free of model instructions

sec_injection
Free

Whether tool names and descriptions contain text that tries to instruct the model (tool poisoning).

ThresholdNo instruction-like text

Source: OWASP GenAI: LLM01 prompt injection

HTTP redirects to HTTPS

sec_https_redirect
Free

Where the first hop of http://host/ goes, without following it.

Threshold301 or 308 to https:// on the same host

Source: hstspreload.org: submission requirements

HSTS max-age

sec_hsts
Free

The Strict-Transport-Security header on the HTTPS homepage and its max-age.

Thresholdmax-age >= 15768000 (6 months)

Source: MDN: Strict-Transport-Security

HSTS preload eligibility

sec_hsts_preload
Free

Whether the HSTS header and redirect meet the browser preload list rules.

Thresholdmax-age >= 31536000, includeSubDomains, preload, same-host HTTPS redirect

Source: hstspreload.org

Content-Security-Policy enforced

sec_csp
Free

Whether a CSP is sent as an enforced header (not only report-only or a meta tag).

ThresholdEnforced Content-Security-Policy header

Source: Mozilla HTTP Observatory: tests and scoring

CSP blocks injected scripts

sec_csp_script
Free

The effective script-src (or default-src): 'unsafe-inline' without nonces/hashes, 'unsafe-eval', and blanket sources (*, https:, data:).

ThresholdNo 'unsafe-inline', 'unsafe-eval' or blanket sources

Source: Mozilla HTTP Observatory: tests and scoring

CSP object-src and base-uri

sec_csp_object
Free

Whether object-src is 'none' and base-uri is restricted.

Thresholdobject-src 'none'; base-uri 'self' or 'none'

Source: OWASP CSP Cheat Sheet

Clickjacking protection

sec_clickjacking
Free

CSP frame-ancestors in the header, or X-Frame-Options DENY/SAMEORIGIN.

Thresholdframe-ancestors restricted or X-Frame-Options DENY/SAMEORIGIN

Source: OWASP Clickjacking Defense Cheat Sheet

Permissions-Policy

sec_permissions_policy
Free

Whether Permissions-Policy switches off powerful features the site does not use.

ThresholdPresent and disabling at least one powerful feature

Source: MDN: Permissions-Policy

Referrer-Policy

sec_referrer_policy
Free

The Referrer-Policy header (or meta referrer) value.

Thresholdno-referrer, same-origin, strict-origin or strict-origin-when-cross-origin

Source: Mozilla HTTP Observatory: tests and scoring

No version disclosure

sec_version_disclosure
Free

Server, X-Powered-By, X-AspNet-Version and similar headers that name software and versions.

ThresholdNo version numbers in response headers

Source: OWASP WSTG-INFO-02: Fingerprint Web Server

Cookie flags

sec_cookies
Free

Secure, HttpOnly (for session-like cookies), SameSite and prefix rules on cookies set by the homepage.

ThresholdSecure on HTTPS, HttpOnly on session cookies, SameSite set

Source: MDN: Set-Cookie

Subresource Integrity on third-party scripts

sec_sri
Free

Whether versioned third-party scripts carry integrity hashes; unversioned vendor loaders are reported as advisory.

ThresholdEvery versioned third-party script has integrity=

Source: MDN: Subresource Integrity

security.txt

sec_security_txt
Free

/.well-known/security.txt and its Contact and Expires fields.

ThresholdContact present and Expires in the future

Source: RFC 9116: security.txt

No repository or env files exposed

sec_vcs_exposed
Free

Whether /.git/HEAD or /.env.local serve their real content (the core pillar covers /.env and /.git/config). Detail only for a verified owner.

ThresholdNone readable

Source: OWASP WSTG-CONF-04: Old Backup and Unreferenced Files

No backups or dumps exposed

sec_backup_exposed
Free

Whether wp-config.php.bak or backup.sql serve real content (the core pillar covers config.php.bak). Detail only for a verified owner.

ThresholdNone readable

Source: OWASP WSTG-CONF-04: Old Backup and Unreferenced Files

No debug endpoints exposed

sec_debug_exposed
Free

Whether Apache server-status or the Spring Boot actuator answer with their real content (the core pillar covers phpinfo). Detail only for a verified owner.

ThresholdNone reachable

Source: OWASP WSTG-CONF-05: Enumerate Admin Interfaces

TLS 1.3 negotiated

net_tls_version
Free

The protocol a modern client negotiates with the site.

ThresholdTLS 1.3 (TLS 1.2 is acceptable)

Source: Mozilla Server Side TLS guidelines

Certificate valid

net_cert
Free

Whether the certificate verifies, matches the host, is not self-signed, and how many days it has left.

ThresholdVerifies, matches, more than 21 days left

Source: MDN: Transport Layer Security

SPF record

net_spf
Free

Exactly one v=spf1 TXT record and the qualifier of its all mechanism.

ThresholdOne record ending in -all or ~all

Source: RFC 7208: Sender Policy Framework

DMARC policy

net_dmarc
Free

The _dmarc TXT record: present, single, and its p= and pct= values.

Thresholdp=quarantine or p=reject at pct=100

Source: RFC 7489: DMARC

DMARC reports requested

net_dmarc_reporting
Free

Whether the DMARC record asks for aggregate reports (rua).

Thresholdrua present

Source: RFC 7489 section 7: DMARC feedback

DKIM key published

net_dkim
Free

A DKIM public key at the selectors most likely for the mail provider. Grey when none is found, because selectors cannot be listed.

ThresholdA key at a likely selector

Source: RFC 6376: DKIM Signatures

CAA records

net_caa
Free

CAA records at the host or its registrable domain, and whether they permit the CA that issued the current certificate.

ThresholdCAA present and permitting the current CA

Source: RFC 8659: DNS Certification Authority Authorization

No dangling CNAME

net_dangling_cname
Free

Whether the host or its apex/www sibling is a CNAME to a target that no longer resolves, or to a claimable provider without an address. Detail only for a verified owner.

ThresholdNo dangling CNAME

Source: OWASP WSTG-CONF-10: Test for Subdomain Takeover

BIMI logo record

net_bimi
Free

Whether default._bimi publishes a brand logo record (reported, not graded).

ThresholdInformational

Source: BIMI Group: implementation guide

No hidden tool poisoning

mcp_sec_poisoning
Free

Tool names, descriptions and schemas for invisible Unicode (tag, zero-width, bidi), base64 text, hidden tags, exfiltration phrasing and cross-tool shadowing.

ThresholdNo poisoning signals

Source: OWASP GenAI: LLM01 prompt injection

Destructive tools flagged honestly

mcp_sec_annotations
Free

Whether tools named delete/remove/drop/revoke/cancel/refund... set destructiveHint: true and never claim readOnlyHint: true.

ThresholddestructiveHint: true, no read-only claim

Source: MCP specification: Tools (security considerations)

OAuth metadata correct (RFC 9728)

mcp_sec_oauth
Free

Protected-resource metadata: resource matching the endpoint, https authorization_servers, bearer methods, JSON content type, and a WWW-Authenticate resource_metadata pointer.

ThresholdValid and discoverable from the 401

Source: RFC 9728: OAuth 2.0 Protected Resource Metadata

Rate limits advertised

mcp_sec_rate_limit
Free

RateLimit, RateLimit-Policy, X-RateLimit-* or Retry-After headers on MCP responses.

ThresholdRate-limit headers present

Source: IETF draft: RateLimit header fields for HTTP

Server card matches live tools

mcp_sec_card_mismatch
Free

Tool names on the server card (/.well-known/mcp.json or /.well-known/mcp/server-card.json) against tools/list.

ThresholdIdentical sets

Source: MCP specification: Tools (security considerations)

Tool fingerprints

mcp_sec_tool_hashes
Free

A sha256 per tool over name, description, schemas and annotations, kept so a later scan can flag silent changes (reported, not graded).

ThresholdInformational

Source: Invariant Labs: MCP tool poisoning and rug pulls

Compliance

Readiness 15%

Privacy, consent and accessibility signals. Signals, not legal advice.

Privacy notice reachable

comp_privacy_policy
Free

A homepage link to a privacy notice, whether it loads, and how many words of readable text it has.

ThresholdLinked, HTTP 200, at least 300 words

Source: GDPR Art. 12: transparent information

Controller identity and contact

comp_controller
Free

Whether the notice or homepage names who is responsible for the data and gives an email or postal address.

ThresholdNamed controller plus a contact

Source: GDPR Art. 13: information to be provided

GDPR Art. 13 topics covered

comp_gdpr_art13
Free

Keyword detection of nine Art. 13 topics in the notice: controller, purposes, legal basis, recipients, retention, rights, withdrawing consent, complaints, transfers.

ThresholdAll nine topics present

Source: GDPR Art. 13: information to be provided

Transfer mechanism named

comp_transfers
Free

When US-based tags load, whether the notice names a transfer mechanism (SCCs, EU-US Data Privacy Framework, adequacy).

ThresholdA mechanism named

Source: GDPR Art. 44-46: transfers to third countries

Children's data addressed

comp_children
Free

When a homepage form asks for age or date of birth, whether the notice addresses children's data.

ThresholdChildren addressed in the notice

Source: GDPR Art. 8: conditions for a child's consent

Rights-request route and timeframe

comp_rights_route
Free

Whether the notice gives a route (email, form, DPO) for rights requests and a response time.

ThresholdRoute and timeframe stated

Source: GDPR Art. 12(3): one month to respond

Consent manager present

comp_cmp
Free

Fingerprints of 20 consent managers (OneTrust, Cookiebot, SecurePrivacy, Termly, Iubenda, CookieYes, Osano, Didomi, Usercentrics, Klaro, Complianz and more), graded when tracking tags load.

ThresholdA CMP whenever tracking tags load

Source: EDPB Guidelines 05/2020 on consent

No tracking before consent

comp_trackers_preconsent
Free

Meta Pixel, GA4/gtag, Google Ads, GTM, TikTok, LinkedIn Insight, Hotjar and Clarity tags in the raw HTML, and whether each is gated (CMP blocking attributes or Consent Mode default-denied). Zaraz-managed tags are invisible and reported grey.

ThresholdEvery tracker gated until consent

Source: CJEU C-673/17 Planet49

"Do Not Sell or Share" link

comp_ccpa_optout
Free

When advertising tags load, a "Do Not Sell or Share" or "Your Privacy Choices" link or control.

ThresholdOpt-out link present

Source: California Civil Code 1798.135 (CCPA/CPRA)

Global Privacy Control declared

comp_gpc
Free

When advertising tags load, whether /.well-known/gpc.json declares gpc: true.

Threshold{"gpc": true}

Source: Global Privacy Control specification

Reject all on the first layer

comp_reject_all
Free

Whether the banner offers Reject all with equal prominence. Grey (needs a browser) unless the CMP config is readable in the page.

ThresholdReject all on the first layer

Source: EDPB Cookie Banner Taskforce report (2023)

Images have alt text

comp_wcag_alt
Free

Images without an alt attribute (alt="" for decoration counts as present).

ThresholdEvery image has alt (WCAG 1.1.1)

Source: WCAG 2.2 SC 1.1.1 Non-text Content

Form fields labelled

comp_wcag_labels
Free

Form fields without a label, aria-label, aria-labelledby or title.

ThresholdEvery field labelled (WCAG 1.3.1 / 4.1.2)

Source: WCAG 2.2 SC 4.1.2 Name, Role, Value

Text contrast (inline styles)

comp_wcag_contrast
Free

Contrast of colour pairs set in inline styles, with alpha composited over the nearest opaque inline background. Grey when colours come only from stylesheets.

Threshold4.5:1 (3:1 for large text)

Source: WCAG 2.2 SC 1.4.3 Contrast (Minimum)

Does it work

Readiness 20%

Broken links, redirects, sitemap URLs and other things that break.

No redirect loops

works_redirect_loops
Free

Redirect chains of the homepage and sampled URLs: a URL repeating in the chain, or more hops than the client follows (5).

ThresholdNo loop, <= 5 hops

Source: Google Search Central: Redirects and Google Search

Web fonts allowed cross-origin

works_font_cors
Free

For a font served from another origin, whether it answers with Access-Control-Allow-Origin (browsers refuse cross-origin fonts without it).

ThresholdACAO * or the page origin

Source: MDN: Cross-Origin Resource Sharing (fonts need CORS)

Correct MIME types (nosniff)

works_mime_nosniff
Free

Content-Type of fetched stylesheets and scripts, and X-Content-Type-Options: nosniff on the homepage. With nosniff, a wrong type stops the file loading.

Thresholdtext/css and JavaScript types; nosniff set

Source: MDN: X-Content-Type-Options

Forms can be submitted

works_forms_submit
Free

Homepage forms have a submit control (or a single field for implicit submission) and a real action rather than javascript: or #.

ThresholdEvery form submittable

Source: MDN: Sending form data

Email fields use type=email

works_email_inputs
Free

Inputs named or labelled for email use type="email", which gives validation, the right mobile keyboard and autofill.

ThresholdAll email fields type=email

Source: MDN: <input type="email">

Canonical, robots and sitemap agree

works_directives_agree
Free

Sitemap URLs disallowed by robots.txt, sampled sitemap pages that are noindex or canonicalise elsewhere, and a canonical target that is noindex.

ThresholdNo contradictions

Source: Google Search Central: Build and submit a sitemap

No URL-parameter crawl traps

works_param_traps
Free

Internal links on the homepage carrying session IDs, tracking parameters or many sort/filter combinations not disallowed in robots.txt.

ThresholdNo session IDs or utm_ on internal links; < 5 unprotected facet links

Source: Google Search Central: Managing crawling of faceted navigation URLs

Response time

works_response_time
Free

Median total response time of the homepage and sampled pages as measured by the scanner (includes redirects and transfer).

Threshold<= 800 ms (<= 1800 ms partial)

Source: web.dev: Time to First Byte

Speed & visual

Readiness 15%

Field and lab performance, and how the page renders.

Real-user speed data available

spd_field_data
Free

Whether the Chrome UX Report publishes phone field data for the page or the origin (28-day window).

ThresholdReported only, never graded

Source: Chrome UX Report API

Largest Contentful Paint (real users)

spd_field_lcp
Free

75th-percentile LCP for phone visitors, from the Chrome UX Report (page, else origin).

ThresholdGood at 2.5 s or less; poor above 4 s

Source: web.dev: Largest Contentful Paint

Interaction to Next Paint (real users)

spd_field_inp
Free

75th-percentile INP for phone visitors, from the Chrome UX Report.

ThresholdGood at 200 ms or less; poor above 500 ms

Source: web.dev: Interaction to Next Paint

Cumulative Layout Shift (real users)

spd_field_cls
Free

75th-percentile CLS for phone visitors, from the Chrome UX Report.

ThresholdGood at 0.1 or less; poor above 0.25

Source: web.dev: Cumulative Layout Shift

First Contentful Paint (real users)

spd_field_fcp
Free

75th-percentile FCP for phone visitors, from the Chrome UX Report.

ThresholdGood at 1.8 s or less; poor above 3 s

Source: web.dev: First Contentful Paint

Time to First Byte (real users)

spd_field_ttfb
Free

75th-percentile TTFB for phone visitors, from the Chrome UX Report.

ThresholdGood at 0.8 s or less; poor above 1.8 s

Source: web.dev: Time to First Byte

Lighthouse performance score (mobile)

spd_lab_score
Free

The Lighthouse performance category score from PageSpeed Insights, mobile strategy.

Threshold90 or more for full marks; under 50 fails

Source: Lighthouse performance scoring

LCP and its sub-parts

spd_lcp_subparts
Free

Lab LCP and its breakdown into time to first byte, load delay, load duration and render delay.

ThresholdLab LCP 2.5 s or less; over 4 s fails

Source: web.dev: Optimize LCP

LCP image is not lazy-loaded

spd_lcp_lazy
Free

Whether the image Lighthouse picked as the LCP element carries loading="lazy".

ThresholdNever lazy-load the LCP image

Source: web.dev: Lazy loading and LCP

Unused JavaScript

spd_unused_js
Free

Lighthouse unused-javascript audit: bytes downloaded but never executed during load.

ThresholdAudit score 90 or more

Source: Lighthouse: reduce unused JavaScript

Text compression

spd_compression
Free

Whether HTML, CSS and JavaScript are served with gzip or Brotli (Lighthouse).

ThresholdAudit score 90 or more

Source: Lighthouse: enable text compression

Static asset caching

spd_caching
Free

Cache lifetimes on static resources (Lighthouse cache audit).

ThresholdAudit score 90 or more

Source: Lighthouse: efficient cache policy

Main-thread work

spd_main_thread
Free

Total main-thread time (script, style, layout, paint) during a mobile load.

Threshold2 s or less for full marks; over 4 s fails

Source: Lighthouse: minimize main-thread work

Third-party impact

spd_third_party
Free

Main-thread time and bytes from third-party providers (analytics, chat, ads, embeds).

Threshold250 ms or less of third-party main-thread time; over 1 s fails

Source: Lighthouse: reduce the impact of third-party code

Mobile viewport

spd_viewport
Free

A viewport meta tag with width=device-width, so phones do not render a shrunken desktop page.

ThresholdAudit passes

Source: Lighthouse: viewport

Tap targets are big enough

spd_tap_targets
Free

Touch target size and spacing on mobile (Lighthouse target-size / tap-targets audit).

ThresholdAudit passes (24 px minimum, 48 px recommended)

Source: web.dev: Accessible tap targets

Legible font sizes

spd_font_size
Free

Share of text at a legible size on a phone (Lighthouse font-size audit, where the Lighthouse version still reports it).

ThresholdAudit passes (60% or more of text at 12 px or larger)

Source: Lighthouse: legible font sizes