robots.txt para IAs: bloquear o treino sem sumir das respostas
As empresas de IA usam robôs diferentes para coisas diferentes: um coleta páginas para treinar modelos (como o GPTBot e o ClaudeBot), outro indexa para respostas com link (como o OAI-SearchBot e o PerplexityBot) e um terceiro abre a página quando alguém pede (como o ChatGPT-User). Cada um tem um nome próprio no robots.txt. Bloquear todos de uma vez tira o site das respostas das IAs; bloquear só os de treino evita o uso do conteúdo em modelos e mantém o site citado. Este guia lista os robôs, mostra os dois arquivos mais comuns e como ver nos logs quem visita o seu site.
Os três tipos de robô de IA
Quando se fala em "bloquear as IAs", há três coisas diferentes em jogo, e cada empresa usa um robô (um user-agent) para cada uma:
- Treino: coleta páginas para treinar os próximos modelos. Bloquear não tira o site da busca: só pede que o conteúdo novo fique fora dos dados de treino.
- Busca: indexa páginas para que a IA responda com link para a fonte, como a busca do ChatGPT e o Perplexity. Bloquear tira o site dessas respostas, que são justamente as que trazem visitas.
- Acesso a pedido: abre uma página na hora em que alguém pede ("resuma este link"). Como a ação parte de uma pessoa, algumas empresas não aplicam o robots.txt a esses acessos.
Por isso não existe um único "robô do ChatGPT": bloquear o GPTBot não tira o site da busca do ChatGPT, e liberar o OAI-SearchBot não libera o treino. Cada nome é independente.
Os robôs de cada empresa
OpenAI (ChatGPT)
GPTBot: treino.OAI-SearchBot: busca do ChatGPT. Sites bloqueados não aparecem nas respostas da busca, embora ainda possam surgir como link de navegação. A OpenAI informa que leva cerca de 24 horas para aplicar uma mudança no robots.txt.ChatGPT-User: acesso a pedido de quem usa o ChatGPT. A documentação da OpenAI avisa que, por partir do usuário, as regras do robots.txt podem não valer.
Anthropic (Claude)
ClaudeBot: treino.Claude-SearchBot: busca do Claude.Claude-User: acesso a pedido. A Anthropic informa que os três respeitam o robots.txt, inclusive o Crawl-delay.
Google, Apple, Perplexity e outros
Google-Extended: não é um robô, é um nome que o Googlebot consulta. Bloqueá-lo pede que o conteúdo não seja usado para treinar o Gemini nem para embasar respostas dele, sem nenhum efeito na Pesquisa Google, inclusive nos AI Overviews, que usam o índice normal da busca.Applebot-Extended: mesma ideia para a Apple. O Applebot continua rastreando para a Siri e o Spotlight; o Extended só diz se o conteúdo pode treinar os modelos da Apple.PerplexityBot: índice do Perplexity. OPerplexity-User, que abre páginas a pedido, em geral não segue o robots.txt.meta-externalagent(Meta),CCBot(Common Crawl, base pública usada para treinar muitos modelos) eBytespider(ByteDance): coleta para treino.
Os nomes mudam de tempos em tempos e novas empresas aparecem. Confira a página oficial de cada uma (nas fontes, no fim do guia) antes de publicar.
O arquivo mais comum: bloquear só o treino
Para quem quer aparecer nas respostas das IAs, que citam a fonte com link, mas não quer o conteúdo usado em treino, o arquivo bloqueia os robôs de treino e deixa o resto como está. Várias linhas User-agent seguidas formam um único grupo, então o Disallow: / vale para todos eles:
# Bloqueia a coleta para treino de IA e mantém o site
# na busca do Google e nas respostas com link das IAs.
User-agent: GPTBot
User-agent: ClaudeBot
User-agent: Google-Extended
User-agent: Applebot-Extended
User-agent: meta-externalagent
User-agent: CCBot
User-agent: Bytespider
Disallow: /
# Todos os outros, inclusive OAI-SearchBot, Claude-SearchBot e PerplexityBot
User-agent: *
Disallow: /admin/
Sitemap: https://seusite.com.br/sitemap.xml Os robôs de busca das IAs caem no grupo *, como o Googlebot.
Um detalhe que pega muita gente: o robô usa só o grupo com o nome dele. O GPTBot, aqui, segue o Disallow: / e ignora o grupo *. Se você criar um grupo para um robô de busca, repita nele as regras do * que também devem valer, como o Disallow: /admin/. O gerador de robots.txt monta o arquivo e tem um teste para conferir o que cada robô pode acessar.
Bloquear todas as IAs e continuar no Google
Para tirar o conteúdo de treino, busca e acesso a pedido das IAs, liste os três tipos de robô. Googlebot e Bingbot ficam de fora da lista, então o site continua na busca normal:
# Bloqueia treino, busca e acesso a pedido de usuários das IAs.
# O site continua no Google e no Bing.
User-agent: GPTBot
User-agent: OAI-SearchBot
User-agent: ChatGPT-User
User-agent: ClaudeBot
User-agent: Claude-SearchBot
User-agent: Claude-User
User-agent: PerplexityBot
User-agent: Perplexity-User
User-agent: Google-Extended
User-agent: Applebot-Extended
User-agent: meta-externalagent
User-agent: CCBot
User-agent: Bytespider
Disallow: /
User-agent: *
Allow: / ChatGPT-User e Perplexity-User podem ignorar o arquivo.
Há dois limites. O primeiro: os AI Overviews do Google usam o índice da busca, então não saem com o robots.txt sem tirar o site do Google. Para limitar o trecho mostrado, use as meta tags nosnippet ou max-snippet, que o gerador de meta tags ajuda a montar, ou o atributo data-nosnippet em partes da página. O segundo: o robots.txt é um pedido, não uma trava. Robôs que o ignoram só param com bloqueio no servidor ou no firewall, pelo user-agent ou pelas faixas de IP que as empresas publicam.
Quem visita o seu site: conferindo os logs
Antes de decidir, vale ver quais robôs de IA já passam pelo site. O log de acesso do Nginx ou do Apache guarda o user-agent de cada pedido, e o nome do robô aparece no meio dele, como em "compatible; GPTBot/1.2". Os códigos abaixo contam as visitas de cada um:
// Conta as visitas de robôs de IA em um log de acesso no formato combinado
// (Nginx e Apache), em que o user-agent é o último campo entre aspas.
const ROBOS = ['GPTBot', 'OAI-SearchBot', 'ChatGPT-User', 'ClaudeBot', 'Claude-SearchBot', 'Claude-User', 'PerplexityBot', 'Perplexity-User', 'meta-externalagent', 'CCBot', 'Bytespider', 'Applebot'];
const PADROES = ROBOS.map((r) => [r, new RegExp(`\\b${r}\\b`, 'i')]);
function contarRobosIa(log) {
const contagem = {};
for (const linha of log.split('\n')) {
const ua = linha.match(/"([^"]*)"\s*$/)?.[1];
if (!ua) continue;
// O nome aparece no meio do user-agent: "...; compatible; GPTBot/1.2; ..."
const achado = PADROES.find(([, p]) => p.test(ua));
if (achado) contagem[achado[0]] = (contagem[achado[0]] ?? 0) + 1;
}
return contagem;
}
// Node.js: contarRobosIa(require('fs').readFileSync('/var/log/nginx/access.log', 'utf8'))
console.log(contarRobosIa('1.2.3.4 - - [02/Oct/2026:10:00:00 +0000] "GET / HTTP/1.1" 200 512 "-" "Mozilla/5.0; compatible; GPTBot/1.2; +https://openai.com/gptbot"')); // { GPTBot: 1 } Node.js. Para o log inteiro, leia o arquivo com fs.readFileSync.
import re
from collections import Counter
# Conta as visitas de robôs de IA em um log de acesso no formato combinado
# (Nginx e Apache), em que o user-agent é o último campo entre aspas.
ROBOS = ["GPTBot", "OAI-SearchBot", "ChatGPT-User", "ClaudeBot", "Claude-SearchBot", "Claude-User",
"PerplexityBot", "Perplexity-User", "meta-externalagent", "CCBot", "Bytespider", "Applebot"]
PADROES = [(r, re.compile(rf"\b{re.escape(r)}\b", re.I)) for r in ROBOS]
def contar_robos_ia(log: str) -> Counter:
contagem = Counter()
for linha in log.splitlines():
m = re.search(r'"([^"]*)"\s*$', linha)
if not m:
continue
robo = next((r for r, p in PADROES if p.search(m.group(1))), None)
if robo:
contagem[robo] += 1
return contagem
# with open("/var/log/nginx/access.log", encoding="utf-8", errors="replace") as f:
# print(contar_robos_ia(f.read()).most_common()) O user-agent pode ser falsificado: qualquer um pode se apresentar como GPTBot. Se a contagem servir para uma decisão importante, confira se o IP pertence às faixas publicadas pela empresa. Se o site usa a Cloudflare, olhe também o painel: ela tem opções próprias para bloquear robôs de IA, que valem antes do robots.txt e podem estar ligadas sem você saber.
Como decidir
- Site que vive de visitas (blog, loja, ferramentas): libere os robôs de busca e de acesso a pedido. As respostas com link são uma fonte crescente de visitas. Bloquear o treino é uma escolha sua e não afeta essas visitas.
- Conteúdo pago ou exclusivo: bloqueie os três tipos, e proteja o conteúdo com login, que é o que de fato impede a leitura.
- Documentação de produto: libere tudo. Quanto mais as IAs souberem do seu produto, melhores as respostas para quem pergunta sobre ele.
Mudanças no robots.txt valem para as próximas visitas: o que já foi coletado não sai dos modelos treinados. E o arquivo precisa estar na raiz do domínio, em /robots.txt, com cada subdomínio tendo o seu.
Achou um erro neste guia? Avise por e-mail.
Ferramentas para usar junto
- Gerador de Robots.txtCrie o robots.txt do seu site: bloqueie pastas, robôs de IA como GPTBot e ClaudeBot, adicione o sitemap e teste se uma página está liberada
- Gerador de Meta Tags SEOGere as meta tags da página (title, description, canonical, Open Graph e Twitter), com contador de caracteres e prévia no Google
Perguntas frequentes
Bloquear o GPTBot tira o meu site do ChatGPT?
Não. O GPTBot só coleta para treino. Quem leva o site às respostas da busca do ChatGPT é o OAI-SearchBot, e quem abre links a pedido é o ChatGPT-User. Para sair da busca do ChatGPT, bloqueie o OAI-SearchBot.
Bloquear o Google-Extended tira o site dos AI Overviews?
Não. O Google-Extended controla o uso do conteúdo no treino e nas respostas do Gemini, mas não afeta a Pesquisa Google, e os AI Overviews usam o índice da busca. Para limitar o trecho usado, use nosnippet, max-snippet ou data-nosnippet.
Preciso de um arquivo llms.txt?
Não é obrigatório. O llms.txt é uma proposta de arquivo com um resumo do site em Markdown, para facilitar a leitura por IAs. Ele não controla acesso: quem decide o que cada robô pode visitar continua sendo o robots.txt.
Em quanto tempo a mudança no robots.txt vale?
Depende do robô, porque cada um relê o arquivo de tempos em tempos. A OpenAI informa cerca de 24 horas para a busca do ChatGPT, e o Google costuma guardar o arquivo por até um dia.
Outros guias
- Como gerar slug de URL a partir de texto com acentosComo transformar um título com acentos em slug de URL (Ação e Reação vira acao-e-reacao) em JavaScript, Python e PHP, e os cuidados com slugs repetidos.
- URL encode: como codificar parâmetros de URL sem quebrar nadaQuando usar encodeURIComponent ou encodeURI, por que o espaço vira + ou %20 e como codificar URL em JavaScript, Python e PHP, com código testado.