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

# Source Influence

> Quels paragraphes d'une page citée correspondent à quelles parties d'une réponse IA, avec des plages exactes, une courte explication pour chaque lien et de courts résumés construits à partir de ces liens

Comparez une réponse IA terminée avec ses sources citées. Le résultat est une carte compacte : les paragraphes de
chaque page source inclus dans le résultat, les parties de la réponse auxquelles ils correspondent, une explication
pour chaque lien et de courts résumés construits à partir de ces liens.

Il s'agit d'une analyse de correspondance a posteriori d'une réponse existante : elle ne prouve pas qu'une source a
amené le modèle à générer une phrase, et elle ne note pas la qualité d'une page. Considérez-la comme un élément à
examiner, pas comme un verdict.

```bash theme={null}
curl -X POST https://api.querying.ai/v1/source-influence \
  -H "Authorization: Bearer $QUERYING_API_KEY" -H "Content-Type: application/json" \
  -d '{
    "answer": "…the AI answer, as raw markdown…",
    "prompt": "best password manager for a small team",
    "engine": "CHATGPT",
    "brand": "1Password",
    "competitors": ["Bitwarden"],
    "citations": [
      { "url": "https://example.com/best-password-managers", "body": "…the page markdown…" },
      { "url": "https://another.example.com/pricing" }
    ]
  }'
```

Interrogez `GET /v1/async/task/:id` ou fournissez `webhook.url` à la soumission ; la tâche indique
`taskType: "SOURCE_INFLUENCE"`. Ne soumettez pas cette analyse via `POST /v1/async/task` : utilisez l'endpoint dédié.
`POST /v1/research` et le type de tâche `CITATION_ATTRIBUTION` sont les noms d'avant septembre 2026 et fonctionnent
toujours comme alias obsolètes.

### Analyser une tâche déjà exécutée

Si la réponse provient de cette API, envoyez son id de tâche au lieu de copier la réponse et les citations du résultat :

```bash theme={null}
curl -X POST https://api.querying.ai/v1/source-influence \
  -H "Authorization: Bearer $QUERYING_API_KEY" -H "Content-Type: application/json" \
  -d '{ "taskId": "7c1f…", "brand": "1Password", "competitors": ["Bitwarden"] }'
```

La tâche doit vous appartenir, être `COMPLETED` et encore lisible via `GET /v1/async/task/:id`. Son Markdown de
réponse (le texte si le moteur n'a pas renvoyé de Markdown) devient `answer`, et ses URL citées deviennent
`citations` dans l'ordre du moteur : les 100 premières, avec au plus 10 fils de discussion. Les emplacements de fiches
produit et vidéo (liens `googleusercontent.com`) et les liens de recherche Google sont ignorés, faute de page à lire.
Le `prompt`, le `country` et le moteur de la tâche sont utilisés sauf si vous les envoyez. Envoyer `taskId` avec
`answer` ou `citations` est rejeté avec `400`, tout comme une tâche inachevée ou sans texte de réponse ni URL citée.
Un id de tâche inconnu ou expiré renvoie `404`.

## Payload

| Champ | Obligatoire | Notes |
| - | - | - |
| `taskId` | à la place de `answer` + `citations` | Une de vos tâches de réponse terminées ; voir ci-dessus. |
| `answer` | oui, sauf avec `taskId` | Markdown d'origine de la réponse, 1 à 200 000 caractères. Ne le modifiez pas : chaque plage est un offset UTF-16 dans exactement ce texte. |
| `citations[]` | oui, sauf avec `taskId` | 1 à 100 sources, au plus 10 URL de fils de discussion. |
| `citations[].url` | oui | URL HTTP(S), au plus 2 048 caractères. |
| `citations[].body` | non | Markdown de la source, au plus 300 000 caractères par citation ; le corps complet de la requête fait au plus 1 Mio. Un corps fourni est analysé tel quel et n'est jamais remplacé par une récupération actuelle. Sans corps, nous récupérons la page ; une page illisible est signalée sur cette source avec `error`. |
| `citations[].kind` | non | `inline` ou `panel` ; détecté à partir des liens de la réponse s'il est omis. |
| `prompt` | non | Question d'origine. Conservée pour compatibilité avec les intégrations existantes ; non renvoyée dans le résultat. |
| `engine` | non | Le moteur d'IA qui a produit la réponse. Même contexte de compatibilité, non renvoyé. |
| `brand` | non | Le nom de votre marque. Même contexte de compatibilité, non renvoyé. |
| `competitors[]` | non | Jusqu'à 25 noms de concurrents. Même contexte de compatibilité, non renvoyé. |
| `country` | non | Pays de récupération des sources, `US` par défaut. |

<Warning>
  L'option `analysis` est retirée.
  Les versions précédentes acceptaient `analysis: {version: 1, …}`. Les insights font désormais partie de chaque
  résultat : ce champ est donc rejeté avec `400` au lieu d'être ignoré. Retirez-le des intégrations existantes. Le contenu
  des tâches existantes reste lisible ; les enregistrements stockés ne sont pas migrés.
</Warning>

## Résultat

```json theme={null}
{
  "answer": "Teams plan starts at $19.95 per month for up to 10 users. The Business plan adds audit logs.",
  "sources": [
    {
      "id": "s1",
      "url": "https://example.com/pricing",
      "paragraphs": [
        { "id": "p1", "text": "Teams: $19.95 / month, up to 10 users." },
        { "id": "p2", "text": "Business adds audit logs and SSO." }
      ]
    },
    {
      "id": "s2",
      "url": "https://review.example.com/note",
      "paragraphs": [],
      "error": "…"
    }
  ],
  "links": [
    { "id": "l1", "paragraphId": "p1", "answerRanges": [{ "start": 0, "end": 57 }], "explanation": "States the same price and seat cap." },
    { "id": "l2", "paragraphId": "p2", "answerRanges": [{ "start": 58, "end": 92 }], "explanation": "Names the audit-log add-on." }
  ],
  "insights": [
    { "summary": "The pricing page covers both statements; the review page could not be read.", "linkIds": ["l1", "l2"] }
  ]
}
```

### `answer`

La réponse que vous avez soumise, inchangée. `answerRanges` sont des offsets dans exactement cette chaîne : unités de
code UTF-16 JavaScript, `start` inclus, `end` exclu. Découpez-la telle quelle, avec `answer.slice(start, end)`, au
lieu de redécouper le texte. Chaque plage désigne une unité sémantique complète de votre réponse : une phrase, un
élément de liste ou une cellule de tableau. Ses bornes se réfèrent au texte d'origine.

### `sources[]` : une entrée par citation envoyée

* `id` : identifiant opaque, unique dans le résultat.
* `url` : l'URL de citation que vous avez fournie.
* `paragraphs[]` : les paragraphes de cette page inclus dans le résultat. Chacun a un `id` (unique dans tout le
  résultat) et le `text` du paragraphe. Un paragraphe peut être inclus sans aucun lien.
* `error` : présent uniquement si la page n'a pas pu être lue. `paragraphs` est alors vide, et la chaîne donne une
  courte raison pour cette source.

### `links[]` : une relation par paragraphe

* `paragraphId` : le paragraphe concerné par ce lien. Il pointe toujours vers un paragraphe qui existe dans `sources[]`.
* `answerRanges[]` : les parties de la réponse auxquelles correspond ce paragraphe, en paires `start`/`end` dans les
  mêmes offsets UTF-16. Un lien peut porter plusieurs plages ; le même texte de réponse n'est pas répété entre elles.
  Chaque plage est une unité complète de la réponse (phrase, élément de liste ou cellule de tableau).
* `explanation` : une courte phrase décrivant la correspondance, c'est-à-dire ce que le paragraphe affirme sur cette partie de la réponse.

### `insights[]`

De courts résumés de ce que les liens de ce résultat révèlent ensemble. `linkIds` nomme les liens à partir desquels
chaque résumé a été construit, et ne peut nommer que des liens présents dans `links[]` : un insight n'affirme jamais une
relation absente de la réponse. Sans lien, il n'y a rien à résumer.

## Bien lire le résultat

* **L'absence de lien n'est pas un verdict.** Un paragraphe sans lien n'a simplement pas correspondu à une plage de la
  réponse, et une partie de la réponse sans plage signifie qu'aucun paragraphe n'y a été relié. Ni l'un ni l'autre ne
  dit que la page est hors sujet, inutilisée ou peu fiable.
* **Une page non lue reste incertaine.** Si `sources[].error` est défini, cette citation a été exclue de l'analyse ;
  ne traitez pas son absence de liens comme un constat négatif. Relancez-la ou fournissez son `body` si elle compte.
* **Correspondance, pas causalité.** Le résultat décrit comment une réponse existante et le texte d'une page existante
  se recoupent après coup. Il ne mesure pas l'influence sur la génération, ne classe pas les pages entre elles, ne note
  pas la page et n'indique pas comment la réponse a été produite.
* **Les ids sont internes.** Ne conservez pas les identifiants `p…`/`l…` comme clés stables d'une exécution à l'autre ;
  ils ne valent qu'au sein d'un résultat.

## Exécution et limites

* **La taille n'est pas un motif d'échec.** Tout ce que le contrat de requête accepte, une `answer` jusqu'à 200 000
  caractères avec jusqu'à 100 citations, est analysé. Les réponses longues, les grands ensembles de sources et les pages
  très longues sont traités en découpant le travail, pas en rejetant la tâche.
* **La profondeur suit la réponse, pas la page.** Une page longue ne produit pas plus de liens que la réponse ne peut en
  justifier : l'analyse se concentre sur les passages les plus susceptibles de correspondre à la réponse, et chaque
  source qui montre une correspondance est représentée. Sur une grande page, ou sur une page qui répète la même
  affirmation dans la navigation, les listes et les avis, attendez-vous aux passages les plus forts plutôt qu'à chaque occurrence.
* **Le balisage n'est pas une preuve.** Les plans de site, index de liens et galeries d'images ne produisent aucun lien ;
  une page constituée uniquement de ces éléments est signalée sans paragraphe plutôt qu'avec des correspondances inventées.
* Une source illisible est signalée dans `sources[].error` sans faire échouer la tâche si une autre source est lisible.
  La tâche échoue quand aucune source n'a pu être lue, en cas d'échec de l'analyse, de timeout ou d'erreur de
  configuration du service.
* Les requêtes sont facturées à l'usage, comme le reste de l'API. La réponse de soumission indique la réservation
  temporaire de crédits ; le montant final est réglé quand la tâche atteint un état final.
