Skip to main content
The /universes/{id}/brands and /universes/{id}/brands/{brand} endpoints expose a brand-centric view of your dashboard data. Instead of querying ai_visibility_ranking, then ai_competitive_analysis, then geo_competitor_analysis and joining them by brand_name yourself, the API does it for you.

What’s on a brand row

Every entry in the response carries seven numbers — three from AI mentions, two from GEO citations, plus rank and share-of-voice. Your own brand sits in the same array as every competitor.
brand_name
string
Display name as it appears in the underlying history arrays. Preserves casing.Example: "verseodin.com", "Semrush", "tryprofound.com"
trust_mentions
integer
Count of prompts where the AI mentioned this brand by name in its answer. Drawn from ai_visibility_ranking.Range: 0 to total_prompts for the universe.
share_of_voice
number
This brand’s mentions as a percentage of total brand mentions in the universe. The share_of_voice values across all brands sum to ~100% (rounding aside).Example: 18.7 means this brand accounts for ~19% of brand mentions across the universe.
visibility_rank
integer
1-indexed rank among all tracked brands by trust_mentions. 1 is the most-mentioned brand. Ties are broken by alphabetical order of brand_name.Tip: if your brand’s rank goes from 3 → 1 over a week, that’s the win you want to track.
ai_coverage_pct
number
Percentage of prompts where the AI mentioned this brand. Drawn from ai_competitive_analysis.coverage_pct.Difference vs trust_mentions: ai_coverage_pct is the rate (mentions / total_prompts × 100); trust_mentions is the count.
geo_coverage_pct
number
Percentage of prompts where the AI cited a URL belonging to this brand’s domain. Independent of whether the brand was named in the prose. Drawn from geo_competitor_analysis.coverage_pct.
geo_prompt_count
integer
Count of prompts where this brand’s domain was cited at least once. Drawn from geo_competitor_analysis.prompt_count.

Three things this view answers in one call

”How is my own brand doing?"

KEY=vso_xxx
UNI=7f45877a-0e8e-498f-bd7f-5e70ef65a2de

curl -H "Authorization: Bearer $KEY" \
  "https://verseodin.com/api/v1/universes/$UNI/brands/verseodin.com"
{
  "data": {
    "brand_name": "verseodin.com",
    "trust_mentions": 42,
    "share_of_voice": 18.7,
    "visibility_rank": 1,
    "ai_coverage_pct": 32.5,
    "geo_coverage_pct": 12.0,
    "geo_prompt_count": 60,
    "day": "2026-04-27",
    "engine": "chatgpt"
  }
}

"How is competitor X doing?”

Same call, just swap the brand name:
curl -H "Authorization: Bearer $KEY" \
  "https://verseodin.com/api/v1/universes/$UNI/brands/semrush.com"

“Show me the leaderboard”

The list endpoint sorts by visibility_rank ASC — top of the array is the most-mentioned brand:
curl -H "Authorization: Bearer $KEY" \
  "https://verseodin.com/api/v1/universes/$UNI/brands"
{
  "data": [
    { "brand_name": "verseodin.com",   "trust_mentions": 42, "visibility_rank": 1, ... },
    { "brand_name": "semrush.com",     "trust_mentions": 25, "visibility_rank": 2, ... },
    { "brand_name": "tryprofound.com", "trust_mentions": 14, "visibility_rank": 3, ... }
  ],
  "day": "2026-04-27",
  "engine": "chatgpt"
}

Filtering

Both endpoints accept the standard ?day= and ?engine= query params:
# Brand snapshot for a specific past day
curl ".../brands?day=2026-04-26"

# Filter to a specific engine (when you have multi-engine data)
curl ".../brands?engine=chatgpt"
If multiple history rows match the filter (e.g. you don’t pass engine= and the universe has multiple engines), the most recent one is used. The response’s day + engine fields tell you which row was actually consulted, so you can detect this.

When a brand isn’t found

The single-brand endpoint returns 404 not_found when:
  • The brand name doesn’t appear in any of the three source arrays for the matched history row, OR
  • No history row matches the day/engine filters
The list endpoint returns 200 with data: [] and day: null, engine: null if the filters match no history row at all.

How this maps onto the raw history columns

If you want to do this synthesis yourself instead of using these endpoints, here are the three source columns:
Field on BrandSummarySource column on history
trust_mentions, share_of_voice, visibility_rankai_visibility_ranking[]
ai_coverage_pctai_competitive_analysis[].coverage_pct
geo_coverage_pct, geo_prompt_countgeo_competitor_analysis[].coverage_pct and .prompt_count
Match brand_name case-insensitively across the three arrays.