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úsqueda
  • ai-input: si puede usarse como material para una respuesta, con atribución
  • ai-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?