Tutorial2026-07-166 min read

How to check if Gemini recommends your product

Gemini recommends products constantly without ever calling it that. Ask it "best accounting software for freelancers" and you get three to six named tools, each with a line of reasoning attached. To find out whether yours is on that list, run the questions your buyers ask while they're deciding, and read the replies. The second half is where the work is. A name on the list and a recommendation are different results, so a yes/no answer stops one step short. Pull the text your brand sits inside, because "Acme is the one to pick if you want to be invoicing this afternoon" and "Acme is cheap, but you'll outgrow it" are both mentions and they are not the same news. Then check one more field while you're there: whether sources[] came back empty. On Gemini it frequently does, and that single detail changes what a bad description means and how long it will take to undo.

Tutorial

To check whether Gemini recommends your product, feed it the shapes of question people use at the point of purchase — "best X for Y", "X alternatives", "X vs Y" — then see whether your name turns up. Then do the part that decides the outcome: read the text wrapped around it, because that text is the actual result. One POST to https://api.agentgeo.org/v1/fetches with "surfaces": ["gemini"] hands the answer back as something you can slice, so the framing arrives quotable rather than remembered.

The manual way (and why it stops working)

Open Gemini and ask like a buyer, not like a marketer. "Best accounting software for freelancers." "Acme alternatives." "Is Acme worth it if I invoice in two currencies?" Read the full answer, find your name, and read the whole bullet or paragraph around it — Gemini writes in lists, and the list item is the unit of framing. Six phrasings in you'll know roughly where you stand, for free, in about ten minutes. Do this before you automate anything; it teaches you what the model actually says about your category, which is hard to learn from a percentage.

The ceiling shows up fast, though:

  • Buying intent fans out. "Best", "cheapest", "alternatives to", "X vs Y", "for freelancers", "for a sole trader" — every one of those is its own answer, with its own shortlist and its own verdict on you. Covering the fan by hand costs a morning, and the morning recurs.
  • The answer wobbles. The same prompt on Tuesday and on Thursday can hand back a different shortlist and a noticeably warmer or cooler line about you. A single reading can't separate a genuine slip from normal drift, which makes anything you saw once unsafe to report.
  • You will talk yourself into a good result. Hunting through prose for your own name, "also worth considering" starts to look like a win. Pulling the text out and grading it against a rubric you wrote beforehand is a different activity from skimming for something encouraging.
  • Nothing is stored. In two months you'll want to know whether the description improved after you rewrote the positioning page. Chat history isn't a dataset, and screenshots aren't a series.
  • You lose the one field that explains the framing. In the browser you see whether links appeared; in a record you see sources[] as data, and can sort every mention by whether the model was reading a page or answering from memory. That distinction is the whole diagnosis, and it's the first thing a manual process drops.

Do it with one API call

One POST gives you the raw record behind that query: the answer in full, plus anything the engine cited. Nothing to run locally, nothing to repair when a page template shifts — it's a managed-scraper engine, maintained for you.

curl -X POST https://api.agentgeo.org/v1/fetches \
  -H "Authorization: Bearer ag_live_..." \
  -H "Content-Type: application/json" \
  -d '{"query": "Acme alternatives for freelance bookkeeping", "surfaces": ["gemini"], "country": "US"}'

Now the check that matters. Instead of asking whether the brand is present, split the answer into the blocks Gemini writes in and keep the ones your brand appears in — you get the framing, quoted, next to a flag saying whether the model was grounded when it wrote it:

import re
import requests

KEY = "ag_live_your_key_here"
BRAND = "Acme"

# Buying intent, not brand awareness - the questions that decide deals.
QUERIES = [
    "best accounting software for freelancers",
    "Acme alternatives for freelance bookkeeping",
    "Acme vs Globex for invoicing as a sole trader",
    "cheapest accounting app for a self-employed designer",
]

MENTION = re.compile(rf"\b{re.escape(BRAND)}\b", re.I)


def blocks(text):
    # Gemini answers in bullets and short paragraphs, so the block a brand
    # sits in is a better unit of framing than one clipped sentence.
    parts = re.split(r"\n\s*\n|\n(?=\s*[-*\d])", text)
    return [p.strip(" -*\t") for p in parts if p.strip()]


for query in QUERIES:
    resp = requests.post(
        "https://api.agentgeo.org/v1/fetches",
        json={"query": query, "surfaces": ["gemini"], "country": "US"},
        headers={"Authorization": f"Bearer {KEY}"},
        timeout=200,  # the API waits up to 180s for live surfaces
    )
    resp.raise_for_status()

    for answer in resp.json()["answers"]:
        if answer.get("status") == "failed":
            print(f"{query!r}: no record this run")
            continue

        text = answer.get("answerText") or ""
        framing = [b for b in blocks(text) if MENTION.search(b)]

        # An empty source list on a delivered Gemini record is normal: it means
        # the model wrote this from what it knows, not from a page it just read.
        grounded = bool(answer.get("sources"))

        print(f"\n{query!r}  (grounded: {grounded})")
        for b in framing:
            print(f"   {b}")
        if not framing:
            print("   not named at all")

That output is evidence rather than a score: per buying query, the precise words Gemini chose about you, tagged with whether it had read anything when it chose them. Four queries on one surface means four delivered records, so four credits; anything that fails is free. And an ag_test_ key hands back clearly-labelled demo records for nothing while the parser is still taking shape.

The grounded flag is the most useful thing in that output. When sources[] has entries, the description came out of pages the model just read — find those pages, and you've found the thing to correct or out-publish. When sources[] is empty, the description came from what the model absorbed about you well before you asked, which means there is no single page to fix: you change it by changing what the wider web says about you, and then you wait. Same sentence, same mention, completely different horizon. AgentGEO computes no sentiment and no scores, so whether that sentence reads as a recommendation stays a judgment your own agent makes with your own rubric.

What you see in the recordWhat it meansWhat to do, and how long it takes
Named warmly, sources[] populatedA real recommendation, traceable to pages the model readCheck those pages still say what earned it. Fast to defend, fast to lose
Named warmly, sources[] emptyThe model's own picture of you is goodNothing urgent — but it's the position hardest to notice slipping. Sample it monthly
Named with a caveat, sources[] populatedFraming risk with a return addressRead the cited page, then correct it or publish the better answer. Weeks
Named with a caveat, sources[] emptyA stale idea about you is baked in from what the web used to sayNo single page to fix. Change the wider record — docs, reviews, comparisons. Months
Not named at allInvisible for this intentCoverage first: answer this exact question somewhere you control

Let your agent do it

Don't fancy writing the parser? Give the job to an agent instead — fetching the answers and judging how they read is a single turn's work for it, which is the shape this task wanted anyway. One command:

claude mcp add agentgeo -- npx -y agentgeo-mcp --key ag_live_...

Installed. agentgeo-mcp speaks over stdio with no npm dependencies and a Node.js 18+ floor, and exposes exactly one tool, fetch_raw_answers. From there you describe the task in words:

Fetch what gemini answers for "best accounting software for freelancers". Quote the bullet that mentions Acme, tell me honestly whether that reads as a recommendation or a hedge, and say whether the answer cited any sources — if it did, list them.

Notice the division of labour. The API's job ends at answerText and sources[]. What counts as a recommendation gets decided one layer up, by the agent that knows your positioning, your price point and the description you would consider fair. That boundary is deliberate. It's the reason this is a data layer and not a dashboard: a vendor's sentiment score is someone else's rubric, applied to your category, without ever showing you its working.

Common problems

Five ways this check quietly misleads you, roughly ordered by how often each one does:

  • Naive matching flatters the numbers. Testing "acme" in text will happily fire on "Acmegraph", on an unrelated "Acme Logistics", and on the ordinary English phrase "the acme of". Anchor the match to word boundaries, and keep a short deny-list for the namesakes you already know share your category.
  • An empty sources[] is a diagnosis, not an error. Gemini cites only when it grounds an answer in a live search. A delivered record with no citations is complete and correct — and it's telling you the description you just read came from training-time knowledge rather than from any page you could go and edit today.
  • Don't act on a single fetch. Two identical calls can return different shortlists and different adjectives, so a mention that vanishes once has most likely not vanished. Ask again — a couple of times, ideally on different days — before you conclude anything, and certainly before you tell the team your framing has slipped.
  • language isn't forwarded on this surface. The chatbot scraper behind Gemini takes prompt and country only and rejects a language field, so target markets with country. If you sell in Germany, a US answer tells you nothing about how you're described there — keep it as its own series rather than averaging the two.
  • A long scrape fails, but the answer isn't lost. The synchronous budget is 180 seconds. Overshoot it and you get status: "failed", no charge, and a providerFields.snapshot_id — the scrape carried on running upstream. Send that id back with the same single surface and you collect the finished answer instead of paying for the work twice.

Summary

Asked once, "does Gemini recommend us?" is a question you answer by asking Gemini and reading carefully. Asked every month, across the handful of queries that actually move pipeline, and answered with quotations instead of impressions, it becomes a fetch: pull the records, keep the framing verbatim, keep the grounded flag beside it. A cold description with citations attached is a page you can go and answer this week. A cold description without them is what the web has been saying about you for a year, and that's a longer job.

See the words Gemini actually uses about your product. Start free — no credit card and pull the framing behind every buying query that matters.

Start for free

Frequently asked questions

Does Gemini recommend products?
In practice, yes. Ask it "best accounting software for freelancers" or "alternatives to Acme" and you get named products, each with a sentence explaining why it made the list. Google wouldn't call that an endorsement and formally it isn't one — but a reader who asked which tool to buy and received a reasoned shortlist has been handed a recommendation, whatever the label says.
How do I know if Gemini recommends my product?
Two checks, not one: is your brand in the answer, and what does the surrounding text say about it? Repeatably, that's a single call — POST the query to https://api.agentgeo.org/v1/fetches with "surfaces": ["gemini"], break answerText apart at its bullets and paragraph gaps, and keep whichever blocks match your brand.
Why does Gemini describe my product incorrectly?
Usually because it's answering from what it absorbed about you rather than from a page it read just now — check whether sources[] is empty and you'll know which case you're in. A wrong description with no citations doesn't trace back to a single fixable page: it reflects what the wider web said about you, so correcting it means changing docs, comparisons and third-party write-ups, then giving it time.
Why doesn't Gemini cite sources for its recommendation?
Because it only links pages when it grounds the answer in a live search. When it replies from existing knowledge there is nothing to cite, so the record comes back delivered with an empty sources[] — that's normal on this surface, not a failed fetch. Google AI Overviews behave differently: they're search-grounded by construction, so a delivered record essentially always carries references.
Does AgentGEO tell me whether the mention was positive?
No — and the omission is on purpose. What comes back is the record itself: answer text and sources, with no sentiment, no score and no ranking layered over the top. Deciding whether a description flatters you depends on your positioning and your standards, so it belongs to your agent or your model. Kept there, the rubric is one you can read, argue with, and hold steady from one run to the next.

Keep reading