> ## 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 prompt by integer prompt_id

> Returns the prompt record identified by the integer
`prompt_id` (the 1-based position the prompt occupies inside
the universe — 1, 2, 3, ...). Optional `day` and `engine`
query params pin the lookup to a specific run; without them
the most recent matching row is returned.

Use this when you have a prompt's position from another
endpoint (for example `prompts_rows[*].prompt_id`) and want
the full row including `response_text`.




## OpenAPI

````yaml /openapi.yaml get /universes/{id}/prompts/{prompt_id}
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/{prompt_id}:
    get:
      tags:
        - Prompts
      summary: Get a single prompt by integer prompt_id
      description: |
        Returns the prompt record identified by the integer
        `prompt_id` (the 1-based position the prompt occupies inside
        the universe — 1, 2, 3, ...). Optional `day` and `engine`
        query params pin the lookup to a specific run; without them
        the most recent matching row is returned.

        Use this when you have a prompt's position from another
        endpoint (for example `prompts_rows[*].prompt_id`) and want
        the full row including `response_text`.
      operationId: getPromptByIntId
      parameters:
        - $ref: '#/components/parameters/UniverseId'
        - name: prompt_id
          in: path
          required: true
          schema:
            type: integer
            minimum: 1
          description: 1-based position of the prompt inside the universe.
          example: 1
        - $ref: '#/components/parameters/Day'
        - $ref: '#/components/parameters/Engine'
      responses:
        '200':
          description: OK
          content:
            application/json:
              schema:
                type: object
                properties:
                  data:
                    $ref: '#/components/schemas/PromptRow'
        '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.

````