POST /api/v1/projects/{project}/reports/visibility
How brands appear in AI answers, at two grains:
- Totals. One row per brand, or per brand per platform, country, topic, tag, prompt or time bucket. Leave
brandout ofdimensionsand the rows aggregate across all tracked brands. - Answer rows. Add
answertodimensionsfor one row per AI answer, newest first. This is the Brand Mentions list. See Answer rows.
Dimensions
Measures
Filters
- Population fields as on the main page.
service in ["chatgpt"]changes the denominator;brand in [...]does not. brandis an entity field:inandnot_inwith brand UUIDs,containswith text matched on the name. It needsbrandindimensions.mention_sentimentis an entity field here, not a population filter. It needsmention_sentimentindimensionsand keeps rows without changing the denominator.- Any measure takes a comparison:
mentions gte 5,visibility lt 0.1,rank lte 3,visibility_change lte -0.05.
Answer rows
Addanswer to dimensions and the report becomes a list: one row per AI answer in the population, newest first. The body, filters, ordering and paging work as for totals. Some fields have no value on one answer, so the API rejects them with answer on the row:
- the compare window,
- the
visibility,coverage,answersandrankmeasures, - the
positiondimension.
citations, search, answered_at and the related blocks below work only with answer on the row.
Row
Withanswer in dimensions, every row carries these columns. Put answer first in dimensions to get them first.
Other dimensions
Measures
Filters
- Population fields as on the main page. To keep only answers negative about a brand, use the
mention_sentimentdimension and an entity filter on it. brandandmention_sentimentare entity fields and need their dimension.answertakesinwith answer UUIDs, orcontainswith text matched on the answer’s full text.searchtakescontainsonly and matches the prompt text or a mention snippet. On a brand row, that brand’s snippet. This is the Mentions page’s search box.- Measures take comparisons:
avg_position lte 3,mentions eq 0,citations gte 1. - Sort by
answered_atfor newest or oldest first.answerandsearchselect rows but do not sort.
Related blocks
Text stays out of the row so the list stays light. Ask for it per page:Top brands per row
"related": ["top_brands"] works on any row that is not an answer: per prompt, topic, platform, country, tag or date. For each returned row it lists the five tracked brands named in most of the answers in the row’s group, whatever brand the row itself is for. Each brand has the number of those answers that name it and its average position there. A tie goes to the lower total position, then the name. This is the Prompts page’s “top brands” column, for the rows on the page only.
BRAND_UUID is your primary brand’s UUID from GET /api/v1/projects/{project}/brands or the values endpoint.
Dashboard
KPI cards: visibility, sentiment, average position
One row for your brand with a compare window. The response also fillsbenchmarks[0] with the trend of the first measure. Reorder measures to put the card’s measure first, or read visibility_change, sentiment_change and avg_position_change from the row.
Visibility chart
Every brand by day. Plot one line perbrand, x = date, y = visibility. Swap date for week or month for the chart’s period toggle.
Industry ranking
Position distribution
How often your brand is named first, second, third and so on.Underperforming prompts
The prompts where your brand shows up least.Recent mentions
The newest answers that name your brand, with sentiment, platform, prompt, position and the other brands in the answer.Brand Rankings
Rankings table with deltas
The Brand Rankings table over the last seven days against the seven before.rank_change is negative when a brand moved up.
{ "field": "brand", "op": "in", "values": ["…", "…"] }. It hides rows and leaves every number and rank as it was.
Top three per platform
rank is assigned within each platform, so a filter on it is “top three on each”.
Compare visibility over time
The competitor chart: pick the brands with abrand filter and plot one line each by week.
Analyse
The matrix
Matrix Analysis is brand × platform with three metrics. Swapservice for country, topic or tag for the other views. Pivot the rows on your side: one row per cell.
Visibility change by platform
Which platforms drove the change for your brand. Sort byvisibility_change ascending to see the drops first.
Prompts
The prompts table
The Prompts report for your brand: one row per prompt.top_brands adds each prompt’s five most-named brands, the table’s “Top brands” column. Add { "field": "prompt", "op": "contains", "value": "running" } for the search box, or a tag / topic population filter for the sidebar filters.
Topics rollup
Prompts are detailed, so roll them up. The same request withtopic gives one row per topic, with the topic’s prompts pooled into one denominator. Prompts without a topic are the row where topic is null.
Visibility by week
Brand Mentions
The mentions list
The Brand Mentions page: every answer that names the selected brand, newest first, 25 per page. Useoffset for the next page and page.total for the pager.
Search
{ "field": "answer", "op": "contains", "value": "battery life" }.
One answer in full
More examples
A few queries you cannot run in the app today, but which the same request shape supports.A project KPI without brand rows
Nodimensions: one row for the whole project. visibility is the mean brand visibility, coverage the share of answers that name any tracked brand.
"dimensions": ["service"] gives the same per platform; ["prompt"] with coverage shows which prompts name nobody you track.
Co-mentions: who appears when you appear
mentions_brand makes “answers that name us” the population. Every other brand’s visibility is then its share of those answers. answers prints the denominator.
Your visibility inside the answers that cite a domain
Where a competitor is named and you are not
mentions_brand with the competitor, brand with you. A row at 0% is a prompt where they appear and you do not.
Every answer, with brand and citation counts
Nobrand dimension: one row per answer whether or not it names anyone.
Answers that name no tracked brand
Answers that name a competitor
mentions_brand makes those answers the population. Add brands_in_answer to see whether you are in them too.