REFERENCE · AI CRAWLER POLICY · UPDATED 2026-08-29

The complete robots.txt list for AI crawlers

Reference table of the named AI crawlers you are likely to see in access logs: who runs each one, what it is collecting, whether it honours robots.txt, and what you give up by denying it.

The crawlers

Grouped by what they actually do, because that is the decision you are making — not which company sent them.

Training data collection

These fetch pages to build training corpora. They send no visitors back. Denying them has no traffic cost.

User agentOperatorHonours robots.txtNotes
GPTBotOpenAIYes, documentedPublishes IP ranges for verification
ClaudeBotAnthropicYes, documentedPublishes IP ranges for verification
Google-ExtendedGoogleYes (as a token)Not a crawler — a permission flag for Gemini training. Googlebot does the fetching.
Applebot-ExtendedAppleYes (as a token)Same pattern as Google-Extended; Applebot does the fetching.
CCBotCommon CrawlYes, documentedOpen dataset consumed by many downstream trainers
BytespiderByteDanceInconsistently reportedWidely reported as aggressive; verify by behaviour, not user agent
meta-externalagentMetaYes, documentedTraining corpus collection
DiffbotDiffbotYes, documentedCommercial knowledge-graph extraction
OmgilibotWebz.ioYes, documentedData resale to model trainers

Search indexing and citation

These decide whether an AI assistant can surface and link to your page. Denying them removes you from AI answers — this is where referral traffic is lost.

User agentOperatorPurposeDenying it costs
OAI-SearchBotOpenAIIndex for ChatGPT searchCitations and clicks from ChatGPT
ChatGPT-UserOpenAILive fetch on user requestYour page in that specific answer
Claude-SearchBotAnthropicIndex for Claude searchCitations from Claude
Claude-UserAnthropicLive fetch on user requestYour page in that specific answer
PerplexityBotPerplexityIndex for cited answersCitations and clicks from Perplexity
Perplexity-UserPerplexityLive fetch on user requestYour page in that answer
GooglebotGoogleWeb search index; also feeds AI OverviewsYour entire Google Search presence
BingbotMicrosoftBing index; feeds CopilotBing and Copilot presence
ApplebotAppleSiri and Spotlight suggestionsApple ecosystem surfacing

The pair that catches people out: GPTBot and OAI-SearchBot are both OpenAI, but only the second one can send you visitors. Blocklists that match on "OpenAI" or use a wildcard pattern take out both.

Directives that actually work

Named groups do not inherit from the wildcard group

This is the single most common robots.txt bug. A crawler matching a named User-agent line reads only that group and ignores User-agent: * completely. The groups are not merged.

wrong.txt
# BROKEN — PerplexityBot can now crawl /admin
User-agent: *
Disallow: /admin

User-agent: PerplexityBot
Allow: /
correct.txt
# Every named group repeats its own Disallow lines
User-agent: *
Disallow: /admin

User-agent: PerplexityBot
Allow: /
Disallow: /admin

Multiple user agents can share one group

Consecutive User-agent lines with no directives between them form a single group, which keeps the file readable:

robots.txt
User-agent: GPTBot
User-agent: ClaudeBot
User-agent: CCBot
User-agent: Bytespider
User-agent: meta-externalagent
Disallow: /

Crawl-delay is not part of the standard

Google ignores Crawl-delay entirely. Some crawlers honour it, most do not. If you need to control request rate, do it at the request layer with real rate limiting — a directive that is ignored is not a control.

Verifying a crawler is who it claims to be

User agents are trivially spoofed. A request claiming to be GPTBot proves nothing. The operators that publish verification methods make this checkable:

Treat verification as the default for any allow rule. Allowing PerplexityBot by user agent alone means allowing anyone who types that string into a scraper.

Check what you are actually serving

check.sh
# The file as served (not as committed)
curl -s https://example.com/robots.txt

# Behaviour per crawler identity
for ua in "GPTBot/1.1" "OAI-SearchBot/1.0" "PerplexityBot/1.0"; do
  code=$(curl -s -o /dev/null -w "%{http_code}" -A "Mozilla/5.0 (compatible; $ua)" https://example.com/)
  echo "$ua -> $code"
done

Two deployment-level surprises worth ruling out when the served file does not match your repository: a host-level managed robots.txt feature overriding yours (Cloudflare has one under AI Crawl Control, and it is on by default for some plans), and a CDN serving a cached copy from before your last deploy.

Generating this from policy

Maintaining these groups by hand goes stale — the crawler list changes every few months, and the named-group trap resurfaces every time someone adds a rule. TJ Sentinel takes an AI posture (open, search-only, verified-only, closed) and emits the matching robots.txt with every named group complete, plus the request-layer rules that enforce it for clients which ignore the file.

Generate a policy for your site → · Read: keep search traffic while denying training →