> ## 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.

# Moteurs de recherche IA : réponses, citations et champs de réponse

> Chaque taskType : quel champ du payload il lit, ce qu'il renvoie et quels flags include ont un effet réel.

`taskType` sélectionne le moteur. L'enveloppe autour du résultat est identique pour tous ; ce qui varie, c'est l'objet
`response` qu'elle contient.

<Note>
  **Neuf surfaces de réponse sont disponibles** : `CHATGPT`, `GEMINI`, `PERPLEXITY`, `BING_COPILOT`, `GOOGLE`,
  `AIMODE`, `BING_SEARCH`, `NAVER_AI_BRIEF` et `NAVER_AI_TAB`. `GOOGLE_SERP` renvoie les résultats Google sans
  l'AI Overview, `NAVER_SERP` renvoie les résultats web de Naver et `REDDIT` renvoie des publications et commentaires Reddit.
</Note>

## Quel champ du payload chaque moteur lit

La validation accepte `prompt` ou `query`, et chaque moteur se rabat sur l'autre : une requête envoyée avec la
« mauvaise » clé s'exécute quand même. Les deux cartes ci-dessous indiquent le champ que chaque moteur lit **en
premier** : celui que documente la référence de l'API et celui qu'envoie le Playground du tableau de bord.

<CardGroup cols={2}>
  <Card title="Lit prompt" icon="message-square">
    `CHATGPT` `PERPLEXITY` `GEMINI` `BING_COPILOT`

    Se rabat sur `query` si `prompt` est absent.
  </Card>

  <Card title="Lit query" icon="search">
    `GOOGLE` `AIMODE` `GOOGLE_SERP` `NAVER_AI_BRIEF` `NAVER_AI_TAB` `NAVER_SERP` `BING_SEARCH` `REDDIT`

    Se rabat sur `prompt` si `query` est absent.
  </Card>
</CardGroup>

## Options de réponse

Les réponses brutes sont incluses par défaut pour tous les moteurs de réponse. Mettez `payload.include.rawResponse` à
`false` pour les omettre. Les autres options varient selon le moteur :

| Moteur | Flags respectés | Emplacement du brut |
| - | - | - |
| `CHATGPT` | `markdown` `html` `rawResponse` `searchQueries` `ads` `shopping` | `rawResponse` |
| `PERPLEXITY` | `markdown` `rawResponse` `searchQueries` | `rawResponse` |
| `GEMINI` | `markdown` `rawResponse` | `rawResponse` |
| `BING_COPILOT` | `markdown` `rawResponse` | `rawResponse` |
| `BING_SEARCH` | `markdown` `rawResponse` | **`rawContent`** (HTML de la page de résultats) |
| `GOOGLE_SERP` | `rawResponse` (désactivé par défaut) | **`rawContent`** (HTML de la page de résultats) |
| `GOOGLE` `AIMODE` `NAVER_AI_BRIEF` `NAVER_AI_TAB` | `rawResponse` | **`rawContent`** |
| `NAVER_SERP` `REDDIT` | aucun | pas de charge brute |

<Note>
  `rawResponse` contient des événements de flux analysés. Google AI Overviews, AI Mode et Bing Search renvoient le HTML
  complet de la page rendue dans `rawContent` ; Naver renvoie le flux d'événements d'origine sous forme de chaîne
  `rawContent`. Ces champs peuvent être volumineux. Utilisez `include.rawResponse: false` si seul le résultat structuré
  vous intéresse. `GOOGLE_SERP` fait exception : il ne renvoie le HTML de la page que si vous définissez `include.rawResponse: true`.
</Note>

`markdown` n'est pas un flag pour tous les moteurs qui le renvoient : Naver envoie toujours `markdown`, car c'est pour
lui la vraie forme de la réponse et non une copie de `text`.

<Warning>
  Un flag non respecté est ignoré silencieusement : ni erreur, ni champ. En particulier, `html` n'est produit que par
  `CHATGPT`, même si plusieurs moteurs acceptent le flag.
</Warning>

## Formes de réponse

<AccordionGroup>
  <Accordion title="PERPLEXITY">
    Lit `prompt`. Renvoie toujours `text` et `sources[]`.

    ```json theme={null}
    {
      "text": "...",
      "sources": [{ "position": 1, "url": "https://...", "label": "...", "description": "..." }],
      "markdown": "...",
      "rawResponse": ["..."],
      "related_queries": ["..."],
      "search_model_queries": ["..."]
    }
    ```

    Extras facultatifs quand Perplexity les affiche : `videos`, `images`, `hotels`, `places`, `shopping_cards`.
  </Accordion>

  <Accordion title="GEMINI">
    Lit `prompt`. Renvoie toujours `text` et `sources[]`.

    ```json theme={null}
    {
      "text": "...",
      "sources": [{ "position": 1, "url": "https://...", "label": "...", "confidence_level": "..." }],
      "markdown": "...",
      "rawResponse": ["..."],
      "model": "...",
      "shoppingCards": [{ "title": "...", "position": 1, "price": { "value": 249.99, "currency": "$", "raw": "$249.99" }, "store": "...",
                         "rating": 4.7, "reviews": "14292", "thumbnail": "https://...", "productLink": "https://google.com/search?...&ibp=oshop..." }],
      "inlineProducts": [{ "title": "...", "position": 1, "productLink": "https://google.com/search?...&ibp=oshop..." }]
    }
    ```

    Quand la réponse affiche des produits, `shoppingCards` (les cartes produit que Gemini dessine dans la réponse) et `inlineProducts` (les noms de produit liés dans ses phrases) les portent avec les mêmes champs que l'aperçu GOOGLE. Les noms des cartes restent dans `text` et les liens produit pointent vers la page produit de Google.
  </Accordion>

  <Accordion title="GOOGLE : AI Overview dans une enveloppe SERP">
    Lit `query`. Ce n'est **pas** un objet AI Overview isolé : c'est une enveloppe de résultats de recherche qui porte
    l'AI Overview comme un membre nullable.

    ```json theme={null}
    {
      "aioverview": {
        "text": "...",
        "sources": [{ "position": 1, "url": "https://..." }],
        "shoppingCards": [{ "title": "...", "position": 1, "price": { "value": 299.99, "currency": "$", "raw": "$299.99" },
                            "oldPrice": { "value": 399.99, "currency": "$", "raw": "$399.99" }, "store": "...",
                            "rating": 4.5, "reviews": "2.3K", "thumbnail": "https://...", "productLink": "https://www.google.com/search?ibp=oshop..." }],
        "inlineProducts": [{ "title": "...", "position": 1, "productLink": "https://www.google.com/search?ibp=oshop..." }]
      },
      "organicResults": [{ "...": "..." }],
      "peopleAlsoAsk": [{ "...": "..." }],
      "relatedSearches": [{ "...": "..." }],
      "knowledgeGraph": { "...": "..." },
      "ads": [{ "...": "..." }],
      "serp": { "topStories": [], "videoResults": [], "localResults": [] }
    }
    ```

    <Warning>
      `aioverview: null` est le signal documenté que **Google n'a pas affiché d'AI Overview** pour cette requête. Ce n'est
      pas une erreur, et les champs SERP autour restent renseignés.
    </Warning>

    `text` et `sources` de premier niveau sont des **alias obsolètes** qui dupliquent `aioverview.text` et
    `aioverview.sources`. Ils existent pour que les consommateurs de l'ancienne forme AIO isolée continuent de fonctionner.
    Lisez `aioverview.*` dans le nouveau code.

    Les panneaux SERP sont **omis** lorsqu'ils sont absents, au lieu d'être émis comme `null` ou `[]` : traitez-les tous comme facultatifs.

    `aioverview.shoppingCards` et `aioverview.inlineProducts` n'apparaissent que lorsque l'aperçu affiche des produits. Les cartes sont les vignettes produit que Google dessine à côté de la réponse ; les produits en ligne sont les noms de produit liés dans ses phrases. Les titres des cartes sont aussi conservés dans `aioverview.text`. `price.currency` est le symbole tel qu'affiché (`$`, `₩`, `円`), `reviews` garde l'abréviation de Google (`2.3K`) et `productLink` est la page produit de Google.
  </Accordion>

  <Accordion title="AIMODE : Google AI Mode">
    Lit `query`. Forme fixe, sans markdown.

    ```json theme={null}
    {
      "text": "...",
      "sources": [{ "position": 1, "url": "https://...", "label": "..." }],
      "shoppingCards": [{ "...": "..." }],
      "inlineProducts": [{ "...": "..." }]
    }
    ```

    `shoppingCards` et `inlineProducts` n'apparaissent que lorsque la réponse affiche des produits, avec les mêmes champs que l'aperçu GOOGLE.
  </Accordion>

  <Accordion title="GOOGLE_SERP : résultats Google sans l'AI Overview">
    Lit `query`. Renvoie une page de résultats google.com dans la même enveloppe que `GOOGLE`, sans l'AI Overview : pas de
    `aioverview`, `text` ni `sources`. Il n'attend pas d'overview, répond donc plus vite que `GOOGLE` et coûte 1 crédit.
    Définissez `payload.page` (1-10) pour des pages plus profondes.

    ```json theme={null}
    {
      "organicResults": [
        { "position": 11, "title": "...", "link": "https://...", "displayedLink": "...", "snippet": "...", "page": 2 }
      ],
      "peopleAlsoAsk": [{ "...": "..." }],
      "relatedSearches": [{ "...": "..." }],
      "ads": [{ "...": "..." }],
      "page": 2
    }
    ```

    `organicResults` est toujours présent. `position` compte à travers les pages : le premier résultat de la page 2 est
    donc le 11, et chaque ligne porte la `page` dont elle provient. Un `organicResults` vide signifie que Google lui-même
    n'a renvoyé aucun résultat pour la requête. Les autres panneaux sont omis si la page n'en contient pas. Définissez
    `include.rawResponse: true` pour recevoir aussi le HTML de la page dans `rawContent`.
  </Accordion>

  <Accordion title="NAVER_SERP : résultats de recherche Naver">
    Lit `query`. Renvoie une page de résultats de documents web de Naver (l'onglet 웹문서), 15 documents par page, pour
    1 crédit. Définissez `payload.page` (1-10) pour des pages plus profondes. `country` vaut `KR` par défaut.

    ```json theme={null}
    {
      "organicResults": [
        { "position": 16, "title": "...", "link": "https://...", "displayedLink": "example.com›path",
          "snippet": "...", "page": 2 }
      ]
    }
    ```

    `position` compte à travers les pages : le premier document de la page 2 est donc le 16. Un `organicResults` vide dans
    une tâche terminée signifie que Naver n'a renvoyé aucun document. Quand Naver masque les résultats derrière sa
    vérification d'âge, la réponse contient aussi un `notice` dont le `type` vaut `age_verification_required`.

    Pour lire une page Naver au lieu de chercher, envoyez `"action": "page"` avec une `url` naver.com (blog, cafe,
    actualités, terms, kin ou toute autre page naver.com). La réponse est `{ type, url, title, text, images, truncated }`,
    plus `author`, `publishedAt` ou `cafeName` quand la page les contient. `text` est tronqué à `maxChars` (1 000-50 000,
    20 000 par défaut). Seules les URL https naver.com sont acceptées (422 sinon), et une redirection qui sort de naver.com
    fait échouer la tâche. Il en va de même pour un article de cafe réservé aux membres.

    Ce moteur ne renvoie pas de charge brute : les flags `include` n'ont donc aucun effet.
  </Accordion>

  <Accordion title="REDDIT : publications, commentaires et flux Reddit">
    Lit `query` et recherche des publications Reddit pour 1 crédit. Ajoutez `subreddit` (le nom sans `r/`) pour chercher dans un seul subreddit.

    ```json theme={null}
    {
      "results": [
        { "postId": "1uzk9m4", "title": "...", "url": "https://www.reddit.com/r/.../comments/1uzk9m4/...",
          "subreddit": "AskRunningShoeGeeks", "preview": "..." }
      ]
    }
    ```

    Envoyez l'`url` d'une publication (`https://www.reddit.com/r/{subreddit}/comments/{postId}/...`) au lieu de `query`
    pour la lire avec sa première page de commentaires, environ 20 à 25. `commentSort` (`top` par défaut, ou `new`,
    `controversial`, `old`, `qa`) trie cette page et `commentMaxDepth` écarte les réponses plus profondes (`0` ne garde
    que les commentaires de premier niveau).

    ```json theme={null}
    {
      "post": { "postId": "1uer62n", "title": "...", "body": "...", "author": "...", "subreddit": "...",
                "score": 12, "upvoteRatio": 0.9, "commentCount": 48, "createdAt": "2026-06-24T21:51:21.586000+0000",
                "archived": false, "url": "https://www.reddit.com/r/..." },
      "comments": {
        "availableCount": 24, "returnedCount": 24,
        "items": [{ "commentId": "otlz8m5", "author": "...", "body": "...", "score": 5, "depth": 0,
                    "isSubmitter": false, "createdAt": "...", "url": "https://www.reddit.com/r/..." }]
      }
    }
    ```

    `post.commentCount` est le nombre total de commentaires de la publication ; `comments` contient la page lue.
    `archived` est estimé à partir de l'âge de la publication (Reddit verrouille les commentaires après environ 180 jours).
    `"action": "feed"` liste les publications les plus récentes de `subreddit` (r/popular s'il est omis), et
    `"action": "user_posts"` avec `username` liste ce que cet utilisateur a publié ; tous deux renvoient `results` comme
    une recherche, jusqu'à `limit` (25 par défaut).

    Un `results` vide dans une tâche terminée signifie que Reddit n'a rien trouvé. Ce moteur ne renvoie pas de
    charge brute : les flags `include` n'ont donc aucun effet.
  </Accordion>

  <Accordion title="CHATGPT">
    Lit `prompt`. La réponse la plus riche de l'API, et la seule où tous les flags `include` fonctionnent. Tous les flags
    sont activés par défaut.

    ```json theme={null}
    {
      "text": "...",
      "model": "...",
      "sources": [{ "position": 1, "url": "https://...", "label": "...", "footnote": "...", "datePublished": "..." }],
      "markdown": "...",
      "html": "...",
      "rawResponse": ["..."],
      "searchQueries": ["..."],
      "shoppingCards": [{ "...": "..." }],
      "inlineProducts": [{ "...": "..." }],
      "ads": [{ "...": "..." }],
      "entities": { "...": "..." },
      "citationPills": [{ "...": "..." }]
    }
    ```

    ChatGPT prend aussi en charge les conversations à plusieurs tours : voir la section Plusieurs tours ci-dessous.
  </Accordion>

  <Accordion title="BING_COPILOT : Bing Copilot">
    Lit `prompt`. Renvoie la réponse du chat Copilot sur copilot.com, avec la recherche web toujours activée. Aucun compte
    ni connexion n'est utilisé. `COPILOT` est toujours accepté et s'exécute comme `BING_COPILOT`.

    ```json theme={null}
    {
      "text": "Solar panels cut electricity bills ...",
      "sources": [{ "position": 1, "url": "https://...", "label": "..." }],
      "shoppingCards": [{ "type": "shoppingProducts", "layout": "inline", "products": [{ "position": 1, "name": "...", "url": "https://...", "price": { "amount": 69, "currencySymbol": "$" } }] }],
      "map": [{ "position": 1, "name": "...", "placeId": "...", "location": { "address": "...", "latitude": 40.75, "longitude": -73.98 }, "layerLabel": "..." }],
      "searchQueries": ["..."],
      "markdown": "...",
      "rawResponse": [{ "event": "appendText", "text": "..." }]
    }
    ```

    `sources` sont les pages citées par Copilot ; les questions d'achat n'en citent souvent aucune et renvoient à la place
    des fiches produit, donc `sources: []` est une réponse normale. `shoppingCards`, `map` et `searchQueries` sont toujours
    présents, et vides quand Copilot ne les a pas produits. Les positions des produits se suivent sur toutes les fiches.
    `markdown` est renvoyé quand `include.markdown` vaut `true`.
  </Accordion>

  <Accordion title="BING_SEARCH : résultats Bing avec résumé IA">
    Lit `query`. Renvoie la page de résultats bing.com dans la même enveloppe que `GOOGLE` : résultats organiques,
    annonces et recherches associées, avec le résumé IA que Bing affiche au-dessus sous `aioverview`. Aucun compte ni
    connexion n'est utilisé. `BING` et `BING_COPILOT_SEARCH` sont toujours acceptés et s'exécutent comme `BING_SEARCH`.

    ```json theme={null}
    {
      "surface": "bing_search",
      "organicResults": [
        { "position": 1, "title": "...", "link": "https://...", "displayedLink": "...", "snippet": "...", "date": "Aug 3, 2026", "page": 1 }
      ],
      "ads": [{ "position": 1, "title": "...", "link": "https://...", "displayedLink": "...", "description": "...", "blockPosition": "top" }],
      "relatedSearches": [{ "query": "...", "link": "https://www.bing.com/search?q=..." }],
      "aioverview": {
        "text": "Heat pumps move heat instead of generating it [1]. ...",
        "sources": [{ "position": 1, "url": "https://...", "label": "..." }],
        "citationPills": [
          { "citationPillId": 1, "position": 1, "url": "https://...", "label": "...", "domain": "example.com" }
        ],
        "markdown": "..."
      },
      "rawContent": "<!DOCTYPE html>..."
    }
    ```

    <Warning>
      `aioverview: null` signifie que **Bing n'a pas affiché de résumé IA** pour cette requête. Ce n'est pas une erreur, et
      les champs de résultats autour restent renseignés.
    </Warning>

    Dans `aioverview.text`, `[n]` renvoie à `sources[n-1]`. Chaque entrée de `citationPills[]` est une source derrière une
    citation en ligne ; les sources citées ensemble partagent un `citationPillId`. Le champ est omis si le résumé n'a pas
    de citation en ligne. `markdown` conserve titres, listes et tableaux, et est renvoyé quand `include.markdown` vaut `true`.

    Quand Bing affiche un résumé, il déplace la plupart des résultats organiques vers la page suivante : attendez-vous à
    deux ou trois `organicResults` avec un résumé et environ neuf sans. `ads` et `relatedSearches` sont omis si la page
    n'en contient pas. `rawContent` est la page de résultats complète ; définissez `include.rawResponse: false` pour
    l'omettre. `text` et `sources` de premier niveau sont des copies obsolètes de `aioverview.text` et
    `aioverview.sources` (vides en l'absence de résumé).

    Bing ne rédige pas de résumé pour chaque requête. Les questions de type recherche (« comment fonctionne une pompe à
    chaleur par temps froid ») en obtiennent bien plus souvent que les consignes (« Explique deux avantages… »), et la
    couverture hors anglais est limitée.
  </Accordion>

  <Accordion title="NAVER_AI_BRIEF et NAVER_AI_TAB">
    Tous deux lisent `query` et partagent la même forme de réponse.

    ```json theme={null}
    {
      "text": "...",
      "sources": [{ "position": 1, "url": "https://...", "label": "...", "description": "..." }]
    }
    ```

    `NAVER_AI_BRIEF` est l'encadré de résumé IA conditionnel de la SERP Naver ; il peut ne pas apparaître pour une requête
    donnée. `NAVER_AI_TAB` est l'onglet IA conversationnel toujours disponible et la surface principale de Naver ; son
    `text` est au format markdown.

    `NAVER_AI_BRIEF` renvoie aussi les documents web organiques situés sous l'encadré de résumé, dans `organicResults`, le
    même champ que `GOOGLE` fournit à côté de son AI Overview :

    ```json theme={null}
    {
      "organicResults": [
        { "position": 1, "title": "...", "link": "https://...", "displayedLink": "example.com",
          "snippet": "...", "date": "2026.7.30.", "page": 1 }
      ]
    }
    ```

    Le résumé et les documents proviennent de deux endpoints Naver différents : `NAVER_AI_BRIEF` coûte donc 2 crédits,
    comme `NAVER_AI_TAB`. Si la récupération des documents échoue, le champ est absent plutôt que vide.

    <Note>
      `NAVER` est un alias obsolète de `NAVER_AI_BRIEF`. Utilisez le nom explicite.
    </Note>
  </Accordion>
</AccordionGroup>

## Plusieurs tours (ChatGPT)

ChatGPT peut tenir une conversation. Omettez les deux champs pour le comportement par défaut en un seul tour.

<Steps>
  <Step title="Démarrer un fil">
    Envoyez `newConversation: true`. La réponse contient un `conversationId`.

    ```json theme={null}
    { "taskType": "CHATGPT", "payload": { "prompt": "...", "newConversation": true } }
    ```
  </Step>

  <Step title="Le poursuivre">
    Renvoyez ce `conversationId` au tour suivant.

    ```json theme={null}
    { "taskType": "CHATGPT", "payload": { "prompt": "...", "conversationId": "..." } }
    ```
  </Step>
</Steps>

<Warning>
  Les conversations sont liées à l'appareil qui les a créées et expirent après environ deux heures. Un
  `conversationId` périmé ne peut pas être repris.
</Warning>

## Guides des moteurs

* [ChatGPT](https://querying.ai/fr/engines/chatgpt)
* [Gemini](https://querying.ai/fr/engines/gemini)
* [Perplexity](https://querying.ai/fr/engines/perplexity)
* [Bing Copilot](https://querying.ai/fr/engines/bing-copilot)
* [Google AI Overviews](https://querying.ai/fr/engines/google-ai-overviews)
* [Google AI Mode](https://querying.ai/fr/engines/google-ai-mode)
* [Naver AI Brief](https://querying.ai/fr/engines/naver-ai-brief)
* [Naver AI Tab](https://querying.ai/fr/engines/naver-ai-tab)
