Content-Signal: qué puede hacer la IA con tu contenido
El robots.txt responde a una sola pregunta y nunca ha respondido a otra: si puedes descargar esto. Sí o no, ruta por ruta, bot por bot. No tiene palabras para la postura que de verdad tiene casi todo el mundo, que es «indéxame, cítame, mándame lectores, pero no entrenes un modelo con lo que escribo».
Así que la gente tira de la única palanca que hay. Bloquea todo con un Disallow y se lleva por delante el tráfico junto con el entrenamiento.
Permiso para descargar no es permiso para usar
Son dos preguntas distintas y solo una va de tu ancho de banda. Un rastreador que lee tu página de precios y la cita cuando alguien pregunta qué contratar te está haciendo un favor. Esos mismos bytes metidos en un conjunto de entrenamiento son otra operación completamente distinta, y en esa tú no estás.
Bloquearlo todo junta las dos en un mismo «no». Para un archivo de pago puede ser lo correcto. Para un negocio que quiere que lo encuentren y lo recomienden es la opción equivocada por defecto: tú desapareces de las respuestas y tus competidores no.
Content-Signal es la capa que te deja separarlas.
Las tres señales
Content-Signal: search=yes, ai-input=yes, ai-train=no
search: construir un índice de búsqueda y devolver resultados, o sea enlaces y extractos cortos. No incluye los resúmenes generados por IA, que son la siguiente.ai-input: meter tu página en un modelo en el momento de responder. RAG, grounding, las fuentes que aparecen debajo de una respuesta generada.ai-train: entrenar o afinar un modelo con tu contenido.
Son independientes. Cualquier combinación vale, y varias de ellas son posturas razonables, no despistes.
Los valores son yes y no. No hay maybe, ni sintaxis por rutas, ni fecha de caducidad.
Omitir una señal no equivale a un no. Según la convención, un uso sobre el que no dices nada ni se concede ni se restringe: simplemente no has contestado. Nuestro generador escribe las tres siempre, que es la costumbre correcta, porque el silencio es la única respuesta con la que nadie puede hacer nada.
Dónde se pone
En dos sitios, y los dos salen baratos.
En el robots.txt, dentro de un grupo de user-agent:
User-agent: *
Allow: /
Content-Signal: search=yes, ai-input=yes, ai-train=no
Sitemap: https://ejemplo.com/sitemap.xml
Y como cabecera HTTP de respuesta:
Content-Signal: search=yes, ai-input=yes, ai-train=no
agentready.md sirve las dos. Esa cabecera exacta sale en cada respuesta: cada página, cada versión .md, cada llamada a la API.
En nginx:
add_header Content-Signal "search=yes, ai-input=yes, ai-train=no" always;
En Apache:
<IfModule mod_headers.c>
Header set Content-Signal "search=yes, ai-input=yes, ai-train=no"
</IfModule>
La cabecera se gana el sitio. El robots.txt se pide en la raíz, de vez en cuando, y un agente que aterriza en una URL profunda porque alguien ha pegado el enlace puede que no lo lea nunca. La cabecera viaja pegada a lo que se están llevando.
También existe la versión en meta etiqueta, <meta name="content-signal" content="search=yes, ai-input=yes, ai-train=no">. Úsala cuando no puedas tocar la configuración del servidor. La cabecera es mejor porque cubre además las respuestas que no son HTML.
Tres casos reales
Un medio que quiere atribución.
Content-Signal: search=yes, ai-input=yes, ai-train=no
Aparecer dentro de una respuesta con enlace es distribución, el equivalente actual de que te citen. El entrenamiento es la parte que nadie te paga y que además no te devuelve a nadie.
Un SaaS que quiere que lo recomienden.
Content-Signal: search=yes, ai-input=yes, ai-train=yes
Documentación, precios, changelog. Cuando alguien le pregunta a un asistente qué usar para una tarea, tú quieres ser la respuesta, y estar en los datos de entrenamiento es la forma de que te nombren cuando el modelo no descarga nada. Aquí no hay nada que proteger. El material es marketing.
Un archivo de pago.
Content-Signal: search=yes, ai-input=no, ai-train=no
Quieres que te encuentren, porque el resultado de búsqueda es el argumento de venta. Lo que no quieres es que el contenido del artículo llegue gratis dentro de la respuesta de otro. Este es el caso donde la señal hace algo que un Disallow no sabe hacer: bloquear el rastreo se llevaría por delante tu ficha en el buscador.
Si un bot concreto merece otras condiciones, se le pone su propio grupo:
User-agent: *
Allow: /
Content-Signal: search=yes, ai-input=yes, ai-train=no
User-agent: GPTBot
Allow: /
Content-Signal: search=yes, ai-input=yes, ai-train=yes
Se aplica la precedencia de siempre del robots.txt: el bot que encuentra su nombre lee ese grupo e ignora del todo el *.
Qué es esto en realidad
Una convención joven. No es un RFC, ni un estándar del W3C, ni algo que ningún rastreador esté obligado a respetar. Nadie ha prometido cumplirlo de una forma que puedas reclamar. Si lees por ahí que Content-Signal protege tu contenido, estás leyendo publicidad.
Entonces por qué escribir la línea.
Porque la lee una máquina y cuesta casi nada: una línea en un fichero que ya sirves y una cabecera en un bloque de configuración que ya tienes. El preámbulo que acompaña a la convención presenta un no como reserva expresa de derechos al amparo del artículo 4 de la Directiva 2019/790 de la UE, la exclusión voluntaria de minería de textos y datos. Si eso se sostiene en tu jurisdicción es pregunta para un abogado. Una preferencia que no has expresado no se sostiene en ninguna.
Y porque dice algo para lo que un Disallow no tiene palabras. «No entrenes conmigo» y «vete» son frases distintas, y hasta ahora solo podías mandar la segunda.
Comprueba que la tuya llega
curl -sI https://ejemplo.com/ | grep -i content-signal
curl -s https://ejemplo.com/robots.txt | grep -i content-signal
Repite el primero contra una página que no sea la portada. Si la cabecera está puesta dentro de un bloque location, puede cubrir menos sitio del que crees.
Uno más, si estás detrás de un CDN:
curl -sI https://ejemplo.com/robots.txt | grep -i "server\|cf-cache-status"
Confirma que el robots.txt que vuelve es el tuyo. El nuestro devolvía 404 desde el origen durante meses mientras Cloudflare respondía en el borde con un fichero de política gestionada que no habíamos escrito nunca, y cada comprobación que hacíamos recibía un 200 de lo más verosímil.