How to check if Microsoft Copilot mentions your brand
Ask Microsoft Copilot the question your buyers ask and look for two separate things: your brand in the written reply, and your domain in the sources it lists underneath. Because Copilot runs a live Bing search under the hood and writes from what it finds, most replies arrive with a citation list — denser and steadier than Gemini's, close to what Perplexity gives you — so the domain check is usually there to run.
Checking one query is a browser tab. Checking thirty, on a schedule, with citation positions preserved, is one call: POST to https://api.agentgeo.org/v1/fetches with "surfaces": ["copilot"] and test answerText and sources[] separately. This guide covers both, the agent version over MCP, and the mistakes that make the result misleading.
To check whether Microsoft Copilot mentions your brand, ask it the question your customers ask and look in two places: the reply text, for your name, and the Bing sources it cites, for your domain. Those are different results with different fixes. One query is a browser tab; a query set on a schedule is one API call per query and a short script.
The manual way (and why it stops working)
Open Copilot at copilot.microsoft.com, ask the question a buyer would ask — say "best help desk software for startups" — and read the reply. Then expand the sources, because the cited pages are the part you can act on. Search the reply for your brand name and the source list for your domain separately: the prose can name you without citing you, and it can cite you without naming you. Do that across your five most valuable queries and you have an honest baseline in about fifteen minutes, at no cost.
The first pass is worth the hour. The second pass is where it falls apart:
- One question per tab. Thirty queries means thirty reads, and Copilot's answers are long enough that scanning both the prose and the sources carefully is slow work.
- The answer is re-grounded every time. Copilot runs a fresh Bing search on each ask, so the set of cited pages genuinely shifts between runs. What you read once is a sample of a moving target.
- Nothing is diffable. You can screenshot a source list. You cannot subtract last week's screenshot from this week's and get the two domains that changed.
- Positions die in transcription. Cited first and cited eighth are very different outcomes, and a hand-copied list almost never keeps the order intact.
- It stops at the browser. No CSV, no row in a client report, no weekly job, and no way to hand a colleague the result as data rather than a description of it.
Do it with one API call
Send the query to AgentGEO with copilot in the surfaces array and the managed-scraper engine returns the same thing the browser shows you, structured: the reply text, and every cited source with its title, URL and position. It is one of the six engines the same endpoint reaches.
curl -X POST https://api.agentgeo.org/v1/fetches \
-H "Authorization: Bearer ag_live_..." \
-H "Content-Type: application/json" \
-d '{"query": "best help desk software for startups", "surfaces": ["copilot"], "country": "US"}'The record comes back as clean JSON — no HTML to parse, no selectors to keep alive as the frontend changes. The signal you want sits in two fields: answerText for the name, and sources[] for the domain and its position:
{
"id": "run_5d9a3f0c72b1",
"query": "best help desk software for startups",
"surfaces": ["copilot"],
"status": "completed",
"recordsDelivered": 1,
"creditsCharged": 1,
"answers": [
{
"surfaceKey": "copilot",
"status": "delivered",
"answerText": "For startups, Globex is often recommended for its fast setup, while Acme stands out for automation and a shared inbox that scales ...",
"sources": [
{ "title": "Best help desk software for startups", "url": "https://example.com/help-desk-startups", "position": 1 },
{ "title": "Acme — help desk pricing and plans", "url": "https://acme.com/pricing", "position": 2 },
{ "title": "Globex vs Initech", "url": "https://globex.com/compare/initech", "position": 3 }
],
"fetchedAt": "2026-07-19T10:03:12Z",
"latencyMs": 11840
}
]
}From there the check is two independent tests. Keep them independent — collapsing "named" and "cited" into a single boolean throws away the most actionable distinction this engine gives you:
import requests
from urllib.parse import urlparse
BRAND = "Acme"
DOMAIN = "acme.com"
QUERY = "best help desk software for startups"
resp = requests.post(
"https://api.agentgeo.org/v1/fetches",
json={"query": QUERY, "surfaces": ["copilot"], "country": "US"},
headers={"Authorization": "Bearer ag_live_your_key_here"},
timeout=200, # the API waits up to 180s for live surfaces
)
resp.raise_for_status()
answer = resp.json()["answers"][0]
# A slow scrape comes back failed at zero credits — retry copilot
# later (see Common problems for how to redeem the finished answer).
if answer.get("status") == "failed":
raise SystemExit("no record this run — retry copilot later")
text = answer.get("answerText") or ""
sources = answer.get("sources", [])
# 1. Named in the reply?
named = BRAND.lower() in text.lower()
# 2. Cited in Copilot's Bing sources — and at what position?
cited_at = None
for src in sources:
host = urlparse(src["url"]).netloc.lower()
host = host[4:] if host.startswith("www.") else host
if host == DOMAIN or host.endswith("." + DOMAIN):
cited_at = src["position"]
break
print(f"query: {QUERY}")
print(f"named: {named}")
print(f"cited: {'position ' + str(cited_at) if cited_at else 'no'}")
print(f"sources ({len(sources)}):")
for src in sources:
print(f" {src['position']:>2}. {src['title']} — {src['url']}")That prints three facts per query: whether you were named, whether you were cited and at what position, and the full list of pages that fed the answer — evidence, not a score. Loop it over your query set and you have a visibility table. One delivered record is one credit; a failed record costs nothing. Swap in an ag_test_ key to see the shape with clearly-labelled demo records at zero credits before you spend anything.
Read the two columns together and every query lands in one of a few states, each with a different move:
| What you see | What it means | What to do |
|---|---|---|
Named in the reply, domain in sources[] | The strongest position: you're both the recommendation and the Bing-cited evidence. | Keep the cited page current — it's carrying the answer. |
| Named, but domain absent from sources | Copilot knows your brand but built this reply out of other people's pages. | Publish the reference content yourself so the citation can be yours. |
| Not named, but your domain is cited | Your page fed the answer while a rival got the mention. | Make your product the subject of your own claims, not a footnote to them. |
| Neither named nor cited | Invisible for this query — a coverage problem, not a ranking one. | Answer this exact question directly on a page Bing can index. |
Delivered, but sources[] is empty | Copilot answered from model memory this run instead of browsing. | Treat any mention as fragile; earn a Bing-visible page so the next run cites you. |
Copilot grounds its answers in a live Bing search, so most delivered records carry a sources[] list of real URLs you can actually open — denser and steadier than Gemini's (which is frequently empty) and broadly comparable to Perplexity. That makes the citation check unusually concrete here: when your domain is missing on your own category query, open what was cited instead. That's the Bing-ranked page the model chose over yours — the exact page you have to beat.
Let your agent do it
The same records are available over MCP, which means the check can be a sentence instead of a script — and the agent that fetches the answer can then go read the page that beat you. Wire it in once with a single command:
claude mcp add agentgeo -- npx -y agentgeo-mcp --key ag_live_...The agentgeo-mcp package runs over stdio with zero npm dependencies on Node.js 18+, exposing a single tool: fetch_raw_answers. query and surfaces are required; country defaults to "US", so say "in Germany" when you want a different market. (Copilot's scraper takes a country and no language field.) Then ask for the work in plain language:
Fetch Copilot's answer for 'best help desk software for startups'. Is Acme named in the reply, and is acme.com in the Bing sources it cited — and at what position?
The tool returns records and nothing else — no visibility score, no sentiment, no ranking; that judgment stays with you, because a GEO data layer hands back raw answers and your agent already knows your site and your competitors. If you'd rather script it, the Python and curl paths hit the identical endpoint.
Common problems
Five failure modes worth designing around before you trust the numbers:
www.and subdomains.www.acme.com,docs.acme.comandacme.com/blogare all you. Normalise the host before comparing — lowercase it, strip a leadingwww., accept any suffix match on your root domain — or you'll systematically under-count your own citations.- Named is not cited. Test
answerTextandsources[]separately and store both columns. The combinations mean different things and only one of them is "you're fine". - Copilot doesn't cite on every reply. Because it's a chatbot, a delivered record can arrive with an empty
sources[]when the model answered from memory without browsing. That's a real state, not an error — don't read it as "nobody was cited"; log it and treat any mention in it as unearned until a Bing-visible page backs it. - A slow scrape returns
failedat zero credits — with a snapshot to redeem. When Copilot is slow, the record comes backstatus: "failed", cost 0, carrying aproviderFields.snapshot_id. A follow-up call with that id andcopilotalone redeems the finished answer instead of paying to scrape it again — so retry the same single surface rather than re-running the whole query set. - Country changes the answer; language is rejected.
countrydefaults to"US"and is the locale lever that works here — a German market has its own Bing results and its own cited domains. Copilot's scraper does not take alanguagefield (that only reaches Google AI Overviews), so measure other markets as separate query sets rather than averaging them into a number that describes nowhere.
Summary
For a one-off look, ask Copilot yourself and read both the reply and its Bing sources — the free path is genuinely informative here because a citation list usually comes with the answer. When the check has to repeat across a query set, land in a report, or run on a schedule, fetch it: one call per query returns the text and the structured citation list, and the named-versus-cited split tells you which of two very different problems you actually have.
See whether Copilot names you — and whether it cites you in its Bing sources. Start free — no credit card and check your first query in a minute.
Start for freeFrequently asked questions
- How do I check if Microsoft Copilot mentions my brand?
- Ask Copilot your category question and look for your brand in the reply text and your domain in the Bing sources it cites — they're separate results. To do it repeatedly, POST the query to
https://api.agentgeo.org/v1/fetcheswith"surfaces": ["copilot"]and testanswerTextfor the name andsources[]for the domain. - Does Microsoft Copilot cite its sources?
- Usually. Copilot is built on OpenAI models and grounded in a live Bing web search, so most delivered replies carry a numbered source list — denser and more reliable than Gemini's, which is frequently empty. It isn't guaranteed on every answer, though: when Copilot replies from model memory without browsing,
sources[]can come back empty. - Why is my page cited in Copilot but my brand not named?
- It means your page was useful enough for Bing to surface and Copilot to use, but the reply was written around someone else. Usually the page reads as neutral background rather than a claim about your product. The fix is editorial: make your product the subject of the sentences a model would want to lift, instead of a footnote to a general explanation.
- Can I check Copilot brand mentions without scraping it myself?
- Yes. AgentGEO runs a managed-scraper engine on your behalf and returns the reply and its citations as structured JSON, so you make an ordinary HTTP request instead of driving a headless browser, rotating proxies, or maintaining HTML selectors that break on a frontend deploy.
- What happens if a Copilot fetch is slow or times out?
- The record comes back with
status: "failed"at zero credits, carrying aproviderFields.snapshot_id. Callhttps://api.agentgeo.org/v1/fetchesagain with that id and"surfaces": ["copilot"]to redeem the finished answer instead of paying to scrape again — you only spend a credit on a delivered record.
Keep reading