Compare a completed AI answer with its cited sources. The result is a compact map:
the paragraphs of each source page that the result includes, the parts of the
answer they correspond to, an explanation for every link, and short summaries
built from those links.
This is post-hoc correspondence analysis of an existing answer — not proof that
a source caused the model to generate a sentence, and not a score of a page’s
quality. Treat it as evidence to inspect, not a verdict.
Poll GET /v1/async/task/:id, or supply webhook.url when submitting; the task
reports taskType: "SOURCE_INFLUENCE". Do not submit this analysis through
POST /v1/async/task; use the dedicated endpoint. POST /v1/research and the
CITATION_ATTRIBUTION task type remain accepted as deprecated aliases.
Analyze a task you already ran
If the answer came from this API, send its task id instead of copying the
answer and citations out of the result:
The task must be one of yours, COMPLETED, and still readable through
GET /v1/async/task/:id. Its answer Markdown (text when the engine returned no
Markdown) becomes answer, and its cited URLs become citations in the
engine’s order: the first 100, with at most 10 discussion threads. Product and
video card placeholders (googleusercontent.com links) and Google search links
are skipped, since they have no page to read. The task’s
prompt and country and its engine are used unless you send them. Sending
taskId together with answer or citations is rejected with 400, and so
is a task that is unfinished or has no answer text or cited URL. An unknown or
expired task id returns 404.
Analyze every answer as you collect it
Add include.sourceInfluence: true to a collection request, and the analysis
runs on the answer as soon as it is collected. It works with the answer engines
(CHATGPT, GEMINI, PERPLEXITY, GOOGLE_AIO, GOOGLE_AIMODE, NAVER_AI_BRIEF, NAVER_AI_TAB, BING_SEARCH, BING_COPILOT), in single tasks, task batches, grids and POST /v1/batches.
The analysis reads the answer and its cited URLs the same way taskId does
above. The answer’s result then carries response.sourceInfluence: the
analysis task exactly as GET /v1/async/task/:id returns it, with task,
credits and response or error.
- Webhook: sent once, after the analysis finishes, with the answer and the analysis together.
- Polling: the answer task is
COMPLETED as soon as the answer is ready. Keep polling until response.sourceInfluence.task.status is COMPLETED or FAILED.
- Batches complete when every answer and its analysis have finished.
- No analysis: when the answer cites no URL to read, or your credits or the key’s daily limit cannot cover the analysis hold,
response.sourceInfluence is { "error": "…" } and the answer is delivered right away.
- Billing: the analysis is charged on its own, by usage like any Source Influence task. The answer’s charge does not change. A key limited to certain task types must also allow
SOURCE_INFLUENCE.
Payload
The request rejects analysis with 400. Insights are included in every result.
Result
answer
The answer you submitted, unchanged. answerRanges are offsets into this exact
string: JavaScript UTF-16 code units, start inclusive, end exclusive. Slice
it as-is — answer.slice(start, end) — instead of re-splitting the text.
Every range identifies a whole semantic unit of your answer: a sentence, list
item or table cell. Its boundaries refer to the original text.
sources[] — one entry per citation you sent
id — opaque identifier, unique within the result.
url — the citation URL you supplied.
paragraphs[] — the paragraphs of that page included in the result. Each has
an id (globally unique across the whole result) and the text of the
paragraph. A paragraph can be included with no link at all.
error — present only when the page could not be read. paragraphs is then
empty, and the string is a short reason for that source.
links[] — one relationship per paragraph
paragraphId — the paragraph this link is about. It always points at a
paragraph that exists in sources[].
answerRanges[] — the parts of the answer this paragraph corresponds to, as
start/end pairs in the same UTF-16 offsets as above. A link may carry
several ranges; the same answer text is not repeated across them. Each range
is a whole answer unit (sentence, list item or table cell).
explanation — a short sentence describing the correspondence: what the
paragraph states about that part of the answer.
insights[]
Short summaries of what the links in this result add up to. linkIds names the
links each summary was built from, and it can only name links that appear in
links[] — an insight never claims a relationship the response does not
contain. When there is no link, there is nothing for an insight to summarize.
Reading the result correctly
- No link is not a verdict. A paragraph without a link simply did not match an
answer range, and an answer part with no range means no paragraph was linked to
it. Neither says the page is irrelevant, unused or untrustworthy.
- An unread page stays uncertain. When
sources[].error is set, that citation
was excluded from the analysis; do not treat its lack of links as a negative
finding. Retry it or supply its body if it matters.
- Correspondence, not causation. The result describes how an existing answer
and existing page text line up after the fact. It does not measure generation
influence, rank pages against each other, score the page, or report how the
answer was produced.
- Ids are internal. Do not persist
p…/l… identifiers as stable keys
across runs; they are scoped to a single result.
Execution and limits
- Size is not a failure mode. Anything the request contract accepts — an
answer up to 200,000 characters with up to 100 citations — is analyzed. Long
answers, large source sets and very long pages are handled by splitting the
work, not by rejecting the task.
- Depth scales with the answer, not the page. A long page does not produce
more links than the answer can support: the analysis concentrates on the
passages most likely to correspond to the answer, and every source that shows
a correspondence is represented. On a large page, or on a page that repeats
the same statement in navigation, listings and reviews, expect the strongest
passages rather than every occurrence.
- Markup is not evidence. Sitemaps, link indexes and image galleries
contribute no links; a page made only of those is reported with no paragraphs
rather than with invented correspondence.
- A source that could not be read is reported in
sources[].error without
failing the task if another source is readable. The task fails when no source
could be read, on an analysis failure, on a timeout, or on a service
configuration error.
- Requests are metered by usage, like the rest of the API. The submit response
shows the temporary credit hold; the final charge is settled when the task
reaches a terminal state.