Visibility
Citations
What counts as a citation, how one is attributed to you, and what the screen shows.

What counts as a citation
A citation is one link an AI engine puts in its own answer, pointing at a
specific URL as the source for what it just said. DiscoveredBy stores one row
per link, Citation (for Claude, every page its search returned is stored as
a citation too, see Retrieved vs cited),
with its rank, sentiment and framing when the model captured them, and which prompt and run it came from
(api/models/citation.py). The rank is mostly the order the engine reported
its sources in, with a
source an engine cites without listing it numbered after its list; for
Perplexity, the two Google engines (Google AI Overviews and Google AI Mode),
ChatGPT (app) and Gemini (app), it is the order the answer first cites its
sources (see Engines). The two Gemini engines
therefore rank differently, so an average position is not comparable
between Gemini (API) and Gemini (app) (api/services/llm.py#run_gemini,
#_gemini_app_answer). On Gemini (app), a
page the answer quotes for several passages is one citation, and the
Google product and Google Maps place links among its sources are not
citations: they are counted as shopping and local businesses among the
answer features
(api/services/llm.py#_gemini_app_answer). A run where Google showed no AI answer
has no citations (api/services/llm.py#_ai_overview_answer). See Key terms for how
a citation differs from a mention (your brand named without a source link) and
a retrieval (a page the engine read but never linked), and
Metrics defined for how citation rate
is counted from these rows.
What a cited URL is
Every citation points at a CitedUrl row: the exact link, the title the
engine gave it, and when it was first and most recently seen
(api/models/cited_url.py). A CitedUrl is deduplicated by a hash of the URL
itself and is not scoped to one project, so the same page cited by five
different engines, or cited again next week, is one CitedUrl row with
several citations pointing at it, not five separate URLs. Which domain a
cited URL belongs to is decided once, when the URL is first stored, from that
URL alone.
How a citation is attributed to you
When an engine cites a URL, DiscoveredBy reduces it to its registrable
domain, the part a public suffix list says is actually registered
(example.com from https://blog.example.com/post or
https://www.example.com/post, example.co.uk from a UK subdomain), and
lowercases it (api/services/urls.py#extract_domain). That domain becomes (or
already is) a Domain row, and the citation is marked as yours when that
row's id matches the one Domain your project was set up against: the
registrable domain of the URL you gave it at project creation
(api/services/execution.py#_store_citation,
api/routers/projects.py#create_project).
That is the whole check: one domain string compared to another, done once
when the citation is stored. A subdomain of yours counts as you, because the
registrable domain is the same either way, docs.yoursite.com and
www.yoursite.com both reduce to yoursite.com. Past that, the match does
not try to be clever. For every engine except Gemini (API), the URL used for this
comparison is the URL the engine returned, with any utm_ tracking
parameters removed (and, for the two Google engines, ChatGPT (app) and Gemini (app), a
#:~:text= quote link and a YouTube timestamp removed too), so a link that has since started redirecting elsewhere
is still matched by the domain the engine gave, not by wherever it now
points (api/services/llm.py#strip_utm_params, #clean_reference_url).
Gemini (API) is the one exception: its grounding
links are opaque Google redirect URLs with no real domain of their own, so
DiscoveredBy follows that redirect chain first
(api/services/llm.py#resolve_redirect) and attributes the citation to the
domain the chain actually lands on. Nothing here looks at the page's content,
so a syndicated copy of your article, republished verbatim on someone else's
domain, is attributed to that other domain, never to you.
What the screen shows
Citations opens on one hero number: what share of the citations currently in view point at your domain, out of everything shown here, not out of every collected answer. That makes it a different question from citation rate, which divides by collected answers rather than by citations, so the two percentages are not meant to match. Beside it: the domain cited most often that is not yours, and a count of distinct pages cited at all.
The filter bar
sets the window and can narrow by engine, tag, country, persona and
language; the page's own controls narrow further by owner (All, Your
Citations, or External, which is every citation that is not yours,
competitors' included) and tracked prompt, and every number on
the page recomputes against whatever is left
(api/routers/pages.py#CITATIONS_ACCEPTS). Below the filters, two tabs
cover the same underlying citations two ways: Sources groups them by URL,
with which engines cited it and how many times each; Every citation lists one
row per citation, with its rank for that answer and a link to the source
(api/routers/pages.py#citations_page).
Both tabs are built from the newest 500 citations in the window that match
the filter bar, from completed answers only, newest by the date the answer
was collected
(api/routers/pages.py#_citations_in_scope, #CITATIONS_LIMIT). When the
window holds more, a line above the hero number says so, for example
"Showing the newest 500 of 1,284 citations in this window. Every figure below
counts those 500.", and the hero, the two cards beside it and both tab counts
each say they cover the newest 500
(frontend/src/routes/(app)/citations/+page.svelte#capped). An older citation
in the window is counted in that total but appears in neither tab and in no
figure. The owner and prompt controls then narrow those 500. A cited page's title can also fall
back to a separate ranking of the 50 most-cited URLs in the same window and
filters when the citation row itself carries no title, so a URL outside
that ranking still appears in both tabs, just without one.
Related
- Key terms: what separates a citation from a mention and a retrieval
- Metrics defined: the citation rate formula, and how domain coverage differs
- Troubleshooting: No citations yet: what a zero here does and does not mean
Last verified 2026-09-29