How Pharos works
What we check, how we assign verdicts and the score, and with what limits. In the open, check by check.
The score
The 0-100 score is a weighted average of the categories. Each check is worth a number of points by verdict; informational checks don't count.
- AI access30%
- Files for agents & AI10%
- Structured data & SEO20%
- Machine readability30%
- Off-site visibility10%
- AI signals & rightsDoesn't affect the score
- Good100
- Needs improvement60
- Poor20
- InfoDoesn't affect the score
- Excellent≥ 90
- Good≥ 70
- Fair≥ 50
- Poor< 50
The “AI signals & rights” category is informational and doesn't count: these are machine-readable declarations, not protections anyone guarantees today.
Categories and checks
AI access
30% weight in the scoreIf AI crawlers can't read the page, nothing else matters. Here we measure whether they actually reach you and what they can do with it.
AI crawler openness (robots.txt)
- What it checks
- We read robots.txt and see which AI crawlers (search, training, user fetches) are allowed.
- Why it matters
- Blocking a bot costs differently: blocking GPTBot (training) doesn't remove you from ChatGPT search, which uses OAI-SearchBot; blocking Google-Extended doesn't remove you from AI Overviews, which ride Googlebot. The purpose says what it really costs.
- How to read the verdict
- Good if you allow almost every crawler assessed, Needs work above 30% blocked, Critical if most are blocked. Perplexity-User declares it ignores robots.txt, so it stays out of the count.
- How to fix
- Some AI crawlers are blocked by robots.txt. To be cited by AIs, allow at least the major ones (GPTBot, ClaudeBot, PerplexityBot, Google-Extended).
- Sources
- OpenAI docs, Google, Perplexity
Can AI crawlers actually reach you? (live fetch)
- What it checks
- We fetch imitating the user-agents of the main AI crawlers and observe whether the origin answers.
- Why it matters
- robots.txt says what's allowed, not what actually happens: a WAF or CDN can block upstream. We check real reachability, not just the written rule.
- How to read the verdict
- We imitate only the user-agent, not the IP: if a bot-verification system refuses the imitation it's “Can't verify” (shielded), not “Blocked”, and it doesn't count. HTTP 402 is pay-per-crawl, a pricing policy, not a block.
- How to fix
- Some probes imitating AI crawlers were refused. If you run a WAF/CDN with bot verification this may just be anti-spoofing (the real crawler, verified by IP, gets through); otherwise review your user-agent rules.
- Sources
- Cloudflare Web Bot Auth, Vendor crawler docs
Snippet & preview directives
- What it checks
- We read the robots meta tags (googlebot/bingbot variants included) and the X-Robots-Tag header.
- Why it matters
- nosnippet and max-snippet decide whether and how much the page can appear in Google's snippets and AI experiences; for Bing, noarchive excludes you from Copilot and nocache limits it.
- How to read the verdict
- Good if no directive limits previews; Needs work with nosnippet, noarchive or a low max-snippet. data-nosnippet on specific parts is normal and isn't penalized.
- How to fix
- Drop noarchive, nosnippet or a too-low max-snippet from the robots meta tags or the X-Robots-Tag header if you want to appear in snippets and AI answers: for Bing, noarchive excludes you from Copilot; for Google, max-snippet:0 equals nosnippet. To exclude specific parts only, use data-nosnippet.
- Sources
- Official Google policies, Bing
Conditional requests (ETag / Last-Modified)
- What it checks
- We issue a single conditional re-fetch (If-None-Match or If-Modified-Since) and look at the answer.
- Why it matters
- Answering 304 lets crawlers revalidate without re-downloading the whole page: with AI crawler traffic growing, that's bandwidth saved on both sides.
- How to read the verdict
- Good with validators present and a 304 answer; Needs work if validators exist but are ignored (200 with the full page) or missing entirely; Info if the answer can't be assessed.
- How to fix
- Enable ETag or Last-Modified and verify the origin answers 304 to conditional requests: many CDNs forward the validators while the origin ignores them. Google recommends ETag; with AI crawler traffic growing, the savings are real.
- Sources
- Google crawler docs
Cloaking & hidden instructions
- What it checks
- We compare the title each probe receives with the page's own and look for prompt-injection phrases present in the HTML but absent from the visible text.
- Why it matters
- Serving different content by user-agent (AI-targeted cloaking) or hiding instructions for the models is treated as abuse by Bing's guidelines (since February 2026) and leads to penalties.
- How to read the verdict
- Good if we find no user-agent differences and no hidden instructions. An article about prompt injection that shows it in the visible text is not flagged.
- How to fix
- Remove any hidden instructions aimed at AIs and content differences targeting crawler user-agents: Bing's guidelines treat both as abuse, with penalties.
- Sources
- Bing guidelines (Feb 2026)
robots.txt health
- What it checks
- We count groups, rules and declared sitemaps in robots.txt.
- Why it matters
- A healthy robots.txt orients crawlers and declares where to find the sitemap.
- How to read the verdict
- Critical if robots.txt is missing; Needs work if present but declaring no Sitemap; Good if it declares at least one sitemap.
- How to fix
- Publish a robots.txt and point to the sitemap (Sitemap: ...): it guides crawlers to the right pages.
Files for agents & AI
10% weight in the scoreThe files that orient crawlers and agents: the basics (robots, sitemap) and the emerging signals aimed at AI agents.
Core crawler files
- What it checks
- We check for a sitemap (at /sitemap.xml or a path declared in robots.txt) and observe llms.txt.
- Why it matters
- Sitemap and robots.txt are the base that orients crawlers and AIs toward the right pages.
- How to read the verdict
- Good with a reachable sitemap. llms.txt doesn't count: in 2026 it's read almost only by coding agents (Ahrefs); publishing it is a care signal, not a factor.
- How to fix
- These are the two core files that orient crawlers and AIs. A sitemap at a different path counts too, if declared in robots.txt. llms.txt is optional: an emerging standard, read almost only by coding agents today, it doesn't affect the score.
- Sources
- Ahrefs 2026
Sitemap lastmod integrity
- What it checks
- We sample up to 1000 sitemap URLs (the first child if it's an index) and look at the lastmod values.
- Why it matters
- Google and Bing use lastmod to schedule recrawls: identical or future dates teach engines to distrust the signal.
- How to read the verdict
- Good if lastmod is present and consistent; Needs work with future, all-identical or near-absent dates; Info if there's no sampleable sitemap.
- How to fix
- Generate lastmod from the content's real modification date, not the build date: if the CMS doesn't know it, omitting it beats lying. Avoid future and all-identical dates. If you publish often, consider IndexNow (Bing) too: it reports changes immediately, even though it can't be verified from outside.
- Sources
- Google docs, Bing
AI agent discovery signals (emerging)
- What it checks
- We look for skill.md, .well-known/agent-skills, the MCP files (.well-known/mcp.json, server-card, webmcp) and the link rel=mcp tag.
- Why it matters
- Emerging standards a site uses to declare real capabilities to AI agents. An opportunity, not a requirement.
- How to read the verdict
- Good if at least one real signal is present, otherwise Info (opportunity, not a failure). The rule holds: only publish files that reflect real capabilities.
- How to fix
- If the site offers real capabilities to agents (skills, tools, an MCP server), describe them in skill.md and .well-known/agent-skills/index.json, or announce the server via .well-known/mcp.json and the link rel=mcp tag. Emerging standards: only publish files that reflect real capabilities, absence is not a failure.
- Sources
- MCP specification, agent-skills
Structured data & SEO
20% weight in the scoreThe fundamentals that help engines and AIs understand what the page is about and show it well.
SEO fundamentals (title & meta)
- What it checks
- We read the title tag and the meta description and measure their length.
- Why it matters
- They're the first signal to engines and AIs about what the page covers.
- How to read the verdict
- Good with title and meta description present and within limits (about 65 and 170 chars: SEO tools' truncation estimates, not an official rule). A short title is fine, a long description isn't penalized, just truncated in display.
- How to fix
- Make sure each page has a clear title (within about 65 chars, short is fine) and a meta description (roughly 50-160): they're the first signal for engines and AIs.
- Sources
- Moz, Ahrefs, Yoast
Structured data (Schema.org / JSON-LD)
- What it checks
- We count JSON-LD blocks and the declared Schema.org types.
- Why it matters
- They help engines understand entities (Bing feeds them to its LLMs), but don't buy citations: a causal Ahrefs 2026 study across 1,885 pages shows no lift. Concrete attributes (prices, dates, ratings) consistent with the visible text matter more.
- How to read the verdict
- Good with structured data present, Needs work if absent. Boilerplate markup alone isn't enough.
- How to fix
- Mark up organization, products/services and FAQ with Schema.org JSON-LD, favoring concrete attributes (prices, dates, ratings) consistent with the visible text. It aids understanding, but don't expect AI citations from markup alone: the evidence doesn't support that.
- Sources
- Causal Ahrefs 2026 study, Bing
Indexing & sharing meta
- What it checks
- We check canonical, Open Graph and sitemap; hreflang and Twitter Card are shown as neutral.
- Why it matters
- canonical avoids duplicates, Open Graph handles social previews, the sitemap aids indexing.
- How to read the verdict
- Good with the three core signals (canonical, Open Graph, sitemap). hreflang only matters if the site is multilingual and never penalizes.
- How to fix
- Add canonical, Open Graph meta and a reachable sitemap: they improve indexing and previews. hreflang only matters if the site is multilingual.
Machine readability
30% weight in the scoreWhat an AI crawler sees reading the served HTML, without running JavaScript and on tight budgets.
Content in the HTML (server-side)
- What it checks
- We measure how many words of content are already in the served HTML, without running JavaScript.
- Why it matters
- GPTBot, ClaudeBot and PerplexityBot run zero JS: if text arrives only via JavaScript, the page is empty to them.
- How to read the verdict
- Good from 200 words up, Needs work from 50 to 199, Critical below 50 (typical of the “application shell”: an empty framework root).
- How to fix
- The page looks JavaScript-rendered: many AI crawlers don't run JS. Serve the main text already in the HTML (server-side rendering or pre-rendering).
- Sources
- Vendor crawler docs
Served HTML weight
- What it checks
- We measure the bytes of the HTML document only, not the resources.
- Why it matters
- AI fetchers download markup without running JS and on limited budgets (Vercel/MERJ, 500M+ requests): huge documents read worse.
- How to read the verdict
- Good under 512 KB, Needs work above, Critical from 1.5 MB.
- How to fix
- Move unnecessary inline data (state JSON, huge CSS and SVG) out of the document and keep the content in the markup: AI fetchers run on tight budgets and read heavy documents worse.
- Sources
- Vercel/MERJ measurement
HTML semantics (landmarks)
- What it checks
- We check for structural tags (main or article plus landmarks like header, nav, footer, aside).
- Why it matters
- We count presence, not a percentage: “tag density” or “text-to-code ratio” isn't a real factor. What matters is that structure exists.
- How to read the verdict
- Good with a backbone (main or article) and at least 3 distinct landmarks.
- How to fix
- Wrap the page sections in structural HTML5 tags (header, nav, main, article, section, aside, footer): they help AIs see where each block of content starts and ends.
Heading structure
- What it checks
- We count the headings (H1..H6) and observe how many are phrased as questions.
- Why it matters
- A single H1 and a clear hierarchy help chunk content into AI-readable blocks.
- How to read the verdict
- Good with exactly one H1 and at least 3 headings, Needs work with a weak structure, Critical with no headings.
- How to fix
- Use a single H1 and a clear H2/H3 hierarchy: it helps 'chunk' content into AI-readable blocks.
Image alt text
- What it checks
- We measure the share of images with an alt attribute.
- Why it matters
- Images without alt aren't readable by AIs and screen readers.
- How to read the verdict
- Good if all (or none) have alt, Needs work from 60% up, Critical below. Empty alt is correct for decorative images.
- How to fix
- Images without alt aren't readable by AIs and screen readers. Add a descriptive alt (or empty alt if decorative).
Content freshnessDoesn't affect the score
- What it checks
- We line up the three machine-readable freshness sources: page JSON-LD/meta dates, the HTTP Last-Modified header, and the sitemap lastmod.
- Why it matters
- AIs cite fresher content more readily (Ahrefs study across 17M citations), but evergreen content without dates stays legitimate.
- How to read the verdict
- Info: doesn't affect the score. It shows how many of the 3 sources are exposed to machines.
- Sources
- Ahrefs study (17M citations)
Internal linkingDoesn't affect the score
- What it checks
- We count the page's internal and external links.
- Why it matters
- Internal links spread context and help crawlers and readers move through the site.
- How to read the verdict
- Info: we report the numbers, it doesn't affect the score.
Off-site visibility
10% weight in the scoreSignals we observe off the page: guidance, not something you control directly.
CCBot access (Common Crawl)
- What it checks
- We check whether robots.txt allows CCBot, Common Crawl's crawler.
- Why it matters
- Common Crawl feeds many datasets AIs use: if CCBot is blocked, you stay out of that source.
- How to read the verdict
- Good if CCBot is allowed, Critical if blocked.
- How to fix
- Common Crawl feeds many datasets AIs use. If CCBot is blocked, consider allowing it to enter that source.
- Sources
- Common Crawl
Presence in Common Crawl
- What it checks
- We query Common Crawl's public CDX index for captures of the domain in the most recent snapshots.
- Why it matters
- Staying out of Common Crawl's datasets for long reduces presence in the sources many AIs use. It's an observed signal, not controllable: there's no submission form, inclusion depends on CCBot alone.
- How to read the verdict
- Good if found, Needs work if absent in the snapshots queried, Info if the index couldn't be queried. Replicable at index.commoncrawl.org.
- How to fix
- You can't submit a site to Common Crawl: inclusion depends on their crawler (CCBot). What you control: allow CCBot in robots.txt and in your WAF/CDN, keep the site reachable and get linked from other sites (the crawl follows links). Then it's a matter of time: check again on the next crawls at index.commoncrawl.org.
- Sources
- Common Crawl (CDX index)
AI signals & rights
Doesn't affect the scoreUsage preferences and rights reservations declared in a machine-readable way. These are declarations, not protections: no AI vendor commits to honoring them today, which is why the category doesn't affect the score.
Declared usage preferences (Content-Signal / AIPREF)Doesn't affect the score
- What it checks
- We read the AI usage preferences in robots.txt (Cloudflare's Content-Signal, the IETF's Content-Usage/AIPREF) and flag any inconsistency with the actual rules.
- Why it matters
- They express how content may be used (search, AI input, training). Emerging standards: a chance to declare your preferences.
- How to read the verdict
- Info: doesn't count. These are declared preferences, not technical protections.
- Sources
- Content-Signal (Cloudflare), IETF AIPREF
Machine-readable rights reservation (TDM / RSL)Doesn't affect the score
- What it checks
- We look for TDMRep (.well-known/tdmrep.json or header/meta), RSL (License in robots.txt) and the noai meta.
- Why it matters
- TDMRep is the machine-readable TDM opt-out referenced in the AI Act / copyright directive debate: the part no US-centric tool reports. These are rights declarations, not protections.
- How to read the verdict
- Info: doesn't count. The noai meta is an unstandardized convention.
- Sources
- TDMRep (W3C/EDRLab), RSL, AI Act / copyright directive
Legacy AI filesDoesn't affect the score
- What it checks
- We flag the legacy ChatGPT plugin manifest (.well-known/ai-plugin.json), if present.
- Why it matters
- It's a retired format (April 2024): no longer needed.
- How to read the verdict
- Info: if it's there, you can remove it.
Usage limits
Two separate caps, because the two costs are separate. One protects the sites we analyze, the other is the only one that costs us per use. The counter at the top shows the analyses you have left, and its tooltip the AI summaries too.
One per scan, always. Each analysis is about twenty requests to the site under test: the cap is there so we don't weigh it down. A forced run (“Force a new analysis”) spends one too.
One only when we actually ask Verso AI (which runs on Anthropic's Claude) to write “Key Insights” and “Quick Wins”. We ask when the report has enough to fix: at least four weighted points of issues, across at least two areas. A site already in order is covered by the summary generated from the data and spends nothing, so you get to analyze more.
- If you run out of AI summaries, analyses keep working: the report stays complete and we write the summary from the data, without AI. A limit of ours never takes the report away from you.
- If the summary never arrives (the call fails and we fall back to the data), we don't count it: you pay for a delivered report, not for the attempt.
- During the analysis the “Verso AI summary” step lights up only when it is really happening, and the top of the report always states whether the summary was written with AI or from the data.
- Analyses launched via MCP never ask for the AI summary. If someone later re-runs that same address from the web and has a summary to spend, we rewrite the summary alone: the measurements stay as they were, and your site gets not one extra request.
Query Pharos from an agent (MCP)
MCPPharos is also an MCP server (Model Context Protocol, Streamable HTTP transport): an AI agent can run the analysis, not just you. It exposes a single tool, audit_url, which takes the URL to audit (plus an optional it/en locale) and returns the report in Markdown with the share link. It reuses the same engine, limits and cache as the web tool.
https://pharos.verso.solutions/mcpclaude mcp add --transport http pharos https://pharos.verso.solutions/mcp{
"mcpServers": {
"pharos": {
"type": "http",
"url": "https://pharos.verso.solutions/mcp"
}
}
}Public, key-less endpoint, with the same usage caps as the web tool (a per-IP limit, shared across both surfaces).
Frequently asked questions
Does Pharos run JavaScript?
No. It reads the served HTML, like an AI crawler that doesn't run JS (GPTBot, ClaudeBot, PerplexityBot). If content arrives only via JavaScript, Pharos sees it empty: and it's useful to know those crawlers see it that way too.
Is the score an SEO grade?
No. Pharos measures on-page readability signals for AIs and engines, not rankings. A site can rank well with incomplete signals, and vice versa.
Why does it flag my meta description as too long?
The check follows the most common recommendation (around 150-160 characters), but it is a recommendation, not a rule. Google has said there is no fixed length and that those numbers are “made up” (John Mueller): they come from estimates of how much text fits in the snippet, spread by Moz, Ahrefs, Yoast, not the engines. A longer description is not “wrong”: at most it gets truncated in display, with no penalty.
Why don't some checks affect the score?
The “Info” checks (freshness, internal links, AI signals & rights) describe something that doesn't depend only on you, or a declaration rather than a protection: we show them as guidance, we don't count them as a grade.
Do you analyze one page or the whole site?
The single public page at the address you enter. Some checks (robots.txt, sitemap, Common Crawl) are site-wide, the rest is that page.
I improved my site but the new analysis shows the same result?
To avoid hammering sites, for a few minutes Pharos may return the last analysis from cache (it tells you at the top of the report, with date and time). If you just changed something, use “Force a new analysis”: it ignores the cache and runs a fresh one. Since version 1.2 the report also opens with “What you changed” versus the previous analysis.
Can I download the report?
Yes, in Markdown (.md): the “Download MD” button is at the top of the report, next to “copy link” and “share”. No PDF for now: it would just be the browser print of the page and the result does not convince us, the .md is cleaner and more reusable.
Is there a limit on the number of analyses?
Yes, and there are two distinct caps. Analyses have an hourly and daily cap per person, because each scan is about twenty requests to the site under test. AI summaries have a separate, much lower cap, and they only go down when we actually ask Verso AI to write the summary, that is when your site has enough to fix: if it is already in order you spend none and keep analyzing. If you run out of AI summaries the report stays complete, we write the summary from the data. The exact numbers are in the “Usage limits” section, and the counter at the top shows the analyses you have left.
How does it relate to PageSpeed?
Same spirit: an honest, repeatable report. PageSpeed looks at performance and experience, Pharos looks at whether AIs can read and cite you.
Do Common Crawl and off-site signals affect the score?
No. Common Crawl presence and link-graph centrality are signals we observe, not ones you control directly: we show them as guidance, not a grade. Allowing CCBot in robots.txt is different, that is a concrete choice of yours and it counts.
Can I use Pharos from an AI agent?
Yes. Beyond the web tool, Pharos is an MCP server (Model Context Protocol): an agent can run the analysis with the audit_url tool and get the report back. The endpoint (pharos.verso.solutions/mcp) and setup are in the MCP section of this documentation.