Monitor your AI share of voice
AI share of voice is one ratio: of all the times an AI answer names a brand in your category, how many of those times is it you. It is the AI-answer era's version of the rank report — except there is no public rank to read, so the only honest way to get the number is to fetch the answers themselves and count. AgentGEO does the fetching: one API call returns the answer ChatGPT, Perplexity, Gemini, Google AI Overviews, Google AI Mode or Copilot gave, as JSON. The counting stays in your code — twenty lines, shown below — so the number you report is one you can audit down to the individual answer.
Read this page with an AI
The job: a recurring number per engine — your mentions divided by all tracked-brand mentions — over a fixed query set, with history you can diff. Everything else on this page is the shortest honest path to that.
Want the baseline without writing code? Get a free AI-visibility audit → · Read the docs → — No card, no account.
Get my free auditHow share-of-voice monitoring works on raw answers
- Fix a query set. Ten to fifty questions your buyers actually ask — "best [category] for [audience]", "[competitor] alternatives", "how do I [job]". The set must stay fixed between runs, or the trend line measures your edits, not the market.
- Fetch every query against every engine you care about. One
POST /v1/fetchesper query names the engines insurfaces; each delivered answer is one record, one credit. - Count mentions and divide. Case-insensitive search of
answerTextfor each tracked brand, yours included. Share of voice = your mentions ÷ all tracked-brand mentions. Store the per-answer rows, not just the ratio, so any number can be traced back to the answer that produced it.
import requests
BRANDS = ["Acme", "Northwind", "Globex"] # yours first
QUERIES = [
"best project management software for agencies",
"project management tools with client portals",
]
SURFACES = ["chatgpt", "perplexity", "gemini"]
mentions = {b: 0 for b in BRANDS}
for query in QUERIES:
resp = requests.post(
"https://api.agentgeo.org/v1/fetches",
json={"query": query, "surfaces": SURFACES},
headers={"Authorization": "Bearer ag_live_your_key_here"},
timeout=200, # the API holds up to 180s on slow surfaces
)
resp.raise_for_status()
for answer in resp.json()["answers"]:
text = (answer.get("answerText") or "").lower()
for brand in BRANDS:
if brand.lower() in text:
mentions[brand] += 1
total = sum(mentions.values()) or 1
for brand, n in sorted(mentions.items(), key=lambda kv: -kv[1]):
print(f"{brand:10} {n:3} mentions {n / total:6.1%} share of voice")Run it weekly — a cron, a CI job, or a schedule in the AgentGEO console — and append each run's rows to a file. The diff between two runs is the deliverable: who gained, who lost, on which questions, on which engines.
| Metric | Formula | What it tells you |
|---|---|---|
| Mention rate | answers naming you ÷ all answers | Your absolute visibility, independent of competitors. |
| Share of voice | your mentions ÷ all tracked-brand mentions | Your position in the conversation the answers are having. |
| Citation share | answers citing your domain ÷ answers with sources | Whether your pages — not just your name — feed the answers. Match on the domain in sources[].url, never on titles. |
Google AI Overviews needs two denominators. An overview doesn't appear for every query, so report presence rate (queries with an overview ÷ all queries) separately from mention rate among the overviews that appeared. One blended number silently mixes "Google didn't answer" with "Google answered and skipped you".
Let your agent run it
The same data is exposed over MCP, and the geo-share-of-voice skill — one of eight that ship inside the agentgeo-mcp package — walks any connected agent through exactly this workflow: fetch, count, compare, report. Install once and ask in plain language:
claude mcp add agentgeo -- npx -y agentgeo-mcp --key ag_live_...Alternatives
GEO dashboards like Profound or Peec AI will hand you a share-of-voice score. The trade: their query set, their counting rules, their seat pricing — and a number you can't decompose when a client asks where it came from. Scraping the engines yourself gets you raw data and a permanent browser-automation maintenance bill. The data-layer position is the middle: raw records from one API, counting rules you wrote, a number you can defend.
More use cases
The same records power competitor visibility tracking and AI Overviews monitoring — see all use cases.
See your baseline first: Get a free AI-visibility audit → · Full endpoint reference →
Get my free audit