> ## 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.

# Get a single brand's summary (mentions + citations + ranking)

> Same row format as `/universes/{id}/brands` but filtered to
one brand. Match is case-insensitive against `brand_name`.

Returns `404` if the brand isn't tracked in this universe (or
if no history row matches the day/engine filters).




## OpenAPI

````yaml /openapi.yaml get /universes/{id}/brands/{brand}
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/{brand}:
    get:
      tags:
        - Brands
      summary: Get a single brand's summary (mentions + citations + ranking)
      description: |
        Same row format as `/universes/{id}/brands` but filtered to
        one brand. Match is case-insensitive against `brand_name`.

        Returns `404` if the brand isn't tracked in this universe (or
        if no history row matches the day/engine filters).
      operationId: getBrand
      parameters:
        - $ref: '#/components/parameters/UniverseId'
        - name: brand
          in: path
          required: true
          schema:
            type: string
          description: |
            Brand identifier to look up — typically the domain
            (`semrush.com`) or the brand name string as it appears in
            `ai_visibility_ranking[].brand_name`. URL-encode if it
            contains characters needing escape (slashes, spaces).
          example: verseodin.com
        - $ref: '#/components/parameters/Day'
        - $ref: '#/components/parameters/Engine'
      responses:
        '200':
          description: OK
          content:
            application/json:
              schema:
                type: object
                properties:
                  data:
                    $ref: '#/components/schemas/BrandSummary'
              example:
                data:
                  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
                  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.

````