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

# Get a prompt

> One prompt: its text, the country it is measured in, when it last ran, and each of your brands' subscription to it with its topic and status. 404 if none of your brands tracks it.



## OpenAPI

````yaml /openapi.json get /v1/prompts/{id}
openapi: 3.1.0
info:
  title: Geoptie API
  version: 1.0.0
  summary: Read and manage your AI-search visibility data.
  description: >-
    Everything the Geoptie dashboard can do, over HTTP.


    **Authentication.** Every request needs an API key as `Authorization: Bearer
    <key>`, and the workspace must have an active or trialing subscription. Keys
    are created in the dashboard and scoped to one workspace.


    **Pagination** is cursor-based. Pass `next_cursor` back as `cursor` and stop
    when `has_more` is false. The cursor is opaque; do not parse it.


    **Dates** are ISO 8601. `from` is inclusive, `to` is exclusive. Omitting
    both gives the last 30 days.


    **Limits** exist to stop runaway clients, not to meter you: there is no
    monthly request ceiling. Every response carries `X-RateLimit-*`, and
    endpoints that spend money carry `X-Endpoint-*` as well. A 429 names which
    limit was hit.


    **Errors** always carry a stable `error.code`. Match on that, never on the
    message text. A verb that an endpoint does not declare returns 405
    `method_not_allowed`.
  contact:
    name: Geoptie support
    email: support@geoptie.com
servers:
  - url: https://api.geoptie.com
    description: Production
security:
  - bearerAuth: []
tags:
  - name: Brands
    description: The brands you track. A brand owns its prompts, engines and country.
  - name: Prompts
    description: >-
      The questions you track across engines, the answers they returned, and the
      brands named in those answers. Plan limits apply to how many you can
      track.
  - name: Visibility
    description: How often and how prominently a brand appears in engine answers.
  - name: Citations
    description: Which pages engines cited when answering your prompts.
  - name: Competitors
    description: Your share of voice against the other brands appearing in your prompts.
  - name: Topics
    description: Optional grouping for prompts within a brand.
  - name: Recommendations
    description: Generated actions for improving visibility, and their lifecycle.
  - name: Audit reports
    description: On-demand GEO analysis of a single URL.
  - name: Content generations
    description: >-
      New articles, written from the pages engines already cite for the prompts
      you track. Research a brief first, then write the article from it.
  - name: Content optimizations
    description: >-
      Pages you already have, scored for AI search with the specific changes
      that would raise the score.
paths:
  /v1/prompts/{id}:
    get:
      tags:
        - Prompts
      summary: Get a prompt
      description: >-
        One prompt: its text, the country it is measured in, when it last ran,
        and each of your brands' subscription to it with its topic and status.
        404 if none of your brands tracks it.
      operationId: getPrompt
      parameters:
        - name: id
          in: path
          required: true
          description: Prompt id.
          schema:
            type: string
            format: uuid
          example: b7c1e5a0-4f3d-42a8-9c6b-1e8d5a2f7043
      responses:
        '200':
          description: Success
          content:
            application/json:
              schema:
                type: object
                required:
                  - data
                properties:
                  data:
                    $ref: '#/components/schemas/PromptDetail'
        '400':
          $ref: '#/components/responses/E400'
        '401':
          $ref: '#/components/responses/E401'
        '402':
          $ref: '#/components/responses/E402'
        '403':
          $ref: '#/components/responses/E403'
        '404':
          $ref: '#/components/responses/E404'
        '429':
          $ref: '#/components/responses/E429'
        '500':
          $ref: '#/components/responses/E500'
components:
  schemas:
    PromptDetail:
      type: object
      properties:
        id:
          type: string
          format: uuid
        text:
          type: string
        country:
          type:
            - string
            - 'null'
        subscriptions:
          type: array
          description: >-
            One entry per brand of yours that tracks this prompt. Prompt rows
            are deduplicated by text, so several brands can track the same one,
            each under its own topic. Topic and status belong to the
            subscription, not the prompt.
          items:
            type: object
            properties:
              brand_id:
                type: string
                format: uuid
              status:
                type: string
                enum:
                  - active
                  - paused
                  - archived
              topic_id:
                type:
                  - string
                  - 'null'
                format: uuid
              tracked_since:
                type:
                  - string
                  - 'null'
                format: date-time
        created_at:
          type: string
          format: date-time
        last_checked:
          type:
            - string
            - 'null'
          format: date-time
    Error:
      type: object
      required:
        - error
      properties:
        error:
          type: object
          required:
            - code
            - message
          properties:
            code:
              type: string
              description: Stable machine code. Match on this, not the message.
            message:
              type: string
  responses:
    E400:
      description: >-
        Bad request. `missing_parameter`, `invalid_request`, `invalid_engine` or
        `invalid_date`.
      content:
        application/json:
          schema:
            $ref: '#/components/schemas/Error'
    E401:
      description: '`missing_api_key` or `invalid_api_key`.'
      content:
        application/json:
          schema:
            $ref: '#/components/schemas/Error'
    E402:
      description: >-
        `subscription_required`. The workspace has no active or trialing
        subscription.
      content:
        application/json:
          schema:
            $ref: '#/components/schemas/Error'
    E403:
      description: '`plan_not_eligible` or `forbidden`.'
      content:
        application/json:
          schema:
            $ref: '#/components/schemas/Error'
    E404:
      description: '`not_found`. Also returned for records belonging to another workspace.'
      content:
        application/json:
          schema:
            $ref: '#/components/schemas/Error'
    E429:
      description: >-
        `rate_limited`, `quota_exceeded`, `endpoint_rate_limited` or
        `concurrency_limited`.
      content:
        application/json:
          schema:
            $ref: '#/components/schemas/Error'
    E500:
      description: '`internal_error`. Quote the `X-Request-Id` when reporting it.'
      content:
        application/json:
          schema:
            $ref: '#/components/schemas/Error'
  securitySchemes:
    bearerAuth:
      type: http
      scheme: bearer
      description: 'Your API key, e.g. `Authorization: Bearer gp_live_...`.'

````