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

# Submit a render job

> Enqueue a new render job on the GPU engine. The job moves through queued → processing → completed / failed asynchronously. Attach a webhook URL or register workspace-level webhooks to receive status updates.



## OpenAPI

````yaml /openapi.json post /v1/renders
openapi: 3.1.0
info:
  title: Framelane API
  description: >
    Framelane renders video and runs AI media tasks from a single declarative
    request.


    ### Authentication

    Send your API key as a bearer token: `Authorization: Bearer fl_live_...`.


    ### Core workflow

    1. **Get media in.** Pass any publicly accessible URL directly, or `POST
    /v1/uploads` to
       get a signed URL, then `PUT` your file to it.
    2. **Submit one JSON payload.** `POST /v1/renders` composes a whole scene
    (canvas +
       `elements[]` + `transitions[]`) in a single request; `POST /v1/tasks/{type}` runs an AI
       operation (remove-background, gaze-redirect, super-resolution, transcribe).
    3. **Wait for completion.** Jobs are async: poll `GET
    /v1/{renders|tasks}/{id}` or register
       a webhook. Statuses end in `completed`, `failed`, or `cancelled`.
    4. **Fetch the result.** `GET /v1/{renders|tasks}/{id}/download` redirects
    to a short-lived
       signed URL for the output artifact.

    ### Discovering what's possible

    Call **`GET /v1/capabilities`** (no auth) for the machine-readable catalog
    of every effect,

    motion, transition, format, element type, and task parameter — each flagged
    with whether the

    renderer supports it, plus all numeric ranges and rate limits. Validate
    against it before

    submitting to avoid `422`s.


    ### Idempotency

    `POST` endpoints accept an `Idempotency-Key` header. The same key with the
    same body replays

    the original response (`200`); with a different body it returns `409
    Conflict`.


    ### Errors

    Every error has the shape `{"error": {"code", "message", "details"}}`. The
    machine-readable

    `code` (e.g. `source_not_found`, `quota_exceeded`, `codec_unsupported`) is
    stable — branch on

    it to self-correct.
  version: dev
servers:
  - url: https://api.framelane.io
    description: Production
security: []
tags:
  - name: capabilities
    description: Discover supported features, formats, and limits.
  - name: renders
    description: Compose and render video from a declarative timeline.
  - name: tasks
    description: >-
      Run AI media operations: background removal, gaze redirect,
      super-resolution, transcription.
  - name: uploads
    description: Get signed URLs to upload source media into Framelane storage.
  - name: webhooks
    description: Subscribe to job lifecycle events with signed delivery.
  - name: workspace
    description: Manage your workspace, usage, and assets.
  - name: api-keys
    description: Create and revoke API keys.
  - name: auth
    description: Session sync for the first-party console.
  - name: signup
    description: Create a workspace and verify email.
  - name: billing
    description: Manage your subscription and billing portal.
  - name: system
    description: Health, readiness, and version probes.
paths:
  /v1/renders:
    post:
      tags:
        - renders
      summary: Submit a render job
      description: >-
        Enqueue a new render job on the GPU engine. The job moves through queued
        → processing → completed / failed asynchronously. Attach a webhook URL
        or register workspace-level webhooks to receive status updates.
      operationId: create_render
      parameters:
        - name: Idempotency-Key
          in: header
          required: false
          schema:
            anyOf:
              - type: string
              - type: 'null'
            title: Idempotency-Key
      requestBody:
        required: true
        content:
          application/json:
            schema:
              $ref: '#/components/schemas/RenderRequest'
      responses:
        '200':
          description: Idempotent replay — same Idempotency-Key reused.
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/JobOut'
        '202':
          description: Successful Response
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/JobOut'
        '401':
          description: Missing or invalid API key.
        '409':
          description: Idempotency conflict (different body for the same key).
        '422':
          description: Validation error or unsupported feature.
        '429':
          description: Rate limit exceeded.
      security:
        - ApiKey: []
components:
  schemas:
    RenderRequest:
      properties:
        width:
          anyOf:
            - type: integer
              maximum: 8192
              minimum: 16
            - type: 'null'
          title: Width
          description: >-
            Output width in pixels. Must be set together with `height` or both
            omitted.
          example: 1920
        height:
          anyOf:
            - type: integer
              maximum: 8192
              minimum: 16
            - type: 'null'
          title: Height
          description: >-
            Output height in pixels. Must be set together with `width` or both
            omitted.
          example: 1080
        duration:
          anyOf:
            - type: number
              exclusiveMinimum: 0
            - type: 'null'
          title: Duration
          description: >-
            Total composition duration in seconds. Inferred from elements when
            omitted.
          example: 15
        frame_rate:
          anyOf:
            - type: integer
              maximum: 240
              minimum: 1
            - type: 'null'
          title: Frame Rate
          description: Frames per second. Defaults to 30 when omitted.
          example: 30
        output_format:
          $ref: '#/components/schemas/OutputFormat'
          description: Container and codec for the output file.
          default: mp4
          example: mp4
        output_filename:
          anyOf:
            - type: string
            - type: 'null'
          title: Output Filename
          description: >-
            Custom filename for the artifact (without extension). Auto-generated
            when omitted.
          example: my-render
        background_color:
          type: string
          pattern: ^#([0-9a-fA-F]{6}|[0-9a-fA-F]{8})$
          title: Background Color
          description: RGBA background color in hex format (#RRGGBBAA).
          default: '#000000ff'
          example: '#000000ff'
        background_image_url:
          anyOf:
            - type: string
              maxLength: 2083
              minLength: 1
              format: uri
            - type: 'null'
          title: Background Image Url
          description: URL of an image to use as the composition background.
          example: https://cdn.example.com/bg.jpg
        alpha:
          type: boolean
          title: Alpha
          description: >-
            When true, produce an alpha-channel (transparent background) output.
            Requires `output_format=webm` or `output_format=mov`.
          default: false
          example: false
        elements:
          items:
            oneOf:
              - $ref: '#/components/schemas/VideoElement'
              - $ref: '#/components/schemas/AudioElement'
              - $ref: '#/components/schemas/TextElement'
              - $ref: '#/components/schemas/ImageElement'
              - $ref: '#/components/schemas/CompositionElement'
            discriminator:
              propertyName: type
              mapping:
                audio:
                  $ref: '#/components/schemas/AudioElement'
                composition:
                  $ref: '#/components/schemas/CompositionElement'
                image:
                  $ref: '#/components/schemas/ImageElement'
                text:
                  $ref: '#/components/schemas/TextElement'
                video:
                  $ref: '#/components/schemas/VideoElement'
          type: array
          title: Elements
          description: Ordered list of timeline elements (video, image, text, audio, etc.).
        transitions:
          items:
            $ref: '#/components/schemas/Transition'
          type: array
          title: Transitions
          description: Transition effects applied between consecutive elements.
        metadata:
          additionalProperties:
            type: string
          type: object
          title: Metadata
          description: Arbitrary key-value pairs echoed back in all webhook payloads.
          example:
            project_id: proj_123
        webhook_url:
          anyOf:
            - type: string
              maxLength: 2083
              minLength: 1
              format: uri
            - type: 'null'
          title: Webhook Url
          description: >-
            Per-request webhook URL. Overrides workspace-level webhooks for this
            job only. Receives `render.completed`, `render.failed`, and progress
            events.
          example: https://app.example.com/hooks/framelane
        ingest_external:
          anyOf:
            - type: boolean
            - type: 'null'
          title: Ingest External
          description: >-
            Controls handling of source URLs that are not already hosted by
            Framelane. When `true`, such public files are copied into Framelane
            storage before rendering: the job starts in the `ingesting` state
            and moves to `queued` once the copy completes (you receive an
            `asset.ready` webhook per file). When `false`, the URL is passed
            straight to the renderer (the legacy behavior; video/audio still
            require an explicit `out_point`). Defaults to the workspace setting
            when omitted.
          example: true
      type: object
      title: RenderRequest
      description: >-
        Body for ``POST /v1/renders``.


        Defines the composition to render: dimensions, output format, timeline
        elements,

        and optional transitions. The render engine produces a single video
        artifact.
    JobOut:
      properties:
        id:
          type: string
          title: Id
          description: 'Unique job ID. Prefix indicates type: `render_` or `task_`.'
          example: render_01J8QR2K5VKDGN2T4FBM3CZYX7
        kind:
          $ref: '#/components/schemas/JobKind'
          description: Whether this is a `render` or a `task`.
          example: render
        task_type:
          anyOf:
            - $ref: '#/components/schemas/TaskType'
            - type: 'null'
          description: For `task` jobs only — the specific AI operation.
          example: transcribe
        workspace_id:
          type: string
          title: Workspace Id
          description: ID of the workspace that owns this job.
          example: ws_01J8QR2K5VKDGN2T4FBM3CZYX8
        status:
          $ref: '#/components/schemas/JobStatus'
          description: >-
            Current lifecycle state: `queued` → `processing` → `completed` /
            `failed` / `cancelled`.
          example: queued
        progress_percent:
          type: integer
          maximum: 100
          minimum: 0
          title: Progress Percent
          description: 0–100 progress indicator updated by the render engine.
          default: 0
          example: 0
        progress_stage:
          anyOf:
            - $ref: '#/components/schemas/ProgressStage'
            - type: 'null'
          description: Current processing phase within a job.
          example: compositing
        output:
          anyOf:
            - $ref: '#/components/schemas/JobOutput'
            - type: 'null'
          description: >-
            Populated once `status == completed`. Contains the signed artifact
            URL.
        error:
          anyOf:
            - $ref: '#/components/schemas/JobError'
            - type: 'null'
          description: Populated when `status == failed`. Contains a structured error code.
        metadata:
          additionalProperties: true
          type: object
          title: Metadata
          description: >-
            Caller-supplied key-value pairs echoed back on every webhook and
            response.
          example:
            project_id: proj_123
            user_ref: usr_abc
        created_at:
          type: string
          format: date-time
          title: Created At
          description: ISO-8601 UTC timestamp when the job was created.
        updated_at:
          type: string
          format: date-time
          title: Updated At
          description: ISO-8601 UTC timestamp of the last status change.
        completed_at:
          anyOf:
            - type: string
              format: date-time
            - type: 'null'
          title: Completed At
          description: ISO-8601 UTC timestamp when the job reached a terminal state.
      type: object
      required:
        - id
        - kind
        - workspace_id
        - status
        - created_at
        - updated_at
      title: JobOut
      description: A render job or AI task.
    OutputFormat:
      type: string
      enum:
        - mp4
        - webm
        - mov
        - gif
        - png
        - jpg
      title: OutputFormat
      description: >-
        Values:

        - `mp4` — H.264 MP4 video — the default, widely compatible delivery
        format.

        - `webm` — VP9 WebM video — supports a transparent (alpha) background.

        - `mov` — QuickTime MOV — roadmap; not yet emitted by the renderer.

        - `gif` — Animated GIF — roadmap; not yet emitted by the renderer.

        - `png` — Single-frame PNG still — roadmap; not yet emitted by the
        renderer.

        - `jpg` — Single-frame JPEG still — roadmap; not yet emitted by the
        renderer.
      x-enumDescriptions:
        mp4: H.264 MP4 video — the default, widely compatible delivery format.
        webm: VP9 WebM video — supports a transparent (alpha) background.
        mov: QuickTime MOV — roadmap; not yet emitted by the renderer.
        gif: Animated GIF — roadmap; not yet emitted by the renderer.
        png: Single-frame PNG still — roadmap; not yet emitted by the renderer.
        jpg: Single-frame JPEG still — roadmap; not yet emitted by the renderer.
    VideoElement:
      properties:
        lut_url:
          anyOf:
            - type: string
              maxLength: 2083
              minLength: 1
              format: uri
            - type: 'null'
          title: Lut Url
        lut_intensity:
          type: number
          maximum: 100
          minimum: 0
          title: Lut Intensity
          default: 100
        brightness:
          type: number
          title: Brightness
          default: 0
        contrast:
          type: number
          title: Contrast
          default: 0
        saturation:
          type: number
          title: Saturation
          default: 0
        exposure:
          type: number
          title: Exposure
          default: 0
        sharpness:
          type: number
          title: Sharpness
          default: 0
        blur:
          type: number
          title: Blur
          default: 0
        noise:
          type: number
          title: Noise
          default: 0
        vignette:
          type: number
          title: Vignette
          default: 0
        hue_rotate:
          type: number
          title: Hue Rotate
          default: 0
        crop_top:
          type: number
          maximum: 1
          minimum: 0
          title: Crop Top
          default: 0
        crop_bottom:
          type: number
          maximum: 1
          minimum: 0
          title: Crop Bottom
          default: 0
        crop_left:
          type: number
          maximum: 1
          minimum: 0
          title: Crop Left
          default: 0
        crop_right:
          type: number
          maximum: 1
          minimum: 0
          title: Crop Right
          default: 0
        border_radius:
          anyOf:
            - type: integer
            - type: number
            - type: string
          title: Border Radius
          default: 0
        border_color:
          anyOf:
            - type: string
              pattern: ^#([0-9a-fA-F]{6}|[0-9a-fA-F]{8})$
            - type: 'null'
          title: Border Color
        border_width:
          anyOf:
            - type: integer
            - type: number
            - type: string
          title: Border Width
          default: 0
        shadow_color:
          anyOf:
            - type: string
              pattern: ^#([0-9a-fA-F]{6}|[0-9a-fA-F]{8})$
            - type: 'null'
          title: Shadow Color
        shadow_blur:
          anyOf:
            - type: integer
            - type: number
            - type: string
          title: Shadow Blur
          default: 0
        shadow_x:
          anyOf:
            - type: integer
            - type: number
            - type: string
          title: Shadow X
          default: 0
        shadow_y:
          anyOf:
            - type: integer
            - type: number
            - type: string
          title: Shadow Y
          default: 0
        x:
          anyOf:
            - type: integer
            - type: number
            - type: string
          title: X
          default: 50%
        'y':
          anyOf:
            - type: integer
            - type: number
            - type: string
          title: 'Y'
          default: 50%
        width:
          anyOf:
            - type: integer
            - type: number
            - type: string
          title: Width
          default: 100%
        height:
          anyOf:
            - type: integer
            - type: number
            - type: string
          title: Height
          default: 100%
        aspect_ratio:
          anyOf:
            - type: number
            - type: 'null'
          title: Aspect Ratio
        x_anchor:
          anyOf:
            - type: integer
            - type: number
            - type: string
          title: X Anchor
          default: 50%
        y_anchor:
          anyOf:
            - type: integer
            - type: number
            - type: string
          title: Y Anchor
          default: 50%
        x_rotation:
          anyOf:
            - type: integer
            - type: number
            - type: string
          title: X Rotation
          default: 0°
        y_rotation:
          anyOf:
            - type: integer
            - type: number
            - type: string
          title: Y Rotation
          default: 0°
        z_rotation:
          anyOf:
            - type: integer
            - type: number
            - type: string
          title: Z Rotation
          default: 0°
        x_scale:
          anyOf:
            - type: integer
            - type: number
            - type: string
          title: X Scale
          default: 100%
        y_scale:
          anyOf:
            - type: integer
            - type: number
            - type: string
          title: Y Scale
          default: 100%
        flip_horizontal:
          type: boolean
          title: Flip Horizontal
          default: false
        flip_vertical:
          type: boolean
          title: Flip Vertical
          default: false
        opacity:
          type: number
          maximum: 100
          minimum: 0
          title: Opacity
          default: 100
        z_index:
          anyOf:
            - type: integer
            - type: 'null'
          title: Z Index
        blend_mode:
          $ref: '#/components/schemas/BlendMode'
          default: none
        clip:
          type: boolean
          title: Clip
          default: false
        color_overlay:
          anyOf:
            - type: string
              pattern: ^#([0-9a-fA-F]{6}|[0-9a-fA-F]{8})$
            - type: 'null'
          title: Color Overlay
        type:
          type: string
          const: video
          title: Type
          default: video
        id:
          anyOf:
            - type: string
            - type: 'null'
          title: Id
          description: >-
            Unique identifier for this element. **Required on image elements** —
            an empty or missing ID causes the image to be silently skipped by
            the renderer. Recommended on all elements that are referenced by a
            transition.
          example: clip_01
        name:
          anyOf:
            - type: string
            - type: 'null'
          title: Name
          description: Optional human-readable label. Not used by the renderer.
        track:
          anyOf:
            - type: integer
              maximum: 255
              minimum: 0
            - type: 'null'
          title: Track
          description: >-
            Timeline track index (0–255). Informational only; not used by the
            renderer.
        time:
          anyOf:
            - type: number
              minimum: 0
            - type: 'null'
          title: Time
          description: >-
            When this element starts on the output timeline, in seconds.
            Defaults to `0` when omitted.
          example: 0
        visible:
          type: boolean
          title: Visible
          description: >-
            Set to `false` to skip this element without removing it from the
            request.
          default: true
        source_url:
          type: string
          maxLength: 2083
          minLength: 1
          format: uri
          title: Source Url
          description: URL of the video file. Must be accessible by the renderer.
          example: https://cdn.example.com/clip.mp4
        in_point:
          anyOf:
            - type: number
              minimum: 0
            - type: 'null'
          title: In Point
          description: >-
            In point — seconds into the source file to start playing from.
            Defaults to `0`.
          example: 0
        out_point:
          anyOf:
            - type: number
              exclusiveMinimum: 0
            - type: 'null'
          title: Out Point
          description: >-
            Out point — seconds into the source file to stop playing. Defaults
            to end of source when omitted. Controls clip length on the timeline.
          example: 6
        speed:
          type: number
          maximum: 4
          minimum: 0.25
          title: Speed
          description: >-
            Playback speed. `1.0` = normal speed, `2.0` = 2× (half duration),
            `0.5` = half speed (double duration).
          default: 1
          example: 1
        volume:
          type: number
          maximum: 100
          minimum: 0
          title: Volume
          description: >-
            Embedded audio volume as a percentage (0–100). Affects only the
            audio track inside this video clip.
          default: 100
          example: 100
        fade_in_duration:
          type: number
          title: Fade In Duration
          description: Duration in seconds of a linear audio fade-in at the clip's start.
          default: 0
          example: 0
        fade_out_duration:
          type: number
          title: Fade Out Duration
          description: Duration in seconds of a linear audio fade-out at the clip's end.
          default: 0
          example: 0
        effects:
          items:
            $ref: '#/components/schemas/Effect'
          type: array
          title: Effects
          default: []
        motion:
          items:
            $ref: '#/components/schemas/Motion'
          type: array
          title: Motion
          default: []
      type: object
      required:
        - source_url
      title: VideoElement
    AudioElement:
      properties:
        type:
          type: string
          const: audio
          title: Type
          default: audio
        id:
          anyOf:
            - type: string
            - type: 'null'
          title: Id
          description: >-
            Unique identifier for this element. **Required on image elements** —
            an empty or missing ID causes the image to be silently skipped by
            the renderer. Recommended on all elements that are referenced by a
            transition.
          example: clip_01
        name:
          anyOf:
            - type: string
            - type: 'null'
          title: Name
          description: Optional human-readable label. Not used by the renderer.
        track:
          anyOf:
            - type: integer
              maximum: 255
              minimum: 0
            - type: 'null'
          title: Track
          description: >-
            Timeline track index (0–255). Informational only; not used by the
            renderer.
        time:
          anyOf:
            - type: number
              minimum: 0
            - type: 'null'
          title: Time
          description: >-
            When this element starts on the output timeline, in seconds.
            Defaults to `0` when omitted.
          example: 0
        visible:
          type: boolean
          title: Visible
          description: >-
            Set to `false` to skip this element without removing it from the
            request.
          default: true
        source_url:
          type: string
          maxLength: 2083
          minLength: 1
          format: uri
          title: Source Url
          description: URL of the audio file. Must be accessible by the renderer.
          example: https://cdn.example.com/music.mp3
        in_point:
          anyOf:
            - type: number
              minimum: 0
            - type: 'null'
          title: In Point
          description: >-
            In point — seconds into the source file to start from. Defaults to
            `0`.
          example: 0
        out_point:
          anyOf:
            - type: number
              exclusiveMinimum: 0
            - type: 'null'
          title: Out Point
          description: >-
            Out point — seconds into the source file to stop. Defaults to end of
            source when omitted. Controls clip length on the timeline.
          example: 30
        speed:
          type: number
          maximum: 4
          minimum: 0.25
          title: Speed
          description: Playback speed. `1.0` = normal speed, `2.0` = 2× speed.
          default: 1
          example: 1
        volume:
          type: number
          maximum: 100
          exclusiveMinimum: 0
          title: Volume
          description: >-
            Audio volume as a percentage (1–100). **Must be greater than 0** —
            the renderer silently drops audio streams with `volume <= 0`.
          default: 100
          example: 100
        fade_in_duration:
          type: number
          title: Fade In Duration
          description: Duration in seconds of a linear audio fade-in at the clip's start.
          default: 0
          example: 0
        fade_out_duration:
          type: number
          title: Fade Out Duration
          description: Duration in seconds of a linear audio fade-out at the clip's end.
          default: 0
          example: 0
      type: object
      required:
        - source_url
      title: AudioElement
    TextElement:
      properties:
        border_radius:
          anyOf:
            - type: integer
            - type: number
            - type: string
          title: Border Radius
          default: 0
        border_color:
          anyOf:
            - type: string
              pattern: ^#([0-9a-fA-F]{6}|[0-9a-fA-F]{8})$
            - type: 'null'
          title: Border Color
        border_width:
          anyOf:
            - type: integer
            - type: number
            - type: string
          title: Border Width
          default: 0
        shadow_color:
          anyOf:
            - type: string
              pattern: ^#([0-9a-fA-F]{6}|[0-9a-fA-F]{8})$
            - type: 'null'
          title: Shadow Color
        shadow_blur:
          anyOf:
            - type: integer
            - type: number
            - type: string
          title: Shadow Blur
          default: 0
        shadow_x:
          anyOf:
            - type: integer
            - type: number
            - type: string
          title: Shadow X
          default: 0
        shadow_y:
          anyOf:
            - type: integer
            - type: number
            - type: string
          title: Shadow Y
          default: 0
        x:
          anyOf:
            - type: integer
            - type: number
            - type: string
          title: X
          default: 50%
        'y':
          anyOf:
            - type: integer
            - type: number
            - type: string
          title: 'Y'
          default: 50%
        width:
          anyOf:
            - type: integer
            - type: number
            - type: string
          title: Width
          default: 100%
        height:
          anyOf:
            - type: integer
            - type: number
            - type: string
          title: Height
          default: 100%
        aspect_ratio:
          anyOf:
            - type: number
            - type: 'null'
          title: Aspect Ratio
        x_anchor:
          anyOf:
            - type: integer
            - type: number
            - type: string
          title: X Anchor
          default: 50%
        y_anchor:
          anyOf:
            - type: integer
            - type: number
            - type: string
          title: Y Anchor
          default: 50%
        x_rotation:
          anyOf:
            - type: integer
            - type: number
            - type: string
          title: X Rotation
          default: 0°
        y_rotation:
          anyOf:
            - type: integer
            - type: number
            - type: string
          title: Y Rotation
          default: 0°
        z_rotation:
          anyOf:
            - type: integer
            - type: number
            - type: string
          title: Z Rotation
          default: 0°
        x_scale:
          anyOf:
            - type: integer
            - type: number
            - type: string
          title: X Scale
          default: 100%
        y_scale:
          anyOf:
            - type: integer
            - type: number
            - type: string
          title: Y Scale
          default: 100%
        flip_horizontal:
          type: boolean
          title: Flip Horizontal
          default: false
        flip_vertical:
          type: boolean
          title: Flip Vertical
          default: false
        opacity:
          type: number
          maximum: 100
          minimum: 0
          title: Opacity
          default: 100
        z_index:
          anyOf:
            - type: integer
            - type: 'null'
          title: Z Index
        blend_mode:
          $ref: '#/components/schemas/BlendMode'
          default: none
        clip:
          type: boolean
          title: Clip
          default: false
        color_overlay:
          anyOf:
            - type: string
              pattern: ^#([0-9a-fA-F]{6}|[0-9a-fA-F]{8})$
            - type: 'null'
          title: Color Overlay
        type:
          type: string
          const: text
          title: Type
          default: text
        id:
          anyOf:
            - type: string
            - type: 'null'
          title: Id
          description: >-
            Unique identifier for this element. **Required on image elements** —
            an empty or missing ID causes the image to be silently skipped by
            the renderer. Recommended on all elements that are referenced by a
            transition.
          example: clip_01
        name:
          anyOf:
            - type: string
            - type: 'null'
          title: Name
          description: Optional human-readable label. Not used by the renderer.
        track:
          anyOf:
            - type: integer
              maximum: 255
              minimum: 0
            - type: 'null'
          title: Track
          description: >-
            Timeline track index (0–255). Informational only; not used by the
            renderer.
        time:
          anyOf:
            - type: number
              minimum: 0
            - type: 'null'
          title: Time
          description: >-
            When this element starts on the output timeline, in seconds.
            Defaults to `0` when omitted.
          example: 0
        visible:
          type: boolean
          title: Visible
          description: >-
            Set to `false` to skip this element without removing it from the
            request.
          default: true
        duration:
          type: number
          exclusiveMinimum: 0
          title: Duration
          description: >-
            **Required.** Duration in seconds the text is visible. Omitting this
            field produces a zero-length window and the element will not appear
            in the render.
          example: 5
        text:
          type: string
          minLength: 1
          title: Text
          description: The text content to render.
          example: Hello World
        font_family:
          type: string
          title: Font Family
          description: Font family name. Must be available to the renderer.
          default: Inter
          example: Inter
        font_size:
          type: number
          exclusiveMinimum: 0
          title: Font Size
          description: Font size in pixels.
          default: 16
          example: 48
        font_weight:
          type: integer
          maximum: 900
          minimum: 100
          title: Font Weight
          description: Font weight (100–900). `400` = regular, `700` = bold.
          default: 400
          example: 400
        font_style:
          type: string
          enum:
            - normal
            - italic
            - bold
            - bolditalic
          title: Font Style
          description: Font style variant.
          default: normal
        text_color:
          type: string
          pattern: ^#([0-9a-fA-F]{6}|[0-9a-fA-F]{8})$
          title: Text Color
          description: Text fill color as a hex string.
          default: '#ffffff'
          example: '#ffffff'
        text_align:
          type: string
          enum:
            - left
            - center
            - right
          title: Text Align
          description: Horizontal text alignment.
          default: center
        text_decoration:
          type: string
          enum:
            - none
            - underline
            - strikethrough
          title: Text Decoration
          default: none
        tracking:
          type: number
          title: Tracking
          description: >-
            Letter spacing (tracking) in pixels. Positive values add space
            between characters.
          default: 0
          example: 0
        leading:
          type: number
          title: Leading
          description: >-
            Line height (leading) as a multiplier of font size. `1.2` = 20%
            taller than the font size.
          default: 1.2
          example: 1.2
        stroke_color:
          anyOf:
            - type: string
              pattern: ^#([0-9a-fA-F]{6}|[0-9a-fA-F]{8})$
            - type: 'null'
          title: Stroke Color
          description: >-
            Outline color. Set together with `stroke_width` to enable text
            outlines.
          example: '#000000'
        stroke_width:
          type: number
          title: Stroke Width
          description: >-
            Outline width in pixels. Has no effect unless `stroke_color` is also
            set.
          default: 0
        background_color:
          anyOf:
            - type: string
              pattern: ^#([0-9a-fA-F]{6}|[0-9a-fA-F]{8})$
            - type: 'null'
          title: Background Color
          description: Background fill color. Only rendered when `background` is `true`.
        background_opacity:
          type: number
          maximum: 100
          minimum: 0
          title: Background Opacity
          default: 100
        x_padding:
          anyOf:
            - type: integer
            - type: number
            - type: string
          title: X Padding
          default: 0
        y_padding:
          anyOf:
            - type: integer
            - type: number
            - type: string
          title: Y Padding
          default: 0
        background:
          type: boolean
          title: Background
          description: >-
            Solid color box behind the full text block. Set `background_color`
            to choose the color.
          default: false
        stroke:
          type: boolean
          title: Stroke
          description: >-
            Outline-only mode — draws the glyph stroke with no fill. Requires
            `stroke_color` and `stroke_width`. When `false`, setting
            `stroke_color` + `stroke_width` gives fill + stroke (outlined).
          default: false
        shadow:
          type: boolean
          title: Shadow
          description: Built-in drop shadow.
          default: false
        motion:
          items:
            $ref: '#/components/schemas/Motion'
          type: array
          title: Motion
          default: []
        word_animation:
          anyOf:
            - $ref: '#/components/schemas/WordAnimation'
            - type: 'null'
          description: >-
            Word-level animation style with per-word timestamps. When provided,
            this takes precedence over the `animation_preset` field.
          example:
            style: glow
            words:
              - end: 0.5
                start: 0
                text: Hello
        text_wrap:
          type: string
          enum:
            - wrap
            - nowrap
          title: Text Wrap
          default: wrap
        animation_preset:
          anyOf:
            - type: string
            - type: 'null'
          title: Animation Preset
          description: >-
            Renderer animation shorthand (e.g. `'typewriter'`). Use `motion[]`
            for structured control. Ignored when `word_animation` is set.
      type: object
      required:
        - duration
        - text
      title: TextElement
    ImageElement:
      properties:
        lut_url:
          anyOf:
            - type: string
              maxLength: 2083
              minLength: 1
              format: uri
            - type: 'null'
          title: Lut Url
        lut_intensity:
          type: number
          maximum: 100
          minimum: 0
          title: Lut Intensity
          default: 100
        brightness:
          type: number
          title: Brightness
          default: 0
        contrast:
          type: number
          title: Contrast
          default: 0
        saturation:
          type: number
          title: Saturation
          default: 0
        exposure:
          type: number
          title: Exposure
          default: 0
        sharpness:
          type: number
          title: Sharpness
          default: 0
        blur:
          type: number
          title: Blur
          default: 0
        noise:
          type: number
          title: Noise
          default: 0
        vignette:
          type: number
          title: Vignette
          default: 0
        hue_rotate:
          type: number
          title: Hue Rotate
          default: 0
        crop_top:
          type: number
          maximum: 1
          minimum: 0
          title: Crop Top
          default: 0
        crop_bottom:
          type: number
          maximum: 1
          minimum: 0
          title: Crop Bottom
          default: 0
        crop_left:
          type: number
          maximum: 1
          minimum: 0
          title: Crop Left
          default: 0
        crop_right:
          type: number
          maximum: 1
          minimum: 0
          title: Crop Right
          default: 0
        border_radius:
          anyOf:
            - type: integer
            - type: number
            - type: string
          title: Border Radius
          default: 0
        border_color:
          anyOf:
            - type: string
              pattern: ^#([0-9a-fA-F]{6}|[0-9a-fA-F]{8})$
            - type: 'null'
          title: Border Color
        border_width:
          anyOf:
            - type: integer
            - type: number
            - type: string
          title: Border Width
          default: 0
        shadow_color:
          anyOf:
            - type: string
              pattern: ^#([0-9a-fA-F]{6}|[0-9a-fA-F]{8})$
            - type: 'null'
          title: Shadow Color
        shadow_blur:
          anyOf:
            - type: integer
            - type: number
            - type: string
          title: Shadow Blur
          default: 0
        shadow_x:
          anyOf:
            - type: integer
            - type: number
            - type: string
          title: Shadow X
          default: 0
        shadow_y:
          anyOf:
            - type: integer
            - type: number
            - type: string
          title: Shadow Y
          default: 0
        x:
          anyOf:
            - type: integer
            - type: number
            - type: string
          title: X
          default: 50%
        'y':
          anyOf:
            - type: integer
            - type: number
            - type: string
          title: 'Y'
          default: 50%
        width:
          anyOf:
            - type: integer
            - type: number
            - type: string
          title: Width
          default: 100%
        height:
          anyOf:
            - type: integer
            - type: number
            - type: string
          title: Height
          default: 100%
        aspect_ratio:
          anyOf:
            - type: number
            - type: 'null'
          title: Aspect Ratio
        x_anchor:
          anyOf:
            - type: integer
            - type: number
            - type: string
          title: X Anchor
          default: 50%
        y_anchor:
          anyOf:
            - type: integer
            - type: number
            - type: string
          title: Y Anchor
          default: 50%
        x_rotation:
          anyOf:
            - type: integer
            - type: number
            - type: string
          title: X Rotation
          default: 0°
        y_rotation:
          anyOf:
            - type: integer
            - type: number
            - type: string
          title: Y Rotation
          default: 0°
        z_rotation:
          anyOf:
            - type: integer
            - type: number
            - type: string
          title: Z Rotation
          default: 0°
        x_scale:
          anyOf:
            - type: integer
            - type: number
            - type: string
          title: X Scale
          default: 100%
        y_scale:
          anyOf:
            - type: integer
            - type: number
            - type: string
          title: Y Scale
          default: 100%
        flip_horizontal:
          type: boolean
          title: Flip Horizontal
          default: false
        flip_vertical:
          type: boolean
          title: Flip Vertical
          default: false
        opacity:
          type: number
          maximum: 100
          minimum: 0
          title: Opacity
          default: 100
        z_index:
          anyOf:
            - type: integer
            - type: 'null'
          title: Z Index
        blend_mode:
          $ref: '#/components/schemas/BlendMode'
          default: none
        clip:
          type: boolean
          title: Clip
          default: false
        color_overlay:
          anyOf:
            - type: string
              pattern: ^#([0-9a-fA-F]{6}|[0-9a-fA-F]{8})$
            - type: 'null'
          title: Color Overlay
        type:
          type: string
          const: image
          title: Type
          default: image
        id:
          type: string
          minLength: 1
          title: Id
          description: >-
            **Required.** Unique identifier for this image. An empty or missing
            ID causes the image to be silently skipped by the renderer.
          example: logo_01
        name:
          anyOf:
            - type: string
            - type: 'null'
          title: Name
          description: Optional human-readable label. Not used by the renderer.
        track:
          anyOf:
            - type: integer
              maximum: 255
              minimum: 0
            - type: 'null'
          title: Track
          description: >-
            Timeline track index (0–255). Informational only; not used by the
            renderer.
        time:
          anyOf:
            - type: number
              minimum: 0
            - type: 'null'
          title: Time
          description: >-
            When this element starts on the output timeline, in seconds.
            Defaults to `0` when omitted.
          example: 0
        visible:
          type: boolean
          title: Visible
          description: >-
            Set to `false` to skip this element without removing it from the
            request.
          default: true
        duration:
          type: number
          exclusiveMinimum: 0
          title: Duration
          description: >-
            **Required.** Duration in seconds the image is visible. Omitting
            this field produces a zero-length window and the image will not
            appear in the render.
          example: 5
        source_url:
          type: string
          maxLength: 2083
          minLength: 1
          format: uri
          title: Source Url
          description: URL of the image file (PNG, JPG, WebP, GIF).
          example: https://cdn.example.com/logo.png
        effects:
          items:
            $ref: '#/components/schemas/Effect'
          type: array
          title: Effects
          default: []
        motion:
          items:
            $ref: '#/components/schemas/Motion'
          type: array
          title: Motion
          default: []
      type: object
      required:
        - id
        - duration
        - source_url
      title: ImageElement
    CompositionElement:
      properties:
        border_radius:
          anyOf:
            - type: integer
            - type: number
            - type: string
          title: Border Radius
          default: 0
        border_color:
          anyOf:
            - type: string
              pattern: ^#([0-9a-fA-F]{6}|[0-9a-fA-F]{8})$
            - type: 'null'
          title: Border Color
        border_width:
          anyOf:
            - type: integer
            - type: number
            - type: string
          title: Border Width
          default: 0
        shadow_color:
          anyOf:
            - type: string
              pattern: ^#([0-9a-fA-F]{6}|[0-9a-fA-F]{8})$
            - type: 'null'
          title: Shadow Color
        shadow_blur:
          anyOf:
            - type: integer
            - type: number
            - type: string
          title: Shadow Blur
          default: 0
        shadow_x:
          anyOf:
            - type: integer
            - type: number
            - type: string
          title: Shadow X
          default: 0
        shadow_y:
          anyOf:
            - type: integer
            - type: number
            - type: string
          title: Shadow Y
          default: 0
        x:
          anyOf:
            - type: integer
            - type: number
            - type: string
          title: X
          default: 50%
        'y':
          anyOf:
            - type: integer
            - type: number
            - type: string
          title: 'Y'
          default: 50%
        width:
          anyOf:
            - type: integer
            - type: number
            - type: string
          title: Width
          default: 100%
        height:
          anyOf:
            - type: integer
            - type: number
            - type: string
          title: Height
          default: 100%
        aspect_ratio:
          anyOf:
            - type: number
            - type: 'null'
          title: Aspect Ratio
        x_anchor:
          anyOf:
            - type: integer
            - type: number
            - type: string
          title: X Anchor
          default: 50%
        y_anchor:
          anyOf:
            - type: integer
            - type: number
            - type: string
          title: Y Anchor
          default: 50%
        x_rotation:
          anyOf:
            - type: integer
            - type: number
            - type: string
          title: X Rotation
          default: 0°
        y_rotation:
          anyOf:
            - type: integer
            - type: number
            - type: string
          title: Y Rotation
          default: 0°
        z_rotation:
          anyOf:
            - type: integer
            - type: number
            - type: string
          title: Z Rotation
          default: 0°
        x_scale:
          anyOf:
            - type: integer
            - type: number
            - type: string
          title: X Scale
          default: 100%
        y_scale:
          anyOf:
            - type: integer
            - type: number
            - type: string
          title: Y Scale
          default: 100%
        flip_horizontal:
          type: boolean
          title: Flip Horizontal
          default: false
        flip_vertical:
          type: boolean
          title: Flip Vertical
          default: false
        opacity:
          type: number
          maximum: 100
          minimum: 0
          title: Opacity
          default: 100
        z_index:
          anyOf:
            - type: integer
            - type: 'null'
          title: Z Index
        blend_mode:
          $ref: '#/components/schemas/BlendMode'
          default: none
        clip:
          type: boolean
          title: Clip
          default: false
        color_overlay:
          anyOf:
            - type: string
              pattern: ^#([0-9a-fA-F]{6}|[0-9a-fA-F]{8})$
            - type: 'null'
          title: Color Overlay
        type:
          type: string
          const: composition
          title: Type
          default: composition
        id:
          anyOf:
            - type: string
            - type: 'null'
          title: Id
          description: >-
            Unique identifier for this element. **Required on image elements** —
            an empty or missing ID causes the image to be silently skipped by
            the renderer. Recommended on all elements that are referenced by a
            transition.
          example: clip_01
        name:
          anyOf:
            - type: string
            - type: 'null'
          title: Name
          description: Optional human-readable label. Not used by the renderer.
        track:
          anyOf:
            - type: integer
              maximum: 255
              minimum: 0
            - type: 'null'
          title: Track
          description: >-
            Timeline track index (0–255). Informational only; not used by the
            renderer.
        time:
          anyOf:
            - type: number
              minimum: 0
            - type: 'null'
          title: Time
          description: >-
            When this element starts on the output timeline, in seconds.
            Defaults to `0` when omitted.
          example: 0
        visible:
          type: boolean
          title: Visible
          description: >-
            Set to `false` to skip this element without removing it from the
            request.
          default: true
        elements:
          items:
            oneOf:
              - $ref: '#/components/schemas/VideoElement'
              - $ref: '#/components/schemas/AudioElement'
              - $ref: '#/components/schemas/TextElement'
              - $ref: '#/components/schemas/ImageElement'
              - $ref: '#/components/schemas/CompositionElement'
            discriminator:
              propertyName: type
              mapping:
                audio:
                  $ref: '#/components/schemas/AudioElement'
                composition:
                  $ref: '#/components/schemas/CompositionElement'
                image:
                  $ref: '#/components/schemas/ImageElement'
                text:
                  $ref: '#/components/schemas/TextElement'
                video:
                  $ref: '#/components/schemas/VideoElement'
          type: array
          minItems: 1
          title: Elements
      type: object
      required:
        - elements
      title: CompositionElement
      description: >-
        [TODO] renderer Compound clips (roadmap). Currently rejected by
        translator.
    Transition:
      properties:
        type:
          $ref: '#/components/schemas/TransitionType'
          description: Transition effect applied between elements.
          example: fade
        duration:
          type: number
          exclusiveMinimum: 0
          title: Duration
          description: Transition duration in seconds.
          example: 0.5
        from_id:
          anyOf:
            - type: string
            - type: 'null'
          title: From Id
          description: ID of the outgoing element (omit for the very first transition).
          example: video_01
        to_id:
          anyOf:
            - type: string
            - type: 'null'
          title: To Id
          description: ID of the incoming element (omit for the very last transition).
          example: video_02
        z_index:
          anyOf:
            - type: integer
            - type: 'null'
          title: Z Index
          description: Z-stack position of the transition layer.
          example: 1
      type: object
      required:
        - type
        - duration
      title: Transition
    JobKind:
      type: string
      enum:
        - render
        - task
      title: JobKind
    TaskType:
      type: string
      enum:
        - remove_background
        - gaze_redirect
        - super_resolution
        - transcribe
      title: TaskType
      description: >-
        The 4 task types exposed by the public API.


        Renderer tasks (remove_background, gaze_redirect, super_resolution) are

        dispatched via the Redis broker; transcribe is dispatched via
        AssemblyAI.


        Values:

        - `remove_background` — AI background removal — outputs media with a
        transparent background.

        - `gaze_redirect` — AI gaze redirection — adjusts on-screen eyes to face
        the camera.

        - `super_resolution` — AI upscaling — increases resolution by a 1–4×
        factor.

        - `transcribe` — Speech-to-text transcription (via AssemblyAI) with
        optional analysis.
      x-enumDescriptions:
        remove_background: AI background removal — outputs media with a transparent background.
        gaze_redirect: AI gaze redirection — adjusts on-screen eyes to face the camera.
        super_resolution: AI upscaling — increases resolution by a 1–4× factor.
        transcribe: Speech-to-text transcription (via AssemblyAI) with optional analysis.
    JobStatus:
      type: string
      enum:
        - ingesting
        - queued
        - processing
        - completed
        - failed
        - cancelled
      title: JobStatus
      description: >-
        Values:

        - `ingesting` — External source files are being copied into Framelane
        storage.

        - `queued` — Accepted and waiting for a worker to pick it up.

        - `processing` — Actively rendering or processing.

        - `completed` — Finished successfully; the output artifact is available.

        - `failed` — Terminated with an error (see `error`).

        - `cancelled` — Cancelled by the caller before completion.
      x-enumDescriptions:
        ingesting: External source files are being copied into Framelane storage.
        queued: Accepted and waiting for a worker to pick it up.
        processing: Actively rendering or processing.
        completed: Finished successfully; the output artifact is available.
        failed: Terminated with an error (see `error`).
        cancelled: Cancelled by the caller before completion.
    ProgressStage:
      type: string
      enum:
        - downloading
        - compositing
        - encoding
        - uploading
      title: ProgressStage
      description: |-
        Values:
        - `downloading` — Fetching source media.
        - `compositing` — Compositing the scene on the GPU.
        - `encoding` — Encoding the output video.
        - `uploading` — Uploading the finished artifact to storage.
      x-enumDescriptions:
        downloading: Fetching source media.
        compositing: Compositing the scene on the GPU.
        encoding: Encoding the output video.
        uploading: Uploading the finished artifact to storage.
    JobOutput:
      properties:
        url:
          anyOf:
            - type: string
            - type: 'null'
          title: Url
          description: CDN URL to the completed artifact.
          example: https://cdn-user.framelane.io/render_01J.../output.mp4
        width:
          anyOf:
            - type: integer
            - type: 'null'
          title: Width
          description: Output video width in pixels.
          example: 1920
        height:
          anyOf:
            - type: integer
            - type: 'null'
          title: Height
          description: Output video height in pixels.
          example: 1080
        duration:
          anyOf:
            - type: number
            - type: 'null'
          title: Duration
          description: Output duration in seconds.
          example: 15.3
        size_bytes:
          anyOf:
            - type: integer
            - type: 'null'
          title: Size Bytes
          description: Artifact file size in bytes.
          example: 12582912
      type: object
      title: JobOutput
    JobError:
      properties:
        code:
          $ref: '#/components/schemas/ErrorCode'
          description: Machine-readable error code.
          example: invalid_source
        message:
          type: string
          title: Message
          description: Human-readable error description.
          example: Source URL returned 404.
      type: object
      required:
        - code
        - message
      title: JobError
    BlendMode:
      type: string
      enum:
        - none
        - multiply
        - screen
        - overlay
        - darken
        - lighten
        - color_dodge
        - color_burn
        - hard_light
        - soft_light
      title: BlendMode
      description: >-
        Values:

        - `none` — Normal compositing (source-over). The only supported mode
        today.

        - `multiply` — Multiply blend — darkens by multiplying layer colors.
        Roadmap.

        - `screen` — Screen blend — lightens by inverting, multiplying,
        inverting. Roadmap.

        - `overlay` — Overlay blend — multiply in shadows, screen in highlights.
        Roadmap.

        - `darken` — Darken blend — keeps the darker of the two layers per
        channel. Roadmap.

        - `lighten` — Lighten blend — keeps the lighter of the two layers per
        channel. Roadmap.

        - `color_dodge` — Color-dodge blend — brightens the base toward the
        blend color. Roadmap.

        - `color_burn` — Color-burn blend — darkens the base toward the blend
        color. Roadmap.

        - `hard_light` — Hard-light blend — overlay with layers swapped.
        Roadmap.

        - `soft_light` — Soft-light blend — a gentler hard-light. Roadmap.
      x-enumDescriptions:
        none: Normal compositing (source-over). The only supported mode today.
        multiply: Multiply blend — darkens by multiplying layer colors. Roadmap.
        screen: Screen blend — lightens by inverting, multiplying, inverting. Roadmap.
        overlay: Overlay blend — multiply in shadows, screen in highlights. Roadmap.
        darken: >-
          Darken blend — keeps the darker of the two layers per channel.
          Roadmap.
        lighten: >-
          Lighten blend — keeps the lighter of the two layers per channel.
          Roadmap.
        color_dodge: >-
          Color-dodge blend — brightens the base toward the blend color.
          Roadmap.
        color_burn: Color-burn blend — darkens the base toward the blend color. Roadmap.
        hard_light: Hard-light blend — overlay with layers swapped. Roadmap.
        soft_light: Soft-light blend — a gentler hard-light. Roadmap.
    Effect:
      properties:
        type:
          $ref: '#/components/schemas/EffectType'
        intensity:
          type: number
          maximum: 100
          minimum: 0
          title: Intensity
          default: 50
        chroma_settings:
          anyOf:
            - $ref: '#/components/schemas/ChromaKeyProps'
            - type: 'null'
      type: object
      required:
        - type
      title: Effect
    Motion:
      properties:
        type:
          $ref: '#/components/schemas/MotionType'
        time:
          type: number
          minimum: 0
          title: Time
          description: >-
            Absolute start time on the output timeline in seconds. For entrances
            and loops set this to the element's `time`. For exits set this to
            element `time + duration − motion duration`.
        duration:
          type: number
          exclusiveMinimum: 0
          title: Duration
          description: How long the animation runs in seconds.
        easing:
          $ref: '#/components/schemas/Easing'
          default: ease_in_out
        reversed:
          type: boolean
          title: Reversed
          default: false
        scope:
          $ref: '#/components/schemas/MotionScope'
          default: element
        delay:
          type: number
          title: Delay
          default: 0
        loop:
          type: boolean
          title: Loop
          default: false
      type: object
      required:
        - type
        - time
        - duration
      title: Motion
    WordAnimation:
      properties:
        style:
          $ref: '#/components/schemas/WordAnimationStyle'
        words:
          items:
            $ref: '#/components/schemas/Word'
          type: array
          minItems: 1
          title: Words
      type: object
      required:
        - style
        - words
      title: WordAnimation
    TransitionType:
      type: string
      enum:
        - cross_dissolve
        - dip_to_black
        - dip_to_white
        - wipe_left
        - wipe_right
        - wipe_up
        - wipe_down
        - diagonal_wipe
        - barn_doors_horizontal
        - barn_doors_vertical
        - iris
        - page_turn
        - cross_zoom
        - gradient_wipe
        - band_wipe
        - box_wipe
      title: TransitionType
      description: >-
        Values:

        - `cross_dissolve` — Cross-dissolve — fades one clip into the next.

        - `dip_to_black` — Dips through black between clips.

        - `dip_to_white` — Dips through white between clips.

        - `wipe_left` — Wipes the next clip in from the right to the left.

        - `wipe_right` — Wipes the next clip in from the left to the right.

        - `wipe_up` — Wipes the next clip in from the bottom upward.

        - `wipe_down` — Wipes the next clip in from the top downward.

        - `diagonal_wipe` — Wipes across on a diagonal split.

        - `barn_doors_horizontal` — Two halves part horizontally like barn
        doors.

        - `barn_doors_vertical` — Two halves part vertically like barn doors.

        - `iris` — Circular iris (bullseye) open/close between clips.

        - `page_turn` — Page-flip / page-curl reveal.

        - `cross_zoom` — Zoom-blur push from one clip into the next.

        - `gradient_wipe` — Soft gradient-driven dissolve wipe.

        - `band_wipe` — Interleaved stripes wipe the next clip in.

        - `box_wipe` — Rectangular box grows to reveal the next clip.
      x-enumDescriptions:
        cross_dissolve: Cross-dissolve — fades one clip into the next.
        dip_to_black: Dips through black between clips.
        dip_to_white: Dips through white between clips.
        wipe_left: Wipes the next clip in from the right to the left.
        wipe_right: Wipes the next clip in from the left to the right.
        wipe_up: Wipes the next clip in from the bottom upward.
        wipe_down: Wipes the next clip in from the top downward.
        diagonal_wipe: Wipes across on a diagonal split.
        barn_doors_horizontal: Two halves part horizontally like barn doors.
        barn_doors_vertical: Two halves part vertically like barn doors.
        iris: Circular iris (bullseye) open/close between clips.
        page_turn: Page-flip / page-curl reveal.
        cross_zoom: Zoom-blur push from one clip into the next.
        gradient_wipe: Soft gradient-driven dissolve wipe.
        band_wipe: Interleaved stripes wipe the next clip in.
        box_wipe: Rectangular box grows to reveal the next clip.
    ErrorCode:
      type: string
      enum:
        - invalid_source
        - source_not_found
        - source_too_large
        - asset_not_ready
        - codec_unsupported
        - decode_failed
        - encode_failed
        - timeout
        - out_of_memory
        - gpu_error
        - upload_failed
        - provider_error
        - ingest_failed
        - internal
        - cancelled
      title: ErrorCode
      description: >-
        Structured error codes surfaced on Job.error_code.


        Values:

        - `invalid_source` — A source URL was malformed or inaccessible.

        - `source_not_found` — A source URL returned 404.

        - `source_too_large` — A source file exceeded the maximum allowed size.

        - `asset_not_ready` — A referenced asset was still ingesting when the
        job ran.

        - `codec_unsupported` — A source used a codec the renderer cannot
        decode.

        - `decode_failed` — A source file could not be decoded.

        - `encode_failed` — The output could not be encoded.

        - `timeout` — Processing exceeded the time limit.

        - `out_of_memory` — The renderer ran out of GPU memory.

        - `gpu_error` — A GPU hardware/driver error occurred.

        - `upload_failed` — The output artifact failed to upload to storage.

        - `provider_error` — An upstream provider (e.g. AssemblyAI) returned an
        error.

        - `ingest_failed` — Copying an external source into storage failed.

        - `internal` — An unexpected internal error occurred.

        - `cancelled` — The job was cancelled.
      x-enumDescriptions:
        invalid_source: A source URL was malformed or inaccessible.
        source_not_found: A source URL returned 404.
        source_too_large: A source file exceeded the maximum allowed size.
        asset_not_ready: A referenced asset was still ingesting when the job ran.
        codec_unsupported: A source used a codec the renderer cannot decode.
        decode_failed: A source file could not be decoded.
        encode_failed: The output could not be encoded.
        timeout: Processing exceeded the time limit.
        out_of_memory: The renderer ran out of GPU memory.
        gpu_error: A GPU hardware/driver error occurred.
        upload_failed: The output artifact failed to upload to storage.
        provider_error: An upstream provider (e.g. AssemblyAI) returned an error.
        ingest_failed: Copying an external source into storage failed.
        internal: An unexpected internal error occurred.
        cancelled: The job was cancelled.
    EffectType:
      type: string
      enum:
        - vintage
        - polaroid
        - portra
        - super8
        - filmic
        - add_grain
        - rgb_split
        - ghosting
        - displacement_map
        - posterize
        - mosaic
        - mosaic_blur
        - mosaic_posterize
        - cc_halftone
        - cc_halftone_blue
        - cc_halftone_green
        - cc_halftone_red
        - invert
        - optics_compensation
        - viewfinder
        - night_vision
        - thermal
        - camera_lens_blur
        - camera_lens_blur_bg
        - box_blur
        - lens_flare
        - strobe_light
        - snow
        - glow
        - sepia
        - echo
        - chromatic_aberration
        - vhs
        - vhs_overlay
        - crt
        - television
        - glitch
        - compression_glitch
        - scanlines
        - prism
        - light_leaks
        - film_burn
        - chroma_key
      title: EffectType
      description: >-
        Values:

        - `vintage` — Faded, warm retro film look with lifted blacks.

        - `polaroid` — Instant-photo look — soft contrast, warm cast, subtle
        vignette.

        - `portra` — Kodak Portra-style film emulation with natural skin tones.

        - `super8` — Super-8 home-movie look — grain, gate weave, warm color.

        - `filmic` — Cinematic film grade with rolled-off highlights and rich
        contrast.

        - `add_grain` — Adds dusty analog film grain over the image.

        - `rgb_split` — Offsets the red/green/blue channels for a glitchy
        chromatic split.

        - `ghosting` — Trailing motion echoes, like persistence-of-vision
        smearing.

        - `displacement_map` — Warps the image with a displacement texture for a
        melted look.

        - `posterize` — Reduces the image to a small number of flat color bands.

        - `mosaic` — Pixelates the image into large mosaic blocks.

        - `mosaic_blur` — Pixelated mosaic with softened, blurred block edges.

        - `mosaic_posterize` — Combines mosaic pixelation with posterized
        colors.

        - `cc_halftone` — Comic-style halftone dot pattern.

        - `cc_halftone_blue` — Halftone dot pattern tinted blue.

        - `cc_halftone_green` — Halftone dot pattern tinted green.

        - `cc_halftone_red` — Halftone dot pattern tinted red.

        - `invert` — Inverts all colors (photo-negative).

        - `optics_compensation` — Fish-eye / lens-distortion warp.

        - `viewfinder` — Camera viewfinder overlay (REC indicator, framing
        marks).

        - `night_vision` — Green night-vision look with glow and noise.

        - `thermal` — Thermal-camera false-color heat map.

        - `camera_lens_blur` — Realistic bokeh lens blur across the frame.

        - `camera_lens_blur_bg` — Bokeh lens blur applied to the background
        only.

        - `box_blur` — Fast, uniform box blur.

        - `lens_flare` — Adds an anamorphic lens-flare streak and glints.

        - `strobe_light` — Rapid brightness strobing / flashing.

        - `snow` — Falling-snow particle overlay.

        - `glow` — Dreamy soft-glow bloom over highlights.

        - `sepia` — Sepia-toned monochrome with a vignette.

        - `echo` — Soft ghosted dream-echo overlay.

        - `chromatic_aberration` — Color-fringing at edges, like cheap-lens
        dispersion.

        - `vhs` — VHS tape look: tracking noise, color bleed, and wobble.

        - `vhs_overlay` — VHS noise/scanline layer composited over the source.

        - `crt` — CRT monitor look: screen curvature, scanlines, and phosphor
        glow.

        - `television` — Analog TV look: scanlines, static, and signal
        distortion.

        - `glitch` — Digital glitch: block displacement and channel tearing.

        - `compression_glitch` — MPEG compression artifacts: blocky macroblocks
        and datamosh.

        - `scanlines` — Horizontal scanlines overlaid on the image.

        - `prism` — Prismatic light refraction with a rainbow color split.

        - `light_leaks` — Warm light-leak streaks bleeding across the frame.

        - `film_burn` — Burning-film look with scorched edges and flares.

        - `chroma_key` — Keys out a color (green/blue screen); tune via
        `chroma_settings`.
      x-enumDescriptions:
        vintage: Faded, warm retro film look with lifted blacks.
        polaroid: Instant-photo look — soft contrast, warm cast, subtle vignette.
        portra: Kodak Portra-style film emulation with natural skin tones.
        super8: Super-8 home-movie look — grain, gate weave, warm color.
        filmic: Cinematic film grade with rolled-off highlights and rich contrast.
        add_grain: Adds dusty analog film grain over the image.
        rgb_split: Offsets the red/green/blue channels for a glitchy chromatic split.
        ghosting: Trailing motion echoes, like persistence-of-vision smearing.
        displacement_map: Warps the image with a displacement texture for a melted look.
        posterize: Reduces the image to a small number of flat color bands.
        mosaic: Pixelates the image into large mosaic blocks.
        mosaic_blur: Pixelated mosaic with softened, blurred block edges.
        mosaic_posterize: Combines mosaic pixelation with posterized colors.
        cc_halftone: Comic-style halftone dot pattern.
        cc_halftone_blue: Halftone dot pattern tinted blue.
        cc_halftone_green: Halftone dot pattern tinted green.
        cc_halftone_red: Halftone dot pattern tinted red.
        invert: Inverts all colors (photo-negative).
        optics_compensation: Fish-eye / lens-distortion warp.
        viewfinder: Camera viewfinder overlay (REC indicator, framing marks).
        night_vision: Green night-vision look with glow and noise.
        thermal: Thermal-camera false-color heat map.
        camera_lens_blur: Realistic bokeh lens blur across the frame.
        camera_lens_blur_bg: Bokeh lens blur applied to the background only.
        box_blur: Fast, uniform box blur.
        lens_flare: Adds an anamorphic lens-flare streak and glints.
        strobe_light: Rapid brightness strobing / flashing.
        snow: Falling-snow particle overlay.
        glow: Dreamy soft-glow bloom over highlights.
        sepia: Sepia-toned monochrome with a vignette.
        echo: Soft ghosted dream-echo overlay.
        chromatic_aberration: Color-fringing at edges, like cheap-lens dispersion.
        vhs: 'VHS tape look: tracking noise, color bleed, and wobble.'
        vhs_overlay: VHS noise/scanline layer composited over the source.
        crt: 'CRT monitor look: screen curvature, scanlines, and phosphor glow.'
        television: 'Analog TV look: scanlines, static, and signal distortion.'
        glitch: 'Digital glitch: block displacement and channel tearing.'
        compression_glitch: 'MPEG compression artifacts: blocky macroblocks and datamosh.'
        scanlines: Horizontal scanlines overlaid on the image.
        prism: Prismatic light refraction with a rainbow color split.
        light_leaks: Warm light-leak streaks bleeding across the frame.
        film_burn: Burning-film look with scorched edges and flares.
        chroma_key: Keys out a color (green/blue screen); tune via `chroma_settings`.
    ChromaKeyProps:
      properties:
        hue_min:
          type: number
          title: Hue Min
          default: 60
        hue_max:
          type: number
          title: Hue Max
          default: 180
        sat_min:
          type: number
          title: Sat Min
          default: 0.3
        sat_max:
          type: number
          title: Sat Max
          default: 1
        lum_min:
          type: number
          title: Lum Min
          default: 0.2
        lum_max:
          type: number
          title: Lum Max
          default: 0.9
      type: object
      title: ChromaKeyProps
      description: Used when ``EffectType.CHROMA_KEY`` is selected.
    MotionType:
      type: string
      enum:
        - fade
        - slide_up
        - slide_down
        - slide_left
        - slide_right
        - zoom_in
        - zoom_out
        - rotate_cw
        - rotate_ccw
        - bounce
        - wipe_left
        - wipe_right
        - wipe_up
        - wipe_down
        - ken_burns_in
        - ken_burns_out
        - ken_burns_in_out
        - loop_wiggle
        - loop_rotate
        - loop_rotate_smooth
        - loop_3d_spin
        - loop_3d_sway
        - blur
        - bounce_motion
        - explode
        - evaporate
        - overlay
        - difference
      title: MotionType
      description: >-
        Values:

        - `fade` — Fade in (entrance) or out (exit) via opacity.

        - `slide_up` — Slide in from below / out upward.

        - `slide_down` — Slide in from above / out downward.

        - `slide_left` — Slide in from the right / out to the left.

        - `slide_right` — Slide in from the left / out to the right.

        - `zoom_in` — Scale up from small to full size (entrance).

        - `zoom_out` — Scale down to small (exit).

        - `rotate_cw` — Spin in/out clockwise.

        - `rotate_ccw` — Spin in/out counter-clockwise.

        - `bounce` — Bounce in with an elastic overshoot / bounce out.

        - `wipe_left` — Reveal/conceal with a left-moving wipe.

        - `wipe_right` — Reveal/conceal with a right-moving wipe.

        - `wipe_up` — Reveal/conceal with an upward wipe.

        - `wipe_down` — Reveal/conceal with a downward wipe.

        - `ken_burns_in` — Slow zoom-in pan (Ken Burns) — entrance only.

        - `ken_burns_out` — Slow zoom-out pan (Ken Burns) — entrance only.

        - `ken_burns_in_out` — Slow zoom in then out (Ken Burns) — entrance
        only.

        - `loop_wiggle` — Continuous subtle wiggle (looping).

        - `loop_rotate` — Continuous stepped rotation (looping).

        - `loop_rotate_smooth` — Continuous smooth rotation (looping).

        - `loop_3d_spin` — Continuous 3D spin (looping).

        - `loop_3d_sway` — Continuous 3D sway (looping).

        - `blur` — Per-glyph soft blur-in (text entrance).

        - `bounce_motion` — Per-glyph bob-up-and-fade-in (text entrance).

        - `explode` — Per-glyph scale/rotate burst (text entrance).

        - `evaporate` — Per-glyph rise, blur, and fade-out (text exit only).

        - `overlay` — Static Overlay blend fill (timing ignored).

        - `difference` — Static Difference blend fill (timing ignored).
      x-enumDescriptions:
        fade: Fade in (entrance) or out (exit) via opacity.
        slide_up: Slide in from below / out upward.
        slide_down: Slide in from above / out downward.
        slide_left: Slide in from the right / out to the left.
        slide_right: Slide in from the left / out to the right.
        zoom_in: Scale up from small to full size (entrance).
        zoom_out: Scale down to small (exit).
        rotate_cw: Spin in/out clockwise.
        rotate_ccw: Spin in/out counter-clockwise.
        bounce: Bounce in with an elastic overshoot / bounce out.
        wipe_left: Reveal/conceal with a left-moving wipe.
        wipe_right: Reveal/conceal with a right-moving wipe.
        wipe_up: Reveal/conceal with an upward wipe.
        wipe_down: Reveal/conceal with a downward wipe.
        ken_burns_in: Slow zoom-in pan (Ken Burns) — entrance only.
        ken_burns_out: Slow zoom-out pan (Ken Burns) — entrance only.
        ken_burns_in_out: Slow zoom in then out (Ken Burns) — entrance only.
        loop_wiggle: Continuous subtle wiggle (looping).
        loop_rotate: Continuous stepped rotation (looping).
        loop_rotate_smooth: Continuous smooth rotation (looping).
        loop_3d_spin: Continuous 3D spin (looping).
        loop_3d_sway: Continuous 3D sway (looping).
        blur: Per-glyph soft blur-in (text entrance).
        bounce_motion: Per-glyph bob-up-and-fade-in (text entrance).
        explode: Per-glyph scale/rotate burst (text entrance).
        evaporate: Per-glyph rise, blur, and fade-out (text exit only).
        overlay: Static Overlay blend fill (timing ignored).
        difference: Static Difference blend fill (timing ignored).
    Easing:
      type: string
      enum:
        - linear
        - ease_in
        - ease_out
        - ease_in_out
      title: Easing
      description: |-
        Values:
        - `linear` — Constant speed, no acceleration.
        - `ease_in` — Starts slow, accelerates.
        - `ease_out` — Starts fast, decelerates.
        - `ease_in_out` — Slow start and end, faster in the middle.
      x-enumDescriptions:
        linear: Constant speed, no acceleration.
        ease_in: Starts slow, accelerates.
        ease_out: Starts fast, decelerates.
        ease_in_out: Slow start and end, faster in the middle.
    MotionScope:
      type: string
      enum:
        - element
        - character
      title: MotionScope
      description: >-
        Whether a motion preset applies to the whole element or per-glyph (text
        only).


        Values:

        - `element` — The motion animates the whole element as one unit.

        - `character` — The motion animates each text glyph individually (text
        only).
      x-enumDescriptions:
        element: The motion animates the whole element as one unit.
        character: The motion animates each text glyph individually (text only).
    WordAnimationStyle:
      type: string
      enum:
        - glow
        - box
        - scale_pop
        - slide_up
        - fly_in
        - color
      title: WordAnimationStyle
      description: |-
        [API extension] Word-level animations (require word_animation.words).

        Values:
        - `glow` — Highlights the active word with a glowing emphasis.
        - `box` — Draws a colored box behind the active word.
        - `scale_pop` — Pops the active word with a quick scale punch.
        - `slide_up` — Floats each word up into place as it becomes active.
        - `fly_in` — Drops each word in from above as it becomes active.
        - `color` — Recolors the active word (karaoke-style highlight).
      x-enumDescriptions:
        glow: Highlights the active word with a glowing emphasis.
        box: Draws a colored box behind the active word.
        scale_pop: Pops the active word with a quick scale punch.
        slide_up: Floats each word up into place as it becomes active.
        fly_in: Drops each word in from above as it becomes active.
        color: Recolors the active word (karaoke-style highlight).
    Word:
      properties:
        text:
          type: string
          title: Text
        start:
          type: number
          minimum: 0
          title: Start
        end:
          type: number
          exclusiveMinimum: 0
          title: End
      type: object
      required:
        - text
        - start
        - end
      title: Word
  securitySchemes:
    ApiKey:
      type: http
      scheme: bearer

````