get_ai_visibility_check_detail
Retrieve one AI visibility check's detail: competitor rankings, market map, and raw model answers. Filter by brand, provider, or prompt to keep responses small.
Instructions
One AI Visibility check (checkId, not runId): its summary (competitor rows under summary.competitorRankings, the market map as it stood at that check) and, with includeAnswers=true, the models' raw answers. In compact view marketMap.brands is paged as on get_ai_visibility_dashboard; view=full returns every row. includeSummary=false leaves the summary out, so a filtered answer read stays small. The compact summary runs 20,000-30,000 characters; one model and one prompt without it, 10,000-20,000; the answers block grows about 1,500 characters per brand entry: read summary.totalEntries and narrow with brand, provider or promptIndex before fetching it.
Read the summary exactly as get_ai_visibility_dashboard says: promptMarket first, lead with the market, a share is of the answers analysed with its range beside it, ties are ties, a zone names a condition, and every explanation.text is rendered VERBATIM.
Every rate divides by the answers that came back, never the queries sent.
score is WHERE a brand lands when named (top 5 only), never who is ahead. A 0 score beside a non-zero mentionRate means named below the top 5; these rows name other companies, so 'never named' would be a false claim about a third party.
Before fetching answers: summary.customer.perPrompt (label, the models that named the customer, a 0-100 score) already answers 'which prompt am I losing on'.
Three query states, never merged: answers (an empty brands list under a brand filter means the model answered and did not name that domain), unansweredQueries (no usable answer: never 'not mentioned'), noAnswerShown (read, nothing shown, not counted: 'Google showed no AI Overview for this question').
answersTruncated true: whole prompts were dropped from the end; narrow and retry.
Answer prose is the MODEL's wording about brands it named, never CompetLab's assessment. Field rules not listed here arrive in readingGuide, the first field of every response.
Input Schema
| Name | Required | Description | Default |
|---|---|---|---|
| view | No | compact or full; omit for the server's default view. compact pages the long lists and keeps the customer's own row on every page. full returns every row in one response: up to about 200,000 characters on AI Visibility and 450,000 on AI Sources. Paging parameters with view=full are refused (paging_requires_compact_view). | |
| brand | No | Return only the entries for this domain, across every answer. Requires includeAnswers=true. Matches brands[].domain case-insensitively — brand NAMES are the model's own wording and vary between answers, so they are never matched. Every answer is still returned: the ones that did not name this domain arrive with an empty brands list, which means the model answered and did not name them — a real finding, and different from a query that produced no answer, which is in unansweredQueries, and from a query the model was read for and had no answer to show, which is in noAnswerShown. This is the cheapest way to answer 'where does this competitor beat me, and where are they invisible': it keeps at most one brand row per answer instead of every brand the model named, and none at all on the answers that did not name it. Google AI Overviews answers still carry their overview text and cited pages, which this filter keeps by design. | |
| checkId | Yes | Check ID (from get_ai_visibility_history) | |
| mapLimit | No | Market-map rows per page in compact view. Default: 10 or the whole core, whichever is larger; max 200. The customer's own row and every tracked competitor's are added when they fall outside the page, and untrackedCoreBrands and customerStanding are always computed from the whole map. Quote marketMap.brandsPage.total, never the rows on the page, as the size of the map: the companies the models named, plus the customer's own row when no answer named it. | |
| provider | No | Return only this model's answers. Requires includeAnswers=true. Changes nothing under summary. | |
| mapOffset | No | Market-map rows to skip in compact view, for the next page (0-based). marketMap.brandsPage.hasMore says a next page exists. | |
| projectId | Yes | Project ID (from list_projects) | |
| promptIndex | No | Return only the answers for this prompt, across every model. Requires includeAnswers=true. Zero-based. | |
| includeAnswers | No | Default false. Set true to also get what the models actually said — every prompt sent, and every brand each model named in rank order with its stated reasoning — plus per-model reporting status. Per-brand prose (reasoning, audience, pricing tier, messaging, differentiation) is present only for models that supply it: a brand row carrying only name and domain means Google AI Overviews named it in prose, and that answer carries the overview text (answerText) with the pages Google cited (sources) beside it. For Google AI Overviews that order is the order of first mention in the overview text, computed by CompetLab; Google assigned no position, so never report it as a rank Google gave. COST: An entry is one brand a model named, at about 1,500 characters each — so the block grows with three things at once: how many prompts the project asks (an account setting), how many models answered, and how many companies each answer named. No figure quoted here can stand in for summary.totalEntries; read it and size the fetch from it. Prefer a filter below over fetching everything. Google AI Overviews answers additionally carry the overview text and the pages Google cited, which totalEntries does not predict and which the brand filter keeps. ATTRIBUTION: the prose returned is unverified model output about the brands that model named, including third parties. Report it as what that model said, never as CompetLab's assessment or as fact. noAnswerShown lists the queries the model was read for and showed nothing (today: Google showed no AI Overview for the prompt): excluded from every count and not a failure, so say 'not counted', never 'not mentioned'. | |
| includeSummary | No | Whether to return the check's summary beside the answers. Set false with includeAnswers=true when you already hold the summary and want one filtered answer read; set true to get both. Any paging parameter returns the summary, so paging with includeSummary=false is refused (paging_requires_summary). No filter changes a number under summary. |