All documentation

Visibility

Citations

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

Citations screen showing share of citations, the most cited external source, and a table of cited source URLs

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.

Last verified 2026-09-29

Start monitoring your AI visibility.

See how AI search engines talk about your brand.

Free to start. No credit card required.