{
  "openapi": "3.1.0",
  "info": {
    "title": "reelsdk",
    "version": "0.1.0",
    "description": "Video API for apps that can't run ffmpeg. One request in, finished mp4 out: burned-in word-level captions, slideshow and faceless videos, raw ffmpeg. Each key gets 3 running jobs, 500 jobs and 20 GB of uploads per UTC day unless it has its own limits; over a limit the answer is 429 RATE_LIMITED with Retry-After."
  },
  "externalDocs": {
    "url": "https://reelsdk.com/docs"
  },
  "servers": [
    {
      "url": "https://api.reelsdk.com"
    }
  ],
  "security": [
    {
      "bearer": []
    }
  ],
  "paths": {
    "/v1/slideshow": {
      "post": {
        "summary": "Images (+ voiceover, music, captions) to mp4",
        "description": "voiceover can be a URL or { text, voice } and we generate the speech. captions need a voiceover.",
        "parameters": [
          {
            "name": "wait",
            "in": "query",
            "required": false,
            "description": "Seconds to hold the request open for the result (0..300). Default 60 on create, 0 on status",
            "schema": {
              "type": "integer",
              "minimum": 0,
              "maximum": 300
            }
          },
          {
            "name": "Prefer",
            "in": "header",
            "required": false,
            "description": "Alternative to ?wait, e.g. 'wait=120' or 'respond-async'",
            "schema": {
              "type": "string"
            }
          }
        ],
        "requestBody": {
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/SlideshowRequest"
              }
            }
          }
        },
        "responses": {
          "200": {
            "description": "Finished",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/JobEnvelope"
                }
              }
            }
          },
          "202": {
            "description": "Still running; poll job.poll_url",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/JobEnvelope"
                }
              }
            }
          },
          "400": {
            "description": "Invalid request; error.issues lists field paths",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "401": {
            "description": "Missing, invalid or revoked API key",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "402": {
            "description": "INSUFFICIENT_CREDIT: the key's account can't cover this job's maximum price; error has balance_usd, available_usd, required_usd and billing_url",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "422": {
            "description": "Job failed because of the inputs (bad URL, unsupported media, ffmpeg error, OUTPUT_TOO_LARGE)",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "429": {
            "description": "RATE_LIMITED: over the key's limits (default 3 running jobs, 500 jobs and 20 GB of uploads per UTC day, overridable per key) or too many failed auth attempts",
            "headers": {
              "Retry-After": {
                "description": "Seconds until a slot or the daily allowance frees up",
                "schema": {
                  "type": "integer"
                }
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "500": {
            "description": "Job failed on our side; safe to retry",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          }
        }
      }
    },
    "/v1/captions": {
      "post": {
        "summary": "Burn word-level captions into a video",
        "description": "Transcribes the speech (or uses your words) and returns the captioned video plus transcript, srt, vtt and ass files.",
        "parameters": [
          {
            "name": "wait",
            "in": "query",
            "required": false,
            "description": "Seconds to hold the request open for the result (0..300). Default 60 on create, 0 on status",
            "schema": {
              "type": "integer",
              "minimum": 0,
              "maximum": 300
            }
          },
          {
            "name": "Prefer",
            "in": "header",
            "required": false,
            "description": "Alternative to ?wait, e.g. 'wait=120' or 'respond-async'",
            "schema": {
              "type": "string"
            }
          }
        ],
        "requestBody": {
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/CaptionsRequest"
              }
            }
          }
        },
        "responses": {
          "200": {
            "description": "Finished",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/JobEnvelope"
                }
              }
            }
          },
          "202": {
            "description": "Still running; poll job.poll_url",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/JobEnvelope"
                }
              }
            }
          },
          "400": {
            "description": "Invalid request; error.issues lists field paths",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "401": {
            "description": "Missing, invalid or revoked API key",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "402": {
            "description": "INSUFFICIENT_CREDIT: the key's account can't cover this job's maximum price; error has balance_usd, available_usd, required_usd and billing_url",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "422": {
            "description": "Job failed because of the inputs (bad URL, unsupported media, ffmpeg error, OUTPUT_TOO_LARGE)",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "429": {
            "description": "RATE_LIMITED: over the key's limits (default 3 running jobs, 500 jobs and 20 GB of uploads per UTC day, overridable per key) or too many failed auth attempts",
            "headers": {
              "Retry-After": {
                "description": "Seconds until a slot or the daily allowance frees up",
                "schema": {
                  "type": "integer"
                }
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "500": {
            "description": "Job failed on our side; safe to retry",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          }
        }
      }
    },
    "/v1/ffmpeg": {
      "post": {
        "summary": "Run ffmpeg with your own arguments",
        "description": "inputs are downloaded into the working directory under the given filenames; outputs are the files to return. Args only see that directory: no URLs or protocols (http:, tcp:, concat:, pipe: ...) in inputs, outputs or file options, no absolute paths or '..' (fontfile=/fontsdir= under /usr/share/fonts/reelapi/ excepted), no movie/amovie filters (add another -i), no -f tee, -pattern_type glob or -safe 0. Breaking a rule is a 400 naming args[N].",
        "parameters": [
          {
            "name": "wait",
            "in": "query",
            "required": false,
            "description": "Seconds to hold the request open for the result (0..300). Default 60 on create, 0 on status",
            "schema": {
              "type": "integer",
              "minimum": 0,
              "maximum": 300
            }
          },
          {
            "name": "Prefer",
            "in": "header",
            "required": false,
            "description": "Alternative to ?wait, e.g. 'wait=120' or 'respond-async'",
            "schema": {
              "type": "string"
            }
          }
        ],
        "requestBody": {
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/FfmpegRequest"
              }
            }
          }
        },
        "responses": {
          "200": {
            "description": "Finished",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/JobEnvelope"
                }
              }
            }
          },
          "202": {
            "description": "Still running; poll job.poll_url",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/JobEnvelope"
                }
              }
            }
          },
          "400": {
            "description": "Invalid request; error.issues lists field paths",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "401": {
            "description": "Missing, invalid or revoked API key",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "402": {
            "description": "INSUFFICIENT_CREDIT: the key's account can't cover this job's maximum price; error has balance_usd, available_usd, required_usd and billing_url",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "422": {
            "description": "Job failed because of the inputs (bad URL, unsupported media, ffmpeg error, OUTPUT_TOO_LARGE)",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "429": {
            "description": "RATE_LIMITED: over the key's limits (default 3 running jobs, 500 jobs and 20 GB of uploads per UTC day, overridable per key) or too many failed auth attempts",
            "headers": {
              "Retry-After": {
                "description": "Seconds until a slot or the daily allowance frees up",
                "schema": {
                  "type": "integer"
                }
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "500": {
            "description": "Job failed on our side; safe to retry",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          }
        }
      }
    },
    "/v1/shorts": {
      "post": {
        "summary": "Topic or script to a finished short: script, AI images, voice, music, captions",
        "description": "topic or script is required. A script must read in 90 s or less at the voice's pace (about 250 words with the default English voice); longer is 400 INVALID_REQUEST with the estimate. Takes 60-120 s, so with the default 60 s wait expect 202 and poll job.poll_url; job.stage shows planning, voice, images, then rendering (voice and images run in parallel). outputs: video, poster, transcript, srt, vtt. result: title, post_caption, scenes. 400 UNSUPPORTED_LANGUAGE outside en, es, fr, ja, zh, ko. 422 CONTENT_REJECTED when the image safety filter flags the topic. 500 PLAN_FAILED, IMAGES_FAILED or TTS_FAILED after one automatic retry.",
        "parameters": [
          {
            "name": "wait",
            "in": "query",
            "required": false,
            "description": "Seconds to hold the request open for the result (0..300). Default 60 on create, 0 on status",
            "schema": {
              "type": "integer",
              "minimum": 0,
              "maximum": 300
            }
          },
          {
            "name": "Prefer",
            "in": "header",
            "required": false,
            "description": "Alternative to ?wait, e.g. 'wait=120' or 'respond-async'",
            "schema": {
              "type": "string"
            }
          }
        ],
        "requestBody": {
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/ShortsRequest"
              }
            }
          }
        },
        "responses": {
          "200": {
            "description": "Finished",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/JobEnvelope"
                }
              }
            }
          },
          "202": {
            "description": "Still running; poll job.poll_url",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/JobEnvelope"
                }
              }
            }
          },
          "400": {
            "description": "Invalid request; error.issues lists field paths",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "401": {
            "description": "Missing, invalid or revoked API key",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "402": {
            "description": "INSUFFICIENT_CREDIT: the key's account can't cover this job's maximum price; error has balance_usd, available_usd, required_usd and billing_url",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "422": {
            "description": "Job failed because of the inputs (bad URL, unsupported media, ffmpeg error, OUTPUT_TOO_LARGE)",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "429": {
            "description": "RATE_LIMITED: over the key's limits (default 3 running jobs, 500 jobs and 20 GB of uploads per UTC day, overridable per key) or too many failed auth attempts",
            "headers": {
              "Retry-After": {
                "description": "Seconds until a slot or the daily allowance frees up",
                "schema": {
                  "type": "integer"
                }
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "500": {
            "description": "Job failed on our side; safe to retry",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          }
        }
      }
    },
    "/v1/jobs/{id}": {
      "get": {
        "summary": "Job status",
        "parameters": [
          {
            "name": "id",
            "in": "path",
            "required": true,
            "schema": {
              "type": "string"
            }
          },
          {
            "name": "wait",
            "in": "query",
            "required": false,
            "description": "Seconds to hold the request open for the result (0..300). Default 60 on create, 0 on status",
            "schema": {
              "type": "integer",
              "minimum": 0,
              "maximum": 300
            }
          },
          {
            "name": "Prefer",
            "in": "header",
            "required": false,
            "description": "Alternative to ?wait, e.g. 'wait=120' or 'respond-async'",
            "schema": {
              "type": "string"
            }
          }
        ],
        "responses": {
          "200": {
            "description": "Finished",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/JobEnvelope"
                }
              }
            }
          },
          "202": {
            "description": "Still running; poll job.poll_url",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/JobEnvelope"
                }
              }
            }
          },
          "400": {
            "description": "Invalid request; error.issues lists field paths",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "401": {
            "description": "Missing, invalid or revoked API key",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "402": {
            "description": "INSUFFICIENT_CREDIT: the key's account can't cover this job's maximum price; error has balance_usd, available_usd, required_usd and billing_url",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "404": {
            "description": "Unknown job",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "422": {
            "description": "Job failed because of the inputs (bad URL, unsupported media, ffmpeg error, OUTPUT_TOO_LARGE)",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "429": {
            "description": "RATE_LIMITED: over the key's limits (default 3 running jobs, 500 jobs and 20 GB of uploads per UTC day, overridable per key) or too many failed auth attempts",
            "headers": {
              "Retry-After": {
                "description": "Seconds until a slot or the daily allowance frees up",
                "schema": {
                  "type": "integer"
                }
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "500": {
            "description": "Job failed on our side; safe to retry",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          }
        }
      }
    },
    "/v1/uploads": {
      "post": {
        "summary": "Upload a file and get a temporary URL to use as an input",
        "parameters": [
          {
            "name": "filename",
            "in": "query",
            "required": true,
            "schema": {
              "type": "string"
            }
          }
        ],
        "requestBody": {
          "required": true,
          "content": {
            "application/octet-stream": {
              "schema": {
                "type": "string",
                "format": "binary"
              }
            }
          }
        },
        "responses": {
          "201": {
            "description": "Stored for 7 days",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Upload"
                }
              }
            }
          },
          "400": {
            "description": "Missing filename or Content-Length, or UNSUPPORTED_FILE_TYPE: only images, video, audio, srt/vtt/ass, json and txt (mp4 m4v mov webm mkv avi ts gif png jpg jpeg webp avif bmp mp3 m4a aac wav ogg opus flac json srt vtt ass txt)",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "413": {
            "description": "Over 100 MB",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "429": {
            "description": "RATE_LIMITED: over the key's limits (default 3 running jobs, 500 jobs and 20 GB of uploads per UTC day, overridable per key) or too many failed auth attempts",
            "headers": {
              "Retry-After": {
                "description": "Seconds until a slot or the daily allowance frees up",
                "schema": {
                  "type": "integer"
                }
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          }
        }
      }
    },
    "/v1/uploads/multipart": {
      "post": {
        "summary": "Start a multipart upload for a file over 100 MB, up to 5 GB",
        "description": "PUT the parts, then complete. upload_id is valid for 24 h and only for this key. The declared bytes count against the daily upload allowance now; an abort on the same UTC day gives them back once.",
        "parameters": [
          {
            "name": "filename",
            "in": "query",
            "required": true,
            "schema": {
              "type": "string"
            }
          },
          {
            "name": "bytes",
            "in": "query",
            "required": true,
            "description": "Size of the whole file",
            "schema": {
              "type": "integer",
              "minimum": 1,
              "maximum": 5000000000
            }
          }
        ],
        "responses": {
          "201": {
            "description": "Started",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/MultipartUpload"
                }
              }
            }
          },
          "400": {
            "description": "Missing filename or bytes, or UNSUPPORTED_FILE_TYPE",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "413": {
            "description": "Over 5 GB",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "429": {
            "description": "RATE_LIMITED: over the key's limits (default 3 running jobs, 500 jobs and 20 GB of uploads per UTC day, overridable per key) or too many failed auth attempts",
            "headers": {
              "Retry-After": {
                "description": "Seconds until a slot or the daily allowance frees up",
                "schema": {
                  "type": "integer"
                }
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          }
        }
      }
    },
    "/v1/uploads/multipart/{upload_id}/{part}": {
      "put": {
        "summary": "Upload one part",
        "description": "The raw bytes of the part with Content-Length. Parts are 1-based and every part is exactly part_size bytes except the last.",
        "parameters": [
          {
            "name": "upload_id",
            "in": "path",
            "required": true,
            "schema": {
              "type": "string"
            }
          },
          {
            "name": "part",
            "in": "path",
            "required": true,
            "schema": {
              "type": "integer",
              "minimum": 1
            }
          }
        ],
        "requestBody": {
          "required": true,
          "content": {
            "application/octet-stream": {
              "schema": {
                "type": "string",
                "format": "binary"
              }
            }
          }
        },
        "responses": {
          "200": {
            "description": "Stored; keep the etag for complete",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/MultipartPart"
                }
              }
            }
          },
          "400": {
            "description": "Part number out of range, the wrong size or no Content-Length",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "404": {
            "description": "Unknown or expired upload_id",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "413": {
            "description": "Larger than the part",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          }
        }
      }
    },
    "/v1/uploads/multipart/{upload_id}/complete": {
      "post": {
        "summary": "Complete a multipart upload",
        "parameters": [
          {
            "name": "upload_id",
            "in": "path",
            "required": true,
            "schema": {
              "type": "string"
            }
          }
        ],
        "requestBody": {
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/MultipartComplete"
              }
            }
          }
        },
        "responses": {
          "201": {
            "description": "Stored for 7 days",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Upload"
                }
              }
            }
          },
          "400": {
            "description": "A part is missing, listed twice or its etag doesn't match",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "404": {
            "description": "Unknown or expired upload_id",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          }
        }
      }
    },
    "/v1/uploads/multipart/{upload_id}": {
      "delete": {
        "summary": "Abort a multipart upload",
        "parameters": [
          {
            "name": "upload_id",
            "in": "path",
            "required": true,
            "schema": {
              "type": "string"
            }
          }
        ],
        "responses": {
          "204": {
            "description": "Aborted"
          },
          "404": {
            "description": "Unknown or expired upload_id",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "409": {
            "description": "UPLOAD_COMPLETED: complete already ran, the file stays until it expires",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          }
        }
      }
    },
    "/f/{key}": {
      "get": {
        "summary": "Download an output or upload (Range supported, no auth)",
        "security": [],
        "parameters": [
          {
            "name": "key",
            "in": "path",
            "required": true,
            "schema": {
              "type": "string"
            }
          }
        ],
        "responses": {
          "200": {
            "description": "File"
          },
          "206": {
            "description": "Partial content"
          },
          "404": {
            "description": "Unknown or expired",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "416": {
            "description": "Range not satisfiable"
          }
        }
      }
    }
  },
  "components": {
    "securitySchemes": {
      "bearer": {
        "type": "http",
        "scheme": "bearer",
        "bearerFormat": "rk_live_..."
      }
    },
    "schemas": {
      "SlideshowRequest": {
        "type": "object",
        "properties": {
          "images": {
            "minItems": 1,
            "maxItems": 100,
            "type": "array",
            "items": {
              "anyOf": [
                {
                  "type": "string",
                  "maxLength": 4096,
                  "format": "uri"
                },
                {
                  "type": "object",
                  "properties": {
                    "url": {
                      "type": "string",
                      "maxLength": 4096,
                      "format": "uri"
                    },
                    "seconds": {
                      "anyOf": [
                        {
                          "type": "number",
                          "minimum": 0.5,
                          "maximum": 60
                        },
                        {
                          "type": "null"
                        }
                      ]
                    }
                  },
                  "required": [
                    "url"
                  ]
                }
              ]
            }
          },
          "size": {
            "description": "'1080x1920' or an aspect like '9:16', '16:9', '1:1', '4:5'. Default 1080x1920",
            "type": "string"
          },
          "width": {
            "type": "integer",
            "minimum": -9007199254740991,
            "maximum": 9007199254740991
          },
          "height": {
            "type": "integer",
            "minimum": -9007199254740991,
            "maximum": 9007199254740991
          },
          "fps": {
            "type": "integer",
            "minimum": 24,
            "maximum": 60
          },
          "seconds_per_image": {
            "anyOf": [
              {
                "type": "number",
                "minimum": 0.5,
                "maximum": 60
              },
              {
                "type": "null"
              }
            ]
          },
          "transition": {
            "anyOf": [
              {
                "type": "string",
                "enum": [
                  "fade",
                  "fadeblack",
                  "fadewhite",
                  "fadegrays",
                  "fadefast",
                  "fadeslow",
                  "dissolve",
                  "distance",
                  "pixelize",
                  "radial",
                  "wipeleft",
                  "wiperight",
                  "wipeup",
                  "wipedown",
                  "wipetl",
                  "wipetr",
                  "wipebl",
                  "wipebr",
                  "slideleft",
                  "slideright",
                  "slideup",
                  "slidedown",
                  "smoothleft",
                  "smoothright",
                  "smoothup",
                  "smoothdown",
                  "circlecrop",
                  "rectcrop",
                  "circleclose",
                  "circleopen",
                  "horzclose",
                  "horzopen",
                  "vertclose",
                  "vertopen",
                  "diagbl",
                  "diagbr",
                  "diagtl",
                  "diagtr",
                  "hlslice",
                  "hrslice",
                  "vuslice",
                  "vdslice",
                  "hblur",
                  "squeezeh",
                  "squeezev",
                  "zoomin",
                  "hlwind",
                  "hrwind",
                  "vuwind",
                  "vdwind",
                  "coverleft",
                  "coverright",
                  "coverup",
                  "coverdown",
                  "revealleft",
                  "revealright",
                  "revealup",
                  "revealdown",
                  "random",
                  "none"
                ]
              },
              {
                "type": "object",
                "properties": {
                  "type": {
                    "type": "string",
                    "enum": [
                      "fade",
                      "fadeblack",
                      "fadewhite",
                      "fadegrays",
                      "fadefast",
                      "fadeslow",
                      "dissolve",
                      "distance",
                      "pixelize",
                      "radial",
                      "wipeleft",
                      "wiperight",
                      "wipeup",
                      "wipedown",
                      "wipetl",
                      "wipetr",
                      "wipebl",
                      "wipebr",
                      "slideleft",
                      "slideright",
                      "slideup",
                      "slidedown",
                      "smoothleft",
                      "smoothright",
                      "smoothup",
                      "smoothdown",
                      "circlecrop",
                      "rectcrop",
                      "circleclose",
                      "circleopen",
                      "horzclose",
                      "horzopen",
                      "vertclose",
                      "vertopen",
                      "diagbl",
                      "diagbr",
                      "diagtl",
                      "diagtr",
                      "hlslice",
                      "hrslice",
                      "vuslice",
                      "vdslice",
                      "hblur",
                      "squeezeh",
                      "squeezev",
                      "zoomin",
                      "hlwind",
                      "hrwind",
                      "vuwind",
                      "vdwind",
                      "coverleft",
                      "coverright",
                      "coverup",
                      "coverdown",
                      "revealleft",
                      "revealright",
                      "revealup",
                      "revealdown",
                      "random",
                      "none"
                    ]
                  },
                  "seconds": {
                    "type": "number",
                    "minimum": 0.1,
                    "maximum": 2
                  }
                },
                "required": [
                  "type"
                ]
              }
            ]
          },
          "fit": {
            "type": "string",
            "enum": [
              "cover",
              "contain"
            ]
          },
          "motion": {
            "anyOf": [
              {
                "type": "string",
                "enum": [
                  "none",
                  "kenburns"
                ]
              },
              {
                "type": "boolean"
              }
            ]
          },
          "voiceover": {
            "anyOf": [
              {
                "anyOf": [
                  {
                    "type": "string",
                    "maxLength": 4096,
                    "format": "uri"
                  },
                  {
                    "type": "object",
                    "properties": {
                      "url": {
                        "type": "string",
                        "maxLength": 4096,
                        "format": "uri"
                      },
                      "volume": {
                        "type": "number",
                        "minimum": 0,
                        "maximum": 2
                      }
                    },
                    "required": [
                      "url"
                    ]
                  },
                  {
                    "type": "object",
                    "properties": {
                      "text": {
                        "type": "string",
                        "minLength": 1,
                        "maxLength": 10000
                      },
                      "voice": {
                        "type": "string",
                        "enum": [
                          "amalthea",
                          "andromeda",
                          "apollo",
                          "arcas",
                          "aries",
                          "asteria",
                          "athena",
                          "atlas",
                          "aurora",
                          "callista",
                          "cora",
                          "cordelia",
                          "delia",
                          "draco",
                          "electra",
                          "harmonia",
                          "helena",
                          "hera",
                          "hermes",
                          "hyperion",
                          "iris",
                          "janus",
                          "juno",
                          "jupiter",
                          "luna",
                          "mars",
                          "minerva",
                          "neptune",
                          "odysseus",
                          "ophelia",
                          "orion",
                          "orpheus",
                          "pandora",
                          "phoebe",
                          "pluto",
                          "saturn",
                          "thalia",
                          "theia",
                          "vesta",
                          "zeus"
                        ]
                      },
                      "volume": {
                        "type": "number",
                        "minimum": 0,
                        "maximum": 2
                      }
                    },
                    "required": [
                      "text"
                    ]
                  }
                ]
              },
              {
                "type": "null"
              }
            ]
          },
          "music": {
            "anyOf": [
              {
                "anyOf": [
                  {
                    "type": "string",
                    "maxLength": 4096,
                    "format": "uri"
                  },
                  {
                    "type": "object",
                    "properties": {
                      "url": {
                        "type": "string",
                        "maxLength": 4096,
                        "format": "uri"
                      },
                      "volume": {
                        "type": "number",
                        "minimum": 0,
                        "maximum": 2
                      }
                    },
                    "required": [
                      "url"
                    ]
                  }
                ]
              },
              {
                "type": "null"
              }
            ]
          },
          "captions": {
            "anyOf": [
              {
                "anyOf": [
                  {
                    "type": "boolean"
                  },
                  {
                    "type": "string",
                    "enum": [
                      "bold",
                      "karaoke",
                      "minimal"
                    ]
                  },
                  {
                    "type": "object",
                    "properties": {
                      "preset": {
                        "type": "string",
                        "enum": [
                          "bold",
                          "karaoke",
                          "minimal"
                        ]
                      },
                      "font": {
                        "type": "string",
                        "enum": [
                          "Montserrat",
                          "Anton",
                          "Bebas Neue",
                          "Poppins"
                        ]
                      },
                      "position": {
                        "type": "string",
                        "enum": [
                          "top",
                          "middle",
                          "bottom",
                          "center"
                        ]
                      },
                      "max_words": {
                        "type": "integer",
                        "minimum": 1,
                        "maximum": 8
                      },
                      "uppercase": {
                        "type": "boolean"
                      },
                      "text_color": {
                        "type": "string",
                        "pattern": "^(#?[0-9a-fA-F]{3}|#?[0-9a-fA-F]{6}|[a-zA-Z]+)$"
                      },
                      "highlight_color": {
                        "type": "string",
                        "pattern": "^(#?[0-9a-fA-F]{3}|#?[0-9a-fA-F]{6}|[a-zA-Z]+)$"
                      },
                      "outline_color": {
                        "type": "string",
                        "pattern": "^(#?[0-9a-fA-F]{3}|#?[0-9a-fA-F]{6}|[a-zA-Z]+)$"
                      },
                      "size": {
                        "type": "number",
                        "minimum": 0.5,
                        "maximum": 2
                      }
                    }
                  }
                ]
              },
              {
                "type": "null"
              }
            ]
          },
          "language": {
            "anyOf": [
              {
                "type": "string",
                "pattern": "^[a-zA-Z]{2,3}([-_][a-zA-Z0-9]{2,8})?$"
              },
              {
                "type": "null"
              }
            ]
          },
          "quality": {
            "type": "string",
            "enum": [
              "draft",
              "standard",
              "high"
            ]
          },
          "webhook_url": {
            "description": "POSTed the job JSON when it finishes, signed with Reel-Signature",
            "type": "string",
            "maxLength": 4096,
            "format": "uri"
          }
        },
        "required": [
          "images"
        ]
      },
      "CaptionsRequest": {
        "type": "object",
        "properties": {
          "video_url": {
            "type": "string",
            "maxLength": 4096,
            "format": "uri"
          },
          "style": {
            "anyOf": [
              {
                "type": "string",
                "enum": [
                  "bold",
                  "karaoke",
                  "minimal"
                ]
              },
              {
                "type": "object",
                "properties": {
                  "preset": {
                    "type": "string",
                    "enum": [
                      "bold",
                      "karaoke",
                      "minimal"
                    ]
                  },
                  "font": {
                    "type": "string",
                    "enum": [
                      "Montserrat",
                      "Anton",
                      "Bebas Neue",
                      "Poppins"
                    ]
                  },
                  "position": {
                    "type": "string",
                    "enum": [
                      "top",
                      "middle",
                      "bottom",
                      "center"
                    ]
                  },
                  "max_words": {
                    "type": "integer",
                    "minimum": 1,
                    "maximum": 8
                  },
                  "uppercase": {
                    "type": "boolean"
                  },
                  "text_color": {
                    "type": "string",
                    "pattern": "^(#?[0-9a-fA-F]{3}|#?[0-9a-fA-F]{6}|[a-zA-Z]+)$"
                  },
                  "highlight_color": {
                    "type": "string",
                    "pattern": "^(#?[0-9a-fA-F]{3}|#?[0-9a-fA-F]{6}|[a-zA-Z]+)$"
                  },
                  "outline_color": {
                    "type": "string",
                    "pattern": "^(#?[0-9a-fA-F]{3}|#?[0-9a-fA-F]{6}|[a-zA-Z]+)$"
                  },
                  "size": {
                    "type": "number",
                    "minimum": 0.5,
                    "maximum": 2
                  }
                }
              }
            ]
          },
          "language": {
            "anyOf": [
              {
                "type": "string",
                "pattern": "^[a-zA-Z]{2,3}([-_][a-zA-Z0-9]{2,8})?$"
              },
              {
                "type": "null"
              }
            ]
          },
          "words": {
            "description": "Bring your own word timings and skip transcription",
            "anyOf": [
              {
                "maxItems": 50000,
                "type": "array",
                "items": {
                  "type": "object",
                  "properties": {
                    "word": {
                      "type": "string",
                      "maxLength": 200
                    },
                    "start": {
                      "type": "number",
                      "minimum": 0
                    },
                    "end": {
                      "type": "number",
                      "minimum": 0
                    }
                  },
                  "required": [
                    "word",
                    "start",
                    "end"
                  ]
                }
              },
              {
                "type": "null"
              }
            ]
          },
          "prompt": {
            "description": "Names and terms to spell correctly; passed to the transcriber as a hint",
            "anyOf": [
              {
                "type": "string",
                "maxLength": 500
              },
              {
                "type": "null"
              }
            ]
          },
          "quality": {
            "type": "string",
            "enum": [
              "draft",
              "standard",
              "high"
            ]
          },
          "webhook_url": {
            "description": "POSTed the job JSON when it finishes, signed with Reel-Signature",
            "type": "string",
            "maxLength": 4096,
            "format": "uri"
          }
        },
        "required": [
          "video_url"
        ]
      },
      "FfmpegRequest": {
        "type": "object",
        "properties": {
          "inputs": {
            "type": "object",
            "propertyNames": {
              "type": "string",
              "pattern": "^[A-Za-z0-9][A-Za-z0-9._-]{0,63}$"
            },
            "additionalProperties": {
              "type": "string",
              "maxLength": 4096,
              "format": "uri"
            }
          },
          "args": {
            "anyOf": [
              {
                "minItems": 1,
                "maxItems": 1000,
                "type": "array",
                "items": {
                  "type": "string",
                  "maxLength": 8192
                }
              },
              {
                "type": "string",
                "minLength": 1,
                "maxLength": 65536
              }
            ],
            "description": "argv after 'ffmpeg' (array preferred; a string is split like a shell would)"
          },
          "outputs": {
            "minItems": 1,
            "maxItems": 20,
            "type": "array",
            "items": {
              "type": "string",
              "pattern": "^[A-Za-z0-9][A-Za-z0-9._-]{0,63}$"
            }
          },
          "timeout_s": {
            "type": "integer",
            "minimum": 1,
            "maximum": 600
          },
          "webhook_url": {
            "description": "POSTed the job JSON when it finishes, signed with Reel-Signature",
            "type": "string",
            "maxLength": 4096,
            "format": "uri"
          }
        },
        "required": [
          "args"
        ]
      },
      "ShortsRequest": {
        "type": "object",
        "properties": {
          "topic": {
            "description": "What the short is about. Required unless script is given",
            "type": "string",
            "minLength": 1,
            "maxLength": 500
          },
          "script": {
            "description": "Narration used verbatim; wins over topic, which then only steers the visuals",
            "type": "string",
            "minLength": 1,
            "maxLength": 3000
          },
          "duration_s": {
            "description": "Target length in topic mode. Default 45",
            "type": "integer",
            "minimum": 15,
            "maximum": 90
          },
          "aspect": {
            "type": "string",
            "enum": [
              "9:16",
              "1:1",
              "16:9"
            ]
          },
          "style": {
            "type": "string",
            "enum": [
              "cinematic",
              "photoreal",
              "anime",
              "3d-cartoon",
              "watercolor",
              "comic",
              "dark-documentary",
              "oil-painting"
            ]
          },
          "language": {
            "description": "en, es, fr, ja, zh or ko. Default en",
            "type": "string",
            "pattern": "^[a-zA-Z]{2,3}([-_][a-zA-Z0-9]{2,8})?$"
          },
          "voice": {
            "description": "en: 40 aura-2 voices (default luna), es: 10 (default aquila). Ignored for fr/ja/zh/ko",
            "type": "string",
            "maxLength": 32
          },
          "music": {
            "type": "string",
            "enum": [
              "auto",
              "none",
              "lofi",
              "chill",
              "upbeat",
              "cinematic",
              "dramatic",
              "dark",
              "energetic",
              "inspiring"
            ]
          },
          "captions": {
            "anyOf": [
              {
                "anyOf": [
                  {
                    "type": "boolean"
                  },
                  {
                    "type": "string",
                    "enum": [
                      "bold",
                      "karaoke",
                      "minimal"
                    ]
                  },
                  {
                    "type": "object",
                    "properties": {
                      "preset": {
                        "type": "string",
                        "enum": [
                          "bold",
                          "karaoke",
                          "minimal"
                        ]
                      },
                      "font": {
                        "type": "string",
                        "enum": [
                          "Montserrat",
                          "Anton",
                          "Bebas Neue",
                          "Poppins"
                        ]
                      },
                      "position": {
                        "type": "string",
                        "enum": [
                          "top",
                          "middle",
                          "bottom",
                          "center"
                        ]
                      },
                      "max_words": {
                        "type": "integer",
                        "minimum": 1,
                        "maximum": 8
                      },
                      "uppercase": {
                        "type": "boolean"
                      },
                      "text_color": {
                        "type": "string",
                        "pattern": "^(#?[0-9a-fA-F]{3}|#?[0-9a-fA-F]{6}|[a-zA-Z]+)$"
                      },
                      "highlight_color": {
                        "type": "string",
                        "pattern": "^(#?[0-9a-fA-F]{3}|#?[0-9a-fA-F]{6}|[a-zA-Z]+)$"
                      },
                      "outline_color": {
                        "type": "string",
                        "pattern": "^(#?[0-9a-fA-F]{3}|#?[0-9a-fA-F]{6}|[a-zA-Z]+)$"
                      },
                      "size": {
                        "type": "number",
                        "minimum": 0.5,
                        "maximum": 2
                      }
                    }
                  }
                ]
              },
              {
                "type": "null"
              }
            ]
          },
          "webhook_url": {
            "description": "POSTed the job JSON when it finishes, signed with Reel-Signature",
            "type": "string",
            "maxLength": 4096,
            "format": "uri"
          }
        }
      },
      "Job": {
        "type": "object",
        "properties": {
          "id": {
            "type": "string",
            "example": "job_3k9x0c2m1q8w7e6r5t4y"
          },
          "op": {
            "type": "string",
            "enum": [
              "slideshow",
              "captions",
              "ffmpeg",
              "shorts"
            ]
          },
          "status": {
            "type": "string",
            "enum": [
              "queued",
              "running",
              "succeeded",
              "failed"
            ]
          },
          "stage": {
            "anyOf": [
              {
                "type": "string",
                "enum": [
                  "planning",
                  "voice",
                  "images",
                  "rendering"
                ]
              },
              {
                "type": "null"
              }
            ],
            "description": "shorts: the step that is running; null once finished and for other ops"
          },
          "created_at": {
            "type": "string"
          },
          "finished_at": {
            "type": [
              "string",
              "null"
            ]
          },
          "outputs": {
            "type": "object",
            "propertyNames": {
              "type": "string"
            },
            "additionalProperties": {
              "type": "string"
            },
            "description": "slideshow/captions: video, transcript, srt, vtt, ass. shorts: video, poster, transcript, srt, vtt. ffmpeg: one URL per output filename"
          },
          "result": {
            "anyOf": [
              {
                "type": "object",
                "properties": {
                  "title": {
                    "type": "string"
                  },
                  "post_caption": {
                    "type": "string"
                  },
                  "scenes": {
                    "type": "array",
                    "items": {
                      "type": "object",
                      "properties": {
                        "narration": {
                          "type": "string"
                        },
                        "image": {
                          "type": "string"
                        }
                      },
                      "required": [
                        "narration",
                        "image"
                      ],
                      "additionalProperties": false
                    }
                  }
                },
                "required": [
                  "title",
                  "post_caption",
                  "scenes"
                ],
                "additionalProperties": false
              },
              {
                "type": "null"
              }
            ],
            "description": "shorts, once succeeded: title, ready-to-post caption and every scene with its still"
          },
          "duration_s": {
            "type": [
              "number",
              "null"
            ]
          },
          "error": {
            "anyOf": [
              {
                "type": "object",
                "properties": {
                  "code": {
                    "type": "string"
                  },
                  "message": {
                    "type": "string"
                  }
                },
                "required": [
                  "code",
                  "message"
                ],
                "additionalProperties": false
              },
              {
                "type": "null"
              }
            ]
          },
          "usage": {
            "type": "object",
            "properties": {
              "output_seconds": {
                "type": "number"
              },
              "audio_seconds": {
                "type": "number"
              },
              "tts_characters": {
                "type": "number"
              },
              "images": {
                "type": "number"
              }
            },
            "required": [
              "output_seconds",
              "audio_seconds",
              "tts_characters",
              "images"
            ],
            "additionalProperties": false
          },
          "cost_usd": {
            "description": "Dashboard keys only: what the job was charged, 0 when it failed, null until it is settled",
            "type": [
              "number",
              "null"
            ]
          },
          "poll_url": {
            "type": "string"
          }
        },
        "required": [
          "id",
          "op",
          "status",
          "stage",
          "created_at",
          "finished_at",
          "outputs",
          "result",
          "duration_s",
          "error",
          "usage",
          "poll_url"
        ],
        "additionalProperties": false
      },
      "JobEnvelope": {
        "type": "object",
        "properties": {
          "job": {
            "$ref": "#/components/schemas/Job"
          }
        },
        "required": [
          "job"
        ]
      },
      "Error": {
        "type": "object",
        "properties": {
          "error": {
            "type": "object",
            "properties": {
              "code": {
                "type": "string"
              },
              "message": {
                "type": "string"
              },
              "issues": {
                "type": "array",
                "items": {
                  "type": "object",
                  "properties": {
                    "path": {
                      "type": "string"
                    },
                    "message": {
                      "type": "string"
                    }
                  },
                  "required": [
                    "path",
                    "message"
                  ],
                  "additionalProperties": false
                }
              }
            },
            "required": [
              "code",
              "message"
            ],
            "additionalProperties": false
          },
          "job": {
            "type": "object",
            "properties": {
              "id": {
                "type": "string",
                "example": "job_3k9x0c2m1q8w7e6r5t4y"
              },
              "op": {
                "type": "string",
                "enum": [
                  "slideshow",
                  "captions",
                  "ffmpeg",
                  "shorts"
                ]
              },
              "status": {
                "type": "string",
                "enum": [
                  "queued",
                  "running",
                  "succeeded",
                  "failed"
                ]
              },
              "stage": {
                "anyOf": [
                  {
                    "type": "string",
                    "enum": [
                      "planning",
                      "voice",
                      "images",
                      "rendering"
                    ]
                  },
                  {
                    "type": "null"
                  }
                ],
                "description": "shorts: the step that is running; null once finished and for other ops"
              },
              "created_at": {
                "type": "string"
              },
              "finished_at": {
                "type": [
                  "string",
                  "null"
                ]
              },
              "outputs": {
                "type": "object",
                "propertyNames": {
                  "type": "string"
                },
                "additionalProperties": {
                  "type": "string"
                },
                "description": "slideshow/captions: video, transcript, srt, vtt, ass. shorts: video, poster, transcript, srt, vtt. ffmpeg: one URL per output filename"
              },
              "result": {
                "anyOf": [
                  {
                    "type": "object",
                    "properties": {
                      "title": {
                        "type": "string"
                      },
                      "post_caption": {
                        "type": "string"
                      },
                      "scenes": {
                        "type": "array",
                        "items": {
                          "type": "object",
                          "properties": {
                            "narration": {
                              "type": "string"
                            },
                            "image": {
                              "type": "string"
                            }
                          },
                          "required": [
                            "narration",
                            "image"
                          ],
                          "additionalProperties": false
                        }
                      }
                    },
                    "required": [
                      "title",
                      "post_caption",
                      "scenes"
                    ],
                    "additionalProperties": false
                  },
                  {
                    "type": "null"
                  }
                ],
                "description": "shorts, once succeeded: title, ready-to-post caption and every scene with its still"
              },
              "duration_s": {
                "type": [
                  "number",
                  "null"
                ]
              },
              "error": {
                "anyOf": [
                  {
                    "type": "object",
                    "properties": {
                      "code": {
                        "type": "string"
                      },
                      "message": {
                        "type": "string"
                      }
                    },
                    "required": [
                      "code",
                      "message"
                    ],
                    "additionalProperties": false
                  },
                  {
                    "type": "null"
                  }
                ]
              },
              "usage": {
                "type": "object",
                "properties": {
                  "output_seconds": {
                    "type": "number"
                  },
                  "audio_seconds": {
                    "type": "number"
                  },
                  "tts_characters": {
                    "type": "number"
                  },
                  "images": {
                    "type": "number"
                  }
                },
                "required": [
                  "output_seconds",
                  "audio_seconds",
                  "tts_characters",
                  "images"
                ],
                "additionalProperties": false
              },
              "cost_usd": {
                "description": "Dashboard keys only: what the job was charged, 0 when it failed, null until it is settled",
                "type": [
                  "number",
                  "null"
                ]
              },
              "poll_url": {
                "type": "string"
              }
            },
            "required": [
              "id",
              "op",
              "status",
              "stage",
              "created_at",
              "finished_at",
              "outputs",
              "result",
              "duration_s",
              "error",
              "usage",
              "poll_url"
            ],
            "additionalProperties": false
          }
        },
        "required": [
          "error"
        ],
        "additionalProperties": false
      },
      "Upload": {
        "type": "object",
        "properties": {
          "url": {
            "type": "string"
          },
          "expires_at": {
            "type": "string"
          }
        },
        "required": [
          "url",
          "expires_at"
        ],
        "additionalProperties": false
      },
      "MultipartUpload": {
        "type": "object",
        "properties": {
          "upload_id": {
            "type": "string"
          },
          "url": {
            "type": "string",
            "description": "Serves the file once complete returns"
          },
          "part_size": {
            "type": "integer",
            "minimum": -9007199254740991,
            "maximum": 9007199254740991,
            "description": "Bytes per part, 64 MiB; the last part holds the rest"
          },
          "parts": {
            "type": "integer",
            "minimum": -9007199254740991,
            "maximum": 9007199254740991
          },
          "expires_at": {
            "type": "string",
            "description": "When upload_id stops working, 24 h after the start"
          }
        },
        "required": [
          "upload_id",
          "url",
          "part_size",
          "parts",
          "expires_at"
        ],
        "additionalProperties": false
      },
      "MultipartPart": {
        "type": "object",
        "properties": {
          "part": {
            "type": "integer",
            "minimum": -9007199254740991,
            "maximum": 9007199254740991
          },
          "etag": {
            "type": "string"
          }
        },
        "required": [
          "part",
          "etag"
        ],
        "additionalProperties": false
      },
      "MultipartComplete": {
        "type": "object",
        "properties": {
          "parts": {
            "minItems": 1,
            "type": "array",
            "items": {
              "type": "object",
              "properties": {
                "part": {
                  "type": "integer",
                  "minimum": 1,
                  "maximum": 9007199254740991
                },
                "etag": {
                  "type": "string",
                  "minLength": 1
                }
              },
              "required": [
                "part",
                "etag"
              ]
            },
            "description": "Every part with the etag its PUT returned"
          }
        },
        "required": [
          "parts"
        ]
      }
    }
  }
}