How to check if Gemini mentions your brand
Ask Gemini the question your buyers ask, read the reply, and look for your brand — that's the honest one-minute version, and for a single check nothing beats it. The wrinkle is what you do next. Gemini is a chatbot, not a search engine: it only cites pages when it grounds an answer by browsing, so plenty of perfectly good replies come back with no sources at all.
That inverts the usual reading. On Perplexity the citation list is the measurement and the mention is context. Here the mention is the primary signal and a citation is a bonus that tells you the model went and checked. To measure that reliably across a query set — and to keep a record you can compare next month — fetch the answer as data: one POST to https://api.agentgeo.org/v1/fetches with "surfaces": ["gemini"].
The shortest honest answer: open Gemini, ask your category question, and search the reply for your brand name. Then check sources[] — but check whether it's populated at all before you conclude anything from it, because on this surface an empty source list is a normal delivered result rather than a failure. To do the check repeatedly, across many phrasings, with history you can diff, fetch the answer as structured data instead of reading it in a tab.
The manual way (and why it stops working)
Open Gemini. Ask exactly what a prospective customer would ask — say, "best email marketing platform for an ecommerce brand" — and read what comes back. If Acme is named, Acme is mentioned. If the reply shows links or a grounding panel, look for acme.com in there; if it shows nothing, that's information too, and it's the part people misfile. It takes a minute, it costs nothing, and for a one-off sanity check it is the right tool.
It stops working the second you need to do it twice.
- One question per session. Real category coverage is twenty to fifty phrasings. Typed by hand that shrinks to the three you happen to remember, and the ones you forget are usually where you're invisible.
- The answer isn't stable. Ask the same thing twice and the named brands can differ. A single reading tells you what Gemini said once, not what it tends to say.
- Nothing is recorded, so nothing can be compared. The useful question is whether you're named more often than you were in June. June has to exist somewhere for that question to have an answer.
- Sources are easy to misread in the app. Some answers show links, some show none, and by eye it's genuinely hard to tell whether Gemini grounded an answer or simply didn't need to — so you conclude "we're not cited" about an answer that cited nobody at all.
- It ends at the browser. A read-through can't become a row in a client report, a weekly job, or an alert. It happens right up until the week nobody has twenty minutes.
Do it with one API call
AgentGEO fetches the answer for you and hands it back as JSON: the full answerText, plus sources[] with the title, URL and position of anything the answer cited. Same reply you'd have read in the app, in a shape your code can test.
curl -s https://api.agentgeo.org/v1/fetches \
-H "Authorization: Bearer ag_live_your_key_here" \
-H "Content-Type: application/json" \
-d '{"query": "best email marketing platform for an ecommerce brand", "surfaces": ["gemini"]}' \
| jq '.answers[0] | {status, answerText, sources}'A typical record looks like this. It is delivered, it charged a credit, it names brands — and it cites nothing, because the model answered from what it already holds:
{
"id": "run_84c1f2ab91d3",
"query": "best email marketing platform for an ecommerce brand",
"surfaces": ["gemini"],
"status": "completed",
"recordsDelivered": 1,
"creditsCharged": 1,
"answers": [
{
"surfaceKey": "gemini",
"status": "delivered",
"answerText": "For an ecommerce brand the platforms suggested most often are Globex, which leads on automation, and Acme, which is the quickest to connect to a storefront ...",
"sources": [],
"fetchedAt": "2026-07-14T09:26:04Z",
"latencyMs": 14310
}
]
}So write the check in that order: the mention first, then the grounding question, then the citation. Collapsing the last two is what produces phantom declines.
import requests
from urllib.parse import urlparse
BRAND = "Acme"
DOMAIN = "acme.com"
QUERY = "best email marketing platform for an ecommerce brand"
def host(url):
h = urlparse(url).netloc.lower()
return h[4:] if h.startswith("www.") else h
resp = requests.post(
"https://api.agentgeo.org/v1/fetches",
json={
"query": QUERY,
"surfaces": ["gemini"],
"country": "US", # Gemini takes country; it does not take language
},
headers={"Authorization": "Bearer ag_live_your_key_here"},
timeout=200, # live surfaces are slow - requests wait up to 180s
)
resp.raise_for_status()
answer = resp.json()["answers"][0]
if answer.get("status") == "failed":
snapshot = (answer.get("providerFields") or {}).get("snapshot_id")
raise SystemExit(f"no record - retry gemini alone with snapshot_id {snapshot}")
text = answer.get("answerText") or ""
sources = answer.get("sources") or []
# Signal 1 - the primary one on a chatbot surface.
named = BRAND.lower() in text.lower()
# Signal 2 - only worth asking once you know the answer was grounded.
cited = [
s for s in sources
if host(s["url"]) == DOMAIN or host(s["url"]).endswith("." + DOMAIN)
]
print(f"query: {QUERY}")
print(f"named: {named}")
print(f"grounded: {bool(sources)} ({len(sources)} source(s))")
if not sources:
# A delivered record with no sources is a real result, not an error.
print("cited: n/a - Gemini answered without citing a page")
else:
print(f"cited: {bool(cited)}")
for s in cited:
print(f" #{s['position']} {s['title']} - {s['url']}")One delivered record costs one credit; a failed record costs nothing. Loop the same script over your query set and you have a visibility table for the surface — with a grounded column that most tools throw away.
If you already track Perplexity, it's worth seeing how differently the same fields behave here:
| Signal | On Perplexity (search-grounded) | On Gemini (chatbot) |
|---|---|---|
Empty sources[] | Rare — nearly every answer carries a citation list. | Ordinary. The model answered from what it already holds. |
Brand named in answerText | One of two signals, weighted about equally. | The primary signal, and often the only one available. |
Your domain in sources[] | The core measurement, with a position attached. | A bonus — and proof that this particular answer was grounded today. |
| Missing from the citations | A content gap with an address: read what was cited instead. | Usually means nothing until you've checked whether anything was cited. |
| What to fix when invisible | Out-publish the specific page that was cited. | No single page to beat — shift what the wider web consistently says about you. |
An empty sources[] on a delivered Gemini record is a result, not a bug. Like other chatbots, Gemini only cites when it grounds an answer by browsing; when it doesn't, it is telling you the model considered the question answerable from what it already absorbed — which is arguably a stronger statement about your brand than a citation, because it means you're in the training-shaped picture of the category rather than in one page it happened to fetch. So read the fields in order: brand in answerText first, then len(sources), and only then your domain. Reporting "not cited" against an answer that cited nobody is how a dashboard invents a decline that never happened.
Let your agent do it
If the check belongs in a conversation rather than a script — the way it usually does when you're mid-edit on the page in question — install the MCP server and ask in plain language:
claude mcp add agentgeo -- npx -y agentgeo-mcp --key ag_live_...agentgeo-mcp runs over stdio with zero npm dependencies on Node.js 18+, and exposes exactly one tool: fetch_raw_answers. query and surfaces are required; country defaults to "US". Then ask for the three signals, in words:
Fetch what gemini answers for "best email marketing platform for an ecommerce brand". Tell me whether Acme is named in the answer text. Then tell me whether the answer cited anything at all — and if it did, whether acme.com is in the list.
The advantage isn't saving fifteen lines of Python — it's that the agent already has your repo open, so it can go from "named but ungrounded" to "here's the page that should be carrying this claim" without you assembling the context by hand. The same server works in Claude Code, Cursor, Zed and any other MCP client, and the Python path hits the identical endpoint.
Common problems
- Empty is not failed. A record with
status: "delivered"andsources: []is correct, complete and chargeable. Branch onstatusfirst and onlen(sources)second; conflating the two turns ordinary answers into imaginary outages. languageisn't forwarded to Gemini. The chatbot datasets behind this surface accept only a URL, a prompt and acountry, and alanguagefield is rejected outright — so shape the market withcountryand read each market as its own series. Don't assume settings carry across surfaces either: Google AI Overviews does honourlanguage.web_searchis honoured only bychatgpt. Setting it and expecting Gemini to browse gets you nothing, because it's ignored on this surface. Grounding is something you observe here, not something you request.- Short brand names collide. A substring test for "Acme" also matches "Acme Insurance" and "Acmegraph". Use a word-boundary regex —
re.search(r"\bacme\b", text, re.I)— or a longer, more distinctive string, and spot-check the rawanswerTextwhenever a number jumps. - Slow scrapes come back
failed. Requests wait up to 180 seconds and some scrapes exceed that budget: the record returnsfailedwith aproviderFields.snapshot_idand costs zero credits. Retry with that id and the same single surface to redeem the finished answer instead of paying to scrape it again.
Summary
For a one-off, open Gemini and read the answer — it's free and it's fast. The moment the check has to repeat, cover more than a couple of phrasings, or produce something comparable to last month, fetch the record and test the signals in the right order: named, grounded, cited. On this surface the mention carries most of the meaning, and knowing when a missing citation means nothing is what keeps the number honest.
Get a free API key → · Try it without signing up → — Free tier, no credit card required.
Start for freeFrequently asked questions
- How do I check if Gemini mentions my brand?
- Manually: ask Gemini your category question and search the reply for your brand name. Programmatically:
POST https://api.agentgeo.org/v1/fetcheswith{"query": "...", "surfaces": ["gemini"]}and test whether the brand appears inanswerText, case-insensitively. The API route is what lets you run many phrasings on a schedule and keep the results to compare. - Does Gemini cite sources for its answers?
- Only when it grounds the answer by browsing. Gemini is a chatbot surface, so many replies are written from what the model already holds and carry no citations at all. When it does ground, AgentGEO returns the citations as a structured
sources[]array withtitle,urlandpositionon every entry. - Why does my Gemini answer have no sources?
- Because the model didn't need to browse. A record with
status: "delivered"and an emptysources[]is a real, complete result — it means the answer came from the model's own picture of your category rather than from pages fetched at that moment. Treat it as a signal about the topic, not as an error or a missing citation. - Can I check Gemini brand mentions without scraping?
- Yes. AgentGEO runs a managed-scraper engine on your behalf and returns the answer as structured JSON, so you make an ordinary HTTP request instead of driving a headless browser, rotating proxies, or maintaining selectors that break on a frontend deploy.
- Is checking brand visibility in Gemini different from Perplexity?
- The call is identical — swap the key in
surfaces— but the reading isn't. Perplexity is search-grounded and cites on essentially every answer, so absence from its citation list is meaningful. Gemini frequently doesn't cite at all, so the brand mention carries most of the signal and the citation is a bonus. Keep the two engines in separate tables rather than averaging them.
Keep reading