Cómo permitir o bloquear los bots de IA en robots.txt
Casi todas las webs deciden esto una vez, mal, y no lo vuelven a mirar. O se bloquea todo en un ataque de pánico por el entrenamiento, llevándose por delante el tráfico que trae clientes, o no se configura nada y queda lo que cada rastreador dé por supuesto.
Hay tres posturas razonables. Aquí tienes el fichero de cada una y los errores que las anulan.
Antes de nada, la distinción que lo decide todo
Las empresas de IA tienen dos tipos de agente y no son intercambiables.
Rastreadores que recogen páginas en volumen, a su ritmo, normalmente para entrenar o indexar: GPTBot, ClaudeBot, PerplexityBot, CCBot, Bytespider, Google-Extended, Applebot-Extended.
Descargadores a petición que traen una página porque alguien acaba de preguntar por ella: ChatGPT-User, Claude-User, Perplexity-User. Con esa petición nadie está entrenando nada. Hay alguien esperando una respuesta sobre ti.
Bloquear a los primeros es una decisión de negocio sobre tu contenido. Bloquear a los segundos se parece más a bloquear a un visitante que ha tecleado tu dirección. Casi todos los consejos de «bloquea toda la IA» que vas a leer no distinguen entre unos y otros.
Caso 1 — Dejarlos entrar
Lo razonable por defecto para cualquier cosa que quiera ser encontrada: documentación, medios que quieren atribución, negocios que quieren que los recomienden.
User-agent: *
Allow: /
Disallow: /admin/
Disallow: /carrito/
Disallow: /*?session=
Content-Signal: search=yes, ai-input=yes, ai-train=no
Sitemap: https://ejemplo.com/sitemap.xml
Fíjate en lo que dice: pasa, indéxame, úsame para responder preguntas, no entrenes conmigo. Esa postura el robots.txt por sí solo no sabe expresarla; de ahí la sección de Content-Signal.
Caso 2 — Respuestas sí, entrenamiento no
La que quiere de verdad la mayoría de los negocios, y la que casi nadie configura bien.
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://ejemplo.com/sitemap.xml
Dos cosas que conviene saber de ese fichero. Google-Extended controla el entrenamiento de Gemini y no el buscador de Google: bloquearlo no afecta a tu posicionamiento. Y Applebot-Extended funciona igual para Apple Intelligence, aparte del Applebot que alimenta Siri y Spotlight.
Caso 3 — Bloquear la IA por completo
Tiene sentido para archivos de pago, material con licencia y cualquier cosa cuyo acceso vendas.
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://ejemplo.com/sitemap.xml
Las líneas User-agent apiladas comparten las reglas que vienen debajo. Es válido y mucho más fácil de mantener que catorce bloques sueltos.
Ten claro el precio antes de elegir esto: desapareces de las respuestas de IA. Cuando alguien le pregunte a un asistente por tu sector, nombrará a tus competidores y a ti no.
Los errores
Solo se aplica el grupo más específico. Un rastreador que encuentra su propio nombre ignora por completo el User-agent: *. Así que esto no hace lo que parece:
User-agent: *
Disallow: /privado/
User-agent: GPTBot
Disallow: /
GPTBot queda bloqueado del todo, pero cualquier otro bot lee solo el grupo *. Y si mañana pones un Allow bajo GPTBot, /privado/ deja de estar protegido frente a él, porque ese grupo nunca mencionó /privado/.
Las líneas en blanco separan grupos. Una línea vacía en mitad de un grupo lo termina. Lo que venga después no pertenece a nadie hasta el siguiente User-agent.
Disallow: sin nada detrás significa permitir todo. Disallow: / bloquea todo. Un carácter entre una puerta abierta y una cerrada.
El robots.txt no es control de acceso. Es una petición que los rastreadores educados respetan. Los que lo ignoran van a seguir ignorándolo. Si algo no debe leerse, necesita autenticación, no una directiva.
Crawl-delay lo ignoran casi todos los rastreadores de IA. Si el problema es la carga, limita el ritmo en el borde.
Content-Signal: decir qué, no solo si
El robots.txt responde a una sola pregunta: si puedes descargar esto. No tiene forma de decir «indéxame pero no entrenes conmigo», que es justo la postura de la mayoría.
Content-Signal añade esa capa con tres señales independientes:
Content-Signal: search=yes, ai-input=yes, ai-train=no
search: si esto puede aparecer en un índice de búsquedaai-input: si puede usarse como material para una respuesta, con atribuciónai-train: si puede usarse para entrenar un modelo
Va en el robots.txt como arriba, y también puede viajar como cabecera HTTP en cada respuesta, que es lo que hacemos nosotros. Es una convención joven, no un estándar que nadie esté obligado a respetar, pero cuesta una línea, la lee una máquina y expresa una intención que un Disallow no puede.
Comprueba que el tuyo llega
Escribir el fichero no es lo mismo que servirlo:
curl -s https://ejemplo.com/robots.txt
curl -sI https://ejemplo.com/robots.txt | grep -i "server\|cf-cache-status"
El segundo comando importa más de lo que parece. Si estás detrás de un CDN sin robots.txt propio, puede que el CDN responda por ti con un fichero que nunca escribiste: un 200 verosímil sin ninguna de tus reglas y sin tu sitemap. El nuestro hizo exactamente eso durante meses mientras nuestro servidor devolvía 404.
Genera tu robots.txt · Comprueba el que sirves · ¿Están permitidos los bots?