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

2

Total users

1

Monthly active users

3 days ago

Last modified

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.

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 four sites while building this: one served a browser 1.21 MB and returned a 257-byte refusal to GPTBot, ClaudeBot and PerplexityBot while letting Google's AI crawler through. Its robots.txt was itself unreadable, so any audit that only reads rules would call that site open.

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.

{
"url": "https://example.com/pricing",
"domain": "example.com",
"score": 72,
"grade": "needs work",
"dimension_scores": { "technical": 92, "ai_access": 50, "content": 84, "schema": 75, "brand": 46, "authority": 70 },
"dimension_weights": { "technical": 25, "ai_access": 20, "content": 20, "schema": 12, "brand": 13, "authority": 10 },
"dimensions_measured": ["ai_access", "authority", "brand", "content", "schema", "technical"],
"dimensions_skipped": [],
"weight_basis": 100,
"scored": true,
"issues_critical": 1,
"issues_warning": 3,
"issues_notice": 2,
"ai_crawler_matrix": {
"baseline_ok": true,
"baseline_text_bytes": 36405,
"ai_agents_served": ["Google-Extended"],
"ai_agents_not_served": ["GPTBot", "OAI-SearchBot", "ClaudeBot", "PerplexityBot"],
"ai_agents_served_thinner": [],
"verification_unknown": true
},
"findings": [
{
"severity": "critical",
"code": "ai_crawler_not_served",
"message": "A browser is served this page but GPTBot, OAI-SearchBot, ClaudeBot, PerplexityBot received an error or an empty shell.",
"fix": "Confirm with your CDN or WAF whether these crawlers are refused.",
"effort": "config"
}
],
"prompts_requested": 2,
"ai_answers_read": 3,
"duration_seconds": 41.2
}

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.