Insight · 13 min
robots.txt for AI crawlers
AI crawlers come in three kinds: training crawlers that collect pages for future models, search crawlers that index pages so an assistant can cite them, and user-triggered fetchers that load a page because a person asked. Each operator gives each kind its own robots.txt token, so blocking GPTBot does not block OAI-SearchBot or ChatGPT-User. Decide per kind, write one group per token, and check the result in your server logs.
In short
- Training, search, and user-triggered bots are separate tokens. A rule for one does not reach the others.
- Blocking a search token (OAI-SearchBot, Claude-SearchBot, PerplexityBot) removes you from that assistant’s cited answers. Blocking a training token does not.
- Google-Extended and Applebot-Extended are control tokens, not crawlers. Google-Extended does not control AI Overviews. Googlebot does.
- Several user-triggered fetchers say they may ignore robots.txt. robots.txt is a request under RFC 9309, not access control.
- CDN settings can block bots before robots.txt is read. Check them, because they can override the policy you wrote.
What are the three kinds of AI crawler?
The three kinds are training crawlers, search crawlers, and user-triggered fetchers, and they do different things with your page.
- Training crawlers collect pages that may be used to train future models. GPTBot, ClaudeBot, and MistralAI-Training are examples. Blocking them affects what future models learn. It does not affect whether today’s assistant can cite you.
- Search crawlers build the index an assistant searches before it answers. OAI-SearchBot, Claude-SearchBot, and PerplexityBot are examples. Blocking them is the closest thing to opting out of AI citations on that platform.
- User-triggered fetchers load one URL because a user pasted it, asked about it, or sent an agent to it. ChatGPT-User, Claude-User, and Perplexity-User are examples. They are not crawlers in the usual sense, and several operators say robots.txt may not apply to them.
The tokens are independent by design. OpenAI states that each setting is independent, and that a site can allow OAI-SearchBot while disallowing GPTBot. The same split exists at Anthropic, Perplexity, Meta, Amazon, and Mistral. A single Disallow aimed at “AI” does not exist. You write a rule per token or you write User-agent: * and block everyone, including Googlebot.
Which AI bots exist, and which ones honor robots.txt?
The table below lists the tokens each operator documents as of November 2026, with the operator’s own statement on robots.txt. “Honors” means the operator says so in its documentation. It is not an independent audit.
| Token | Operator | Kind | What the operator says it does | robots.txt, per the operator | Doc |
|---|---|---|---|---|---|
| GPTBot | OpenAI | Training | Crawls content that may be used to train generative AI foundation models | Honors. Disallowing it signals content should not be used for training | OpenAI |
| OAI-SearchBot | OpenAI | Search | Surfaces websites in ChatGPT search features | Honors. Opted-out sites are not shown in ChatGPT search answers but can still appear as navigational links. About 24 hours to take effect | OpenAI |
| ChatGPT-User | OpenAI | User-triggered | User actions in ChatGPT and Custom GPTs, including GPT Actions | “robots.txt rules may not apply.” Not used to decide search inclusion | OpenAI |
| OAI-AdsBot | OpenAI | Other | Visits only pages submitted as ads on ChatGPT, to check them. Not used for training | Not stated | OpenAI |
| ClaudeBot | Anthropic | Training | Collects content that may be used to train Anthropic’s models | Honors, including the non-standard Crawl-delay | Anthropic |
| Claude-SearchBot | Anthropic | Search | Indexes the web to improve search result quality for Claude users | Honors | Anthropic |
| Claude-User | Anthropic | User-triggered | Fetches pages when a Claude user asks | Honors. Anthropic states its bots honor robots.txt and that blocking Claude-User prevents retrieval for user queries | Anthropic |
| PerplexityBot | Perplexity | Search | Surfaces and links websites in Perplexity search results. Not used to crawl for foundation models | Managed through robots.txt. Up to 24 hours to take effect | Perplexity |
| Perplexity-User | Perplexity | User-triggered | Supports user actions in Perplexity. Not used for crawling or training | “generally ignores robots.txt rules” | Perplexity |
| Googlebot | Search | Crawls for Google Search, including AI Overviews and AI Mode | Honors. Google calls Googlebot rules “the control” for AI features in Search | ||
| Google-Extended | Control token | Governs whether crawled content is used to train future Gemini models and for grounding in Gemini Apps and Vertex AI | Token only. No separate user agent. No effect on Search inclusion or ranking | ||
| Google-Agent | User-triggered | Agents on Google infrastructure that browse and act on a user’s request | User-triggered fetchers “generally ignore robots.txt rules” | ||
| Google-GeminiNotebook | User-triggered | Fetches URLs users add as notebook sources. Replaces Google-NotebookLM | Generally ignores robots.txt | ||
| Applebot | Apple | Search, also training | Powers Spotlight, Siri, and Safari search. Its data “may also be used to help train Apple foundation models” | Honors. Ignores Crawl-delay. Falls back to Googlebot rules if none name Applebot | Apple |
| Applebot-Extended | Apple | Control token | Decides whether Applebot’s data trains Apple’s generative models | Token only. “Applebot-Extended does not crawl webpages.” Not used in Search ranking | Apple |
| CCBot | Common Crawl | Open web archive | Builds the public Common Crawl dataset | Opt out with a CCBot Disallow: / group. Warns that other crawlers impersonate CCBot | Common Crawl |
| Meta-ExternalAgent | Meta | Training, also indexing | Crawls to train foundation AI models or to improve products by indexing content | Meta documents robots.txt rules to block it | Meta |
| Meta-WebIndexer | Meta | Search | Improves Meta AI search results. Allowing it helps Meta “cite and link to your content” | Meta documents robots.txt management | Meta |
| Meta-ExternalFetcher | Meta | User-triggered | Fetches links at a user’s request for agentic AI features | “may bypass robots.txt rules” | Meta |
| Amazonbot | Amazon | Mixed | Improves Amazon products and services. “may be used to train Amazon AI models” | Honors. Reads a noarchive robots meta tag as “do not use the page for model training.” No Crawl-delay | Amazon |
| Amzn-SearchBot | Amazon | Search | Search experiences in Amazon products, including Alexa. Not used for training | Honors. Follows rules for other search bots if none name it | Amazon |
| Amzn-User | Amazon | User-triggered | Live fetches to answer customer questions. Not used for training | “may not follow all robots.txt directives” | Amazon |
| DuckAssistBot | DuckDuckGo | Search | Fetches pages in real time for DuckDuckGo’s AI-assisted answers. “not used in any way to train AI models” | Honors. 72 hours to take effect. No effect on organic rankings | DuckDuckGo |
| MistralAI-Training | Mistral | Training | Builds datasets to train Mistral models | Can be disallowed in robots.txt | Mistral |
| MistralAI-Index | Mistral | Search | Indexes pages for Mistral search. Not used for training | Not described | Mistral |
| MistralAI-User | Mistral | User-triggered | Fetches a page when a user asks Mistral’s assistant, and links the source | The token “governs which sites these user requests can be made to” | Mistral |
Three notes on the table.
Google-Extended does not cover AI Overviews or AI Mode. Google states that AI features are part of Search, that Googlebot rules are the control, and that nosnippet, data-nosnippet, max-snippet, and noindex limit what Search shows. Google-Extended limits training and grounding in Gemini Apps and Vertex AI. To stay out of AI Overviews, you limit snippets or indexing in Search, and that costs you in classic results too.
Applebot is a mixed crawler. Apple says Applebot data may help train its foundation models, and that disallowing Applebot-Extended is the opt-out. Blocking Applebot itself removes you from Spotlight, Siri, and Safari search.
Operator statements are claims. In August 2025, Cloudflare reported that Perplexity, when its declared crawler was blocked, fetched pages with an undeclared user agent impersonating Chrome on macOS, from IPs outside its published ranges. Cloudflare removed Perplexity from its verified bot list. If a bot’s behavior matters to you, enforce it at the network edge, not only in robots.txt.
Does robots.txt actually stop a crawler?
No. robots.txt is a request a crawler chooses to honor. RFC 9309, the Robots Exclusion Protocol standard published in September 2022, says its rules “are not a form of access authorization” and are “not a substitute for valid content security measures.”
The RFC also sets behavior worth knowing:
- User-agent matching is case-insensitive. A product token may contain only letters, underscores, and hyphens, so
User-agent: GPT*is not a valid way to match several bots. - When several rules match a path, the most specific one (the longest) wins.
- Crawlers should not use a cached robots.txt for more than 24 hours, unless it is unreachable.
- A 4xx response for robots.txt means the crawler may fetch anything. A 5xx response means it must assume everything is disallowed.
That last pair matters. A robots.txt that returns 404 allows everything. A robots.txt that returns 500 during an outage blocks everything, for every compliant bot, until it recovers.
Anything that must stay private needs authentication. A paywall, a login, or an IP allowlist is access control. A Disallow line is a note on the door.
What do CDN AI-crawler settings do?
CDN settings block or allow bots at the network edge, before the request reaches your server and whether or not the bot reads robots.txt. Cloudflare is the most common case.
As of November 2026, Cloudflare’s “AI Crawler and Agent access policies” sort bots into three categories, Search, Training, and Agent, each with its own action. Cloudflare’s developer documentation, last updated November 2, 2026, lists Allow as the default for new domains. Cloudflare’s September 15, 2026 announcement says new domains onboarding from that date are offered presets: ad-supported sites get Training set to “Disallow AI Training” and Agent set to block on pages with ads, while other sites get Allow. Existing settings carried over.
Two details change outcomes:
- “Block” and “Block on pages with ads” now apply to mixed-use crawlers, including Googlebot, Applebot, and Bingbot. Choosing Block for Training can therefore block Googlebot from Search.
- “Disallow AI Training” publishes a robots.txt directive instead of blocking at the edge. Mixed-use crawlers keep crawling for search under that setting.
Cloudflare announced one set of new defaults in July 2026 and shipped a different set in September. Open the dashboard and read the current values. A robots.txt that allows OAI-SearchBot does nothing if the edge returns 403 to it.
What should my robots.txt say?
Your robots.txt should say what you decided for each kind of crawler. Three common policies follow. Each one costs something.
Policy 1: allow all
# Allow every crawler, including AI training, search, and user fetchers.
User-agent: *
Allow: /
Sitemap: https://www.example.com/sitemap.xml
Cost: none in visibility. Your public pages can enter training sets for future models from OpenAI, Anthropic, Google, Apple, Meta, Amazon, Mistral, and Common Crawl.
Policy 2: allow search and user fetches, block training
# Training crawlers and control tokens: opt out.
User-agent: GPTBot
User-agent: ClaudeBot
User-agent: Google-Extended
User-agent: Applebot-Extended
User-agent: CCBot
User-agent: Meta-ExternalAgent
User-agent: MistralAI-Training
Disallow: /
# Everyone else, including OAI-SearchBot, Claude-SearchBot,
# PerplexityBot, Googlebot, Applebot, and user-triggered fetchers.
User-agent: *
Allow: /
Sitemap: https://www.example.com/sitemap.xml
Cost: small, and real. Search and citation stay open. Future models learn less about you from your own pages, so their unprompted knowledge of your brand depends more on third parties. Blocking Google-Extended also opts you out of grounding in Gemini Apps and Vertex AI, which is retrieval, not only training. Meta-ExternalAgent is documented as both training and indexing, so blocking it may also reduce Meta AI coverage. Amazonbot is mixed too: leave it allowed and add a noarchive robots meta tag if you want Amazon to skip training on a page.
Policy 3: block all AI
# Training
User-agent: GPTBot
User-agent: ClaudeBot
User-agent: Google-Extended
User-agent: Applebot-Extended
User-agent: CCBot
User-agent: Meta-ExternalAgent
User-agent: MistralAI-Training
# AI search
User-agent: OAI-SearchBot
User-agent: Claude-SearchBot
User-agent: PerplexityBot
User-agent: Meta-WebIndexer
User-agent: Amzn-SearchBot
User-agent: DuckAssistBot
User-agent: MistralAI-Index
# User-triggered
User-agent: ChatGPT-User
User-agent: Claude-User
User-agent: Perplexity-User
User-agent: Meta-ExternalFetcher
User-agent: Amzn-User
User-agent: MistralAI-User
Disallow: /
User-agent: *
Allow: /
Sitemap: https://www.example.com/sitemap.xml
Cost: large. You disappear from cited answers in ChatGPT search, Claude, Perplexity, Meta AI, Alexa, DuckDuckGo, and Mistral. Assistants will still describe you, from training data and from other sites, and you will have no say in which. The policy does not remove you from Google AI Overviews, because Googlebot is still allowed. Several user-triggered fetchers say they may ignore these rules. If blocking is a hard requirement, back it with edge rules.
Policy 2 is a reasonable default for most companies that sell something. Policy 3 is a business decision, usually a publisher’s, and it belongs in writing with an owner. See what gets cited for why fetchable pages matter to generative engine optimization.
How do I check what the bots actually do?
Server logs show which bots arrived, what they requested, and what status they got. robots.txt shows only what you asked for.
- Count requests by token. On a combined-format access log:
grep -oE "GPTBot|OAI-SearchBot|ChatGPT-User|ClaudeBot|Claude-SearchBot|Claude-User|PerplexityBot|Perplexity-User|Google-Agent|Applebot|CCBot|meta-externalagent|meta-webindexer|meta-externalfetcher|Amazonbot|Amzn-SearchBot|Amzn-User|DuckAssistBot|MistralAI-[A-Za-z]+" access.log \
| sort | uniq -c | sort -rn
- Check status codes per token. A search bot you allowed should get 200s, not 403s from a CDN or WAF:
grep "OAI-SearchBot" access.log | awk '{print $9}' | sort | uniq -c
- Confirm robots.txt fetches. Each compliant bot requests
/robots.txt. OpenAI says it may add arobots.txtmarker to its user-agent string on those requests. - Verify the IP, not the string. User-agent strings are easy to fake, and Common Crawl and Google both warn about impersonation. The next section shows how.
- Allow for lag. OpenAI and Perplexity cite about 24 hours for a robots.txt change to take effect. DuckDuckGo cites 72 hours. RFC 9309 caps the cache at 24 hours for compliant crawlers.
How do I verify that a request really came from the bot it names?
Check the source IP against the operator’s own record. Google documents a DNS check. OpenAI, Anthropic, and Perplexity publish IP lists instead. None of the three documents reverse DNS as a verification method, so for them the list is the test.
| Operator | Documented method | Where |
|---|---|---|
Reverse DNS on the IP, then a forward lookup on the hostname. The hostname must end in googlebot.com, google.com, or googleusercontent.com, and the forward lookup must return the original IP. Google also publishes IP ranges as JSON | Verifying Google crawlers: common-crawlers.json (Googlebot), special-crawlers.json, user-triggered-fetchers.json, user-triggered-fetchers-google.json, user-triggered-agents.json | |
| OpenAI | Published IP list per bot | openai.com/gptbot.json, openai.com/searchbot.json, openai.com/chatgpt-user.json, openai.com/adsbot.json |
| Anthropic | Published IP list. Anthropic says a source IP on the list “indicates that the crawler is coming from Anthropic” | claude.com/crawling/bots.json |
| Perplexity | User-agent match plus IP match. Perplexity recommends combining both | perplexity.ai/perplexitybot.json, perplexity.ai/perplexity-user.json |
The JSON files share one shape: a creationTime and a prefixes array of ipv4Prefix or ipv6Prefix entries in CIDR notation. They change. Fetch them on a schedule rather than copying them once.
For Google, the manual check is two commands:
host 66.249.66.1
# 1.66.249.66.in-addr.arpa domain name pointer crawl-66-249-66-1.googlebot.com.
host crawl-66-249-66-1.googlebot.com
# crawl-66-249-66-1.googlebot.com has address 66.249.66.1
For the published lists, pull the IPs that claim a token, then test each one against the operator’s prefixes. This example checks OAI-SearchBot; swap the token and the file for the others.
grep "OAI-SearchBot" access.log | awk '{print $1}' | sort -u > claimed.txt
curl -s https://openai.com/searchbot.json > ranges.json
python3 - <<'PY'
import ipaddress, json
nets = [ipaddress.ip_network(p.get("ipv4Prefix") or p.get("ipv6Prefix"))
for p in json.load(open("ranges.json"))["prefixes"]]
for ip in open("claimed.txt").read().split():
a = ipaddress.ip_address(ip)
print(ip, "verified" if any(a in n for n in nets) else "NOT IN PUBLISHED RANGES")
PY
The first field of a combined-format log is the client IP. Behind a CDN or load balancer it is the proxy’s address, so log the forwarded client IP (for example, CF-Connecting-IP on Cloudflare) or the check verifies your CDN.
What to look for once the IPs are sorted:
- Spoofed traffic. Requests carrying a bot’s name from addresses outside its list are not that bot. Treat them as ordinary scrapers. Do not count them in any report about AI crawling.
- Verified bots that were refused. A verified OAI-SearchBot, Claude-SearchBot, or PerplexityBot getting 403 or 429 means an edge rule or rate limit is overriding your robots.txt.
- Verified bots that ignored a
Disallow. If a verified search or training crawler fetches a disallowed path more than a day after the change, record it with timestamps. That is the evidence an operator or a CDN can act on. - Which pages user-triggered fetchers load. ChatGPT-User, Claude-User, and Perplexity-User requests follow user questions. The URLs they fetch most are the ones being pulled into answers.
A 200 shows the bot got a response, not that it read your content. Most AI crawlers do not run JavaScript, so a client-rendered page reaches them as an empty shell. What AI crawlers see on a JavaScript site covers the test.
You will never see Google-Extended or Applebot-Extended in logs. They have no user agent. Their effect is on use, not on crawling. For tracking whether the policy changed your citations, see how to measure AI visibility.
What are the common robots.txt mistakes with AI bots?
Most damage comes from defaults nobody chose and from rules that do not mean what they look like.
- A staging file shipped to production.
User-agent: *withDisallow: /blocks every compliant crawler, Googlebot included. Check robots.txt after every deploy and every migration. - A template or plugin default. Themes, CMS plugins, and security tools sometimes add AI-bot blocks. Read the live file at
https://yourdomain/robots.txt, not the one in the repository. - Assuming the
*group still applies. Google’s spec says a bot follows only its most specific group, and that specific groups are not combined with*. If you addUser-agent: GPTBotwithDisallow: /private/, GPTBot ignores every rule in your*group. - Wildcards in the user-agent line. Product tokens are letters, underscores, and hyphens.
User-agent: *bot*matches nothing useful. Wildcards (*,$) work only in paths, and paths are case-sensitive. - Using robots.txt to remove a page. Google states that for
noindexto work, the page “must not be blocked by a robots.txt file.” Block the crawl and the crawler never sees thenoindex, so the URL can still appear. Usenoindexto remove, robots.txt to stop crawling, never both on the same URL. - Blocking Googlebot to avoid AI Overviews. It removes you from Google Search. Use snippet controls if you must limit AI Overviews, and accept the cost to classic results.
- One robots.txt for many hosts. The file applies per host, protocol, and port.
blog.example.comanddocs.example.comeach need their own. Anthropic repeats this for its bots. - A 5xx on robots.txt. Under RFC 9309, a server error means full disallow. An unstable robots.txt endpoint is an intermittent block.
- Blocking by IP to opt out. Anthropic notes this can fail, because the bot cannot read robots.txt to learn your preference.
A robots.txt policy is one input. An llms.txt file can point allowed bots at the pages you want quoted, but it does not override a Disallow.
Sources
- Overview of OpenAI crawlers — OpenAI, accessed 2026-11-07
- Does Anthropic crawl data from the web, and how can site owners block the crawler? — Anthropic, accessed 2026-11-07
- Perplexity crawlers — Perplexity, accessed 2026-11-08
- Verifying Googlebot and other Google crawlers — Google, accessed 2026-11-08
- Google’s common crawlers — Google, accessed 2026-11-07
- Google’s user-triggered fetchers — Google, accessed 2026-11-07
- AI features and your website — Google Search Central, accessed 2026-11-07
- How Google interprets the robots.txt specification — Google, accessed 2026-11-07
- Block Search indexing with noindex — Google Search Central, accessed 2026-11-07
- About Applebot — Apple, accessed 2026-11-07
- CCBot — Common Crawl, accessed 2026-11-07
- Meta web crawlers — Meta, accessed 2026-11-07
- Amazonbot and Amazon user agents — Amazon, accessed 2026-11-07
- DuckAssistBot — DuckDuckGo, accessed 2026-11-07
- Mistral AI crawlers — Mistral AI, accessed 2026-11-07
- RFC 9309: Robots Exclusion Protocol — IETF, accessed 2026-11-07
- AI Crawler and Agent access policies — Cloudflare, accessed 2026-11-07
- Your site, your rules: new AI traffic options for all customers — Cloudflare, accessed 2026-11-07
- Have it both ways: stay discoverable in search while disallowing AI training — Cloudflare, accessed 2026-11-07
- Perplexity is using stealth, undeclared crawlers to evade website no-crawl directives — Cloudflare, accessed 2026-11-07