AI visibility
What to put in robots.txt for AI engines
Blocking a training crawler costs you nothing you can measure. Blocking a retrieval crawler quietly removes you from that engine's answers. The two have almost the same names, which is how so many sites end up invisible on purpose.
Here is the mistake, in two lines:
User-agent: GPTBot
Disallow: /
A founder writes that because they do not want their writing used to train a model without compensation. Reasonable position. They then assume they have opted out of ChatGPT.
They have not. GPTBot collects training data.
OAI-SearchBot builds the index ChatGPT search answers from. Two different
crawlers, two different jobs, one letter of visual difference at a glance. The rule above blocks
the one that was never going to send you anything, and leaves untouched the one that decides
whether you appear in answers. Whether that is the outcome you wanted depends entirely on which
one you thought you were blocking.
The inverse mistake is more expensive and much more common:
User-agent: *
Disallow: /
Usually inherited from a staging config that shipped, or from a "block the AI scrapers" snippet copied off a forum. It blocks retrieval too. Every AI search engine that would have cited you is now told not to look, and nothing in your analytics will ever tell you that is why you are absent.
Decide per class, not per company
There are three classes of AI crawler and they want different things. I go through them in detail here, but the short version is all you need to write a robots file:
| Class | Examples | What blocking it costs you |
|---|---|---|
| Training | GPTBot, ClaudeBot, CCBot,
Meta-ExternalAgent, Amazonbot |
Nothing measurable. No visitors, no citations. Possibly some long-run model familiarity with your product, which you can never verify |
| Retrieval | OAI-SearchBot, PerplexityBot,
Claude-SearchBot, DuckAssistBot |
Your presence in that engine's answers. This is the expensive one |
| User-triggered | ChatGPT-User, Perplexity-User,
Claude-User |
The ability to answer a question a real person is asking right now. Never block these |
So the decision is not "do I allow AI bots". It is two independent decisions: do I want to be findable in AI answers (allow retrieval and user-triggered, always, if you sell anything) and do I mind my text being used as training data (a content-rights preference, with no measurable traffic consequence either way).
What we chose, and why
This site allows everything except Bytespider.
# Retrieval: builds the index AI search answers from.
User-agent: OAI-SearchBot
Allow: /
User-agent: PerplexityBot
Allow: /
User-agent: Claude-SearchBot
Allow: /
User-agent: DuckAssistBot
Allow: /
# User-triggered: a person is waiting. Never blocked.
User-agent: ChatGPT-User
Allow: /
User-agent: Perplexity-User
Allow: /
User-agent: Claude-User
Allow: /
# Training: allowed deliberately. Being in the weights
# means a model can name us without fetching anything.
User-agent: GPTBot
Allow: /
User-agent: ClaudeBot
Allow: /
User-agent: CCBot
Allow: /
# ByteDance. Crawls aggressively, has a long record of
# ignoring this file, sends nothing back.
User-agent: Bytespider
Disallow: /
User-agent: *
Allow: /
Sitemap: https://www.getmiravi.com/sitemap.xml
That is the live file, with the comments shortened. You can read the real one and check that this post is telling you the truth, which is a habit worth having about anybody's advice on this subject.
The training decision is the one worth explaining, because the common advice is to block. We allow it on purpose. When someone asks an assistant "what should I use to get my startup cited in AI answers", the best outcome is a model that answers from what it already knows, with no retrieval step at all. You cannot measure that, you cannot attribute it, and you get exactly one shot at being in a training set for any given crawl. For a company nobody has heard of yet, that trade looks good. For a publisher whose archive is the product, it looks terrible. Both are correct answers to different situations.
Bytespider is excluded not as a rights position but as a straightforward cost decision: it crawls hard, and there is no ByteDance surface where our buyers are asking questions.
Five things that will bite you
1. Disallow and noindex are not alternatives, and combining them backfires
Disallow says do not fetch this. noindex says fetch it but do not list
it. So if you Disallow a page and put noindex on it, the crawler
never fetches the page, never sees the noindex, and the URL can still surface from
inbound links. If you want a page gone, let it be crawled and let it say noindex.
2. robots.txt is host-specific, and redirects will get you
The file must be at the root of the exact scheme and host being crawled.
https://www.example.com/robots.txt and https://example.com/robots.txt are
two different files as far as a crawler is concerned. If your apex redirects to
www, make sure the redirect actually resolves for /robots.txt and that
the file lands where the crawler follows to. This is a five minute check with
curl and it is worth doing today:
curl -sI -A "OAI-SearchBot/1.0" https://example.com/robots.txt
curl -sI -A "OAI-SearchBot/1.0" https://www.example.com/robots.txt
3. It is a request, not a fence
The major operators honour robots.txt. Bytespider has a long record of ignoring it and
Meta's compliance is inconsistent, which means the one rule in our file that we actually want
enforced is the one least likely to be obeyed. If you need a crawler stopped, that is a
rule at your CDN or WAF. A text file cannot do it.
4. Blocking at the CDN is invisible in robots.txt
Plenty of "AI bot blocking" toggles now ship enabled by default in CDN dashboards. Your
robots.txt can say Allow: / to every retrieval crawler while your edge
returns 403 to all of them. Check what actually happens on the wire, not what your config says
should happen.
5. Allow-listing with User-agent: * Disallow: / underneath is fragile
Most crawlers match the most specific group that names them and ignore the rest, so a
named Allow above a wildcard Disallow usually works. Usually. Parsers
differ at the margins, and a bot you have not named yet gets the wildcard. If your intent is
"everyone except X", write it that way: a permissive wildcard and explicit
Disallow groups for the exceptions.
What about llms.txt?
It is a proposed convention: a Markdown file at your root describing your site and pointing at your important pages, so an assistant can orient without parsing your navigation. We publish one.
Be clear-eyed about it. No major engine has committed to reading llms.txt, and there is
no evidence it currently affects whether you get cited. It costs ten minutes and it is a
genuinely useful summary of your own site, which is reason enough. It is not a ranking
mechanism, and anyone selling it as one is ahead of the facts.
The five minute version
Allow every retrieval and user-triggered crawler, without exception, if you sell anything. Make a
deliberate content-rights call on training crawlers and know that it costs you no measurable
traffic either way. Add your sitemap line. Then curl your own robots.txt on both
hosts, as a bot, and confirm you are serving what you think you are serving. That last step is the
one that finds the real problem.
Miravi checks this for you.
An AI CMO for early-stage founders: it keeps a brain on your product, watches which AI engines read and cite you, and drafts the pages that put you in the answer. Early access is invite-only.
Request an invite