Skip to content
Pharos
Method

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.

Weight in the score
  • AI access30%
  • Files for agents & AI10%
  • Structured data & SEO20%
  • Machine readability30%
  • Off-site visibility10%
  • AI signals & rightsDoesn't affect the score
Points per verdict
  • Good100
  • Needs improvement60
  • Poor20
  • InfoDoesn't affect the score
Grade bands
  • 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 score

If 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 score

The 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 score

The 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 score

What 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 score

Signals 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 score

Usage 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.

Analyses
15 per hour·60 per day

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.

AI summaries
5 per hour·20 per day

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.

Who knocks on your site when you run an analysis

Query Pharos from an agent (MCP)

MCP

Pharos 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.

Endpoint
https://pharos.verso.solutions/mcp
From Claude Code
claude mcp add --transport http pharos https://pharos.verso.solutions/mcp
MCP client config
{
  "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

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.