Skip to main content
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 brand out of dimensions and the rows aggregate across all tracked brands.
  • Answer rows. Add answer to dimensions for one row per AI answer, newest first. This is the Brand Mentions list. See Answer rows.
Read the Reports API page first for the request shape, filter roles and the compare window.

Dimensions

Measures

Filters

  • Population fields as on the main page. service in ["chatgpt"] changes the denominator; brand in [...] does not.
  • brand is an entity field: in and not_in with brand UUIDs, contains with text matched on the name. It needs brand in dimensions.
  • mention_sentiment is an entity field here, not a population filter. It needs mention_sentiment in dimensions and 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

Add answer 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, answers and rank measures,
  • the position dimension.
citations, search, answered_at and the related blocks below work only with answer on the row.

Row

With answer 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_sentiment dimension and an entity filter on it.
  • brand and mention_sentiment are entity fields and need their dimension.
  • answer takes in with answer UUIDs, or contains with text matched on the answer’s full text.
  • search takes contains only 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_at for newest or oldest first. answer and search select rows but do not sort.
All text matching is case-insensitive. 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.
In the examples below, 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 fills benchmarks[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.
The citations card lives on the sources entity.

Visibility chart

Every brand by day. Plot one line per brand, 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 are an answer rows query.

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.
To show only your starred competitors, add { "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 a brand filter and plot one line each by week.

Analyse

The matrix

Matrix Analysis is brand × platform with three metrics. Swap service 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 by visibility_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 with topic 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. Use offset for the next page and page.total for the pager.
The page’s filters map directly:
To search the answer text itself rather than the prompt and snippet, use { "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

No dimensions: 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

No brand 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.