As defesas da web foram construídas em torno de uma divisão simples: pessoas de um lado, automação do outro. Um agente de IA não é nenhum dos dois. Ele age a pedido de uma pessoa, mas roda em um servidor, lê em velocidade de máquina e muitas vezes parte de um IP de nuvem. Para equipes que constroem agentes de IA que usam a web, o resultado é uma falha que ninguém planejou: o agente esbarra em uma parede, e o que acontece depois depende de detalhes que a maioria das camadas de ferramentas ignora.
Este guia explica por que os agentes caem entre as categorias, como é essa parede vista de dentro de uma chamada de ferramenta, e como construir um agente que lide com isso de forma honesta.
Nem crawler, nem pessoa
Os fornecedores agora descrevem esses agentes como uma classe separada. A OpenAI diz que o ChatGPT-User “não é usado para rastrear a web de forma automática”. O Google diz que o Google-Agent é usado “para navegar na web e realizar ações a pedido do usuário”. A Anthropic tem um agente Claude-User para quando pessoas fazem perguntas ao Claude.
As regras ainda não acompanharam isso, e os fornecedores não concordam entre si:
| Fornecedor | Buscas acionadas pelo usuário e robots.txt |
|---|---|
| OpenAI | ”as regras do robots.txt podem não se aplicar” |
| ”geralmente ignoram as regras do robots.txt” | |
| Anthropic | Seus bots respeitam as diretivas do robots.txt |
O RFC 9309 acrescenta que as regras do robots.txt “não são uma forma de autorização de acesso”, então elas nunca resolveriam isso sozinhas. Enquanto isso, o tráfego cresce: a Cloudflare relata que o rastreamento de “ação do usuário” por IA cresceu mais de 15 vezes em 2025, e o Bad Bot Report de 2026 da Thales coloca os bots em mais de 53% de todo o tráfego em 2025. Os sites têm mais motivos do que nunca para filtrar automação, e os agentes acabam presos nesse filtro.
Como é a parede vista de uma chamada de ferramenta
| O que volta | O que significa | O que o agente deve fazer |
|---|---|---|
| 200 com uma página de desafio | Uma verificação de bot, não a página | Informar que não conseguiu ver a página |
| 401 ou uma página de login | O conteúdo precisa de uma conta | Pedir ao usuário para fazer login |
| 402 | O site quer pagamento | Perguntar antes de pagar qualquer coisa |
| 403 | O servidor recusa | Informar isso, e não insistir na página |
| 429 | Muitas requisições | Respeitar o Retry-After, ou parar |
| 404 ou 410 | A página não existe | Não tentar novamente |
A primeira linha é a perigosa. Um 403 pelo menos parece uma falha. Uma página de desafio muitas vezes chega como um 200 com um corpo HTML bem formado, então uma ferramenta de busca simples a entrega ao modelo como se fosse o artigo.
Isso importa por causa de como os modelos se comportam com uma saída de ferramenta ruim. Um preprint de setembro de 2026 sobre agentes aumentados por ferramentas descobriu que, quando uma ferramenta retornava status:error, a desonestidade estava ausente (0,0%), mas quando retornava status:ok com um valor redigido, corrompido, desatualizado, malformado, vazio ou truncado, ela chegava a 45,3%. Esse estudo testou sistemas internos em vez de páginas web, então aplicá-lo a páginas de bloqueio é uma inferência nossa. Ainda assim, a lição se mantém: um erro honesto é muito mais seguro do que um sucesso que não contém nada útil. Também já abordamos como páginas de desafio contaminam o que as ferramentas de IA produzem.
Uma ferramenta de busca que diz a verdade
A correção pertence à camada de ferramentas. A função abaixo classifica cada resposta antes que o modelo a veja, e retorna o texto da página somente quando a página é real. Ela precisa apenas de requests. Nós a executamos em Python 3.9 contra um servidor de teste local que retorna cada caso.
from __future__ import annotations
from dataclasses import asdict, dataclass
import requests
# Text that marks a page as a wall, not content. Extend it from your own logs.
WALL_MARKERS = ("verify you are human", "unusual traffic", "enable javascript and cookies",
"attention required", "access denied", "captcha")
LOGIN_MARKERS = ("sign in to continue", "log in to continue")
@dataclass
class FetchResult:
outcome: str # ok, wall, login, payment, rate_limited, not_found, error
status: int | None
text: str # only ever page content, empty unless outcome is ok
retry_after: str | None
note: str # what the model should be told
NOTES = {
"wall": "The site showed a bot check. You did not see this page. Say so, do not guess its content.",
"login": "This page needs a login. Ask the user to sign in or to provide the content.",
"payment": "The site asks for payment (HTTP 402). Ask the user before paying anything.",
"rate_limited": "The site asked you to slow down. Wait, or tell the user it is unavailable now.",
"not_found": "The page does not exist. Do not retry it.",
"error": "The fetch failed. You did not see this page. Say so, do not guess its content.",
"ok": "",
}
def classify(status, body):
low = body.lower()
if status == 402:
return "payment"
if status == 429:
return "rate_limited"
if status in (404, 410):
return "not_found"
if any(m in low for m in WALL_MARKERS): # walls often arrive with a 200
return "wall"
if status in (401, 403):
return "login" if status == 401 or any(m in low for m in LOGIN_MARKERS) else "wall"
if status == 200 and any(m in low for m in LOGIN_MARKERS):
return "login"
return "ok" if status == 200 else "error"
def agent_fetch(url, agent_name="example-agent/1.0 (+https://example.com/agent)"):
"""A fetch tool that never hands the model a block page as if it were content."""
try:
r = requests.get(url, headers={"User-Agent": agent_name}, timeout=(10, 30))
except requests.RequestException as exc:
return FetchResult("error", None, "", None, f"{NOTES['error']} ({type(exc).__name__})")
outcome = classify(r.status_code, r.text)
return FetchResult(outcome, r.status_code, r.text if outcome == "ok" else "",
r.headers.get("Retry-After"), NOTES[outcome])
Saída, como status, resultado, se o modelo recebe o texto da página, e Retry-After:
/article 200 ok content
/challenge 200 wall -
/blocked 403 wall -
/members 200 login -
/priced 402 payment -
/busy 429 rate_limited - 120
/gone 404 not_found -
/broken 503 error -
(no server)None error -
Apenas um dos nove casos dá ao modelo algum texto de página. A linha /challenge é aquela em que uma busca simples erra, já que retornou um 200. Trate as listas de marcadores como ponto de partida e amplie-as a partir dos seus próprios logs, porque nenhuma lista pega todas as paredes. Se você fornece ferramentas por meio de um servidor MCP, a especificação tem um lugar para isso: erros de execução são informados com isError: true, e os clientes “SHOULD provide tool execution errors to language models”.
Não resolva o CAPTCHA
Os fornecedores estão incomumente alinhados neste ponto. A OpenAI descreveu o Operator como treinado para pedir que o usuário assuma o controle em logins, dados de pagamento e CAPTCHAs. A documentação do Claude in Chrome da Anthropic diz que, numa página de login ou CAPTCHA, ele “pauses and asks you to handle it manually”. As instruções recomendadas do Google para uso de computador dizem “You MUST NEVER attempt to solve or bypass” uma lista que inclui “CAPTCHAs (of any kind)”.
Um CAPTCHA é um site pedindo por um humano, então a resposta certa é repassar a tarefa a um. Isso também resulta em um produto melhor: a pessoa sabe o que aconteceu e pode decidir.
A identidade é o caminho
A resposta de longo prazo é que os agentes digam quem são de uma forma que os sites possam verificar. O Web Bot Auth permite que um cliente assine criptograficamente suas requisições com HTTP Message Signatures. A OpenAI já assina requisições do seu navegador em nuvem, com um cabeçalho Signature-Agent definido como https://chatgpt.com, e o Google diz que está experimentando o protocolo. A Cloudflare introduziu uma categoria de agentes assinados em agosto de 2025, e desde julho de 2026 rastreia a diferença entre bots verificados como acesso direto versus intermediário. O trabalho do IETF ainda é um rascunho, então espere mudanças.
Se você está construindo um agente hoje, envie um User-Agent descritivo com detalhes de contato, publique o que seu agente faz, e planeje-se para a assinatura.
O panorama legal ainda não está definido
O primeiro grande caso mostra o quanto isso está em aberto. A Amazon processou a Perplexity em novembro de 2025 por causa de seu navegador agêntico, alegando violações do Computer Fraud and Abuse Act dos EUA e do seu equivalente da Califórnia, e o parecer diz que o cerne da disputa foi a decisão da Perplexity de não usar uma string de user-agent. Em agosto de 2026, o Nono Circuito anulou uma liminar, considerando improvável que a Amazon conseguisse provar que a Perplexity “acessou” seus computadores nos termos dessa lei.
O tribunal foi cuidadoso quanto ao alcance disso: “We do not establish a new legal regime governing agentic AI.” Também disse que o resultado não prejudica a capacidade da Amazon de regular o acesso por meio de seus termos de serviço. Então isso não foi uma licença para que agentes ignorassem a vontade de um site. Isto é informação geral, não aconselhamento jurídico, e o caso voltou para o tribunal distrital.
Construindo para a parede
- Assuma que paredes são normais. Projete o plano do agente em torno de páginas que ele não consegue alcançar, com alternativas como outra fonte ou perguntar ao usuário.
- Classifique antes que o modelo veja qualquer coisa. Use uma ferramenta como a de cima, e registre os resultados para que você consiga ver quais sites falham.
- Ofereça rotas oficiais primeiro. Onde um site tem uma API ou um produto de dados, use-o. É mais confiável do que uma sessão de navegador.
- Mantenha as sessões coerentes. Tarefas de múltiplas etapas quebram quando o IP muda no meio do caminho. Nosso guia sobre proxies para agentes de IA que navegam na web aborda rotação e sessões fixas.
- Saiba para que serve um proxy. Proxies residenciais ajudam um agente a ver páginas públicas como visitantes locais o fazem, no país certo e a partir de um endereço consistente. Eles não mudam o que um site permite, e não são uma forma de contornar um site que já disse não. Se um site pede um login, um pagamento ou uma pessoa, respeite isso.
Conclusão
Os agentes chegaram à web antes de a web ter uma categoria para eles, e por enquanto a parede faz parte do trabalho. Trate-a como um resultado normal: classifique-a na camada de ferramentas, diga a verdade ao modelo e ao usuário, repasse CAPTCHAs a pessoas, e identifique seu agente. Um agente que diz “não consegui ver essa página” vale muito mais do que um que chuta.
Fontes e referências
- OpenAI, documentação de bots: developers.openai.com
- OpenAI, allowlisting do navegador em nuvem do ChatGPT Work: help.openai.com
- OpenAI, Introducing Operator (23 de janeiro de 2025): openai.com
- Google, user-triggered fetchers: developers.google.com
- Google, Gemini computer use: ai.google.dev
- Anthropic, sobre rastreamento e proprietários de sites: support.claude.com
- Anthropic, Claude in Chrome: code.claude.com
- Cloudflare, agentes assinados (28 de agosto de 2025, documentação atualizada em novembro de 2026): blog.cloudflare.com, developers.cloudflare.com
- Cloudflare Radar 2025 Year in Review: blog.cloudflare.com
- Thales, Bad Bot Report 2026: cpl.thalesgroup.com
- IETF, rascunho do protocolo Web Bot Auth: datatracker.ietf.org
- RFC 9309, Robots Exclusion Protocol: rfc-editor.org
- RFC 9110 e RFC 6585, códigos de status HTTP: rfc-editor.org, rfc-editor.org
- Model Context Protocol, especificação de ferramentas: modelcontextprotocol.io
- Sethi et al., Fabrication After Tool Failure (preprint, setembro de 2026): arxiv.org/abs/2609.14758
- Nono Circuito, Amazon.com Services v. Perplexity AI, No. 26-1444 (4 de agosto de 2026): uscourts.gov