An AI citation audit asks whether an observed answer cites the intended source and whether that source supports the relevant claim. Keep the exact answer, cited URL and checked passage. A citation count alone can hide missing support, copied sources or a reference to the wrong page.
Keep three separate citation outcomes
| Outcome | Evidence required |
|---|---|
| Mention without citation | Observed answer span |
| Citation without verified support | URL plus an unresolved support review |
| Supported citation | Answer claim, source revision and supporting passage |
Build a reviewable citation record
Store engine, prompt, market, observation time, answer text and cited URLs. Read the cited source and keep the passage used in the review. Resolve redirects to the final source URL while preserving the originally observed link in the record.
Use a fixed prompt cohort when comparing periods. Record unavailable answers separately. Repeated URLs carrying the same passage should not inflate the number of independent supporting sources.
Check source presence without overstating it
def supported_answer(claims, source_map):
return all(c.get('source_id') in source_map and bool(c.get('quote'))
and c['quote'] in source_map[c['source_id']] for c in claims) and bool(claims)
assert supported_answer([{"source_id": "page-1", "quote": "version 2"}],
{"page-1": "The fixture describes version 2."})
The local helper checks quote presence. A reviewer must still decide whether it supports the claim in context. Schema markup, clean Markdown and frequent refreshes do not guarantee that an AI engine will cite a page. Use the broader GEO measurement guide for exposure and business outcomes.
Reference documentation: developers.google.com — /search/docs/appearance/ai-features; www.searchcans.com — /reader-api.