Track which sources AI answers cite, in the answer itself.

Citations are the currency of AI search: being cited is the new ranking, and losing a citation is the new dropping off page one. Tracking them means capturing what the answer actually says and which sources it names or links, then watching that change over time. Answer engines do not announce citation changes; only captures reveal them.

The workflow, end to end.

Real endpoints, real field names, nothing below is pseudocode.

  1. step 1 / 4

    Capture the answers whose citations you track

    Submit your query set to the citation-bearing surfaces. Perplexity and AI Overviews are the densest citers; ChatGPT cites when it browses; Claude answers via the official API. Each returns the answer plus structured evidence.sources, the citations that surface named or linked.

    POST /v1/search
    curl -sS -X POST "https://api.aisearchapi.dev/v1/search" \
      -H "Authorization: Bearer $AISEARCH_API_KEY" \
      -H "Content-Type: application/json" \
      -d '{
        "query": "is retinol safe during pregnancy",
        "surfaces": ["perplexity", "google_ai_overview", "chatgpt", "claude"],
        "regions": [{ "country": "US" }]
      }'
  2. step 2 / 4

    Read the structured sources the surface cited

    Alongside the answer, the Envelope returns evidence.sources: a structured list of the citations the surface named or linked, each with its url, title, role, a cited flag and a quote. That is the citation set for this query, extracted for you, no per-provider HTML parsing.

    Envelope excerpt, structured citations in evidence.sources
    "answer": {
      "markdown": "Retinol is generally not recommended during
        pregnancy [1], though data is limited [2]."
    },
    "evidence": {
      "sources": [
        { "url": "https://acog.org/…", "title": "ACOG",
          "role": "citation", "cited": true, "quote": "…" },
        { "url": "https://ncbi.nlm.nih.gov/…", "title": "NCBI",
          "role": "citation", "cited": true, "quote": "…" }
      ],
      "fanOut": ["retinol safety pregnancy", "topical retinoid risk"]
    }
  3. step 3 / 4

    See what each source backs in the answer

    Each entry in evidence.sources carries a role and a cited flag, and its quote ties the source to the passage it backs; the full answer.markdown is still there when you want to place a citation in its surrounding context. Every source is one the surface actually named or linked, never an inferred span.

  4. step 4 / 4

    Diff over time and alert on citation events

    Key the domains in evidence.sources by (query, surface, region) and diff runs: a citation gained, a citation lost, a competitor’s domain appearing, each an alertable event keyed to that (query, surface, region).

The Envelope fields that do the work.

Every surface returns the same canonical Envelope, so these fields mean the same thing whether the capture came from ChatGPT, Perplexity or an AI Overview.

evidence.sources

The structured citation set for this capture, each source with url, title, role, a cited flag and a quote. The record you diff per query per surface, no HTML parsing.

evidence.fanOut

The search queries the surface fanned out to, when it exposes them, extra signal on what the engine went looking for.

answer.markdown

The composed answer with the surface’s own inline citations preserved, so you can place any evidence.sources entry in its surrounding context.

answer.blocks

Typed structure (paragraph, heading, list, code, quote) so you can locate which part of the answer a cited source sits in.

provenance.surfacePresent

An answer with no citations, or no answer at all, is recorded honestly rather than dropped.

provenance.model

Which engine and model cited, so a citation change is always attributed to a specific surface.

Honest limits

Citation richness varies by surface, and evidence.sources reflects what each surface actually named or linked, url, title, role, cited flag and quote, not a character-ranged offset graph the surface never exposed. Claude answers come from the official Anthropic API today. An answer with no citations is reported as exactly that (evidence.sources empty), and absent surfaces complete as surface_absent (and cost nothing).

Terms used here, defined precisely: Provenance · Envelope · AI Overview

Asked precisely.

What counts as a "citation" in the Envelope?

A source the surface actually named or linked. Each one lands in evidence.sources with a url, title, role, a cited flag and a quote, so a citation is a first-class structured record, not something you scrape out of prose. The answer.markdown is still there to show that citation in context.

Can I track citations of my competitors, not just my own site?

Yes, evidence.sources lists whatever the surface named, yours or a competitor’s. Filter it by domain, and a full citation-set diff per query per surface is one stored Envelope per capture.

How do I catch a lost citation quickly?

Schedule the query set at your cadence and diff the domains in evidence.sources per run; a disappearance is an alertable event the same hour the capture runs. Webhooks push each terminal Envelope so your alerting is event-driven rather than poll-based.

Do you return a structured list of cited sources?

Yes. evidence.sources is exactly that: a structured list of the citations the surface named or linked, each with a url, title, role, a cited flag and a quote. What we do not invent is a character-ranged offset span the surface never exposed, a source’s quote ties it to the passage it backs, and answer.markdown is there for full context.

Build it on the capture layer.

500 free credits, charged only on successful captures. The whole workflow above runs on two endpoints.