> ## Documentation Index
> Fetch the complete documentation index at: https://docs.querying.ai/llms.txt
> Use this file to discover all available pages before exploring further.

# GEO Score : mesurer ce que la recherche ChatGPT garde d'une page

> Notez une page selon la part de ce qu'une personne y lit que la recherche ChatGPT garde et que ChatGPT reçoit en l'ouvrant, et voyez ce qui retient le reste : robots.txt, un robot refusé, du contenu chargé après l'ouverture de la page et du texte dans les images.

Utilisez GEO Score pour vérifier une page que vous voulez voir citée par ChatGPT. Le score est la part de ce qu'une
personne lit sur la page, texte des images compris, que la recherche ChatGPT garde dans sa copie de la page. `direct`
donne la part que ChatGPT reçoit lorsqu'il ouvre lui-même la page, comme quand quelqu'un lui donne l'URL. Chaque
élément que la recherche ChatGPT ne garde pas est accompagné de sa cause, et `analysis` transforme les causes en
corrections.

## Noter une page

```bash theme={"theme":"css-variables"}
curl -X POST https://api.querying.ai/v1/geo-score \
  -H "Authorization: Bearer $QUERYING_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{ "url": "https://global.oliveyoung.com/product/detail?prdtNo=GA240322874", "country": "US" }'
```

La tâche est acceptée et mise en file d'attente :

```json theme={"theme":"css-variables"}
{
  "success": true,
  "task": {
    "id": "0b6c1f7e-...",
    "taskType": "GEO_SCORE",
    "status": "QUEUED",
    "priority": 1,
    "createdAt": "2026-10-21T09:00:00.000Z"
  },
  "credits": { "creditsToCharge": 0, "creditsCharged": 0 }
}
```

Lisez le résultat avec `GET /v1/async/task/{id}`, ou ajoutez `webhook.url` à la requête pour le recevoir à la fin de
la tâche. La plupart des pages prennent 1 à 3 minutes : interrogez toutes les 10 à 15 secondes. La tâche fonctionne comme
toute autre [tâche asynchrone](/fr/concepts/async-tasks.md) et le résultat se trouve dans `response`. Le schéma de la
requête figure dans la [référence de l'API](/fr/api-reference/geo-score.md).

## Champs de la requête

| Champ | Obligatoire | Description |
| - | - | - |
| `url` | Oui | La page à noter : une URL `http` ou `https` sur un hôte public et le port par défaut, jusqu'à 2 048 caractères. |
| `country` | Non | Le pays du lecteur : `US` (par défaut) ou `KR`. La page est rendue depuis une adresse de ce pays, dans sa langue et son fuseau horaire. |
| `idempotencyKey` | Non | Rend sûr le renvoi d'une soumission. Voir [Idempotence](/fr/concepts/idempotency.md). |
| `priority` | Non | Entier de `1` à `10`, `1` par défaut. Les valeurs hors plage sont ramenées dans la plage. Reprise dans les métadonnées de la tâche ; ne garantit pas l'ordre d'exécution. Voir [Tâches asynchrones](/fr/concepts/async-tasks.md). |
| `webhook.url` | Non | Adresse à laquelle la tâche terminée est envoyée en POST. Voir [Webhooks](/fr/concepts/webhooks.md). |

Tout autre champ renvoie `400 VALIDATION_ERROR`.

## Comment une page est notée

1. **Accès.** robots.txt est lu pour OAI-SearchBot, ChatGPT-User et GPTBot. La page est récupérée sous chacun d'eux
   et comme un navigateur, depuis une adresse aux États-Unis, d'où ChatGPT-User récupère les pages.
2. **Ce que lit une personne.** Un navigateur dans `country` affiche la page et la parcourt jusqu'en bas, et le texte
   de ses grandes images est lu ligne par ligne. Les lignes sur le sujet propre de la page deviennent des éléments. Les
   menus, pieds de page, autres produits, avis de clients, boutons et publicités restent hors du score.
3. **Ce que garde la recherche ChatGPT.** Un navigateur affiche la page sous OAI-SearchBot, le robot qui alimente la
   recherche ChatGPT, depuis une adresse aux États-Unis, sans laisser sortir aucune requête de données. Sa copie est le
   texte du HTML envoyé par le serveur et le texte que les scripts de la page en tirent, texte masqué et texte
   alternatif des images compris. Le texte dans les images et le contenu que la page charge après son ouverture n'y
   figurent pas, pas plus que dans la recherche ChatGPT.
4. **Ce que reçoit ChatGPT en ouvrant la page.** Le HTML que reçoit ChatGPT-User est lu comme le lit le lecteur de
   ChatGPT : son texte, le texte masqué et le texte alternatif des images, sans scripts. Une image compte quand ChatGPT
   peut l'ouvrir et la lire : le HTML donne l'image comme `src` d'un `img`, en JPEG, PNG ou WebP, à une taille où le
   texte reste lisible.
5. **Si ChatGPT ouvre la page.** On demande deux fois à ChatGPT en production d'ouvrir la page. Ses réponses ne sont
   pas notées : elles montrent seulement s'il a ouvert la page.
6. **Placer chaque élément.** Un élément est `read` quand la copie de la recherche le contient, et `missing` avec sa
   raison sinon. `direct` le place de la même façon dans ce que ChatGPT reçoit en ouvrant la page. Le code décide de
   chaque élément, donc une page qui n'a pas changé obtient le même score.

## Lire le résultat

La page OLIVE YOUNG ci-dessus donne ceci, réduit aux champs principaux :

```json theme={"theme":"css-variables"}
{
  "level": "url",
  "url": "https://global.oliveyoung.com/product/detail?prdtNo=GA240322874",
  "finalUrl": "https://global.oliveyoung.com/product/detail?prdtNo=GA240322874",
  "score": 29,
  "direct": { "score": 29, "read": 16 },
  "pageType": "product",
  "access": {
    "verdict": "open",
    "chatgpt": { "opened": true, "inSearch": false, "lines": 819, "searchedFor": [], "observedAt": "2026-10-21T17:35:37.050Z" },
    "search": { "refused": false, "lines": 1343 },
    "robots": {
      "OAI-SearchBot": { "allowed": true, "named": false },
      "ChatGPT-User": { "allowed": true, "named": false },
      "GPTBot": { "allowed": true, "named": false }
    },
    "noindex": { "noindex": false },
    "probes": [
      { "agent": "ChatGPT-User", "status": 200, "blocked": false },
      { "agent": "OAI-SearchBot", "status": 200, "blocked": false },
      { "agent": "browser", "status": 200, "blocked": false }
    ]
  },
  "reading": {
    "score": 29,
    "facts": 55,
    "read": 16,
    "locations": { "html": 16, "rendered_only": 13, "image": 26 },
    "items": [
      {
        "label": "COSRX Vitamin E Vitalizing Sunscreen SPF 50+",
        "value": "COSRX Vitamin E Vitalizing Sunscreen SPF 50+",
        "where": "html",
        "line": 1,
        "status": "read",
        "direct": { "status": "read" }
      },
      {
        "label": "US$24.00",
        "value": "US$24.00",
        "where": "rendered_only",
        "status": "missing",
        "reason": "javascript_only",
        "direct": { "status": "missing", "reason": "javascript_only" }
      },
      {
        "label": "Strong and effective sun protection",
        "value": "Strong and effective sun protection",
        "where": "image",
        "status": "missing",
        "reason": "image_only",
        "direct": { "status": "missing", "reason": "image_only" },
        "foundIn": "image https://cdn-image.oliveyoung.com/slicedImg/editor/1157/f9e08334-....jpg (no alt text): the HTML ChatGPT receives has no img with this picture as its src"
      }
    ]
  },
  "causes": [
    { "reason": "javascript_only", "labels": ["4.6", "21 review", "30%", "US$24.00", "US$16.80", "..."] },
    { "reason": "image_only", "labels": ["Strong and effective sun protection", "Key Ingredients", "..."] }
  ],
  "analysis": {
    "summary": "ChatGPT search keeps 16 of 55 facts of the page. The biggest issue: 26 facts are written only inside an image, among them Strong and effective sun protection; Key Ingredients; Tocopherol (Vitamin E) (47 points). Fixing the confirmed issues could raise the score to about 100.",
    "potential": 100,
    "direct": "When ChatGPT opens the page itself, as when a person gives it the URL, it receives 16 of 55 facts (score 29).",
    "issues": [
      {
        "code": "image_only",
        "basis": "confirmed",
        "points": 47,
        "title": "26 facts are written only inside an image",
        "detail": "People read these values in the page's image, but the HTML has no text for them. ChatGPT search keeps a page's text and its images' alt text, not the text inside its images.",
        "fix": "Write this content as text in the page's HTML, next to the image or in place of it (a size chart as a table, rules and notes as sentences), or at least in the image's alt text.",
        "facts": [{ "label": "Key Ingredients", "value": "Key Ingredients", "foundIn": "image https://cdn-image.oliveyoung.com/... (no alt text): the HTML ChatGPT receives has no img with this picture as its src" }],
        "evidence": ["image https://cdn-image.oliveyoung.com/... (no alt text): the HTML ChatGPT receives has no img with this picture as its src"]
      },
      { "code": "javascript_only", "basis": "confirmed", "points": 24, "title": "13 facts are loaded only after the page opens", "...": "..." }
    ]
  },
  "reference": "rendered"
}
```

### `score`

La part des éléments que garde la recherche ChatGPT, de 0 à 100. Chaque élément pèse autant. Le score vaut 0 quand
robots.txt exclut la page de la recherche ChatGPT et quand le site refuse le robot de la recherche ChatGPT.
`reading.score` garde la part avant que robots.txt ne ramène le score à 0.

### `direct`

Ce que ChatGPT reçoit lorsqu'il ouvre lui-même la page, comme quand quelqu'un lui donne l'URL. `direct.score` est la
part des éléments présents dans le HTML que reçoit ChatGPT-User et dans les images que ChatGPT peut ouvrir, et
`direct.read` les compte. Il vaut 0 quand ChatGPT n'a pas pu ouvrir la page. Les deux scores divergent là où la page
écrit du texte dans des images ou le dessine avec des scripts : la recherche ChatGPT ne garde pas le texte des images
et garde ce que les scripts tirent du HTML, tandis que le lecteur de ChatGPT ouvre les images qu'il peut lire et
n'exécute aucun script. Une page produit alimentaire dont l'étiquette nutritionnelle est un JPEG en taille réelle a
obtenu 56 pour la recherche et 93 en ouverture directe.

### `access`

| `verdict` | Signification |
| - | - |
| `open` | ChatGPT a ouvert la page. `chatgpt.lines` est le nombre de lignes que son lecteur en a tirées. |
| `search_only` | ChatGPT n'a pas pu ouvrir la page et ne l'a trouvée que dans ses résultats de recherche. `direct.score` vaut 0. |
| `blocked` | ChatGPT n'a pas pu ouvrir la page ni la trouver dans la recherche. `direct.score` vaut 0 et `blockedBy` indique qui l'a refusé. |
| `search_opt_out` | robots.txt exclut la page de la recherche ChatGPT, donc le score vaut 0. |

`search.refused` vaut `true` quand le site refuse le robot de la recherche ChatGPT, ce qui ramène le score à 0, et
`search.lines` compte les lignes de la copie de la recherche. `blockedBy` vaut `user_agent` quand le site refuse
l'agent ChatGPT-User depuis n'importe quelle adresse, `openai_addresses` quand il sert cet agent depuis notre adresse
et refuse celles d'OpenAI, et `site` quand il refuse aussi un navigateur. `robots` donne la ligne de robots.txt
décisive pour chaque agent d'OpenAI, `noindex` signale une directive noindex et où elle est posée, et `probes` liste
le statut reçu par chaque récupération.

### `reading.items[]`

Une entrée par élément :

| Champ | Description |
| - | - |
| `label`, `value` | L'élément tel que la page l'affiche. |
| `where` | Où la page l'a : `html`, `structured_data`, `script`, `rendered_only`, `frame` ou `image`. `rendered_only` est sur la page affichée et dans aucun HTML que reçoit ChatGPT. |
| `status` | `read` quand la recherche ChatGPT le garde, sinon `missing`. |
| `reason` | Pourquoi la recherche ChatGPT ne le garde pas (ci-dessous). |
| `direct` | `status` et `reason` pour ce que ChatGPT reçoit en ouvrant la page. |
| `rendering` | `status` dans la copie de la page destinée aux agents IA : `read` quand la copie contient l'élément dans son texte. |
| `foundIn` | Où la page a un élément manquant, comme une ligne du HTML, ou l'URL d'une image et la raison pour laquelle ChatGPT ne peut pas la lire. |

`reading.locations` compte les éléments par `where`, ce qui montre ce qu'il reste à corriger une fois que ChatGPT
peut ouvrir la page. `causes[]` regroupe les éléments manquants par raison.

| `reason` | Signification | Correction |
| - | - | - |
| `blocked` | Le site refuse le robot de la recherche ChatGPT. Dans `direct`, l'élément est dans le HTML ou dans une image que ChatGPT peut lire, et ChatGPT n'a pas pu ouvrir la page. | Laissez passer OAI-SearchBot et ChatGPT-User, par leur agent utilisateur et les adresses publiées par OpenAI. |
| `javascript_only` | La page charge l'élément après son ouverture. Dans `direct`, l'élément n'apparaît qu'après l'exécution des scripts. | Mettez-le dans le HTML envoyé par le serveur, rendu côté serveur ou à la compilation. |
| `structured_data_only` | Il n'est que dans du JSON-LD ou des balises meta. | Affichez-le aussi dans le texte de la page. |
| `image_only` | Il n'est écrit que dans une image, et la recherche ChatGPT ne garde pas le texte des images. Dans `direct`, ChatGPT ne peut pas lire l'image : le HTML ne donne pas l'image comme `src` d'un `img`, le `src` est un fichier plus petit, ou elle est servie en AVIF. | Écrivez-le en texte dans le HTML ou dans le texte alternatif de l'image. |

### `analysis`

`summary` donne le score, le problème principal et le score une fois les problèmes confirmés corrigés (`potential`).
`direct` dit ce que ChatGPT reçoit lorsqu'il ouvre lui-même la page, ou qui l'empêche de l'ouvrir et la correction.
Chaque entrée de `issues[]` contient la cause (`detail`), la correction (`fix`), les éléments qu'elle coûte
(`facts`), ses preuves et les points qu'elle retire au score. Les problèmes d'accès qui bloquent le score à 0 viennent
d'abord, puis le reste par points. `basis` vaut `confirmed` : notre propre lecture de la page (son HTML, ses rendus,
ses images, robots.txt, les réponses HTTP) montre le problème. Le texte de `analysis` est en anglais.

### `markdown`

La page que voit une personne, en Markdown, avec le texte de ses images à la place des images. Le contenu propre de
la page, que le score vérifie, se trouve sous ses titres et libellés. Les menus, avis et autres parties autour sont
repliés en une ligne chacun. Chaque élément que la recherche ChatGPT ne garde pas est marqué à sa place,
`_(missing: …)_` avec la raison, et l'en-tête indique combien d'éléments ChatGPT reçoit en ouvrant la page. L'en-tête
et les marques sont dans la langue de la page : anglais, coréen, japonais, chinois, espagnol, français, allemand ou
portugais, et anglais pour toute autre. Une page en français indique `_(manquant: …)_`. Un extrait de la page OLIVE YOUNG,
qui est en anglais :

```markdown theme={"theme":"css-variables"}
4.6 _(missing: loaded after the page opens)_
21 review _(missing: loaded after the page opens)_
US$16.80 _(missing: loaded after the page opens)_

> **Text in image** f9e08334-9760-45c5-89bb-…66eb1752.jpg · 52 lines · ChatGPT search keeps 10 of its 37 pieces
>
> Strong and effective sun protection _(missing)_
> Key Ingredients _(missing)_
> Tocopherol (Vitamin E) _(missing)_

_Other items (112 lines), reviews and questions (90), site menus and notices (57), buttons and tabs (46): Most Helpful · filter · Best …_
```

### `screenshot`

Les quatre premiers écrans de la page telle qu'une personne la voit, en JPEG : une fenêtre de 1366×900, capturée en
haut après avoir fait défiler la page jusqu'au bout. `url` sert de clé d'accès et ouvre le fichier jusqu'à
`expiresAt`, 30 jours après la tâche. Une page dont l'image n'a pas pu être capturée arrive sans `screenshot`, et
une image qui n'a pas pu être enregistrée a `status: "failed"`.

### `rendering`

La page rendue pour les agents IA. La copie est le HTML qu'a dessiné le navigateur d'une personne, sans scripts, avec
le texte de chaque image ajouté à son texte alternatif, celui que les WCAG demandent pour une image de texte.
`rendering.score` est la part des éléments que la copie contient dans son texte : ce que reçoit un agent IA à qui
l'on sert la copie, sans ouvrir aucune image. `rendering.read` les compte et `reading.items[].rendering` marque chaque
élément ; la copie elle-même ne fait pas partie du résultat. La page OLIVE YOUNG ci-dessus contient ses 55
éléments dans sa copie, soit un score de 100 : le texte de ses images d'ingrédients et de FAQ en texte alternatif, et
les prix et notes que ses scripts chargent.

```json theme={"theme":"css-variables"}
{
  "screenshot": { "status": "ok", "url": "https://api.querying.ai/v1/evidence/1792627200-0f1e….jpg", "expiresAt": "2026-11-21T04:05:43.048Z" },
  "rendering": {
    "score": 100,
    "read": 55
  }
}
```

`rendering` est absent quand aucun navigateur n'a pu afficher la page ou que son HTML dessiné est trop volumineux.

## Bien lire le score

* La recherche ChatGPT travaille sur une copie de la page faite par son robot : le texte du HTML et ce que les
  scripts en tirent, sans le texte des images ni ce que la page charge après son ouverture. La copie date du dernier
  passage du robot, donc une modification n'atteint la recherche ChatGPT qu'une fois la page récupérée à nouveau.
* Quand ChatGPT ouvre lui-même une page, il lit le HTML envoyé par le serveur. Il n'exécute aucun script, lit le
  texte alternatif des images et n'ouvre une image que par le `src` du `img` que donne ce HTML. OpenAI réutilise une
  page qu'il a ouverte pendant environ 30 minutes.
* Le score ne bouge que si la page ou sa façon de s'afficher change. Sur quinze pages notées trois fois chacune, dix
  ont varié de 3 points ou moins. Une page qui affiche des parties différentes à chaque visite varie davantage.
* GEO Score mesure ce que ChatGPT a d'une page. Les pages que la recherche ChatGPT choisit pour une question sont
  suivies par les [moniteurs GEO](/fr/monitors.md).

## Erreurs et facturation

Une tâche terminée coûte 10 crédits pour la page et 5 pour chaque image dont le texte est lu, jusqu'à 12 images :
`images.read` dans le résultat. Une image refusée par l'hôte ou illisible (`images.unread`) est gratuite. Si votre compte a lu la même image au cours des 90 derniers jours, cette lecture est réutilisée (`images.reused`) pour 2 crédits. La soumission
réserve 70 crédits, le maximum d'une page, et la fin de la tâche facture ce qu'elle a utilisé. Une tâche échouée n'est
pas facturée. Voir [Crédits et limites](/fr/concepts/credits-and-limits.md).

### Refus à la soumission

| Statut | Code | Cause |
| - | - | - |
| `400` | `VALIDATION_ERROR` | Le corps n'est pas un objet JSON, contient un champ autre que ceux ci-dessus, ou `idempotencyKey`, `priority` ou `webhook` a un mauvais type. |
| `400` | `USE_DEDICATED_ENDPOINT` | `GEO_SCORE` a été envoyé à `/v1/async/task`. |
| `402` | `INSUFFICIENT_CREDITS` | Le solde est inférieur à 70 crédits, le maximum d'une page. |
| `409` | `RESOURCE_ALREADY_EXISTS` | Une tâche avec cet `idempotencyKey` existe déjà. |
| `422` | `VALIDATION_ERROR` | `url` manque, n'est pas `http` ou `https`, ou désigne un hôte ou un port privé. `details` nomme le champ. |
| `422` | `REGION_UNSUPPORTED` | `country` n'est ni `US` ni `KR`. |

Les erreurs d'authentification, de concurrence et de débit sont les mêmes que pour toute tâche. Voir [Erreurs](/fr/concepts/errors.md).

### Tâches échouées

Une tâche échouée a `status: "FAILED"` et une chaîne `error` qui commence par son code :

```json theme={"theme":"css-variables"}
{
  "success": true,
  "task": { "id": "0b6c1f7e-...", "taskType": "GEO_SCORE", "status": "FAILED", "...": "..." },
  "credits": { "creditsToCharge": 0, "creditsCharged": 0 },
  "error": "PAGE_UNAVAILABLE: No browser could show the page (bot wall)"
}
```

| Code | Signification | Que faire |
| - | - | - |
| `PAGE_UNAVAILABLE` | Aucun navigateur n'a pu afficher la page telle qu'une personne la voit ou telle que la copie le robot de la recherche ChatGPT : contrôle anti-robot, statut d'erreur ou page inexistante. Le message en donne la raison. | Vérifiez que l'URL s'ouvre dans un navigateur. La même URL échoue de nouveau de la même façon. |
| `CHATGPT_UNAVAILABLE` | ChatGPT n'a répondu à temps à aucune demande d'ouvrir la page. | Renvoyez la tâche. |
| `NO_IP_AVAILABLE` | Aucune capacité n'était disponible à temps. | Réessayez plus tard. |
| Tout autre code | La page n'a pas pu être notée. | Réessayez. |

## Étapes suivantes

> **[Citation Analysis](/fr/research/citation-analysis.md)**
>
> Voyez quelles sources ont façonné une réponse.

> **[Moniteurs GEO](/fr/monitors.md)**
>
> Suivez votre marque dans les moteurs d'IA selon un calendrier.


This documentation is built and hosted on [Mintlify](https://mintlify.com), a developer documentation platform.