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

# List models

> The models the API can run, with expected price and (when known) availability for this workspace.



## OpenAPI

````yaml /openapi/voyager-api.yaml get /models
openapi: 3.1.0
info:
  title: Voyager API
  description: >-
    Generate images, video, speech, music, sound effects and 3D with your
    Voyager workspace's credits. Authenticate with `Authorization: Bearer
    vy_live_…`. Every response carries `X-Request-ID` and the
    `X-RateLimit-Limit` / `X-RateLimit-Remaining` / `X-RateLimit-Reset` (seconds
    until the window resets) headers; a 429 adds `Retry-After`. Errors share one
    envelope (`ErrorResponse`).
  version: 1.0.0
  x-voyager-agent-prompt: >
    Set up the Voyager API in this project.


    Voyager generates images, video, speech, music, sound effects, 3D and object
    masks with the same models

    and credits as the Voyager app. Docs: https://docs.voyager.so/api 
    (agent-readable:

    https://docs.voyager.so/llms.txt, OpenAPI:
    https://api.voyager.so/v1/openapi.json)


    1. Key: read it from the env var VOYAGER_API_KEY. Never hard-code it or
    commit it; add
       VOYAGER_API_KEY= to .env.example and make sure .env is git-ignored. If it's missing,
       ask me to create one at https://voyager.so/dashboard/api (paid plans).
    2. Base URL https://api.voyager.so/v1, header: Authorization: Bearer
    $VOYAGER_API_KEY

    3. Pick a model: GET
    /models?type=image|video|speech|music|sound_effect|3d|segment. Read
       GET /models/{id} for its input_schema before building a request.
    4. Optional cost check: POST /estimate with the same body as step 5; it
    returns
       estimated_charge (credits) and can_run.
    5. Create: POST /jobs {"model": "<id>", "operation": "<op>", "input": {...}}
    with an Idempotency-Key header
       (a new UUID per logical request; reuse it when retrying the same request).
    6. Wait: GET /jobs/{id}?wait=25 until status is succeeded, failed or
    canceled
       (honor Retry-After / poll_after_ms). Or pass "webhook_url" and verify the
       Standard Webhooks signature with the secret from the dashboard.
    7. Results: job.outputs[].url is a signed link valid for 1 hour; download it
    right
       away, or GET /jobs/{id} again for a fresh link. Files are kept 30 days.
    8. Errors are {"error": {"code","message","retryable",...}}. 402 = out of
    credits or
       not on a paid plan (show error.details.upgrade_url to me). 429 = slow down: wait
       Retry-After seconds. Retry only when retryable is true, with the same Idempotency-Key.

    Minimal example (curl):
      curl -s https://api.voyager.so/v1/jobs \
        -H "Authorization: Bearer $VOYAGER_API_KEY" -H "Content-Type: application/json" \
        -H "Idempotency-Key: $(uuidgen)" \
        -d '{"model":"nano-banana-2.1","operation":"text-to-image","input":{"prompt":"a red fox in snow","aspect_ratio":"16:9"}}'
      curl -s "https://api.voyager.so/v1/jobs/<job id>?wait=25" -H "Authorization: Bearer $VOYAGER_API_KEY"

    Write a small typed client (create → wait → download) with retries as above,
    then

    generate one test image to prove it works and tell me what it cost
    (job.credits.charged;

    if credits.state is still "pending", report job.credits.estimated and say
    it's an estimate).
servers:
  - url: https://api.voyager.so/v1
    description: Production
security: []
paths:
  /models:
    get:
      tags:
        - Models
      summary: List models
      description: >-
        The models the API can run, with expected price and (when known)
        availability for this workspace.
      operationId: listModels
      parameters:
        - name: type
          in: query
          required: false
          schema:
            anyOf:
              - enum:
                  - image
                  - video
                  - speech
                  - music
                  - sound_effect
                  - 3d
                  - segment
                type: string
              - type: 'null'
            description: Only models of this job type.
            title: Type
          description: Only models of this job type.
        - name: operation
          in: query
          required: false
          schema:
            anyOf:
              - type: string
                enum:
                  - text-to-image
                  - edit
                  - text-to-video
                  - image-to-video
                  - reference-to-video
                  - tts
                  - music
                  - sound-effects
                  - text-to-3d
                  - image-to-3d
                  - image-to-3d-body
                  - align-3d
                  - segment-image
                  - segment-image-data
                  - segment-video
                  - segment-video-data
                  - segment-everything
                  - image-embedding
              - type: 'null'
            description: Only models that run this operation.
            title: Operation
          description: Only models that run this operation.
        - name: q
          in: query
          required: false
          schema:
            anyOf:
              - type: string
                maxLength: 100
              - type: 'null'
            description: Words in the id, name or description.
            title: Q
          description: Words in the id, name or description.
        - name: limit
          in: query
          required: false
          schema:
            type: integer
            maximum: 100
            minimum: 1
            default: 50
            title: Limit
        - name: cursor
          in: query
          required: false
          schema:
            anyOf:
              - type: string
                maxLength: 400
              - type: 'null'
            title: Cursor
      responses:
        '200':
          description: Successful Response
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ModelList'
          headers:
            X-Request-ID:
              $ref: '#/components/headers/X-Request-ID'
            X-RateLimit-Limit:
              $ref: '#/components/headers/X-RateLimit-Limit'
            X-RateLimit-Remaining:
              $ref: '#/components/headers/X-RateLimit-Remaining'
            X-RateLimit-Reset:
              $ref: '#/components/headers/X-RateLimit-Reset'
        '400':
          description: Invalid request.
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ErrorResponse'
          headers:
            X-Request-ID:
              $ref: '#/components/headers/X-Request-ID'
            X-RateLimit-Limit:
              $ref: '#/components/headers/X-RateLimit-Limit'
            X-RateLimit-Remaining:
              $ref: '#/components/headers/X-RateLimit-Remaining'
            X-RateLimit-Reset:
              $ref: '#/components/headers/X-RateLimit-Reset'
        '401':
          description: Missing, invalid or revoked API key.
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ErrorResponse'
          headers:
            X-Request-ID:
              $ref: '#/components/headers/X-Request-ID'
            X-RateLimit-Limit:
              $ref: '#/components/headers/X-RateLimit-Limit'
            X-RateLimit-Remaining:
              $ref: '#/components/headers/X-RateLimit-Remaining'
            X-RateLimit-Reset:
              $ref: '#/components/headers/X-RateLimit-Reset'
        '429':
          description: Rate limited. Retry after Retry-After seconds.
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ErrorResponse'
          headers:
            X-Request-ID:
              $ref: '#/components/headers/X-Request-ID'
            X-RateLimit-Limit:
              $ref: '#/components/headers/X-RateLimit-Limit'
            X-RateLimit-Remaining:
              $ref: '#/components/headers/X-RateLimit-Remaining'
            X-RateLimit-Reset:
              $ref: '#/components/headers/X-RateLimit-Reset'
            Retry-After:
              $ref: '#/components/headers/Retry-After'
        '503':
          description: Temporarily unavailable. Retry with backoff.
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ErrorResponse'
          headers:
            X-Request-ID:
              $ref: '#/components/headers/X-Request-ID'
            X-RateLimit-Limit:
              $ref: '#/components/headers/X-RateLimit-Limit'
            X-RateLimit-Remaining:
              $ref: '#/components/headers/X-RateLimit-Remaining'
            X-RateLimit-Reset:
              $ref: '#/components/headers/X-RateLimit-Reset'
      security:
        - bearerAuth: []
components:
  schemas:
    ModelList:
      properties:
        object:
          type: string
          const: list
          title: Object
          default: list
          description: Always "list".
        data:
          items:
            $ref: '#/components/schemas/ModelSummary'
          type: array
          title: Data
          description: This page's items.
        has_more:
          type: boolean
          title: Has More
          description: Whether another page follows.
        next_cursor:
          anyOf:
            - type: string
            - type: 'null'
          title: Next Cursor
          description: Pass as `cursor` to read the next page; null on the last page.
      type: object
      required:
        - data
        - has_more
        - next_cursor
      title: ModelList
    ErrorResponse:
      properties:
        error:
          $ref: '#/components/schemas/ErrorBody'
          description: What went wrong.
      type: object
      required:
        - error
      title: ErrorResponse
      description: Every non-2xx answer.
    ModelSummary:
      properties:
        object:
          type: string
          const: model
          title: Object
          default: model
          description: Always "model".
        id:
          type: string
          title: Id
          description: Pass as `model` to POST /v1/jobs.
        name:
          type: string
          title: Name
          description: The model's display name.
        type:
          type: string
          enum:
            - image
            - video
            - speech
            - music
            - sound_effect
            - 3d
            - segment
          title: Type
          description: The kind of output it makes.
        summary:
          anyOf:
            - type: string
            - type: 'null'
          title: Summary
          description: One line on what the model is.
        best_for:
          anyOf:
            - type: string
            - type: 'null'
          title: Best For
          description: What the model is good for.
        default:
          type: boolean
          title: Default
          description: >-
            Whether this is Voyager's recommended model for its type (a
            suggestion only: `model` is always required).
        status:
          type: string
          title: Status
          description: active, preview or retired.
        operations:
          items:
            type: string
            enum:
              - text-to-image
              - edit
              - text-to-video
              - image-to-video
              - reference-to-video
              - tts
              - music
              - sound-effects
              - text-to-3d
              - image-to-3d
              - image-to-3d-body
              - align-3d
              - segment-image
              - segment-image-data
              - segment-video
              - segment-video-data
              - segment-everything
              - image-embedding
          type: array
          title: Operations
          description: Operations this model runs, e.g. text-to-image, edit.
        available:
          anyOf:
            - type: boolean
            - type: 'null'
          title: Available
          description: >-
            Whether this workspace can run it now; null when not known (decided
            when the job is accepted).
        unavailable_reason:
          anyOf:
            - type: string
              enum:
                - plan_locked
                - access_required
                - access_pending
                - access_denied
                - update_required
                - unavailable
                - retired
            - type: 'null'
          title: Unavailable Reason
          description: Why not, when available is false.
        required_plan:
          anyOf:
            - type: string
            - type: 'null'
          title: Required Plan
          description: The lowest Voyager plan that runs it, when known.
        price:
          anyOf:
            - $ref: '#/components/schemas/Price'
            - type: 'null'
          description: >-
            Expected charge; null when not known. POST /v1/estimate is
            authoritative.
      type: object
      required:
        - id
        - name
        - type
        - default
        - status
        - operations
        - price
      title: ModelSummary
    ErrorBody:
      properties:
        type:
          $ref: '#/components/schemas/ErrorType'
          description: Stable category to branch on.
        code:
          type: string
          enum:
            - invalid_request
            - invalid_input
            - content_policy
            - upstream_unavailable
            - rate_limited
            - queue_full
            - model_unavailable
            - model_not_found
            - insufficient_credits
            - paid_plan_required
            - model_not_in_plan
            - model_access_required
            - outcome_unknown
            - expired
            - not_found
            - conflict
            - forbidden
            - internal_error
            - catalog_unavailable
            - billing_unavailable
            - no_voyager_seat
            - credits_reloading
            - cast_not_supported
            - voice_cloning_unavailable
            - too_many_references
            - payload_too_large
            - upload_too_large
            - intake_full
            - invalid_url
            - fetch_failed
            - unsupported_file
            - invalid_api_key
            - idempotency_conflict
            - idempotency_in_flight
            - invalid_idempotency_key
            - invalid_cursor
            - invalid_webhook_url
            - method_not_allowed
            - account_unavailable
            - plan_required_for_faces
            - version_conflict
            - slug_taken
            - already_referenced
            - asset_in_use
            - upload_incomplete
            - cancel_unsupported
            - unsupported_model
            - invalid_job_id
            - voice_required
            - observation_timeout
            - reference_unavailable
            - queue_timeout
            - reference_missing
          title: Code
          description: >-
            Stable machine code; never renamed once published (x-voyager-errors
            lists each).
        message:
          type: string
          title: Message
          description: For developers. Not localized.
        doc_url:
          type: string
          title: Doc Url
          description: https://docs.voyager.so/api/errors#<code>
        request_id:
          anyOf:
            - type: string
            - type: 'null'
          title: Request Id
          description: Also in the X-Request-ID header; quote it to support.
        retryable:
          anyOf:
            - type: boolean
            - type: 'null'
          title: Retryable
          description: Whether the same request can succeed later.
        retry_after_ms:
          anyOf:
            - type: integer
            - type: 'null'
          title: Retry After Ms
          description: How long to wait before retrying.
        param:
          anyOf:
            - type: string
            - type: 'null'
          title: Param
          description: >-
            The request field at fault, as a path (e.g. input.resolution); set
            on invalid_input.
        details:
          anyOf:
            - additionalProperties: true
              type: object
            - type: 'null'
          title: Details
          description: Code-specific detail, e.g. upgrade_url on a billing wall.
      type: object
      required:
        - type
        - code
        - message
        - doc_url
      title: ErrorBody
    Price:
      properties:
        basis:
          type: string
          enum:
            - rate
            - example
          title: Basis
          description: >-
            rate: an exact per-unit charge; example: the charge at the settings
            in points[].when.
        unit:
          type: string
          title: Unit
          description: >-
            What one charge buys: image, second, video, request, 1k_chars,
            minute, track…
        estimated_charge:
          anyOf:
            - type: number
            - type: 'null'
          title: Estimated Charge
          description: >-
            Expected credits per unit at the cheapest listed settings. An
            estimate, never a cap.
        estimated_charge_max:
          anyOf:
            - type: number
            - type: 'null'
          title: Estimated Charge Max
          description: Expected credits per unit at the dearest.
      type: object
      required:
        - basis
        - unit
        - estimated_charge
      title: Price
    ErrorType:
      type: string
      enum:
        - invalid_request
        - authentication
        - permission
        - not_found
        - conflict
        - rate_limited
        - idempotency_conflict
        - unprocessable
        - upstream_error
        - internal_error
      title: ErrorType
      description: Closed set of high-level categories SDKs branch on.
  headers:
    X-Request-ID:
      description: This request's id (also error.request_id).
      schema:
        type: string
    X-RateLimit-Limit:
      description: >-
        Requests allowed per 60 seconds in this bucket (120 writes or 600 reads
        per minute per key).
      schema:
        type: integer
    X-RateLimit-Remaining:
      description: Requests left in this window.
      schema:
        type: integer
    X-RateLimit-Reset:
      description: Seconds until the window resets.
      schema:
        type: integer
    Retry-After:
      description: Seconds to wait before retrying.
      schema:
        type: integer
  securitySchemes:
    bearerAuth:
      type: http
      description: A Voyager API key from https://voyager.so/dashboard/api.
      scheme: bearer
      bearerFormat: vy_live_…

````

This documentation is built and hosted on [Mintlify](https://mintlify.com), a developer documentation platform.