Skip to Content
AI visibility

AI visibility

A daily background scan of your verified websites for AI search visibility, agent readiness and basic site health.

The AI visibility scan checks whether AI search and answer agents can find, crawl and read your website, which optional agent protocols it publishes, and a few classic site health basics. RankParse runs it in the background once a day for every eligible website and stores the results. The API reads those stored results and can queue a fresh scan.

OperationEndpointCredits
Get AI visibilityGET /v1/site-scan0
Re-check AI visibilityPOST /v1/site-scan/recheck0

Eligibility

A website is scanned only when both are true:

  • It is verified: an active, verified Google Search Console or Bing Webmaster Tools property that matches the website's host is attached to it.
  • The workspace is on a paid plan: Pro, Agency or Lifetime (including workspaces in a launch grace period that counts as one of these). The Free plan is not scanned.

An unverified website is never fetched. GET /v1/site-scan answers eligible: false with reason: "not_verified", and on the Free plan reason: "plan_required". Results stored before a workspace moved to Free are kept but not shown.

How a scan runs

  • Daily: an hourly job queues verified websites in paid workspaces whose last scan is more than 24 hours old, least recently scanned first, up to 100 websites per run. A website queued in the last 2 hours is skipped.
  • On request: Re-check AI visibility queues one website, at most once per 10 minutes. The scan usually finishes within a few minutes.
  • What is fetched: the home page at https://<host>/ first (the first 1 MB is read; a 429 is retried once after 2 seconds), then robots.txt, the sitemap (up to 3 declared in robots.txt, tried in order, else /sitemap.xml), llms.txt, the home page again with Accept: text/markdown, the well-known files of the optional checks, http://<host>/ and one DNS-over-HTTPS lookup. Everything except http://<host>/ is read on the origin the home page lands on after redirects. Each fetch has an 8 second timeout and blocks private addresses. The user agent is Mozilla/5.0 (compatible; RankParse/1.0; +https://rankparse.com).
  • Unreachable home page: when the home page cannot be fetched or answers 400 or above, the scan records an error_code (for example home_http_503 or home_timeout) and leaves the stored checks as they were.
  • Unknown never overwrites: a check that cannot tell (timeout, 5xx, a body too large to read) is unknown. An unknown result keeps the previous pass or fail and its evidence, so a timeout neither raises nor clears an issue.

Check statuses and severity

Each check is pass, fail or unknown. Its severity says how much a failure matters:

  • bad: a real problem, listed as an issue.
  • warn: worth fixing, listed as an issue.
  • info: optional. An optional protocol feature or a deliberate choice. Never an issue and never counted in a score. Most websites need no MCP server card or API catalog, and blocking AI training crawlers is often intentional.

Checks

The API lists checks in this order. area groups them; the site_health area is reported as category: "site_health", every other area as category: "ai_visibility".

AI visibility

CheckAreaSeverityPasses when
robots_txtdiscoverabilitywarn/robots.txt answers 200 with a text file (not an HTML page, not another declared type). A 4xx fails.
sitemapdiscoverabilitywarnA sitemap declared in robots.txt (up to 3 tried), or /sitemap.xml when none is declared, answers 200 with something other than an HTML page.
ai_answer_bots_blockedbot_accessbadrobots.txt does not block / for any AI search or answer agent: OAI-SearchBot, ChatGPT-User, PerplexityBot, Perplexity-User, Claude-SearchBot, Claude-User. A missing robots.txt passes. Fails when one is blocked by its own rule or by the User-agent: * rule.
ai_training_bots_blockedbot_accessinforobots.txt does not block / for any AI training crawler: GPTBot, ClaudeBot, Google-Extended, CCBot, Applebot-Extended, meta-externalagent, Bytespider.
llms_txtcontentwarn/llms.txt answers 200 with a text file.
markdown_negotiationcontentwarnThe home page requested with Accept: text/markdown answers 2xx with Content-Type: text/markdown.
structured_datacontentwarnThe home page has at least one JSON-LD block that parses. Unknown when the page was cut at 1 MB and no valid block was found.
link_headerdiscoverabilityinfoThe home page response sends a Link header with a rel (RFC 8288).
content_signalbot_accessinforobots.txt has a Content-Signal line (search, ai-input, ai-train).
web_bot_authbot_accessinfo/.well-known/http-message-signatures-directory answers 200 with JSON.
api_catalogcapabilitiesinfo/.well-known/api-catalog answers 200 with JSON (RFC 9727).
oauth_discoverycapabilitiesinfo/.well-known/oauth-authorization-server (RFC 8414) or /.well-known/oauth-protected-resource (RFC 9728) answers 200 with JSON.
mcp_server_cardcapabilitiesinfo/.well-known/mcp/server-card.json answers 200 with JSON.
agent_skillscapabilitiesinfo/.well-known/agent-skills/index.json answers 200 with JSON.
oauth_protected_resourcecapabilitiesinfo/.well-known/oauth-protected-resource is a JSON object with a non-empty resource string.
a2a_agent_cardcapabilitiesinfo/.well-known/agent-card.json, or the older /.well-known/agent.json, is a JSON object with non-empty name and url strings.
auth_mdcapabilitiesinfo/auth.md answers 200 with a non-empty text or Markdown file.
dns_aiddiscoverabilityinfoDNS has an SVCB record at _index._agents.<host> (DNS-AID, an IETF draft), looked up over DNS-over-HTTPS.

Site health

CheckAreaSeverityPasses when
https_enforcedsite_healthwarnhttp://<host>/ ends up on an https:// URL after redirects.
hstssite_healthinfoThe HTTPS home page sends Strict-Transport-Security.
home_indexablesite_healthbadThe home page has no noindex (or none) in its robots meta tag or X-Robots-Tag header.
canonical_hostsite_healthwarnThe home page has no canonical URL, or its canonical is on the same host (ignoring www.).
home_titlesite_healthwarnThe home page has a title.
home_descriptionsite_healthwarnThe home page has a meta description.

For the file checks, a 200 that is an HTML page (a single-page app answering every path) fails with reason: "html_instead_of_file", a JSON check that is not JSON fails with reason: "not_json", and a 5xx or network error is unknown. When the home page was cut at 1 MB before </head>, a missing title, description, canonical or robots meta is unknown, not fail.

This scan is separate from the live Site health endpoint, which checks any domain on demand for credits.

Scoring

Each area and the overall result get a score: passing / (passing + failing) as a whole percentage, over bad and warn checks only. unknown results and optional (info) checks are left out, so a blog without an MCP server card can score 100. A score is null when no check counted. overall is the AI visibility score: site health checks count only in the site_health area.

MCP tools: get_ai_visibility and recheck_ai_visibility (both take site_id; on the API-key MCP server).

On this page