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 pesquisaai-input— se pode servir de material para uma resposta, com atribuiçãoai-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?