AI SEO, GEO and AEO Audit - AI Search Visibility Score avatar

AI SEO, GEO and AEO Audit - AI Search Visibility Score

Pricing

from $25.00 / 1,000 page auditeds

Go to Apify Store
AI SEO, GEO and AEO Audit - AI Search Visibility Score

AI SEO, GEO and AEO Audit - AI Search Visibility Score

Audit any URL for AI search visibility. Fetches your page as GPTBot, ClaudeBot and PerplexityBot to show what each actually receives, checks robots rules, llms.txt, schema and content depth, and reports whether Google's AI answers name your brand. One weighted score, with a fix per finding.

Pricing

from $25.00 / 1,000 page auditeds

Rating

0.0

(0)

Developer

SR

SR

Maintained by Community

Actor stats

0

Bookmarked

3

Total users

3

Monthly active users

a month ago

Last modified

Security

Limited permissions

Share

Audit any URL for AI search visibility and get one weighted score, the evidence behind every finding, and the fix ordered by how much it costs you to make. This is generative engine optimization (GEO) and answer engine optimization (AEO) measured rather than guessed: the audit fetches your page the way each AI crawler fetches it, and reports what each one actually received.

Most AI SEO audits read your robots.txt and tell you which crawlers are allowed. That is a statement about a text file. This one asks the page directly, as GPTBot, OAI-SearchBot, ClaudeBot, PerplexityBot, Google-Extended and Googlebot, and compares each response against what a browser gets.

What you get

  • One weighted score, 0-100, across six dimensions: technical SEO (25), AI crawler access (20), content depth (20), brand presence in AI answers (13), schema markup (12) and referring domains (10).
  • A per-crawler result for your page: HTTP status, bytes, visible text, and a verdict of same, thinner, refused or error against the browser baseline.
  • Robots and llms.txt rules for the eight crawlers that matter, plus whether /llms.txt exists at all.
  • Whether Google's AI answers name your brand, how often, whether they link you, and which competitors get named where you do not.
  • Every finding with its fix, tagged critical, warning or notice, ordered by severity and then by how cheap the fix is.
  • Schema markup coverage: which types the page declares, which blocks failed to parse, and whether Open Graph is complete.
  • Referring domains and domain score as the external-corroboration half of E-E-A-T.
  • The denominator, always. Every row carries dimensions_measured, dimensions_skipped and weight_basis, so you can see what the score was computed over. When the basis is below 100, score_note (string or null) says in one line what was left out.

Why audit AI search visibility

Search traffic is being intercepted before it reaches you. An assistant answers the question, names two or three brands, and links one of them. If your page cannot be read by the crawler that feeds the assistant, none of your other optimization work reaches that surface, and nothing in your analytics will tell you why.

The gap that usually causes it is invisible from the outside. A site can allow every AI crawler in robots.txt and still refuse them at the edge, because the CDN or WAF rule that stops scrapers does not know the difference between a scraper and the crawler that would have quoted you. We measured it by varying only the user agent from one address: three sites, two of them contradicting their own rules file. One served a browser 1.21 MB and answered GPTBot with a 257-byte refusal, and its robots.txt was itself a 403, so any audit that only reads rules finds nothing against the crawler and calls that site open. The reverse happens too: a site that refuses the browser while waving the crawler through at 713 KB.

The other half is whether the answer names you at all. That is not a technical property of your page, it is a question about what the assistant says, so the only way to know is to ask it and read the answer.

Input

FieldTypeRequiredDefaultWhat it does
urlstringyes—The public page to audit
brandstringno—Brand to look for inside Google's AI answers
promptsarraynogeneratedThe questions to ask. Empty means three are generated from the brand
competitorsarrayno—Named rivals to count in the answers; others are detected anyway
check_ai_answersbooleannotrueAsk the questions and report brand presence
check_authoritybooleannotrueMeasure referring domains
countrystringnousTwo-letter country for the fetch and the answers
languagestringnoenTwo-letter language for the answers
timeoutintegerno20Seconds each crawler fetch may take
concurrencyintegerno4How many parts run at once

Output

One row per audited URL.

A real run: one URL, one brand question, the default us/en. This is the row a run on https://en.wikipedia.org/wiki/Web_scraping returned (build 0.1.12, 11.9 s, billed as one page audited and one AI answer read), trimmed here to the fields worth reading — every value is the one the run produced, and the agents and findings lists are complete so the quoted counts reconcile with what is shown.

{
"url": "https://en.wikipedia.org/wiki/Web_scraping",
"domain": "en.wikipedia.org",
"brand": "Wikipedia",
"score": 97,
"grade": "excellent",
"dimension_scores": {
"ai_access": 90,
"authority": 100,
"brand": 100,
"content": 100,
"schema": 98,
"technical": 98
},
"dimension_weights": {
"ai_access": 20,
"authority": 10,
"brand": 13,
"content": 20,
"schema": 12,
"technical": 25
},
"dimensions_measured": [
"ai_access",
"authority",
"brand",
"content",
"schema",
"technical"
],
"dimensions_skipped": [],
"weight_basis": 100,
"scored": true,
"issues_critical": 0,
"issues_warning": 1,
"issues_notice": 3,
"ai_crawler_matrix": {
"baseline_ok": true,
"baseline_text_bytes": 31052,
"agents": [
{
"agent": "Chrome",
"status": 200,
"bytes": 235971,
"text_bytes": 31052,
"title_present": true,
"error": null,
"verdict": "same",
"serves_this_user_agent": true
},
{
"agent": "GPTBot",
"status": 200,
"bytes": 235971,
"text_bytes": 31052,
"title_present": true,
"error": null,
"verdict": "same",
"serves_this_user_agent": true
},
{
"agent": "OAI-SearchBot",
"status": 200,
"bytes": 235971,
"text_bytes": 31052,
"title_present": true,
"error": null,
"verdict": "same",
"serves_this_user_agent": true
},
{
"agent": "ClaudeBot",
"status": 403,
"bytes": 82,
"text_bytes": 82,
"title_present": false,
"error": null,
"verdict": "refused",
"serves_this_user_agent": false
},
{
"agent": "PerplexityBot",
"status": 200,
"bytes": 235971,
"text_bytes": 31052,
"title_present": true,
"error": null,
"verdict": "same",
"serves_this_user_agent": true
},
{
"agent": "Googlebot",
"status": 403,
"bytes": 105,
"text_bytes": 105,
"title_present": false,
"error": null,
"verdict": "refused",
"serves_this_user_agent": false
},
{
"agent": "Google-Extended",
"status": 200,
"bytes": 235971,
"text_bytes": 31052,
"title_present": true,
"error": null,
"verdict": "same",
"serves_this_user_agent": true
}
],
"ai_agents_served": [
"GPTBot",
"OAI-SearchBot",
"PerplexityBot",
"Google-Extended"
],
"ai_agents_not_served": [
"ClaudeBot"
],
"ai_agents_served_thinner": [],
"verification_unknown": true
},
"findings": [
{
"severity": "warning",
"code": "ai_crawler_not_served",
"message": "A browser is served this page but ClaudeBot received an error or an empty shell.",
"evidence": {
"agents": [
"ClaudeBot"
],
"verification_unknown": true
},
"fix": "Confirm with your CDN or WAF whether these crawlers are refused. If you verify crawlers by address this may be working as intended."
},
{
"severity": "notice",
"code": "description_missing",
"message": "The page has no meta description.",
"fix": "Write one: assistants often quote it as the summary.",
"effort": "content"
},
{
"severity": "notice",
"code": "llms_txt_missing",
"message": "There is no /llms.txt describing this site to assistants.",
"fix": "Add one summarising what the site is and which pages matter.",
"effort": "content"
},
{
"severity": "notice",
"code": "open_graph_incomplete",
"message": "Open Graph tags are missing or incomplete.",
"fix": "Add og:title, og:description and og:image.",
"effort": "content"
}
],
"prompts_requested": 1,
"ai_answers_read": 1,
"country": "us",
"language": "en",
"duration_seconds": 11.9
}

Read the matrix first: four AI agents got exactly what the browser got (ai_agents_served), ClaudeBot got an 82-byte refusal, and verification_unknown is set because that is the pattern a reverse-DNS check also produces. The score is 97 over all six dimensions, so weight_basis is 100 and nothing was skipped — when a dimension cannot be measured it leaves the denominator instead of scoring zero, and score_note (string or null) explains that in one line (null here, because the basis was complete).

Use cases

An SEO lead losing traffic to AI answers. You can see impressions falling and no technical fault in Search Console. This tells you whether the assistants can read the page at all, and if they can, whether they name you when asked your category's questions. Those are two different problems with two different fixes, and conflating them wastes a quarter.

An agency running a GEO audit for a client. You need a defensible number and a list a developer can act on, not a screenshot of a dashboard. Every finding carries the measurement that produced it and a fix tagged by effort, so the configuration changes separate cleanly from the content work. Run it across a client's key templates and the pattern shows up immediately.

A developer who owns the CDN rules. Bot-blocking rules are usually written once, broadly, and never revisited. This tells you precisely which declared crawlers your edge refuses, so you can decide deliberately rather than discovering it a year later. It also tells you when the result is ambiguous, which matters if you run crawler verification.

A founder checking whether the company exists to an assistant. Ask the three questions your buyers ask. The audit reports whether the brand is named, whether it is linked, and which competitors are named instead, with their mention counts. That is a clearer read on positioning than a rank tracker gives.

How it compares

This actorTypical GEO audit tool
Crawler accessFetches the page as each crawler and reports what arrivedReads robots.txt and reports the rules
AmbiguityFlags verification_unknown when a refusal could be crawler verificationReports a block
Missing dataLeaves the dimension out of the denominatorScores it zero
Brand in AI answersAsks the questions and reads the answersUsually a separate product
OutputStructured rows with evidence and fixesA score and a PDF

The honest gaps: this does not render JavaScript, so a page whose content only appears after a script runs is reported as thin, which is exactly what a crawler without a renderer sees but is not what a user sees. It also audits one URL per run rather than crawling a whole site.

Pricing

$0.025 per page audited, plus $0.02 per AI answer read. A run that audits one page and checks three AI answers is $0.086, including the $0.001 to start the run. That is the whole price: no per-crawler charge, no separate fee for the sources behind each dimension.

You are only charged for what came back. A question the AI did not answer is free, and switching check_ai_answers off leaves a page-only audit at $0.026, crawler matrix included.

Limits and gotchas

  • One URL per run. Audit your key templates rather than a whole site.
  • Public pages only. A login-walled page cannot be read by a crawler and cannot be audited here.
  • No JavaScript rendering. Content injected by a script is reported as absent, because that is what a crawler without a renderer receives.
  • Crawler results are measured from a datacentre address. A site that verifies crawlers by reverse DNS will refuse an unverified caller and still serve the real bot. When that pattern appears the row sets verification_unknown and says so rather than calling it a block.
  • The brand check needs a brand name. Without one it is skipped, and the score is computed over the remaining dimensions rather than marking the page down.
  • A skipped dimension is not a zero. If a part of the audit cannot run, weight_basis drops below 100 and dimensions_skipped names it.
  • AI answers vary by country and language. Set both to the market you sell in; the defaults are us and en.

FAQ

Can I check if ChatGPT can read my website? Yes. The audit requests your page as GPTBot and OAI-SearchBot and reports the status, the bytes and the visible text each received, compared against a browser.

What is the difference between GEO, AEO and SEO? SEO optimises for a ranked list of links. GEO and AEO optimise for being named and cited inside a generated answer. They overlap heavily on the technical side, which is why this audit scores both together rather than pretending they are separate disciplines.

Does robots.txt control whether AI crawlers can read my site? It is the part you control by writing a rule, but it is not the only gate. Your CDN or WAF can refuse a crawler regardless of what the rules file says, and that is the case this audit exists to catch.

Do I need an llms.txt file? It is an emerging convention rather than a requirement, and its absence is reported as a notice, not a fault. The audit checks whether one exists and is readable.

Why does my score say it was computed over 87 points? Because one dimension could not be measured and was left out of the denominator instead of being scored zero. dimensions_skipped names it. Scoring a missing measurement as zero would mark your page down for something that was never tested.