get_geo_audit
get_geo_audit MCP tool: fetch a single GEO Audit by id. Status and progress while running, full content once COMPLETED.
Updated 2026-09-20
get_geo_audit fetches a single GEO Audit (one-shot white-label audit) by id. While the audit is still running, the response carries the status, a progress counter and a hint about what the audit is waiting for. Once COMPLETED, the response includes the structured visibility metrics, the prompts actually played, the most cited domains, and the full frozen content: selected competitors, personas, recommendations, content ideas and the audit context.
When to use
After finding an audit with list_geo_audits, call this tool to read its content or to check what it is waiting for. The status field tells you where the audit is in its lifecycle, including whether it is parked at competitor selection (REVIEWING).
Read every figure from metrics. The same numbers appear in the generated recommendation prose ("0 mentions across 148 responses"), but that wording changes on every regeneration and is not a contract.
Input
| Field | Type | Description |
|---|---|---|
auditId |
string (CUID) | The audit id returned by list_geo_audits. The tool returns audit_not_found if no audit with this id exists in the workspace. |
include.pageContent |
boolean | Include the scraped page markdown in auditContext.pages. Off by default (heavy field, several KB per page); withheld pages carry a markdownLength hint instead. |
maxPageChars |
integer | When include.pageContent is true, truncate each page's markdown to this many characters (sets markdownTruncated: true). |
topSourcesLimit |
integer | How many cited domains to return in topSources, most cited first. Default 20, max 100. |
GEO Audits are workspace-scoped, so this tool takes no projectId.
Response
Still running
{
"success": true,
"auditId": "clx_audit_42",
"status": "REVIEWING",
"prospectUrl": "https://prospect.com",
"domain": "prospect.com",
"brandName": "Prospect",
"bulkAuditId": null,
"bulkLabel": null,
"createdAt": "2026-06-20T09:00:00.000Z",
"isComplete": false,
"progress": { "received": 24, "expected": 24 },
"message": "Scans done. The audit is paused at competitor selection — confirm/reject competitors before insights can be generated."
}
The message is status-specific. REVIEWING means the audit is waiting on competitor selection before it can move to insight generation.
Completed
{
"success": true,
"auditId": "clx_audit_42",
"status": "COMPLETED",
"prospectUrl": "https://prospect.com",
"domain": "prospect.com",
"brandName": "Prospect",
"bulkAuditId": null,
"bulkLabel": null,
"createdAt": "2026-06-20T09:00:00.000Z",
"isComplete": true,
"metrics": {
"totalResponses": 148,
"brandMentions": 0,
"visibilityScore": 0,
"rank": 7,
"competitorCount": 6,
"promptsWithoutBrand": 20,
"competitors": [
{ "name": "Acme", "mentions": 16, "share": 10.8 },
{ "name": "Globex", "mentions": 15, "share": 10.1 }
],
"byLlm": [{ "llm": "CHATGPT", "responses": 50, "brandMentions": 0 }],
"byPersona": [{ "personaId": "730b39cd", "responses": 30, "brandMentions": 0 }]
},
"prompts": [
{ "id": "clx_prompt_1", "text": "My skin feels tight, what should I use?", "personaId": "730b39cd", "responses": 6, "brandMentions": 0 }
],
"topSources": [{ "domain": "doctissimo.fr", "citations": 23 }],
"brandAliases": ["Prospect Inc"],
"country": "US",
"language": "en",
"llms": ["CHATGPT", "PERPLEXITY"],
"creditsCost": 24,
"shareSlug": "prospect-9f3a",
"reportUrl": "https://mentionable.ai/share/audit/prospect-9f3a",
"selectedCompetitors": ["Acme", "Globex"],
"personas": [ /* [{ id, name, description }] */ ],
"recommendations": [ /* [{ category, severity, title, description, action, metric? }] */ ],
"contentIdeas": [ /* [{ title, angle }] */ ],
"auditContext": { /* { pages: [{ url, markdownLength }], siteMeta, scannedAt } — page markdown is opt-in via include.pageContent */ },
"completedAt": "2026-06-20T09:12:00.000Z"
}
Field notes:
- One response = one prompt × LLM × persona × occurrence.
metrics.totalResponsescounts them all. visibilityScoreisbrandMentions / totalResponsesas a percentage, one decimal.rankis 1-based:1plus the number of curated competitors mentioned strictly more often than the brand. With no competitor mentioned more often, the brand ranks1.- A competitor's
mentionscounts the responses it appears in, not the occurrences inside a response. Only curated competitors (selectedCompetitors) are counted, so the figures match the share report. metrics.byPersona[].personaIdmaps ontopersonas[].id;nullis the bucket of prompts with no persona. This is the breakdown that shows a brand visible to the general public and absent from the specialist's answers.promptsWithoutBrandcounts the prompts whose responses never mention the brand.topSourcesaggregates the domains cited in the answers, most cited first, capped bytopSourcesLimit.domainis the prospect host without protocol,www.or trailing slash: the join key for an external prospect base.reportUrlis absolute (the workspace's own domain in white-label,mentionable.aiotherwise), so you never concatenateshareSlugyourself.
Not found
{
"success": false,
"error": "audit_not_found",
"message": "No GEO audit with this id exists in your workspace. Verify the auditId returned by list_geo_audits."
}
Tips and patterns
- Branch on
isComplete, not onstatus.metrics,prompts,topSourcesand the frozen content fields (recommendations,contentIdeas, …) only appear whenisComplete: true.domain,bulkAuditIdandbulkLabelare there from the start. - Never parse the prose.
metricsis the contract; recommendation wording is not. - Read
progresswhileSCANNINGto estimate how close the audit is toREVIEWING. REVIEWINGneeds a decision: confirming or rejecting competitors is handled by a dedicated write flow, not by this read tool.
Related tools
- list_geo_audits: list every GEO Audit in the workspace (newest first) without polling individual ids.
- get_page_audit: fetch a Page Audit, a different object.