> ## 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 full prompts row(s) — including AI answer + citations

> Returns full prompt records — every column documented in
`PromptRow`, including `response_text` (the full AI answer
body) and the `my_citations` / `competitor_citations` URL
arrays.

Offset-paginated. Iterate `offset` by `limit` until `data`
comes back empty.




## OpenAPI

````yaml /openapi.yaml get /universes/{id}/prompts
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}/prompts:
    get:
      tags:
        - Prompts
      summary: Get full prompts row(s) — including AI answer + citations
      description: |
        Returns full prompt records — every column documented in
        `PromptRow`, including `response_text` (the full AI answer
        body) and the `my_citations` / `competitor_citations` URL
        arrays.

        Offset-paginated. Iterate `offset` by `limit` until `data`
        comes back empty.
      operationId: listPrompts
      parameters:
        - $ref: '#/components/parameters/UniverseId'
        - $ref: '#/components/parameters/Day'
        - $ref: '#/components/parameters/Engine'
        - name: status
          in: query
          required: false
          schema:
            type: string
            enum:
              - pending
              - processing
              - completed
              - failed
          description: Filter by lifecycle status.
        - name: limit
          in: query
          required: false
          schema:
            type: integer
            minimum: 1
            maximum: 1000
            default: 200
        - name: offset
          in: query
          required: false
          schema:
            type: integer
            minimum: 0
            default: 0
      responses:
        '200':
          description: OK
          content:
            application/json:
              schema:
                type: object
                properties:
                  data:
                    type: array
                    items:
                      $ref: '#/components/schemas/PromptRow'
                  limit:
                    type: integer
                  offset:
                    type: integer
        '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:
    PromptRow:
      type: object
      description: |
        Single row from the `prompts` table — one row per
        `(universe, day, engine, prompt_id)`. Every column is documented
        below as a separate response field. **`response_text` carries the
        full AI answer body** and `my_citations` / `competitor_citations`
        carry the actual cited URLs.
      properties:
        id:
          type: string
          format: uuid
          description: Prompt row UUID.
        day:
          type: string
          format: date
        user_id:
          type: string
          format: uuid
        universe_id:
          type: string
          format: uuid
        job_id:
          type: string
          format: uuid
        prompt_id:
          type: integer
          description: >-
            1-indexed position of the prompt within the universe (stable across
            days).
        prompt_text:
          type: string
          description: The natural-language query that was sent to the AI assistant.
        engine:
          type: string
          enum:
            - chatgpt
            - gemini
            - grok
            - claude
          description: AI assistant the prompt was run against.
        engine_account:
          type: string
          nullable: true
          description: >-
            Scraper pipeline that produced the row. One of `BD_chatgpt`,
            `BD_gemini`, `BD_grok`, `BD_perplexity` (Bright Data) or null/empty
            for legacy Cloro rows.
        website:
          type: object
          description: >-
            Universe's website object captured at run time — `{url, location,
            brand_tokens?}`.
        competitor_websites:
          type: array
          description: Competitor URL list captured at run time.
          items:
            type: object
        priority_level:
          type: integer
          description: Internal scheduling priority (0 = normal, higher = run sooner).
        provider:
          type: string
          nullable: true
          description: Underlying scraping provider (e.g. `brightdata`).
        attempts:
          type: integer
          nullable: true
          description: >-
            How many scrape attempts were spent before the row reached its
            terminal state.
        snapshot_id:
          type: string
          nullable: true
          description: >-
            Bright Data snapshot identifier — useful for cross-referencing in
            their dashboard.
        status:
          type: string
          enum:
            - pending
            - processing
            - completed
            - failed
          description: Terminal states are `completed` and `failed`.
        error_text:
          type: string
          nullable: true
          description: Failure reason — only set when `status='failed'`.
        created_at:
          type: string
          format: date-time
        started_at:
          type: string
          format: date-time
          nullable: true
          description: When the scrape was claimed for processing.
        finished_at:
          type: string
          format: date-time
          nullable: true
          description: When the scrape reached a terminal state.
        response_text:
          type: string
          nullable: true
          description: |
            **Full AI answer body** as returned by the assistant. Plain
            text with markdown formatting preserved. Empty/null while
            `status` is pending or processing.
        appeared_links:
          type: array
          description: >-
            Every URL the AI mentioned in its answer (in order of appearance,
            may include duplicates).
          items:
            type: string
        appeared_links_unique:
          type: array
          description: De-duplicated `appeared_links`.
          items:
            type: string
        appeared_links_run1:
          type: array
          description: >-
            Links from scrape run 1. Bright Data fires one run per snapshot, so
            for BD-produced rows this equals `appeared_links`.
          items:
            type: string
        appeared_links_run2:
          type: array
          description: >-
            Links from scrape run 2 (legacy Cloro double-run architecture).
            Empty for Bright Data rows.
          items:
            type: string
        my_citations:
          type: array
          nullable: true
          description: |
            URLs from the AI's answer that point at **your** domain
            (matched against the universe's `website`).
          items:
            type: string
        competitor_citations:
          type: array
          nullable: true
          description: |
            URLs from the AI's answer that point at **competitor**
            domains (matched against the universe's competitor list).
          items:
            type: string
        total_citations_count:
          type: integer
          description: >-
            Total cited URLs in this answer (yours + competitor +
            uncategorised).
        my_domain_citations_count:
          type: integer
          description: Count of citations to your domain.
        my_brand_mentions_count:
          type: integer
          description: >-
            Count of times the AI mentioned your brand by name in the answer
            text (regardless of citation).
        model_used:
          type: string
          nullable: true
          description: The model identifier the AI returned (e.g. `gpt-4o`, `gpt-5-3`).
        web_search_triggered:
          type: boolean
          nullable: true
          description: >-
            Whether the AI invoked web search while answering. Useful when
            comparing answers — search-backed answers tend to cite more.
        cost_milli_cents:
          type: integer
          nullable: true
          description: >-
            Cost of producing this row in 1/1000 of a cent (so 1234 = $0.01234).
            Internal accounting only — exposed so customers running their own
            cost tracking can reconcile.
    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.

````