ELBO AI, INC Videos API

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

Operations 3

POST /api/v1/videos/text Create a video from text #
POST /api/v1/videos/audio Create a video from audio #
GET /api/v1/videos/{jobId} Get video job status #

Work with this as data

Every API here is available over the APIs.io API and to AI agents over MCP.

MCP server

One button, every client — Claude, Cursor, VS Code and the rest.

https://apis.io/mcp

Tools for apis

7 MCP tools reach this
  • find_apisBrowse and filter every API in the catalog.
  • get_api_artifactsOne API's artifacts, grouped by type.
  • get_openapiThe primary OpenAPI for this API.
  • find_similar_apisAPIs that look like this one.
  • apis_io_searchSTART HERE — APIs, providers and tags for one query, each with its total.
  • resolveTurn a domain, URL or GitHub org into the provider it belongs to.
  • find_cohortsEvery scored population of providers in the catalog.
All 92 tools →

Call it yourself

curl for this page
This API
curl "https://apis.io/api/v1/apis/elbo-ai-inc-videos-api"
All apis
curl "https://apis.io/api/v1/apis?limit=25"

Discovery needs no key. Ratings and market analysis are Pro.

Get an API key

Free tier, no form to fill in. Signing in shares your email address with us — we store it to create your key and to recognise you if you sign in with another provider. See our Privacy Policy and Terms.

A second provider on the same verified email joins the account you already have.

OpenAPI Specification

elbo-ai-inc-videos-api-openapi.yml Raw ↑
openapi: 3.2.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:
  responses:
    Unauthorized:
      description: Missing, malformed, invalid, or revoked API key
      content:
        application/json:
          schema:
            $ref: '#/components/schemas/ErrorResponse'
          examples:
            unauthorized:
              value:
                error: unauthorized
                message: 'Missing or invalid Authorization header. Use: Bearer pk_live_...'
    InsufficientCredits:
      description: The account does not have enough video credits to create the job.
      content:
        application/json:
          schema:
            $ref: '#/components/schemas/ErrorResponse'
          examples:
            insufficientCredits:
              value:
                error: insufficient_credits
                message: Not enough video credits to create a video job
                details:
                  code: insufficient_video_credits
                  reason: insufficient_video_credits
                  required_credits: 1
                  requiredCredits: 1
                  remaining_credits: 0
                  remainingCredits: 0
                  retryable: false
                  retry_blocked_reason: Developer API video generation needs 1 credit, but only 0 remain.
                  retryBlockedReason: Developer API video generation needs 1 credit, but only 0 remain.
                  retry_block_code: INSUFFICIENT_VIDEO_CREDITS
                  retryBlockCode: INSUFFICIENT_VIDEO_CREDITS
                  checkout_url: https://www.puppetry.com/pricing#pricing-credit-packs
                  checkoutUrl: https://www.puppetry.com/pricing#pricing-credit-packs
                  top_up: Buy 5 video credits for $4.99 at https://www.puppetry.com/pricing#pricing-credit-packs
                  topUp: Buy 5 video credits for $4.99 at https://www.puppetry.com/pricing#pricing-credit-packs
                  video_generation:
                    can_create: false
                    canCreate: false
                    required_credits: 1
                    requiredCredits: 1
                    credits_remaining: 0
                    creditsRemaining: 0
                    concurrent_jobs: 2
                    concurrentJobs: 2
                    active_jobs: 0
                    activeJobs: 0
                    available_slots: 2
                    availableSlots: 2
                    reason: insufficient_video_credits
                  videoGeneration:
                    can_create: false
                    canCreate: false
                    required_credits: 1
                    requiredCredits: 1
                    credits_remaining: 0
                    creditsRemaining: 0
                    concurrent_jobs: 2
                    concurrentJobs: 2
                    active_jobs: 0
                    activeJobs: 0
                    available_slots: 2
                    availableSlots: 2
                    reason: insufficient_video_credits
    RateLimited:
      description: Rate limit or monthly beta quota exceeded
      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'
      content:
        application/json:
          schema:
            $ref: '#/components/schemas/ErrorResponse'
          examples:
            rateLimited:
              value:
                error: rate_limited
                message: 'Developer API beta limit exceeded: 10 requests per minute.'
                retryable: true
                retry_after_seconds: 30
                retryAfter: 30
                retryAfterSeconds: 30
                next_poll_at: '2026-06-22T08:50:30.000Z'
                nextPollAt: '2026-06-22T08:50:30.000Z'
                details:
                  retryable: true
                  retry_after_seconds: 30
                  retryAfter: 30
                  retryAfterSeconds: 30
                  next_poll_at: '2026-06-22T08:50:30.000Z'
                  nextPollAt: '2026-06-22T08:50:30.000Z'
            voiceCharacterLimit:
              value:
                error: voice_character_limit_exceeded
                message: Monthly Puppetry Voice character limit exceeded
                details:
                  retryable: true
                  retry_after_seconds: 86400
                  retryAfter: 86400
                  retryAfterSeconds: 86400
            concurrentVideoJobLimit:
              value:
                error: concurrent_job_limit_exceeded
                message: Developer API concurrent job limit exceeded
                details:
                  retryable: true
                  concurrent_jobs: 2
                  concurrentJobs: 2
                  active_jobs: 2
                  activeJobs: 2
                  available_slots: 0
                  availableSlots: 0
                  active_job_expires_in_seconds: 512
                  activeJobExpiresInSeconds: 512
                  retry_after_seconds: 512
                  retryAfter: 512
                  retryAfterSeconds: 512
    VideoJobStatusUnavailable:
      description: Puppetry could not inspect an accepted video job. Retry-After, X-Puppetry-Next-Poll-At, Location, Content-Location, Puppetry-Operation-Id, and Puppetry-Request-Id identify and pace the same status poll target.
      headers:
        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/ErrorResponse'
          examples:
            jobStatusUnavailable:
              value:
                error: job_status_unavailable
                message: Video job status is temporarily unavailable
                retryable: true
                retry_after_seconds: 10
                retryAfter: 10
                retryAfterSeconds: 10
                next_poll_at: '2026-06-22T08:50:10.000Z'
                nextPollAt: '2026-06-22T08:50:10.000Z'
                credits:
                  charged: 0
                  remaining: null
                creation_credits:
                  charged: 1
                  remaining_after_debit: 299
                  remainingAfterDebit: 299
                creationCredits:
                  charged: 1
                  remaining_after_debit: 299
                  remainingAfterDebit: 299
                details:
                  retryable: true
                  retry_after_seconds: 10
                  retryAfter: 10
                  retryAfterSeconds: 10
                  next_poll_at: '2026-06-22T08:50:10.000Z'
                  nextPollAt: '2026-06-22T08:50:10.000Z'
                  object: video_job
                  id: api_video_abc123
                  job_id: api_video_abc123
                  jobId: api_video_abc123
                  task_id: api_video_abc123
                  taskId: api_video_abc123
                  status_url: /api/v1/videos/api_video_abc123
                  statusUrl: /api/v1/videos/api_video_abc123
                  credits:
                    charged: 0
                    remaining: null
                  creation_credits:
                    charged: 1
                    remaining_after_debit: 299
                    remainingAfterDebit: 299
                  creationCredits:
                    charged: 1
                    remaining_after_debit: 299
                    remainingAfterDebit: 299
                  created_at: '2026-06-22T08:50:00.000Z'
                  createdAt: '2026-06-22T08:50:00.000Z'
                  content_location: /api/v1/videos/api_video_abc123
                  contentLocation: /api/v1/videos/api_video_abc123
            jobResultUnavailable:
              value:
                error: job_result_unavailable
                message: Video job result is temporarily unavailable
                retryable: true
                retry_after_seconds: 10
                retryAfter: 10
                retryAfterSeconds: 10
                next_poll_at: '2026-06-22T08:50:10.000Z'
                nextPollAt: '2026-06-22T08:50:10.000Z'
                credits:
                  charged: 0
                  remaining: null
                creation_credits:
                  charged: 1
                  remaining_after_debit: 299
                  remainingAfterDebit: 299
                creationCredits:
                  charged: 1
                  remaining_after_debit: 299
                  remainingAfterDebit: 299
                details:
                  retryable: true
                  retry_after_seconds: 10
                  retryAfter: 10
                  retryAfterSeconds: 10
                  next_poll_at: '2026-06-22T08:50:10.000Z'
                  nextPollAt: '2026-06-22T08:50:10.000Z'
                  object: video_job
                  id: api_video_abc123
                  job_id: api_video_abc123
                  jobId: api_video_abc123
                  task_id: api_video_abc123
                  taskId: api_video_abc123
                  status_url: /api/v1/videos/api_video_abc123
                  statusUrl: /api/v1/videos/api_video_abc123
                  credits:
                    charged: 0
                    remaining: null
                  creation_credits:
                    charged: 1
                    remaining_after_debit: 299
                    remainingAfterDebit: 299
                  creationCredits:
                    charged: 1
                    remaining_after_debit: 299
                    remainingAfterDebit: 299
                  created_at: '2026-06-22T08:50:00.000Z'
                  createdAt: '2026-06-22T08:50:00.000Z'
                  content_location: /api/v1/videos/api_video_abc123
                  contentLocation: /api/v1/videos/api_video_abc123
    IdempotencyConflict:
      description: The Idempotency-Key is already creating a video job or hosted upload URL, or it was reused with different input. Video create conflicts include Location/Content-Location, Puppetry-Operation-Id, and Puppetry-Request-Id headers for the existing API video job when one is known.
      headers:
        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'
      content:
        application/json:
          schema:
            $ref: '#/components/schemas/ErrorResponse'
          examples:
            idempotencyInProgress:
              value:
                error: idempotency_key_in_progress
                message: A video job or upload URL with this Idempotency-Key is already being created. Retry this request shortly.
                details:
                  retryable: true
                  retry_after_seconds: 5
                  retryAfter: 5
 

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