ELBO AI, INC Videos API

The Videos API from ELBO AI, INC — 3 operation(s) for videos.

OpenAPI Specification

elbo-ai-inc-videos-api-openapi.yml Raw ↑
openapi: 3.1.0
info:
  title: Puppetry Developer API Beta Audio Uploads Videos API
  description: Live Puppetry Developer API beta for Puppetry Voice API access, hosted audio uploads, usage, and credit-backed text/audio-to-video jobs.
  version: '2026-05-11'
  contact:
    name: Puppetry Support
    url: https://www.puppetry.com
    email: support@puppetry.com
  termsOfService: https://www.puppetry.com/tos
  license:
    name: Proprietary
servers:
- url: https://www.puppetry.com
  description: Production
security:
- developerApiKey: []
tags:
- name: Videos
paths:
  /api/v1/videos/text:
    post:
      operationId: createVideoFromText
      x-openai-isConsequential: true
      summary: Create a video from text
      description: Queues a credit-backed text-to-video job using a hosted image URL and a Puppetry voice. Requires the videos:create scope. Accepted queued responses and non-terminal Idempotency-Key replays include Retry-After, X-Puppetry-Next-Poll-At, plus absolute Location/Content-Location, Puppetry-Operation-Id, Puppetry-Request-Id, and X-Puppetry-Credits-* headers when debit metadata is available so clients can pace, locate, trace, and reconcile the first status poll.
      tags:
      - Videos
      security:
      - developerApiKey: []
      parameters:
      - $ref: '#/components/parameters/IdempotencyKey'
      requestBody:
        required: true
        content:
          application/json:
            schema:
              $ref: '#/components/schemas/TextVideoRequest'
            examples:
              textVideo:
                summary: Create text video
                value:
                  image_url: https://example.com/portrait.png
                  text: Hello from Puppetry.
                  voice_id: puppetry-af_heart
                  language: en
                  expressiveness: 1
      responses:
        '200':
          description: Terminal video job returned from an Idempotency-Key replay without charging another credit. Includes absolute Location/Content-Location, Puppetry-Operation-Id, Puppetry-Request-Id, and X-Puppetry-Credits-* headers when debit metadata is available for the replayed job; retryable failed replays also include Retry-After and X-Puppetry-Next-Poll-At.
          headers:
            X-RateLimit-Limit:
              $ref: '#/components/headers/RateLimitLimit'
            X-RateLimit-Remaining:
              $ref: '#/components/headers/RateLimitRemaining'
            X-RateLimit-Reset:
              $ref: '#/components/headers/RateLimitReset'
            Retry-After:
              $ref: '#/components/headers/RetryAfter'
            X-Puppetry-Next-Poll-At:
              $ref: '#/components/headers/NextPollAt'
            Location:
              $ref: '#/components/headers/VideoJobStatusLocation'
            Content-Location:
              $ref: '#/components/headers/VideoJobStatusLocation'
            Puppetry-Operation-Id:
              $ref: '#/components/headers/VideoJobOperationId'
            X-Puppetry-Operation-Id:
              $ref: '#/components/headers/VideoJobOperationId'
            Puppetry-Request-Id:
              $ref: '#/components/headers/VideoJobRequestId'
            X-Puppetry-Request-Id:
              $ref: '#/components/headers/VideoJobRequestId'
            X-Puppetry-Credits-Required:
              $ref: '#/components/headers/VideoJobCreditsRequired'
            X-Puppetry-Credits-Remaining:
              $ref: '#/components/headers/VideoJobCreditsRemaining'
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/VideoJobReplayResponse'
        '202':
          description: Video job queued, or a non-terminal Idempotency-Key replay returned without charging another credit. Includes Retry-After, X-Puppetry-Next-Poll-At, plus absolute Location/Content-Location, Puppetry-Operation-Id, Puppetry-Request-Id, and X-Puppetry-Credits-* headers when debit metadata is available so clients can pace, locate, trace, and reconcile the first status poll.
          headers:
            X-RateLimit-Limit:
              $ref: '#/components/headers/RateLimitLimit'
            X-RateLimit-Remaining:
              $ref: '#/components/headers/RateLimitRemaining'
            X-RateLimit-Reset:
              $ref: '#/components/headers/RateLimitReset'
            Retry-After:
              $ref: '#/components/headers/RetryAfter'
            X-Puppetry-Next-Poll-At:
              $ref: '#/components/headers/NextPollAt'
            Location:
              $ref: '#/components/headers/VideoJobStatusLocation'
            Content-Location:
              $ref: '#/components/headers/VideoJobStatusLocation'
            Puppetry-Operation-Id:
              $ref: '#/components/headers/VideoJobOperationId'
            X-Puppetry-Operation-Id:
              $ref: '#/components/headers/VideoJobOperationId'
            Puppetry-Request-Id:
              $ref: '#/components/headers/VideoJobRequestId'
            X-Puppetry-Request-Id:
              $ref: '#/components/headers/VideoJobRequestId'
            X-Puppetry-Credits-Required:
              $ref: '#/components/headers/VideoJobCreditsRequired'
            X-Puppetry-Credits-Remaining:
              $ref: '#/components/headers/VideoJobCreditsRemaining'
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/VideoJobQueuedResponse'
        '400':
          $ref: '#/components/responses/InvalidRequest'
        '401':
          $ref: '#/components/responses/Unauthorized'
        '402':
          $ref: '#/components/responses/InsufficientCredits'
        '403':
          $ref: '#/components/responses/Forbidden'
        '404':
          description: Unknown Puppetry voice for text-to-video
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ErrorResponse'
              examples:
                voiceNotFound:
                  value:
                    error: voice_not_found
                    message: Unknown Puppetry voice. Use a voice_id from GET /api/v1/voices/puppetry.
                    details:
                      retryable: false
                      retry_blocked_reason: Unknown Puppetry voice. Use a voice_id from GET /api/v1/voices/puppetry.
                      retryBlockedReason: Unknown Puppetry voice. Use a voice_id from GET /api/v1/voices/puppetry.
                      retry_block_code: PUPPETRY_VOICE_NOT_FOUND
                      retryBlockCode: PUPPETRY_VOICE_NOT_FOUND
        '409':
          $ref: '#/components/responses/IdempotencyConflict'
        '413':
          description: Request body exceeds the video create limit.
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ErrorResponse'
              examples:
                payloadTooLarge:
                  value:
                    error: payload_too_large
                    message: Request body must be 65536 bytes or fewer
                    details:
                      max_body_bytes: 65536
                      retryable: false
                      retry_blocked_reason: Request body must be 65536 bytes or fewer
                      retryBlockedReason: Request body must be 65536 bytes or fewer
                      retry_block_code: VIDEO_CREATE_PAYLOAD_TOO_LARGE
                      retryBlockCode: VIDEO_CREATE_PAYLOAD_TOO_LARGE
        '415':
          $ref: '#/components/responses/UnsupportedMediaType'
        '429':
          $ref: '#/components/responses/RateLimited'
        '502':
          $ref: '#/components/responses/UpstreamFailure'
        '503':
          $ref: '#/components/responses/TemporarilyUnavailable'
  /api/v1/videos/audio:
    post:
      operationId: createVideoFromAudio
      x-openai-isConsequential: true
      summary: Create a video from audio
      description: Queues a credit-backed audio-to-video job using hosted image and audio URLs. Requires the videos:create scope. Accepted queued responses and non-terminal Idempotency-Key replays include Retry-After, X-Puppetry-Next-Poll-At, plus absolute Location/Content-Location, Puppetry-Operation-Id, Puppetry-Request-Id, and X-Puppetry-Credits-* headers when debit metadata is available so clients can pace, locate, trace, and reconcile the first status poll.
      tags:
      - Videos
      security:
      - developerApiKey: []
      parameters:
      - $ref: '#/components/parameters/IdempotencyKey'
      requestBody:
        required: true
        content:
          application/json:
            schema:
              $ref: '#/components/schemas/AudioVideoRequest'
            examples:
              audioVideo:
                summary: Create audio video
                value:
                  image_url: https://example.com/portrait.png
                  audio_url: https://assets.puppetry.com/api-uploads/audio.mp3
                  expressiveness: 1
      responses:
        '200':
          description: Terminal video job returned from an Idempotency-Key replay without charging another credit. Includes absolute Location/Content-Location, Puppetry-Operation-Id, Puppetry-Request-Id, and X-Puppetry-Credits-* headers when debit metadata is available for the replayed job; retryable failed replays also include Retry-After and X-Puppetry-Next-Poll-At.
          headers:
            X-RateLimit-Limit:
              $ref: '#/components/headers/RateLimitLimit'
            X-RateLimit-Remaining:
              $ref: '#/components/headers/RateLimitRemaining'
            X-RateLimit-Reset:
              $ref: '#/components/headers/RateLimitReset'
            Retry-After:
              $ref: '#/components/headers/RetryAfter'
            X-Puppetry-Next-Poll-At:
              $ref: '#/components/headers/NextPollAt'
            Location:
              $ref: '#/components/headers/VideoJobStatusLocation'
            Content-Location:
              $ref: '#/components/headers/VideoJobStatusLocation'
            Puppetry-Operation-Id:
              $ref: '#/components/headers/VideoJobOperationId'
            X-Puppetry-Operation-Id:
              $ref: '#/components/headers/VideoJobOperationId'
            Puppetry-Request-Id:
              $ref: '#/components/headers/VideoJobRequestId'
            X-Puppetry-Request-Id:
              $ref: '#/components/headers/VideoJobRequestId'
            X-Puppetry-Credits-Required:
              $ref: '#/components/headers/VideoJobCreditsRequired'
            X-Puppetry-Credits-Remaining:
              $ref: '#/components/headers/VideoJobCreditsRemaining'
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/VideoJobReplayResponse'
        '202':
          description: Video job queued, or a non-terminal Idempotency-Key replay returned without charging another credit. Includes Retry-After, X-Puppetry-Next-Poll-At, plus absolute Location/Content-Location, Puppetry-Operation-Id, Puppetry-Request-Id, and X-Puppetry-Credits-* headers when debit metadata is available so clients can pace, locate, trace, and reconcile the first status poll.
          headers:
            X-RateLimit-Limit:
              $ref: '#/components/headers/RateLimitLimit'
            X-RateLimit-Remaining:
              $ref: '#/components/headers/RateLimitRemaining'
            X-RateLimit-Reset:
              $ref: '#/components/headers/RateLimitReset'
            Retry-After:
              $ref: '#/components/headers/RetryAfter'
            X-Puppetry-Next-Poll-At:
              $ref: '#/components/headers/NextPollAt'
            Location:
              $ref: '#/components/headers/VideoJobStatusLocation'
            Content-Location:
              $ref: '#/components/headers/VideoJobStatusLocation'
            Puppetry-Operation-Id:
              $ref: '#/components/headers/VideoJobOperationId'
            X-Puppetry-Operation-Id:
              $ref: '#/components/headers/VideoJobOperationId'
            Puppetry-Request-Id:
              $ref: '#/components/headers/VideoJobRequestId'
            X-Puppetry-Request-Id:
              $ref: '#/components/headers/VideoJobRequestId'
            X-Puppetry-Credits-Required:
              $ref: '#/components/headers/VideoJobCreditsRequired'
            X-Puppetry-Credits-Remaining:
              $ref: '#/components/headers/VideoJobCreditsRemaining'
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/VideoJobQueuedResponse'
        '400':
          $ref: '#/components/responses/InvalidRequest'
        '401':
          $ref: '#/components/responses/Unauthorized'
        '402':
          $ref: '#/components/responses/InsufficientCredits'
        '403':
          $ref: '#/components/responses/Forbidden'
        '409':
          $ref: '#/components/responses/IdempotencyConflict'
        '413':
          description: Request body exceeds the video create limit.
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ErrorResponse'
              examples:
                payloadTooLarge:
                  value:
                    error: payload_too_large
                    message: Request body must be 65536 bytes or fewer
                    details:
                      max_body_bytes: 65536
                      retryable: false
                      retry_blocked_reason: Request body must be 65536 bytes or fewer
                      retryBlockedReason: Request body must be 65536 bytes or fewer
                      retry_block_code: VIDEO_CREATE_PAYLOAD_TOO_LARGE
                      retryBlockCode: VIDEO_CREATE_PAYLOAD_TOO_LARGE
        '415':
          $ref: '#/components/responses/UnsupportedMediaType'
        '429':
          $ref: '#/components/responses/RateLimited'
        '502':
          $ref: '#/components/responses/UpstreamFailure'
        '503':
          $ref: '#/components/responses/TemporarilyUnavailable'
  /api/v1/videos/{jobId}:
    get:
      operationId: getVideoJob
      x-openai-isConsequential: false
      summary: Get video job status
      description: Polls a Developer API video job created by the same API key. Requires the videos:read scope. Jobs created with another key, user, or org return 404. Status responses include absolute Location, Content-Location, Puppetry-Operation-Id, and Puppetry-Request-Id headers with the same poll target; queued or processing 200 responses also include Retry-After and X-Puppetry-Next-Poll-At so clients can pace polling.
      tags:
      - Videos
      security:
      - developerApiKey: []
      parameters:
      - name: jobId
        in: path
        required: true
        schema:
          type: string
          pattern: ^api_video_[A-Za-z0-9_-]+$
      responses:
        '200':
          description: Video job status
          headers:
            X-RateLimit-Limit:
              $ref: '#/components/headers/RateLimitLimit'
            X-RateLimit-Remaining:
              $ref: '#/components/headers/RateLimitRemaining'
            X-RateLimit-Reset:
              $ref: '#/components/headers/RateLimitReset'
            Retry-After:
              $ref: '#/components/headers/RetryAfter'
            X-Puppetry-Next-Poll-At:
              $ref: '#/components/headers/NextPollAt'
            Location:
              $ref: '#/components/headers/VideoJobStatusLocation'
            Content-Location:
              $ref: '#/components/headers/VideoJobStatusLocation'
            Puppetry-Operation-Id:
              $ref: '#/components/headers/VideoJobOperationId'
            X-Puppetry-Operation-Id:
              $ref: '#/components/headers/VideoJobOperationId'
            Puppetry-Request-Id:
              $ref: '#/components/headers/VideoJobRequestId'
            X-Puppetry-Request-Id:
              $ref: '#/components/headers/VideoJobRequestId'
            X-Puppetry-Credits-Required:
              $ref: '#/components/headers/VideoJobCreditsRequired'
            X-Puppetry-Credits-Remaining:
              $ref: '#/components/headers/VideoJobCreditsRemaining'
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/VideoJobStatusResponse'
        '400':
          $ref: '#/components/responses/InvalidRequest'
        '401':
          $ref: '#/components/responses/Unauthorized'
        '403':
          $ref: '#/components/responses/Forbidden'
        '404':
          description: Video job not found, or not visible to the authenticated API key
          headers:
            X-RateLimit-Limit:
              $ref: '#/components/headers/RateLimitLimit'
            X-RateLimit-Remaining:
              $ref: '#/components/headers/RateLimitRemaining'
            X-RateLimit-Reset:
              $ref: '#/components/headers/RateLimitReset'
            Location:
              $ref: '#/components/headers/VideoJobStatusLocation'
            Content-Location:
              $ref: '#/components/headers/VideoJobStatusLocation'
            Puppetry-Operation-Id:
              $ref: '#/components/headers/VideoJobOperationId'
            X-Puppetry-Operation-Id:
              $ref: '#/components/headers/VideoJobOperationId'
            Puppetry-Request-Id:
              $ref: '#/components/headers/VideoJobRequestId'
            X-Puppetry-Request-Id:
              $ref: '#/components/headers/VideoJobRequestId'
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ErrorResponse'
              examples:
                notFound:
                  value:
                    error: job_not_found
                    message: Video job not found
                    retryable: false
                    id: api_video_missing_20260702
                    job_id: api_video_missing_20260702
                    jobId: api_video_missing_20260702
                    task_id: api_video_missing_20260702
                    taskId: api_video_missing_20260702
                    operation_id: api_video_missing_20260702
                    operationId: api_video_missing_20260702
                    request_id: api_video_missing_20260702
                    requestId: api_video_missing_20260702
                    status_url: /api/v1/videos/api_video_missing_20260702
                    statusUrl: /api/v1/videos/api_video_missing_20260702
                    retry_blocked_reason: Video job not found or not visible to this API key
                    retryBlockedReason: Video job not found or not visible to this API key
                    retry_block_code: VIDEO_JOB_NOT_FOUND
                    retryBlockCode: VIDEO_JOB_NOT_FOUND
                    details:
                      retryable: false
                      id: api_video_missing_20260702
                      job_id: api_video_missing_20260702
                      jobId: api_video_missing_20260702
                      task_id: api_video_missing_20260702
                      taskId: api_video_missing_20260702
                      operation_id: api_video_missing_20260702
                      operationId: api_video_missing_20260702
                      request_id: api_video_missing_20260702
                      requestId: api_video_missing_20260702
                      status_url: /api/v1/videos/api_video_missing_20260702
                      statusUrl: /api/v1/videos/api_video_missing_20260702
                      retry_blocked_reason: Video job not found or not visible to this API key
                      retryBlockedReason: Video job not found or not visible to this API key
                      retry_block_code: VIDEO_JOB_NOT_FOUND
                      retryBlockCode: VIDEO_JOB_NOT_FOUND
                      content_location: /api/v1/videos/api_video_missing_20260702
                      contentLocation: /api/v1/videos/api_video_missing_20260702
                    content_location: /api/v1/videos/api_video_missing_20260702
                    contentLocation: /api/v1/videos/api_video_missing_20260702
        '429':
          $ref: '#/components/responses/RateLimited'
        '502':
          $ref: '#/components/responses/VideoJobStatusUnavailable'
        '504':
          $ref: '#/components/responses/VideoJobStatusTimeout'
components:
  schemas:
    VideoJobQueuedResponse:
      type: object
      required:
      - object
      - id
      - operation_id
      - request_id
      - source
      - status
      - video_url
      - credits
      - status_url
      - content_location
      - created_at
      - expires_at
      - retry_after_seconds
      - next_poll_at
      - creation_credits
      properties:
        object:
          type: string
          const: video_job
        id:
          type: string
          pattern: ^api_video_
          example: api_video_8b1d2f4c6a7e9f0123456789
        job_id:
          type: string
          pattern: ^api_video_
          example: api_video_8b1d2f4c6a7e9f0123456789
          description: Alias for id, useful for agent and task-style clients.
        jobId:
          type: string
          pattern: ^api_video_
          example: api_video_8b1d2f4c6a7e9f0123456789
          description: SDK-style alias for id.
        task_id:
          type: string
          pattern: ^api_video_
          example: api_video_8b1d2f4c6a7e9f0123456789
          description: Legacy task-style alias for id.
        taskId:
          type: string
          pattern: ^api_video_
          example: api_video_8b1d2f4c6a7e9f0123456789
          description: CamelCase task-style alias for id.
        operation_id:
          type: string
          pattern: ^api_video_
          example: api_video_8b1d2f4c6a7e9f0123456789
          description: Stable public operation id for tracing a Developer API video job. Mirrors id and never exposes the internal animation service job id.
        operationId:
          type: string
          pattern: ^api_video_
          example: api_video_8b1d2f4c6a7e9f0123456789
          description: SDK-style alias for operation_id.
        request_id:
          type: string
          pattern: ^api_video_
          example: api_video_8b1d2f4c6a7e9f0123456789
          description: Stable public request id for correlating a Developer API video job with backend logs. Mirrors id and never exposes the internal animation service job id.
        requestId:
          type: string
          pattern: ^api_video_
          example: api_video_8b1d2f4c6a7e9f0123456789
          description: SDK-style alias for request_id.
        source:
          type: string
          enum:
          - text
          - audio
          description: Video create source. text means POST /api/v1/videos/text, audio means POST /api/v1/videos/audio.
        request_source:
          type: string
          enum:
          - text
          - audio
          description: Alias for source.
        requestSource:
          type: string
          enum:
          - text
          - audio
          description: SDK-style alias for source.
        status:
          type: string
          enum:
          - queued
        video_url:
          type:
          - string
          - 'null'
          format: uri
          description: Null until the job is completed.
        error:
          type:
          - string
          - 'null'
          description: Null for queued jobs and non-failed Idempotency-Key replays.
        credits:
          $ref: '#/components/schemas/VideoCredits'
        creation_credits:
          $ref: '#/components/schemas/VideoJobCreationCredits'
          description: Original create-time video credit debit for this job. Status polling remains no-charge; see credits.charged for the current request.
        creationCredits:
          $ref: '#/components/schemas/VideoJobCreationCredits'
          description: SDK-style alias for creation_credits.
        status_url:
          type: string
          example: /api/v1/videos/api_video_8b1d2f4c6a7e9f0123456789
          description: Relative status URL for the API video job body. Use Location or Content-Location response headers when an absolute poll URL is required.
        retry_after_seconds:
          type: integer
          minimum: 0
          example: 5
          description: Seconds to wait before the first status poll. Mirrors the Retry-After response header.
        idempotent_replay:
          type: boolean
          description: Present and true when an Idempotency-Key replay returns an already accepted job without charging another credit.
        videoUrl:
          type:
          - string
          - 'null'
          format: uri
          description: SDK-style alias for video_url.
        result_url:
          type:
          - string
          - 'null'
          format: uri
          description: Alias for the completed video URL.
        resultUrl:
          type:
          - string
          - 'null'
          format: uri
          description: SDK-style alias for result_url.
        download_url:
          type:
          - string
          - 'null'
          format: uri
          description: Alias for the completed video download URL.
        downloadUrl:
          type:
          - string
          - 'null'
          format: uri
          description: SDK-style alias for download_url.
        output_url:
          type:
          - string
          - 'null'
          format: uri
          description: Alias for agent clients that call the completed video an output URL.
        outputUrl:
          type:
          - string
          - 'null'
          format: uri
          description: SDK-style alias for output_url.
        url:
          type:
          - string
          - 'null'
          format: uri
          description: Shortest SDK-style alias for the completed video URL.
        statusUrl:
          type: string
          example: /api/v1/videos/api_video_8b1d2f4c6a7e9f0123456789
          description: SDK-style alias for status_url.
        created_at:
          type: string
          format: date-time
        createdAt:
          type: string
          format: date-time
          description: SDK-style alias for created_at.
        expires_at:
          type: string
          format: date-time
          description: When this API video job record expires from the status/idempotency lookup window.
        expiresAt:
          type: string
          format: date-time
          description: SDK-style alias for expires_at.
        retryAfter:
          type: integer
          minimum: 0
          example: 5
          description: SDK-style alias for retry_after_seconds.
        retryAfterSeconds:
          type: integer
          minimum: 0
          example: 5
          description: CamelCase alias for retry_after_seconds used by generated clients.
        next_poll_at:
          type: string
          format: date-time
          description: Absolute UTC time when clients should make the next status poll. Present with retry_after_seconds and mirrors the X-Puppetry-Next-Poll-At response header.
        nextPollAt:
          type: string
          format: date-time
          description: SDK-style alias for next_poll_at.
        idempotentReplay:
          type: boolean
          description: SDK-style alias for idempotent_replay.
        content_location:
          type: string
          example: /api/v1/videos/api_video_8b1d2f4c6a7e9f0123456789
          description: Body alias for the status poll URL, mirroring the Content-Location response header target for clients that cannot reliably read headers.
        contentLocation:
          type: string
          example: /api/v1/videos/api_video_8b1d2f4c6a7e9f0123456789
          description: SDK-style alias for content_location.
      additionalProperties: false
    VideoJobReplayResponse:
      type: object
      required:
      - object
      - id
      - operation_id
      - request_id
      - source
      - status
      - video_url
      - error
      - credits
      - status_url
      - content_location
      - idempotent_replay
      properties:
        object:
          type: string
          const: video_job
        id:
          type: string
          pattern: ^api_video_
          example: api_video_8b1d2f4c6a7e9f0123456789
        job_id:
          type: string
          pattern: ^api_video_
          example: api_video_8b1d2f4c6a7e9f0123456789
          description: Alias for id, useful for agent and task-style clients.
        jobId:
          type: string
          pattern: ^api_video_
          example: api_video_8b1d2f4c6a7e9f0123456789
          description: SDK-style alias for id.
        task_id:
          type: string
          pattern: ^api_video_
          example: api_video_8b1d2f4c6a7e9f0123456789
          description: Legacy task-style alias for id.
        taskId:
          type: string
          pattern: ^api_video_
          example: api_video_8b1d2f4c6a7e9f0123456789
          description: CamelCase task-style alias for id.
        operation_id:
          type: string
          pattern: ^api_video_
          example: api_video_8b1d2f4c6a7e9f0123456789
          description: Stable public operation id for tracing a Developer API video job. Mirrors id and never exposes the internal animation service job id.
        operationId:
          type: string
          pattern: ^api_video_
          example: api_video_8b1d2f4c6a7e9f0123456789
          description: SDK-style alias for operation_id.
        request_id:
          type: string
          pattern: ^api_video_
          example: api_video_8b1d2f4c6a7e9f0123456789
          description: Stable public request id for correlating a Developer API video job with backend logs. Mirrors id and never exposes the internal animation service job id.
        requestId:
          type: string
          pattern: ^api_video_
          example: api_video_8b1d2f4c6a7e9f0123456789
          description: SDK-style alias for request_id.
        source:
          type: string
          enum:
          - text
          - audio
          description: Video create source. text means POST /api/v1/videos/text, audio means POST /api/v1/videos/audio.
        request_source:
          type: string
          enum:
          - text
          - audio
          description: Alias for source.
        requestSource:
          type: string
          enum:
          - text
          - audio
          description: SDK-style alias for source.
        status:
          type: string
          enum:
          - completed
          - failed
        progress:
          type:
          - number
          - 'null'
          minimum: 0
          maximum: 100
        video_url:
          type:
          - string
          - 'null'
          format: uri
        error:
          type:
          - string
          - 'null'
        retryable:
          type: boolean
          description: Present for failed jobs when the backend knows whether retrying is useful. false means clients should not resubmit the same job.
        retry_blocked_reason:
          type: string
          maxLength: 512
          description: Machine-readable but redacted reason explaining why retryable is false.
        retryBlockedReason:
          type: string
          maxLength: 512
          description: SDK-style alias for retry_blocked_reason.
        retry_block_code:
          type: string
          maxLength: 120
          pattern: ^[a-zA-Z0-9._:-]{1,120}$
          description: Stable retry-block code for failed jobs where retryable is false.
        retryBlockCode:
          type: string
          maxLength: 120
          pattern: ^[a-zA-Z0-9._:-]{1,120}$
          description: SDK-style alias for retry_block_code.
        diagnostics:
          $ref: '#/components/schemas/VideoJobDiagnostics'
        credits:
          $ref: '#/components/schemas/VideoCredits'
        creation_credits:
          $ref: '#/components/schemas/VideoJobCreationCredits'
          description: Original create-time video credit debit for this job when recorded. Idempotency-Key replays remain no-charge; see credits.charged for the current request.
        creationCredits:
          $ref: '#/components/schemas/VideoJobCreationCredits'
          description: SDK-style alias for creation_credits.
        status_url:
          type: string
          example: /api/v1/videos/api_video_8b1d2f4c6a7e9f0123456789
          description: Relative status URL for the API video job body. Use Location or Content-Location response headers when an absolute poll URL is required.
        idempotent_replay:
          

# --- truncated at 32 KB (96 KB total) ---
# Full source: https://raw.githubusercontent.com/api-evangelist/elbo-ai-inc/refs/heads/main/openapi/elbo-ai-inc-videos-api-openapi.yml