Blog
What does the AI visibility score on a free scan measure?
· WebVitalist
WebVitalist adds an AI visibility score to a completed free scan. This note is dated October 26, 2026 and states that score as the scan implements it. No model decides a status. The checks read the fetched HTML, the response headers, the robots.txt from that fetch, and /llms.txt.
The number
There are 9 checks. Their weights sum to 18. A pass earns the full weight, a warn earns 40% of the weight, a fail earns nothing, and an informational result earns the full weight, so a missing optional signal cannot lower the score. The score is earned weight divided by 18, multiplied by 100, then rounded to the nearest integer and clamped to 0–100. Halves round upward.
The free scan stores that integer and the check results. It removes the weight from each stored check. The result card is headed “AI visibility” and shows the integer as N/100 with the same three labels as the technical score: Good at 80 or above, Needs work from 50 through 79, and Poor below 50. Under the integer it says “This is not part of the overall score.” A warn or a fail shows its fix line. A pass or an informational result does not.
The summary is “All AI visibility checks passed.” when nothing warned or failed. Otherwise it is “N critical and M lesser findings.”, with N the number of fails and M the number of warns. Informational results are not in that sentence.
The checks, and the weight each one carries, are:
- AI search crawlers (ai-search-crawlers), weight 4. robots.txt allows OAI-SearchBot, ChatGPT-User and PerplexityBot at / and the scanned path. A missing file allows access by default. Fail: any search crawler is blocked at either path. Informational: robots.txt returns 5xx or cannot be read; crawlers may treat the site as fully disallowed.
- AI training crawlers (ai-training-crawlers), weight 1. robots.txt allows GPTBot, ClaudeBot, Google-Extended and CCBot. Warn: any training crawler is blocked. This can be an intentional choice. Google-Extended does not affect Google Search inclusion or ranking; AI Overviews use Googlebot rules.
- Snippet controls (ai-snippet-controls), weight 2. The robots meta tag and applicable X-Robots-Tag values have neither nosnippet nor max-snippet:0. Warn: nosnippet or max-snippet:0 restricts quoting, including in Google AI Overviews and AI Mode. noindex remains a technical check and is not scored again here.
- Readable without JavaScript (ai-text-in-html), weight 3. The raw HTML contains at least 50 words of visible text, without running JavaScript. Fail: fewer than 50 words. An empty app root can indicate that the page renders its text in the browser; use server-side rendering or pre-rendering.
- Answer near the top (answer-first), weight 2. An H1 is followed within the next six heading, paragraph or list elements, before the next H2, by a paragraph or list item with at least 12 words. Warn: no H1, or no qualifying paragraph or list item near it. Add a short explanation of what you do, for whom and where.
- Business details (JSON-LD) (org-schema), weight 3. A local business entity has name, url, address, telephone and opening hours; a non-local organization needs name and url. The most complete matching entity is used. Fail: no JSON-LD or no supported organization type. Warn: required fields are missing. An organization logo is a tip with no penalty.
- JSON-LD syntax (json-ld-syntax), weight 1. Every JSON-LD block parses as JSON, including blocks wrapped in HTML comments. Fail: at least one block is invalid JSON. Informational when there are no blocks; the business-details check already covers missing markup.
- FAQ markup (faq-schema), weight 1. A FAQPage contains a Question with a name and acceptedAnswer.text, and at least one question name appears in the visible page text. Warn: FAQ markup has no qualifying visible question. Informational when absent, with full credit so an optional FAQ does not lower the score.
- llms.txt (llms-txt), weight 1. /llms.txt returns HTTP 200 with non-empty, non-HTML text and a Markdown # heading within its first 20 non-empty lines. Warn: missing, empty, an HTML page, or no title heading. llms.txt is a proposed standard: some AI tools read it; big search engines do not promise to.
What each check uses
AI search crawlers are OAI-SearchBot, ChatGPT-User, and PerplexityBot. AI training crawlers are GPTBot, ClaudeBot, Google-Extended, and CCBot. WebVitalist does not request the page again as those crawlers. It reads the robots.txt already fetched for the scan and applies it at / and at the path of the final URL. A missing robots.txt, including an HTTP 404, allows every listed crawler. When robots.txt times out or returns 500 or above, both crawler checks are informational, the card says “Not checked” for every crawler, and the score does not drop. A blocked search crawler fails. A blocked training crawler warns. Blocking a training crawler can be intentional. Google-Extended does not affect Google Search inclusion or ranking.
Snippet controls warn when the robots meta tag or an applicable X-Robots-Tag contains nosnippet or max-snippet:0. A directive aimed at a named agent other than googlebot is ignored. noindex stays on the technical check and is not scored again here.
Readable without JavaScript uses the word count of the fetched HTML after script, style, noscript, svg, template, and iframe elements are removed. The count uses the first 14,000 characters of that text. Fewer than 50 words fails. Answer near the top looks at h1, h2, h3, p, and li elements in order. From the first H1, it inspects the next six of those elements and stops at an H2. It passes when a paragraph or list item in that span has at least 12 words. No H1 warns.
Business details and JSON-LD syntax read JSON-LD in the HTML, including blocks wrapped in HTML comments. The business-details check uses the most complete matching entity. FAQ markup is informational when no FAQPage is present, so an optional FAQ does not lower the score. /llms.txt is requested from the origin of the final URL, with a 3 second limit, and at most 50,000 characters are read. It passes only when the response is HTTP 200, the body is non-empty and not an HTML page, and a Markdown heading appears in the first 20 non-empty lines.
What it does not change
The technical score is computed first. AI visibility is stored beside it. A failure inside the AI visibility checks leaves the completed scan in place and omits the section. The technical integer, its issues, and its counts stay as they were. The card also lists six search basics taken from the technical checks: title, meta description, H1, canonical, sitemap, and robots meta. Under that list it says “These basics are not counted again in the AI visibility score.”
The card ends with this note: “We read robots.txt and your HTML only. Firewall or CDN bot settings (for example Cloudflare's AI crawler controls) can still block AI crawlers; check them in your hosting dashboard.” A paid audit that includes the result prints “Score N/100.”, the summary, and “This is not part of the overall score.” The overall score does not have an AI visibility weight. A reused completed scan shows the AI visibility stored on that row. It is not computed again. A fetch that fails is stored without it.