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

> Qué párrafos de una página citada se corresponden con qué partes de una respuesta de IA, con rangos exactos, una breve explicación por vínculo y resúmenes cortos construidos a partir de esos vínculos

Compara una respuesta de IA ya completada con sus fuentes citadas. El resultado es un mapa compacto: los párrafos de
cada página fuente incluidos en el resultado, las partes de la respuesta con las que se corresponden, una explicación
para cada vínculo y resúmenes cortos construidos a partir de esos vínculos.

Es un análisis de correspondencia a posteriori de una respuesta existente: no prueba que una fuente hiciera que el
modelo generara una frase, ni puntúa la calidad de una página. Trátalo como evidencia que revisar, no como un veredicto.

```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" }
    ]
  }'
```

Sondea `GET /v1/async/task/:id` o indica `webhook.url` al enviar; la tarea informa `taskType: "SOURCE_INFLUENCE"`.
No envíes este análisis a través de `POST /v1/async/task`; usa el endpoint dedicado. `POST /v1/research` y el tipo de
tarea `CITATION_ATTRIBUTION` son los nombres anteriores a septiembre de 2026 y siguen funcionando como alias obsoletos.

### Analizar una tarea que ya ejecutaste

Si la respuesta vino de esta API, envía su id de tarea en lugar de copiar la respuesta y las citas del resultado:

```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 tarea debe ser tuya, estar en `COMPLETED` y seguir siendo legible mediante `GET /v1/async/task/:id`. Su Markdown de
respuesta (el texto si el motor no devolvió Markdown) pasa a ser `answer`, y sus URL citadas pasan a ser `citations` en
el orden del motor: las 100 primeras, con un máximo de 10 hilos de discusión. Se omiten los marcadores de tarjetas de
producto y vídeo (enlaces de `googleusercontent.com`) y los enlaces de búsqueda de Google, porque no tienen página que
leer. Se usan el `prompt`, el `country` y el motor de la tarea salvo que los envíes. Enviar `taskId` junto con `answer`
o `citations` se rechaza con `400`, igual que una tarea sin terminar o sin texto de respuesta ni URL citada. Un id de
tarea desconocido o caducado devuelve `404`.

## Payload

| Campo | Obligatorio | Notas |
| - | - | - |
| `taskId` | en lugar de `answer` + `citations` | Una tarea de respuesta tuya completada; ver arriba. |
| `answer` | sí, salvo con `taskId` | Markdown original de la respuesta, 1–200.000 caracteres. No lo modifiques; cada rango es un offset UTF-16 en exactamente este texto. |
| `citations[]` | sí, salvo con `taskId` | 1–100 fuentes, como máximo 10 URL de hilos de discusión. |
| `citations[].url` | sí | URL HTTP(S), como máximo 2.048 caracteres. |
| `citations[].body` | no | Markdown de la fuente, como máximo 300.000 caracteres por cita; el cuerpo completo de la solicitud es como máximo 1 MiB. Un cuerpo aportado se analiza tal cual y nunca se sustituye por una descarga actual. Sin cuerpo, descargamos la página; una página que no se pudo leer se informa en esa fuente con `error`. |
| `citations[].kind` | no | `inline` o `panel`; se detecta a partir de los enlaces de la respuesta si se omite. |
| `prompt` | no | Pregunta original. Se conserva por compatibilidad con integraciones existentes; no se devuelve en el resultado. |
| `engine` | no | Qué motor de IA produjo la respuesta. Mismo contexto de compatibilidad; no se devuelve. |
| `brand` | no | El nombre de tu marca. Mismo contexto de compatibilidad; no se devuelve. |
| `competitors[]` | no | Hasta 25 nombres de competidores. Mismo contexto de compatibilidad; no se devuelve. |
| `country` | no | País desde el que se descargan las fuentes; por defecto `US`. |

<Warning>
  La opción `analysis` está retirada.
  Las versiones anteriores aceptaban `analysis: {version: 1, …}`. Ahora los insights forman parte de cada resultado, así
  que ese campo se rechaza con `400` en lugar de ignorarse: elimínalo de las integraciones existentes. El contenido de las
  tareas existentes sigue siendo legible; los registros almacenados no se migran.
</Warning>

## Resultado

```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 respuesta que enviaste, sin cambios. `answerRanges` son offsets en exactamente esta cadena: unidades de código
UTF-16 de JavaScript, `start` inclusivo y `end` exclusivo. Recórtala tal cual, con `answer.slice(start, end)`, en lugar
de volver a dividir el texto. Cada rango identifica una unidad semántica completa de tu respuesta: una frase, un elemento
de lista o una celda de tabla. Sus límites se refieren al texto original.

### `sources[]`: una entrada por cada cita enviada

* `id`: identificador opaco, único dentro del resultado.
* `url`: la URL de la cita que enviaste.
* `paragraphs[]`: los párrafos de esa página incluidos en el resultado. Cada uno tiene un `id` (único en todo el
  resultado) y el `text` del párrafo. Un párrafo puede incluirse sin ningún vínculo.
* `error`: solo aparece si la página no se pudo leer. En ese caso `paragraphs` está vacío y la cadena es un motivo
  breve para esa fuente.

### `links[]`: una relación por párrafo

* `paragraphId`: el párrafo al que se refiere el vínculo. Siempre apunta a un párrafo que existe en `sources[]`.
* `answerRanges[]`: las partes de la respuesta con las que se corresponde este párrafo, como pares `start`/`end` en
  los mismos offsets UTF-16. Un vínculo puede tener varios rangos; el mismo texto de respuesta no se repite entre
  ellos. Cada rango es una unidad completa de la respuesta (frase, elemento de lista o celda de tabla).
* `explanation`: una frase breve que describe la correspondencia: qué afirma el párrafo sobre esa parte de la respuesta.

### `insights[]`

Resúmenes cortos de lo que suman los vínculos de este resultado. `linkIds` indica a partir de qué vínculos se
construyó cada resumen, y solo puede nombrar vínculos que aparecen en `links[]`: un insight nunca afirma una relación
que la respuesta no contiene. Si no hay vínculos, no hay nada que resumir.

## Cómo leer bien el resultado

* **La ausencia de vínculo no es un veredicto.** Un párrafo sin vínculo simplemente no coincidió con un rango de la
  respuesta, y una parte de la respuesta sin rango significa que ningún párrafo se vinculó a ella. Ninguna de las dos
  cosas dice que la página sea irrelevante, no se usara o no sea fiable.
* **Una página no leída sigue siendo incierta.** Si `sources[].error` está presente, esa cita quedó fuera del análisis;
  no trates su falta de vínculos como un hallazgo negativo. Reinténtala o aporta su `body` si importa.
* **Correspondencia, no causalidad.** El resultado describe cómo encajan a posteriori una respuesta existente y el texto
  de una página existente. No mide influencia en la generación, no ordena páginas entre sí, no puntúa la página ni
  informa de cómo se produjo la respuesta.
* **Los ids son internos.** No guardes los identificadores `p…`/`l…` como claves estables entre ejecuciones; solo valen
  dentro de un resultado.

## Ejecución y límites

* **El tamaño no es un motivo de fallo.** Todo lo que acepta el contrato de la solicitud, una `answer` de hasta 200.000
  caracteres con hasta 100 citas, se analiza. Las respuestas largas, los conjuntos grandes de fuentes y las páginas muy
  largas se gestionan dividiendo el trabajo, no rechazando la tarea.
* **La profundidad depende de la respuesta, no de la página.** Una página larga no produce más vínculos de los que la
  respuesta puede sostener: el análisis se concentra en los pasajes con más probabilidad de corresponderse con la
  respuesta, y cada fuente que muestra una correspondencia aparece representada. En una página grande, o que repite la
  misma afirmación en navegación, listados y reseñas, espera los pasajes más sólidos y no cada aparición.
* **El marcado no es evidencia.** Los mapas del sitio, los índices de enlaces y las galerías de imágenes no aportan
  vínculos; una página formada solo por ellos se informa sin párrafos en lugar de con correspondencias inventadas.
* Una fuente que no se pudo leer se informa en `sources[].error` sin hacer fallar la tarea si otra fuente es legible.
  La tarea falla cuando no se pudo leer ninguna fuente, ante un fallo del análisis, un timeout o un error de
  configuración del servicio.
* Las solicitudes se miden por uso, como el resto de la API. La respuesta de envío muestra la retención temporal de
  créditos; el cargo final se liquida cuando la tarea llega a un estado final.
