Foundation

AI can't read what it can't reach

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.

By the Sourceworks team

Published January 2026

8 min read

Verification Stack — illustration of interlocking schema layers and entity verification for AI search foundations

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.

Why this stage exists at all

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:

Training crawlers

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.

Real-time fetch crawlers

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.

The playbook

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

Build the bot reference list

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

Google

Controls AI training use (separate from Googlebot)

Googlebot

Google

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

Audit your current access state

This is the diagnostic step. Three sub-audits, all run before anything is changed.

robots.txt audit

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.

curl tests with each user agent

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.

Server log review

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

Rewrite the robots.txt

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

Fix the CDN and bot protection layer

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:

Security → Bots → “AI Scrapers and Crawlers”

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.

Bot Fight Mode

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.

Custom firewall rules and rate limits

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

Deploy llms.txt

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

What to measure

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.

AI bot crawl rate

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.

robots.txt and CDN audit pass rate

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.

llms.txt presence and validation

Y/N at root. If Y, passes validator, and reflects current product/service/contact information.

Time-to-detect on access regressions

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.

Coverage of AI bots in scope

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.

Common failure modes

Five patterns, almost all of them invisible to marketing teams until someone runs the audit.

Cloudflare's One-Click Block

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.

Treating robots.txt as enforcement

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.

The legacy robots.txt nobody touches

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.

Letting the bots in and giving them nothing to read

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.

Access Layer drift

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.

Before you publish more, measure what AI already believes.

Request a Diagnostic →