/ โ† llms.txt Fixes / robots.txt AI Blocks
In this guide
  1. Why the auditor treats this as a conflict
  2. The user agents worth testing
  3. Rules that catch llms.txt by accident
  4. Where the offending rule is really coming from
  5. Testing every llms.txt URL against every agent
  6. The fix, step by step
  7. A worked example
  8. Keeping robots.txt and llms.txt in agreement
  9. Questions and answers

Why the auditor treats this as a conflict

robots.txt and llms.txt do different jobs. robots.txt, defined in RFC 9309, is the file crawlers that follow the Robots Exclusion Protocol read before fetching anything; it can refuse them paths. llms.txt, a proposal published by Jeremy Howard in 2024, grants and refuses nothing; it only recommends. When the two disagree, robots.txt wins for every crawler that respects it. A page listed in llms.txt but disallowed for a crawler is simply never fetched by that crawler, however well you described it.

So the auditor checks three things together:

  1. Can AI crawlers fetch /llms.txt and /llms-full.txt at all? A rule that blocks the file makes it invisible to any crawler that obeys robots.txt.
  2. Can they fetch the pages the file links to? A file whose best links sit in a disallowed folder recommends pages the reader is told not to open.
  3. Is the refusal what you meant? A deliberate choice to keep training crawlers out is a legitimate policy, not a fault. An accidental block of search and user-requested fetchers usually is a fault.

Be clear about what fixing this achieves. As far as we know, no major AI provider has confirmed that its crawlers or answer products read llms.txt. The value of removing the contradiction is that the crawlers you have chosen to welcome can reach the pages you consider most important, whether or not they ever look at llms.txt. If you have decided to refuse AI crawlers altogether, the consistent fix is the opposite one: keep robots.txt as it is and question whether you need an llms.txt at all.

The user agents worth testing

Test only names that providers publish in their own documentation. Block lists copied from forums are full of names that are retired, misspelt or never existed, and testing against those tells you nothing. The AI crawler access guide lists what each provider says its crawlers are for; for this check, group them by the role they would play for a reader of llms.txt.

RolePublished names to testWhy it matters for llms.txt
Fetches a page because a person askedChatGPT-User, Claude-User, Perplexity-UserClosest to the "point a tool at my site" use llms.txt was designed for. OpenAI and Perplexity say robots.txt may not apply to these fetches; Anthropic says its bots honour it.
Builds an AI search indexOAI-SearchBot, Claude-SearchBot, PerplexityBotDecide whether your pages can appear, and be linked, in those products' answers.
Collects training dataGPTBot, ClaudeBot, CCBot, Meta-ExternalAgentBlocking these is a common, deliberate choice and does not by itself stop search or user fetches.
Controls use of already crawled contentGoogle-Extended, Applebot-ExtendedTokens, not separate crawlers. Rules for them change what Google and Apple may use for their models, not whether pages are fetched.

Providers add and rename crawlers, so check their documentation when you make changes. Old names such as anthropic-ai and Claude-Web are no longer in Anthropic's documentation; rules for them neither help nor harm, but they do not cover the current bots.

โš ๏ธ Do not add Googlebot or bingbot to an AI block list to keep out of AI answers. Google's AI features are part of Google Search, and Microsoft's Copilot draws on Bing, so blocking either crawler removes you from ordinary search as well.

Rules that catch llms.txt by accident

Almost nobody writes Disallow: /llms.txt on purpose. The file gets caught by broader rules. These are the patterns that turn up most often when the auditor reports a conflict.

RuleWhat it blocksWhere it comes from
Disallow: /*.txt$Every text file at any depth, including /llms.txt and /llms-full.txtOld advice to hide log or readme files
Disallow: / with a short list of Allow: foldersEverything not explicitly allowed, including root files"Allow list" robots.txt written for a single-folder site
User-agent: GPTBot โ€ฆ Disallow: / with ChatGPT-User or OAI-SearchBot stacked in the same groupSearch and user fetches as well as trainingA copied AI block list that mixed purposes
Disallow: /docs/ or Disallow: /help/ for all agentsThe documentation your llms.txt mostly links toRules meant for a retired docs system or a staging path
Disallow: /*?Any URL with a query stringFaceted navigation clean-up; a problem only if llms.txt links contain parameters
A robots.txt returning 5xxPotentially the whole siteServer errors or a faulty dynamic robots.txt route

The last row surprises people. RFC 9309 says that if robots.txt cannot be fetched because of a server error, a crawler should assume it may crawl nothing, whereas a 404 for robots.txt means it may crawl everything. A robots.txt that intermittently returns 500 can therefore block every crawler that follows the standard, AI or otherwise, without a single disallow rule in sight. Check the status code, not just the content.

The narrowest fix for a wildcard rule that catches llms.txt is an explicit allow. Within a group, the most specific matching rule wins, so a longer Allow path overrides a shorter Disallow pattern:

User-agent: *
Disallow: /*.txt$
Allow: /llms.txt
Allow: /llms-full.txt

Better still, ask why the .txt rule exists. robots.txt is public, so a rule that names files you want hidden advertises them; files that must stay private need removing from the web root or protecting with a login, not a disallow line.

Where the offending rule is really coming from

The robots.txt you see in your editor is not always the one crawlers receive. Before changing anything, find out what produces the live file.

curl -s -D - https://www.example.co.uk/robots.txt -o robots-live.txt
curl -s -D - https://docs.example.co.uk/robots.txt -o robots-docs.txt

The -D - option prints the response headers, so you can see the status code and any CDN headers alongside saving the body. Compare the saved files with what your CMS shows; any difference points to a layer in between.

Testing every llms.txt URL against every agent

Checking by eye works for a short file and a simple robots.txt, but wildcards and group selection make it easy to misread. This script fetches llms.txt, collects every linked URL plus the two llms files themselves, loads the robots.txt for each host and reports which agents are refused which URLs. It uses protego, a robots.txt parser that supports the * and $ wildcards. Python's built-in urllib.robotparser does not handle those wildcards, so it can give wrong answers for modern files.

# pip install requests protego
import re, requests
from urllib.parse import urlsplit
from protego import Protego

SITE = "https://www.example.co.uk"
AGENTS = ["OAI-SearchBot", "ChatGPT-User", "GPTBot",
          "Claude-SearchBot", "Claude-User", "ClaudeBot",
          "PerplexityBot", "Perplexity-User", "CCBot"]

index = requests.get(SITE + "/llms.txt", timeout=20).text
urls = [SITE + "/llms.txt", SITE + "/llms-full.txt"]
urls += re.findall(r"\]\((https?://[^)\s]+)\)", index)

parsers = {}
for url in dict.fromkeys(urls):
    host = "{0.scheme}://{0.netloc}".format(urlsplit(url))
    if host not in parsers:
        r = requests.get(host + "/robots.txt", timeout=20)
        print(host, "robots.txt status", r.status_code)
        parsers[host] = Protego.parse(r.text if r.status_code == 200 else "")
    refused = [a for a in AGENTS if not parsers[host].can_fetch(url, a)]
    if refused:
        print("BLOCKED", url, "->", ", ".join(refused))

Read the status line for each host first. The script treats any non-200 robots.txt as empty, which matches a 404 but is too generous for a 5xx: if a host reports a server error, fix that before trusting anything else in the output. Google-Extended and Applebot-Extended are left out because they control use of content rather than fetching; review their groups by eye.

๐Ÿ’ก Run the same script before and after each robots.txt change and keep both outputs. The difference is an exact record of which agents gained or lost access to which recommended pages.

The fix, step by step

Step 1

List the paths llms.txt asks crawlers to read

Start from the llms.txt Auditor result, then build the full list yourself: /llms.txt, /llms-full.txt if you publish it, and every URL linked from the file, including the Optional section. Note each distinct host name in that list, because a link to a subdomain or a separate shop is governed by that host's own robots.txt, not the one on your main site. Remove duplicates so each URL is tested once.

Step 2

Fetch the robots.txt that governs each host

Request /robots.txt on every host in your list with curl -s -D - and save the result. Check the status code as well as the rules: a 5xx response can mean crawlers that follow RFC 9309 treat the whole host as off limits. Compare the live file with what your CMS, SEO plugin or repository contains, so you know whether a CDN or platform layer is adding rules you cannot see in your own editor.

Step 3

Test every path against each AI user agent

Run the protego script, or an equivalent tester that supports wildcards, with the published names you care about: the user-requested fetchers, the AI search crawlers and the training crawlers. Record which agents are refused which URLs. Pay particular attention to refusals of /llms.txt itself and to whole folders of linked pages being refused, since those are usually the result of one broad rule rather than many separate ones.

Step 4

Decide which refusals are deliberate

Go through the refusals with whoever owns the site's policy on AI use. Blocking training crawlers such as GPTBot or ClaudeBot may be exactly what the business wants and can stay. Refusals of search crawlers or user-requested fetchers are more often accidental. Write the decision down per agent, for example allow search and user fetches, refuse training, so the robots.txt can be checked against an agreed policy rather than memory.

Step 5

Rewrite the rules that contradict the file

Edit robots.txt at its real source, whether a physical file, a plugin setting or a CDN option. Split mixed groups so training and search agents get separate rules, add specific Allow lines where a wildcard catches /llms.txt, and remove folder rules that no longer serve a purpose. Where a page in llms.txt should genuinely stay refused, remove it from llms.txt instead, so the two files agree with each other.

Step 6

Confirm the live result and stop it recurring

Purge any CDN cache for /robots.txt, fetch it again from outside your network, and re-run the script to confirm only the intended refusals remain. Re-run the llms.txt Auditor. Crawlers may keep a cached copy of robots.txt for up to about a day, so allow time before judging from server logs. Then add the script to your deployment checks so a future edit cannot quietly reintroduce the conflict.

A worked example

A fictional software company, Fenwick Rota, publishes an llms.txt whose main section links to its help centre under /help/. Its robots.txt had grown over several years:

User-agent: GPTBot
User-agent: ChatGPT-User
User-agent: OAI-SearchBot
User-agent: ClaudeBot
User-agent: PerplexityBot
Disallow: /

User-agent: *
Disallow: /app/
Disallow: /help/v1/
Disallow: /*.txt$

The test script reported that every agent listed in the first group was refused every URL, and that all other agents were refused /llms.txt by the .txt rule. The company's agreed policy was: no training, yes to AI search and to user-requested fetches. The rewrite:

User-agent: GPTBot
User-agent: ClaudeBot
User-agent: CCBot
Disallow: /

User-agent: *
Disallow: /app/
Disallow: /help/v1/
Allow: /llms.txt
Allow: /llms-full.txt

Sitemap: https://www.example.com/sitemap.xml

OAI-SearchBot, ChatGPT-User and PerplexityBot now fall through to the * group and can read the help centre and both llms files. The .txt rule was removed after the team confirmed it had been added years ago to hide a changelog that is now public anyway; the two Allow lines are kept as a guard in case someone adds a similar rule again. The retired /help/v1/ section remains refused, and the three links to it were removed from llms.txt at the same time.

Keeping robots.txt and llms.txt in agreement

For firewall and CDN refusals, which produce error codes rather than polite non-visits, see the AI crawler access guide. For robots.txt mistakes that affect ordinary search crawlers, see accidental robots.txt blocks. Nothing here is legal advice about how AI companies may use your content.

Questions and answers

1. Does blocking GPTBot stop my site appearing in ChatGPT search?

Not according to OpenAI documentation. OpenAI describes GPTBot as collecting content that may be used for training, and OAI-SearchBot as the crawler used to surface sites in ChatGPT search results, with separate robots.txt controls for each. Blocking GPTBot alone opts you out of training collection without refusing the search crawler. If both are listed in the same disallow group, you have refused both, which is a common accidental conflict with llms.txt.

2. Should I add Allow lines for AI crawlers to robots.txt?

Only where a broader rule would otherwise catch something you want fetched. A crawler with no rule refusing it is already allowed, so adding a group that says Allow: / for each AI bot grants nothing new. Worse, a named group replaces the general * group for that crawler, so it can accidentally lift restrictions you rely on. Use specific Allow lines, such as for /llms.txt beneath a wildcard disallow, and keep the rest of the file simple.

3. Does llms.txt override robots.txt?

No. llms.txt is a proposal for recommending content and has no permission-granting role. robots.txt is the file compliant crawlers check before fetching, and a disallow there wins however prominently a page is listed in llms.txt. That is why the auditor flags conflicts: a recommended page that robots.txt refuses will not be fetched by any crawler that respects the rule. Make the two files agree, by changing whichever one does not reflect your decision.

4. How do I know whether AI crawlers can read my llms.txt?

Test the path against each published user agent with a parser that supports wildcards, then look for real requests in your server access logs. A request for /robots.txt from a crawler followed by no request for /llms.txt may simply mean the crawler does not look for the file, since no major provider has confirmed that it does. A 403 or challenge response in the logs points to a firewall rather than robots.txt, which needs fixing at that layer.

5. Why does my robots.txt contain AI rules I never wrote?

Something between your site and the visitor is adding them. Common sources are an SEO plugin robots.txt editor, a CMS that generates the file from settings, a hosting control panel, and CDN features that manage robots.txt for you and can include AI crawler disallows. Compare the live file with the one in your CMS or repository. Where they differ, find the layer adding lines and change the setting there rather than editing a file that is not being served.

6. Is it legitimate to block AI training crawlers but keep llms.txt?

Yes, as long as the combination reflects a clear decision. Many sites refuse training crawlers while allowing AI search crawlers and user-requested fetches, and an llms.txt file can still help those. What the auditor will question is a file that recommends pages to readers who are all refused. If every AI agent is blocked, the file has no compliant reader, so either reopen access for some agents or accept that llms.txt adds little for you.

7. How long before crawlers notice a robots.txt change?

It varies by crawler. RFC 9309 says crawlers should not rely on a cached copy of robots.txt for more than 24 hours, and major crawlers generally refresh within about a day. Purge your CDN cache for the file so the new version is served straight away. Then allow a day or two before judging the effect from access logs, since crawlers visit on their own schedules and may not request your pages immediately after reading the new rules.

Check robots.txt against your llms.txt

The llms.txt Auditor fetches your /llms.txt and /llms-full.txt files, validates them against the proposed format, checks that each linked URL responds, confirms robots.txt allows the relevant AI crawlers and scores the quality of the content.

Open llms.txt Fixes โ†’
๐Ÿ’ฌ Got a problem?
Related Guides: All llms.txt Fixes  ·  Fixing AI Crawler Access  ·  Robots and Sitemap Guide  ·  Fixing Broken Links in llms.txt  ·  Learning Hub

About aiwebpageseo

aiwebpageseo.com is a data-driven SEO and AEO (Answer Engine Optimisation) platform providing a free suite of technical SEO tools. Rather than relying on AI-theorised assumptions, the platform analyses live URL performance, delivering objective diagnostics, page speed metrics, CLS debugging, and site crawl data alongside actionable technical tutorials.