Mentions vs citations: the two numbers in AI answers
An AI answer can mention your brand, cite your page as a source, do both or do neither. The two events have different causes, sit in different response fields and need different fixes, so a single visibility score that blends them hides the decision you have to make.
Definitions
A mention is your brand or product name in the answer text the user reads. A citation is a URL on a domain you control in the answer’s list of sources: the engine presents your page as evidence. An inline citation is a citation attached to a specific passage, shown as a chip or footnote next to the claim it supports.
A mention shapes what the reader believes. A citation gives the reader a path to your page and indicates which content the engine relied on. Neither implies the other.
An answer can produce either event without the other, which is why one blended visibility score hides the fix you need.
Where each signal lives in the response
| Signal | Field | Engines |
|---|---|---|
| Mention in prose | result.text, result.markdown (with include.markdown) |
ChatGPT, Perplexity, Gemini, Copilot, Grok, AI Mode |
| Extracted entities | result.entities[] ({type, name}) |
ChatGPT only |
| Citation | result.sources[].url, with position |
ChatGPT, Perplexity, Gemini, Copilot, Grok, AI Mode |
| Inline citation chip | result.citationPills[] with url, domain, citationPillId, position |
ChatGPT, Perplexity, Gemini, Copilot, AI Mode |
Details that affect counting:
citationPills[]has one entry per (chip, source) pair. Group bycitationPillIdto rebuild a chip; ids are 0-based on ChatGPT and 1-based on the other engines. Each entry’spositionpoints intoresult.sources.- ChatGPT’s
sources[].footnotemarks sources that appear in a subsequent list of the sources panel. - On AI Mode, sources may also carry a
redirectLink; useurlfor domain matching. - Grok’s sources carry extra metadata such as
siteNameandcreator, useful when the citation is a post rather than a web page.
For Google AI Overviews the equivalent data comes from POST /v1/monitor/google with include.aioverview; see monitoring Google AI Overviews.
Why the two diverge
Each of these explanations can be checked against your own data.
- Mentioned, not cited. The engine knows your name from its training data or from third-party pages it retrieved, such as a review roundup or a forum thread. The answer names you, but the evidence is someone else’s page. You can see this directly: the answer’s
textcontains your brand andsources[]lists other domains. - Cited, not mentioned. Your page was retrieved for a supporting fact, such as a definition, a benchmark or a how-to step, while the recommendation went elsewhere. Common for companies with strong educational content and weak comparison or product pages.
- Both. Your own page supports the claim that names you. This is the position to defend.
- Neither. Your pages are not retrieved for the searches behind this prompt, and no third party names you in what is retrieved. How AI engines choose citations and query fan-out explain the retrieval side.
The four quadrants and what to do
| State | Meaning | First fix |
|---|---|---|
| Mentioned and cited | You are the recommendation and the evidence | Defend: keep the cited page current, watch for competitors entering the sources |
| Mentioned, not cited | Known, but others describe you | Publish evidence pages that answer the prompt’s question with your specifics |
| Cited, not mentioned | Your page informs answers that credit others | Tie claims on the cited page to your product by name, add comparison and use-case pages |
| Neither | Invisible for this intent | Find the fan-out searches, create pages that rank for them, earn third-party coverage |
Mentioned, not cited
Look at which domains are cited when you are named. They are the pages telling your story. If they are accurate and favorable, support them (keep review profiles current, answer the forum questions). If they are outdated or wrong, publish a page on your domain that states the current facts plainly, since you cannot edit theirs. Reddit in AI citations covers the case where the storyteller is a discussion thread.
Cited, not mentioned
Read the passages your page is cited for, using citationPills[] to find the claim each chip supports. Usually the cited page is generic: it explains a topic without saying your product does it. Make the connection explicit on the page, and build the pages a recommendation needs: comparisons, pricing, use-case pages, structured data.
Measure both, per answer
import re
from urllib.parse import urlparse
def on_domain(url: str, domains: list[str]) -> bool:
host = (urlparse(url).hostname or "").lower()
return any(host == d or host.endswith("." + d) for d in domains)
def classify(result: dict, aliases: list[str], domains: list[str]) -> dict:
text = result.get("text") or ""
pattern = re.compile(r"\b(" + "|".join(re.escape(a) for a in aliases) + r")\b", re.IGNORECASE)
in_text = bool(pattern.search(text))
in_entities = any(pattern.search(e.get("name", "")) for e in result.get("entities", [])) # ChatGPT only
sources = [s for s in result.get("sources", []) if s.get("url")]
ours = [s for s in sources if on_domain(s["url"], domains)]
mentioned, cited = in_text or in_entities, bool(ours)
return {
"mentioned": mentioned,
"cited": cited,
"best_position": min((s["position"] for s in ours if "position" in s), default=None),
"quadrant": {(True, True): "both", (True, False): "mentioned_only",
(False, True): "cited_only", (False, False): "neither"}[(mentioned, cited)],
"other_domains": sorted({urlparse(s["url"]).hostname or "" for s in sources if s not in ours}),
}
Pass result from a synchronous response or response.result from a completed task. aliases should include product names and common spellings; domains should include every domain and subdomain you control (docs, blog, help center).
Turn answers into rates
Across a prompt set on one engine and market:
mention_rate = answers where mentioned / answers
citation_rate = answers where cited / answers
gap = mention_rate − citation_rate
Also keep the four quadrant counts. The gap summarizes; the quadrants tell you where the work is.
Worked example, with illustrative numbers: a 50-prompt category set on one engine returns: 10 answers mention and cite you, 20 mention only, 2 cite only, 18 do neither.
- Mention rate: (10 + 20) / 50 = 60%.
- Citation rate: (10 + 2) / 50 = 24%.
- Gap: +36 points.
The engine names you often but rarely uses your pages to do it. Collecting other_domains for the 20 mentioned-only answers shows which sites supply that evidence, which is the work list.
A negative gap, such as a 20% mention rate with a 40% citation rate, means your content is informing answers that recommend others. A citation-only dashboard shows that as healthy.
Running it as a program
- Fix the prompt set and report by intent cluster (prompt set design). Branded prompts will show high mention rates by construction; keep them out of category metrics.
- Run each engine and market separately. Retrieval differs by engine, so the quadrants do too. Set
countryon every request. - Submit runs as async tasks. Per the billing page, a task costs $0.0006 on ChatGPT, $0.0006 on Gemini and $0.00206 on AI Mode at the Starter tier. A 40-prompt set on ChatGPT and Gemini in one market is 40 × $0.0012 = $0.048 per run; adding AI Mode makes it 40 × $0.00326 = $0.1304.
- Repeat runs. Answers vary between runs, so report rates over several runs, with counts (sampling vs census).
- Track movement between quadrants from one period to the next. A prompt moving from mentioned-only to both is the best evidence that an evidence page worked.
The share-of-voice framework adds citation share and answer rank on top of these two rates, and measuring brand mentions in ChatGPT covers shopping-card presence.
Find the claims your pages are cited for
For the cited-only quadrant, the useful question is which passages of the answer your pages support. On engines that return citationPills[], group the entries by chip and keep the chips that include your domain:
from collections import defaultdict
def our_chips(result: dict, domains: list[str]) -> list[list[dict]]:
chips = defaultdict(list)
for pill in result.get("citationPills", []):
chips[pill["citationPillId"]].append(pill)
return [entries for entries in chips.values()
if any(e["domain"] == d or e["domain"].endswith("." + d) for e in entries for d in domains)]
A chip that cites your page alongside two competitors’ pages supports a shared claim; a chip that cites only your page is a claim the engine took from you alone. Compare the chip’s label with the text around your brand (or its absence) in result.text to see whether the answer credits you for it. Where result.markdown is requested with include.markdown, it keeps the answer’s structure, which makes locating the passage easier.
Pitfalls
- Substring matching. A short brand name matches inside other words; use word boundaries and review a sample of matches.
- Using
entitiesacross engines. Only ChatGPT returns it; other engines need text matching. - Missing subdomains. A docs or help-center subdomain citation is still your citation.
- Counting pills as sources. One source can back several chips; count citations from
sources[]. - Blending engines. A combined rate can show no gap while one engine has a large one.
- Treating every mention as positive. A mention can be a warning or an outdated description; read the sentence, especially in branded prompts.
Try it on your own prompts with the quickstart, or see the ChatGPT engine page for the full response.
Questions
What is the difference between a mention and a citation in an AI answer?
A mention is your brand named in the answer's text. A citation is a page on your domain listed as a source the answer used. Readers see a mention; they can click a citation.
Can a brand be cited without being mentioned?
Yes. An engine can use your page as evidence for a general claim without naming you in the answer, for example citing your guide on a topic while recommending other products. That is a common and fixable gap.
Which API fields show mentions and citations?
Mentions come from result.text (or result.markdown) on every AI engine, plus result.entities on ChatGPT. Citations come from result.sources[].url on every AI engine, and result.citationPills[] shows inline citation chips on ChatGPT and Gemini.
What is the mention-citation gap?
Mention rate minus citation rate across a prompt set. A large positive gap means engines name you but rely on other sites to describe you; a negative gap means your pages inform answers that do not name you.
Which should I improve first, mentions or citations?
Start with the quadrant holding the most prompts in your commercial clusters. Mentioned but not cited usually calls for evidence pages on your own domain; cited but not mentioned calls for pages that tie your claims explicitly to your brand and products.