get_ai_visibility_dashboard
Retrieve a dashboard showing how AI models rank your brand versus competitors, including market maps, mention rates, and scores.
Instructions
Latest AI Visibility: the MARKET MAP (who the AI models recommend in this category, where the customer sits), mention rates, scores, per-model breakdowns, competitor rows. In compact view marketMap.brands is one page, the top rows plus the customer's and every tracked competitor's, with marketMap.brandsPage {offset, limit, total, hasMore}; page with mapOffset/mapLimit. view=full returns every row. Compact runs 20,000-30,000 characters; full grows with the market (113,000 on a 96-company map).
Read summary.promptMarket FIRST. Unless its state is rivals_named_in_most_answers, say the prompts may not describe this market and do not lead with the map. An absent promptMarket could not be produced, never a pass.
Then LEAD WITH THE MARKET: 'N companies make up this market as the AI models draw it (marketMap.coreSize); the customer is Xth of N by how often it is named' (its row: isOwn, rankByPresence). rankByPresence null: 'not named in any answer', never a place or a fall.
Presence is a share of marketMap.answersReceived, never of queries sent. Overlapping presenceLow/presenceHigh are NOT ordered; ties share a rank. Nothing is positional.
A zone names a condition: 'named in under a tenth of answers', never 'irrelevant' or 'tail'. While marketMap.tailIsProvable is false: 'no brand can be ruled out of this market yet'.
Render every explanation.text VERBATIM; never build a claim from a state token.
untrackedCoreBrands: a recommendation to track them, never a fact about them; absent means withheld, not none.
mentionRateGap is CUSTOMER MINUS LEADER: negative means BEHIND. null means nothing to compare, never level.
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, never 'never named'.
A model absent from summary.customer.perProvider was NOT ASKED: never 'not mentioned'. 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. | |
| 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'. |