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

# Estimate Render

> Roughly how long and how much a Vork render takes. With `from_job` or `sample` it scales this scene's own
measured speed (scenes vary a lot); otherwise it uses recent real renders on that GPU, or built-in typical speeds
until there are enough. `alternatives` gives the same job on the other Vork presets your plan runs, and
`recommendation` names one that saves real wall time (a long render on render-2x or render-4x).



## OpenAPI

````yaml /openapi/voyager-api.yaml post /machines/estimate
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`); a method a path does not take is 405
    `method_not_allowed`. Some catalog operations run only through the Voyager
    MCP today (voice-change, text-to-motion, retexture, convert-3d, uv-unwrap;
    `x-voyager-mcp-only-operations`): this API's model listings leave them out.
  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, object
    masks, upscaled media and separated audio 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|upscale|audio_separation.
    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:
  /machines/estimate:
    post:
      tags:
        - machines
      summary: Estimate Render
      description: >-
        Roughly how long and how much a Vork render takes. With `from_job` or
        `sample` it scales this scene's own

        measured speed (scenes vary a lot); otherwise it uses recent real
        renders on that GPU, or built-in typical speeds

        until there are enough. `alternatives` gives the same job on the other
        Vork presets your plan runs, and

        `recommendation` names one that saves real wall time (a long render on
        render-2x or render-4x).
      operationId: estimateCloudMachineRender
      requestBody:
        content:
          application/json:
            schema:
              $ref: '#/components/schemas/MachineEstimateRequest'
        required: true
      responses:
        '200':
          description: Successful Response
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/MachineEstimate'
          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: The request is invalid (`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 or invalid credential.
          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'
        '402':
          description: >-
            Not enough credits (`INSUFFICIENT_CREDITS`); `details.upgrade_url`
            links to billing.
          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'
        '403':
          description: >-
            This workspace needs a paid Voyager plan with a completed payment
            (`PLAN_REQUIRED`, `VERIFICATION_REQUIRED`; `details.upgrade_url`),
            or the key lacks a scope.
          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'
        '404':
          description: No such machine, job or path.
          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'
        '409':
          description: >-
            The machine is in the wrong state for this (e.g. `MACHINE_PAUSED`:
            resume it first, `MACHINE_NOT_READY`, `MACHINE_RELEASED`), or the
            Idempotency-Key was used for a different 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'
        '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'
        '500':
          description: >-
            Something went wrong on our side. Retry, or quote request_id to
            support.
          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'
        '503':
          description: >-
            No capacity or a temporary outage; 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'
      security:
        - API Key: []
components:
  schemas:
    MachineEstimateRequest:
      properties:
        preset:
          anyOf:
            - type: string
            - type: 'null'
          title: Preset
          description: The preset to estimate for (`render`, the default).
        gpu:
          anyOf:
            - type: string
            - type: 'null'
          title: Gpu
          description: Or a GPU model, e.g. `L4`.
        frames:
          anyOf:
            - type: integer
              maximum: 10000000
              minimum: 1
            - type: 'null'
          title: Frames
          description: Frames to render (1 for a still). Or `seconds` and `fps`.
        seconds:
          anyOf:
            - type: number
              exclusiveMinimum: 0
            - type: 'null'
          title: Seconds
          description: Video length in seconds (with `fps`).
        fps:
          anyOf:
            - type: number
              maximum: 1000
              exclusiveMinimum: 0
            - type: 'null'
          title: Fps
          description: Frames per second (with `seconds`).
        resolution:
          anyOf:
            - type: string
            - type: 'null'
          title: Resolution
          description: >-
            `720p`, `1080p`, `1440p`, `4k` (or `480p`, `WxH`). Default
            1920x1080.
        width:
          anyOf:
            - type: integer
              maximum: 16384
              minimum: 16
            - type: 'null'
          title: Width
          description: Or a width in pixels (with `height`).
        height:
          anyOf:
            - type: integer
              maximum: 16384
              minimum: 16
            - type: 'null'
          title: Height
          description: Or a height in pixels (with `width`).
        profile:
          type: string
          enum:
            - std/previs
            - std/draft
            - std/final
            - std/path
          title: Profile
          description: The Vork render profile.
          default: std/final
        include_setup:
          anyOf:
            - type: boolean
            - type: 'null'
          title: Include Setup
          description: >-
            Add the one-time `vork setup` of a new machine. Default: true,
            unless the machine (`machine_id`, or `from_job`'s) already ran `vork
            setup`.
        machine_id:
          anyOf:
            - type: string
            - type: 'null'
          title: Machine Id
          description: 'A machine of yours: its GPU and image.'
        from_job:
          anyOf:
            - type: string
            - type: 'null'
          title: From Job
          description: >-
            A finished `vork render` job of this scene on one of your machines:
            scale its measured speed (basis `this_scene`). Its machine's GPU is
            used unless you name one.
        sample:
          anyOf:
            - $ref: '#/components/schemas/MachineRenderSample'
            - type: 'null'
          description: Or a render of this scene you timed yourself (basis `this_scene`).
      additionalProperties: false
      type: object
      title: MachineEstimateRequest
    MachineEstimate:
      properties:
        gpu:
          type: string
          title: Gpu
          description: The GPU the estimate is for.
        preset:
          anyOf:
            - type: string
            - type: 'null'
          title: Preset
          description: Its preset, when it matches one.
        frames:
          type: integer
          title: Frames
          description: Frames estimated.
        width:
          type: integer
          title: Width
          description: Width in pixels.
        height:
          type: integer
          title: Height
          description: Height in pixels.
        profile:
          type: string
          title: Profile
          description: The Vork render profile.
        seconds_low:
          type: number
          title: Seconds Low
          description: Fast end of the whole job, setup included when asked.
        seconds_typical:
          type: number
          title: Seconds Typical
          description: Typical whole job, setup included when asked.
        seconds_high:
          type: number
          title: Seconds High
          description: >-
            Slow end, including up to a couple of minutes of first-use scene
            compilation.
        seconds_per_frame:
          type: number
          title: Seconds Per Frame
          description: Typical seconds per frame at this size and profile.
        setup_seconds:
          type: number
          title: Setup Seconds
          description: Typical one-time `vork setup` seconds included (0 when not).
        usd_per_minute:
          anyOf:
            - type: number
            - type: 'null'
          title: Usd Per Minute
          description: The GPU's live price per minute (null when not offered now).
        credits_per_minute:
          anyOf:
            - type: number
            - type: 'null'
          title: Credits Per Minute
          description: The same in credits.
        usd_low:
          anyOf:
            - type: number
            - type: 'null'
          title: Usd Low
          description: Cost at `seconds_low`.
        usd_high:
          anyOf:
            - type: number
            - type: 'null'
          title: Usd High
          description: Cost at `seconds_high`.
        credits_low:
          anyOf:
            - type: number
            - type: 'null'
          title: Credits Low
          description: Credits at `seconds_low`.
        credits_high:
          anyOf:
            - type: number
            - type: 'null'
          title: Credits High
          description: Credits at `seconds_high`.
        basis:
          type: string
          enum:
            - default
            - measured
            - this_scene
          title: Basis
          description: >-
            `this_scene`: scaled from a render of this scene (`from_job` or
            `sample`); `measured`: from recent real Vork renders on this GPU;
            `default`: built-in typical speeds.
        samples:
          type: integer
          title: Samples
          description: Renders the estimate is based on (0 for `default`).
        note:
          type: string
          title: Note
          description: What to tell the user, for agents.
        alternatives:
          items:
            $ref: '#/components/schemas/MachineEstimateAlternative'
          type: array
          title: Alternatives
          description: >-
            The same job on the other Vork presets your plan runs (render-lite,
            render, render-2x, render-4x), frames split across a multi-GPU
            machine's GPUs.
        recommendation:
          anyOf:
            - $ref: '#/components/schemas/MachineEstimateRecommendation'
            - type: 'null'
          description: >-
            A preset that saves at least 30% of the wall time (and at least a
            minute) for at most 1.5x the total cost, the extra cost in its
            reason (null when none does).
      type: object
      required:
        - gpu
        - preset
        - frames
        - width
        - height
        - profile
        - seconds_low
        - seconds_typical
        - seconds_high
        - seconds_per_frame
        - setup_seconds
        - usd_per_minute
        - credits_per_minute
        - usd_low
        - usd_high
        - credits_low
        - credits_high
        - basis
        - samples
        - note
      title: MachineEstimate
    ErrorResponse:
      properties:
        error:
          $ref: '#/components/schemas/ErrorBody'
          description: What went wrong.
      type: object
      required:
        - error
      title: ErrorResponse
      description: Every non-2xx answer.
    MachineRenderSample:
      properties:
        frames:
          type: integer
          minimum: 1
          title: Frames
          description: Frames the measured render made.
        seconds:
          type: number
          exclusiveMinimum: 0
          title: Seconds
          description: How long it took (Vork's `Rendered N frames in X s`).
        width:
          type: integer
          maximum: 16384
          minimum: 16
          title: Width
          description: Its width in pixels.
        height:
          type: integer
          maximum: 16384
          minimum: 16
          title: Height
          description: Its height in pixels.
        profile:
          type: string
          enum:
            - std/previs
            - std/draft
            - std/final
            - std/path
          title: Profile
          description: Its Vork profile.
          default: std/final
      additionalProperties: false
      type: object
      required:
        - frames
        - seconds
        - width
        - height
      title: MachineRenderSample
    MachineEstimateAlternative:
      properties:
        preset:
          type: string
          title: Preset
          description: The preset.
        gpu:
          type: string
          title: Gpu
          description: Its GPU.
        gpus:
          type: integer
          title: Gpus
          description: GPUs per machine.
        seconds_low:
          type: number
          title: Seconds Low
          description: Fast end of the whole job on this preset.
        seconds_typical:
          type: number
          title: Seconds Typical
          description: Typical whole job on this preset.
        seconds_high:
          type: number
          title: Seconds High
          description: Slow end on this preset.
        usd_low:
          anyOf:
            - type: number
            - type: 'null'
          title: Usd Low
          description: Cost at `seconds_low` (whole machine).
        usd_high:
          anyOf:
            - type: number
            - type: 'null'
          title: Usd High
          description: Cost at `seconds_high`.
        credits_low:
          anyOf:
            - type: number
            - type: 'null'
          title: Credits Low
          description: Credits at `seconds_low`.
        credits_high:
          anyOf:
            - type: number
            - type: 'null'
          title: Credits High
          description: Credits at `seconds_high`.
        speedup:
          type: number
          title: Speedup
          description: >-
            Wall-time speed against the main estimate (2.0 = done in half the
            time).
      type: object
      required:
        - preset
        - gpu
        - gpus
        - seconds_low
        - seconds_typical
        - seconds_high
        - usd_low
        - usd_high
        - credits_low
        - credits_high
        - speedup
      title: MachineEstimateAlternative
    MachineEstimateRecommendation:
      properties:
        preset:
          type: string
          title: Preset
          description: The recommended preset.
        reason:
          type: string
          title: Reason
          description: One sentence to tell the user.
      type: object
      required:
        - preset
        - reason
      title: MachineEstimateRecommendation
    ErrorBody:
      properties:
        type:
          $ref: '#/components/schemas/ErrorType'
          description: Stable category to branch on.
        code:
          type: string
          title: Code
          description: >-
            Stable machine code; never renamed once published. An open set:
            x-voyager-errors lists the API's codes, and a refusal passed through
            from a model or /v1/machines may carry another; branch on type for a
            code you don't know.
          x-extensible-enum:
            - invalid_request
            - invalid_input
            - content_policy
            - upstream_unavailable
            - input_too_large
            - 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
            - catalog_invalid
            - billing_unavailable
            - no_voyager_seat
            - credits_reloading
            - cast_not_supported
            - voice_cloning_unavailable
            - too_many_references
            - input_too_long
            - 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
            - no_eligible_model
            - cap_unverifiable
            - decision_expired
            - decision_mismatch
            - decision_price_changed
            - account_unavailable
            - plan_required_for_faces
            - version_conflict
            - slug_taken
            - already_referenced
            - asset_in_use
            - upload_incomplete
            - cancel_unsupported
            - unsupported_cast_version
            - cast_version_required
            - cast_empty_package
            - cast_selection_invalid
            - cast_not_found
            - cast_version_mismatch
            - cast_capacity_exceeded
            - cast_images_required
            - cast_prompt_too_long
            - cast_plan_changed
            - unsupported_model
            - invalid_job_id
            - voice_required
            - observation_timeout
            - reference_unavailable
            - queue_timeout
            - reference_missing
        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.
        loc:
          anyOf:
            - items:
                type: string
              type: array
            - type: 'null'
          title: Loc
          description: >-
            param as a path of parts (e.g. ["input", "resolution"]); set
            whenever param is.
        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
    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:
    API Key:
      type: http
      description: API key from Settings > Developer > REST API
      scheme: bearer

````

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