Foundation
Why The Access Layer — the AI crawlers reaching your site, the bots you didn't know you were blocking — is the precondition for every other piece of AEO work.

GPTBot tried to fetch your site this morning. So did ClaudeBot, PerplexityBot, and a dozen others. Whether they succeeded is the entire ballgame for AEO — and most enterprise teams have no idea what the answer is.
This is The Access Layer — the technical plumbing that determines whether AI crawlers can reach your site, and whether the content they fetch is parseable once they do. It's the most invisible part of the methodology, and the easiest to break by accident. A Cloudflare rule a developer enabled in 2022 to block scrapers. A robots.txt directive that hasn't been touched since the last SEO audit. A “Block AI Bots” toggle someone clicked once and forgot about. Each of these silently returns 403s to the AI crawlers that matter, and most teams have no way of knowing it's happening.
The fix usually takes an afternoon. The cost of not fixing it — of doing every other piece of AEO work upstream of an Access Layer that's quietly broken — is invisibility you've paid good money to create.
The Access Layer is the precondition for every other piece of AEO work. The Brief tells you which prompts to target. The Verification Stack tells AI who you are. Neither matters if the AI crawlers that build training data and real-time answer indexes can't actually fetch your content. Stage 1 and Stage 2 are upstream of citation. Stage 4 is the gate.
There are now at least fifteen AI-specific crawlers reaching enterprise sites, and the list keeps growing. They split into two categories that behave differently:
GPTBot (OpenAI), CCBot (Common Crawl, which many LLMs train on), Google-Extended, Applebot-Extended, Bytespider, Meta-ExternalAgent. These pull content into the training data the foundation models learn from. Block these and you're invisible inside the model itself, regardless of how the answer engine fetches data at query time.
ChatGPT-User, Claude-Web, Perplexity-User, OAI-SearchBot. These fire when a user asks the AI assistant something and the assistant decides to go fetch a live page. Block these and you're invisible in the answer even when you'd otherwise be the obvious citation.
You need both. Most teams know they need to allow Googlebot. Fewer realise they also need to think about Google-Extended, which is what controls AI training use, separate from the search crawler. Almost none have audited whether all fifteen are getting through.
There's also a two-layer technical reality worth naming now, because it's the source of most of the failure modes downstream. robots.txt is advisory — it's a polite request, and well-behaved bots respect it but it can't enforce anything. The CDN layer (Cloudflare, Fastly, Akamai, AWS WAF, plus standalone bot-protection services like DataDome and PerimeterX) is enforced — it can actually block at the network level. When the two contradict, the CDN wins. Which is why a perfectly-written robots.txt can sit next to a Cloudflare toggle that's quietly blocking every AI crawler in scope, and the marketing team has no idea.
Five moves. Total time for a serious audit and fix is 15–25 hours over two to three weeks — most of that is verification rather than implementation, because the work itself is fast and the validation is what protects the engagement.
Move 01
Before auditing anything, build the list of crawlers in scope. This is the reference document every other move runs against. The list as of mid-2026:
Bot
Operated by
What it does
GPTBot
OpenAI
Training data for ChatGPT
ChatGPT-User
OpenAI
Real-time fetch when a ChatGPT user references a URL
OAI-SearchBot
OpenAI
Indexes for ChatGPT Search
ClaudeBot
Anthropic
Training data for Claude
Claude-Web
Anthropic
Real-time fetch when Claude browses
PerplexityBot
Perplexity
Crawls for Perplexity's index
Perplexity-User
Perplexity
Real-time fetch for Perplexity answers
Google-Extended
Controls AI training use (separate from Googlebot)
Googlebot
Still relevant — feeds AI Overviews and AI Mode
Bingbot
Microsoft
Feeds Copilot and ChatGPT (uses Bing index)
Applebot-Extended
Apple
Controls AI training use
Bytespider
ByteDance
Crawls for ByteDance AI products
Amazonbot
Amazon
Crawls for Alexa and AI products
CCBot
Common Crawl
Open dataset many LLMs train on
Meta-ExternalAgent
Meta
Crawls for Meta AI
DuckAssistBot
DuckDuckGo
For DuckAssist AI answers
Sixteen bots. The list shifts every few months — new bots launch, old ones get renamed, user-agent strings change. Treat this as a living document. Quarterly review minimum.
Move 02
This is the diagnostic step. Three sub-audits, all run before anything is changed.
Pull [domain]/robots.txt and screenshot it. Read it line by line. Look for: a blanket User-agent: * / Disallow: / (catastrophic, blocks everything), specific bot disallows that shouldn't exist, crawl-delay directives over 5 (most AI bots interpret aggressive crawl-delay as deprioritisation), a missing or stale sitemap reference.
For each bot in the reference list, run a curl request impersonating that user agent and confirm the site returns a 200. A 403, a 429, or a Cloudflare challenge page means that crawler is being blocked at the network level — and robots.txt won't tell you that. This is where most “silently blocked” diagnoses get made.
Pull at least 30 days of server logs and grep for each AI bot user agent. Two questions: which bots have actually been visiting (presence in logs = they were getting through at the time of the visit), and which ones haven't shown up at all (absence in logs = either they aren't crawling yet, or they tried and got blocked). Logs are the ground truth.
If server log access isn't available, Cloudflare and most CDN dashboards provide bot analytics that can substitute. Worth confirming access during scoping rather than mid-engagement.
Screenshot everything. The before/after gap is what justifies the engagement, and a lot of the impact shows up weeks after deployment, when AI responses start improving and the screenshots are what tie cause to effect.
Move 03
Build a clean, explicit robots.txt that addresses each AI crawler by name. Don't rely on the wildcard default — be specific. Specific directives override general ones, but ambiguity causes problems and crawler operators occasionally shift their default behaviour.
The template for “allow all AI crawlers” (the most common case):
# Standard crawlers User-agent: * Allow: / Disallow: /admin/ Disallow: /checkout/ Disallow: /*?session= # AI crawlers — explicitly allowed User-agent: GPTBot Allow: / User-agent: ChatGPT-User Allow: / User-agent: OAI-SearchBot Allow: / User-agent: ClaudeBot Allow: / User-agent: Claude-Web Allow: / User-agent: PerplexityBot Allow: / User-agent: Perplexity-User Allow: / User-agent: Google-Extended Allow: / User-agent: Applebot-Extended Allow: / User-agent: CCBot Allow: / User-agent: Bytespider Allow: / User-agent: Meta-ExternalAgent Allow: / Sitemap: https://www.your-domain.com/sitemap.xml
For selective blocking — publishers, for example, sometimes have legitimate reasons to block training crawlers while allowing real-time fetch crawlers — swap Allow: / for Disallow: / on the specific bots being blocked. The strategic decision should be deliberate, in writing, signed off by the client.
“We are allowing GPTBot for training because we want to be cited in ChatGPT responses, and we accept the implication of being included in training data” is a written position. “We never thought about it” is not.
After deployment, re-run the curl tests from Move 2 to confirm each bot now returns 200.
Move 04
This is where the real fix usually lives. robots.txt is advisory. The CDN is enforcement. If the CDN is blocking, nothing in robots.txt matters.
For Cloudflare specifically — which is where the majority of these blocks happen — three things to check:
Cloudflare added a one-click “Block AI Bots” toggle in 2024. It's enabled by default on some plans. It blocks GPTBot, ClaudeBot, PerplexityBot, and most of the training crawlers in scope. If it's on and there's no explicit reason to want it on, turn it off. This single toggle is the most common single point-of-failure on enterprise sites.
A broader heuristic-based bot filter. Often too aggressive — AI crawlers get flagged as suspicious and challenged or blocked. Either disable it or add explicit allowlist rules for the AI bot user agents.
Sites that have been around a while accumulate custom rules — “block all requests from this ASN,” “rate-limit anything matching this pattern.” Audit each one and check whether it's catching AI bots as collateral damage.
For other CDNs — Fastly's Edge Security, Akamai's Bot Manager, AWS CloudFront with WAF managed rules — the equivalent settings exist under different names. For standalone bot-protection services (DataDome, PerimeterX, HUMAN), explicit allowlisting of AI bot user agents is usually required; coordinate with the security team.
After changes, retest. The same curl commands from Move 2 should now return 200s across the full reference list, and server logs over the following 48–72 hours should show new crawl activity from previously-absent bots.
Move 05
llms.txt is the proposed standard (originated by Jeremy Howard at Answer.AI in late 2024) for telling AI systems what a site is about — separate from robots.txt, which only controls whether they can crawl. Adoption is still emerging — GPTBot, ClaudeBot, PerplexityBot, Google-Extended, and CCBot all read it; many other bots don't yet — but it's a low-effort future-proofing play.
Deploy a /llms.txt file at site root with the standard format: an H1 with the company name, a blockquote with a one-sentence description, a short paragraph of context, then organised sections listing products and services, key resources, about pages, and contact information. Each link is markdown-formatted with a short description.
For larger sites with substantial documentation, optionally deploy /llms-full.txt — a longer version that includes condensed markdown of the most important pages. Skip it if maintenance bandwidth is limited.
Validate via llms-txt-validator.com or equivalent. Confirm the file is accessible at the root URL.
Don't oversell this move to internal stakeholders. llms.txt adoption is genuinely in flux. Frame it as future-proofing — when adoption increases (which is likely), the brand is already positioned. Don't frame it as “this will move citation rates next month.”
Five Access Layer signals. Report monthly — access either works or it doesn't, so there's less noise here than in the citation-rate metrics from The Brief.
From server logs: which bots in the reference list have visited in the past 30 days, and at what frequency. Target: every bot in scope should appear at least once per month. Bots not appearing = either they're not crawling you yet (Common Crawl, in particular, can be sporadic), or you're being blocked and haven't realised.
Quarterly run of the Move 2 audit. Pass = explicit allow for every bot in scope, no CDN-level blocks, no aggressive crawl-delay, sitemap reference accurate. Fail = anything else.
Y/N at root. If Y, passes validator, and reflects current product/service/contact information.
When something breaks — CDN update, dev change, new bot launches and isn't configured — how long does it take to notice? Track via the quarterly audit cadence; target is under 90 days.
Percentage of the current reference list that's explicitly allowed in robots.txt and verified accessible via curl. Should be 100%. If it drops, something has changed.
Five patterns, almost all of them invisible to marketing teams until someone runs the audit.
Someone — usually a developer, sometimes a security consultant, occasionally an automated default on a new Cloudflare plan — clicked the “Block AI Bots” toggle in the Cloudflare Bots dashboard. It blocks GPTBot, ClaudeBot, PerplexityBot, and most of the training crawlers in scope. robots.txt says nothing about it; the marketing team has no visibility into it; the audit catches it. The fix is one click. The fact that the block was there for two years is the bit that hurts.
The conceptual error that produces most of the others. Marketing teams assume robots.txt controls bot access. It doesn't — it advises bots to behave a certain way. Well-behaved bots respect it. The CDN, which actually enforces, is a completely separate layer most marketing teams never see. Until you've audited both, you don't actually know whether the bots are getting through.
A User-agent: * block with Disallow: / from 2018, originally meant to block a specific scraper, has been silently blocking every bot — including AI crawlers that didn't exist when it was written — for years. Nobody on the current team remembers why it was added. Nobody has the authority or context to remove it. So it stays. And the brand stays invisible to AI.
The site is a JavaScript-rendered single-page app. AI crawlers arrive, fetch the page, find an empty HTML shell, and leave. Allowing access without addressing rendering is half the work. The fix is server-side rendering, static site generation, or prerendering for the pages that matter most — pricing, product, about, the core content. Without it, the bots are getting through and seeing nothing.
Six months after the audit, a developer enables a new Cloudflare security feature. Or a CDN provider changes a default. Or two new AI bots launch and don't get added to robots.txt. The Access Layer was clean at the time of the audit; it isn't anymore. This is why quarterly re-audits aren't optional. The Layer doesn't stay fixed on its own.
The Access Layer is Move 3 in the Foundation sequence — and the gate that determines whether Moves 1 and 2 produce anything useful.
Open The Access Layer. The rest of the work compounds from there.