Skip to main content
Glama

Update clip

update_clip

Edit one 3-second to 10-minute clip by changing only the fields you pass; title, caption, and hashtags update at once, while burned-in changes re-render in about a minute.

Instructions

Edit one clip (3 s-10 min): only the fields you pass change; style, layoutSections and layers replace the whole value (null = project's / none). Title, caption and hashtags apply at once; bounds, hook, framing, style, emphasis, layers and intro/outro are burned in and re-render (~1 min) unless rerender is false. Returns the clip summary plus { changed, needsRerender, rerendered, hint }; poll get_clip until done.

Input Schema

NameRequiredDescriptionDefault
idYesClip id (from get_project or search_clips)
hookNoOn-screen opening line (max 80 chars)
styleNoCaption/hook look and fades (fadeIn, fadeOut, bumperTransition) for this clip on top of the project's; replaces the clip's override; null = follow the project
titleNoClip title (1-120 chars)
endSecNoNew end, seconds from the start of the source; clip must stay ≥3 s
layersNoEverything laid over or played under the clip, one list (max 30): kind asset = a library image/GIF/video (search_assets with source library; logos, stickers, b-roll), kind text = a line of text (both take fade, seconds in and out), kind audio = music or a sound effect (a library audio asset with a window in source seconds, volume, ducking, fade, loop). Replaces the whole list; null or [] = none. get_clip returns it
captionNoPost caption, not burned in (max 300 chars)
emphasisNoWords the captions colour (max 30); replaces the list
hashtagsNoHashtags without # (max 20); replaces the list
rerenderNoRe-render when a burned-in field changed (default true, same as the app); false = keep the old video until rerender_clip
startSecNoNew start, seconds from the start of the source video
layoutOverrideNoFraming for the whole clip; null = automatic
layoutSectionsNoFraming per time range (max 50), source seconds; replaces all sections; null or [] = automatic

Schema Changelog

Changes observed during successful MCP inspections.

  1. Changed4 schema fields changedv0.33.0
    • changedInput schema / properties / layers / anyOf
      Previous value: -[
      -  {
      -    "items": {
      -      "oneOf": [
      -        {
      -          "properties": {
      -            "assetId": {
      -              "description": "Library asset id (search_assets with source library): an image, an animation or a video",
      -              "maxLength": 100,
      -              "minLength": 1,
      -              "type": "string"
      -            },
      -            "end": {
      -              "description": "Hidden after this second of the source video",
      -              "minimum": 0,
      -              "type": "number"
      -            },
      -            "id": {
      -              "description": "Stable id for this overlay (any short string; keep it when editing)",
      -              "maxLength": 40,
      -              "minLength": 1,
      -              "type": "string"
      -            },
      -            "kind": {
      -              "const": "asset",
      -              "type": "string"
      -            },
      -            "loop": {
      -              "description": "Repeat a video / animation while its window is open (default: on for GIF and animated WebP, off for videos)",
      -              "type": "boolean"
      -            },
      -            "opacity": {
      -              "description": "0.1-1, default 1",
      -              "maximum": 1,
      -              "minimum": 0.1,
      -              "type": "number"
      -            },
      -            "start": {
      -              "description": "Shown from this second of the source video",
      -              "minimum": 0,
      -              "type": "number"
      -            },
      -            "w": {
      -              "description": "asset: width, fraction of the output width (0.05-1); the height follows the file. Default 0.3",
      -              "maximum": 1,
      -              "minimum": 0.05,
      -              "type": "number"
      -            },
      -            "x": {
      -              "description": "Centre, fraction of the output width (0-1)",
      -              "maximum": 1,
      -              "minimum": 0,
      -              "type": "number"
      -            },
      -            "y": {
      -              "description": "Centre, fraction of the output height (0-1)",
      -              "maximum": 1,
      -              "minimum": 0,
      -              "type": "number"
      -            }
      -          },
      -          "required": [
      -            "id",
      -            "assetId",
      -            "start",
      -            "end",
      -            "x",
      -            "y",
      -            "kind"
      -          ],
      -          "type": "object"
      -        },
      -        {
      -          "properties": {
      -            "box": {
      -              "description": "text: dark plate behind the text (default: outlined text, no plate)",
      -              "type": "boolean"
      -            },
      -            "color": {
      -              "description": "text: colour as #RRGGBB, default white",
      -              "pattern": "^#[0-9a-fA-F]{6}$",
      -              "type": "string"
      -            },
      -            "end": {
      -              "description": "Hidden after this second of the source video",
      -              "minimum": 0,
      -              "type": "number"
      -            },
      -            "font": {
      -              "description": "text: font family from TEXT_FONTS (default DejaVu Sans, the caption font)",
      -              "maxLength": 60,
      -              "minLength": 1,
      -              "type": "string"
      -            },
      -            "id": {
      -              "description": "Stable id for this overlay (any short string; keep it when editing)",
      -              "maxLength": 40,
      -              "minLength": 1,
      -              "type": "string"
      -            },
      -            "kind": {
      -              "const": "text",
      -              "type": "string"
      -            },
      -            "opacity": {
      -              "description": "0.1-1, default 1",
      -              "maximum": 1,
      -              "minimum": 0.1,
      -              "type": "number"
      -            },
      -            "size": {
      -              "description": "text: font size as a fraction of the output height (0.02-0.12), default 0.045",
      -              "maximum": 0.12,
      -              "minimum": 0.02,
      -              "type": "number"
      -            },
      -            "start": {
      -              "description": "Shown from this second of the source video",
      -              "minimum": 0,
      -              "type": "number"
      -            },
      -            "text": {
      -              "description": "The line to show (1-120 chars)",
      -              "maxLength": 120,
      -              "minLength": 1,
      -              "type": "string"
      -            },
      -            "x": {
      -              "description": "Centre, fraction of the output width (0-1)",
      -              "maximum": 1,
      -              "minimum": 0,
      -              "type": "number"
      -            },
      -            "y": {
      -              "description": "Centre, fraction of the output height (0-1)",
      -              "maximum": 1,
      -              "minimum": 0,
      -              "type": "number"
      -            }
      -          },
      -          "required": [
      -            "id",
      -            "text",
      -            "start",
      -            "end",
      -            "x",
      -            "y",
      -            "kind"
      -          ],
      -          "type": "object"
      -        },
      -        {
      -          "properties": {
      -            "assetId": {
      -              "description": "Library audio asset id (search_assets with source library, kind audio); the same asset can be used more than once",
      -              "maxLength": 100,
      -              "minLength": 1,
      -              "type": "string"
      -            },
      -            "duck": {
      -              "description": "Lower the music while someone speaks (default true)",
      -              "type": "boolean"
      -            },
      -            "end": {
      -              "description": "Music stops after this second of the source video",
      -              "minimum": 0,
      -              "type": "number"
      -            },
      -            "fade": {
      -              "description": "Fade in and out, seconds (default 0.5)",
      -              "maximum": 5,
      -              "minimum": 0,
      -              "type": "number"
      -            },
      -            "id": {
      -              "description": "Stable id for this track (any short string; keep it when editing)",
      -              "maxLength": 40,
      -              "minLength": 1,
      -              "type": "string"
      -            },
      -            "kind": {
      -              "const": "audio",
      -              "type": "string"
      -            },
      -            "loop": {
      -              "description": "Repeat the track when it is shorter than the window (default true)",
      -              "type": "boolean"
      -            },
      -            "offset": {
      -              "description": "Seconds into the track to start from (default 0)",
      -              "minimum": 0,
      -              "type": "number"
      -            },
      -            "start": {
      -              "description": "Music starts at this second of the source video",
      -              "minimum": 0,
      -              "type": "number"
      -            },
      -            "volume": {
      -              "description": "Music level 0-1 (default 0.6) on a track normalised to -20 LUFS, before ducking",
      -              "maximum": 1,
      -              "minimum": 0,
      -              "type": "number"
      -            }
      -          },
      -          "required": [
      -            "id",
      -            "assetId",
      -            "start",
      -            "end",
      -            "kind"
      -          ],
      -          "type": "object"
      -        }
      -      ]
      -    },
      -    "maxItems": 30,
      -    "type": "array"
      -  },
      -  {
      -    "type": "null"
      -  }
      -]New value: +[
      +  {
      +    "items": {
      +      "oneOf": [
      +        {
      +          "properties": {
      +            "assetId": {
      +              "description": "Library asset id (search_assets with source library): an image, an animation or a video",
      +              "maxLength": 100,
      +              "minLength": 1,
      +              "type": "string"
      +            },
      +            "end": {
      +              "description": "Hidden after this second of the source video",
      +              "minimum": 0,
      +              "type": "number"
      +            },
      +            "fade": {
      +              "description": "Fade in when it appears and out when it goes, seconds (0-2, default 0 = appears and goes at once)",
      +              "maximum": 2,
      +              "minimum": 0,
      +              "type": "number"
      +            },
      +            "id": {
      +              "description": "Stable id for this overlay (any short string; keep it when editing)",
      +              "maxLength": 40,
      +              "minLength": 1,
      +              "type": "string"
      +            },
      +            "kind": {
      +              "const": "asset",
      +              "type": "string"
      +            },
      +            "loop": {
      +              "description": "Repeat a video / animation while its window is open (default: on for GIF and animated WebP, off for videos)",
      +              "type": "boolean"
      +            },
      +            "opacity": {
      +              "description": "0.1-1, default 1",
      +              "maximum": 1,
      +              "minimum": 0.1,
      +              "type": "number"
      +            },
      +            "start": {
      +              "description": "Shown from this second of the source video",
      +              "minimum": 0,
      +              "type": "number"
      +            },
      +            "w": {
      +              "description": "asset: width, fraction of the output width (0.05-1); the height follows the file. Default 0.3",
      +              "maximum": 1,
      +              "minimum": 0.05,
      +              "type": "number"
      +            },
      +            "x": {
      +              "description": "Centre, fraction of the output width (0-1)",
      +              "maximum": 1,
      +              "minimum": 0,
      +              "type": "number"
      +            },
      +            "y": {
      +              "description": "Centre, fraction of the output height (0-1)",
      +              "maximum": 1,
      +              "minimum": 0,
      +              "type": "number"
      +            }
      +          },
      +          "required": [
      +            "id",
      +            "assetId",
      +            "start",
      +            "end",
      +            "x",
      +            "y",
      +            "kind"
      +          ],
      +          "type": "object"
      +        },
      +        {
      +          "properties": {
      +            "box": {
      +              "description": "text: dark plate behind the text (default: outlined text, no plate)",
      +              "type": "boolean"
      +            },
      +            "color": {
      +              "description": "text: colour as #RRGGBB, default white",
      +              "pattern": "^#[0-9a-fA-F]{6}$",
      +              "type": "string"
      +            },
      +            "end": {
      +              "description": "Hidden after this second of the source video",
      +              "minimum": 0,
      +              "type": "number"
      +            },
      +            "fade": {
      +              "description": "Fade in when it appears and out when it goes, seconds (0-2, default 0 = appears and goes at once)",
      +              "maximum": 2,
      +              "minimum": 0,
      +              "type": "number"
      +            },
      +            "font": {
      +              "description": "text: font family from TEXT_FONTS (default DejaVu Sans, the caption font)",
      +              "maxLength": 60,
      +              "minLength": 1,
      +              "type": "string"
      +            },
      +            "id": {
      +              "description": "Stable id for this overlay (any short string; keep it when editing)",
      +              "maxLength": 40,
      +              "minLength": 1,
      +              "type": "string"
      +            },
      +            "kind": {
      +              "const": "text",
      +              "type": "string"
      +            },
      +            "opacity": {
      +              "description": "0.1-1, default 1",
      +              "maximum": 1,
      +              "minimum": 0.1,
      +              "type": "number"
      +            },
      +            "size": {
      +              "description": "text: font size as a fraction of the output height (0.02-0.12), default 0.045",
      +              "maximum": 0.12,
      +              "minimum": 0.02,
      +              "type": "number"
      +            },
      +            "start": {
      +              "description": "Shown from this second of the source video",
      +              "minimum": 0,
      +              "type": "number"
      +            },
      +            "text": {
      +              "description": "The line to show (1-120 chars)",
      +              "maxLength": 120,
      +              "minLength": 1,
      +              "type": "string"
      +            },
      +            "x": {
      +              "description": "Centre, fraction of the output width (0-1)",
      +              "maximum": 1,
      +              "minimum": 0,
      +              "type": "number"
      +            },
      +            "y": {
      +              "description": "Centre, fraction of the output height (0-1)",
      +              "maximum": 1,
      +              "minimum": 0,
      +              "type": "number"
      +            }
      +          },
      +          "required": [
      +            "id",
      +            "text",
      +            "start",
      +            "end",
      +            "x",
      +            "y",
      +            "kind"
      +          ],
      +          "type": "object"
      +        },
      +        {
      +          "properties": {
      +            "assetId": {
      +              "description": "Library audio asset id (search_assets with source library, kind audio); the same asset can be used more than once",
      +              "maxLength": 100,
      +              "minLength": 1,
      +              "type": "string"
      +            },
      +            "duck": {
      +              "description": "Lower the music while someone speaks (default true)",
      +              "type": "boolean"
      +            },
      +            "end": {
      +              "description": "Music stops after this second of the source video",
      +              "minimum": 0,
      +              "type": "number"
      +            },
      +            "fade": {
      +              "description": "Fade in and out, seconds (default 0.5)",
      +              "maximum": 5,
      +              "minimum": 0,
      +              "type": "number"
      +            },
      +            "id": {
      +              "description": "Stable id for this track (any short string; keep it when editing)",
      +              "maxLength": 40,
      +              "minLength": 1,
      +              "type": "string"
      +            },
      +            "kind": {
      +              "const": "audio",
      +              "type": "string"
      +            },
      +            "loop": {
      +              "description": "Repeat the track when it is shorter than the window (default true)",
      +              "type": "boolean"
      +            },
      +            "offset": {
      +              "description": "Seconds into the track to start from (default 0)",
      +              "minimum": 0,
      +              "type": "number"
      +            },
      +            "start": {
      +              "description": "Music starts at this second of the source video",
      +              "minimum": 0,
      +              "type": "number"
      +            },
      +            "volume": {
      +              "description": "Music level 0-1 (default 0.6) on a track normalised to -20 LUFS, before ducking",
      +              "maximum": 1,
      +              "minimum": 0,
      +              "type": "number"
      +            }
      +          },
      +          "required": [
      +            "id",
      +            "assetId",
      +            "start",
      +            "end",
      +            "kind"
      +          ],
      +          "type": "object"
      +        }
      +      ]
      +    },
      +    "maxItems": 30,
      +    "type": "array"
      +  },
      +  {
      +    "type": "null"
      +  }
      +]
    • changedInput schema / properties / layers / description
      Previous value: -"Everything laid over or played under the clip, one list (max 30): kind asset = a library image/GIF/video (search_assets with source library; logos, stickers, b-roll), kind text = a line of text, kind audio = music or a sound effect (a library audio asset with a window in source seconds, volume, ducking, fade, loop). Replaces the whole list; null or [] = none. get_clip returns it"New value: +"Everything laid over or played under the clip, one list (max 30): kind asset = a library image/GIF/video (search_assets with source library; logos, stickers, b-roll), kind text = a line of text (both take fade, seconds in and out), kind audio = music or a sound effect (a library audio asset with a window in source seconds, volume, ducking, fade, loop). Replaces the whole list; null or [] = none. get_clip returns it"
    • changedInput schema / properties / style / anyOf
      Previous value: -[
      -  {
      -    "properties": {
      -      "captionSeam": {
      -        "description": "In split and stack sections, put captions on the line between the two panes instead of at captionY (default true)",
      -        "type": "boolean"
      -      },
      -      "captionSize": {
      -        "description": "Caption size multiplier (0.5-2, default 1)",
      -        "maximum": 2,
      -        "minimum": 0.5,
      -        "type": "number"
      -      },
      -      "captionX": {
      -        "description": "Caption centre, horizontal, as a fraction of the 9:16 frame (0-1)",
      -        "maximum": 1,
      -        "minimum": 0,
      -        "type": "number"
      -      },
      -      "captionY": {
      -        "description": "Caption centre, vertical (default 0.72), as a fraction of the 9:16 frame (0-1)",
      -        "maximum": 1,
      -        "minimum": 0,
      -        "type": "number"
      -      },
      -      "captions": {
      -        "description": "Caption look: karaoke (active word highlighted), box, plain, or none (no captions)",
      -        "enum": [
      -          "karaoke",
      -          "box",
      -          "plain",
      -          "none"
      -        ],
      -        "type": "string"
      -      },
      -      "emphasis": {
      -        "description": "Colour the clip's key words (default true)",
      -        "type": "boolean"
      -      },
      -      "emphasisColor": {
      -        "description": "Colour of emphasised words, #RRGGBB (default #39FF14)",
      -        "pattern": "^#[0-9a-fA-F]{6}$",
      -        "type": "string"
      -      },
      -      "highlightColor": {
      -        "description": "Karaoke active-word colour, #RRGGBB (default #FFD700)",
      -        "pattern": "^#[0-9a-fA-F]{6}$",
      -        "type": "string"
      -      },
      -      "hookSeconds": {
      -        "description": "How long the hook shows, seconds (0-15, default 3.5)",
      -        "maximum": 15,
      -        "minimum": 0,
      -        "type": "number"
      -      },
      -      "hookX": {
      -        "description": "Hook centre, horizontal, as a fraction of the 9:16 frame (0-1)",
      -        "maximum": 1,
      -        "minimum": 0,
      -        "type": "number"
      -      },
      -      "hookY": {
      -        "description": "Hook centre, vertical (default 0.16), as a fraction of the 9:16 frame (0-1)",
      -        "maximum": 1,
      -        "minimum": 0,
      -        "type": "number"
      -      },
      -      "showHook": {
      -        "description": "Show the hook text at the start of the clip (default true)",
      -        "type": "boolean"
      -      },
      -      "uppercase": {
      -        "description": "Captions in capitals",
      -        "type": "boolean"
      -      },
      -      "wordsPerLine": {
      -        "description": "Max caption words on screen at once (1-8, default 4)",
      -        "maximum": 8,
      -        "minimum": 1,
      -        "type": "integer"
      -      }
      -    },
      -    "type": "object"
      -  },
      -  {
      -    "type": "null"
      -  }
      -]New value: +[
      +  {
      +    "properties": {
      +      "bumperTransition": {
      +        "description": "How the intro/outro joins the clip: cut (default), dip (fade through black, no change in length) or crossfade (the two overlap, so the video is shorter by the transition)",
      +        "enum": [
      +          "cut",
      +          "dip",
      +          "crossfade"
      +        ],
      +        "type": "string"
      +      },
      +      "bumperTransitionSec": {
      +        "description": "Length of the intro/outro transition, seconds (0.2-2, default 0.5); ignored for cut",
      +        "maximum": 2,
      +        "minimum": 0.2,
      +        "type": "number"
      +      },
      +      "captionSeam": {
      +        "description": "In split and stack sections, put captions on the line between the two panes instead of at captionY (default true)",
      +        "type": "boolean"
      +      },
      +      "captionSize": {
      +        "description": "Caption size multiplier (0.5-2, default 1)",
      +        "maximum": 2,
      +        "minimum": 0.5,
      +        "type": "number"
      +      },
      +      "captionX": {
      +        "description": "Caption centre, horizontal, as a fraction of the 9:16 frame (0-1)",
      +        "maximum": 1,
      +        "minimum": 0,
      +        "type": "number"
      +      },
      +      "captionY": {
      +        "description": "Caption centre, vertical (default 0.72), as a fraction of the 9:16 frame (0-1)",
      +        "maximum": 1,
      +        "minimum": 0,
      +        "type": "number"
      +      },
      +      "captions": {
      +        "description": "Caption look: karaoke (active word highlighted), box, plain, or none (no captions)",
      +        "enum": [
      +          "karaoke",
      +          "box",
      +          "plain",
      +          "none"
      +        ],
      +        "type": "string"
      +      },
      +      "emphasis": {
      +        "description": "Colour the clip's key words (default true)",
      +        "type": "boolean"
      +      },
      +      "emphasisColor": {
      +        "description": "Colour of emphasised words, #RRGGBB (default #39FF14)",
      +        "pattern": "^#[0-9a-fA-F]{6}$",
      +        "type": "string"
      +      },
      +      "fadeIn": {
      +        "description": "Fade in from black (picture and sound) at the start of the video, seconds (0-2, default 0 = off)",
      +        "maximum": 2,
      +        "minimum": 0,
      +        "type": "number"
      +      },
      +      "fadeOut": {
      +        "description": "Fade out to black (picture and sound) at the end of the video, seconds (0-2, default 0 = off)",
      +        "maximum": 2,
      +        "minimum": 0,
      +        "type": "number"
      +      },
      +      "highlightColor": {
      +        "description": "Karaoke active-word colour, #RRGGBB (default #FFD700)",
      +        "pattern": "^#[0-9a-fA-F]{6}$",
      +        "type": "string"
      +      },
      +      "hookSeconds": {
      +        "description": "How long the hook shows, seconds (0-15, default 3.5)",
      +        "maximum": 15,
      +        "minimum": 0,
      +        "type": "number"
      +      },
      +      "hookX": {
      +        "description": "Hook centre, horizontal, as a fraction of the 9:16 frame (0-1)",
      +        "maximum": 1,
      +        "minimum": 0,
      +        "type": "number"
      +      },
      +      "hookY": {
      +        "description": "Hook centre, vertical (default 0.16), as a fraction of the 9:16 frame (0-1)",
      +        "maximum": 1,
      +        "minimum": 0,
      +        "type": "number"
      +      },
      +      "showHook": {
      +        "description": "Show the hook text at the start of the clip (default true)",
      +        "type": "boolean"
      +      },
      +      "uppercase": {
      +        "description": "Captions in capitals",
      +        "type": "boolean"
      +      },
      +      "wordsPerLine": {
      +        "description": "Max caption words on screen at once (1-8, default 4)",
      +        "maximum": 8,
      +        "minimum": 1,
      +        "type": "integer"
      +      }
      +    },
      +    "type": "object"
      +  },
      +  {
      +    "type": "null"
      +  }
      +]
    • changedInput schema / properties / style / description
      Previous value: -"Caption/hook style for this clip on top of the project's; replaces the clip's override; null = follow the project"New value: +"Caption/hook look and fades (fadeIn, fadeOut, bumperTransition) for this clip on top of the project's; replaces the clip's override; null = follow the project"
  2. Changed1 schema field changedv0.28.1
    • changedInput schema / properties / style / anyOf
      Previous value: -[
      -  {
      -    "properties": {
      -      "captionSize": {
      -        "description": "Caption size multiplier (0.5-2, default 1)",
      -        "maximum": 2,
      -        "minimum": 0.5,
      -        "type": "number"
      -      },
      -      "captionX": {
      -        "description": "Caption centre, horizontal, as a fraction of the 9:16 frame (0-1)",
      -        "maximum": 1,
      -        "minimum": 0,
      -        "type": "number"
      -      },
      -      "captionY": {
      -        "description": "Caption centre, vertical (default 0.72), as a fraction of the 9:16 frame (0-1)",
      -        "maximum": 1,
      -        "minimum": 0,
      -        "type": "number"
      -      },
      -      "captions": {
      -        "description": "Caption look: karaoke (active word highlighted), box, plain, or none (no captions)",
      -        "enum": [
      -          "karaoke",
      -          "box",
      -          "plain",
      -          "none"
      -        ],
      -        "type": "string"
      -      },
      -      "emphasis": {
      -        "description": "Colour the clip's key words (default true)",
      -        "type": "boolean"
      -      },
      -      "emphasisColor": {
      -        "description": "Colour of emphasised words, #RRGGBB (default #39FF14)",
      -        "pattern": "^#[0-9a-fA-F]{6}$",
      -        "type": "string"
      -      },
      -      "highlightColor": {
      -        "description": "Karaoke active-word colour, #RRGGBB (default #FFD700)",
      -        "pattern": "^#[0-9a-fA-F]{6}$",
      -        "type": "string"
      -      },
      -      "hookSeconds": {
      -        "description": "How long the hook shows, seconds (0-15, default 3.5)",
      -        "maximum": 15,
      -        "minimum": 0,
      -        "type": "number"
      -      },
      -      "hookX": {
      -        "description": "Hook centre, horizontal, as a fraction of the 9:16 frame (0-1)",
      -        "maximum": 1,
      -        "minimum": 0,
      -        "type": "number"
      -      },
      -      "hookY": {
      -        "description": "Hook centre, vertical (default 0.16), as a fraction of the 9:16 frame (0-1)",
      -        "maximum": 1,
      -        "minimum": 0,
      -        "type": "number"
      -      },
      -      "showHook": {
      -        "description": "Show the hook text at the start of the clip (default true)",
      -        "type": "boolean"
      -      },
      -      "uppercase": {
      -        "description": "Captions in capitals",
      -        "type": "boolean"
      -      },
      -      "wordsPerLine": {
      -        "description": "Max caption words on screen at once (1-8, default 4)",
      -        "maximum": 8,
      -        "minimum": 1,
      -        "type": "integer"
      -      }
      -    },
      -    "type": "object"
      -  },
      -  {
      -    "type": "null"
      -  }
      -]New value: +[
      +  {
      +    "properties": {
      +      "captionSeam": {
      +        "description": "In split and stack sections, put captions on the line between the two panes instead of at captionY (default true)",
      +        "type": "boolean"
      +      },
      +      "captionSize": {
      +        "description": "Caption size multiplier (0.5-2, default 1)",
      +        "maximum": 2,
      +        "minimum": 0.5,
      +        "type": "number"
      +      },
      +      "captionX": {
      +        "description": "Caption centre, horizontal, as a fraction of the 9:16 frame (0-1)",
      +        "maximum": 1,
      +        "minimum": 0,
      +        "type": "number"
      +      },
      +      "captionY": {
      +        "description": "Caption centre, vertical (default 0.72), as a fraction of the 9:16 frame (0-1)",
      +        "maximum": 1,
      +        "minimum": 0,
      +        "type": "number"
      +      },
      +      "captions": {
      +        "description": "Caption look: karaoke (active word highlighted), box, plain, or none (no captions)",
      +        "enum": [
      +          "karaoke",
      +          "box",
      +          "plain",
      +          "none"
      +        ],
      +        "type": "string"
      +      },
      +      "emphasis": {
      +        "description": "Colour the clip's key words (default true)",
      +        "type": "boolean"
      +      },
      +      "emphasisColor": {
      +        "description": "Colour of emphasised words, #RRGGBB (default #39FF14)",
      +        "pattern": "^#[0-9a-fA-F]{6}$",
      +        "type": "string"
      +      },
      +      "highlightColor": {
      +        "description": "Karaoke active-word colour, #RRGGBB (default #FFD700)",
      +        "pattern": "^#[0-9a-fA-F]{6}$",
      +        "type": "string"
      +      },
      +      "hookSeconds": {
      +        "description": "How long the hook shows, seconds (0-15, default 3.5)",
      +        "maximum": 15,
      +        "minimum": 0,
      +        "type": "number"
      +      },
      +      "hookX": {
      +        "description": "Hook centre, horizontal, as a fraction of the 9:16 frame (0-1)",
      +        "maximum": 1,
      +        "minimum": 0,
      +        "type": "number"
      +      },
      +      "hookY": {
      +        "description": "Hook centre, vertical (default 0.16), as a fraction of the 9:16 frame (0-1)",
      +        "maximum": 1,
      +        "minimum": 0,
      +        "type": "number"
      +      },
      +      "showHook": {
      +        "description": "Show the hook text at the start of the clip (default true)",
      +        "type": "boolean"
      +      },
      +      "uppercase": {
      +        "description": "Captions in capitals",
      +        "type": "boolean"
      +      },
      +      "wordsPerLine": {
      +        "description": "Max caption words on screen at once (1-8, default 4)",
      +        "maximum": 8,
      +        "minimum": 1,
      +        "type": "integer"
      +      }
      +    },
      +    "type": "object"
      +  },
      +  {
      +    "type": "null"
      +  }
      +]
  3. Changed1 schema field changedv0.26.3
    • changedInput schema / properties / rerender / description
      Previous value: -"Re-render when a burned-in field changed (default true); false = keep the old video until rerender_clip"New value: +"Re-render when a burned-in field changed (default true, same as the app); false = keep the old video until rerender_clip"
  4. Changed1 schema field changedv0.23.0
    • changedInput schema / properties / layoutSections / anyOf
      Previous value: -[
      -  {
      -    "items": {
      -      "properties": {
      -        "end": {
      -          "description": "Section end, seconds from the start of the source video",
      -          "minimum": 0,
      -          "type": "number"
      -        },
      -        "mode": {
      -          "description": "Framing for this section (same modes as the project's reframe, without none)",
      -          "enum": [
      -            "auto",
      -            "face",
      -            "split",
      -            "stack",
      -            "fit",
      -            "center"
      -          ],
      -          "type": "string"
      -        },
      -        "offsetX": {
      -          "description": "Shift the (top) crop sideways by this fraction of the source width (-0.5 to 0.5), relative to the face it follows",
      -          "maximum": 0.5,
      -          "minimum": -0.5,
      -          "type": "number"
      -        },
      -        "offsetX2": {
      -          "description": "Split only: shift the bottom crop sideways (-0.5 to 0.5)",
      -          "maximum": 0.5,
      -          "minimum": -0.5,
      -          "type": "number"
      -        },
      -        "offsetY": {
      -          "description": "Shift the (top) crop up or down by this fraction of the source height; only matters where the crop is shorter than the frame (split, stack)",
      -          "maximum": 0.5,
      -          "minimum": -0.5,
      -          "type": "number"
      -        },
      -        "offsetY2": {
      -          "description": "Split only: shift the bottom crop up or down (-0.5 to 0.5)",
      -          "maximum": 0.5,
      -          "minimum": -0.5,
      -          "type": "number"
      -        },
      -        "start": {
      -          "description": "Section start, seconds from the start of the source video",
      -          "minimum": 0,
      -          "type": "number"
      -        },
      -        "subjectX": {
      -          "description": "Follow the person at this x (0-1 of the source width) in the top/only pane; the offset still applies on top",
      -          "maximum": 1,
      -          "minimum": 0,
      -          "type": "number"
      -        },
      -        "subjectX2": {
      -          "description": "Split only: follow the person at this x in the bottom pane",
      -          "maximum": 1,
      -          "minimum": 0,
      -          "type": "number"
      -        }
      -      },
      -      "required": [
      -        "start",
      -        "end",
      -        "mode"
      -      ],
      -      "type": "object"
      -    },
      -    "maxItems": 50,
      -    "type": "array"
      -  },
      -  {
      -    "type": "null"
      -  }
      -]New value: +[
      +  {
      +    "items": {
      +      "properties": {
      +        "contentCrop": {
      +          "description": "Stack only: the part of the frame shown on top instead of the whole frame or the detected content region",
      +          "properties": {
      +            "x1": {
      +              "description": "Left edge, fraction of the source width",
      +              "maximum": 1,
      +              "minimum": 0,
      +              "type": "number"
      +            },
      +            "x2": {
      +              "description": "Right edge, fraction of the source width",
      +              "maximum": 1,
      +              "minimum": 0,
      +              "type": "number"
      +            },
      +            "y1": {
      +              "description": "Top edge, fraction of the source height",
      +              "maximum": 1,
      +              "minimum": 0,
      +              "type": "number"
      +            },
      +            "y2": {
      +              "description": "Bottom edge, fraction of the source height",
      +              "maximum": 1,
      +              "minimum": 0,
      +              "type": "number"
      +            }
      +          },
      +          "required": [
      +            "x1",
      +            "y1",
      +            "x2",
      +            "y2"
      +          ],
      +          "type": "object"
      +        },
      +        "crop": {
      +          "description": "Show exactly this part of the source in the (top / only) pane, as fractions of the source size; replaces the automatic crop, the offset and the subject. A shape unlike the pane's is fitted over a blurred copy",
      +          "properties": {
      +            "x1": {
      +              "description": "Left edge, fraction of the source width",
      +              "maximum": 1,
      +              "minimum": 0,
      +              "type": "number"
      +            },
      +            "x2": {
      +              "description": "Right edge, fraction of the source width",
      +              "maximum": 1,
      +              "minimum": 0,
      +              "type": "number"
      +            },
      +            "y1": {
      +              "description": "Top edge, fraction of the source height",
      +              "maximum": 1,
      +              "minimum": 0,
      +              "type": "number"
      +            },
      +            "y2": {
      +              "description": "Bottom edge, fraction of the source height",
      +              "maximum": 1,
      +              "minimum": 0,
      +              "type": "number"
      +            }
      +          },
      +          "required": [
      +            "x1",
      +            "y1",
      +            "x2",
      +            "y2"
      +          ],
      +          "type": "object"
      +        },
      +        "crop2": {
      +          "description": "Split only: a fixed crop for the bottom pane",
      +          "properties": {
      +            "x1": {
      +              "description": "Left edge, fraction of the source width",
      +              "maximum": 1,
      +              "minimum": 0,
      +              "type": "number"
      +            },
      +            "x2": {
      +              "description": "Right edge, fraction of the source width",
      +              "maximum": 1,
      +              "minimum": 0,
      +              "type": "number"
      +            },
      +            "y1": {
      +              "description": "Top edge, fraction of the source height",
      +              "maximum": 1,
      +              "minimum": 0,
      +              "type": "number"
      +            },
      +            "y2": {
      +              "description": "Bottom edge, fraction of the source height",
      +              "maximum": 1,
      +              "minimum": 0,
      +              "type": "number"
      +            }
      +          },
      +          "required": [
      +            "x1",
      +            "y1",
      +            "x2",
      +            "y2"
      +          ],
      +          "type": "object"
      +        },
      +        "end": {
      +          "description": "Section end, seconds from the start of the source video",
      +          "minimum": 0,
      +          "type": "number"
      +        },
      +        "mode": {
      +          "description": "Framing for this section (same modes as the project's reframe, without none)",
      +          "enum": [
      +            "auto",
      +            "face",
      +            "split",
      +            "stack",
      +            "fit",
      +            "center"
      +          ],
      +          "type": "string"
      +        },
      +        "offsetX": {
      +          "description": "Shift the (top) crop sideways by this fraction of the source width (-0.5 to 0.5), relative to the face it follows",
      +          "maximum": 0.5,
      +          "minimum": -0.5,
      +          "type": "number"
      +        },
      +        "offsetX2": {
      +          "description": "Split only: shift the bottom crop sideways (-0.5 to 0.5)",
      +          "maximum": 0.5,
      +          "minimum": -0.5,
      +          "type": "number"
      +        },
      +        "offsetY": {
      +          "description": "Shift the (top) crop up or down by this fraction of the source height; only matters where the crop is shorter than the frame (split, stack)",
      +          "maximum": 0.5,
      +          "minimum": -0.5,
      +          "type": "number"
      +        },
      +        "offsetY2": {
      +          "description": "Split only: shift the bottom crop up or down (-0.5 to 0.5)",
      +          "maximum": 0.5,
      +          "minimum": -0.5,
      +          "type": "number"
      +        },
      +        "start": {
      +          "description": "Section start, seconds from the start of the source video",
      +          "minimum": 0,
      +          "type": "number"
      +        },
      +        "subjectX": {
      +          "description": "Follow the person at this x (0-1 of the source width) in the top/only pane; the offset still applies on top",
      +          "maximum": 1,
      +          "minimum": 0,
      +          "type": "number"
      +        },
      +        "subjectX2": {
      +          "description": "Split only: follow the person at this x in the bottom pane",
      +          "maximum": 1,
      +          "minimum": 0,
      +          "type": "number"
      +        }
      +      },
      +      "required": [
      +        "start",
      +        "end",
      +        "mode"
      +      ],
      +      "type": "object"
      +    },
      +    "maxItems": 50,
      +    "type": "array"
      +  },
      +  {
      +    "type": "null"
      +  }
      +]
  5. Changed3 schema fields changedv0.19.1
    • removedInput schema / properties / audio
      Removed value: -{
      -  "anyOf": [
      -    {
      -      "items": {
      -        "properties": {
      -          "assetId": {
      -            "description": "Library audio asset id (list_bumpers, kind audio); the same asset can be used more than once",
      -            "maxLength": 100,
      -            "minLength": 1,
      -            "type": "string"
      -          },
      -          "duck": {
      -            "description": "Lower the music while someone speaks (default true)",
      -            "type": "boolean"
      -          },
      -          "end": {
      -            "description": "Music stops after this second of the source video",
      -            "minimum": 0,
      -            "type": "number"
      -          },
      -          "fade": {
      -            "description": "Fade in and out, seconds (default 0.5)",
      -            "maximum": 5,
      -            "minimum": 0,
      -            "type": "number"
      -          },
      -          "id": {
      -            "description": "Stable id for this track (any short string; keep it when editing)",
      -            "maxLength": 40,
      -            "minLength": 1,
      -            "type": "string"
      -          },
      -          "loop": {
      -            "description": "Repeat the track when it is shorter than the window (default true)",
      -            "type": "boolean"
      -          },
      -          "offset": {
      -            "description": "Seconds into the track to start from (default 0)",
      -            "minimum": 0,
      -            "type": "number"
      -          },
      -          "start": {
      -            "description": "Music starts at this second of the source video",
      -            "minimum": 0,
      -            "type": "number"
      -          },
      -          "volume": {
      -            "description": "Music level 0-1 (default 0.6) on a track normalised to -20 LUFS, before ducking",
      -            "maximum": 1,
      -            "minimum": 0,
      -            "type": "number"
      -          }
      -        },
      -        "required": [
      -          "id",
      -          "assetId",
      -          "start",
      -          "end"
      -        ],
      -        "type": "object"
      -      },
      -      "maxItems": 10,
      -      "type": "array"
      -    },
      -    {
      -      "type": "null"
      -    }
      -  ],
      -  "description": "Background music tracks under parts of the clip (max 10; the same asset may repeat): library audio assets (list_bumpers, kind audio), each with a window in source seconds, volume, ducking under speech, fades. Replaces the list; null or [] = none"
      -}
    • addedInput schema / properties / layers
      Added value: +{
      +  "anyOf": [
      +    {
      +      "items": {
      +        "oneOf": [
      +          {
      +            "properties": {
      +              "assetId": {
      +                "description": "Library asset id (search_assets with source library): an image, an animation or a video",
      +                "maxLength": 100,
      +                "minLength": 1,
      +                "type": "string"
      +              },
      +              "end": {
      +                "description": "Hidden after this second of the source video",
      +                "minimum": 0,
      +                "type": "number"
      +              },
      +              "id": {
      +                "description": "Stable id for this overlay (any short string; keep it when editing)",
      +                "maxLength": 40,
      +                "minLength": 1,
      +                "type": "string"
      +              },
      +              "kind": {
      +                "const": "asset",
      +                "type": "string"
      +              },
      +              "loop": {
      +                "description": "Repeat a video / animation while its window is open (default: on for GIF and animated WebP, off for videos)",
      +                "type": "boolean"
      +              },
      +              "opacity": {
      +                "description": "0.1-1, default 1",
      +                "maximum": 1,
      +                "minimum": 0.1,
      +                "type": "number"
      +              },
      +              "start": {
      +                "description": "Shown from this second of the source video",
      +                "minimum": 0,
      +                "type": "number"
      +              },
      +              "w": {
      +                "description": "asset: width, fraction of the output width (0.05-1); the height follows the file. Default 0.3",
      +                "maximum": 1,
      +                "minimum": 0.05,
      +                "type": "number"
      +              },
      +              "x": {
      +                "description": "Centre, fraction of the output width (0-1)",
      +                "maximum": 1,
      +                "minimum": 0,
      +                "type": "number"
      +              },
      +              "y": {
      +                "description": "Centre, fraction of the output height (0-1)",
      +                "maximum": 1,
      +                "minimum": 0,
      +                "type": "number"
      +              }
      +            },
      +            "required": [
      +              "id",
      +              "assetId",
      +              "start",
      +              "end",
      +              "x",
      +              "y",
      +              "kind"
      +            ],
      +            "type": "object"
      +          },
      +          {
      +            "properties": {
      +              "box": {
      +                "description": "text: dark plate behind the text (default: outlined text, no plate)",
      +                "type": "boolean"
      +              },
      +              "color": {
      +                "description": "text: colour as #RRGGBB, default white",
      +                "pattern": "^#[0-9a-fA-F]{6}$",
      +                "type": "string"
      +              },
      +              "end": {
      +                "description": "Hidden after this second of the source video",
      +                "minimum": 0,
      +                "type": "number"
      +              },
      +              "font": {
      +                "description": "text: font family from TEXT_FONTS (default DejaVu Sans, the caption font)",
      +                "maxLength": 60,
      +                "minLength": 1,
      +                "type": "string"
      +              },
      +              "id": {
      +                "description": "Stable id for this overlay (any short string; keep it when editing)",
      +                "maxLength": 40,
      +                "minLength": 1,
      +                "type": "string"
      +              },
      +              "kind": {
      +                "const": "text",
      +                "type": "string"
      +              },
      +              "opacity": {
      +                "description": "0.1-1, default 1",
      +                "maximum": 1,
      +                "minimum": 0.1,
      +                "type": "number"
      +              },
      +              "size": {
      +                "description": "text: font size as a fraction of the output height (0.02-0.12), default 0.045",
      +                "maximum": 0.12,
      +                "minimum": 0.02,
      +                "type": "number"
      +              },
      +              "start": {
      +                "description": "Shown from this second of the source video",
      +                "minimum": 0,
      +                "type": "number"
      +              },
      +              "text": {
      +                "description": "The line to show (1-120 chars)",
      +                "maxLength": 120,
      +                "minLength": 1,
      +                "type": "string"
      +              },
      +              "x": {
      +                "description": "Centre, fraction of the output width (0-1)",
      +                "maximum": 1,
      +                "minimum": 0,
      +                "type": "number"
      +              },
      +              "y": {
      +                "description": "Centre, fraction of the output height (0-1)",
      +                "maximum": 1,
      +                "minimum": 0,
      +                "type": "number"
      +              }
      +            },
      +            "required": [
      +              "id",
      +              "text",
      +              "start",
      +              "end",
      +              "x",
      +              "y",
      +              "kind"
      +            ],
      +            "type": "object"
      +          },
      +          {
      +            "properties": {
      +              "assetId": {
      +                "description": "Library audio asset id (search_assets with source library, kind audio); the same asset can be used more than once",
      +                "maxLength": 100,
      +                "minLength": 1,
      +                "type": "string"
      +              },
      +              "duck": {
      +                "description": "Lower the music while someone speaks (default true)",
      +                "type": "boolean"
      +              },
      +              "end": {
      +                "description": "Music stops after this second of the source video",
      +                "minimum": 0,
      +                "type": "number"
      +              },
      +              "fade": {
      +                "description": "Fade in and out, seconds (default 0.5)",
      +                "maximum": 5,
      +                "minimum": 0,
      +                "type": "number"
      +              },
      +              "id": {
      +                "description": "Stable id for this track (any short string; keep it when editing)",
      +                "maxLength": 40,
      +                "minLength": 1,
      +                "type": "string"
      +              },
      +              "kind": {
      +                "const": "audio",
      +                "type": "string"
      +              },
      +              "loop": {
      +                "description": "Repeat the track when it is shorter than the window (default true)",
      +                "type": "boolean"
      +              },
      +              "offset": {
      +                "description": "Seconds into the track to start from (default 0)",
      +                "minimum": 0,
      +                "type": "number"
      +              },
      +              "start": {
      +                "description": "Music starts at this second of the source video",
      +                "minimum": 0,
      +                "type": "number"
      +              },
      +              "volume": {
      +                "description": "Music level 0-1 (default 0.6) on a track normalised to -20 LUFS, before ducking",
      +                "maximum": 1,
      +                "minimum": 0,
      +                "type": "number"
      +              }
      +            },
      +            "required": [
      +              "id",
      +              "assetId",
      +              "start",
      +              "end",
      +              "kind"
      +            ],
      +            "type": "object"
      +          }
      +        ]
      +      },
      +      "maxItems": 30,
      +      "type": "array"
      +    },
      +    {
      +      "type": "null"
      +    }
      +  ],
      +  "description": "Everything laid over or played under the clip, one list (max 30): kind asset = a library image/GIF/video (search_assets with source library; logos, stickers, b-roll), kind text = a line of text, kind audio = music or a sound effect (a library audio asset with a window in source seconds, volume, ducking, fade, loop). Replaces the whole list; null or [] = none. get_clip returns it"
      +}
    • removedInput schema / properties / overlays
      Removed value: -{
      -  "anyOf": [
      -    {
      -      "items": {
      -        "properties": {
      -          "assetId": {
      -            "description": "asset: library asset id (list_bumpers), an image or a video",
      -            "maxLength": 100,
      -            "minLength": 1,
      -            "type": "string"
      -          },
      -          "box": {
      -            "description": "text: dark plate behind the text (default: outlined text, no plate)",
      -            "type": "boolean"
      -          },
      -          "color": {
      -            "description": "text: colour as #RRGGBB, default white",
      -            "pattern": "^#[0-9a-fA-F]{6}$",
      -            "type": "string"
      -          },
      -          "end": {
      -            "description": "Hidden after this second of the source video",
      -            "minimum": 0,
      -            "type": "number"
      -          },
      -          "font": {
      -            "description": "text: font family from TEXT_FONTS (default DejaVu Sans, the caption font)",
      -            "maxLength": 60,
      -            "minLength": 1,
      -            "type": "string"
      -          },
      -          "id": {
      -            "description": "Stable id for this overlay (any short string; keep it when editing)",
      -            "maxLength": 40,
      -            "minLength": 1,
      -            "type": "string"
      -          },
      -          "kind": {
      -            "description": "asset (default): a library image or video; text: a line of text",
      -            "enum": [
      -              "asset",
      -              "text"
      -            ],
      -            "type": "string"
      -          },
      -          "opacity": {
      -            "description": "0.1-1, default 1",
      -            "maximum": 1,
      -            "minimum": 0.1,
      -            "type": "number"
      -          },
      -          "size": {
      -            "description": "text: font size as a fraction of the output height (0.02-0.12), default 0.045",
      -            "maximum": 0.12,
      -            "minimum": 0.02,
      -            "type": "number"
      -          },
      -          "start": {
      -            "description": "Shown from this second of the source video",
      -            "minimum": 0,
      -            "type": "number"
      -          },
      -          "text": {
      -            "description": "text: the line to show (1-120 chars)",
      -            "maxLength": 120,
      -            "minLength": 1,
      -            "type": "string"
      -          },
      -          "w": {
      -            "description": "asset: width, fraction of the output width (0.05-1); the height follows the file. Default 0.3",
      -            "maximum": 1,
      -            "minimum": 0.05,
      -            "type": "number"
      -          },
      -          "x": {
      -            "description": "Centre, fraction of the output width (0-1)",
      -            "maximum": 1,
      -            "minimum": 0,
      -            "type": "number"
      -          },
      -          "y": {
      -            "description": "Centre, fraction of the output height (0-1)",
      -            "maximum": 1,
      -            "minimum": 0,
      -            "type": "number"
      -          }
      -        },
      -        "required": [
      -          "id",
      -          "start",
      -          "end",
      -          "x",
      -          "y"
      -        ],
      -        "type": "object"
      -      },
      -      "maxItems": 20,
      -      "type": "array"
      -    },
      -    {
      -      "type": "null"
      -    }
      -  ],
      -  "description": "Things laid over the clip for a time range (max 20): kind asset = a library image/video (list_bumpers; logos, stickers, b-roll), kind text = a line of text (size, color, box). Replaces the list; null or [] = none"
      -}
  6. Changed3 schema fields changedv0.17.0
    • addedInput schema / properties / audio
      Added value: +{
      +  "anyOf": [
      +    {
      +      "items": {
      +        "properties": {
      +          "assetId": {
      +            "description": "Library audio asset id (list_bumpers, kind audio); the same asset can be used more than once",
      +            "maxLength": 100,
      +            "minLength": 1,
      +            "type": "string"
      +          },
      +          "duck": {
      +            "description": "Lower the music while someone speaks (default true)",
      +            "type": "boolean"
      +          },
      +          "end": {
      +            "description": "Music stops after this second of the source video",
      +            "minimum": 0,
      +            "type": "number"
      +          },
      +          "fade": {
      +            "description": "Fade in and out, seconds (default 0.5)",
      +            "maximum": 5,
      +            "minimum": 0,
      +            "type": "number"
      +          },
      +          "id": {
      +            "description": "Stable id for this track (any short string; keep it when editing)",
      +            "maxLength": 40,
      +            "minLength": 1,
      +            "type": "string"
      +          },
      +          "loop": {
      +            "description": "Repeat the track when it is shorter than the window (default true)",
      +            "type": "boolean"
      +          },
      +          "offset": {
      +            "description": "Seconds into the track to start from (default 0)",
      +            "minimum": 0,
      +            "type": "number"
      +          },
      +          "start": {
      +            "description": "Music starts at this second of the source video",
      +            "minimum": 0,
      +            "type": "number"
      +          },
      +          "volume": {
      +            "description": "Music level 0-1 (default 0.6) on a track normalised to -20 LUFS, before ducking",
      +            "maximum": 1,
      +            "minimum": 0,
      +            "type": "number"
      +          }
      +        },
      +        "required": [
      +          "id",
      +          "assetId",
      +          "start",
      +          "end"
      +        ],
      +        "type": "object"
      +      },
      +      "maxItems": 10,
      +      "type": "array"
      +    },
      +    {
      +      "type": "null"
      +    }
      +  ],
      +  "description": "Background music tracks under parts of the clip (max 10; the same asset may repeat): library audio assets (list_bumpers, kind audio), each with a window in source seconds, volume, ducking under speech, fades. Replaces the list; null or [] = none"
      +}
    • changedInput schema / properties / layoutSections / anyOf
      Previous value: -[
      -  {
      -    "items": {
      -      "properties": {
      -        "end": {
      -          "description": "Section end, seconds from the start of the source video",
      -          "minimum": 0,
      -          "type": "number"
      -        },
      -        "mode": {
      -          "description": "Framing for this section (same modes as the project's reframe, without none)",
      -          "enum": [
      -            "auto",
      -            "face",
      -            "split",
      -            "stack",
      -            "fit",
      -            "center"
      -          ],
      -          "type": "string"
      -        },
      -        "offsetX": {
      -          "description": "Shift the crop sideways by this fraction of the source width (-0.5 to 0.5)",
      -          "maximum": 0.5,
      -          "minimum": -0.5,
      -          "type": "number"
      -        },
      -        "start": {
      -          "description": "Section start, seconds from the start of the source video",
      -          "minimum": 0,
      -          "type": "number"
      -        }
      -      },
      -      "required": [
      -        "start",
      -        "end",
      -        "mode"
      -      ],
      -      "type": "object"
      -    },
      -    "maxItems": 50,
      -    "type": "array"
      -  },
      -  {
      -    "type": "null"
      -  }
      -]New value: +[
      +  {
      +    "items": {
      +      "properties": {
      +        "end": {
      +          "description": "Section end, seconds from the start of the source video",
      +          "minimum": 0,
      +          "type": "number"
      +        },
      +        "mode": {
      +          "description": "Framing for this section (same modes as the project's reframe, without none)",
      +          "enum": [
      +            "auto",
      +            "face",
      +            "split",
      +            "stack",
      +            "fit",
      +            "center"
      +          ],
      +          "type": "string"
      +        },
      +        "offsetX": {
      +          "description": "Shift the (top) crop sideways by this fraction of the source width (-0.5 to 0.5), relative to the face it follows",
      +          "maximum": 0.5,
      +          "minimum": -0.5,
      +          "type": "number"
      +        },
      +        "offsetX2": {
      +          "description": "Split only: shift the bottom crop sideways (-0.5 to 0.5)",
      +          "maximum": 0.5,
      +          "minimum": -0.5,
      +          "type": "number"
      +        },
      +        "offsetY": {
      +          "description": "Shift the (top) crop up or down by this fraction of the source height; only matters where the crop is shorter than the frame (split, stack)",
      +          "maximum": 0.5,
      +          "minimum": -0.5,
      +          "type": "number"
      +        },
      +        "offsetY2": {
      +          "description": "Split only: shift the bottom crop up or down (-0.5 to 0.5)",
      +          "maximum": 0.5,
      +          "minimum": -0.5,
      +          "type": "number"
      +        },
      +        "start": {
      +          "description": "Section start, seconds from the start of the source video",
      +          "minimum": 0,
      +          "type": "number"
      +        },
      +        "subjectX": {
      +          "description": "Follow the person at this x (0-1 of the source width) in the top/only pane; the offset still applies on top",
      +          "maximum": 1,
      +          "minimum": 0,
      +          "type": "number"
      +        },
      +        "subjectX2": {
      +          "description": "Split only: follow the person at this x in the bottom pane",
      +          "maximum": 1,
      +          "minimum": 0,
      +          "type": "number"
      +        }
      +      },
      +      "required": [
      +        "start",
      +        "end",
      +        "mode"
      +      ],
      +      "type": "object"
      +    },
      +    "maxItems": 50,
      +    "type": "array"
      +  },
      +  {
      +    "type": "null"
      +  }
      +]
    • addedInput schema / properties / overlays
      Added value: +{
      +  "anyOf": [
      +    {
      +      "items": {
      +        "properties": {
      +          "assetId": {
      +            "description": "asset: library asset id (list_bumpers), an image or a video",
      +            "maxLength": 100,
      +            "minLength": 1,
      +            "type": "string"
      +          },
      +          "box": {
      +            "description": "text: dark plate behind the text (default: outlined text, no plate)",
      +            "type": "boolean"
      +          },
      +          "color": {
      +            "description": "text: colour as #RRGGBB, default white",
      +            "pattern": "^#[0-9a-fA-F]{6}$",
      +            "type": "string"
      +          },
      +          "end": {
      +            "description": "Hidden after this second of the source video",
      +            "minimum": 0,
      +            "type": "number"
      +          },
      +          "font": {
      +            "description": "text: font family from TEXT_FONTS (default DejaVu Sans, the caption font)",
      +            "maxLength": 60,
      +            "minLength": 1,
      +            "type": "string"
      +          },
      +          "id": {
      +            "description": "Stable id for this overlay (any short string; keep it when editing)",
      +            "maxLength": 40,
      +            "minLength": 1,
      +            "type": "string"
      +          },
      +          "kind": {
      +            "description": "asset (default): a library image or video; text: a line of text",
      +            "enum": [
      +              "asset",
      +              "text"
      +            ],
      +            "type": "string"
      +          },
      +          "opacity": {
      +            "description": "0.1-1, default 1",
      +            "maximum": 1,
      +            "minimum": 0.1,
      +            "type": "number"
      +          },
      +          "size": {
      +            "description": "text: font size as a fraction of the output height (0.02-0.12), default 0.045",
      +            "maximum": 0.12,
      +            "minimum": 0.02,
      +            "type": "number"
      +          },
      +          "start": {
      +            "description": "Shown from this second of the source video",
      +            "minimum": 0,
      +            "type": "number"
      +          },
      +          "text": {
      +            "description": "text: the line to show (1-120 chars)",
      +            "maxLength": 120,
      +            "minLength": 1,
      +            "type": "string"
      +          },
      +          "w": {
      +            "description": "asset: width, fraction of the output width (0.05-1); the height follows the file. Default 0.3",
      +            "maximum": 1,
      +            "minimum": 0.05,
      +            "type": "number"
      +          },
      +          "x": {
      +            "description": "Centre, fraction of the output width (0-1)",
      +            "maximum": 1,
      +            "minimum": 0,
      +            "type": "number"
      +          },
      +          "y": {
      +            "description": "Centre, fraction of the output height (0-1)",
      +            "maximum": 1,
      +            "minimum": 0,
      +            "type": "number"
      +          }
      +        },
      +        "required": [
      +          "id",
      +          "start",
      +          "end",
      +          "x",
      +          "y"
      +        ],
      +        "type": "object"
      +      },
      +      "maxItems": 20,
      +      "type": "array"
      +    },
      +    {
      +      "type": "null"
      +    }
      +  ],
      +  "description": "Things laid over the clip for a time range (max 20): kind asset = a library image/video (list_bumpers; logos, stickers, b-roll), kind text = a line of text (size, color, box). Replaces the list; null or [] = none"
      +}
  7. Changed14 schema fields changedv0.7.0
    • addedInput schema / properties / caption / description
      Added value: +"Post caption, not burned in (max 300 chars)"
    • changedInput schema / properties / emphasis / description
      Previous value: -"Words the captions emphasise"New value: +"Words the captions colour (max 30); replaces the list"
    • addedInput schema / properties / endSec / description
      Added value: +"New end, seconds from the start of the source; clip must stay ≥3 s"
    • addedInput schema / properties / hashtags / description
      Added value: +"Hashtags without # (max 20); replaces the list"
    • addedInput schema / properties / hook / description
      Added value: +"On-screen opening line (max 80 chars)"
    • addedInput schema / properties / id / description
      Added value: +"Clip id (from get_project or search_clips)"
    • changedInput schema / properties / layoutOverride / anyOf
      Previous value: -[
      -  {
      -    "enum": [
      -      "auto",
      -      "face",
      -      "split",
      -      "stack",
      -      "fit",
      -      "center",
      -      "none"
      -    ],
      -    "type": "string"
      -  },
      -  {
      -    "type": "null"
      -  }
      -]New value: +[
      +  {
      +    "description": "Framing: auto (detect per section), face (follow the speaker), split (two speakers stacked), stack (full frame over a face crop), fit (whole frame on blur), center (static crop), none (original aspect)",
      +    "enum": [
      +      "auto",
      +      "face",
      +      "split",
      +      "stack",
      +      "fit",
      +      "center",
      +      "none"
      +    ],
      +    "type": "string"
      +  },
      +  {
      +    "type": "null"
      +  }
      +]
    • changedInput schema / properties / layoutSections / anyOf
      Previous value: -[
      -  {
      -    "items": {
      -      "properties": {
      -        "end": {
      -          "minimum": 0,
      -          "type": "number"
      -        },
      -        "mode": {
      -          "enum": [
      -            "auto",
      -            "face",
      -            "split",
      -            "stack",
      -            "fit",
      -            "center"
      -          ],
      -          "type": "string"
      -        },
      -        "offsetX": {
      -          "maximum": 0.5,
      -          "minimum": -0.5,
      -          "type": "number"
      -        },
      -        "start": {
      -          "minimum": 0,
      -          "type": "number"
      -        }
      -      },
      -      "required": [
      -        "start",
      -        "end",
      -        "mode"
      -      ],
      -      "type": "object"
      -    },
      -    "maxItems": 50,
      -    "type": "array"
      -  },
      -  {
      -    "type": "null"
      -  }
      -]New value: +[
      +  {
      +    "items": {
      +      "properties": {
      +        "end": {
      +          "description": "Section end, seconds from the start of the source video",
      +          "minimum": 0,
      +          "type": "number"
      +        },
      +        "mode": {
      +          "description": "Framing for this section (same modes as the project's reframe, without none)",
      +          "enum": [
      +            "auto",
      +            "face",
      +            "split",
      +            "stack",
      +            "fit",
      +            "center"
      +          ],
      +          "type": "string"
      +        },
      +        "offsetX": {
      +          "description": "Shift the crop sideways by this fraction of the source width (-0.5 to 0.5)",
      +          "maximum": 0.5,
      +          "minimum": -0.5,
      +          "type": "number"
      +        },
      +        "start": {
      +          "description": "Section start, seconds from the start of the source video",
      +          "minimum": 0,
      +          "type": "number"
      +        }
      +      },
      +      "required": [
      +        "start",
      +        "end",
      +        "mode"
      +      ],
      +      "type": "object"
      +    },
      +    "maxItems": 50,
      +    "type": "array"
      +  },
      +  {
      +    "type": "null"
      +  }
      +]
    • addedInput schema / properties / layoutSections / description
      Added value: +"Framing per time range (max 50), source seconds; replaces all sections; null or [] = automatic"
    • addedInput schema / properties / rerender / description
      Added value: +"Re-render when a burned-in field changed (default true); false = keep the old video until rerender_clip"
    • addedInput schema / properties / startSec / description
      Added value: +"New start, seconds from the start of the source video"
    • changedInput schema / properties / style / anyOf
      Previous value: -[
      -  {
      -    "properties": {
      -      "captionSize": {
      -        "default": 1,
      -        "maximum": 2,
      -        "minimum": 0.5,
      -        "type": "number"
      -      },
      -      "captionX": {
      -        "default": 0.5,
      -        "maximum": 1,
      -        "minimum": 0,
      -        "type": "number"
      -      },
      -      "captionY": {
      -        "default": 0.72,
      -        "maximum": 1,
      -        "minimum": 0,
      -        "type": "number"
      -      },
      -      "captions": {
      -        "default": "karaoke",
      -        "enum": [
      -          "karaoke",
      -          "box",
      -          "plain",
      -          "none"
      -        ],
      -        "type": "string"
      -      },
      -      "emphasis": {
      -        "default": true,
      -        "type": "boolean"
      -      },
      -      "emphasisColor": {
      -        "default": "#39FF14",
      -        "pattern": "^#[0-9a-fA-F]{6}$",
      -        "type": "string"
      -      },
      -      "highlightColor": {
      -        "default": "#FFD700",
      -        "pattern": "^#[0-9a-fA-F]{6}$",
      -        "type": "string"
      -      },
      -      "hookSeconds": {
      -        "default": 3.5,
      -        "maximum": 15,
      -        "minimum": 0,
      -        "type": "number"
      -      },
      -      "hookX": {
      -        "default": 0.5,
      -        "maximum": 1,
      -        "minimum": 0,
      -        "type": "number"
      -      },
      -      "hookY": {
      -        "default": 0.16,
      -        "maximum": 1,
      -        "minimum": 0,
      -        "type": "number"
      -      },
      -      "showHook": {
      -        "default": true,
      -        "type": "boolean"
      -      },
      -      "uppercase": {
      -        "default": false,
      -        "type": "boolean"
      -      },
      -      "wordsPerLine": {
      -        "default": 4,
      -        "maximum": 8,
      -        "minimum": 1,
      -        "type": "integer"
      -      }
      -    },
      -    "type": "object"
      -  },
      -  {
      -    "type": "null"
      -  }
      -]New value: +[
      +  {
      +    "properties": {
      +      "captionSize": {
      +        "description": "Caption size multiplier (0.5-2, default 1)",
      +        "maximum": 2,
      +        "minimum": 0.5,
      +        "type": "number"
      +      },
      +      "captionX": {
      +        "description": "Caption centre, horizontal, as a fraction of the 9:16 frame (0-1)",
      +        "maximum": 1,
      +        "minimum": 0,
      +        "type": "number"
      +      },
      +      "captionY": {
      +        "description": "Caption centre, vertical (default 0.72), as a fraction of the 9:16 frame (0-1)",
      +        "maximum": 1,
      +        "minimum": 0,
      +        "type": "number"
      +      },
      +      "captions": {
      +        "description": "Caption look: karaoke (active word highlighted), box, plain, or none (no captions)",
      +        "enum": [
      +          "karaoke",
      +          "box",
      +          "plain",
      +          "none"
      +        ],
      +        "type": "string"
      +      },
      +      "emphasis": {
      +        "description": "Colour the clip's key words (default true)",
      +        "type": "boolean"
      +      },
      +      "emphasisColor": {
      +        "description": "Colour of emphasised words, #RRGGBB (default #39FF14)",
      +        "pattern": "^#[0-9a-fA-F]{6}$",
      +        "type": "string"
      +      },
      +      "highlightColor": {
      +        "description": "Karaoke active-word colour, #RRGGBB (default #FFD700)",
      +        "pattern": "^#[0-9a-fA-F]{6}$",
      +        "type": "string"
      +      },
      +      "hookSeconds": {
      +        "description": "How long the hook shows, seconds (0-15, default 3.5)",
      +        "maximum": 15,
      +        "minimum": 0,
      +        "type": "number"
      +      },
      +      "hookX": {
      +        "description": "Hook centre, horizontal, as a fraction of the 9:16 frame (0-1)",
      +        "maximum": 1,
      +        "minimum": 0,
      +        "type": "number"
      +      },
      +      "hookY": {
      +        "description": "Hook centre, vertical (default 0.16), as a fraction of the 9:16 frame (0-1)",
      +        "maximum": 1,
      +        "minimum": 0,
      +        "type": "number"
      +      },
      +      "showHook": {
      +        "description": "Show the hook text at the start of the clip (default true)",
      +        "type": "boolean"
      +      },
      +      "uppercase": {
      +        "description": "Captions in capitals",
      +        "type": "boolean"
      +      },
      +      "wordsPerLine": {
      +        "description": "Max caption words on screen at once (1-8, default 4)",
      +        "maximum": 8,
      +        "minimum": 1,
      +        "type": "integer"
      +      }
      +    },
      +    "type": "object"
      +  },
      +  {
      +    "type": "null"
      +  }
      +]
    • addedInput schema / properties / style / description
      Added value: +"Caption/hook style for this clip on top of the project's; replaces the clip's override; null = follow the project"
    • addedInput schema / properties / title / description
      Added value: +"Clip title (1-120 chars)"
  8. First observedv0.1.0

TDQS

A4.5/5.0
Behavior5/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

With no annotations supplied, the description carries the full burden and does so well: it discloses patch semantics, whole-value replacement for specific fields, null handling, approximate re-render time (~1 min), burn-in fields, and the returned status fields. It also explains the asynchronous follow-up via get_clip polling.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is front-loaded and dense with operational detail, using semicolons to pack in replacement rules, re-render behavior, return values, and polling. It is appropriately sized for a 13-parameter mutation tool, though the single long paragraph is slightly hard to scan.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

For a complex update tool with 13 parameters, no annotations, and no output schema, the description provides the key behavioral context needed to invoke it correctly: replacement semantics, re-render effects, return shape, and follow-up polling. It does not cover permissions or error cases, but it is otherwise complete for practical use.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters4/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema coverage is already 100%, so the baseline is 3. The description still adds meaningful semantics beyond the schema by clarifying that only passed fields change, that style/layoutSections/layers replace the whole value, and that title/caption/hashtags apply immediately while certain burned-in fields re-render.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description opens with a specific verb and resource ('Edit one clip') plus a scope constraint ('3 s-10 min'), making the operation immediately identifiable. It also distinguishes patch behavior from whole-value replacement for style, layoutSections, and layers, which helps separate its role from sibling update tools.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

It clearly explains when changes apply instantly versus when they trigger a burn-in re-render, and it routes the agent to set rerender=false until rerender_clip is called. It also says to poll get_clip until done. It does not explicitly compare against every sibling, but the guidance is strong and operational.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.