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

# Get a Video Job

> Returns a job owned by the authenticated account. Other Apps owned by that account can read it; cross-account reads return 404.

Successful, unexpired jobs include a fresh download URL. If refreshing the link fails, the request returns 503 while the saved job remains succeeded. Output expiry returns expired without a link. Download the MP4 before job.expiresAt; refreshing a link does not extend retention.



## OpenAPI

````yaml /openapi/video-open-api.json get /video-jobs/{jobId}
openapi: 3.0.3
info:
  title: Spatius Video API
  version: 1.0.0
  description: >-
    Generate an MP4 from an existing Avatar and an audio URL. Submit a job, poll
    its status, and download the result. Video API access requires separate
    account enablement. See the [Video generation
    guide](/api-reference/video-generation) and
    [Authentication](/api-reference/authentication).
servers:
  - url: https://console.spatius.ai/v1/open
    description: Spatius Console API (global)
security:
  - AppId: []
    ApiKey: []
tags:
  - name: Videos
    description: Submit asynchronous video generation jobs.
  - name: Video Jobs
    description: Read video job history and get fresh MP4 download links.
paths:
  /video-jobs/{jobId}:
    get:
      tags:
        - Video Jobs
      summary: Get a Video Job
      description: >-
        Returns a job owned by the authenticated account. Other Apps owned by
        that account can read it; cross-account reads return 404.


        Successful, unexpired jobs include a fresh download URL. If refreshing
        the link fails, the request returns 503 while the saved job remains
        succeeded. Output expiry returns expired without a link. Download the
        MP4 before job.expiresAt; refreshing a link does not extend retention.
      operationId: getVideoJob
      parameters:
        - name: jobId
          in: path
          required: true
          schema:
            type: string
            format: uuid
          description: Job ID returned by Create a Video.
      responses:
        '200':
          description: Job detail, with a fresh MP4 URL when available.
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/GetVideoJobResponse'
              example:
                job:
                  id: 6f1e2b3c-9a1d-4e5f-8b0a-2c4d6e8f0a1b
                  status: succeeded
                  avatarId: d385dd22-9200-4806-94a0-dce464ca916d
                  name: Welcome video
                  progress:
                    stage: completed
                  createdAt: '2026-09-12T09:00:00Z'
                  updatedAt: '2026-09-12T09:01:00Z'
                  completedAt: '2026-09-12T09:01:00Z'
                  expiresAt: '2026-09-19T09:00:05Z'
                videoUrl: https://example.com/output/video.mp4?signature=example
                videoUrlExpiresAt: '2026-09-12T09:16:00Z'
        '400':
          $ref: '#/components/responses/InvalidRequest'
        '401':
          $ref: '#/components/responses/Unauthorized'
        '403':
          $ref: '#/components/responses/Forbidden'
        '404':
          $ref: '#/components/responses/NotFound'
        '429':
          $ref: '#/components/responses/RateLimited'
        '500':
          $ref: '#/components/responses/InternalError'
        '503':
          $ref: '#/components/responses/ServiceUnavailable'
components:
  schemas:
    GetVideoJobResponse:
      type: object
      required:
        - job
      properties:
        job:
          $ref: '#/components/schemas/VideoJob'
        videoUrl:
          type: string
          description: >-
            Fresh signed MP4 download URL, returned only for succeeded,
            unexpired output. Download without App authentication headers. The
            current link lifetime is 15 minutes, capped by job.expiresAt.
          format: uri
        videoUrlExpiresAt:
          type: string
          description: Effective download-link expiry. Omitted when videoUrl is absent.
          format: date-time
    VideoJob:
      type: object
      required:
        - id
        - status
        - avatarId
        - name
        - createdAt
        - updatedAt
      description: >-
        Account-owned job summary. Source URLs, storage keys, service
        credentials, and internal task identifiers are not returned.
      properties:
        id:
          type: string
          description: Console job ID.
          format: uuid
        status:
          $ref: '#/components/schemas/VideoJobStatus'
        avatarId:
          type: string
          description: Avatar used for this job.
          format: uuid
        name:
          type: string
          description: Job name.
        progress:
          $ref: '#/components/schemas/VideoJobProgress'
        error:
          $ref: '#/components/schemas/VideoJobError'
        createdAt:
          type: string
          description: Job acceptance time.
          format: date-time
        updatedAt:
          type: string
          description: Last saved job update.
          format: date-time
        completedAt:
          type: string
          description: Terminal-state timestamp, when available.
          format: date-time
        expiresAt:
          type: string
          description: >-
            Output retention deadline, when known. Currently seven days after
            render submission, rather than completion. Job history remains
            available after expiry.
          format: date-time
    Error:
      type: object
      description: The single public error envelope returned by every Spatius API endpoint.
      properties:
        error:
          type: object
          properties:
            code:
              type: string
              description: Stable machine-readable error code.
              enum:
                - unauthorized
                - forbidden
                - invalid_request
                - not_found
                - conflict
                - rate_limit_exceeded
                - service_unavailable
                - internal_error
            message:
              type: string
              description: Human-readable explanation specific to this occurrence.
            requestId:
              type: string
              description: >-
                Unique identifier for this request. Quote it when contacting
                support.
    VideoJobStatus:
      type: string
      enum:
        - queued
        - processing
        - succeeded
        - failed
        - expired
      description: >-
        New jobs start queued. Successful output becomes expired after its
        retention deadline. Failed jobs remain failed.
    VideoJobProgress:
      type: object
      properties:
        stage:
          type: string
          description: >-
            Current progress stage. This is not a percentage or a
            completion-time estimate.
          enum:
            - queued
            - downloading
            - uploading_assets
            - submitting
            - driving
            - rendering
            - encoding
            - uploading
            - completed
            - failed
            - expired
    VideoJobError:
      type: object
      required:
        - code
        - message
        - retryable
      description: A terminal job failure, separate from an HTTP request error.
      properties:
        code:
          type: string
          description: >-
            Stable failure code. See [Video job
            errors](/api-reference/video-generation#job-errors).
          minLength: 1
          maxLength: 128
        message:
          type: string
          description: Safe, human-readable explanation.
          minLength: 1
          maxLength: 1024
        retryable:
          type: boolean
          description: >-
            Whether a new job may succeed after addressing the cause. A terminal
            failure does not automatically start another render. Use a new
            requestId when creating the replacement job.
  responses:
    InvalidRequest:
      description: The request has invalid fields, settings, or pagination.
      content:
        application/json:
          schema:
            $ref: '#/components/schemas/Error'
          example:
            error:
              code: invalid_request
              message: Invalid video request or presentation settings.
              requestId: b3f0c2d1-4a5b-4c6d-8e9f-0a1b2c3d4e5f
    Unauthorized:
      description: Missing or mismatched App credentials, or an inactive owner account.
      content:
        application/json:
          schema:
            $ref: '#/components/schemas/Error'
          example:
            error:
              code: unauthorized
              message: Unauthorized.
              requestId: b3f0c2d1-4a5b-4c6d-8e9f-0a1b2c3d4e5f
    Forbidden:
      description: >-
        Video access is absent, creation is disabled, or Avatar access is
        denied. Disabling creation alone preserves reads.
      content:
        application/json:
          schema:
            $ref: '#/components/schemas/Error'
          example:
            error:
              code: forbidden
              message: Video API access is not configured.
              requestId: b3f0c2d1-4a5b-4c6d-8e9f-0a1b2c3d4e5f
    NotFound:
      description: The job does not exist or belongs to another account.
      content:
        application/json:
          schema:
            $ref: '#/components/schemas/Error'
          example:
            error:
              code: not_found
              message: Video job not found.
              requestId: b3f0c2d1-4a5b-4c6d-8e9f-0a1b2c3d4e5f
    RateLimited:
      description: >-
        An independent video request limit was exceeded. Back off before
        retrying.
      content:
        application/json:
          schema:
            $ref: '#/components/schemas/Error'
          example:
            error:
              code: rate_limit_exceeded
              message: Open API rate limit exceeded.
              requestId: b3f0c2d1-4a5b-4c6d-8e9f-0a1b2c3d4e5f
    InternalError:
      description: >-
        Unexpected server failure. Use bounded backoff and retain the creation
        requestId when retrying.
      content:
        application/json:
          schema:
            $ref: '#/components/schemas/Error'
          example:
            error:
              code: internal_error
              message: An internal error occurred.
              requestId: b3f0c2d1-4a5b-4c6d-8e9f-0a1b2c3d4e5f
    ServiceUnavailable:
      description: >-
        Temporary service or download-link availability failure. Retry with the
        same requestId and body for creation, or retry the detail read. A link
        refresh failure preserves saved success.
      content:
        application/json:
          schema:
            $ref: '#/components/schemas/Error'
          example:
            error:
              code: service_unavailable
              message: Video generation is unavailable; retry later.
              requestId: b3f0c2d1-4a5b-4c6d-8e9f-0a1b2c3d4e5f
  securitySchemes:
    AppId:
      type: apiKey
      in: header
      name: X-App-ID
      description: Your Spatius App ID.
    ApiKey:
      type: apiKey
      in: header
      name: X-API-Key
      description: The API key bound to the App ID.

````