
# 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

```bash
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:

```bash
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.

[Genera tu Content-Signal](/es/tools/content-signal-generator) · [Genera tu robots.txt](/es/tools/robots-txt-generator)
