{
  "openapi": "3.0.1",
  "info": {
    "title": "Shotstack",
    "version": "v1",
    "description": "Shotstack is a video, image and audio editing service that allows for the automated generation of videos, images and audio using JSON and a RESTful API.\n\nYou arrange and configure an edit and POST it to the API which will render your media and provide a file location when complete.\n\nFor more details visit [shotstack.io](https://shotstack.io) or checkout our [getting started](https://shotstack.io/docs/guide/) documentation.\n\nThere are three API's, one for editing and generating assets (Edit API), one for managing hosted assets (Serve API) and one for ingesting and transforming source assets (Ingest API).\n\nEach API has it's own base URL and collection of endpoints. Each API uses the same set of API keys.\n\n**[Edit API](#shotstack-edit)** - [https://api.shotstack.io/edit/{version}](#)<br>\nEdit videos, images and audio assets in the cloud using a simple JSON schema and templates.\n\n**[Serve API](#shotstack-serve)** - [https://api.shotstack.io/serve/{version}](#)<br>\nInspect and manage the hosting of assets generated by the Edit and Ingest APIs.\n\n**[Ingest API](#shotstack-ingest)** - [https://api.shotstack.io/ingest/{version}](#)<br>\nIngest (upload, store and transform) source footage, images, audio and fonts to be used by the Edit API.\n"
  },
  "servers": [
    {
      "url": "https://api.shotstack.io/edit/{version}",
      "variables": {
        "version": {
          "description": "Set the stage to **v1** for production usage without watermarks. Set to **stage** to use the development sandbox.",
          "enum": [
            "v1",
            "stage"
          ],
          "default": "v1"
        }
      }
    }
  ],
  "tags": [
    {
      "name": "Edit",
      "description": "The Edit API is used to edit videos, images and audio files in the cloud using a simple to understand JSON schema. Compose an edit using tracks, clips and assets and add transitions, filters, overlays and text. Finally send the JSON to the Edit API to be rendered."
    }
  ],
  "paths": {
    "/render": {
      "post": {
        "responses": {
          "201": {
            "description": "The queued render details",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/QueuedResponse"
                }
              }
            }
          }
        },
        "description": "Queue and render the contents of an [Edit](#tocs_edit) as a video, image or audio file.\n\n**Rendering Process:**\n1. **Validation**: The edit JSON is validated\n2. **Download**: All assets are downloaded and cached  \n3. **Preprocessing**: Video assets are automatically processed to fix compatibility issues\n4. **Rendering**: The timeline is rendered using the processed assets\n5. **Output**: The final media file is generated and stored\n\n**Video Preprocessing:**\nVideo assets undergo automatic preprocessing to ensure compatibility. You can force \npreprocessing by setting `\"transcode\": true` on video assets. See [Preprocessing](#preprocessing) \nfor more details.\n\n**Base URL:** <a href=\"#\">https://api.shotstack.io/edit/{version}</a>\n",
        "summary": "Render Asset",
        "operationId": "postRender",
        "requestBody": {
          "description": "The video, image or audio edit specified using JSON.",
          "content": {
            "application/json": {
              "example": {
                "timeline": {
                  "soundtrack": {
                    "src": "https://s3-ap-northeast-1.amazonaws.com/my-bucket/music.mp3",
                    "effect": "fadeInFadeOut"
                  },
                  "background": "#000000",
                  "tracks": [
                    {
                      "clips": [
                        {
                          "asset": {
                            "type": "title",
                            "text": "Hello World",
                            "style": "minimal"
                          },
                          "start": 0,
                          "length": 4,
                          "transition": {
                            "in": "fade",
                            "out": "fade"
                          },
                          "effect": "slideRight"
                        },
                        {
                          "asset": {
                            "type": "image",
                            "src": "https://s3-ap-northeast-1.amazonaws.com/my-bucket/my-image.jpg"
                          },
                          "start": 3,
                          "length": 4,
                          "effect": "zoomIn",
                          "filter": "greyscale"
                        }
                      ]
                    },
                    {
                      "clips": [
                        {
                          "asset": {
                            "type": "video",
                            "src": "https://s3-ap-northeast-1.amazonaws.com/my-bucket/my-clip-1.mp4",
                            "trim": 10.5,
                            "transcode": true
                          },
                          "start": 7,
                          "length": 4.5
                        },
                        {
                          "asset": {
                            "type": "video",
                            "src": "https://s3-ap-northeast-1.amazonaws.com/my-bucket/my-clip-2.mp4",
                            "volume": 0.5
                          },
                          "start": 11.5,
                          "length": 5,
                          "transition": {
                            "out": "wipeLeft"
                          }
                        }
                      ]
                    }
                  ]
                },
                "output": {
                  "format": "mp4",
                  "resolution": "sd"
                }
              },
              "schema": {
                "$ref": "#/components/schemas/Edit"
              }
            }
          },
          "required": true
        },
        "security": [
          {
            "DeveloperKey": []
          }
        ],
        "tags": [
          "Edit"
        ]
      }
    },
    "/render/{id}": {
      "get": {
        "responses": {
          "200": {
            "description": "The render status details",
            "content": {
              "application/json": {
                "example": {
                  "success": true,
                  "message": "OK",
                  "response": {
                    "status": "rendering",
                    "id": "2abd5c11-0f3d-4c6d-ba20-235fc9b8e8b7",
                    "owner": "5ca6hu7s9k",
                    "url": "https://shotstack-api-v1-output.s3-ap-southeast-2.amazonaws.com/5ca6hu7s9k/2abd5c11-0f3d-4c6d-ba20-235fc9b8e8b7.mp4",
                    "data": {
                      "$ref": "#/paths/~1render/post/requestBody/content/application~1json/example"
                    },
                    "created": "2020-10-30T09:42:29.446Z",
                    "updated": "2020-10-30T09:42:39.168Z"
                  }
                },
                "schema": {
                  "$ref": "#/components/schemas/RenderResponse"
                }
              }
            }
          }
        },
        "description": "Get the rendering status, temporary asset url and details of a render by ID.\n\n**Base URL:** <a href=\"#\">https://api.shotstack.io/edit/{version}</a>\n",
        "operationId": "getRender",
        "summary": "Get Render Status",
        "security": [
          {
            "DeveloperKey": []
          }
        ],
        "tags": [
          "Edit"
        ]
      }
    },
    "/templates": {
      "post": {
        "description": "Save an [Edit](#tocs_edit) as a re-usable template. Templates can be retrieved and modified in your application\nbefore being rendered. [Merge fields](#tocs_mergefield) can be also used to merge data in to a template and\n[render](#render-template) it in a single request.\n\n**Base URL:** <a href=\"#\">https://api.shotstack.io/edit/{version}</a>\n",
        "summary": "Create Template",
        "operationId": "postTemplate",
        "requestBody": {
          "description": "Create a template with a name and [Edit](#tocs_edit).",
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/Template"
              }
            }
          },
          "required": true
        },
        "responses": {
          "201": {
            "description": "The saved template status including the id",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/TemplateResponse"
                }
              }
            }
          }
        },
        "security": [
          {
            "DeveloperKey": []
          }
        ],
        "tags": [
          "Edit"
        ]
      },
      "get": {
        "description": "Retrieve a list of templates stored against a users account and stage.\n\n**Base URL:** <a href=\"#\">https://api.shotstack.io/edit/{version}</a>\n",
        "summary": "List Templates",
        "operationId": "getTemplates",
        "responses": {
          "200": {
            "description": "The list of templates stored against a users account",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/TemplateListResponse"
                }
              }
            }
          }
        },
        "security": [
          {
            "DeveloperKey": []
          }
        ],
        "tags": [
          "Edit"
        ]
      }
    },
    "/templates/{id}": {
      "get": {
        "description": "Retrieve a template by template id.\n\n**Base URL:** <a href=\"#\">https://api.shotstack.io/edit/{version}</a>\n",
        "summary": "Retrieve Template",
        "operationId": "getTemplate",
        "responses": {
          "200": {
            "description": "The template details including the [Edit](#tocs_edit)",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/TemplateDataResponse"
                }
              }
            }
          }
        },
        "security": [
          {
            "DeveloperKey": []
          }
        ],
        "tags": [
          "Edit"
        ]
      },
      "put": {
        "description": "Update an existing template by template id.\n\n**Base URL:** <a href=\"#\">https://api.shotstack.io/edit/{version}</a>\n",
        "summary": "Update Template",
        "operationId": "putTemplate",
        "requestBody": {
          "description": "Update an individual templates name and [Edit](#tocs_edit). Both template name and template must be provided. If the template parameter is omitted a blank template will be saved.",
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/Template"
              }
            }
          },
          "required": true
        },
        "responses": {
          "200": {
            "description": "Update a templates name and [Edit](#tocs_edit)",
            "content": {
              "application/json": {
                "example": {
                  "success": true,
                  "message": "OK",
                  "response": {
                    "message": "Template Successfully Updated",
                    "id": "f5493c17-d01f-445c-bb49-535fae65f219"
                  }
                },
                "schema": {
                  "$ref": "#/components/schemas/TemplateResponse"
                }
              }
            }
          }
        },
        "security": [
          {
            "DeveloperKey": []
          }
        ],
        "tags": [
          "Edit"
        ]
      },
      "delete": {
        "responses": {
          "204": {
            "description": "An empty response signifying the template has been deleted"
          }
        },
        "description": "Delete a template by its template id.\n\n**Base URL:** <a href=\"#\">https://api.shotstack.io/edit/{version}</a>\n",
        "operationId": "deleteTemplate",
        "summary": "Delete Template",
        "security": [
          {
            "DeveloperKey": []
          }
        ],
        "tags": [
          "Edit"
        ]
      }
    },
    "/templates/render": {
      "post": {
        "description": "Render an asset from a template id and optional merge fields. Merge fields can be used to replace placeholder\nvariables within the [Edit](#tocs_edit).\n\n**Base URL:** <a href=\"#\">https://api.shotstack.io/edit/{version}</a>\n",
        "summary": "Render Template",
        "operationId": "postTemplateRender",
        "requestBody": {
          "description": "Render a template by template id.",
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/TemplateRender"
              }
            }
          },
          "required": true
        },
        "responses": {
          "201": {
            "description": "The queued status including the render id. Check the status of the render using the id and the  [render status](#get-render-status) endpoint.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/QueuedResponse"
                }
              }
            }
          }
        },
        "security": [
          {
            "DeveloperKey": []
          }
        ],
        "tags": [
          "Edit"
        ]
      }
    },
    "/probe/{url}": {
      "get": {
        "responses": {
          "200": {
            "description": "FFprobe response formatted as JSON.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ProbeResponse"
                }
              }
            }
          }
        },
        "description": "Inspects any media asset (image, video, audio) on the internet using a hosted version\nof [FFprobe](https://ffmpeg.org/ffprobe.html). The probe endpoint returns useful information\nabout an asset such as width, height, duration, rotation, framerate, etc...\n\n**Base URL:** <a href=\"#\">https://api.shotstack.io/edit/{version}</a>\n",
        "operationId": "probe",
        "summary": "Inspect Media",
        "security": [
          {
            "DeveloperKey": []
          }
        ],
        "tags": [
          "Edit"
        ]
      }
    }
  },
  "components": {
    "schemas": {
      "Edit": {
        "description": "An edit defines the arrangement of a video on a timeline, an audio edit or an image design and the output format. Video assets are automatically preprocessed to fix common compatibility issues before rendering. You can control preprocessing behavior using the `transcode` flag on video assets.",
        "properties": {
          "timeline": {
            "$ref": "#/components/schemas/Timeline"
          },
          "output": {
            "$ref": "#/components/schemas/Output"
          },
          "merge": {
            "description": "An array of key/value pairs that provides an easy way to create templates with placeholders. The placeholders can be used to find and replace keys with values. For example you can search for the placeholder `{{NAME}}` and replace it with the value `Jane`. ",
            "type": "array",
            "items": {
              "$ref": "#/components/schemas/MergeField"
            }
          },
          "callback": {
            "type": "string",
            "description": "An optional webhook callback URL used to receive status notifications when a render completes or fails. Notifications are also sent when a rendered video is sent to an output  [destination](https://shotstack.io/docs/guide/serving-assets/destinations/).\nSee [webhooks](https://shotstack.io/docs/guide/architecting-an-application/webhooks/) for more details.",
            "example": "https://my-server.com/callback.php"
          },
          "disk": {
            "description": "**Notice: This option is now deprecated and will be removed. Disk types are handled automatically. Setting a disk type has no effect.**\n\nThe disk type to use for storing footage and assets for each render. See [disk types](https://shotstack.io/docs/guide/architecting-an-application/disk-types/) for more details.\n<ul>\n  <li>`local` - optimized for high speed rendering with up to 512MB storage</li>\n  <li>`mount` - optimized for larger file sizes and longer videos with 5GB for source footage and 512MB for output render</li>\n</ul>\n",
            "type": "string",
            "enum": [
              "local",
              "mount"
            ],
            "deprecated": true
          },
          "instance": {
            "description": "The render instance type to use for processing the edit. <ul>\n  <li>`s1` - standard instance (default)</li>\n  <li>`s2` - standard instance with more resources</li>\n  <li>`a1` - accelerated instance for faster rendering</li>\n</ul>",
            "type": "string",
            "enum": [
              "s1",
              "s2",
              "a1"
            ],
            "default": "s1"
          }
        },
        "additionalProperties": false,
        "required": [
          "timeline",
          "output"
        ],
        "type": "object"
      },
      "Timeline": {
        "description": "A timeline represents the contents of a video edit over time, an audio edit over time, in seconds, or an image layout. A timeline consists of layers called tracks. Tracks are composed of titles, images, audio, html or video segments referred to as clips which are placed along the track at specific starting point and lasting for a specific amount of time.",
        "properties": {
          "soundtrack": {
            "description": "A music or audio soundtrack file in mp3 format.",
            "$ref": "#/components/schemas/Soundtrack"
          },
          "background": {
            "description": "A hexadecimal value for the timeline background colour. Defaults to #000000 (black).",
            "type": "string"
          },
          "fonts": {
            "description": "An array of custom fonts to be downloaded for use by the HTML assets.",
            "type": "array",
            "items": {
              "$ref": "#/components/schemas/Font"
            }
          },
          "tracks": {
            "description": "A timeline consists of an array of tracks, each track containing clips. Tracks are layered on top of each other in the same order they are added to the array with the top most track layered over the top of those below it. Ensure that a track containing titles is the top most track so that it is displayed above videos and images.",
            "type": "array",
            "minItems": 1,
            "items": {
              "$ref": "#/components/schemas/Track"
            }
          },
          "cache": {
            "description": "Disable the caching of ingested source footage and assets. See  [caching](https://shotstack.io/docs/guide/architecting-an-application/caching/) for more details.",
            "type": "boolean"
          }
        },
        "additionalProperties": false,
        "required": [
          "tracks"
        ],
        "type": "object"
      },
      "Soundtrack": {
        "description": "A music or audio file in mp3 format that plays for the duration of the rendered video or the length of the audio file, which ever is shortest.",
        "properties": {
          "src": {
            "description": "The URL of the mp3 audio file. The URL must be publicly accessible or include credentials.",
            "type": "string",
            "minLength": 1,
            "pattern": "\\S",
            "example": "https://s3-ap-northeast-1.amazonaws.com/my-bucket/music.mp3"
          },
          "effect": {
            "description": "The effect to apply to the audio file <ul>\n  <li>`fadeIn` - fade volume in only</li>\n  <li>`fadeOut` - fade volume out only</li>\n  <li>`fadeInFadeOut` - fade volume in and out</li>\n</ul>",
            "enum": [
              "fadeIn",
              "fadeOut",
              "fadeInFadeOut"
            ],
            "type": "string"
          },
          "volume": {
            "description": "Set the volume for the soundtrack between 0 and 1 where 0 is muted and 1 is full volume (defaults to 1).",
            "type": "number"
          }
        },
        "additionalProperties": false,
        "required": [
          "src"
        ],
        "type": "object"
      },
      "Font": {
        "description": "Download a custom font to use with the HTML asset type, using the font name in the CSS or font tag. See our [custom fonts](https://shotstack.io/learn/html-custom-fonts/) getting started guide for more details.",
        "properties": {
          "src": {
            "description": "The URL of the font file. The URL must be publicly accessible or include credentials.",
            "type": "string",
            "example": "https://s3-ap-northeast-1.amazonaws.com/my-bucket/open-sans.ttf"
          }
        },
        "additionalProperties": false,
        "required": [
          "src"
        ],
        "type": "object"
      },
      "Track": {
        "description": "A track contains an array of clips. Tracks are layered on top of each other in the order in the array. The top most track will render on top of those below it.",
        "properties": {
          "clips": {
            "description": "An array of Clips comprising of TitleClip, ImageClip or VideoClip.",
            "type": "array",
            "minItems": 1,
            "items": {
              "$ref": "#/components/schemas/Clip"
            }
          }
        },
        "additionalProperties": false,
        "required": [
          "clips"
        ],
        "type": "object"
      },
      "Clip": {
        "description": "A clip is a container for a specific type of asset, i.e. a title, image, video, audio or html. You use a Clip to define when an asset will display on the timeline, how long it will play for and transitions, filters and effects to apply to it.",
        "properties": {
          "asset": {
            "$ref": "#/components/schemas/Asset"
          },
          "start": {
            "description": "The start position of the Clip on the timeline.",
            "oneOf": [
              {
                "type": "number",
                "description": "The start position of the Clip on the timeline, in seconds. For example, to start the Clip at 2 seconds, set the start value to 2.",
                "minimum": 0,
                "example": 2
              },
              {
                "type": "string",
                "description": "The start position using a [smart clip property](/docs/guide/architecting-an-application/smart-clips/). Set to `auto` to automatically play the clip after the previous clip finishes. Use `alias://clip-name` to inherit the start time from the referenced clip.",
                "pattern": "^(auto|alias://[A-Za-z0-9_-]+)$",
                "example": "auto"
              }
            ]
          },
          "length": {
            "description": "The duration the Clip should play for.",
            "oneOf": [
              {
                "type": "number",
                "description": "The duration the Clip should play for, in seconds. For example, to play the Clip for 5 seconds, set the length value to 5.",
                "minimum": 0,
                "example": 5
              },
              {
                "type": "string",
                "description": "The duration the Clip should play for using a [smart clip property](/docs/guide/architecting-an-application/smart-clips/). Set to `auto` to play the Clip for the duration of the asset. Set to `end` to display or play the clip to the end of the timeline. Use `alias://clip-name` to inherit the length from the referenced clip.",
                "pattern": "^(auto|end|alias://[A-Za-z0-9_-]+)$",
                "example": "auto"
              }
            ]
          },
          "fit": {
            "description": "Set how the asset should be scaled to fit the viewport using one of the following options: \n  <ul>\n    <li>`crop` <b>(default)</b> - scale the asset to fill the viewport while maintaining the aspect ratio. The asset will be cropped if it exceeds the bounds of the viewport.</li>\n    <li>`cover` - stretch the asset to fill the viewport without maintaining the aspect ratio.</li>\n    <li>`contain` - fit the entire asset within the viewport while maintaining the original aspect ratio.</li>\n    <li>`none` - preserves the original asset dimensions and does not apply any scaling.</li>\n  </ul>",
            "enum": [
              "cover",
              "contain",
              "crop",
              "none"
            ],
            "type": "string"
          },
          "scale": {
            "description": "Scale the asset to a fraction of the viewport size - i.e. setting the scale to 0.5 will scale asset to half the size of the viewport. This is useful for picture-in-picture video and scaling images such as logos and watermarks. Use a number or an array of [Tween](./#tocs_tween) objects to create a custom animation.",
            "oneOf": [
              {
                "type": "number",
                "description": "Scale the asset to a fraction of the viewport size. For example, 0.5 will scale the asset to half the size of the viewport.",
                "format": "float",
                "example": 0.5
              },
              {
                "type": "array",
                "description": "An array of [Tween](./#tocs_tween) objects used to create a custom animation. Animate the scale of an asset over time.",
                "items": {
                  "$ref": "#/components/schemas/Tween"
                }
              }
            ]
          },
          "width": {
            "description": "Set the width of the clip bounding box in pixels. This constrains the width of the clip, overriding the default behavior where clips fill the viewport width.",
            "type": "number",
            "format": "float",
            "minimum": 1,
            "maximum": 3840,
            "example": 800
          },
          "height": {
            "description": "Set the height of the clip bounding box in pixels. This constrains the height of the clip, overriding the default behavior where clips fill the viewport height.",
            "type": "number",
            "format": "float",
            "minimum": 1,
            "maximum": 2160,
            "example": 600
          },
          "position": {
            "description": "Place the asset in one of nine predefined positions of the viewport. This is most effective for when the asset is scaled and you want to position the element to a specific position. <ul>\n  <li>`top` - top (center)</li>\n  <li>`topRight` - top right</li>\n  <li>`right` - right (center)</li>\n  <li>`bottomRight` - bottom right</li>\n  <li>`bottom` - bottom (center)</li>\n  <li>`bottomLeft` - bottom left</li>\n  <li>`left` - left (center)</li>\n  <li>`topLeft` - top left</li>\n  <li>`center` - center</li>\n</ul>",
            "enum": [
              "top",
              "topRight",
              "right",
              "bottomRight",
              "bottom",
              "bottomLeft",
              "left",
              "topLeft",
              "center"
            ],
            "type": "string"
          },
          "offset": {
            "description": "Offset the location of the asset relative to its position on the viewport. The offset distance is relative to the width of the viewport - for example an x offset of 0.5 will move the asset half the viewport width to the right.",
            "$ref": "#/components/schemas/Offset"
          },
          "transition": {
            "$ref": "#/components/schemas/Transition"
          },
          "effect": {
            "description": "A motion effect to apply to the Clip. <ul>\n  <li>`zoomIn` - slow zoom in</li>\n  <li>`zoomOut` - slow zoom out</li>\n  <li>`slideLeft` - slow slide (pan) left</li>\n  <li>`slideRight` - slow slide (pan) right</li>\n  <li>`slideUp` - slow slide (pan) up</li>\n  <li>`slideDown` - slow slide (pan) down</li>\n</ul> The motion effect speed can also be controlled by appending `Fast` or `Slow` to the effect, e.g. `zoomInFast` or `slideRightSlow`.",
            "enum": [
              "zoomIn",
              "zoomInSlow",
              "zoomInFast",
              "zoomOut",
              "zoomOutSlow",
              "zoomOutFast",
              "slideLeft",
              "slideLeftSlow",
              "slideLeftFast",
              "slideRight",
              "slideRightSlow",
              "slideRightFast",
              "slideUp",
              "slideUpSlow",
              "slideUpFast",
              "slideDown",
              "slideDownSlow",
              "slideDownFast"
            ],
            "type": "string"
          },
          "filter": {
            "description": "A filter effect to apply to the Clip. <ul>\n  <li>`none` - no filter applied</li>\n  <li>`blur` - blur the scene</li>\n  <li>`boost` - boost contrast and saturation</li>\n  <li>`contrast` - increase contrast</li>\n  <li>`darken` - darken the scene</li>\n  <li>`greyscale` - remove colour</li>\n  <li>`lighten` - lighten the scene</li>\n  <li>`muted` - reduce saturation and contrast</li>\n  <li>`negative` - negative colors</li>\n</ul>",
            "enum": [
              "none",
              "blur",
              "boost",
              "contrast",
              "darken",
              "greyscale",
              "lighten",
              "muted",
              "negative"
            ],
            "type": "string",
            "example": "greyscale"
          },
          "opacity": {
            "description": "Offset an asset on the horizontal axis (left or right). Use a number or an array of [Tween](./#tocs_tween) objects to create a custom animation.",
            "oneOf": [
              {
                "type": "number",
                "description": "Sets the opacity of the Clip where 1 is opaque and 0 is transparent.",
                "example": 0.5
              },
              {
                "type": "array",
                "description": "An array of [Tween](./#tocs_tween) objects used to create a custom animation. Animate the opacity of an asset over time.",
                "items": {
                  "$ref": "#/components/schemas/Tween"
                }
              }
            ]
          },
          "transform": {
            "description": "A transformation lets you modify the visual properties of a clip. Available transformations are <b>rotate</b>, <b>skew</b> and <b>flip</b>. Transformations can be combined to create interesting new shapes and effects.",
            "$ref": "#/components/schemas/Transformation"
          },
          "alias": {
            "description": "A unique identifier for this clip that can be used to reference it from other clips using the `alias://` protocol in asset sources. This is useful for features like auto-captioning where a caption asset needs to reference the audio from another clip.",
            "type": "string",
            "pattern": "^[A-Za-z0-9_-]+$",
            "example": "MY_VIDEO_CLIP"
          }
        },
        "additionalProperties": false,
        "required": [
          "asset",
          "start",
          "length"
        ],
        "type": "object"
      },
      "Asset": {
        "type": "object",
        "description": "The type of asset to display for the duration of the Clip, i.e. a video clip or an image. Choose from one of the available asset types below.",
        "discriminator": {
          "propertyName": "type",
          "mapping": {
            "video": "#/components/schemas/VideoAsset",
            "image": "#/components/schemas/ImageAsset",
            "text": "#/components/schemas/TextAsset",
            "rich-text": "#/components/schemas/RichTextAsset",
            "audio": "#/components/schemas/AudioAsset",
            "luma": "#/components/schemas/LumaAsset",
            "caption": "#/components/schemas/CaptionAsset",
            "rich-caption": "#/components/schemas/RichCaptionAsset",
            "html": "#/components/schemas/HtmlAsset",
            "title": "#/components/schemas/TitleAsset",
            "shape": "#/components/schemas/ShapeAsset",
            "svg": "#/components/schemas/SvgAsset",
            "text-to-image": "#/components/schemas/TextToImageAsset",
            "image-to-video": "#/components/schemas/ImageToVideoAsset",
            "text-to-speech": "#/components/schemas/TextToSpeechAsset"
          }
        },
        "oneOf": [
          {
            "$ref": "#/components/schemas/VideoAsset"
          },
          {
            "$ref": "#/components/schemas/ImageAsset"
          },
          {
            "$ref": "#/components/schemas/TextAsset"
          },
          {
            "$ref": "#/components/schemas/RichTextAsset"
          },
          {
            "$ref": "#/components/schemas/AudioAsset"
          },
          {
            "$ref": "#/components/schemas/LumaAsset"
          },
          {
            "$ref": "#/components/schemas/CaptionAsset"
          },
          {
            "$ref": "#/components/schemas/RichCaptionAsset"
          },
          {
            "$ref": "#/components/schemas/HtmlAsset"
          },
          {
            "$ref": "#/components/schemas/TitleAsset"
          },
          {
            "$ref": "#/components/schemas/ShapeAsset"
          },
          {
            "$ref": "#/components/schemas/SvgAsset"
          },
          {
            "$ref": "#/components/schemas/TextToImageAsset"
          },
          {
            "$ref": "#/components/schemas/ImageToVideoAsset"
          },
          {
            "$ref": "#/components/schemas/TextToSpeechAsset"
          }
        ],
        "additionalProperties": false
      },
      "VideoAsset": {
        "description": "The VideoAsset is used to create video sequences from video files. The src must be a publicly accessible URL to a video resource such as an mp4 file.",
        "type": "object",
        "properties": {
          "type": {
            "enum": [
              "video"
            ],
            "default": "video",
            "description": "The type of asset - set to `video` for videos.",
            "type": "string"
          },
          "src": {
            "description": "The video source URL. The URL must be publicly accessible or include credentials.",
            "type": "string",
            "minLength": 1,
            "pattern": "\\S",
            "example": "https://s3-ap-northeast-1.amazonaws.com/my-bucket/video.mp4"
          },
          "transcode": {
            "type": "boolean",
            "description": "Set to `true` to force re-encoding of the video during preprocessing. This can help resolve compatibility issues, fix rotation problems, synchronize audio, or convert formats. The video will be processed to ensure optimal compatibility with the rendering engine.",
            "example": false
          },
          "trim": {
            "description": "The start trim point of the video clip, in seconds (defaults to 0). Videos will start from the in trim point. The video will play until the file ends or the Clip length is reached.",
            "type": "number",
            "example": 2
          },
          "volume": {
            "description": "Set the volume of the video clip. Use a number or an array of [Tween](./#tocs_tween) objects to create custom volume transitions.",
            "oneOf": [
              {
                "type": "number",
                "description": "The volume level for the video clip. Range varies from 0 to 1 where 0 is muted and 1 is full volume (defaults to 1).",
                "format": "float",
                "minimum": 0,
                "maximum": 1,
                "example": 0.5
              },
              {
                "type": "array",
                "description": "An array of [Tween](./#tocs_tween) objects used to create a custom volume effect. Modify the volume of an asset over time.",
                "items": {
                  "$ref": "#/components/schemas/Tween"
                }
              }
            ]
          },
          "volumeEffect": {
            "description": "Preset volume effects to apply to the video asset <ul>\n  <li>`fadeIn` - fade volume in only</li>\n  <li>`fadeOut` - fade volume out only</li>\n  <li>`fadeInFadeOut` - fade volume in and out</li>\n</ul>",
            "enum": [
              "none",
              "fadeIn",
              "fadeOut",
              "fadeInFadeOut"
            ],
            "type": "string"
          },
          "speed": {
            "description": "Adjust the playback speed of the video clip between 0 (paused) and 10 (10x normal speed) where 1 is normal speed (defaults to 1). Adjusting the speed will also adjust the duration of the clip and may require you to  adjust the Clip length. For example, if you set speed to 0.5, the clip will need to be 2x as long to play the entire video (i.e. original length / 0.5). If you set speed to 2, the clip will need to be half as long to play the entire video (i.e. original length / 2).",
            "type": "number",
            "format": "float",
            "minimum": 0,
            "maximum": 10,
            "example": 1
          },
          "crop": {
            "$ref": "#/components/schemas/Crop"
          },
          "chromaKey": {
            "$ref": "#/components/schemas/ChromaKey"
          }
        },
        "additionalProperties": false,
        "required": [
          "type",
          "src"
        ]
      },
      "ImageAsset": {
        "description": "The ImageAsset is used to create video from images to compose an image. The src must be a publicly accessible URL to an image resource such as a jpg or png file.",
        "type": "object",
        "properties": {
          "type": {
            "enum": [
              "image"
            ],
            "default": "image",
            "description": "The type of asset - set to `image` for images.",
            "type": "string"
          },
          "src": {
            "description": "The image source URL. The URL must be publicly accessible or include credentials.",
            "type": "string",
            "minLength": 1,
            "pattern": "\\S",
            "example": "https://s3-ap-northeast-1.amazonaws.com/my-bucket/image.jpg"
          },
          "crop": {
            "$ref": "#/components/schemas/Crop"
          }
        },
        "additionalProperties": false,
        "required": [
          "type",
          "src"
        ]
      },
      "TextAsset": {
        "description": "The TextAsset is used to add text and titles to a video. The text can be styled with built in and custom\n[Fonts](#tocs_font). You can also add a background bounding box used to control wrapping and overflow. Emoticons are also supported.\n",
        "type": "object",
        "properties": {
          "type": {
            "enum": [
              "text"
            ],
            "default": "text",
            "description": "The type of asset - set to `text` for text.",
            "type": "string"
          },
          "text": {
            "description": "The text string to display.",
            "type": "string",
            "example": "Hello World"
          },
          "width": {
            "description": "Set the width of the HTML asset bounding box in pixels. Text will wrap to fill the bounding box.",
            "type": "integer",
            "example": 400
          },
          "height": {
            "description": "Set the width of the HTML asset bounding box in pixels. Text and elements will be masked if they exceed the  height of the bounding box.",
            "type": "integer",
            "example": 200
          },
          "font": {
            "description": "Font styling properties.",
            "$ref": "#/components/schemas/TextFont"
          },
          "background": {
            "description": "Background styling properties.",
            "$ref": "#/components/schemas/TextBackground"
          },
          "alignment": {
            "description": "Alignment properties.",
            "$ref": "#/components/schemas/TextAlignment"
          },
          "stroke": {
            "description": "Text stroke (outline) properties.",
            "properties": {
              "width": {
                "description": "The width of the stroke in pixels.",
                "type": "number",
                "minimum": 0,
                "maximum": 10,
                "example": 2
              },
              "color": {
                "description": "The stroke color using hexadecimal color notation.",
                "type": "string",
                "pattern": "^#[A-Fa-f0-9]{6}$",
                "example": "#000000"
              }
            },
            "additionalProperties": false,
            "type": "object"
          },
          "animation": {
            "description": "Animation properties for text entrance effects.",
            "properties": {
              "preset": {
                "description": "The animation preset to apply. <ul>\n  <li>`typewriter` - typewriter effect where characters appear one at a time</li>\n</ul>",
                "type": "string",
                "enum": [
                  "typewriter"
                ],
                "example": "typewriter"
              },
              "duration": {
                "description": "The duration of the animation in seconds.",
                "type": "number",
                "minimum": 0.1,
                "maximum": 30,
                "example": 2
              }
            },
            "additionalProperties": false,
            "required": [
              "preset"
            ],
            "type": "object"
          },
          "ellipsis": {
            "description": "The string to display when text overflows its bounding box. Set to an ellipsis character or custom string to indicate truncated text.",
            "type": "string",
            "example": "..."
          }
        },
        "additionalProperties": false,
        "required": [
          "type",
          "text"
        ]
      },
      "RichTextAsset": {
        "description": "The RichTextAsset provides advanced text rendering with support for custom fonts, gradients, shadows, strokes,\nanimations, and styling options. It offers more flexibility and visual effects than the basic TextAsset.\n",
        "type": "object",
        "properties": {
          "type": {
            "enum": [
              "rich-text"
            ],
            "default": "rich-text",
            "description": "The type of asset - set to `rich-text` for rich text.",
            "type": "string"
          },
          "text": {
            "description": "The text string to display. Maximum 5000 characters.",
            "type": "string",
            "maxLength": 5000,
            "example": "Hello World"
          },
          "font": {
            "description": "Font styling properties.",
            "$ref": "#/components/schemas/RichTextFont"
          },
          "style": {
            "description": "Text style properties including spacing, line height, and transformations.",
            "$ref": "#/components/schemas/RichTextStyle"
          },
          "stroke": {
            "description": "Text stroke (outline) properties.",
            "$ref": "#/components/schemas/RichTextStroke"
          },
          "shadow": {
            "description": "Text shadow properties.",
            "$ref": "#/components/schemas/RichTextShadow"
          },
          "background": {
            "description": "Background styling properties for the text bounding box.",
            "$ref": "#/components/schemas/RichTextBackground"
          },
          "border": {
            "description": "Border styling properties for the text bounding box.",
            "properties": {
              "width": {
                "description": "The width of the border in pixels. Must be 0 or greater.",
                "type": "number",
                "minimum": 0,
                "default": 0,
                "example": 2
              },
              "color": {
                "description": "The border color using hexadecimal color notation.",
                "type": "string",
                "pattern": "^#[A-Fa-f0-9]{6}$",
                "default": "#000000",
                "example": "#ff0000"
              },
              "opacity": {
                "description": "The opacity of the border where 1 is opaque and 0 is transparent.",
                "type": "number",
                "minimum": 0,
                "maximum": 1,
                "default": 1,
                "example": 0.8
              },
              "radius": {
                "description": "The border radius in pixels for rounded corners. Must be 0 or greater.",
                "type": "number",
                "minimum": 0,
                "default": 0,
                "example": 10
              }
            },
            "additionalProperties": false,
            "type": "object"
          },
          "padding": {
            "description": "Padding inside the text bounding box. Can be a single number (applied to all sides) or an object with individual sides.",
            "oneOf": [
              {
                "type": "number",
                "minimum": 0,
                "description": "Padding in pixels applied to all sides.",
                "example": 10
              },
              {
                "description": "Padding properties for individual sides of the text bounding box.",
                "properties": {
                  "top": {
                    "description": "Top padding in pixels.",
                    "type": "number",
                    "minimum": 0,
                    "default": 0,
                    "example": 10
                  },
                  "right": {
                    "description": "Right padding in pixels.",
                    "type": "number",
                    "minimum": 0,
                    "default": 0,
                    "example": 10
                  },
                  "bottom": {
                    "description": "Bottom padding in pixels.",
                    "type": "number",
                    "minimum": 0,
                    "default": 0,
                    "example": 10
                  },
                  "left": {
                    "description": "Left padding in pixels.",
                    "type": "number",
                    "minimum": 0,
                    "default": 0,
                    "example": 10
                  }
                },
                "additionalProperties": false,
                "type": "object"
              }
            ]
          },
          "align": {
            "description": "Text alignment properties (horizontal and vertical).",
            "$ref": "#/components/schemas/RichTextAlignment"
          },
          "animation": {
            "description": "Animation properties for text entrance effects.",
            "$ref": "#/components/schemas/RichTextAnimation"
          }
        },
        "additionalProperties": false,
        "required": [
          "type",
          "text"
        ]
      },
      "AudioAsset": {
        "description": "The AudioAsset is used to add sound effects and audio at specific intervals on the timeline. The src must be a publicly accessible URL to an audio resource such  as an mp3 file.",
        "type": "object",
        "properties": {
          "type": {
            "enum": [
              "audio"
            ],
            "default": "audio",
            "description": "The type of asset - set to `audio` for audio assets.",
            "type": "string"
          },
          "src": {
            "description": "The audio source URL. The URL must be publicly accessible or include credentials.",
            "type": "string",
            "minLength": 1,
            "pattern": "\\S",
            "example": "https://s3-ap-northeast-1.amazonaws.com/my-bucket/sound.mp3"
          },
          "trim": {
            "description": "The start trim point of the audio clip, in seconds (defaults to 0). Audio will start from the in trim point. The audio will play until the file ends or the Clip length is reached.",
            "type": "number"
          },
          "volume": {
            "description": "Set the volume of the audio clip. Use a number or an array of [Tween](./#tocs_tween) objects to create custom volume transitions.",
            "oneOf": [
              {
                "type": "number",
                "description": "The volume level for the audio clip. Range varies from 0 to 1 where 0 is muted and 1 is full volume (defaults to 1).",
                "format": "float",
                "minimum": 0,
                "maximum": 1,
                "example": 0.5
              },
              {
                "type": "array",
                "description": "An array of [Tween](./#tocs_tween) objects used to create a custom volume effect. Modify the volume of an asset over time.",
                "items": {
                  "$ref": "#/components/schemas/Tween"
                }
              }
            ]
          },
          "speed": {
            "description": "Adjust the playback speed of the audio clip between 0 (paused) and 10 (10x normal speed), where 1 is normal speed (defaults to 1). Adjusting the speed will also adjust the duration of the clip and may require you to  adjust the Clip length. For example, if you set speed to 0.5, the clip will need to be 2x as long to play the entire audio (i.e. original length / 0.5). If you set speed to 2, the clip will need to be half as long to play the entire audio (i.e. original length / 2).",
            "type": "number",
            "format": "float",
            "minimum": 0,
            "maximum": 10,
            "example": 1
          },
          "effect": {
            "description": "The effect to apply to the audio asset <ul>\n  <li>`fadeIn` - fade volume in only</li>\n  <li>`fadeOut` - fade volume out only</li>\n  <li>`fadeInFadeOut` - fade volume in and out</li>\n</ul>",
            "enum": [
              "none",
              "fadeIn",
              "fadeOut",
              "fadeInFadeOut"
            ],
            "type": "string"
          }
        },
        "additionalProperties": false,
        "required": [
          "type",
          "src"
        ]
      },
      "ShapeAsset": {
        "description": "The ShapeAsset is used to add shapes to a video. The shape can be styled with a fill and a stroke.\nYou can manipulate properties such as rotation to create dynamic effects like a diamond shape or stripes.\n",
        "type": "object",
        "properties": {
          "type": {
            "enum": [
              "shape"
            ],
            "default": "shape",
            "description": "The type of asset - set to `shape` for shape.",
            "type": "string"
          },
          "shape": {
            "description": "The shape to display.",
            "type": "string",
            "enum": [
              "rectangle",
              "circle",
              "line"
            ]
          },
          "width": {
            "description": "Sets the width of the bounding box in pixels. This value should be larger than the shape's width. If omitted, the entire viewport width and height will be used.",
            "type": "integer",
            "example": 800
          },
          "height": {
            "description": "Sets the height of the bounding box in pixels. This value should be larger than the shape's height. If omitted, the entire viewport width and height will be used.",
            "type": "integer",
            "example": 800
          },
          "fill": {
            "description": "Specifies the fill style of the shape.",
            "type": "object",
            "properties": {
              "color": {
                "description": "The color of the fill using hexadecimal color notation.",
                "type": "string",
                "example": "#ffffff"
              },
              "opacity": {
                "description": "The opacity of the fill where 1 is opaque and 0 is transparent.",
                "type": "number",
                "example": 1
              }
            },
            "additionalProperties": false
          },
          "stroke": {
            "description": "Specifies the stroke style of the shape.",
            "type": "object",
            "properties": {
              "color": {
                "description": "The stroke color of the font using hexadecimal color notation.",
                "type": "string",
                "example": "#000000"
              },
              "width": {
                "description": "The width of the stroke in pixels.",
                "type": "number",
                "example": 0.8
              }
            },
            "additionalProperties": false
          },
          "rectangle": {
            "description": "Configuration settings for the rectangle shape. Required when `shape` is set to `rectangle`.",
            "type": "object",
            "properties": {
              "width": {
                "description": "Set the width of the rectangle shape in pixels.",
                "type": "integer",
                "example": 800
              },
              "height": {
                "description": "Set the height of the rectangle shape in pixels.",
                "type": "integer",
                "example": 800
              },
              "cornerRadius": {
                "description": "Set the corner radius of the rectangle shape.",
                "type": "integer",
                "example": 20
              }
            },
            "additionalProperties": false,
            "required": [
              "width",
              "height"
            ]
          },
          "circle": {
            "description": "Configuration settings for the circle shape. Required when `shape` is set to `circle`.",
            "type": "object",
            "properties": {
              "radius": {
                "description": "Set the radius of the circle shape in pixels.",
                "type": "integer",
                "example": 800
              }
            },
            "additionalProperties": false,
            "required": [
              "radius"
            ]
          },
          "line": {
            "description": "Configuration settings for the line shape. Required when `shape` is set to `line`.",
            "type": "object",
            "properties": {
              "length": {
                "description": "Set the length of the line shape in pixels.",
                "type": "integer",
                "example": 100
              },
              "thickness": {
                "description": "Set the thickness of the line in pixels.",
                "type": "integer",
                "example": 4
              }
            },
            "additionalProperties": false,
            "required": [
              "length",
              "thickness"
            ]
          }
        },
        "additionalProperties": false,
        "required": [
          "type",
          "shape"
        ]
      },
      "LumaAsset": {
        "description": "The LumaAsset is used to create luma matte masks, transitions and effects between other assets. A luma matte is a grey scale image or animated video where the black areas are transparent and the white areas solid. The luma matte animation should be provided as an mp4 video file. The src must be a publicly accessible URL to the file.",
        "type": "object",
        "properties": {
          "type": {
            "enum": [
              "luma"
            ],
            "default": "luma",
            "description": "The type of asset - set to `luma` for luma mattes.",
            "type": "string"
          },
          "src": {
            "description": "The luma matte source URL. The URL must be publicly accessible or include credentials.",
            "type": "string",
            "minLength": 1,
            "pattern": "\\S",
            "example": "https://s3-ap-northeast-1.amazonaws.com/my-bucket/mask.mp4"
          },
          "trim": {
            "description": "The start trim point of the luma matte clip, in seconds (defaults to 0). Videos will start from the in trim point. A luma matte video will play until the file ends or the Clip length is reached.",
            "type": "number"
          }
        },
        "additionalProperties": false,
        "required": [
          "type",
          "src"
        ]
      },
      "CaptionAsset": {
        "description": "The CaptionAsset is used to add captions (subtitles) to a video. It uses a supplied SRT or VTT file which will\nbe read and burnt to the video.\n\nCaptions can be applied independently from a video or audio file for greater\nflexibility with styling and layout. For example you can scale, position or crop a video without modifying the\ncaptions.\n\nTo sync captions with a video or audio file use a [Video](#tocs_videoasset) or [Audio](#tocs_audioasset) with\nmatching start and end time.\n",
        "type": "object",
        "properties": {
          "type": {
            "enum": [
              "caption"
            ],
            "default": "caption",
            "description": "The type of asset - set to `caption` for captions.",
            "type": "string"
          },
          "src": {
            "description": "The URL to an SRT or VTT subtitles file, or an alias reference to auto-generate captions from an audio or video clip. For file URLs, the URL must be publicly accessible or include credentials. For auto-captioning, use the format `alias://clip-name` where clip-name is the alias of an audio, video, or text-to-speech clip. The system will automatically transcribe the audio and detect the language.",
            "type": "string",
            "minLength": 1,
            "pattern": "\\S",
            "example": "https://s3-ap-northeast-1.amazonaws.com/my-bucket/captions.srt"
          },
          "font": {
            "description": "Font styling properties.",
            "$ref": "#/components/schemas/CaptionFont"
          },
          "background": {
            "description": "Background styling properties.",
            "$ref": "#/components/schemas/CaptionBackground"
          },
          "margin": {
            "description": "Margin properties.",
            "$ref": "#/components/schemas/CaptionMargin"
          },
          "trim": {
            "description": "The start trim point of the captions, in seconds (defaults to 0). Remove the trim length from the start of the captions and allow it to be synced with video or audio. The captions will play until the file ends or the Clip length is reached.",
            "type": "number",
            "example": 2
          },
          "speed": {
            "description": "Adjust the playback speed of the captions between 0 (paused) and 10 (10x normal speed) where 1 is normal speed (defaults to 1). Adjusting the speed will also adjust the duration of the clip and may require you to  adjust the Clip length. For example, if you set speed to 0.5, the clip will need to be 2x as long to play the entire captions (i.e. original length / 0.5). If you set speed to 2, the clip will need to be half as long to play the entire captions (i.e. original length / 2).",
            "type": "number",
            "format": "float",
            "minimum": 0,
            "maximum": 10,
            "example": 1
          }
        },
        "additionalProperties": false,
        "required": [
          "type",
          "src"
        ]
      },
      "RichCaptionAsset": {
        "description": "The RichCaptionAsset provides word-level caption animations with rich-text styling. It supports\nkaraoke-style highlighting, word-by-word animations, and advanced typography. Captions can be\nsourced from SRT/VTT/TTML subtitle files, from audio/video media URLs (auto-transcribed), or\nfrom alias references to other clips in the same timeline.\n",
        "type": "object",
        "properties": {
          "type": {
            "enum": [
              "rich-caption"
            ],
            "default": "rich-caption",
            "description": "The type of asset - set to `rich-caption` for rich captions.",
            "type": "string"
          },
          "src": {
            "description": "Source for the caption words. Accepts three formats: (1) the URL to a subtitle file (`.srt`, `.vtt`, `.ttml`, or `.dfxp`) which is parsed directly; (2) the URL to an audio or video media file (`.mp4`, `.mov`, `.webm`, `.mp3`, `.wav`, `.m4a`, `.flac`, `.aac`, `.ogg`, and related formats) which is auto-transcribed; (3) an alias reference in the form `alias://clip-name` where `clip-name` is the alias of another audio, video, or text-to-speech clip in the same timeline — the referenced clip's source is auto-transcribed. For file URLs, the URL must be publicly accessible or include credentials. Content is classified at runtime and unsupported content types (HTML, PDF, images, archives) are rejected with a structured error.",
            "type": "string",
            "minLength": 1,
            "example": "alias://audio"
          },
          "font": {
            "description": "Font styling properties for inactive words.",
            "properties": {
              "family": {
                "description": "The font family name. This must be the Family name embedded in the font, i.e. \"Roboto\".",
                "type": "string",
                "example": "Roboto",
                "default": "Roboto"
              },
              "size": {
                "description": "The size of the font in pixels (px). Must be between 1 and 500.",
                "type": "integer",
                "minimum": 1,
                "maximum": 500,
                "default": 24,
                "example": 48
              },
              "weight": {
                "description": "The weight of the font. Can be a number (100-900) or a string ('normal', 'bold', etc.). 100 is lightest, 900 is heaviest (boldest).",
                "default": "400"
              },
              "color": {
                "description": "The text color using hexadecimal color notation.",
                "type": "string",
                "pattern": "^#[A-Fa-f0-9]{6}$",
                "default": "#ffffff",
                "example": "#ffffff"
              },
              "opacity": {
                "description": "The opacity of the text where 1 is opaque and 0 is transparent.",
                "type": "number",
                "minimum": 0,
                "maximum": 1,
                "default": 1,
                "example": 0.9
              },
              "background": {
                "description": "The background color behind the text using hexadecimal color notation.",
                "type": "string",
                "pattern": "^#[A-Fa-f0-9]{6}$",
                "example": "#000000"
              }
            },
            "additionalProperties": false,
            "type": "object"
          },
          "style": {
            "description": "Text style properties including spacing, line height, and transformations.",
            "properties": {
              "letterSpacing": {
                "description": "Additional spacing between letters in pixels. Can be negative for tighter spacing.",
                "type": "number",
                "default": 0,
                "example": 2
              },
              "lineHeight": {
                "description": "The line height as a multiplier of the font size. Must be between 0 and 10.",
                "type": "number",
                "minimum": 0,
                "maximum": 10,
                "default": 1.2,
                "example": 1.5
              },
              "textTransform": {
                "description": "Text transformation to apply.",
                "type": "string",
                "enum": [
                  "none",
                  "uppercase",
                  "lowercase",
                  "capitalize"
                ],
                "default": "none",
                "example": "uppercase"
              },
              "size": {
                "description": "The font size in pixels. Can be used as an alternative to font.size.",
                "type": "number",
                "minimum": 1,
                "maximum": 500,
                "example": 120
              },
              "textDecoration": {
                "description": "Text decoration to apply.",
                "type": "string",
                "enum": [
                  "none",
                  "underline",
                  "line-through"
                ],
                "default": "none",
                "example": "underline"
              },
              "gradient": {
                "description": "Gradient fill for text instead of solid color.",
                "$ref": "#/components/schemas/RichTextGradient"
              }
            },
            "additionalProperties": false,
            "type": "object"
          },
          "stroke": {
            "description": "Text stroke (outline) properties for inactive words.",
            "$ref": "#/components/schemas/RichTextStroke"
          },
          "shadow": {
            "description": "Text shadow properties.",
            "$ref": "#/components/schemas/RichTextShadow"
          },
          "background": {
            "description": "Background styling properties for the caption bounding box.",
            "$ref": "#/components/schemas/RichTextBackground"
          },
          "border": {
            "description": "Border styling properties for the caption bounding box.",
            "$ref": "#/components/schemas/RichTextAsset/properties/border"
          },
          "padding": {
            "description": "Padding inside the caption bounding box. Can be a single number (applied to all sides) or an object with individual sides.",
            "oneOf": [
              {
                "type": "number",
                "minimum": 0,
                "description": "Padding in pixels applied to all sides.",
                "example": 10
              },
              {
                "$ref": "#/components/schemas/RichTextAsset/properties/padding/oneOf/1"
              }
            ]
          },
          "align": {
            "description": "Text alignment properties (horizontal and vertical).",
            "$ref": "#/components/schemas/RichTextAlignment"
          },
          "active": {
            "description": "Styling properties for the active/highlighted word. These override the base styling when a word is being spoken.",
            "$ref": "#/components/schemas/RichCaptionActive"
          },
          "animation": {
            "description": "Word-level animation properties controlling how words are highlighted or revealed.",
            "$ref": "#/components/schemas/RichCaptionAnimation"
          }
        },
        "additionalProperties": false,
        "required": [
          "type",
          "src"
        ]
      },
      "RichCaptionActiveFont": {
        "description": "Font properties for the active/highlighted word.",
        "type": "object",
        "properties": {
          "family": {
            "description": "The font family for the active word. Inherits from the base font.family when not set.",
            "type": "string",
            "example": "Roboto"
          },
          "weight": {
            "description": "The weight of the font for the active word. Can be a number (100-900) or a string. Inherits from the base font.weight when not set.\n",
            "default": "400"
          },
          "color": {
            "description": "The active word color using hexadecimal color notation.",
            "type": "string",
            "pattern": "^#[A-Fa-f0-9]{6}$",
            "example": "#C96741"
          },
          "background": {
            "description": "The background color behind the active word using hexadecimal color notation.",
            "type": "string",
            "pattern": "^#[A-Fa-f0-9]{6}$",
            "example": "#000000"
          },
          "opacity": {
            "description": "The opacity of the active word where 1 is opaque and 0 is transparent.",
            "type": "number",
            "minimum": 0,
            "maximum": 1,
            "default": 1,
            "example": 1
          },
          "size": {
            "description": "The font size of the active word in pixels.",
            "type": "number",
            "minimum": 1,
            "maximum": 500,
            "example": 120
          },
          "textDecoration": {
            "description": "Text decoration to apply to the active word.",
            "type": "string",
            "enum": [
              "none",
              "underline",
              "line-through"
            ],
            "default": "none",
            "example": "underline"
          }
        },
        "additionalProperties": false
      },
      "RichCaptionActive": {
        "description": "Styling properties for the active/highlighted word.",
        "type": "object",
        "properties": {
          "font": {
            "description": "Font properties for the active word.",
            "$ref": "#/components/schemas/RichCaptionActiveFont"
          },
          "stroke": {
            "description": "Stroke properties for the active word. Set to \"none\" to explicitly remove the base stroke on the active word.",
            "oneOf": [
              {
                "$ref": "#/components/schemas/RichTextStroke"
              },
              {
                "type": "string",
                "enum": [
                  "none"
                ]
              }
            ]
          },
          "shadow": {
            "description": "Shadow properties for the active word. Set to \"none\" to explicitly remove the base shadow on the active word.",
            "oneOf": [
              {
                "$ref": "#/components/schemas/RichTextShadow"
              },
              {
                "type": "string",
                "enum": [
                  "none"
                ]
              }
            ]
          }
        },
        "additionalProperties": false
      },
      "RichCaptionAnimation": {
        "description": "Word-level animation properties for caption effects.",
        "type": "object",
        "properties": {
          "style": {
            "description": "The animation style to apply to words: <ul>\n  <li>`karaoke` - Word-by-word color fill as spoken (shows all words, highlights active)</li>\n  <li>`highlight` - Word changes to active color when spoken (shows all words)</li>\n  <li>`pop` - Each word scales up when active</li>\n  <li>`fade` - Gradual opacity transition per word</li>\n  <li>`slide` - Words slide in from a direction</li>\n  <li>`bounce` - Spring animation on word appearance</li>\n  <li>`typewriter` - Words appear one by one and stay visible</li>\n  <li>`none` - No animation, all words visible immediately</li>\n</ul>",
            "type": "string",
            "enum": [
              "karaoke",
              "highlight",
              "pop",
              "fade",
              "slide",
              "bounce",
              "typewriter",
              "none"
            ],
            "default": "highlight",
            "example": "highlight"
          },
          "direction": {
            "description": "Direction for directional animations (slide). Only applicable when style is `slide`.",
            "type": "string",
            "enum": [
              "left",
              "right",
              "up",
              "down"
            ],
            "default": "up",
            "example": "up"
          }
        },
        "additionalProperties": false,
        "required": [
          "style"
        ]
      },
      "TextToImageAsset": {
        "description": "The TextToImageAsset lets you create a dynamic image from a text prompt.",
        "properties": {
          "type": {
            "type": "string",
            "description": "The type of asset to generate - set to `text-to-image` for text-to-image.",
            "enum": [
              "text-to-image"
            ],
            "default": "text-to-image"
          },
          "prompt": {
            "type": "string",
            "description": "The text prompt to generate an image from.",
            "example": "A serene landscape featuring a crystal-clear mountain lake at sunrise. The water reflects the pink and orange sky like a mirror. In the foreground, a majestic pine tree stands tall, its branches framing the view. Snow-capped peaks rise in the distance, their edges softened by a light morning mist. A pair of deer drink from the lake's edge, creating gentle ripples on the otherwise still surface."
          },
          "width": {
            "type": "integer",
            "description": "The width of the image in pixels.",
            "example": 512
          },
          "height": {
            "type": "integer",
            "description": "The height of the image in pixels.",
            "example": 512
          },
          "crop": {
            "$ref": "#/components/schemas/Crop"
          }
        },
        "additionalProperties": false,
        "type": "object",
        "required": [
          "type",
          "prompt"
        ]
      },
      "ImageToVideoAsset": {
        "description": "The ImageToVideoAsset lets you create a video from an image and a text prompt.",
        "properties": {
          "type": {
            "type": "string",
            "description": "The type of asset to generate - set to `image-to-video` for image-to-video.",
            "enum": [
              "image-to-video"
            ],
            "default": "image-to-video"
          },
          "src": {
            "description": "The image source URL. The URL must be publicly accessible or include credentials.",
            "type": "string",
            "minLength": 1,
            "example": "https://s3-ap-northeast-1.amazonaws.com/my-bucket/image.jpg"
          },
          "prompt": {
            "type": "string",
            "description": "The instructions for modifying the image into a video sequence.",
            "example": "Slowly zoom out and orbit left around the object."
          },
          "aspectRatio": {
            "description": "The aspect ratio (shape) of the video output.",
            "enum": [
              "1:1",
              "4:3",
              "16:9",
              "9:16",
              "3:4",
              "21:9",
              "9:21"
            ],
            "type": "string",
            "example": "16:9"
          },
          "speed": {
            "description": "Adjust the playback speed of the video clip between 0 (paused) and 10 (10x normal speed) where 1 is normal speed (defaults to 1). Adjusting the speed will also adjust the duration of the clip and may require you to  adjust the Clip length. For example, if you set speed to 0.5, the clip will need to be 2x as long to play the entire video (i.e. original length / 0.5). If you set speed to 2, the clip will need to be half as long to play the entire video (i.e. original length / 2).",
            "type": "number",
            "format": "float",
            "minimum": 0,
            "maximum": 10,
            "example": 1
          },
          "crop": {
            "$ref": "#/components/schemas/Crop"
          }
        },
        "additionalProperties": false,
        "type": "object",
        "required": [
          "type",
          "src"
        ]
      },
      "TextToSpeechAsset": {
        "description": "The TextToSpeechAsset lets you generate a voice over from text using a text-to-speech service. The generated audio can be trimmed, faded and have its volume and speed adjusted using the same properties available on the AudioAsset.",
        "type": "object",
        "properties": {
          "type": {
            "type": "string",
            "description": "The type of asset - set to `text-to-speech` for text-to-speech.",
            "enum": [
              "text-to-speech"
            ],
            "default": "text-to-speech"
          },
          "text": {
            "type": "string",
            "description": "The text to convert to speech.",
            "example": "This is a text to speech example generated by Shotstack"
          },
          "voice": {
            "type": "string",
            "description": "The voice to use for the text-to-speech conversion.",
            "example": "Matthew"
          },
          "language": {
            "type": "string",
            "description": "The language code for the text-to-speech conversion.",
            "example": "en-US"
          },
          "newscaster": {
            "type": "boolean",
            "description": "Set the voice to newscaster mode.",
            "default": false
          },
          "trim": {
            "description": "The start trim point of the audio clip, in seconds (defaults to 0). Audio will start from the trim point. The audio will play until the file ends or the Clip length is reached.",
            "type": "number"
          },
          "volume": {
            "description": "Set the volume of the audio clip. Use a number or an array of [Tween](./#tocs_tween) objects to create custom volume transitions.",
            "oneOf": [
              {
                "type": "number",
                "description": "The volume level for the audio clip. Range varies from 0 to 1 where 0 is muted and 1 is full volume (defaults to 1).",
                "format": "float",
                "minimum": 0,
                "maximum": 1,
                "example": 0.5
              },
              {
                "type": "array",
                "description": "An array of [Tween](./#tocs_tween) objects used to create a custom volume effect. Modify the volume of an asset over time.",
                "items": {
                  "$ref": "#/components/schemas/Tween"
                }
              }
            ]
          },
          "speed": {
            "description": "Adjust the playback speed of the audio clip between 0 (paused) and 10 (10x normal speed), where 1 is normal speed (defaults to 1). Adjusting the speed will also adjust the duration of the clip and may require you to adjust the Clip length.",
            "type": "number",
            "format": "float",
            "minimum": 0,
            "maximum": 10,
            "example": 1
          },
          "effect": {
            "description": "The effect to apply to the audio asset <ul>\n  <li>`fadeIn` - fade volume in only</li>\n  <li>`fadeOut` - fade volume out only</li>\n  <li>`fadeInFadeOut` - fade volume in and out</li>\n</ul>",
            "enum": [
              "none",
              "fadeIn",
              "fadeOut",
              "fadeInFadeOut"
            ],
            "type": "string"
          }
        },
        "additionalProperties": false,
        "required": [
          "type",
          "text",
          "voice"
        ]
      },
      "HtmlAsset": {
        "deprecated": true,
        "description": "**Notice: The HtmlAsset is deprecated, use the [TextAsset](#tocs_textasset) instead.**\n\nThe HtmlAsset clip type lets you create text based layout and formatting using\nHTML and CSS. You can also set the height and width of a bounding box for the HTML\ncontent to sit within. Text and elements will wrap within the bounding box.\n",
        "type": "object",
        "properties": {
          "type": {
            "enum": [
              "html"
            ],
            "default": "html",
            "description": "The type of asset - set to `html` for HTML.",
            "type": "string"
          },
          "html": {
            "description": "The HTML text string. See list of [supported HTML tags](https://shotstack.io/docs/guide/architecting-an-application/html-support/#supported-html-tags).",
            "type": "string",
            "example": "<p>Hello <b>World</b></p>"
          },
          "css": {
            "description": "The CSS text string to apply styling to the HTML. See list of  [support CSS properties](https://shotstack.io/docs/guide/architecting-an-application/html-support/#supported-css-properties).",
            "type": "string",
            "example": "p { color: #ffffff; } b { color: #ffff00; }"
          },
          "width": {
            "description": "Set the width of the HTML asset bounding box in pixels. Text will wrap to fill the bounding box.",
            "type": "integer",
            "example": 400
          },
          "height": {
            "description": "Set the width of the HTML asset bounding box in pixels. Text and elements will be masked if they exceed the  height of the bounding box.",
            "type": "integer",
            "example": 200
          },
          "background": {
            "description": "Apply a background color behind the HTML bounding box using. Set the text color using hexadecimal  color notation. Transparency is supported by setting the first two characters of the hex string  (opposite to HTML), i.e. #80ffffff will be white with 50% transparency.",
            "type": "string"
          },
          "position": {
            "description": "Place the HTML in one of nine predefined positions within the HTML area. <ul>\n  <li>`top` - top (center)</li>\n  <li>`topRight` - top right</li>\n  <li>`right` - right (center)</li>\n  <li>`bottomRight` - bottom right</li>\n  <li>`bottom` - bottom (center)</li>\n  <li>`bottomLeft` - bottom left</li>\n  <li>`left` - left (center)</li>\n  <li>`topLeft` - top left</li>\n  <li>`center` - center</li>\n</ul>",
            "enum": [
              "top",
              "topRight",
              "right",
              "bottomRight",
              "bottom",
              "bottomLeft",
              "left",
              "topLeft",
              "center"
            ],
            "type": "string"
          }
        },
        "additionalProperties": false,
        "required": [
          "type",
          "html"
        ]
      },
      "TitleAsset": {
        "deprecated": true,
        "description": "**Notice: The TitleAsset is deprecated, use the [TextAsset](#tocs_textasset) instead.**\n\nThe TitleAsset clip type lets you create video titles from a text string and apply styling and positioning.\n",
        "type": "object",
        "properties": {
          "type": {
            "enum": [
              "title"
            ],
            "default": "title",
            "description": "The type of asset - set to `title` for titles.",
            "type": "string"
          },
          "text": {
            "description": "The title text string - i.e. \"My Title\".",
            "type": "string",
            "example": "Hello World"
          },
          "style": {
            "description": "Uses a preset to apply font properties and styling to the title. <ul>\n  <li>`minimal`</li>\n  <li>`blockbuster`</li>\n  <li>`vogue`</li>\n  <li>`sketchy`</li>\n  <li>`skinny`</li>\n  <li>`chunk`</li>\n  <li>`chunkLight`</li>\n  <li>`marker`</li>\n  <li>`future`</li>\n  <li>`subtitle`</li>\n</ul>",
            "enum": [
              "minimal",
              "blockbuster",
              "vogue",
              "sketchy",
              "skinny",
              "chunk",
              "chunkLight",
              "marker",
              "future",
              "subtitle"
            ],
            "type": "string"
          },
          "color": {
            "description": "Set the text color using hexadecimal color notation. Transparency is supported by setting the first two characters of the hex string (opposite to HTML),  i.e. #80ffffff will be white with  50% transparency.",
            "type": "string"
          },
          "size": {
            "description": "Set the relative size of the text using predefined sizes from xx-small to xx-large. <ul>\n  <li>`xx-small`</li>\n  <li>`x-small`</li>\n  <li>`small`</li>\n  <li>`medium`</li>\n  <li>`large`</li>\n  <li>`x-large`</li>\n  <li>`xx-large`</li>\n</ul>",
            "enum": [
              "xx-small",
              "x-small",
              "small",
              "medium",
              "large",
              "x-large",
              "xx-large"
            ],
            "type": "string"
          },
          "background": {
            "description": "Apply a background color behind the text. Set the text color using hexadecimal color notation. Transparency is supported by setting the first two characters of the hex string (opposite to HTML),  i.e. #80ffffff will be white with 50% transparency. Omit to use transparent background.",
            "type": "string",
            "example": "#000000"
          },
          "position": {
            "description": "Place the title in one of nine predefined positions of the viewport. <ul>\n  <li>`top` - top (center)</li>\n  <li>`topRight` - top right</li>\n  <li>`right` - right (center)</li>\n  <li>`bottomRight` - bottom right</li>\n  <li>`bottom` - bottom (center)</li>\n  <li>`bottomLeft` - bottom left</li>\n  <li>`left` - left (center)</li>\n  <li>`topLeft` - top left</li>\n  <li>`center` - center</li>\n</ul>",
            "enum": [
              "top",
              "topRight",
              "right",
              "bottomRight",
              "bottom",
              "bottomLeft",
              "left",
              "topLeft",
              "center"
            ],
            "type": "string"
          },
          "offset": {
            "description": "Offset the location of the title relative to its position on the screen.",
            "$ref": "#/components/schemas/Offset"
          }
        },
        "additionalProperties": false,
        "required": [
          "type",
          "text"
        ]
      },
      "SvgAsset": {
        "description": "The SvgAsset is used to add scalable vector graphics (SVG) to a video using raw SVG markup.\n\n**Supported elements:** `<path>`, `<rect>`, `<circle>`, `<ellipse>`,\n`<line>`, `<polygon>`, `<polyline>`\n\n**Automatically extracted from SVG markup:**\n- Path data (converted to a single combined path)\n- Fill color (from `fill` attribute or `style`)\n- Stroke color and width (from attributes or `style`)\n- Dimensions (from `width`/`height` or `viewBox`)\n- Opacity (from `opacity` attribute)\n\nSee [W3C SVG 2 Specification](https://www.w3.org/TR/SVG2/) for path data syntax.\n",
        "type": "object",
        "properties": {
          "type": {
            "description": "The asset type - set to `svg` for SVG assets.",
            "type": "string",
            "enum": [
              "svg"
            ],
            "default": "svg",
            "example": "svg"
          },
          "src": {
            "description": "Raw SVG markup string. The SVG must contain valid SVG elements. The shape,\nfill, stroke, dimensions and opacity are automatically extracted from the\nSVG content.\n",
            "type": "string",
            "minLength": 1,
            "maxLength": 500000,
            "example": "<svg width=\"100\" height=\"100\"><circle cx=\"50\" cy=\"50\" r=\"40\" fill=\"#3498db\"/></svg>"
          }
        },
        "additionalProperties": false,
        "required": [
          "type",
          "src"
        ],
        "example": {
          "type": "svg",
          "src": "<svg width=\"100\" height=\"100\"><circle cx=\"50\" cy=\"50\" r=\"40\" fill=\"#3498db\"/></svg>"
        }
      },
      "Transition": {
        "description": "In and out transitions for a clip - i.e. fade in and fade out",
        "properties": {
          "in": {
            "description": "The transition in. Available transitions are:\n  <ul>\n    <li>`fade` - fade in</li>\n    <li>`reveal` - reveal from left to right</li>\n    <li>`wipeLeft` - fade across screen to the left</li>\n    <li>`wipeRight` - fade across screen to the right</li>\n    <li>`slideLeft` - move slightly left and fade in</li>\n    <li>`slideRight` - move slightly right and fade in</li>\n    <li>`slideUp` - move slightly up and fade in</li>\n    <li>`slideDown` - move slightly down and fade in</li>\n    <li>`carouselLeft` - slide in from right to left</li>\n    <li>`carouselRight` - slide in from left to right</li>\n    <li>`carouselUp` - slide in from bottom to top</li>\n    <li>`carouselDown` - slide in from top to bottom</li>\n    <li>`shuffleTopRight` - rotate in from top right</li>\n    <li>`shuffleRightTop` - rotate in from right top</li>\n    <li>`shuffleRightBottom` - rotate in from right bottom</li>\n    <li>`shuffleBottomRight` - rotate in from bottom right</li>\n    <li>`shuffleBottomLeft` - rotate in from bottom left</li>\n    <li>`shuffleLeftBottom` - rotate in from left bottom</li>\n    <li>`shuffleLeftTop` - rotate in from left top</li>\n    <li>`shuffleTopLeft` - rotate in from top left</li>\n    <li>`zoom` - fast zoom in</li>\n  </ul>\nThe transition speed can also be controlled by appending `Fast` or `Slow` to the transition, e.g. `fadeFast` or `CarouselLeftSlow`.",
            "enum": [
              "none",
              "fade",
              "fadeSlow",
              "fadeFast",
              "reveal",
              "revealSlow",
              "revealFast",
              "wipeLeft",
              "wipeLeftSlow",
              "wipeLeftFast",
              "wipeRight",
              "wipeRightSlow",
              "wipeRightFast",
              "slideLeft",
              "slideLeftSlow",
              "slideLeftFast",
              "slideRight",
              "slideRightSlow",
              "slideRightFast",
              "slideUp",
              "slideUpSlow",
              "slideUpFast",
              "slideDown",
              "slideDownSlow",
              "slideDownFast",
              "carouselLeft",
              "carouselLeftSlow",
              "carouselLeftFast",
              "carouselRight",
              "carouselRightSlow",
              "carouselRightFast",
              "carouselUp",
              "carouselUpSlow",
              "carouselUpFast",
              "carouselDown",
              "carouselDownSlow",
              "carouselDownFast",
              "shuffleTopRight",
              "shuffleTopRightSlow",
              "shuffleTopRightFast",
              "shuffleRightTop",
              "shuffleRightTopSlow",
              "shuffleRightTopFast",
              "shuffleRightBottom",
              "shuffleRightBottomSlow",
              "shuffleRightBottomFast",
              "shuffleBottomRight",
              "shuffleBottomRightSlow",
              "shuffleBottomRightFast",
              "shuffleBottomLeft",
              "shuffleBottomLeftSlow",
              "shuffleBottomLeftFast",
              "shuffleLeftBottom",
              "shuffleLeftBottomSlow",
              "shuffleLeftBottomFast",
              "shuffleLeftTop",
              "shuffleLeftTopSlow",
              "shuffleLeftTopFast",
              "shuffleTopLeft",
              "shuffleTopLeftSlow",
              "shuffleTopLeftFast",
              "zoom"
            ],
            "type": "string"
          },
          "out": {
            "description": "The transition out. Available transitions are:\n  <ul>\n    <li>`fade` - fade out</li>\n    <li>`reveal` - reveal from right to left</li>\n    <li>`wipeLeft` - fade across screen to the left</li>\n    <li>`wipeRight` - fade across screen to the right</li>\n    <li>`slideLeft` - move slightly left and fade out</li>\n    <li>`slideRight` - move slightly right and fade out</li>\n    <li>`slideUp` - move slightly up and fade out</li>\n    <li>`slideDown` - move slightly down and fade out</li>\n    <li>`carouselLeft` - slide out from right to left</li>\n    <li>`carouselRight` - slide out from left to right</li>\n    <li>`carouselUp` - slide out from bottom to top</li>\n    <li>`carouselDown` - slide out from top  to bottom</li>\n    <li>`shuffleTopRight` - rotate out from top right</li>\n    <li>`shuffleRightTop` - rotate out from right top</li>\n    <li>`shuffleRightBottom` - rotate out from right bottom</li>\n    <li>`shuffleBottomRight` - rotate out from bottom right</li>\n    <li>`shuffleBottomLeft` - rotate out from bottom left</li>\n    <li>`shuffleLeftBottom` - rotate out from left bottom</li>\n    <li>`shuffleLeftTop` - rotate out from left top</li>\n    <li>`shuffleTopLeft` - rotate out from top left</li>\n    <li>`zoom` - fast zoom out</li>\n  </ul>\nThe transition speed can also be controlled by appending `Fast` or `Slow` to the transition, e.g. `fadeFast` or `CarouselLeftSlow`.",
            "enum": [
              "none",
              "fade",
              "fadeSlow",
              "fadeFast",
              "reveal",
              "revealSlow",
              "revealFast",
              "wipeLeft",
              "wipeLeftSlow",
              "wipeLeftFast",
              "wipeRight",
              "wipeRightSlow",
              "wipeRightFast",
              "slideLeft",
              "slideLeftSlow",
              "slideLeftFast",
              "slideRight",
              "slideRightSlow",
              "slideRightFast",
              "slideUp",
              "slideUpSlow",
              "slideUpFast",
              "slideDown",
              "slideDownSlow",
              "slideDownFast",
              "carouselLeft",
              "carouselLeftSlow",
              "carouselLeftFast",
              "carouselRight",
              "carouselRightSlow",
              "carouselRightFast",
              "carouselUp",
              "carouselUpSlow",
              "carouselUpFast",
              "carouselDown",
              "carouselDownSlow",
              "carouselDownFast",
              "shuffleTopRight",
              "shuffleTopRightSlow",
              "shuffleTopRightFast",
              "shuffleRightTop",
              "shuffleRightTopSlow",
              "shuffleRightTopFast",
              "shuffleRightBottom",
              "shuffleRightBottomSlow",
              "shuffleRightBottomFast",
              "shuffleBottomRight",
              "shuffleBottomRightSlow",
              "shuffleBottomRightFast",
              "shuffleBottomLeft",
              "shuffleBottomLeftSlow",
              "shuffleBottomLeftFast",
              "shuffleLeftBottom",
              "shuffleLeftBottomSlow",
              "shuffleLeftBottomFast",
              "shuffleLeftTop",
              "shuffleLeftTopSlow",
              "shuffleLeftTopFast",
              "shuffleTopLeft",
              "shuffleTopLeftSlow",
              "shuffleTopLeftFast",
              "zoom"
            ],
            "type": "string"
          }
        },
        "additionalProperties": false,
        "type": "object"
      },
      "Offset": {
        "description": "Offsets the position of an asset horizontally or vertically by a relative distance.",
        "properties": {
          "x": {
            "description": "Offset an asset on the horizontal axis (left or right). Use a number or an array of [Tween](./#tocs_tween) objects to create a custom animation.",
            "oneOf": [
              {
                "type": "number",
                "description": "Range varies from -10 to 10. Positive numbers move the asset right, negative left. The distance moved is relative to the width  of the viewport - i.e. an X offset of 0.5 will move the asset half the screen width to the right.",
                "format": "float",
                "minimum": -10,
                "maximum": 10,
                "example": 0.1
              },
              {
                "type": "array",
                "description": "An array of [Tween](./#tocs_tween) objects used to create a custom animation. Animate the X offset of an asset over time.",
                "items": {
                  "$ref": "#/components/schemas/Tween"
                }
              }
            ]
          },
          "y": {
            "description": "Offset an asset on the vertical axis (up or down). Use a number or an array of [Tween](./#tocs_tween) objects to create a custom animation.",
            "oneOf": [
              {
                "type": "number",
                "description": "Range varies from -10 to 10. Positive numbers move the asset up, negative down. The distance moved is relative to the height of the viewport - i.e. an Y offset of 0.5 will move the asset half the screen height up.",
                "format": "float",
                "minimum": -10,
                "maximum": 10,
                "example": -0.2
              },
              {
                "type": "array",
                "description": "An array of [Tween](./#tocs_tween) objects used to create a custom animation. Animate the Y offset of an asset over time.",
                "items": {
                  "$ref": "#/components/schemas/Tween"
                }
              }
            ]
          }
        },
        "additionalProperties": false,
        "type": "object"
      },
      "Crop": {
        "description": "Crop the sides of an asset by a relative amount. The size of the crop is specified using a scale between 0 and 1, relative to the screen width - i.e a left crop of 0.5 will crop half of the asset from the left, a top crop  of 0.25 will crop the top by quarter of the asset.",
        "properties": {
          "top": {
            "description": "Crop from the top of the asset",
            "type": "number",
            "format": "float",
            "minimum": 0,
            "maximum": 1,
            "example": 0.15
          },
          "bottom": {
            "description": "Crop from the bottom of the asset",
            "type": "number",
            "format": "float",
            "minimum": 0,
            "maximum": 1,
            "example": 0.15
          },
          "left": {
            "description": "Crop from the left of the asset",
            "type": "number",
            "format": "float",
            "minimum": 0,
            "maximum": 1
          },
          "right": {
            "description": "Crop from the left of the asset",
            "type": "number",
            "format": "float",
            "minimum": 0,
            "maximum": 1
          }
        },
        "additionalProperties": false,
        "type": "object"
      },
      "Transformation": {
        "description": "Apply one or more transformations to a clip. Transformations alter the visual properties of a clip and can be combined to create new shapes and effects.",
        "type": "object",
        "additionalProperties": false,
        "properties": {
          "rotate": {
            "$ref": "#/components/schemas/RotateTransformation"
          },
          "skew": {
            "$ref": "#/components/schemas/SkewTransformation"
          },
          "flip": {
            "$ref": "#/components/schemas/FlipTransformation"
          }
        }
      },
      "RotateTransformation": {
        "description": "Rotate a clip by the specified angle in degrees. Rotation origin is set based on the clips `position`.",
        "type": "object",
        "additionalProperties": false,
        "properties": {
          "angle": {
            "description": "Rotate a clip by the specified angle in degrees. Use a number or an array of [Tween](./#tocs_tween) objects to create a custom animation.",
            "oneOf": [
              {
                "type": "number",
                "description": "The angle to rotate the clip. Can be 0 to 360, or 0 to -360. Using a positive number rotates the clip clockwise, negative numbers counter-clockwise.",
                "format": "float",
                "minimum": -360,
                "maximum": 360,
                "example": 45
              },
              {
                "type": "array",
                "description": "An array of [Tween](./#tocs_tween) objects used to create a custom animation. Animate the rotation of an asset over time.",
                "items": {
                  "$ref": "#/components/schemas/Tween"
                }
              }
            ]
          }
        }
      },
      "SkewTransformation": {
        "description": "Skew a clip so its edges are sheared at an angle. Use values between -100 and 100. Values over 3 or under -3 will skew the clip almost flat.",
        "type": "object",
        "additionalProperties": false,
        "properties": {
          "x": {
            "description": "Skew the clip along it's x axis.",
            "oneOf": [
              {
                "type": "number",
                "description": "Range varies from -100 to 100. Positive numbers skew the asset right, negative left. The distance moved is relative to the width of the viewport - i.e. an X skew of 0.5 will skew the asset half the screen width to the right.",
                "format": "float",
                "minimum": -100,
                "maximum": 100,
                "example": 0.5
              },
              {
                "type": "array",
                "description": "An array of [Tween](./#tocs_tween) objects used to create a custom animation. Animate the X skew of an asset over time.",
                "items": {
                  "$ref": "#/components/schemas/Tween"
                }
              }
            ]
          },
          "y": {
            "description": "Skew the clip along it's y axis.",
            "oneOf": [
              {
                "type": "number",
                "description": "Range varies from -100 to 100. Positive numbers skew the asset up, negative down. The distance moved is relative to the height of the viewport - i.e. an Y skew of 0.5 will skew the asset half the screen height up.",
                "format": "float",
                "minimum": -100,
                "maximum": 100,
                "example": 0.5
              },
              {
                "type": "array",
                "description": "An array of [Tween](./#tocs_tween) objects used to create a custom animation. Animate the Y skew of an asset over time.",
                "items": {
                  "$ref": "#/components/schemas/Tween"
                }
              }
            ]
          }
        }
      },
      "FlipTransformation": {
        "description": "Flip a clip vertically or horizontally. Acts as a mirror effect of the clip along the selected plane.",
        "type": "object",
        "additionalProperties": false,
        "properties": {
          "horizontal": {
            "description": "Flip a clip horizontally.",
            "type": "boolean",
            "example": true
          },
          "vertical": {
            "description": "Flip a clip vertically.",
            "type": "boolean",
            "example": true
          }
        }
      },
      "TextFont": {
        "description": "Font properties for text.",
        "properties": {
          "family": {
            "description": "The font family name. This must be Family name embedded in the font, i.e. \"Open Sans\".",
            "type": "string",
            "example": "Open Sans"
          },
          "color": {
            "description": "The text color using hexadecimal color notation.",
            "type": "string",
            "example": "#ffffff"
          },
          "opacity": {
            "description": "The opacity of the text where 1 is opaque and 0 is transparent.",
            "type": "number",
            "example": 0.8
          },
          "size": {
            "description": "The size of the font in pixels (px).",
            "type": "integer",
            "example": 24
          },
          "weight": {
            "description": "The weight of the font. 100 is lightest, 900 is heaviest (boldest).",
            "type": "integer",
            "example": 400
          },
          "lineHeight": {
            "description": "The line height of the font as a ratio of the font size.",
            "type": "number",
            "example": 0.85
          }
        },
        "additionalProperties": false,
        "type": "object"
      },
      "TextBackground": {
        "description": "Displays a background box behind the text.",
        "properties": {
          "color": {
            "description": "The background color using hexadecimal color notation.",
            "type": "string",
            "pattern": "^#[A-Fa-f0-9]{6}$",
            "example": "#000000"
          },
          "opacity": {
            "description": "The opacity of the background where 1 is opaque and 0 is transparent.",
            "type": "number",
            "minimum": 0,
            "maximum": 1,
            "example": 0.8
          },
          "padding": {
            "description": "Padding inside the background box in pixels.",
            "type": "number",
            "minimum": 0,
            "maximum": 100,
            "example": 10
          },
          "borderRadius": {
            "description": "The border radius of the background box in pixels for rounded corners.",
            "type": "number",
            "minimum": 0,
            "example": 5
          },
          "wrap": {
            "description": "Not supported on legacy `text` assets. Accepted here only so validators can emit a clear migration error pointing users to `rich-text` or `rich-caption`, which support background wrapping natively.",
            "type": "boolean",
            "example": false
          }
        },
        "additionalProperties": false,
        "type": "object"
      },
      "TextAlignment": {
        "description": "Horizontal and vertical alignment properties for text.",
        "properties": {
          "horizontal": {
            "description": "The horizontal alignment of the text. Value must be one of: <ul>\n  <li>`left`</li>\n  <li>`center`</li>\n  <li>`right`</li>\n</ul>",
            "type": "string",
            "example": "center",
            "enum": [
              "left",
              "center",
              "right"
            ]
          },
          "vertical": {
            "description": "The vertical alignment of the text. Value must be one of: <ul>\n  <li>`top`</li>\n  <li>`center`</li>\n  <li>`bottom`</li>\n</ul>",
            "type": "string",
            "example": "center",
            "enum": [
              "top",
              "center",
              "bottom"
            ]
          }
        },
        "additionalProperties": false,
        "type": "object"
      },
      "RichTextFont": {
        "description": "Font properties for rich text.",
        "properties": {
          "family": {
            "description": "The font family name. This must be the Family name embedded in the font, i.e. \"Open Sans\".",
            "type": "string",
            "example": "Open Sans",
            "default": "Open Sans"
          },
          "size": {
            "description": "The size of the font in pixels (px). Must be between 1 and 500.",
            "type": "integer",
            "minimum": 1,
            "maximum": 500,
            "default": 24,
            "example": 48
          },
          "weight": {
            "description": "The weight of the font. Can be a number (100-900) or a string ('normal', 'bold', etc.). 100 is lightest, 900 is heaviest (boldest).",
            "default": "400"
          },
          "color": {
            "description": "The text color using hexadecimal color notation.",
            "type": "string",
            "pattern": "^#[A-Fa-f0-9]{6}$",
            "default": "#000000",
            "example": "#ff0000"
          },
          "opacity": {
            "description": "The opacity of the text where 1 is opaque and 0 is transparent.",
            "type": "number",
            "minimum": 0,
            "maximum": 1,
            "default": 1,
            "example": 0.9
          },
          "background": {
            "description": "The background color behind the text using hexadecimal color notation.",
            "type": "string",
            "pattern": "^#[A-Fa-f0-9]{6}$",
            "example": "#000000"
          },
          "stroke": {
            "description": "Text stroke (outline) properties.",
            "$ref": "#/components/schemas/RichTextStroke"
          }
        },
        "additionalProperties": false,
        "type": "object"
      },
      "RichTextStyle": {
        "description": "Text style properties including spacing, line height, and transformations.",
        "properties": {
          "letterSpacing": {
            "description": "Additional spacing between letters in pixels. Can be negative for tighter spacing.",
            "type": "number",
            "default": 0,
            "example": 2
          },
          "wordSpacing": {
            "description": "Additional spacing between words in pixels. A value of 0 uses the font's natural space width.",
            "type": "number",
            "minimum": 0,
            "default": 0,
            "example": 10
          },
          "lineHeight": {
            "description": "The line height as a multiplier of the font size. Must be between 0 and 10.",
            "type": "number",
            "minimum": 0,
            "maximum": 10,
            "default": 1.2,
            "example": 1.5
          },
          "textTransform": {
            "description": "Text transformation to apply.",
            "type": "string",
            "enum": [
              "none",
              "uppercase",
              "lowercase",
              "capitalize"
            ],
            "default": "none",
            "example": "uppercase"
          },
          "textDecoration": {
            "description": "Text decoration to apply.",
            "type": "string",
            "enum": [
              "none",
              "underline",
              "line-through"
            ],
            "default": "none",
            "example": "underline"
          },
          "gradient": {
            "description": "Gradient fill for text instead of solid color.",
            "$ref": "#/components/schemas/RichTextGradient"
          }
        },
        "additionalProperties": false,
        "type": "object"
      },
      "RichTextGradient": {
        "description": "Gradient properties for text fill.",
        "properties": {
          "type": {
            "description": "The type of gradient.",
            "type": "string",
            "enum": [
              "linear",
              "radial"
            ],
            "default": "linear",
            "example": "linear"
          },
          "angle": {
            "description": "The angle of the gradient in degrees (for linear gradients). Must be between 0 and 360.",
            "type": "number",
            "minimum": 0,
            "maximum": 360,
            "default": 0,
            "example": 45
          },
          "stops": {
            "description": "Gradient color stops. Must have at least 2 stops.",
            "type": "array",
            "minItems": 2,
            "items": {
              "type": "object",
              "properties": {
                "offset": {
                  "description": "Position of the color stop between 0 (start) and 1 (end).",
                  "type": "number",
                  "minimum": 0,
                  "maximum": 1,
                  "example": 0.5
                },
                "color": {
                  "description": "Color at this stop using hexadecimal color notation.",
                  "type": "string",
                  "pattern": "^#[A-Fa-f0-9]{6}$",
                  "example": "#ff0000"
                }
              },
              "required": [
                "offset",
                "color"
              ],
              "additionalProperties": false
            }
          }
        },
        "required": [
          "stops"
        ],
        "additionalProperties": false,
        "type": "object"
      },
      "RichTextStroke": {
        "description": "Text stroke (outline) properties.",
        "properties": {
          "width": {
            "description": "The width of the stroke in pixels. Must be 0 or greater.",
            "type": "number",
            "minimum": 0,
            "default": 0,
            "example": 2
          },
          "color": {
            "description": "The stroke color using hexadecimal color notation.",
            "type": "string",
            "pattern": "^#[A-Fa-f0-9]{6}$",
            "default": "#000000",
            "example": "#000000"
          },
          "opacity": {
            "description": "The opacity of the stroke where 1 is opaque and 0 is transparent.",
            "type": "number",
            "minimum": 0,
            "maximum": 1,
            "default": 1,
            "example": 0.8
          }
        },
        "additionalProperties": false,
        "type": "object"
      },
      "RichTextShadow": {
        "description": "Text shadow properties.",
        "properties": {
          "offsetX": {
            "description": "Horizontal offset of the shadow in pixels. Positive values move right, negative left.",
            "type": "number",
            "default": 0,
            "example": 4
          },
          "offsetY": {
            "description": "Vertical offset of the shadow in pixels. Positive values move down, negative up.",
            "type": "number",
            "default": 0,
            "example": 4
          },
          "blur": {
            "description": "The blur radius of the shadow in pixels. Must be 0 or greater.",
            "type": "number",
            "minimum": 0,
            "default": 0,
            "example": 8
          },
          "color": {
            "description": "The shadow color using hexadecimal color notation.",
            "type": "string",
            "pattern": "^#[A-Fa-f0-9]{6}$",
            "default": "#000000",
            "example": "#000000"
          },
          "opacity": {
            "description": "The opacity of the shadow where 1 is opaque and 0 is transparent.",
            "type": "number",
            "minimum": 0,
            "maximum": 1,
            "default": 0.5,
            "example": 0.7
          }
        },
        "additionalProperties": false,
        "type": "object"
      },
      "RichTextBackground": {
        "description": "Background styling properties for the text bounding box.",
        "properties": {
          "color": {
            "description": "The background color using hexadecimal color notation.",
            "type": "string",
            "pattern": "^#[A-Fa-f0-9]{6}$",
            "example": "#000000"
          },
          "opacity": {
            "description": "The opacity of the background where 1 is opaque and 0 is transparent.",
            "type": "number",
            "minimum": 0,
            "maximum": 1,
            "default": 1,
            "example": 0.5
          },
          "borderRadius": {
            "description": "The border radius of the background box in pixels. Must be 0 or greater.",
            "type": "number",
            "minimum": 0,
            "default": 0,
            "example": 10
          },
          "wrap": {
            "description": "When true, the background pill shrinks to fit the rendered text bounding box plus the\nasset's padding (and stroke width, if present), producing a pill or badge effect. When\nfalse (default), the background fills the full asset content area. Available on\nrich-text and rich-caption assets only; not supported on legacy `type: text`.\n",
            "type": "boolean",
            "default": false,
            "example": true
          }
        },
        "additionalProperties": false,
        "type": "object"
      },
      "RichTextAlignment": {
        "description": "Text alignment properties (horizontal and vertical).",
        "properties": {
          "horizontal": {
            "description": "The horizontal alignment of the text.",
            "type": "string",
            "enum": [
              "left",
              "center",
              "right"
            ],
            "default": "center",
            "example": "center"
          },
          "vertical": {
            "description": "The vertical alignment of the text within the bounding box.",
            "type": "string",
            "enum": [
              "top",
              "middle",
              "bottom"
            ],
            "default": "middle",
            "example": "middle"
          }
        },
        "additionalProperties": false,
        "type": "object"
      },
      "RichTextAnimation": {
        "description": "Animation properties for text entrance effects.",
        "properties": {
          "preset": {
            "description": "The animation preset to apply. Available presets: <ul>\n  <li>`fadeIn` - fadeIn in animation</li>\n  <li>`slideIn` - slide in from a direction</li>\n  <li>`typewriter` - typewriter effect</li>\n  <li>`ascend` - ascend from a direction</li>\n  <li>`shift` - shift in from a direction</li>\n  <li>`movingLetters` - letters move in from a direction</li>\n</ul>",
            "type": "string",
            "enum": [
              "fadeIn",
              "slideIn",
              "typewriter",
              "ascend",
              "shift",
              "movingLetters"
            ],
            "example": "shift"
          },
          "duration": {
            "description": "Override animation duration in seconds. Must be between 0.1 and 30 seconds.",
            "type": "number",
            "minimum": 0.1,
            "maximum": 30,
            "example": 2
          },
          "style": {
            "description": "Animation style - animate by character or by word. Only applicable for typewriter and shift animations.",
            "type": "string",
            "enum": [
              "character",
              "word"
            ],
            "example": "character"
          },
          "direction": {
            "description": "Direction for directional animations. Required for slideIn, ascend, shift, and movingLetters presets. <ul>\n  <li>`ascend` - supports: up, down</li>\n  <li>`shift` - supports: left, right, up, down</li>\n  <li>`slideIn` - supports: left, right, up, down</li>\n  <li>`movingLetters` - supports: left, right, up, down</li>\n</ul>",
            "type": "string",
            "enum": [
              "left",
              "right",
              "up",
              "down"
            ],
            "example": "up"
          }
        },
        "required": [
          "preset"
        ],
        "additionalProperties": false,
        "type": "object"
      },
      "CaptionFont": {
        "description": "Font properties for captions text.",
        "properties": {
          "family": {
            "description": "The font family name. This must be Family name embedded in the font, i.e. \"Open Sans\".",
            "type": "string",
            "example": "Open Sans"
          },
          "color": {
            "description": "The text color using hexadecimal color notation.",
            "type": "string",
            "example": "#ffffff"
          },
          "opacity": {
            "description": "The opacity of the text where 1 is opaque and 0 is transparent.",
            "type": "number",
            "example": 0.8
          },
          "size": {
            "description": "The size of the font in pixels (px).",
            "type": "integer",
            "example": 24
          },
          "lineHeight": {
            "description": "The line height of the font as a ratio of the font size.",
            "type": "number",
            "example": 0.85
          },
          "stroke": {
            "description": "The stroke color of the font using hexadecimal color notation.",
            "type": "string",
            "example": "#ff6600"
          },
          "strokeWidth": {
            "description": "The width of the stroke in pixels.",
            "type": "number",
            "example": 0.8
          }
        },
        "additionalProperties": false,
        "type": "object"
      },
      "CaptionBackground": {
        "description": "Displays a background box behind the caption text.",
        "properties": {
          "color": {
            "description": "The background color using hexadecimal color notation.",
            "type": "string",
            "example": "#000000"
          },
          "opacity": {
            "description": "The opacity of the background color.",
            "type": "number",
            "example": 0.4
          },
          "padding": {
            "description": "The padding inside the background box in pixels.",
            "type": "integer",
            "example": 30
          },
          "borderRadius": {
            "description": "The border radius of the background box in pixels.",
            "type": "integer",
            "example": 18
          }
        },
        "additionalProperties": false,
        "type": "object"
      },
      "CaptionMargin": {
        "description": "The margin properties for captions. Margins are used to position the caption text and background on the screen.",
        "properties": {
          "top": {
            "description": "The margin above the text. Pushes captions down the screen.",
            "type": "number",
            "example": 0.25
          },
          "left": {
            "description": "The margin to the left of the text. Pushes captions to the right.",
            "type": "number",
            "example": 0.05
          },
          "right": {
            "description": "The margin to the right of the text. Pushes captions to the left.",
            "type": "number",
            "example": 0.45
          }
        },
        "additionalProperties": false,
        "type": "object"
      },
      "ChromaKey": {
        "description": "Chroma key is a technique that replaces a specific color in a video with a different background image or video, enabling seamless integration of diverse environments. Commonly used for green screen and blue screen effects.",
        "properties": {
          "color": {
            "description": "The chroma key color as a hex value. Use green (#00b140) for green screens or blue (#0000FF) for blue screens. Any valid hex color can be used as the key color.",
            "type": "string",
            "pattern": "^#[0-9a-fA-F]{6}$",
            "example": "#00b140"
          },
          "threshold": {
            "description": "Pixels within this distance from the key color are eliminated by setting their alpha values to zero.",
            "type": "integer",
            "minimum": 0,
            "maximum": 250,
            "example": 150
          },
          "halo": {
            "description": "Pixels within the halo distance from the threshold boundary are given an increasing alpha value based on their distance from the threshold.",
            "type": "integer",
            "minimum": 0,
            "maximum": 250,
            "example": 100
          }
        },
        "additionalProperties": false,
        "required": [
          "color"
        ],
        "type": "object"
      },
      "Tween": {
        "description": "Use a Tween to [animate properties over time](/docs/guide/architecting-an-application/animations/). The following properties are currently supported and can be animated:\n  <ul>\n    <li>Opacity - animate the transparency of a clip.</li>\n    <li>Offset - animate the x and y position of a clip.</li>\n    <li>Rotation - animate the rotation of a clip.</li>\n    <li>Skew - animate the horizontal and vertical shearing effect.</li>\n    <li>Volume - animate the audio volume of a clip.</li>\n  </ul>",
        "properties": {
          "from": {
            "description": "The initial property value at the start of the animation.",
            "example": 0
          },
          "to": {
            "description": "The final property value at the end of the animation.",
            "example": 1
          },
          "start": {
            "description": "The time in seconds when the animation starts, relative to the clip, not the timeline.",
            "type": "number",
            "example": 0
          },
          "length": {
            "description": "The duration of the animation in seconds.",
            "type": "number",
            "example": 3
          },
          "interpolation": {
            "description": "The interpolation method to use for the animation. Available options are: <ul>\n  <li>`linear` - a linear interpolation between the start and end values.</li>\n  <li>`bezier` - a bezier curve interpolation between the start and end values.</li>\n  <li>`constant` - an interpolation where the property instantly jumps from the start to the end value, without any gradual transition.</li>\n</ul>",
            "type": "string",
            "example": "bezier",
            "enum": [
              "linear",
              "bezier",
              "constant"
            ]
          },
          "easing": {
            "description": "The easing function to use for the animation. Easing controls the rate of change of the animated value, allowing for more natural motion by speeding up or slowing down the animation at different points. Only applicable if interpolation is set to `bezier`.",
            "type": "string",
            "enum": [
              "ease",
              "easeIn",
              "easeOut",
              "easeInOut",
              "easeInQuad",
              "easeInCubic",
              "easeInQuart",
              "easeInQuint",
              "easeInSine",
              "easeInExpo",
              "easeInCirc",
              "easeInBack",
              "easeOutQuad",
              "easeOutCubic",
              "easeOutQuart",
              "easeOutQuint",
              "easeOutSine",
              "easeOutExpo",
              "easeOutCirc",
              "easeOutBack",
              "easeInOutQuad",
              "easeInOutCubic",
              "easeInOutQuart",
              "easeInOutQuint",
              "easeInOutSine",
              "easeInOutExpo",
              "easeInOutCirc",
              "easeInOutBack"
            ]
          }
        },
        "additionalProperties": false,
        "type": "object"
      },
      "MergeField": {
        "description": "A merge field consists of a key; `find`, and a value; `replace`. Merge fields can be used to replace placeholders within the JSON edit to create re-usable templates. Placeholders should be a string with double brace delimiters, i.e. `\"{{NAME}}\"`. A placeholder can be used for any value within the JSON edit.",
        "type": "object",
        "properties": {
          "find": {
            "description": "The string to find <u>without</u> delimiters.",
            "type": "string",
            "example": "NAME"
          },
          "replace": {
            "description": "The replacement value. The replacement can be any valid JSON type - string, boolean, number, etc...",
            "example": "Jane"
          }
        },
        "additionalProperties": false,
        "required": [
          "find",
          "replace"
        ]
      },
      "Output": {
        "description": "The output format, render range and type of media to generate.",
        "properties": {
          "format": {
            "description": "The output format and type of media file to generate. <ul>\n  <li>`mp4` - mp4 video file</li>\n  <li>`gif` - animated gif</li>\n  <li>`jpg` - jpg image file</li>\n  <li>`png` - png image file</li>\n  <li>`bmp` - bmp image file</li>\n  <li>`mp3` - mp3 audio file (audio only)</li>\n</ul>",
            "enum": [
              "mp4",
              "gif",
              "mp3",
              "jpg",
              "png",
              "bmp"
            ],
            "type": "string",
            "example": "mp4"
          },
          "resolution": {
            "description": "The preset output resolution of the video or image. For custom sizes use the `size` property. <ul>\n  <li>`preview` - 512px x 288px @ 15fps</li>\n  <li>`mobile` - 640px x 360px @ 25fps</li>\n  <li>`sd` - 1024px x 576px @ 25fps</li>\n  <li>`hd` - 1280px x 720px @ 25fps</li>\n  <li>`1080` - 1920px x 1080px @ 25fps</li>\n  <li>`4k` - 3840px x 2160px @ 25fps</li>\n</ul>",
            "enum": [
              "preview",
              "mobile",
              "sd",
              "hd",
              "1080",
              "4k"
            ],
            "type": "string",
            "example": "hd"
          },
          "aspectRatio": {
            "description": "The aspect ratio (shape) of the video or image. Useful for social media output formats. Options are: <ul>\n  <li>`16:9` (default) - regular landscape/horizontal aspect ratio</li>\n  <li>`9:16` - vertical/portrait aspect ratio</li>\n  <li>`1:1` - square aspect ratio</li>\n  <li>`4:5` - short vertical/portrait aspect ratio</li>\n  <li>`4:3` - legacy TV aspect ratio</li>\n</ul>",
            "enum": [
              "16:9",
              "9:16",
              "1:1",
              "4:5",
              "4:3"
            ],
            "type": "string",
            "example": "16:9"
          },
          "size": {
            "$ref": "#/components/schemas/Size"
          },
          "fps": {
            "description": "Override the default frames per second. Useful for when the source footage is recorded at 30fps, i.e. on  mobile devices. Lower frame rates can be used to add cinematic quality (24fps) or to create smaller file size/faster render times or animated gifs (12 or 15fps). Default is 25fps. <ul>\n  <li>`12` - 12fps</li>\n  <li>`15` - 15fps</li>\n  <li>`24` - 24fps</li>\n  <li>`23.976` - 23.976fps</li>\n  <li>`25` (default) - 25fps</li>\n  <li>`29.97` - 29.97fps</li>\n  <li>`30` - 30fps</li>\n  <li>`48` - 48fps</li>\n  <li>`50` - 50fps</li>\n  <li>`59.94` - 59.94fps</li>\n  <li>`60` - 60fps</li>\n</ul>",
            "enum": [
              12,
              15,
              23.976,
              24,
              25,
              29.97,
              30,
              48,
              50,
              59.94,
              60
            ],
            "type": "number",
            "example": 25
          },
          "scaleTo": {
            "description": "Override the resolution and scale the video or image to render at a different size. When using scaleTo the asset should be edited at the resolution dimensions, i.e. use font sizes that look best at HD, then use scaleTo to output the file at SD and the text will be scaled to the correct size. This is useful if you want to create multiple asset sizes. <ul>\n  <li>`preview` - 512px x 288px @ 15fps</li>\n  <li>`mobile` - 640px x 360px @ 25fps</li>\n  <li>`sd` - 1024px x 576px @25fps</li>\n  <li>`hd` - 1280px x 720px @25fps</li>\n  <li>`1080` - 1920px x 1080px @25fps</li>\n</ul>",
            "enum": [
              "preview",
              "mobile",
              "sd",
              "hd",
              "1080",
              "4k"
            ],
            "type": "string"
          },
          "quality": {
            "description": "Adjust the output quality of the video, image or audio. Adjusting quality affects  render speed, download speeds and storage requirements due to file size. The default `medium` provides the most optimized choice for all three  factors. <ul>\n  <li>`verylow` - reduced quality, smallest file size</li>\n  <li>`low` - slightly reduced quality, smaller file size</li>\n  <li>`medium` (default) - optimized quality, render speeds and file size</li>\n  <li>`high` - slightly increased quality, larger file size</li>\n  <li>`veryhigh` - highest quality, largest file size</li>\n</ul>",
            "enum": [
              "verylow",
              "low",
              "medium",
              "high",
              "veryhigh"
            ],
            "type": "string",
            "example": "medium"
          },
          "repeat": {
            "description": "Loop settings for gif files. Set to `true` to loop, `false` to play only once.",
            "type": "boolean",
            "example": true
          },
          "mute": {
            "description": "Mute the audio track of the output video. Set to `true` to mute, `false` to un-mute.",
            "type": "boolean",
            "example": false
          },
          "range": {
            "$ref": "#/components/schemas/Range"
          },
          "poster": {
            "description": "Generate a poster image from a specific point on the timeline.",
            "$ref": "#/components/schemas/Poster"
          },
          "thumbnail": {
            "description": "Generate a thumbnail image from a specific point on the timeline.",
            "$ref": "#/components/schemas/Thumbnail"
          },
          "destinations": {
            "description": "Specify the storage locations and hosting services to send rendered videos to.",
            "type": "array",
            "items": {
              "$ref": "#/components/schemas/Destinations"
            }
          }
        },
        "additionalProperties": false,
        "required": [
          "format"
        ],
        "type": "object"
      },
      "Size": {
        "description": "Set a custom size for a video or image in pixels. When using a custom size omit the `resolution` and `aspectRatio`. Custom sizes must be divisible by 2 based on the encoder specifications.",
        "properties": {
          "width": {
            "description": "Set a custom width for the video or image file in pixels. Value must be divisible by 2. Maximum video width is 1920px, maximum image width is 4096px.",
            "type": "integer",
            "minimum": 1,
            "maximum": 4096,
            "example": 1200
          },
          "height": {
            "description": "Set a custom height for the video or image file in pixels. Value must be divisible by 2. Maximum video height is 1920px, maximum image height is 4096px.",
            "type": "integer",
            "minimum": 1,
            "maximum": 4096,
            "example": 800
          }
        },
        "additionalProperties": false,
        "type": "object"
      },
      "Range": {
        "description": "Specify a time range to render, i.e. to render only a portion of a video or audio file. Omit this setting to  export the entire video. Range can also be used to render a frame at a specific time point - setting a range and output format as `jpg` will output a single frame image at the range `start` point.",
        "properties": {
          "start": {
            "description": "The point on the timeline, in seconds, to start the render from - i.e. start at second 3.",
            "type": "number",
            "format": "float",
            "minimum": 0,
            "example": 3
          },
          "length": {
            "description": "The length of the portion of the video or audio to render - i.e. render 6 seconds of the video.",
            "type": "number",
            "format": "float",
            "minimum": 0,
            "example": 6
          }
        },
        "additionalProperties": false,
        "type": "object"
      },
      "Poster": {
        "description": "Generate a poster image for the video at a specific point from the timeline. The poster image size will match the size of the output video.",
        "properties": {
          "capture": {
            "description": "The point on the timeline in seconds to capture a single frame to use as the poster image.",
            "type": "number",
            "example": 1
          }
        },
        "additionalProperties": false,
        "required": [
          "capture"
        ],
        "type": "object"
      },
      "Thumbnail": {
        "description": "Generate a thumbnail image for the video or image at a specific point from the timeline.",
        "properties": {
          "capture": {
            "description": "The point on the timeline in seconds to capture a single frame to use as the thumbnail image.",
            "type": "number",
            "example": 1
          },
          "scale": {
            "description": "Scale the thumbnail size to a fraction of the viewport size - i.e. setting the scale to 0.5 will scale  the thumbnail to half the size of the viewport.",
            "type": "number",
            "minimum": 0,
            "maximum": 1,
            "example": 0.3
          }
        },
        "additionalProperties": false,
        "required": [
          "capture",
          "scale"
        ],
        "type": "object"
      },
      "Destinations": {
        "type": "object",
        "description": "A destination is a location where assets can be sent to for serving or hosting. Videos, images and audio files that are rendered by the [Edit API](#shotstack-edit) and [source](#tocs_source) and [rendition](#tocs_rendition) files generated by the [Ingest API](#shotstack-ingest) can be sent to destinations. You can also fetch a file from any public URL and [transfer](#transfer-asset) it to a destination. A file can be sent to one or more destinations including 3rd party destinations.\n\nBy default all ingested and generated assets are automatically sent to the [Shotstack hosting destination](https://shotstack.io/docs/guide/serving-assets/hosting/). You can [opt-out](https://shotstack.io/docs/guide/serving-assets/self-host/) from by setting the Shotstack destination **exclude** property to **true**.",
        "discriminator": {
          "propertyName": "destinations"
        },
        "anyOf": [
          {
            "$ref": "#/components/schemas/ShotstackDestination"
          },
          {
            "$ref": "#/components/schemas/MuxDestination"
          },
          {
            "$ref": "#/components/schemas/S3Destination"
          },
          {
            "$ref": "#/components/schemas/GoogleCloudStorageDestination"
          },
          {
            "$ref": "#/components/schemas/GoogleDriveDestination"
          },
          {
            "$ref": "#/components/schemas/VimeoDestination"
          },
          {
            "description": "Send videos to TikTok. TikTok credentials are required and added via the [dashboard](https://dashboard.shotstack.io/integrations/tiktok), not in the request.",
            "properties": {
              "provider": {
                "description": "The destination to send video to - set to `tiktok` for TikTok.",
                "type": "string",
                "default": "tiktok",
                "example": "tiktok"
              },
              "options": {
                "description": "Additional TikTok configuration options.",
                "properties": {
                  "title": {
                    "description": "A title for the video that will be displayed on TikTok.",
                    "type": "string",
                    "maxLength": 150
                  },
                  "privacyLevel": {
                    "description": "The privacy level for the video. Options are: <ul>\n  <li>`public` - video is visible to everyone</li>\n  <li>`friends` - video is visible to friends only</li>\n  <li>`private` - video is only visible to you</li>\n</ul>",
                    "type": "string",
                    "enum": [
                      "public",
                      "friends",
                      "private"
                    ],
                    "default": "private"
                  },
                  "disableDuet": {
                    "description": "Disable the Duet feature for this video.",
                    "type": "boolean",
                    "default": false
                  },
                  "disableStitch": {
                    "description": "Disable the Stitch feature for this video.",
                    "type": "boolean",
                    "default": false
                  },
                  "disableComment": {
                    "description": "Disable comments on this video.",
                    "type": "boolean",
                    "default": false
                  }
                },
                "type": "object"
              }
            },
            "type": "object",
            "required": [
              "provider"
            ]
          },
          {
            "description": "Send videos and assets to [Akamai NetStorage](https://techdocs.akamai.com/netstorage-usage/docs). Send files to your NetStorage upload directory with a custom path and filename. Akamai credentials are required and added via the [dashboard](https://dashboard.shotstack.io/integrations/akamai-netstorage), not in the request.",
            "properties": {
              "provider": {
                "description": "The destination to send assets to - set to `akamai-netstorage` for Akamai NetStorage.",
                "type": "string",
                "default": "akamai-netstorage",
                "example": "akamai-netstorage"
              },
              "options": {
                "description": "Additional Akamai NetStorage configuration options.",
                "properties": {
                  "host": {
                    "description": "The Akamai NetStorage hostname, i.e. `example-nsu.akamaihd.net`.",
                    "type": "string",
                    "example": "example-nsu.akamaihd.net"
                  },
                  "cpCode": {
                    "description": "The Content Provider code (CP code) for the NetStorage upload directory.",
                    "type": "string",
                    "example": "123456"
                  },
                  "path": {
                    "description": "A remote directory path/prefix for the file being sent, i.e. `videos` or `customerId/videos`.",
                    "type": "string",
                    "nullable": true,
                    "example": "videos"
                  },
                  "filename": {
                    "description": "Use your own filename instead of the default filenames generated by Shotstack. Note: omit the file extension as this will be appended depending on the output format. Also `-poster.jpg` and `-thumb.jpg` will be appended for poster and thumbnail images.",
                    "type": "string",
                    "nullable": true,
                    "example": "my-file"
                  }
                },
                "required": [
                  "host",
                  "cpCode"
                ]
              }
            },
            "type": "object",
            "required": [
              "provider"
            ]
          },
          {
            "description": "Send videos and assets to [Azure Blob Storage](https://learn.microsoft.com/en-us/azure/storage/blobs/). Send files to any container with a custom prefix and filename. Azure credentials are required and added via the [dashboard](https://dashboard.shotstack.io/integrations/azure-blob-storage), not in the request.",
            "properties": {
              "provider": {
                "description": "The destination to send assets to - set to `azure-blob-storage` for Azure Blob Storage.",
                "type": "string",
                "default": "azure-blob-storage",
                "example": "azure-blob-storage"
              },
              "options": {
                "description": "Additional Azure Blob Storage configuration options.",
                "properties": {
                  "accountName": {
                    "description": "The Azure Storage account name.",
                    "type": "string",
                    "example": "mystorageaccount"
                  },
                  "container": {
                    "description": "The Blob container name. The container must exist in the Azure Storage account before files can be sent.",
                    "type": "string",
                    "example": "my-container"
                  },
                  "prefix": {
                    "description": "A virtual directory prefix for the blob being sent, i.e. `videos` or `customerId/videos`.",
                    "type": "string",
                    "nullable": true,
                    "example": "videos"
                  },
                  "filename": {
                    "description": "Use your own filename instead of the default filenames generated by Shotstack. Note: omit the file extension as this will be appended depending on the output format. Also `-poster.jpg` and `-thumb.jpg` will be appended for poster and thumbnail images.",
                    "type": "string",
                    "nullable": true,
                    "example": "my-file"
                  }
                },
                "required": [
                  "accountName",
                  "container"
                ]
              }
            },
            "type": "object",
            "required": [
              "provider"
            ]
          }
        ],
        "additionalProperties": false
      },
      "ShotstackDestination": {
        "description": "Send videos and assets to the  [Shotstack hosting and CDN](https://shotstack.io/docs/guide/serving-assets/destinations/shotstack/) service.  This destination is enabled by default.",
        "properties": {
          "provider": {
            "description": "The destination to send assets to - set to `shotstack` for Shotstack hosting and CDN.",
            "type": "string",
            "default": "shotstack",
            "example": "shotstack"
          },
          "exclude": {
            "description": "Set to `true` to [opt-out](https://shotstack.io/docs/guide/serving-assets/self-host/) from the Shotstack hosting and CDN service. All files must be downloaded within 24 hours of rendering.",
            "type": "boolean",
            "example": false
          }
        },
        "type": "object",
        "required": [
          "provider"
        ]
      },
      "MuxDestination": {
        "description": "Send videos to the [Mux](https://shotstack.io/docs/guide/serving-assets/destinations/mux/) video hosting and streaming service. Mux credentials are required and added via the [dashboard](https://dashboard.shotstack.io/integrations/mux), not in the request.",
        "properties": {
          "provider": {
            "description": "The destination to send video to - set to `mux` for Mux.",
            "type": "string",
            "default": "mux",
            "example": "mux"
          },
          "options": {
            "description": "Additional Mux configuration and features.",
            "$ref": "#/components/schemas/MuxDestinationOptions"
          }
        },
        "type": "object",
        "required": [
          "provider"
        ]
      },
      "MuxDestinationOptions": {
        "description": "Pass additional options to control how Mux processes video. Currently supports playback_policy and passthrough options.",
        "properties": {
          "playbackPolicy": {
            "description": "Sets the Mux `playback_policy` option. Value is an array of strings - use `public`, `signed`, or both.",
            "type": "array",
            "items": {
              "type": "string",
              "enum": [
                "public",
                "signed"
              ]
            }
          },
          "passthrough": {
            "description": "Sets the Mux `passthrough` option. Max 255 characters.",
            "type": "string",
            "maxLength": 255
          }
        }
      },
      "S3Destination": {
        "description": "Send videos and assets to an [Amazon S3](https://shotstack.io/docs/guide/serving-assets/destinations/s3/) bucket. Send files to any region with your own prefix and filename. AWS credentials are required and added via the [dashboard](https://dashboard.shotstack.io/integrations/s3), not in the request.",
        "properties": {
          "provider": {
            "description": "The destination to send assets to - set to `s3` for S3.",
            "type": "string",
            "default": "s3",
            "example": "s3"
          },
          "options": {
            "description": "Additional S3 configuration options.",
            "$ref": "#/components/schemas/S3DestinationOptions"
          }
        },
        "type": "object",
        "required": [
          "provider"
        ]
      },
      "S3DestinationOptions": {
        "description": "Pass additional options to control how files are stored in S3.",
        "properties": {
          "region": {
            "description": "Choose the region to send the file to. Must be a valid  [AWS region](https://docs.aws.amazon.com/general/latest/gr/s3.html#s3_region) string like `us-east-1` or `ap-southeast-2`.",
            "type": "string",
            "example": "us-east-1"
          },
          "bucket": {
            "description": "The bucket name to send files to. The bucket must exist in the AWS account before files can be sent.",
            "type": "string",
            "example": "my-bucket"
          },
          "prefix": {
            "description": "A prefix for the file being sent. This is typically a folder name, i.e. `videos` or `customerId/videos`.",
            "type": "string",
            "example": "my-renders"
          },
          "filename": {
            "description": "Use your own filename instead of the default filenames generated by Shotstack. Note: omit the file extension as this will be appended depending on the output format. Also `-poster.jpg` and `-thumb.jpg` will be appended for poster and thumbnail images.",
            "type": "string",
            "example": "my-file"
          },
          "acl": {
            "description": "Sets the S3 Access Control List (acl) permissions. Default is `private`. Must use a valid  S3 [Canned ACL](https://docs.aws.amazon.com/AmazonS3/latest/userguide/acl-overview.html#canned-acl).",
            "type": "string",
            "example": "public-read"
          }
        },
        "required": [
          "region",
          "bucket"
        ]
      },
      "GoogleCloudStorageDestination": {
        "description": "Send videos and assets to a [Google Cloud Storage](https://cloud.google.com/storage) bucket. Send files with your own prefix and filename. Google Cloud credentials are required and added via the [dashboard](https://dashboard.shotstack.io/integrations/google-cloud-storage), not in the request.",
        "properties": {
          "provider": {
            "description": "The destination to send assets to - set to `google-cloud-storage` for Google Cloud Storage.",
            "type": "string",
            "default": "google-cloud-storage",
            "example": "google-cloud-storage"
          },
          "options": {
            "description": "Additional Google Cloud Storage configuration options.",
            "$ref": "#/components/schemas/GoogleCloudStorageDestinationOptions"
          }
        },
        "type": "object",
        "required": [
          "provider"
        ]
      },
      "GoogleCloudStorageDestinationOptions": {
        "description": "Pass additional options to control how files are stored in Google Cloud Storage.",
        "properties": {
          "bucket": {
            "description": "The bucket name to send files to. The bucket must exist in the Google Cloud Storage account before files can be sent.",
            "type": "string",
            "example": "my-bucket"
          },
          "prefix": {
            "description": "A prefix for the file being sent. This is typically a folder name, i.e. `videos` or `customerId/videos`.",
            "type": "string",
            "example": "my-renders"
          },
          "filename": {
            "description": "Use your own filename instead of the default filenames generated by Shotstack. Note: omit the file extension as this will be appended depending on the output format. Also `-poster.jpg` and `-thumb.jpg` will be appended for poster and thumbnail images.",
            "type": "string",
            "example": "my-file"
          }
        },
        "required": [
          "bucket"
        ]
      },
      "GoogleDriveDestination": {
        "description": "Send rendered videos and assets to the [Google Drive](https://shotstack.io/docs/guide/serving-assets/destinations/google-drive/) cloud storage service. Google Drive uses OAuth and you must authenticate and link your Google account via  [dashboard](https://dashboard.shotstack.io/integrations/google-drive), not in the request.",
        "properties": {
          "provider": {
            "description": "The destination to send assets to - set to `google-drive` for Google Drive.",
            "type": "string",
            "default": "google-drive",
            "example": "google-drive"
          },
          "options": {
            "description": "Additional Google Drive configuration and features.",
            "$ref": "#/components/schemas/GoogleDriveDestinationOptions"
          }
        },
        "type": "object",
        "required": [
          "provider",
          "options"
        ]
      },
      "GoogleDriveDestinationOptions": {
        "description": "Pass the folder ID and options to configure how assets are stored in Google Drive.",
        "properties": {
          "folderId": {
            "description": "The Google Drive folder ID where asset will be stored. The folder ID is required and can be retrieved from the URL when logged in to Google Drive, e.g. <a href=\"#\">https://drive.google.com/drive/u/0/folders/1r-eTY6OLO8tzQRKwMyq-fIrQ_7AJEI6A</a>.",
            "type": "string",
            "example": "1r-eTY6OLO8tzQRKwMyq-fIrQ_7AJEI6A"
          },
          "filename": {
            "description": "Use your own filename instead of the default filenames generated by Shotstack. Note: omit the file extension as this will be appended depending on the output format. Also `-poster.jpg` and `-thumb.jpg` will be appended for poster and thumbnail images.",
            "type": "string",
            "example": "my-file"
          }
        },
        "required": [
          "folderId"
        ]
      },
      "VimeoDestination": {
        "description": "Send videos to [Vimeo](https://shotstack.io/docs/guide/serving-assets/destinations/vimeo/) video hosting and streaming service. Vimeo credentials are required and added via the [dashboard](https://dashboard.shotstack.io/integrations/vimeo), not in the request.",
        "properties": {
          "provider": {
            "description": "The destination to send video to - set to `vimeo` for Vimeo.",
            "type": "string",
            "default": "vimeo",
            "example": "vimeo"
          },
          "options": {
            "description": "Additional Vimeo configuration and features.",
            "$ref": "#/components/schemas/VimeoDestinationOptions"
          }
        },
        "type": "object",
        "required": [
          "provider"
        ]
      },
      "VimeoDestinationOptions": {
        "description": "Pass additional options to control how Vimeo publishes video, including name, description and privacy settings.",
        "properties": {
          "name": {
            "description": "A name or title for the video that will be displayed on the Vimeo website.",
            "type": "string"
          },
          "description": {
            "description": "A description of the video that will be displayed on the Vimeo website.",
            "type": "string"
          },
          "privacy": {
            "description": "Options to control the visibility of videos and privacy features.",
            "$ref": "#/components/schemas/VimeoDestinationPrivacyOptions"
          },
          "folderUri": {
            "description": "The Vimeo folder URI to upload the video to. The folder must already exist in your Vimeo account.",
            "type": "string",
            "example": "/users/12345678/projects/87654321"
          }
        }
      },
      "VimeoDestinationPrivacyOptions": {
        "description": "Options to control the visibility of videos and privacy features.",
        "properties": {
          "view": {
            "description": "Set who can view the videos. Available options are: <ul>\n  <li>`anybody` - Anyone can view the video.</li>\n  <li>`nobody` - Only the video owner can view the video.</li>\n  <li>`contacts` - Only contacts can view the video.</li>\n  <li>`password` - A password is required to view the video.</li>\n  <li>`unlisted` - The video is not listed on Vimeo.</li>\n</ul>",
            "type": "string",
            "enum": [
              "anybody",
              "nobody",
              "contacts",
              "password",
              "unlisted"
            ]
          },
          "embed": {
            "description": "Set who can embed the video. Available options are: <ul>\n  <li>`public` - Anyone can embed the video.</li>\n  <li>`private` - Only the video owner can embed the video.</li>\n  <li>`whitelist` - Only whitelisted domains can embed the video.</li>\n</ul>",
            "type": "string",
            "enum": [
              "public",
              "private",
              "whitelist"
            ]
          },
          "comments": {
            "description": "Set who can comment on the video. Available options are: <ul>\n  <li>`anybody` - Anyone can comment on the video.</li>\n  <li>`nobody` - Only the video owner can comment on the video.</li>\n  <li>`contacts` - Only contacts can comment on the video.</li>\n</ul>",
            "type": "string",
            "enum": [
              "anybody",
              "nobody",
              "contacts"
            ]
          },
          "download": {
            "description": "Set whether the video can be downloaded.",
            "type": "boolean"
          },
          "add": {
            "description": "Set whether other users can add the video to their collections.",
            "type": "boolean"
          }
        },
        "type": "object"
      },
      "Template": {
        "description": "A template is a saved [Edit](#tocs_edit) than can be loaded and re-used.",
        "properties": {
          "name": {
            "type": "string",
            "description": "The template name",
            "example": "My template"
          },
          "template": {
            "$ref": "#/components/schemas/Edit"
          }
        },
        "additionalProperties": false,
        "required": [
          "name"
        ],
        "type": "object"
      },
      "TemplateRender": {
        "description": "Configure the id and optional merge fields to render a template by id.",
        "properties": {
          "id": {
            "description": "The id of the template to render in UUID format.",
            "type": "string",
            "example": "f5493c17-d01f-445c-bb49-535fae65f219"
          },
          "merge": {
            "description": "An array of key/value pairs that provides an easy way to create templates with placeholders. The placeholders can be used to find and replace keys with values. For example you can search for the placeholder `{{NAME}}` and replace it with the value `Jane`. ",
            "type": "array",
            "items": {
              "$ref": "#/components/schemas/MergeField"
            }
          }
        },
        "additionalProperties": false,
        "required": [
          "id"
        ],
        "type": "object"
      },
      "Source": {
        "description": "The details of the file to be ingested and any transformations to be applied. Once the source file has been ingested, new renditions can be created from it. The renditions are specified in the **outputs** property.\nA rendition is a new version, generated from the source. This can be used to create new sizes and aspect ratios tht serve different purposes within an application.",
        "properties": {
          "url": {
            "description": "The URL of the file to be ingested. The URL must be publicly accessible or include credentials.",
            "type": "string",
            "example": "https://github.com/shotstack/test-media/raw/main/captioning/scott-ko.mp4"
          },
          "outputs": {
            "$ref": "#/components/schemas/Outputs"
          },
          "destinations": {
            "$ref": "#/components/schemas/Destinations"
          },
          "callback": {
            "type": "string",
            "description": "An optional webhook callback URL used to receive status notifications when sources are uploaded and renditions processed.",
            "example": "https://my-server.com/callback.php"
          }
        },
        "type": "object"
      },
      "Outputs": {
        "description": "The output renditions and transformations that should be generated from the source file.",
        "properties": {
          "renditions": {
            "description": "The output renditions and transformations that should be generated from the source file.",
            "type": "array",
            "items": {
              "$ref": "#/components/schemas/Rendition"
            }
          },
          "transcription": {
            "description": "The transcription settings for the output file.",
            "$ref": "#/components/schemas/Transcription"
          }
        },
        "type": "object"
      },
      "Rendition": {
        "description": "A rendition is a new output file that is generated from the source. The rendition can be encoded to a different format and have transformations applied to it such as resizing, cropping, etc...",
        "properties": {
          "format": {
            "description": "The output format to encode the file to. You can only encode a file to the same type, i.e. a video to a video or an image to an image. You can't encode a video as an image. The following formats are available: <ul>\n  <li>`mp4` - mp4 video file (video only)</li>\n  <li>`webm` - webm video file (video only)</li>\n  <li>`mov` - mov video file (video only)</li>\n  <li>`avi` - avi video file (video only)</li>\n  <li>`mkv` - mkv video file (video only)</li>\n  <li>`ogv` - ogv video file (video only)</li>\n  <li>`wmv` - wmv video file (video only)</li>\n  <li>`avif` - avif video file (video only)</li>\n  <li>`gif` - animated gif file (video only)</li>\n  <li>`jpg` - jpg image file (image only)</li>\n  <li>`png` - png image file (image only)</li>\n  <li>`webp` - webp image file (image only)</li>\n  <li>`tif` - tif image file (image only)</li>\n  <li>`mp3` - mp3 audio file (audio only)</li>\n  <li>`wav` - wav audio file (audio only)</li>\n</ul>",
            "enum": [
              "mp4",
              "webm",
              "mov",
              "avi",
              "mkv",
              "ogv",
              "wmv",
              "avif",
              "gif",
              "mp3",
              "wav",
              "jpg",
              "png",
              "webp",
              "tif"
            ],
            "type": "string",
            "example": "mp4"
          },
          "size": {
            "$ref": "#/components/schemas/Size"
          },
          "fit": {
            "description": "Set how the rendition should be scaled and cropped when using a size with an aspect ratio that is different from the source. Fit applies to both videos and images. <ul>\n  <li>`crop` <b>(default)</b> - scale the rendition to fill the output area while maintaining the aspect ratio. The rendition will be cropped if it exceeds the bounds of the output.</li>\n  <li>`cover` - stretch the rendition to fill the output without maintaining the aspect ratio.</li>\n  <li>`contain` - fit the entire rendition within the output while maintaining the original aspect ratio.</li>\n</ul>",
            "enum": [
              "cover",
              "contain",
              "crop"
            ],
            "type": "string",
            "example": "crop"
          },
          "resolution": {
            "description": "The preset output resolution of the video or image. This is a convenience property that sets the width and height based on industry standard resolutions. The following resolutions are available: <ul>\n  <li>`preview` - 512px x 288px</li>\n  <li>`mobile` - 640px x 360px</li>\n  <li>`sd` - 1024px x 576px</li>\n  <li>`hd` - 1280px x 720px</li>\n  <li>`fhd` - 1920px x 1080px</li>\n</ul>",
            "enum": [
              "preview",
              "mobile",
              "sd",
              "hd",
              "fhd"
            ],
            "example": "hd"
          },
          "quality": {
            "description": "Adjust the visual quality of the video or image. The higher the value, the sharper the image quality but the larger file size and slower the encoding process. When specifying quality, the goal is to balance file size vs visual quality.\nQuality is a value between 1 and 100 where 1 is fully compressed with low image quality and 100 is close to lossless with high image quality and large file size. Sane values are between 50 and 75. Omitting the quality parameter will result in an asset optimised for encoding speed, file size and visual quality.",
            "type": "integer",
            "minimum": 1,
            "maximum": 100,
            "example": 70
          },
          "fps": {
            "description": "Change the frame rate of a video asset. <ul>\n  <li>`12` - 12fps</li>\n  <li>`15` - 15fps</li>\n  <li>`24` - 24fps</li>\n  <li>`23.976` - 23.976fps</li>\n  <li>`25` (default) - 25fps</li>\n  <li>`29.97` - 29.97fps</li>\n  <li>`30` - 30fps</li>\n  <li>`48` - 48fps</li>\n  <li>`50` - 50fps</li>\n  <li>`59.94` - 59.94fps</li>\n  <li>`60` - 60fps</li>\n</ul>",
            "enum": [
              12,
              15,
              23.976,
              24,
              25,
              29.97,
              30,
              48,
              50,
              59.94,
              60
            ],
            "type": "number",
            "example": 25
          },
          "speed": {
            "$ref": "#/components/schemas/Speed"
          },
          "keyframeInterval": {
            "description": "The keyframe interval is useful to optimize playback, seeking and smoother scrubbing in browsers. The value sets the number of frames between a keyframe. The lower the number, the larger the file. Try a value between 10 and 25 for smooth scrubbing.",
            "type": "integer",
            "minimum": 1,
            "maximum": 300,
            "example": 10
          },
          "fixOffset": {
            "description": "Attempt to fix audio and video sync issues. This can occur when recording devices, such as smartphones and\n web cams use compression techniques like [Variable Frame Rate](https://en.wikipedia.org/wiki/Variable_frame_rate)\n (VFR) which can cause audio and video to go out of sync. This option will attempt to fix the sync issues.",
            "type": "boolean",
            "example": true
          },
          "fixRotation": {
            "description": "Automatically reset the rotation of the video based on the orientation metadata in the video file. This is useful for videos recorded on smartphones that have orientation metadata that may not work correctly with certain video editing software, including the Shotstack Edit API.",
            "type": "boolean",
            "example": true
          },
          "enhance": {
            "description": "Apply media processing enhancements to the rendition using a third party provider. Currently only Dolby.io audio enhancement is available.",
            "type": "object",
            "$ref": "#/components/schemas/Enhancements"
          },
          "filename": {
            "description": "A custom name for the generated rendition file. The file extension will be automatically added based on the format of the rendition. If no filename is provided, the rendition ID will be used.",
            "type": "string",
            "example": "my-video"
          }
        },
        "type": "object"
      },
      "Transcription": {
        "description": "Generate a transcription of the audio in the video. The transcription can be output as a file in SRT or VTT format.",
        "properties": {
          "format": {
            "description": "The output format of the transcription file. The following formats are available: <ul>\n  <li>`srt` - SRT captions format</li>\n  <li>`vtt` - VTT captions format</li>\n</ul>",
            "enum": [
              "srt",
              "vtt"
            ],
            "type": "string",
            "example": "vtt"
          }
        },
        "type": "object"
      },
      "Speed": {
        "description": "Set the playback speed of a video or audio file. Allows you to preserve the pitch of the audio so that it is sped up without sounding too high pitched or too low.",
        "properties": {
          "speed": {
            "description": "Adjust the playback speed of the video clip between 0 (paused) and 10 (10x normal speed) where 1 is normal speed (defaults to 1). Set values less than 1 to slow down the playback speed, i.e. set speed to 0.5 to play back at half speed. Set values greater than 1 to speed up the playback speed, i.e. set speed to 2 to play back at double speed.",
            "type": "number",
            "format": "float",
            "minimum": 0,
            "maximum": 10,
            "example": 1.5
          },
          "preservePitch": {
            "description": "Set whether to adjust the audio pitch or not. Set to false to make the audio sound higher or lower pitched. By default the pitch is preserved.",
            "type": "boolean",
            "example": false
          }
        },
        "type": "object"
      },
      "Enhancements": {
        "type": "object",
        "description": "Enhancements that can be applied to a rendition. Currently only supports the Dolby audio enhancement.",
        "properties": {
          "audio": {
            "description": "An audio enhancement that can be applied to the audio content of the rendition.",
            "$ref": "#/components/schemas/AudioEnhancement"
          }
        }
      },
      "AudioEnhancement": {
        "type": "object",
        "description": "An audio enhancement that can be applied to the audio content of a rendition.\nThe following providers are available: <ul>\n  <li><a href=\"#tocs_dolbyenhancement\">DolbyEnhancement</a></li>\n</ul>",
        "discriminator": {
          "propertyName": "enhancement"
        },
        "oneOf": [
          {
            "$ref": "#/components/schemas/DolbyEnhancement"
          }
        ],
        "additionalProperties": false
      },
      "DolbyEnhancement": {
        "description": "Dolby.io audio enhancement provider. Credentials are required and must be added via the  [dashboard](https://dashboard.shotstack.io/integrations/dolby), not in the request.",
        "properties": {
          "provider": {
            "description": "The enhancement provider to use - set to `dolby` for Dolby.",
            "type": "string",
            "default": "dolby",
            "example": "dolby"
          },
          "options": {
            "description": "Additional Dolby configuration and features.",
            "$ref": "#/components/schemas/DolbyEnhancementOptions"
          }
        },
        "type": "object",
        "required": [
          "provider",
          "options"
        ]
      },
      "DolbyEnhancementOptions": {
        "description": "Options for the Dolby.io audio enhancement provider.",
        "properties": {
          "preset": {
            "description": "The preset to use for the audio enhancement. The following presets are available: <ul>\n  <li>`conference` - Conference</li>\n  <li>`interview` - Interview</li>\n  <li>`lecture` - Lecture</li>\n  <li>`meeting` - Meeting</li>\n  <li>`mobile_phone` - Mobile Phone</li>\n  <li>`music` - Music</li>\n  <li>`podcast` - Podcast</li>\n  <li>`studio` - Studio</li>\n  <li>`voice_over` - Voice Over</li>\n</ul>",
            "enum": [
              "conference",
              "interview",
              "lecture",
              "meeting",
              "mobile_phone",
              "music",
              "podcast",
              "studio",
              "voice_over"
            ],
            "type": "string",
            "example": "studio"
          }
        },
        "required": [
          "preset"
        ]
      },
      "Transfer": {
        "description": "The asset URL to fetch and transfer to a destination.",
        "properties": {
          "url": {
            "description": "The file URL to fetch and transfer.",
            "type": "string",
            "example": "https://s3-ap-northeast-1.amazonaws.com/my-bucket/video.mp4"
          },
          "id": {
            "description": "An identifier for the asset which must be provided by the client. The identifier does not need to be unique.",
            "type": "string",
            "example": "018e8937-5015-75ee-aab6-03f214981133"
          },
          "destinations": {
            "description": "Specify the storage locations and hosting services to send the file to.",
            "type": "array",
            "items": {
              "$ref": "#/components/schemas/Destinations"
            }
          }
        },
        "required": [
          "url",
          "id",
          "destinations"
        ],
        "type": "object"
      },
      "QueuedResponse": {
        "description": "The response received after a [render request](#render-asset) or [template render](#render-template) is submitted. The render task is queued for rendering and a unique render id is returned.",
        "properties": {
          "success": {
            "description": "`true` if successfully queued, else `false`.",
            "type": "boolean",
            "example": true
          },
          "message": {
            "description": "`Created`, `Bad Request` or an error message.",
            "type": "string",
            "example": "Created"
          },
          "response": {
            "description": "`QueuedResponseData` or an error message.",
            "$ref": "#/components/schemas/QueuedResponseData"
          }
        },
        "required": [
          "success",
          "message",
          "response"
        ],
        "type": "object"
      },
      "QueuedResponseData": {
        "description": "The response data returned with the [QueuedResponse](#tocs_queuedresponse).",
        "properties": {
          "message": {
            "description": "Success response message or error details.",
            "type": "string",
            "example": "Render Successfully Queued"
          },
          "id": {
            "description": "The id of the render task in UUID format.",
            "type": "string",
            "example": "2abd5c11-0f3d-4c6d-ba20-235fc9b8e8b7"
          }
        },
        "required": [
          "message",
          "id"
        ],
        "type": "object"
      },
      "RenderResponse": {
        "description": "The response received after a [render status request](#get-render-status) is submitted. The response includes  details about status of a render and the output URL.",
        "properties": {
          "success": {
            "description": "`true` if status available, else `false`.",
            "type": "boolean",
            "example": true
          },
          "message": {
            "description": "`OK` or an error message.",
            "type": "string",
            "example": "OK"
          },
          "response": {
            "description": "`RenderResponse` or an error message.",
            "$ref": "#/components/schemas/RenderResponseData"
          }
        },
        "required": [
          "success",
          "message",
          "response"
        ],
        "type": "object"
      },
      "RenderResponseData": {
        "description": "The response data returned with the [RenderResponse](#tocs_renderresponse) including status and URL.",
        "properties": {
          "id": {
            "description": "The id of the render task in UUID format.",
            "type": "string",
            "example": "2abd5c11-0f3d-4c6d-ba20-235fc9b8e8b7"
          },
          "owner": {
            "description": "The owner id of the render task.",
            "type": "string",
            "example": "5ca6hu7s9k"
          },
          "plan": {
            "description": "The customer subscription plan.",
            "type": "string",
            "example": "basic"
          },
          "status": {
            "description": "The status of the render task. <ul>\n  <li>`queued` - render is queued waiting to be rendered</li>\n  <li>`fetching` - assets are being fetched</li>\n  <li>`preprocessing` - video assets are being processed for compatibility</li>\n  <li>`rendering` - the asset is being rendered</li>\n  <li>`saving` - the final asset is being saved to storage</li>\n  <li>`done` - the asset is ready to be downloaded</li>\n  <li>`failed` - there was an error rendering the asset</li>\n</ul>",
            "enum": [
              "queued",
              "fetching",
              "preprocessing",
              "rendering",
              "saving",
              "done",
              "failed"
            ],
            "type": "string",
            "example": "done"
          },
          "error": {
            "description": "An error message, only displayed if an error occurred.",
            "type": "string",
            "example": ""
          },
          "duration": {
            "description": "The output video or audio length in seconds.",
            "type": "number",
            "example": 8.5
          },
          "renderTime": {
            "description": "The time taken to render the asset in milliseconds.",
            "type": "number",
            "example": 9433.44
          },
          "url": {
            "description": "The URL of the final asset. This will only be available if status is done. This is a temporary URL and will be deleted after 24 hours. By default all assets are copied to the Shotstack hosting and CDN destination.",
            "type": "string",
            "example": "https://shotstack-api-v1-output.s3-ap-southeast-2.amazonaws.com/5ca6hu7s9k/2abd5c11-0f3d-4c6d-ba20-235fc9b8e8b7.mp4"
          },
          "poster": {
            "description": "The URL of the poster image if requested. This will only be available if status is done.",
            "type": "string",
            "nullable": true,
            "example": "https://shotstack-api-v1-output.s3-ap-southeast-2.amazonaws.com/5ca6hu7s9k/2abd5c11-0f3d-4c6d-ba20-235fc9b8e8b7-poster.jpg"
          },
          "thumbnail": {
            "description": "The URL of the thumbnail image if requested. This will only be available if status is done.",
            "type": "string",
            "nullable": true,
            "example": "https://shotstack-api-v1-output.s3-ap-southeast-2.amazonaws.com/5ca6hu7s9k/2abd5c11-0f3d-4c6d-ba20-235fc9b8e8b7-thumb.jpg"
          },
          "data": {
            "description": "The timeline and output data to be rendered.",
            "$ref": "#/components/schemas/Edit"
          },
          "created": {
            "description": "The time the render task was initially queued.",
            "type": "string",
            "example": "2020-10-30T09:42:29.446Z"
          },
          "updated": {
            "description": "The time the render status was last updated.",
            "type": "string",
            "example": "2020-10-30T09:42:39.168Z"
          }
        },
        "required": [
          "status",
          "id",
          "owner"
        ],
        "type": "object"
      },
      "TemplateResponse": {
        "description": "The response received after a [template](#create-template) is submitted. The template is saved and a unique template id is returned.",
        "properties": {
          "success": {
            "description": "`true` if successfully created, else `false`.",
            "type": "boolean",
            "example": true
          },
          "message": {
            "description": "`Created`, `Bad Request` or an error message.",
            "type": "string",
            "example": "Created"
          },
          "response": {
            "description": "`TemplateResponseData` or an error message.",
            "$ref": "#/components/schemas/TemplateResponseData"
          }
        },
        "required": [
          "success",
          "message",
          "response"
        ],
        "type": "object"
      },
      "TemplateResponseData": {
        "description": "The response data returned with the [TemplateResponse](#tocs_templateresponse).",
        "properties": {
          "message": {
            "description": "Success response message or error details.",
            "type": "string",
            "example": "Template Successfully Created"
          },
          "id": {
            "description": "The unique id of the template in UUID format.",
            "type": "string",
            "example": "f5493c17-d01f-445c-bb49-535fae65f219"
          }
        },
        "required": [
          "message",
          "id"
        ],
        "type": "object"
      },
      "TemplateDataResponse": {
        "description": "The template data including the template name and [Edit](#tocs_edit).",
        "properties": {
          "success": {
            "description": "`true` if successfully returned, else `false`.",
            "type": "boolean",
            "example": true
          },
          "message": {
            "description": "`OK`, `Bad Request` or an error message.",
            "type": "string",
            "example": "OK"
          },
          "response": {
            "description": "`TemplateDataResponseData` or an error message.",
            "$ref": "#/components/schemas/TemplateDataResponseData"
          }
        },
        "required": [
          "success",
          "message",
          "response"
        ],
        "type": "object"
      },
      "TemplateDataResponseData": {
        "description": "The response data returned with the [TemplateDataResponse](#tocs_templatedataresponse).",
        "properties": {
          "id": {
            "description": "The unique id of the template in UUID format.",
            "type": "string",
            "example": "f5493c17-d01f-445c-bb49-535fae65f219"
          },
          "name": {
            "description": "The template name.",
            "type": "string",
            "example": "My template"
          },
          "owner": {
            "description": "The owner id of the templates.",
            "type": "string",
            "example": "5ca6hu7s9k"
          },
          "template": {
            "description": "The [Edit](#tocs_edit) template.",
            "$ref": "#/components/schemas/Edit",
            "example": {
              "$ref": "../../definitions/edit.yaml"
            }
          }
        },
        "required": [
          "id",
          "name",
          "owner",
          "template"
        ],
        "type": "object"
      },
      "TemplateListResponse": {
        "description": "A list of previously saved templates.",
        "properties": {
          "success": {
            "description": "`true` if successfully returned, else `false`.",
            "type": "boolean",
            "example": true
          },
          "message": {
            "description": "`OK`, `Bad Request` or an error message.",
            "type": "string",
            "example": "OK"
          },
          "response": {
            "description": "`TemplateListResponseData` or an error message.",
            "$ref": "#/components/schemas/TemplateListResponseData"
          }
        },
        "required": [
          "success",
          "message",
          "response"
        ],
        "type": "object"
      },
      "TemplateListResponseData": {
        "description": "The response data returned with the [TemplateListResponse](#tocs_templatelistresponse).",
        "properties": {
          "owner": {
            "description": "The owner id of the templates.",
            "type": "string",
            "example": "5ca6hu7s9k"
          },
          "templates": {
            "description": "The list of templates.",
            "type": "array",
            "items": {
              "$ref": "#/components/schemas/TemplateListResponseItem"
            }
          }
        },
        "required": [
          "owner",
          "templates"
        ],
        "type": "object"
      },
      "TemplateListResponseItem": {
        "description": "The individual template item returned with the  [TemplateListResponseData](#tocs_templatelistresponsedata) templates list.",
        "type": "object",
        "properties": {
          "id": {
            "description": "The unique id of the template in UUID format.",
            "type": "string",
            "example": "f5493c17-d01f-445c-bb49-535fae65f219"
          },
          "name": {
            "description": "The template name",
            "type": "string",
            "example": "My template"
          },
          "created": {
            "description": "The time the template was created.",
            "type": "string",
            "example": "2022-06-10T12:50:21.455Z"
          },
          "updated": {
            "description": "The time the template was last updated.",
            "type": "string",
            "example": "2022-06-22T08:24:30.168Z"
          }
        },
        "required": [
          "id",
          "name"
        ]
      },
      "ProbeResponse": {
        "description": "The response received after a [probe request](#inspect-media) is submitted. The probe requests returns data from FFprobe formatted as JSON.",
        "properties": {
          "success": {
            "description": "`true` if media successfully read, else `false`.",
            "type": "boolean",
            "example": true
          },
          "message": {
            "description": "`Created`, `Bad Request` or an error message.",
            "type": "string",
            "example": "Created"
          },
          "response": {
            "description": "The response from FFprobe in JSON format.",
            "type": "object"
          }
        },
        "required": [
          "success",
          "message",
          "response"
        ],
        "type": "object"
      },
      "AssetResponse": {
        "description": "The response returned by the Serve API [get asset](#get-asset) request. Includes details of a hosted video, image, audio file, thumbnail or poster image. The response follows the [json:api](https://jsonapi.org/) specification.",
        "properties": {
          "data": {
            "description": "An asset resource.",
            "$ref": "#/components/schemas/AssetResponseData"
          }
        },
        "required": [
          "data"
        ],
        "type": "object"
      },
      "AssetRenderResponse": {
        "description": "The response returned by the Serve API [get asset by render id](#get-asset-by-render-id) request. The response  is an array of asset resources, including video, image, audio, thumbnail and poster image. The response follows  the [json:api](https://jsonapi.org/) specification.",
        "properties": {
          "data": {
            "type": "array",
            "description": "An array of asset resources grouped by render id.",
            "items": {
              "$ref": "#/components/schemas/AssetResponseData"
            }
          }
        },
        "required": [
          "data"
        ],
        "type": "object"
      },
      "AssetResponseData": {
        "description": "The type of resource (an asset) and attributes of the asset.",
        "properties": {
          "type": {
            "description": "The type of resource, in this case it is an assets.",
            "type": "string",
            "example": "asset"
          },
          "attributes": {
            "description": "The asset attributes including render id, url, filename, file size, etc...",
            "$ref": "#/components/schemas/AssetResponseAttributes"
          }
        },
        "required": [
          "type",
          "attributes"
        ],
        "type": "object"
      },
      "AssetResponseAttributes": {
        "description": "The list of asset attributes and their values.",
        "properties": {
          "id": {
            "description": "The unique id of the hosted asset in UUID format.",
            "type": "string",
            "example": "a4482cbf-e321-42a2-ac8b-947d26886840"
          },
          "owner": {
            "description": "The owner id of the asset.",
            "type": "string",
            "example": "5ca6hu7s9k"
          },
          "region": {
            "description": "The region the asset is hosted, currently only `au` (Australia).",
            "type": "string",
            "example": "au"
          },
          "renderId": {
            "description": "The original render id that created the asset in UUID format. Multiple assets can share the same render id.",
            "type": "string",
            "example": "2abd5c11-0f3d-4c6d-ba20-235fc9b8e8b7"
          },
          "providerId": {
            "description": "The third party id of an asset transferred to an external provider, i.e. Mux, YouTube or S3. If the provider is Shotstack, the providerID is the same as the asset id.",
            "type": "string",
            "example": "a4482cbf-e321-42a2-ac8b-947d26886840"
          },
          "filename": {
            "description": "The asset file name.",
            "type": "string",
            "example": "2abd5c11-0f3d-4c6d-ba20-235fc9b8e8b7.mp4"
          },
          "url": {
            "description": "The asset file name.",
            "type": "string",
            "example": "https://cdn.shotstack.io/au/v1/5ca6hu7s9k/2abd5c11-0f3d-4c6d-ba20-235fc9b8e8b7.mp4"
          },
          "status": {
            "description": "The status of the asset. <ul>\n  <li>`importing` - the asset is being copied to the hosting service</li>\n  <li>`ready` - the asset is ready to be served to users</li>\n  <li>`failed` - the asset failed to copy or delete</li>\n  <li>`deleted` - the asset has been deleted</li>\n</ul>",
            "enum": [
              "importing",
              "ready",
              "failed",
              "deleted"
            ],
            "type": "string",
            "example": "ready"
          },
          "created": {
            "description": "The time the asset was created.",
            "type": "string",
            "example": "2021-06-30T09:42:29.446Z"
          },
          "updated": {
            "description": "The time the asset status was last updated.",
            "type": "string",
            "example": "2021-06-30T09:42:30.168Z"
          }
        },
        "required": [
          "id",
          "owner",
          "status"
        ],
        "type": "object"
      },
      "TransferResponse": {
        "description": "The response returned by the Serve API [transfer asset](#transfer-asset) request. The response includes the ID and transfer status. The response follows the [json:api](https://jsonapi.org/) specification.",
        "properties": {
          "data": {
            "description": "An asset transfer resource.",
            "$ref": "#/components/schemas/TransferResponseData"
          }
        },
        "required": [
          "data"
        ],
        "type": "object"
      },
      "TransferResponseData": {
        "description": "The type of resource (an asset) and the transfer attributes. Returned with [TransferResponse](#tocs_transferresponse).",
        "properties": {
          "type": {
            "description": "The type of resource, in this case it is an asset.",
            "type": "string",
            "example": "asset"
          },
          "attributes": {
            "description": "The attributes of the asset transfer including the status.",
            "$ref": "#/components/schemas/TransferResponseAttributes"
          }
        },
        "required": [
          "data"
        ],
        "type": "object"
      },
      "TransferResponseAttributes": {
        "description": "The transfer request attributes inlcudling the user specified ID and status. Returned with [TransferResponseData](#tocs_transferresponsedata).",
        "properties": {
          "id": {
            "description": "The user provided ID for the asset",
            "type": "string",
            "example": "018e8937-5015-75ee-aab6-03f214981133"
          },
          "owner": {
            "description": "The attributes of the asset transfer including the status.",
            "type": "string",
            "example": "5ca6hu7s9k"
          },
          "status": {
            "description": "The status of the asset transfer. <ul>\n  <li>`queued` - the transfer request has been queued</li>\n  <li>`failed` - the transfer request failed</li>\n</ul>",
            "enum": [
              "queued",
              "failed"
            ],
            "type": "string",
            "example": "queued"
          },
          "created": {
            "description": "The time the asset transfer was created.",
            "type": "string",
            "example": "2023-09-28T11:17:32.226Z"
          }
        },
        "type": "object"
      },
      "QueuedSourceResponse": {
        "description": "The response returned by the Ingest API [fetch source](#fetch-source) request. Includes the id of the source file. The response follows the [json:api](https://jsonapi.org/) specification.",
        "properties": {
          "data": {
            "description": "A source resource.",
            "$ref": "#/components/schemas/QueuedSourceResponseData"
          }
        },
        "required": [
          "data"
        ],
        "type": "object"
      },
      "QueuedSourceResponseData": {
        "description": "The type of resource (a source) and the newly created source id. Returned with [QueuedSourceResponse](#tocs_queuedsourceresponse).",
        "properties": {
          "type": {
            "description": "The type of resource, in this case it is a source.",
            "type": "string",
            "example": "source"
          },
          "id": {
            "description": "The source id.",
            "type": "string",
            "example": "zzytey4v-32km-kq1z-aftr-3kcuqi0brad2"
          }
        },
        "required": [
          "type",
          "id"
        ],
        "type": "object"
      },
      "SourceListResponse": {
        "description": "A list of all ingested source files fetched or uploaded to a users account.",
        "properties": {
          "data": {
            "description": "An array of ingested source files.",
            "type": "array",
            "items": {
              "$ref": "#/components/schemas/SourceResponseData"
            }
          }
        },
        "required": [
          "data"
        ],
        "type": "object"
      },
      "SourceResponse": {
        "description": "The response returned by the Ingest API [get source](#get-source) request. Includes details of the ingested source file. The response follows the [json:api](https://jsonapi.org/) specification.",
        "properties": {
          "data": {
            "description": "A source resource.",
            "$ref": "#/components/schemas/SourceResponseData"
          }
        },
        "required": [
          "data"
        ],
        "type": "object"
      },
      "SourceResponseData": {
        "description": "The type of resource (a source), it's id and attributes of the source file.",
        "properties": {
          "type": {
            "description": "The type of resource, in this case it is a source.",
            "type": "string",
            "example": "source"
          },
          "id": {
            "description": "The source file id.",
            "type": "string",
            "example": "zzytey4v-32km-kq1z-aftr-3kcuqi0brad2"
          },
          "attributes": {
            "description": "The source attributes including its url, status, width, height, duration, etc...",
            "$ref": "#/components/schemas/SourceResponseAttributes"
          }
        },
        "required": [
          "type",
          "id",
          "attributes"
        ],
        "type": "object"
      },
      "SourceResponseAttributes": {
        "description": "The id and attributes of the source file.",
        "properties": {
          "id": {
            "description": "The source id.",
            "type": "string",
            "example": "zzytey4v-32km-kq1z-aftr-3kcuqi0brad2"
          },
          "owner": {
            "description": "The owner id of the source file.",
            "type": "string",
            "example": "5ca6hu7s9k"
          },
          "input": {
            "description": "The original URL of an ingested source file, where it originated. Only displayed for files ingested using the [fetch source](#fetch-source) endpoint. Not displayed for direct uploads.",
            "type": "string",
            "example": "https://github.com/shotstack/test-media/raw/main/captioning/scott-ko.mp4"
          },
          "source": {
            "description": "The URL of the source file hosted by Shotstack. The file at the URL can be used by the Edit API. Source file URL's consist of a base URL (AWS bucket), owner id, source id and a file named source. The extension varies depending on the type of file ingested.",
            "type": "string",
            "example": "https://shotstack-ingest-api-v1-sources.s3.ap-southeast-2.amazonaws.com/5ca6hu7s9k/zzytey4v-32km-kq1z-aftr-3kcuqi0brad2/source.mp4"
          },
          "status": {
            "description": "The status of the source file ingestion task. <ul>\n  <li>`queued` - ingestion task is queued waiting to be fetched</li>\n  <li>`importing` - the source file is being downloaded</li>\n  <li>`ready` - the source file has been ingested and stored</li>\n  <li>`failed` - there was an error ingesting the source file</li>\n  <li>`deleted` - the source file has been deleted</li>\n</ul>",
            "example": "ready",
            "enum": [
              "queued",
              "importing",
              "ready",
              "failed",
              "deleted",
              "overwritten"
            ]
          },
          "outputs": {
            "description": "The list of outputs generated from the source file. Currently supports renditions which are versions of the source file with different transformations applied.",
            "$ref": "#/components/schemas/OutputsResponse"
          },
          "width": {
            "description": "The width in pixels of the ingested source file, if a video or image.",
            "type": "integer",
            "example": 1920
          },
          "height": {
            "description": "The height in pixels of the ingested source file, if a video or image.",
            "type": "integer",
            "example": 1080
          },
          "duration": {
            "description": "The duration in seconds of the ingested source file, if a video or audio file.",
            "type": "number",
            "format": "float",
            "example": 25.86
          },
          "fps": {
            "description": "The frame rate in frames per second of the source file, if a video file.",
            "type": "number",
            "format": "float",
            "example": 23.967
          },
          "created": {
            "description": "The time the ingestion task was initially queued.",
            "type": "string",
            "example": "2023-01-02T01:47:18.973Z"
          },
          "updated": {
            "description": "The time the ingestion status was last updated.",
            "type": "string",
            "example": "2023-01-02T01:47:37.260Z"
          }
        },
        "required": [
          "id",
          "owner"
        ],
        "type": "object"
      },
      "OutputsResponse": {
        "description": "The list of outputs generated from the source file. Currently supports renditions which are versions of the source file with different transformations applied.",
        "properties": {
          "renditions": {
            "description": "The list of renditions generated from the source file.",
            "type": "array",
            "items": {
              "$ref": "#/components/schemas/RenditionResponseAttributes"
            }
          }
        },
        "type": "object"
      },
      "RenditionResponseAttributes": {
        "description": "The id and attributes of the generated rendition file.",
        "properties": {
          "id": {
            "description": "The rendition id.",
            "type": "string",
            "example": "zzyaqh5d-0jjq-va0n-aajo-3zwlje2q3uqd"
          },
          "status": {
            "description": "The status of the rendition transformation task. <ul>\n  <li>`waiting` - rendition task is waiting for source file to become available</li>\n  <li>`queued` - rendition task is queued waiting to be processed</li>\n  <li>`processing` - the rendition is being processed</li>\n  <li>`ready` - the rendition is ready to be downloaded</li>\n  <li>`failed` - there was an error creating the rendition</li>\n  <li>`deleted` - the rendition has been deleted</li>\n</ul>",
            "example": "ready",
            "enum": [
              "queued",
              "importing",
              "ready",
              "failed",
              "deleted",
              "overwritten"
            ]
          },
          "url": {
            "description": "The URL of the rendition file hosted by Shotstack. The file at the URL can be used by the Edit API. Source file URL's consist of a base URL (AWS bucket), owner id, source id and a file name with the rendition id and extension.",
            "type": "string",
            "example": "https://shotstack-ingest-api-v1-sources.s3.ap-southeast-2.amazonaws.com/5ca6hu7s9k/zzytey4v-32km-kq1z-aftr-3kcuqi0brad2/zzyaqh5d-0jjq-va0n-aajo-3zwlje2q3uqd.mp4"
          },
          "executionTime": {
            "description": "The time in milliseconds it took to process the rendition.",
            "type": "number",
            "format": "float",
            "example": 4120.36
          },
          "transformation": {
            "description": "The transformation applied to the source file to create the rendition.",
            "$ref": "#/components/schemas/Rendition"
          },
          "width": {
            "description": "The width in pixels of the ingested source file, if a video or image.",
            "type": "integer",
            "example": 1920
          },
          "height": {
            "description": "The height in pixels of the ingested source file, if a video or image.",
            "type": "integer",
            "example": 1080
          },
          "duration": {
            "description": "The duration in seconds of the ingested source file, if a video or audio file.",
            "type": "number",
            "format": "float",
            "example": 25.86
          },
          "fps": {
            "description": "The frame rate in frames per second of the source file, if a video file.",
            "type": "number",
            "format": "float",
            "example": 23.967
          }
        },
        "required": [
          "id",
          "owner"
        ],
        "type": "object"
      },
      "UploadResponse": {
        "description": "The response returned by the Ingest API [direct upload](#direct-upload) request. Includes the id of the file and the signed url to send the binary file to. The response follows the [json:api](https://jsonapi.org/) specification.",
        "properties": {
          "data": {
            "description": "An upload resource.",
            "$ref": "#/components/schemas/UploadResponseData"
          }
        },
        "required": [
          "data"
        ],
        "type": "object"
      },
      "UploadResponseData": {
        "description": "The type of resource (an upload), it's id and attributes of the upload request.",
        "properties": {
          "type": {
            "description": "The type of resource, in this case it is an upload.",
            "type": "string",
            "example": "upload"
          },
          "id": {
            "description": "The upload file id.",
            "type": "string",
            "example": "zzytey4v-32km-kq1z-aftr-3kcuqi0brad2"
          },
          "attributes": {
            "description": "The upload attributes including the signed URL.",
            "$ref": "#/components/schemas/UploadResponseAttributes"
          }
        },
        "required": [
          "type",
          "id",
          "attributes"
        ],
        "type": "object"
      },
      "UploadResponseAttributes": {
        "description": "The id and attributes of the upload file including the signed URL to send the binary file data to.",
        "properties": {
          "id": {
            "description": "The source id.",
            "type": "string",
            "example": "zzytey4v-32km-kq1z-aftr-3kcuqi0brad2"
          },
          "url": {
            "description": "The signed URL to use in a PUT request to send the binary file to.",
            "type": "string",
            "example": "https://shotstack-ingest-api-v1-sources.s3.ap-southeast-2.amazonaws.com/5ca6hu7s9k/zzytey4v-32km-kq1z-aftr-3kcuqi0brad2/source?AWSAccessKeyId=ASIAWJV3NVDML6LI2ZVG&Expires=1672819007&Signature=9M76gBA%2FghV8ZYvGTp3alo5Ya%2Fk%3D&x-amz-acl=public-read&x-amz-security-token=IQoJb3JpZ2luX2VjEJ%2F%2F%2F%2F%2F%2F%2F%2F%2F%2F%2FwEaDmFwLXNvdXRoZWFzdC0yIkcwRQIhAJHrqMCRk7ACXuXmJICTkADbx11e2wUP0RZ3KRdN3%2BGwAiAYt%2FIHlM8rcplCgvsvqH%2BBtSrlCW%2BUeZstwuwgq45Y3iqbAwjo%2F%2F%2F%2F%2F%2F%2F%2F%2F%2F8BEAMaDDQzMzExNTIxMTk5MiIMtFX%2Bb1klptd8HXQvKu8Cd0xpHti7cRWkPxQz3foEWSYu1U8In64Qsi6TFK%2BmiOhVnUkHK%2BLSIwF1yQFMK2oTzVXwrEFEsyqlf%2FPZ9j3OL9eLlB7G5AqbC16hjXXR3psipp0dE2uvCV2d%2BIDYgcf1MKmzE0FDfN4wyTez%2Bd%2F3y8nfAtWB%2FCB0wU8AtKNUI7hwNbCYMgCa8QUeAH2UOrriDaN379vKXK%2B1XVplhhuvLX3aC1D0St2U6lC5yaDtZbLGEyymQPhgpp5Mam6jVzHVXXX4%2FvkQSNWbDMuMFd13fqdut9uMPkq4vhZgCmyQsibC7AnrK21QopLY%2F0vhHvPUhSkzRDKjiQou0vDrbTnT4yJLY5RCs9G65yisi6jbyUUbJTUgrME7PPPihs7kM5L%2FGjhmKqe9rNPuzKC%2FISRcmVtAPleX7tqPI7H%2BuEIobS%2FE%2B1jV4oNUFQA549prw3546FXds%2FgCLKRU%2BvxUyi2yKS8U0QC%2FNLMg2p9c81%2BaDCCqxtSdBjqdAcxGASzQwP6hHbfzC2hlnxn%2Bnf4MddgpIPFxvpV18Sy9vUYSU52mrsZK%2FxPcxrg1AM94v0aaW%2FaRE1ESTF2hXJrAJZkDNDPEBQBmcP3ylj4Bf5MsP%2FCspFoF6TvXZPYkH1lSlWHT8OTOugLji7%2F9qb9a6bKzFJqvcS0EiT7v5LCOMOpVA%2FAg9RM0yerN4Zot%2FREHgCSzajNII9Xio%2F0%3D"
          },
          "expires": {
            "description": "The time the upload request will expire. The signed URL will expire after one hour. Upload must complete within one hour.",
            "type": "string",
            "example": "2023-01-02T02:47:37.260Z"
          }
        },
        "required": [
          "id",
          "url",
          "expires"
        ],
        "type": "object"
      },
      "IngestErrorResponse": {
        "description": "Error response data for validation and other errors returned by the Ingest API.",
        "properties": {
          "errors": {
            "description": "An array of errors.",
            "type": "array",
            "items": {
              "$ref": "#/components/schemas/IngestErrorResponseData"
            }
          }
        },
        "required": [
          "errors"
        ],
        "type": "object"
      },
      "IngestErrorResponseData": {
        "description": "Individual errors returned by the Ingest API.",
        "properties": {
          "status": {
            "description": "The http status code.",
            "type": "string",
            "example": "400"
          },
          "title": {
            "description": "A short summary of the error.",
            "type": "string",
            "example": "Validation Error"
          },
          "detail": {
            "description": "A detailed description of the error.",
            "type": "string",
            "example": "\"url\" is required"
          }
        },
        "required": [
          "status",
          "title",
          "detail"
        ],
        "type": "object"
      }
    },
    "responses": {},
    "parameters": {},
    "examples": {},
    "requestBodies": {},
    "headers": {},
    "securitySchemes": {
      "DeveloperKey": {
        "description": "Set the **x-api-key** header with your provided key for the correct environment (v1 or stage). Include the header in all calls to the API that are secured with a key.",
        "type": "apiKey",
        "in": "header",
        "name": "x-api-key"
      }
    },
    "links": {},
    "callbacks": {}
  }
}