> ## Documentation Index
> Fetch the complete documentation index at: https://docs.verseodin.com/llms.txt
> Use this file to discover all available pages before exploring further.

# List brands tracked in a universe (mentions + citations + ranking)

> Synthesises a per-brand summary from the universe's history
row — one entry per distinct brand drawn from
`ai_visibility_ranking`, `ai_competitive_analysis`, and
`geo_competitor_analysis`. The output **includes the
universe owner's own brand AND every competitor**.

Each row carries:
  - `brand_name`         — display name (preserves case from source)
  - `trust_mentions`     — count of prompts where the brand was mentioned
  - `share_of_voice`     — share of total brand mentions in this universe (%)
  - `visibility_rank`    — 1-indexed rank by mention frequency
  - `ai_coverage_pct`    — % of prompts covering this brand (AI tab)
  - `geo_coverage_pct`   — % of prompts citing this brand's domain
  - `geo_prompt_count`   — count of prompts citing this brand's domain

Sorted by `visibility_rank` ASC (rank 1 first), then
`trust_mentions` DESC.

If multiple history rows match the filters, the most recent one
is used; the response includes the resolved `day` + `engine`
so callers know exactly which row was consulted.




## OpenAPI

````yaml /openapi.yaml get /universes/{id}/brands
openapi: 3.1.0
info:
  title: Verseodin API
  version: 1.0.0
  description: |
    Read-only HTTP API for pulling Verseodin dashboard data:
    universes, history rows (per-day aggregates of brand visibility,
    citations, and mentions across AI search engines), and full prompt
    records including the AI's response text and cited URLs.

    The same key authorises the Verseodin Claude / MCP connector — one
    credential, two surfaces.
servers:
  - url: https://verseodin.com/api/v1
    description: Production
security:
  - BearerAuth: []
paths:
  /universes/{id}/brands:
    get:
      tags:
        - Brands
      summary: List brands tracked in a universe (mentions + citations + ranking)
      description: |
        Synthesises a per-brand summary from the universe's history
        row — one entry per distinct brand drawn from
        `ai_visibility_ranking`, `ai_competitive_analysis`, and
        `geo_competitor_analysis`. The output **includes the
        universe owner's own brand AND every competitor**.

        Each row carries:
          - `brand_name`         — display name (preserves case from source)
          - `trust_mentions`     — count of prompts where the brand was mentioned
          - `share_of_voice`     — share of total brand mentions in this universe (%)
          - `visibility_rank`    — 1-indexed rank by mention frequency
          - `ai_coverage_pct`    — % of prompts covering this brand (AI tab)
          - `geo_coverage_pct`   — % of prompts citing this brand's domain
          - `geo_prompt_count`   — count of prompts citing this brand's domain

        Sorted by `visibility_rank` ASC (rank 1 first), then
        `trust_mentions` DESC.

        If multiple history rows match the filters, the most recent one
        is used; the response includes the resolved `day` + `engine`
        so callers know exactly which row was consulted.
      operationId: listBrands
      parameters:
        - $ref: '#/components/parameters/UniverseId'
        - $ref: '#/components/parameters/Day'
        - $ref: '#/components/parameters/Engine'
      responses:
        '200':
          description: OK
          content:
            application/json:
              schema:
                type: object
                properties:
                  data:
                    type: array
                    items:
                      $ref: '#/components/schemas/BrandSummary'
                  day:
                    type: string
                    format: date
                    nullable: true
                  engine:
                    type: string
                    nullable: true
              example:
                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
                    geo_prompt_count: 60
                  - brand_name: semrush.com
                    trust_mentions: 25
                    share_of_voice: 11.2
                    visibility_rank: 2
                    ai_coverage_pct: 19.3
                    geo_coverage_pct: 7.4
                    geo_prompt_count: 37
                  - brand_name: tryprofound.com
                    trust_mentions: 14
                    share_of_voice: 6.3
                    visibility_rank: 3
                    ai_coverage_pct: 11
                    geo_coverage_pct: 3.1
                    geo_prompt_count: 16
                day: '2026-04-27'
                engine: chatgpt
        '400':
          $ref: '#/components/responses/BadRequest'
        '401':
          $ref: '#/components/responses/Unauthorized'
        '403':
          $ref: '#/components/responses/Forbidden'
        '404':
          $ref: '#/components/responses/NotFound'
components:
  parameters:
    UniverseId:
      name: id
      in: path
      required: true
      schema:
        type: string
        format: uuid
      description: Universe UUID — see `GET /universes`.
    Day:
      name: day
      in: query
      required: false
      schema:
        type: string
        format: date
      description: >-
        Pin the query to a specific day (`YYYY-MM-DD`). Without this, returns
        the most recent day.
    Engine:
      name: engine
      in: query
      required: false
      schema:
        type: string
        enum:
          - chatgpt
          - gemini
          - grok
          - claude
      description: Filter to a single AI engine. Omit for all.
  schemas:
    BrandSummary:
      type: object
      description: |
        Synthesised per-brand summary built from the universe's
        latest history row. The response of `/universes/{id}/brands`
        is an array of these; `/universes/{id}/brands/{brand}` is one
        of them.
      properties:
        brand_name:
          type: string
          description: Display name (preserves casing from the source history JSON).
          example: verseodin.com
        trust_mentions:
          type: integer
          nullable: true
          description: >-
            Count of prompts where this brand was mentioned in the AI's answer.
            Drawn from `ai_visibility_ranking`.
          example: 42
        share_of_voice:
          type: number
          nullable: true
          description: >-
            This brand's share of total brand mentions in the universe
            (percent). Drawn from `ai_visibility_ranking`.
          example: 18.7
        visibility_rank:
          type: integer
          nullable: true
          description: >-
            1-indexed rank among all brands by trust mention frequency. `1` is
            the most-mentioned brand.
          example: 1
        ai_coverage_pct:
          type: number
          nullable: true
          description: >-
            Percentage of prompts that covered this brand (AI Visibility tab).
            Drawn from `ai_competitive_analysis`.
          example: 32.5
        geo_coverage_pct:
          type: number
          nullable: true
          description: >-
            Percentage of prompts where the AI cited this brand's domain. Drawn
            from `geo_competitor_analysis`.
          example: 12
        geo_prompt_count:
          type: integer
          nullable: true
          description: Count of prompts where this brand's domain was cited at least once.
          example: 60
        day:
          type: string
          format: date
          nullable: true
          description: >-
            Day of the history row this summary was extracted from. Only present
            on the single-brand endpoint.
          example: '2026-04-27'
        engine:
          type: string
          nullable: true
          description: Engine of the history row this summary was extracted from.
          example: chatgpt
    Error:
      type: object
      required:
        - error
      properties:
        error:
          type: object
          required:
            - type
            - message
          properties:
            type:
              type: string
              enum:
                - authentication_error
                - permission_error
                - not_found
                - invalid_request_error
                - rate_limit_error
                - api_error
              description: Machine-readable error category.
            message:
              type: string
              description: Human-readable explanation.
  responses:
    BadRequest:
      description: Malformed request (bad UUID, bad date, etc.).
      content:
        application/json:
          schema:
            $ref: '#/components/schemas/Error'
    Unauthorized:
      description: Missing / invalid / revoked API key.
      content:
        application/json:
          schema:
            $ref: '#/components/schemas/Error'
    Forbidden:
      description: API key is valid but doesn't own the requested universe.
      content:
        application/json:
          schema:
            $ref: '#/components/schemas/Error'
    NotFound:
      description: Universe (or metric, or row) doesn't exist.
      content:
        application/json:
          schema:
            $ref: '#/components/schemas/Error'
  securitySchemes:
    BearerAuth:
      type: http
      scheme: bearer
      bearerFormat: vso_<48 hex chars>
      description: |
        Generate a key at `/dashboard/settings/api-keys`. Pass it as
        `Authorization: Bearer vso_xxx` on every request.

````