
# Content-Signal : ce que l'IA a le droit de faire

Le `robots.txt` répond à une seule question et n'en a jamais traité d'autre : as-tu le droit de télécharger ceci. Oui ou non, chemin par chemin, bot par bot. Il n'a aucun vocabulaire pour la position que tiennent réellement la plupart des éditeurs : indexe-moi, cite-moi, envoie-moi des lecteurs, mais n'entraîne pas un modèle sur ce que j'écris.

Alors on tire sur le seul levier disponible. On `Disallow` tout, et le trafic part avec l'entraînement.

## Autoriser la récupération n'est pas autoriser l'usage

Ce sont deux questions distinctes, et une seule concerne votre bande passante. Un crawler qui lit votre page de tarifs et la cite quand quelqu'un demande quoi acheter vous rend service. Les mêmes octets versés dans un corpus d'entraînement, c'est une tout autre transaction, et vous n'y êtes pas partie.

Tout bloquer réduit les deux à un seul « non ». Pour une archive payante, c'est peut-être le bon choix. Pour une entreprise qui veut être trouvée et recommandée, c'est le mauvais réglage par défaut : vous disparaissez des réponses, vos concurrents non.

Content-Signal est la couche qui permet de séparer les deux.

## Les trois signaux

```
Content-Signal: search=yes, ai-input=yes, ai-train=no
```

- **`search`** : constituer un index de recherche et renvoyer des résultats, c'est-à-dire des liens et de courts extraits. Pas les résumés générés par une IA, qui relèvent du signal suivant.
- **`ai-input`** : passer votre page à un modèle au moment de répondre. RAG, ancrage, les sources listées sous une réponse générée.
- **`ai-train`** : entraîner ou affiner un modèle sur votre contenu.

Ils sont indépendants. Toutes les combinaisons sont valides, et plusieurs d'entre elles sont des positions réfléchies plutôt que des erreurs.

Les valeurs sont `yes` et `no`. Pas de `maybe`, pas de syntaxe par chemin, pas de date d'expiration.

Omettre un signal ne vaut pas `no`. Selon la convention, un usage sur lequel vous ne dites rien n'est ni accordé ni restreint : vous n'avez simplement pas répondu. Notre générateur écrit les trois à chaque fois, et c'est la bonne habitude, parce que le silence est la seule réponse dont personne ne peut rien faire.

## Où ça se met

À deux endroits, et les deux coûtent peu.

Dans le robots.txt, à l'intérieur d'un groupe user-agent :

```
User-agent: *
Allow: /
Content-Signal: search=yes, ai-input=yes, ai-train=no

Sitemap: https://exemple.com/sitemap.xml
```

Et en en-tête de réponse HTTP :

```
Content-Signal: search=yes, ai-input=yes, ai-train=no
```

agentready.md sert les deux. Cet en-tête exact part sur chaque réponse : chaque page, chaque version `.md`, chaque appel d'API.

Pour nginx :

```
add_header Content-Signal "search=yes, ai-input=yes, ai-train=no" always;
```

Pour Apache :

```
<IfModule mod_headers.c>
  Header set Content-Signal "search=yes, ai-input=yes, ai-train=no"
</IfModule>
```

L'en-tête mérite sa place. Le robots.txt se demande à la racine, de temps en temps, et un agent qui atterrit sur une URL profonde parce qu'on lui a collé un lien ne le lira peut-être jamais. L'en-tête, lui, voyage collé à ce qu'on emporte.

Il existe aussi une forme en balise meta, `<meta name="content-signal" content="search=yes, ai-input=yes, ai-train=no">`. Utilisez-la quand la configuration du serveur vous échappe. L'en-tête reste préférable : il couvre aussi les réponses qui ne sont pas du HTML.

## Trois cas réels

**Un éditeur qui veut de l'attribution.**

```
Content-Signal: search=yes, ai-input=yes, ai-train=no
```

Figurer dans une réponse avec un lien, c'est de la diffusion, l'équivalent moderne d'être cité. L'entraînement est la partie que personne ne paie et qui ne renvoie personne chez vous.

**Un SaaS qui veut être recommandé.**

```
Content-Signal: search=yes, ai-input=yes, ai-train=yes
```

Documentation, tarifs, changelog. Quand quelqu'un demande à un assistant quoi utiliser pour une tâche, vous voulez être la réponse, et être dans les données d'entraînement est ce qui fait qu'on vous nomme même quand le modèle ne télécharge rien. Il n'y a rien à protéger ici. Ce matériel est du marketing.

**Une archive payante.**

```
Content-Signal: search=yes, ai-input=no, ai-train=no
```

Vous voulez être trouvable, parce que le résultat de recherche est l'argument de vente. Vous ne voulez pas que la substance de l'article arrive gratuitement dans la réponse de quelqu'un d'autre. C'est le cas où le signal fait un travail qu'un `Disallow` ne sait pas faire : bloquer le crawl emporterait aussi votre fiche dans le moteur.

Si un bot mérite d'autres conditions, il reçoit son propre groupe :

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

La précédence habituelle du robots.txt s'applique : un bot qui trouve son propre nom lit ce groupe-là et ignore complètement le `*`.

## Ce que c'est vraiment

Une convention jeune. Ni RFC, ni standard du W3C, ni quoi que ce soit qu'un crawler soit tenu de respecter. Personne n'a promis de s'y conformer d'une manière que vous pourriez faire valoir. Si vous lisez que Content-Signal protège votre contenu, vous lisez de la publicité.

Alors pourquoi écrire cette ligne.

Parce qu'elle est lisible par une machine et ne coûte presque rien : une ligne dans un fichier que vous servez déjà, un en-tête dans un bloc de configuration que vous avez déjà. Le préambule qui accompagne la convention présente un `no` comme une réserve expresse de droits au titre de l'article 4 de la directive européenne 2019/790, l'opt-out de fouille de textes et de données. Savoir si cela tient dans votre juridiction est une question d'avocat. Une préférence que vous n'avez pas exprimée ne tient nulle part.

Et parce qu'elle dit une chose pour laquelle un `Disallow` n'a pas de mots. « Ne t'entraîne pas sur moi » et « va-t'en » sont deux phrases différentes, et jusqu'ici vous ne pouviez envoyer que la seconde.

## Vérifiez que le vôtre arrive

```bash
curl -sI https://exemple.com/ | grep -i content-signal
curl -s https://exemple.com/robots.txt | grep -i content-signal
```

Refaites la première commande sur une page qui n'est pas l'accueil. Si l'en-tête est posé dans un bloc `location`, il couvre peut-être moins de site que vous ne croyez.

Une dernière, si vous êtes derrière un CDN :

```bash
curl -sI https://exemple.com/robots.txt | grep -i "server\|cf-cache-status"
```

Vérifiez que le robots.txt qui revient est bien le vôtre. Le nôtre renvoyait `404` depuis l'origine pendant des mois pendant que Cloudflare répondait en périphérie avec un fichier de politique gérée que nous n'avions jamais écrit, et chaque contrôle recevait un `200` parfaitement crédible.

[Générez votre Content-Signal](/fr/tools/content-signal-generator) · [Générez votre robots.txt](/fr/tools/robots-txt-generator)
