Como permitir ou bloquear os bots de IA no robots.txt

Quase todos os sites decidem isto uma vez, mal, e nunca mais lá voltam. Ou se bloqueia tudo num ataque de pânico por causa do treino, levando à frente o tráfego que traz clientes, ou não se configura nada e fica o que cada rastreador quiser assumir.

Há três posições sensatas. Aqui tens o ficheiro de cada uma e os erros que as deitam por terra.

Primeiro, a distinção que decide tudo

As empresas de IA têm dois tipos de agente e não são intermutáveis.

Rastreadores que recolhem páginas em massa, ao ritmo deles, normalmente para treinar ou indexar: GPTBot, ClaudeBot, PerplexityBot, CCBot, Bytespider, Google-Extended, Applebot-Extended.

Descarregadores a pedido que vão buscar uma página porque alguém acabou de fazer uma pergunta sobre ela: ChatGPT-User, Claude-User, Perplexity-User. Com esse pedido ninguém está a treinar coisa nenhuma. Está alguém à espera de uma resposta sobre ti.

Bloquear os primeiros é uma decisão de negócio sobre o teu conteúdo. Bloquear os segundos parece-se mais com bloquear um visitante que escreveu o teu endereço. Quase todos os conselhos do género «bloqueia toda a IA» que vais ler não distinguem uns dos outros.

Caso 1 — Deixá-los entrar

O padrão certo para tudo o que quer ser encontrado: documentação, editoras que querem ser citadas, negócios que querem ser recomendados.

User-agent: *
Allow: /
Disallow: /admin/
Disallow: /carrinho/
Disallow: /*?session=

Content-Signal: search=yes, ai-input=yes, ai-train=no

Sitemap: https://exemplo.pt/sitemap.xml

Repara no que aquilo diz: entra, indexa-me, usa-me para responder a perguntas, não treines comigo. Essa posição o robots.txt sozinho não sabe exprimir — daí a secção sobre Content-Signal mais abaixo.

Caso 2 — Respostas sim, treino não

A que a maioria dos negócios quer mesmo, e a que quase ninguém configura bem.

User-agent: GPTBot
Disallow: /

User-agent: ClaudeBot
Disallow: /

User-agent: CCBot
Disallow: /

User-agent: Bytespider
Disallow: /

User-agent: Google-Extended
Disallow: /

User-agent: Applebot-Extended
Disallow: /

User-agent: OAI-SearchBot
Allow: /

User-agent: Claude-SearchBot
Allow: /

User-agent: PerplexityBot
Allow: /

User-agent: ChatGPT-User
Allow: /

User-agent: Claude-User
Allow: /

User-agent: Perplexity-User
Allow: /

User-agent: *
Allow: /

Content-Signal: search=yes, ai-input=yes, ai-train=no

Sitemap: https://exemplo.pt/sitemap.xml

Duas coisas que convém saber sobre esse ficheiro. O Google-Extended controla o treino do Gemini e não a pesquisa da Google: bloqueá-lo não mexe no teu posicionamento. E o Applebot-Extended funciona da mesma maneira para a Apple Intelligence, à parte do Applebot que alimenta a Siri e o Spotlight.

Caso 3 — Bloquear a IA por completo

Faz sentido para arquivos pagos, material licenciado e tudo aquilo cujo acesso vendes.

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: CCBot
User-agent: Bytespider
User-agent: Google-Extended
User-agent: Applebot-Extended
User-agent: Amazonbot
User-agent: meta-externalagent
Disallow: /

User-agent: *
Allow: /

Content-Signal: search=no, ai-input=no, ai-train=no

Sitemap: https://exemplo.pt/sitemap.xml

As linhas User-agent empilhadas partilham as regras que vêm por baixo. É válido e muito mais fácil de manter do que catorze blocos separados.

Percebe o preço antes de escolheres isto: desapareces das respostas da IA. Quando alguém perguntar a um assistente sobre o teu setor, ele nomeia os teus concorrentes e a ti não.

Os erros

Só se aplica o grupo mais específico. Um rastreador que encontra o próprio nome ignora por completo o User-agent: *. Portanto isto não faz o que parece:

User-agent: *
Disallow: /privado/

User-agent: GPTBot
Disallow: /

O GPTBot fica bloqueado em todo o lado, mas qualquer outro bot lê apenas o grupo * — e se amanhã puseres um Allow debaixo de GPTBot, /privado/ deixa de estar protegido dele, porque esse grupo nunca mencionou /privado/.

As linhas em branco separam grupos. Uma linha vazia a meio de um grupo termina-o. O que vier a seguir não pertence a ninguém até ao User-agent seguinte.

Disallow: sem nada atrás significa permitir tudo. Disallow: / bloqueia tudo. Um carácter entre uma porta aberta e uma porta fechada.

O robots.txt não é controlo de acesso. É um pedido que os rastreadores bem-educados respeitam. Os que o ignoram vão continuar a ignorá-lo. Se algo não pode ser lido, precisa de autenticação, não de uma diretiva.

O Crawl-delay é ignorado por quase todos os rastreadores de IA. Se o problema é a carga, limita o ritmo na periferia.

Content-Signal: dizer o quê, não só se

O robots.txt responde a uma única pergunta: podes descarregar isto. Não tem forma de dizer «indexa-me mas não treines comigo», que é precisamente a posição da maioria.

O Content-Signal acrescenta essa camada com três sinais independentes:

Content-Signal: search=yes, ai-input=yes, ai-train=no
  • search — se isto pode aparecer num índice de pesquisa
  • ai-input — se pode servir de material para uma resposta, com atribuição
  • ai-train — se pode servir para treinar um modelo

Vai no robots.txt como acima e também pode viajar como cabeçalho HTTP em cada resposta, que é o que nós fazemos. É uma convenção jovem, não uma norma que alguém seja obrigado a respeitar — mas custa uma linha, é lida por uma máquina e exprime uma intenção que um Disallow não consegue.

Confirma que o teu chega

Escrever o ficheiro não é o mesmo que servi-lo:

curl -s https://exemplo.pt/robots.txt
curl -sI https://exemplo.pt/robots.txt | grep -i "server\|cf-cache-status"

O segundo comando importa mais do que parece. Se estás atrás de uma CDN sem robots.txt próprio, a CDN pode responder por ti com um ficheiro que nunca escreveste: um 200 credível, sem nenhuma das tuas regras e sem o teu sitemap. O nosso fez exatamente isso durante meses, enquanto o nosso servidor devolvia 404.

Gera o teu robots.txt · Verifica o que serves · Os bots estão autorizados?