Skip to main content
Glama

Make a talking-actor video

make_ugc

Generate lip-synced UGC videos from a script by choosing an actor or image, then set voice, aspect ratio, resolution, and opt-in captions before rendering.

Instructions

Input: the same fields as quote_ugc, plus attempt. Start a lip-synced UGC video; the actor is actor_id, image or the default. Format and resolution follow the request and the source, defaulting to 1080x1920. Captions are OPT-IN: ask the user first. A field marked NOT HONORED YET does not reach the renderer. Poll get_run with its poll.arguments; a failed run whose video is still being made can return to queued, named in warnings[]. attempt=2,3,… starts a NEW run. A video like a reference reel: plan_reference_remake with its analysis_id instead. Price: HeyGen presenter: presenter, HeyGen Avatar IV 9 credits per second the presenter is in the video, covered or not; OmniHuman presenter: presenter, OmniHuman 2.0 22 credits per second the presenter is in the video, covered or not; each plus production (voice and render) 1 credits per second of video plus live avatar on a call 400 credits per call still in the video, at least 50. Quote first with quote_ugc.

Tool call template

This tool declares no required parameters. Add optional parameters from the input schema as needed.

{
  "id": 1,
  "jsonrpc": "2.0",
  "method": "tools/call",
  "params": {
    "arguments": {},
    "name": "make_ugc"
  }
}

Input Schema

NameRequiredDescriptionDefault
callNo
lookNo
nameNo
imageNo
movesNo
musicNo
shotsNo
voiceNo
designNo
personNo
scenesNo
scriptNo
attemptNo
framingNo
insertsNo
actor_idNo
captionsNo
overlaysNo
segmentsNo
voice_idNo
interviewNo
templatesNo
tts_modelNo
backgroundNo
end_hold_sNo
pause_trimNo
resolutionNo
voice_paceNo
edit_soundsNo
actor_genderNo
aspect_ratioNo
broll_policyNo
caption_modeNo
motion_styleNo
caption_placeNo
caption_styleNo
presenter_micNo
layout_windowsNo
presenter_gazeNo
template_themeNo
presenter_placeNo
template_soundsNo
caption_emphasisNo
caption_positionNo
product_asset_idNo
visible_ai_labelNo
presenter_framingNo

Schema Changelog

Changes observed during successful MCP inspections.

  1. Changed9 schema fields changedv0.45.0
    • addedInput schema / properties / design
      Added value: +{
      +  "type": "object"
      +}
    • addedInput schema / properties / motion_style
      Added value: +{
      +  "type": "object"
      +}
    • addedInput schema / properties / moves
      Added value: +{
      +  "$ref": "#/$defs/d0"
      +}
    • addedInput schema / properties / music
      Added value: +{
      +  "anyOf": [
      +    {
      +      "type": "string"
      +    },
      +    {
      +      "type": "object"
      +    }
      +  ]
      +}
    • addedInput schema / properties / pause_trim / anyOf
      Added value: +[
      +  {
      +    "type": "boolean"
      +  },
      +  {
      +    "type": "object"
      +  }
      +]
    • removedInput schema / properties / pause_trim / type
      Removed value: -"object"
    • addedInput schema / properties / product_asset_id
      Added value: +{
      +  "type": "string"
      +}
    • addedInput schema / properties / scenes
      Added value: +{
      +  "$ref": "#/$defs/d0"
      +}
    • addedInput schema / properties / shots
      Added value: +{
      +  "$ref": "#/$defs/d0"
      +}
  2. Changed108 schema fields changedv0.39.0
    • addedInput schema / $defs
      Added value: +{
      +  "d0": {
      +    "items": {
      +      "type": "object"
      +    },
      +    "type": "array"
      +  }
      +}
    • removedInput schema / $schema
      Removed value: -"http://json-schema.org/draft-07/schema#"
    • removedInput schema / properties / actor_gender / description
      Removed value: -"Gender of the face in image: female | male. Only with image: picks the default voice of that gender (female: sarah, male: george; on gemini-3.8-flash-tts: kore and charon). Refused with actor_id (its gender is known) and without image. An explicit voice or voice_id wins and the response warns that actor_gender changed nothing."
    • removedInput schema / properties / actor_gender / enum
      Removed value: -[
      -  "female",
      -  "male"
      -]
    • removedInput schema / properties / actor_id / description
      Removed value: -"Saved Clipwright actor ID from list_actors. Choose actor_id, image, or person; do not combine them. Without voice or voice_id the voice follows the actor's gender. Do not combine with actor_gender."
    • removedInput schema / properties / actor_id / pattern
      Removed value: -"^actor_[a-z0-9][a-z0-9_-]{0,63}$"
    • removedInput schema / properties / aspect_ratio / description
      Removed value: -"Output format: 9:16 | 1:1 | 16:9. Omitted means 9:16 without an image; with an image, the supported format nearest the image's shape, even a landscape one — pass it explicitly whenever you pass image. A mismatch above 15% between the request and the source is refused (aspect_conflict) before any charge."
    • removedInput schema / properties / aspect_ratio / enum
      Removed value: -[
      -  "9:16",
      -  "1:1",
      -  "16:9"
      -]
    • removedInput schema / properties / attempt / maximum
      Removed value: -9007199254740991
    • removedInput schema / properties / attempt / minimum
      Removed value: -1
    • removedInput schema / properties / background / enum
      Removed value: -[
      -  "white",
      -  "blur",
      -  "contain"
      -]
    • removedInput schema / properties / broll_policy / description
      Removed value: -"STORED ONLY: Saved policy for B-roll: anyone allows people including the actor; no_actor excludes the actor; no_people excludes all people, including hands. Segmented media generation is closed. This setting is stored only and has no effect on actor-only videos. Run override wins over the account actor default; otherwise no_people."
    • removedInput schema / properties / broll_policy / enum
      Removed value: -[
      -  "anyone",
      -  "no_actor",
      -  "no_people"
      -]
    • removedInput schema / properties / call / additionalProperties
      Removed value: -{}
    • removedInput schema / properties / call / description
      Removed value: -"A call the presenter listens to: { after: { quote }, lines: [{ speaker: agent|caller, text }] (2–12), voices?, phone? }."
    • removedInput schema / properties / call / propertyNames
      Removed value: -{
      -  "type": "string"
      -}
    • removedInput schema / properties / caption_emphasis / description
      Removed value: -"Key words or short phrases to emphasise, each quoted from script and matched as an insert quote is (case and punctuation ignored). An item is the quote, or { quote, look }: look punch shows a small lead-in line from the same sentence over the quote as a large glowing keyword, look pill shows the quote alone in a rounded pill, look color shows it in the accent colour at the same size. Without a look, punch draws punch, hormozi and accent draw color, and other presets draw the quote larger in their highlight colour. Every occurrence is emphasised. Requires captions=true and script; a quote absent from script is refused before any charge."
    • changedInput schema / properties / caption_emphasis / items / anyOf
      Previous value: -[
      -  {
      -    "maxLength": 40,
      -    "minLength": 1,
      -    "type": "string"
      -  },
      -  {
      -    "additionalProperties": false,
      -    "properties": {
      -      "look": {
      -        "enum": [
      -          "punch",
      -          "pill",
      -          "color"
      -        ],
      -        "type": "string"
      -      },
      -      "punch_in": {
      -        "description": "Long form only: zoom into the presenter while the quote is spoken. Drawn only where captions are drawn and the presenter is on screen; otherwise warnings[] names it.",
      -        "type": "boolean"
      -      },
      -      "quote": {
      -        "maxLength": 40,
      -        "minLength": 1,
      -        "type": "string"
      -      }
      -    },
      -    "required": [
      -      "quote"
      -    ],
      -    "type": "object"
      -  }
      -]New value: +[
      +  {
      +    "type": "string"
      +  },
      +  {
      +    "type": "object"
      +  }
      +]
    • removedInput schema / properties / caption_emphasis / maxItems
      Removed value: -20
    • removedInput schema / properties / caption_emphasis / minItems
      Removed value: -1
    • removedInput schema / properties / caption_mode / description
      Removed value: -"full (default when omitted): every spoken word is captioned. highlights: captions appear only around caption_emphasis quotes (lead-in, quote, short tail) and nowhere else; requires caption_emphasis. In both modes captions are hidden while a full-frame insert is on screen or a template meets their band."
    • removedInput schema / properties / caption_mode / enum
      Removed value: -[
      -  "full",
      -  "highlights"
      -]
    • addedInput schema / properties / caption_place
      Added value: +{
      +  "type": "object"
      +}
    • removedInput schema / properties / caption_position / description
      Removed value: -"Where captions sit: top, middle, lower or bottom (80% of the height). Omitted means the caption_style's own place. Requires captions=true."
    • removedInput schema / properties / caption_position / enum
      Removed value: -[
      -  "top",
      -  "middle",
      -  "lower",
      -  "bottom"
      -]
    • removedInput schema / properties / caption_style / default
      Removed value: -"hormozi"
    • removedInput schema / properties / caption_style / description
      Removed value: -"Caption look when captions=true. hormozi: the default: heavy white uppercase with a thick black outline, up to three words per cue, one keyword per cue in yellow (emphasised, else the longest non-stop-word). accent: condensed bold white uppercase, no outline, up to three words per cue, one keyword per cue in orange (emphasised, else the longest non-stop-word). tiktok: bold rounded uppercase, one or two words at a time; the spoken word turns yellow and grows. youtube: clean bold sans-serif, five words on a dark rounded box near the bottom; words fade in, the spoken word in red. instagram: comic uppercase with a pink outline, two words at a time; the spoken word pops in orange. minimalist: plain sans-serif, five words on a half-transparent dark band, gentle fade. neon: cyan uppercase with a magenta outline, two words at a time; the spoken word pops in white. genz: large comic uppercase, one word at a time, slamming in with a pink highlight. campfire: rounded comic uppercase, three words; spoken words light up gold and stay lit. midnight: spooky uppercase, two words, slow fade; the spoken word in red. plottwist: heavy sans-serif, three words; the spoken word turns sky blue and grows. headline: tall condensed uppercase on a solid black band, three words; the spoken word scales up in yellow. promo: heavy sans-serif on a blue pill, three words; the spoken word pops in yellow. lecture: readable sans-serif, six words on a dark rounded box; the spoken word in green. highlighter: heavy sans-serif, four words; spoken words turn lime and stay lit. studio: sans-serif, seven words typed in on a blurred dark box; the spoken word in amber. broadcast: outlined sans-serif, eight words low in the frame; the spoken word in pale yellow. arcade: blocky yellow uppercase, two words; the spoken word bounces in white. clutch: brush uppercase, one word at a time, slamming in green. bubblegum: rounded display letters with a pink outline, two words; the spoken word bounces in yellow. crayon: marker handwriting with a navy outline, two words; the spoken word pops in orange. lyrics: handwritten script, five words; spoken words light up pink and stay lit. bassdrop: outlined display uppercase, one word at a time, scaling in orange. punch: mid-frame setup and punch: a small white lead-in line over one or two large blue glowing keywords; other words small and white. Alias: minimal draws minimalist. A font that cannot draw the script's letters is replaced by a plain sans-serif. Previews: https://clipwright.io/captions"
    • removedInput schema / properties / caption_style / enum
      Removed value: -[
      -  "hormozi",
      -  "accent",
      -  "tiktok",
      -  "youtube",
      -  "instagram",
      -  "minimalist",
      -  "neon",
      -  "genz",
      -  "campfire",
      -  "midnight",
      -  "plottwist",
      -  "headline",
      -  "promo",
      -  "lecture",
      -  "highlighter",
      -  "studio",
      -  "broadcast",
      -  "arcade",
      -  "clutch",
      -  "bubblegum",
      -  "crayon",
      -  "lyrics",
      -  "bassdrop",
      -  "punch",
      -  "minimal"
      -]
    • removedInput schema / properties / captions / default
      Removed value: -false
    • removedInput schema / properties / captions / description
      Removed value: -"Burn word-timed captions into the video, over the presenter and over inserts. Not available with segments."
    • removedInput schema / properties / edit_sounds / description
      Removed value: -"A low sound on every cut (insert, full-frame template, layout window, framing), its peak on the cut. Needs inserts, layout_windows or framing; template_sounds.edit picks it (list_template_sounds). Price unchanged."
    • addedInput schema / properties / end_hold_s
      Added value: +{
      +  "type": "number"
      +}
    • addedInput schema / properties / framing / $ref
      Added value: +"#/$defs/d0"
    • removedInput schema / properties / framing / description
      Removed value: -"Text-anchored presenter sizes: each cuts to close or medium on its words and back to the take where they end. Items may not overlap one another, an insert or a layout window. A framing drawn wholly under full-frame templates is named in warnings[]. Where a punch_in emphasis meets a framing, the framing is drawn. Requires script and long-form qualification on the server; the price does not change."
    • removedInput schema / properties / framing / items
      Removed value: -{
      -  "additionalProperties": false,
      -  "properties": {
      -    "anchor": {
      -      "anyOf": [
      -        {
      -          "additionalProperties": false,
      -          "properties": {
      -            "endWord": {
      -              "exclusiveMinimum": 0,
      -              "maximum": 9007199254740991,
      -              "type": "integer"
      -            },
      -            "startWord": {
      -              "maximum": 9007199254740991,
      -              "minimum": 0,
      -              "type": "integer"
      -            }
      -          },
      -          "required": [
      -            "startWord",
      -            "endWord"
      -          ],
      -          "type": "object"
      -        },
      -        {
      -          "additionalProperties": false,
      -          "properties": {
      -            "occurrence": {
      -              "maximum": 9007199254740991,
      -              "minimum": 0,
      -              "type": "integer"
      -            },
      -            "quote": {
      -              "maxLength": 10000,
      -              "minLength": 1,
      -              "type": "string"
      -            }
      -          },
      -          "required": [
      -            "quote"
      -          ],
      -          "type": "object"
      -        }
      -      ],
      -      "description": "The words it starts on, as an insert anchor: { startWord, endWord } or { quote, occurrence? }."
      -    },
      -    "cover_words": {
      -      "description": "How many spoken words the size holds, counted from the first word of its anchor. Omitted means the anchored words only.",
      -      "exclusiveMinimum": 0,
      -      "maximum": 10000,
      -      "type": "integer"
      -    },
      -    "id": {
      -      "description": "Unique across inserts, overlays, layout_windows, templates and framing.",
      -      "pattern": "^[a-zA-Z0-9][a-zA-Z0-9_-]{0,63}$",
      -      "type": "string"
      -    },
      -    "size": {
      -      "default": "close",
      -      "description": "close: the presenter 1.18 times larger about the face; medium: the take as rendered.",
      -      "enum": [
      -        "close",
      -        "medium"
      -      ],
      -      "type": "string"
      -    },
      -    "transition": {
      -      "default": "cut",
      -      "description": "cut: a hard cut to the size; flash: a warm light leak over the cut.",
      -      "enum": [
      -        "cut",
      -        "flash"
      -      ],
      -      "type": "string"
      -    }
      -  },
      -  "required": [
      -    "id",
      -    "anchor"
      -  ],
      -  "type": "object"
      -}
    • removedInput schema / properties / framing / maxItems
      Removed value: -20
    • removedInput schema / properties / framing / minItems
      Removed value: -1
    • removedInput schema / properties / framing / type
      Removed value: -"array"
    • removedInput schema / properties / image / description
      Removed value: -"Public https url of the actor's photo (PNG, JPEG or WebP, up to 10 MB). A file on disk goes through upload_image (POST /v1/uploads) first — pass the url it returns. A source we cannot use — private or loopback host, http, unreachable, redirecting, over 10 MB, or not one of those image types — is refused (unusable_source) before any charge. We do not detect the face's gender: pass actor_gender or voice, or the default male voice is used with a warning."
    • removedInput schema / properties / image / maxLength
      Removed value: -2048
    • removedInput schema / properties / image / pattern
      Removed value: -"^https:\\/\\/.*"
    • addedInput schema / properties / inserts / $ref
      Added value: +"#/$defs/d0"
    • removedInput schema / properties / inserts / description
      Removed value: -"Text-anchored image or video inserts over full narration, each covering cover_words spoken words from its anchor; requires long-form qualification on the server, 1080p and explicit broll_policy=anyone. Captions draw over inserts."
    • removedInput schema / properties / inserts / items
      Removed value: -{
      -  "additionalProperties": false,
      -  "properties": {
      -    "anchor": {
      -      "anyOf": [
      -        {
      -          "additionalProperties": false,
      -          "properties": {
      -            "endWord": {
      -              "exclusiveMinimum": 0,
      -              "maximum": 9007199254740991,
      -              "type": "integer"
      -            },
      -            "startWord": {
      -              "maximum": 9007199254740991,
      -              "minimum": 0,
      -              "type": "integer"
      -            }
      -          },
      -          "required": [
      -            "startWord",
      -            "endWord"
      -          ],
      -          "type": "object"
      -        },
      -        {
      -          "additionalProperties": false,
      -          "properties": {
      -            "occurrence": {
      -              "maximum": 9007199254740991,
      -              "minimum": 0,
      -              "type": "integer"
      -            },
      -            "quote": {
      -              "maxLength": 10000,
      -              "minLength": 1,
      -              "type": "string"
      -            }
      -          },
      -          "required": [
      -            "quote"
      -          ],
      -          "type": "object"
      -        }
      -      ]
      -    },
      -    "asset_id": {
      -      "description": "A ready PNG or JPEG image or MP4 video from your own assets (list_assets), instead of media_url. Pass exactly one of the two; media_type must match the asset's kind.",
      -      "pattern": "^ast_[a-f0-9]{32}$",
      -      "type": "string"
      -    },
      -    "cover_words": {
      -      "description": "How many spoken words this insert covers, counted from the first word of its anchor. Omitted means the anchored words only. The insert ends where the first uncovered word begins, so inserts whose coverage meets are adjacent frame for frame and leave no actor shot between them.",
      -      "exclusiveMinimum": 0,
      -      "maximum": 10000,
      -      "type": "integer"
      -    },
      -    "id": {
      -      "pattern": "^[a-zA-Z0-9][a-zA-Z0-9_-]{0,63}$",
      -      "type": "string"
      -    },
      -    "image_motion": {
      -      "additionalProperties": false,
      -      "description": "Optional picture zoom. A picture always fills the frame, cut to its shape when the shapes differ (warnings[] names the share cut). amount is the zoom beyond filling: in grows from 1 to 1+amount, out shrinks from 1+amount to 1. No motion by default.",
      -      "properties": {
      -        "amount": {
      -          "exclusiveMaximum": 1,
      -          "minimum": 0,
      -          "type": "number"
      -        },
      -        "direction": {
      -          "enum": [
      -            "in",
      -            "out"
      -          ],
      -          "type": "string"
      -        }
      -      },
      -      "required": [
      -        "direction",
      -        "amount"
      -      ],
      -      "type": "object"
      -    },
      -    "media_type": {
      -      "description": "image (PNG or JPEG) or video (MP4, H.264 or HEVC, 8-bit SDR). A video plays muted from its first frame and is cut where its words end; one shorter than its words holds its last frame, and warnings[] names it.",
      -      "enum": [
      -        "image",
      -        "video"
      -      ],
      -      "type": "string"
      -    },
      -    "media_url": {
      -      "description": "Public https URL of the media. Pass exactly one of media_url or asset_id.",
      -      "format": "starts_with",
      -      "maxLength": 2048,
      -      "pattern": "^https:\\/\\/.*",
      -      "type": "string"
      -    },
      -    "transition": {
      -      "description": "How the insert comes in and goes out: cut (default), wipe (slides across the presenter), flash (a white flash on the cut) or zoom (eases in from a closer framing). It never moves the insert's start or end.",
      -      "enum": [
      -        "cut",
      -        "wipe",
      -        "flash",
      -        "zoom"
      -      ],
      -      "type": "string"
      -    }
      -  },
      -  "required": [
      -    "id",
      -    "media_type",
      -    "anchor"
      -  ],
      -  "type": "object"
      -}
    • removedInput schema / properties / inserts / maxItems
      Removed value: -49
    • removedInput schema / properties / inserts / minItems
      Removed value: -1
    • removedInput schema / properties / inserts / type
      Removed value: -"array"
    • addedInput schema / properties / interview
      Added value: +{
      +  "type": "object"
      +}
    • addedInput schema / properties / layout_windows / $ref
      Added value: +"#/$defs/d0"
    • removedInput schema / properties / layout_windows / description
      Removed value: -"Text-anchored reframings of the presenter: split (9:16 only) or card. Windows may not overlap one another or an insert. Same requirements as inserts. A covered or blurred presenter is still delivered vendor work and is billed as face time."
    • removedInput schema / properties / layout_windows / items
      Removed value: -{
      -  "additionalProperties": false,
      -  "properties": {
      -    "anchor": {
      -      "anyOf": [
      -        {
      -          "additionalProperties": false,
      -          "properties": {
      -            "endWord": {
      -              "exclusiveMinimum": 0,
      -              "maximum": 9007199254740991,
      -              "type": "integer"
      -            },
      -            "startWord": {
      -              "maximum": 9007199254740991,
      -              "minimum": 0,
      -              "type": "integer"
      -            }
      -          },
      -          "required": [
      -            "startWord",
      -            "endWord"
      -          ],
      -          "type": "object"
      -        },
      -        {
      -          "additionalProperties": false,
      -          "properties": {
      -            "occurrence": {
      -              "maximum": 9007199254740991,
      -              "minimum": 0,
      -              "type": "integer"
      -            },
      -            "quote": {
      -              "maxLength": 10000,
      -              "minLength": 1,
      -              "type": "string"
      -            }
      -          },
      -          "required": [
      -            "quote"
      -          ],
      -          "type": "object"
      -        }
      -      ],
      -      "description": "The words it starts on, as an insert anchor: { startWord, endWord } or { quote, occurrence? }."
      -    },
      -    "asset_id": {
      -      "description": "A ready PNG or JPEG image or MP4 video from your own assets (list_assets), instead of media_url. Pass exactly one of the two; media_type must match the asset's kind.",
      -      "pattern": "^ast_[a-f0-9]{32}$",
      -      "type": "string"
      -    },
      -    "blur_presenter": {
      -      "description": "Card only: blur the presenter behind the card.",
      -      "type": "boolean"
      -    },
      -    "cover_words": {
      -      "description": "How many spoken words it stays on screen, counted from the first word of its anchor. Omitted means the anchored words only.",
      -      "exclusiveMinimum": 0,
      -      "maximum": 10000,
      -      "type": "integer"
      -    },
      -    "enter": {
      -      "description": "How it appears: cut (default), fade, slide (in from the nearest edge) or tilt_in. It leaves with a cut.",
      -      "enum": [
      -        "cut",
      -        "fade",
      -        "slide",
      -        "tilt_in"
      -      ],
      -      "type": "string"
      -    },
      -    "id": {
      -      "description": "Unique across inserts, overlays and layout_windows.",
      -      "pattern": "^[a-zA-Z0-9][a-zA-Z0-9_-]{0,63}$",
      -      "type": "string"
      -    },
      -    "layout": {
      -      "description": "split: presenter in the top half, media in the bottom half, captions on the seam (9:16 only). card: the media in a centred card over the presenter.",
      -      "enum": [
      -        "split",
      -        "card"
      -      ],
      -      "type": "string"
      -    },
      -    "media_type": {
      -      "description": "image (PNG or JPEG) or video (MP4, H.264 or HEVC, 8-bit SDR). A video plays muted from its first frame and is cut where its words end; one shorter than its words holds its last frame, and warnings[] names it.",
      -      "enum": [
      -        "image",
      -        "video"
      -      ],
      -      "type": "string"
      -    },
      -    "media_url": {
      -      "description": "Public https URL of the media. Pass exactly one of media_url or asset_id.",
      -      "format": "starts_with",
      -      "maxLength": 2048,
      -      "pattern": "^https:\\/\\/.*",
      -      "type": "string"
      -    }
      -  },
      -  "required": [
      -    "id",
      -    "media_type",
      -    "anchor",
      -    "layout"
      -  ],
      -  "type": "object"
      -}
    • removedInput schema / properties / layout_windows / maxItems
      Removed value: -5
    • removedInput schema / properties / layout_windows / minItems
      Removed value: -1
    • removedInput schema / properties / layout_windows / type
      Removed value: -"array"
    • removedInput schema / properties / look / default
      Removed value: -"natural"
    • removedInput schema / properties / look / description
      Removed value: -"NOT HONORED YET: look is not honored yet: it does not reach the renderer"
    • removedInput schema / properties / look / enum
      Removed value: -[
      -  "natural",
      -  "commercial",
      -  "raw_iphone"
      -]
    • removedInput schema / properties / name / description
      Removed value: -"NOT HONORED YET: name is not honored yet: it does not reach the renderer"
    • removedInput schema / properties / name / maxLength
      Removed value: -100
    • addedInput schema / properties / overlays / $ref
      Added value: +"#/$defs/d0"
    • removedInput schema / properties / overlays / description
      Removed value: -"Text-anchored images or videos over the visible presenter, in a corner or a band at the top or bottom. At most 2 on screen at once, and two on screen together need positions that do not share a corner. Captions move to the middle or bottom third when an overlay meets them, never up over the face, and hide while neither is free. An overlay is not drawn while a full-frame insert is on screen. Same requirements as inserts: script, long-form qualification on the server, 1080p and explicit broll_policy=anyone. The presenter stays on screen, so the price does not change."
    • removedInput schema / properties / overlays / items
      Removed value: -{
      -  "additionalProperties": false,
      -  "properties": {
      -    "anchor": {
      -      "anyOf": [
      -        {
      -          "additionalProperties": false,
      -          "properties": {
      -            "endWord": {
      -              "exclusiveMinimum": 0,
      -              "maximum": 9007199254740991,
      -              "type": "integer"
      -            },
      -            "startWord": {
      -              "maximum": 9007199254740991,
      -              "minimum": 0,
      -              "type": "integer"
      -            }
      -          },
      -          "required": [
      -            "startWord",
      -            "endWord"
      -          ],
      -          "type": "object"
      -        },
      -        {
      -          "additionalProperties": false,
      -          "properties": {
      -            "occurrence": {
      -              "maximum": 9007199254740991,
      -              "minimum": 0,
      -              "type": "integer"
      -            },
      -            "quote": {
      -              "maxLength": 10000,
      -              "minLength": 1,
      -              "type": "string"
      -            }
      -          },
      -          "required": [
      -            "quote"
      -          ],
      -          "type": "object"
      -        }
      -      ],
      -      "description": "The words it starts on, as an insert anchor: { startWord, endWord } or { quote, occurrence? }."
      -    },
      -    "asset_id": {
      -      "description": "A ready PNG or JPEG image or MP4 video from your own assets (list_assets), instead of media_url. Pass exactly one of the two; media_type must match the asset's kind.",
      -      "pattern": "^ast_[a-f0-9]{32}$",
      -      "type": "string"
      -    },
      -    "cover_words": {
      -      "description": "How many spoken words it stays on screen, counted from the first word of its anchor. Omitted means the anchored words only.",
      -      "exclusiveMinimum": 0,
      -      "maximum": 10000,
      -      "type": "integer"
      -    },
      -    "enter": {
      -      "description": "How it appears: cut (default), fade, slide (in from the nearest edge) or tilt_in. It leaves with a cut.",
      -      "enum": [
      -        "cut",
      -        "fade",
      -        "slide",
      -        "tilt_in"
      -      ],
      -      "type": "string"
      -    },
      -    "id": {
      -      "description": "Unique across inserts, overlays and layout_windows.",
      -      "pattern": "^[a-zA-Z0-9][a-zA-Z0-9_-]{0,63}$",
      -      "type": "string"
      -    },
      -    "media_type": {
      -      "description": "image (PNG or JPEG) or video (MP4, H.264 or HEVC, 8-bit SDR). A video plays muted from its first frame and is cut where its words end; one shorter than its words holds its last frame, and warnings[] names it.",
      -      "enum": [
      -        "image",
      -        "video"
      -      ],
      -      "type": "string"
      -    },
      -    "media_url": {
      -      "description": "Public https URL of the media. Pass exactly one of media_url or asset_id.",
      -      "format": "starts_with",
      -      "maxLength": 2048,
      -      "pattern": "^https:\\/\\/.*",
      -      "type": "string"
      -    },
      -    "position": {
      -      "description": "A corner (top_left, top_right, bottom_left, bottom_right), or a band across the top or bottom.",
      -      "enum": [
      -        "top_left",
      -        "top_right",
      -        "bottom_left",
      -        "bottom_right",
      -        "top",
      -        "bottom"
      -      ],
      -      "type": "string"
      -    }
      -  },
      -  "required": [
      -    "id",
      -    "media_type",
      -    "anchor",
      -    "position"
      -  ],
      -  "type": "object"
      -}
    • removedInput schema / properties / overlays / maxItems
      Removed value: -10
    • removedInput schema / properties / overlays / minItems
      Removed value: -1
    • removedInput schema / properties / overlays / type
      Removed value: -"array"
    • removedInput schema / properties / pause_trim / additionalProperties
      Removed value: -false
    • removedInput schema / properties / pause_trim / description
      Removed value: -"Shorten narration pauses longer than these seconds, cutting silence only."
    • removedInput schema / properties / pause_trim / properties
      Removed value: -{
      -  "comma_s": {
      -    "maximum": 2,
      -    "minimum": 0.05,
      -    "type": "number"
      -  },
      -  "mid_phrase_s": {
      -    "maximum": 2,
      -    "minimum": 0.05,
      -    "type": "number"
      -  },
      -  "sentence_end_s": {
      -    "maximum": 2,
      -    "minimum": 0.05,
      -    "type": "number"
      -  }
      -}
    • removedInput schema / properties / person / description
      Removed value: -"NOT HONORED YET: person is not honored yet: this request uses the default actor; choose actor_id from list_actors or provide image to select a different face"
    • removedInput schema / properties / person / maxLength
      Removed value: -500
    • removedInput schema / properties / person / minLength
      Removed value: -1
    • removedInput schema / properties / presenter_framing / description
      Removed value: -"close (default) or wide: presenter lower, room above. Needs the actor's wide view (list_actors), 9:16 only; else close plus warnings[]."
    • removedInput schema / properties / presenter_framing / enum
      Removed value: -[
      -  "close",
      -  "wide"
      -]
    • addedInput schema / properties / presenter_gaze
      Added value: +{
      +  "$ref": "#/$defs/d0"
      +}
    • removedInput schema / properties / presenter_mic / description
      Removed value: -"true: presenter holds a tiny mic. Needs the actor's mic view in that framing (list_actors; library ones are wide); else no mic plus warnings[]."
    • addedInput schema / properties / presenter_place
      Added value: +{
      +  "type": "object"
      +}
    • removedInput schema / properties / resolution / description
      Removed value: -"Output resolution: 720p | 1080p | 4k (short side 720 / 1080 / 2160 px). Omitted means 1080p."
    • removedInput schema / properties / resolution / enum
      Removed value: -[
      -  "720p",
      -  "1080p",
      -  "4k"
      -]
    • removedInput schema / properties / script / description
      Removed value: -"The words the actor says; required unless segments supplies the spoken text. Segments and text-anchored inserts require long-form qualification on the server. Script limits by speech model: eleven_v3: 5000 characters; eleven_flash_v2_5: 10000 characters; eleven_turbo_v2_5: 10000 characters; eleven_v4: 5000 characters; gemini-3.8-flash-tts: 5000 characters. Count includes spaces, audio tags and stress marks; emoji may count as two characters. Break tags are cut from the text sent to eleven_v4 and gemini-3.8-flash-tts and are not counted there. There is no word-count limit. Duration and price are estimates until measured. Russian stress: write the stressed vowel as a capital inside a lowercase word (\"потОм\", \"зАмок\") and eleven_v4 and gemini-3.8-flash-tts receive it as the stress mark U+0301 (\"пото́м\"); a mark typed directly is kept. A capital at the start of a word stays a capital, and a word with a second capital or a capital consonant inside (all caps, \"ВУЗы\") is left as it is. A single capital vowel inside a word is always read as stress, so write \"Яндекс Еда\", not \"ЯндексЕда\". Tell users writing in Russian that they can mark stress this way. eleven_flash_v2_5 and eleven_turbo_v2_5 cost less but misread stress marks: capitals reach them unchanged."
    • removedInput schema / properties / script / maxLength
      Removed value: -10000
    • removedInput schema / properties / script / minLength
      Removed value: -1
    • addedInput schema / properties / segments / $ref
      Added value: +"#/$defs/d0"
    • removedInput schema / properties / segments / description
      Removed value: -"Ordered actor and image segments; requires long-form qualification on the server, captions=false and 1080p. Image media requires explicit broll_policy=anyone."
    • removedInput schema / properties / segments / items
      Removed value: -{
      -  "properties": {
      -    "duration_seconds": {
      -      "description": "Required for an image segment; its display duration in seconds. Not accepted for actor or video segments.",
      -      "exclusiveMinimum": 0,
      -      "type": "number"
      -    },
      -    "image_motion": {
      -      "description": "Optional picture zoom. A picture always fills the frame, cut to its shape when the shapes differ (warnings[] names the share cut). amount is the zoom beyond filling: in grows from 1 to 1+amount, out shrinks from 1+amount to 1. No motion by default.",
      -      "properties": {
      -        "amount": {
      -          "exclusiveMaximum": 1,
      -          "minimum": 0,
      -          "type": "number"
      -        },
      -        "direction": {
      -          "enum": [
      -            "in",
      -            "out"
      -          ],
      -          "type": "string"
      -        }
      -      },
      -      "required": [
      -        "direction",
      -        "amount"
      -      ],
      -      "type": "object"
      -    },
      -    "kind": {
      -      "enum": [
      -        "actor",
      -        "media"
      -      ],
      -      "type": "string"
      -    },
      -    "media_type": {
      -      "description": "Explicit media source type; omission means video, regardless of URL suffix. Availability follows the segments field.",
      -      "enum": [
      -        "image",
      -        "video"
      -      ],
      -      "type": "string"
      -    },
      -    "media_url": {
      -      "format": "uri",
      -      "maxLength": 2048,
      -      "type": "string"
      -    },
      -    "script": {
      -      "maxLength": 10000,
      -      "minLength": 1,
      -      "type": "string"
      -    }
      -  },
      -  "required": [
      -    "kind"
      -  ],
      -  "type": "object"
      -}
    • removedInput schema / properties / segments / maxItems
      Removed value: -5
    • removedInput schema / properties / segments / minItems
      Removed value: -1
    • removedInput schema / properties / segments / type
      Removed value: -"array"
    • changedInput schema / properties / template_sounds / anyOf
      Previous value: -[
      -  {
      -    "const": false,
      -    "type": "boolean"
      -  },
      -  {
      -    "additionalProperties": {
      -      "type": "string"
      -    },
      -    "propertyNames": {
      -      "type": "string"
      -    },
      -    "type": "object"
      -  }
      -]New value: +[
      +  {
      +    "type": "boolean"
      +  },
      +  {
      +    "type": "object"
      +  }
      +]
    • removedInput schema / properties / template_sounds / description
      Removed value: -"Template sounds: false for none, or { beat: name } over the defaults; list_template_sounds names them."
    • removedInput schema / properties / template_theme / additionalProperties
      Removed value: -false
    • removedInput schema / properties / template_theme / description
      Removed value: -"The look of every template in the run: a preset and an optional accent; only with templates."
    • removedInput schema / properties / template_theme / properties
      Removed value: -{
      -  "accent": {
      -    "description": "#RRGGBB in place of the preset's accent: the pills' fill and the accent text. Refused below 3:1 against the colours it meets.",
      -    "pattern": "^#[0-9A-Fa-f]{6}$",
      -    "type": "string"
      -  },
      -  "preset": {
      -    "description": "clean_light (light cards on our blue gradient), bold_dark (dark cards, a yellow accent), neon (black, cyan to blue), paper (warm cream, terracotta) or mono (black and white); omitted is clean_light.",
      -    "enum": [
      -      "clean_light",
      -      "bold_dark",
      -      "neon",
      -      "paper",
      -      "mono"
      -    ],
      -    "type": "string"
      -  }
      -}
    • addedInput schema / properties / templates / $ref
      Added value: +"#/$defs/d0"
    • removedInput schema / properties / templates / description
      Removed value: -"Graphic templates, each { id, kind, anchor, cover_words?, placement?, transition?, data }. On any script run. Templates never change the price: every run is billed by its parts as list_prices states them, and a presenter a template covers is still presenter time. Ids are unique across inserts, overlays, layout_windows and templates. Text is one line of Latin or the script's own letters, digits and common punctuation, with no emoji; a wide CJK glyph counts 2 toward a limit, and long text shrinks to fit the kind's width. size small|medium|large scales a kind; absent is medium. A media field takes { asset_id } of a ready asset of the kind it names. An inner quote names words inside the template's own words, after the one before it: its beat lands on their first word, and must not fall under an insert or full-frame template; a click or step without one is spread evenly. A beat spoken before its template has entered moves just after the enter, with a warning. A template that meets the caption band hides captions while it shows; one elsewhere, such as a small one at the top, leaves them. A full-frame template also hides the presenter, overlays and over-presenter templates while it shows, never meets a wipe or zoom insert, and the covered presenter is billed. At most 2 overlays and over-presenter templates show at once, on footprints that do not overlap. template_theme sets the look of them all. Kinds: tag (over): a short gradient pill over the presenter or an insert; without position it sits in the caption spot and hides captions while it shows; data text ≤ 32, position? top|center|bottom, size? small|medium|large. lower_third (over): a name and role bar low in the frame; captions are hidden while it shows; data name ≤ 28, role? ≤ 36, side left|right, size? small|medium|large. end_card (over): a site pill with an optional call to action in the caption spot; captions are hidden while it shows; data site ≤ 32, cta? ≤ 48, size? small|medium|large. title_card (full): a full-frame hook card: the title (up to two lines) on a white card beside an optional logo image, and an optional chip under it; data title ≤ 48, chip? ≤ 32, logo? {asset_id} image, size? small|medium|large. quote (full): a full-frame quote: marks, the text in up to four lines, then the author with an optional round photo, cut to a circle; data text ≤ 120, author? ≤ 32, photo? {asset_id} image (cut to fill), size? small|medium|large. stat (full|over): a number counting up from 0 to value (up to 2 decimals), with prefix and suffix around it and a label under it; full fills the frame, over sits at chest level on a card; data value number, prefix? ≤ 6, suffix? ≤ 6, label? ≤ 32, size? small|medium|large. callout (over): an arrow or ring that lands on a point of the frame and pulses, target {x,y} in % of the frame from its top left, with an optional label pill below or above it; it may point at the face, its label keeps off the face where it can; also over an insert; data target {x,y}, style arrow|ring, text? ≤ 24, size? small|medium|large. checklist (over): 2–4 rows, each an optional icon, a label and a switch or check box set on or off; a cursor clicks rows in turn (item is the row's index from 0), each click flipping it; below the face; data items 2–4 of {label ≤ 24, on true|false, icon? phone|briefcase|user|clock|chat|star}, clicks? 0–6 of {item number, quote? inner quote}, style? switch|check, size? small|medium|large. phone_call (over): an incoming call on a neutral phone at the side (right unless side left): the caller, a subtitle and a round avatar ring, then the call is answered on answer_at and its timer runs (or a hold banner shows); beside the face in wide frames, under it in tall ones; data caller ≤ 24, subtitle? ≤ 32, avatar? {asset_id} image (cut to fill), answer_at inner quote, side? left|right, size? small|medium|large, banner? ≤ 32, banner_note? ≤ 48, mask_number? true|false. compare (full): a full-frame card showing the before image, then the after image sweeps in on a diagonal on reveal_at and both stay side by side, each with an optional label pill; both images are cut to fill a 3:5 card; data before {asset_id} image (cut to fill), after {asset_id} image (cut to fill), labels? {before? ≤ 20, after? ≤ 20}, reveal_at inner quote, size? small|medium|large. notification (over): a phone notification at the top, above the face: an icon (else the app's initial), the app, a title and a body line; it drops in, holds at least 1.2 s, then leaves before its span ends; data app ≤ 20, title ≤ 32, body ≤ 80, icon? phone|briefcase|user|clock|chat|star, size? small|medium|large. progress (over): 2–5 steps in a column on a card, each completing with a check in turn, on its advance_at quote (one per step, in order) or spread evenly; below the face; data steps 2–5 of ≤ 20, advance_at? 2–5 of inner quote, size? small|medium|large. rating (over): five stars on a card filling in turn up to stars (1–5 in halves, a half star half filled), an optional label under them; at chest level; data stars number, label? ≤ 32, size? small|medium|large."
    • removedInput schema / properties / templates / items
      Removed value: -{
      -  "additionalProperties": false,
      -  "properties": {
      -    "anchor": {
      -      "anyOf": [
      -        {
      -          "additionalProperties": false,
      -          "properties": {
      -            "endWord": {
      -              "exclusiveMinimum": 0,
      -              "maximum": 9007199254740991,
      -              "type": "integer"
      -            },
      -            "startWord": {
      -              "maximum": 9007199254740991,
      -              "minimum": 0,
      -              "type": "integer"
      -            }
      -          },
      -          "required": [
      -            "startWord",
      -            "endWord"
      -          ],
      -          "type": "object"
      -        },
      -        {
      -          "additionalProperties": false,
      -          "properties": {
      -            "occurrence": {
      -              "maximum": 9007199254740991,
      -              "minimum": 0,
      -              "type": "integer"
      -            },
      -            "quote": {
      -              "maxLength": 10000,
      -              "minLength": 1,
      -              "type": "string"
      -            }
      -          },
      -          "required": [
      -            "quote"
      -          ],
      -          "type": "object"
      -        }
      -      ],
      -      "description": "The words it starts on, as an insert anchor: { startWord, endWord } or { quote, occurrence? }."
      -    },
      -    "cover_words": {
      -      "description": "How many spoken words it stays on screen, counted from the first word of its anchor. Omitted means the anchored words only.",
      -      "exclusiveMinimum": 0,
      -      "maximum": 10000,
      -      "type": "integer"
      -    },
      -    "data": {
      -      "additionalProperties": {},
      -      "description": "The kind's fields, as its catalog line in templates names them.",
      -      "propertyNames": {
      -        "type": "string"
      -      },
      -      "type": "object"
      -    },
      -    "id": {
      -      "description": "Unique across inserts, overlays, layout_windows and templates.",
      -      "pattern": "^[a-zA-Z0-9][a-zA-Z0-9_-]{0,63}$",
      -      "type": "string"
      -    },
      -    "kind": {
      -      "enum": [
      -        "tag",
      -        "lower_third",
      -        "end_card",
      -        "title_card",
      -        "quote",
      -        "stat",
      -        "callout",
      -        "checklist",
      -        "phone_call",
      -        "compare",
      -        "notification",
      -        "progress",
      -        "rating"
      -      ],
      -      "type": "string"
      -    },
      -    "placement": {
      -      "description": "over (drawn over the presenter) or full (fills the frame); omitted means the kind's first placement, and a kind takes only the placements its catalog line names.",
      -      "enum": [
      -        "over",
      -        "full"
      -      ],
      -      "type": "string"
      -    },
      -    "transition": {
      -      "description": "Full placement only, as an insert's transition.",
      -      "enum": [
      -        "cut",
      -        "wipe",
      -        "flash",
      -        "zoom"
      -      ],
      -      "type": "string"
      -    }
      -  },
      -  "required": [
      -    "id",
      -    "anchor",
      -    "kind",
      -    "data"
      -  ],
      -  "type": "object"
      -}
    • removedInput schema / properties / templates / maxItems
      Removed value: -12
    • removedInput schema / properties / templates / minItems
      Removed value: -1
    • removedInput schema / properties / templates / type
      Removed value: -"array"
    • removedInput schema / properties / tts_model / description
      Removed value: -"Speech model: eleven_v3 | eleven_flash_v2_5 | eleven_turbo_v2_5 | eleven_v4 | gemini-3.8-flash-tts. Omitted means the model of the chosen voice (list_voices shows it): gemini-3.8-flash-tts for its own voices, eleven_v4 for every preset, catalog voice and raw voice_id. An explicit tts_model wins, except eleven_v3: it is no longer spoken, and a run naming it speaks eleven_v4 with a warning. eleven_v4 and gemini-3.8-flash-tts read stress marks (a capital vowel inside a Russian word, \"потОм\", becomes one; see script); eleven_flash_v2_5 and eleven_turbo_v2_5 are cheaper alternatives for languages other than Russian. gemini-3.8-flash-tts speaks only its own voices (list_voices with model=gemini-3.8-flash-tts; without voice, kore for a female actor and charon otherwise) and returns no word timings: a preset or catalog voice, voice_id, captions=true, segments and inserts are refused with it before any charge. Audio tags in square brackets are a convention of the other speech models and are not measured on it. Script limits by speech model: eleven_v3: 5000 characters; eleven_flash_v2_5: 10000 characters; eleven_turbo_v2_5: 10000 characters; eleven_v4: 5000 characters; gemini-3.8-flash-tts: 5000 characters. Count includes spaces, audio tags and stress marks; emoji may count as two characters. Break tags are cut from the text sent to eleven_v4 and gemini-3.8-flash-tts and are not counted there. There is no word-count limit. Duration and price are estimates until measured."
    • removedInput schema / properties / tts_model / enum
      Removed value: -[
      -  "eleven_v3",
      -  "eleven_flash_v2_5",
      -  "eleven_turbo_v2_5",
      -  "eleven_v4",
      -  "gemini-3.8-flash-tts"
      -]
    • removedInput schema / properties / visible_ai_label / description
      Removed value: -"Visible AI label for newly marked presenter videos, including long form; defaults to true in the server admission policy. False hides only the visible label and does not disable invisible marking or signed provenance. Historical outputs are unchanged."
    • removedInput schema / properties / voice / description
      Removed value: -"Voice name from list_voices. Curated presets: sarah | george | eric | daria_ru_female. The API refuses a name list_voices does not return, before any charge. Omitted means the default voice for the actor's gender: the gender of actor_id, actor_gender with image, or george for the default actor and for image without actor_gender. gemini-3.8-flash-tts speaks only its own voices (kind model_voice in list_voices, such as kore): naming one selects that model, and a voice is refused with a tts_model that does not speak it, before any charge. Mutually exclusive with voice_id."
    • removedInput schema / properties / voice / pattern
      Removed value: -"^[A-Za-z0-9][A-Za-z0-9_-]{0,63}$"
    • removedInput schema / properties / voice_id / description
      Removed value: -"Raw vendor voice id (16–32 letters and digits) for a voice outside the catalog. Checked lazily: an unknown id fails the run, not the request. Refused with tts_model=gemini-3.8-flash-tts. Mutually exclusive with voice."
    • removedInput schema / properties / voice_id / pattern
      Removed value: -"^[A-Za-z0-9]{16,32}$"
    • removedInput schema / properties / voice_pace / description
      Removed value: -"Narration speed; 1 is the voice's own. gemini-3.8-flash-tts gets a style hint instead; eleven_v4 has no speed, so pick a voice by list_voices words_per_second; both named in warnings[]."
    • removedInput schema / properties / voice_pace / maximum
      Removed value: -1.2
    • removedInput schema / properties / voice_pace / minimum
      Removed value: -0.7
  3. Changed2 schema fields changedv0.36.0
    • changedInput schema / properties / aspect_ratio / description
      Previous value: -"Output format: 9:16 | 1:1 | 16:9. Omitted means 9:16, and a source of another shape is snapped to 9:16 with a warning — pass it explicitly whenever you pass image. A mismatch above 15% between the request and the source is refused (aspect_conflict) before any charge."New value: +"Output format: 9:16 | 1:1 | 16:9. Omitted means 9:16 without an image; with an image, the supported format nearest the image's shape, even a landscape one — pass it explicitly whenever you pass image. A mismatch above 15% between the request and the source is refused (aspect_conflict) before any charge."
    • changedInput schema / properties / voice / description
      Previous value: -"Voice name from list_voices. Curated presets: owner_ru_clone | sarah | george | eric | daria_ru_female (owner_ru_clone is the Russian cloned voice). The API refuses a name list_voices does not return, before any charge. Omitted means the default voice for the actor's gender: the gender of actor_id, actor_gender with image, or george for the default actor and for image without actor_gender. gemini-3.8-flash-tts speaks only its own voices (kind model_voice in list_voices, such as kore): naming one selects that model, and a voice is refused with a tts_model that does not speak it, before any charge. Mutually exclusive with voice_id."New value: +"Voice name from list_voices. Curated presets: sarah | george | eric | daria_ru_female. The API refuses a name list_voices does not return, before any charge. Omitted means the default voice for the actor's gender: the gender of actor_id, actor_gender with image, or george for the default actor and for image without actor_gender. gemini-3.8-flash-tts speaks only its own voices (kind model_voice in list_voices, such as kore): naming one selects that model, and a voice is refused with a tts_model that does not speak it, before any charge. Mutually exclusive with voice_id."
  4. Changed14 schema fields changedv0.35.0
    • addedInput schema / properties / call
      Added value: +{
      +  "additionalProperties": {},
      +  "description": "A call the presenter listens to: { after: { quote }, lines: [{ speaker: agent|caller, text }] (2–12), voices?, phone? }.",
      +  "propertyNames": {
      +    "type": "string"
      +  },
      +  "type": "object"
      +}
    • changedInput schema / properties / caption_emphasis / description
      Previous value: -"Key words or short phrases to emphasise, each quoted from script and matched as an insert quote is (case and punctuation ignored). An item is the quote, or { quote, look }: look punch shows a small lead-in line from the same sentence over the quote as a large glowing keyword, look pill shows the quote alone in a rounded pill, look color shows it in the accent colour at the same size. Without a look, punch draws punch, hormozi draws color, and other presets draw the quote larger in their highlight colour. Every occurrence is emphasised. Requires captions=true and script; a quote absent from script is refused before any charge."New value: +"Key words or short phrases to emphasise, each quoted from script and matched as an insert quote is (case and punctuation ignored). An item is the quote, or { quote, look }: look punch shows a small lead-in line from the same sentence over the quote as a large glowing keyword, look pill shows the quote alone in a rounded pill, look color shows it in the accent colour at the same size. Without a look, punch draws punch, hormozi and accent draw color, and other presets draw the quote larger in their highlight colour. Every occurrence is emphasised. Requires captions=true and script; a quote absent from script is refused before any charge."
    • addedInput schema / properties / caption_position
      Added value: +{
      +  "description": "Where captions sit: top, middle, lower or bottom (80% of the height). Omitted means the caption_style's own place. Requires captions=true.",
      +  "enum": [
      +    "top",
      +    "middle",
      +    "lower",
      +    "bottom"
      +  ],
      +  "type": "string"
      +}
    • changedInput schema / properties / caption_style / description
      Previous value: -"Caption look when captions=true. hormozi: the default: condensed bold uppercase, two to four white words per cue mid-lower in the frame, one keyword per cue in orange (the emphasised words, or else the cue's longest word that is not a stop-word); Latin and Cyrillic in one font. tiktok: bold rounded uppercase, one or two words at a time; the spoken word turns yellow and grows. youtube: clean bold sans-serif, five words on a dark rounded box near the bottom; words fade in, the spoken word in red. instagram: comic uppercase with a pink outline, two words at a time; the spoken word pops in orange. minimalist: plain sans-serif, five words on a half-transparent dark band, gentle fade. neon: cyan uppercase with a magenta outline, two words at a time; the spoken word pops in white. genz: large comic uppercase, one word at a time, slamming in with a pink highlight. campfire: rounded comic uppercase, three words; spoken words light up gold and stay lit. midnight: spooky uppercase, two words, slow fade; the spoken word in red. plottwist: heavy sans-serif, three words; the spoken word turns sky blue and grows. headline: tall condensed uppercase on a solid black band, three words; the spoken word scales up in yellow. promo: heavy sans-serif on a blue pill, three words; the spoken word pops in yellow. lecture: readable sans-serif, six words on a dark rounded box; the spoken word in green. highlighter: heavy sans-serif, four words; spoken words turn lime and stay lit. studio: sans-serif, seven words typed in on a blurred dark box; the spoken word in amber. broadcast: outlined sans-serif, eight words low in the frame; the spoken word in pale yellow. arcade: blocky yellow uppercase, two words; the spoken word bounces in white. clutch: brush uppercase, one word at a time, slamming in green. bubblegum: rounded display letters with a pink outline, two words; the spoken word bounces in yellow. crayon: marker handwriting with a navy outline, two words; the spoken word pops in orange. lyrics: handwritten script, five words; spoken words light up pink and stay lit. bassdrop: outlined display uppercase, one word at a time, scaling in orange. punch: mid-frame setup and punch: a small white lead-in line over one or two large blue glowing keywords; other words small and white. Alias: minimal draws minimalist. A font that cannot draw the script's letters is replaced by a plain sans-serif."New value: +"Caption look when captions=true. hormozi: the default: heavy white uppercase with a thick black outline, up to three words per cue, one keyword per cue in yellow (emphasised, else the longest non-stop-word). accent: condensed bold white uppercase, no outline, up to three words per cue, one keyword per cue in orange (emphasised, else the longest non-stop-word). tiktok: bold rounded uppercase, one or two words at a time; the spoken word turns yellow and grows. youtube: clean bold sans-serif, five words on a dark rounded box near the bottom; words fade in, the spoken word in red. instagram: comic uppercase with a pink outline, two words at a time; the spoken word pops in orange. minimalist: plain sans-serif, five words on a half-transparent dark band, gentle fade. neon: cyan uppercase with a magenta outline, two words at a time; the spoken word pops in white. genz: large comic uppercase, one word at a time, slamming in with a pink highlight. campfire: rounded comic uppercase, three words; spoken words light up gold and stay lit. midnight: spooky uppercase, two words, slow fade; the spoken word in red. plottwist: heavy sans-serif, three words; the spoken word turns sky blue and grows. headline: tall condensed uppercase on a solid black band, three words; the spoken word scales up in yellow. promo: heavy sans-serif on a blue pill, three words; the spoken word pops in yellow. lecture: readable sans-serif, six words on a dark rounded box; the spoken word in green. highlighter: heavy sans-serif, four words; spoken words turn lime and stay lit. studio: sans-serif, seven words typed in on a blurred dark box; the spoken word in amber. broadcast: outlined sans-serif, eight words low in the frame; the spoken word in pale yellow. arcade: blocky yellow uppercase, two words; the spoken word bounces in white. clutch: brush uppercase, one word at a time, slamming in green. bubblegum: rounded display letters with a pink outline, two words; the spoken word bounces in yellow. crayon: marker handwriting with a navy outline, two words; the spoken word pops in orange. lyrics: handwritten script, five words; spoken words light up pink and stay lit. bassdrop: outlined display uppercase, one word at a time, scaling in orange. punch: mid-frame setup and punch: a small white lead-in line over one or two large blue glowing keywords; other words small and white. Alias: minimal draws minimalist. A font that cannot draw the script's letters is replaced by a plain sans-serif. Previews: https://clipwright.io/captions"
    • changedInput schema / properties / caption_style / enum
      Previous value: -[
      -  "hormozi",
      -  "tiktok",
      -  "youtube",
      -  "instagram",
      -  "minimalist",
      -  "neon",
      -  "genz",
      -  "campfire",
      -  "midnight",
      -  "plottwist",
      -  "headline",
      -  "promo",
      -  "lecture",
      -  "highlighter",
      -  "studio",
      -  "broadcast",
      -  "arcade",
      -  "clutch",
      -  "bubblegum",
      -  "crayon",
      -  "lyrics",
      -  "bassdrop",
      -  "punch",
      -  "minimal"
      -]New value: +[
      +  "hormozi",
      +  "accent",
      +  "tiktok",
      +  "youtube",
      +  "instagram",
      +  "minimalist",
      +  "neon",
      +  "genz",
      +  "campfire",
      +  "midnight",
      +  "plottwist",
      +  "headline",
      +  "promo",
      +  "lecture",
      +  "highlighter",
      +  "studio",
      +  "broadcast",
      +  "arcade",
      +  "clutch",
      +  "bubblegum",
      +  "crayon",
      +  "lyrics",
      +  "bassdrop",
      +  "punch",
      +  "minimal"
      +]
    • addedInput schema / properties / edit_sounds
      Added value: +{
      +  "description": "A low sound on every cut (insert, full-frame template, layout window, framing), its peak on the cut. Needs inserts, layout_windows or framing; template_sounds.edit picks it (list_template_sounds). Price unchanged.",
      +  "type": "boolean"
      +}
    • addedInput schema / properties / framing
      Added value: +{
      +  "description": "Text-anchored presenter sizes: each cuts to close or medium on its words and back to the take where they end. Items may not overlap one another, an insert or a layout window. A framing drawn wholly under full-frame templates is named in warnings[]. Where a punch_in emphasis meets a framing, the framing is drawn. Requires script and long-form qualification on the server; the price does not change.",
      +  "items": {
      +    "additionalProperties": false,
      +    "properties": {
      +      "anchor": {
      +        "anyOf": [
      +          {
      +            "additionalProperties": false,
      +            "properties": {
      +              "endWord": {
      +                "exclusiveMinimum": 0,
      +                "maximum": 9007199254740991,
      +                "type": "integer"
      +              },
      +              "startWord": {
      +                "maximum": 9007199254740991,
      +                "minimum": 0,
      +                "type": "integer"
      +              }
      +            },
      +            "required": [
      +              "startWord",
      +              "endWord"
      +            ],
      +            "type": "object"
      +          },
      +          {
      +            "additionalProperties": false,
      +            "properties": {
      +              "occurrence": {
      +                "maximum": 9007199254740991,
      +                "minimum": 0,
      +                "type": "integer"
      +              },
      +              "quote": {
      +                "maxLength": 10000,
      +                "minLength": 1,
      +                "type": "string"
      +              }
      +            },
      +            "required": [
      +              "quote"
      +            ],
      +            "type": "object"
      +          }
      +        ],
      +        "description": "The words it starts on, as an insert anchor: { startWord, endWord } or { quote, occurrence? }."
      +      },
      +      "cover_words": {
      +        "description": "How many spoken words the size holds, counted from the first word of its anchor. Omitted means the anchored words only.",
      +        "exclusiveMinimum": 0,
      +        "maximum": 10000,
      +        "type": "integer"
      +      },
      +      "id": {
      +        "description": "Unique across inserts, overlays, layout_windows, templates and framing.",
      +        "pattern": "^[a-zA-Z0-9][a-zA-Z0-9_-]{0,63}$",
      +        "type": "string"
      +      },
      +      "size": {
      +        "default": "close",
      +        "description": "close: the presenter 1.18 times larger about the face; medium: the take as rendered.",
      +        "enum": [
      +          "close",
      +          "medium"
      +        ],
      +        "type": "string"
      +      },
      +      "transition": {
      +        "default": "cut",
      +        "description": "cut: a hard cut to the size; flash: a warm light leak over the cut.",
      +        "enum": [
      +          "cut",
      +          "flash"
      +        ],
      +        "type": "string"
      +      }
      +    },
      +    "required": [
      +      "id",
      +      "anchor"
      +    ],
      +    "type": "object"
      +  },
      +  "maxItems": 20,
      +  "minItems": 1,
      +  "type": "array"
      +}
    • addedInput schema / properties / pause_trim
      Added value: +{
      +  "additionalProperties": false,
      +  "description": "Shorten narration pauses longer than these seconds, cutting silence only.",
      +  "properties": {
      +    "comma_s": {
      +      "maximum": 2,
      +      "minimum": 0.05,
      +      "type": "number"
      +    },
      +    "mid_phrase_s": {
      +      "maximum": 2,
      +      "minimum": 0.05,
      +      "type": "number"
      +    },
      +    "sentence_end_s": {
      +      "maximum": 2,
      +      "minimum": 0.05,
      +      "type": "number"
      +    }
      +  },
      +  "type": "object"
      +}
    • addedInput schema / properties / presenter_framing
      Added value: +{
      +  "description": "close (default) or wide: presenter lower, room above. Needs the actor's wide view (list_actors), 9:16 only; else close plus warnings[].",
      +  "enum": [
      +    "close",
      +    "wide"
      +  ],
      +  "type": "string"
      +}
    • addedInput schema / properties / presenter_mic
      Added value: +{
      +  "description": "true: presenter holds a tiny mic. Needs the actor's mic view in that framing (list_actors; library ones are wide); else no mic plus warnings[].",
      +  "type": "boolean"
      +}
    • changedInput schema / properties / script / description
      Previous value: -"The words the actor says; required unless segments supplies the spoken text. Segments and text-anchored inserts require long-form qualification on the server. Script limits by speech model: eleven_v3: 5000 characters; eleven_flash_v2_5: 10000 characters; eleven_turbo_v2_5: 10000 characters; eleven_v4: 5000 characters; gemini-3.8-flash-tts: 5000 characters. Count includes spaces, audio tags and stress marks; emoji may count as two characters. Break tags are cut from the text sent to eleven_v4 and gemini-3.8-flash-tts and are not counted there. There is no word-count limit. Duration and price are estimates until measured. Russian stress: write the stressed vowel as a capital inside a lowercase word (\"потОм\", \"зАмок\") and eleven_v3, eleven_v4 and gemini-3.8-flash-tts receive it as the stress mark U+0301 (\"пото́м\"); a mark typed directly is kept. A capital at the start of a word stays a capital, and a word with a second capital or a capital consonant inside (all caps, \"ВУЗы\") is left as it is. A single capital vowel inside a word is always read as stress, so write \"Яндекс Еда\", not \"ЯндексЕда\". Tell users writing in Russian that they can mark stress this way. eleven_flash_v2_5 and eleven_turbo_v2_5 cost less but misread stress marks: capitals reach them unchanged."New value: +"The words the actor says; required unless segments supplies the spoken text. Segments and text-anchored inserts require long-form qualification on the server. Script limits by speech model: eleven_v3: 5000 characters; eleven_flash_v2_5: 10000 characters; eleven_turbo_v2_5: 10000 characters; eleven_v4: 5000 characters; gemini-3.8-flash-tts: 5000 characters. Count includes spaces, audio tags and stress marks; emoji may count as two characters. Break tags are cut from the text sent to eleven_v4 and gemini-3.8-flash-tts and are not counted there. There is no word-count limit. Duration and price are estimates until measured. Russian stress: write the stressed vowel as a capital inside a lowercase word (\"потОм\", \"зАмок\") and eleven_v4 and gemini-3.8-flash-tts receive it as the stress mark U+0301 (\"пото́м\"); a mark typed directly is kept. A capital at the start of a word stays a capital, and a word with a second capital or a capital consonant inside (all caps, \"ВУЗы\") is left as it is. A single capital vowel inside a word is always read as stress, so write \"Яндекс Еда\", not \"ЯндексЕда\". Tell users writing in Russian that they can mark stress this way. eleven_flash_v2_5 and eleven_turbo_v2_5 cost less but misread stress marks: capitals reach them unchanged."
    • changedInput schema / properties / templates / description
      Previous value: -"Graphic templates, each { id, kind, anchor, cover_words?, placement?, transition?, data }. On any script run. Templates never change the price: a plain run is billed per second of finished video (30/s); a run with inserts, overlays or layout_windows is billed long-form-v1, and a covered presenter there is still face time. Ids are unique across inserts, overlays, layout_windows and templates. Text is one line of Latin or the script's own letters, digits and common punctuation, with no emoji; a wide CJK glyph counts 2 toward a limit, and long text shrinks to fit the kind's width. size small|medium|large scales a kind; absent is medium. A media field takes { asset_id } of a ready asset of the kind it names. An inner quote names words inside the template's own words, after the one before it: its beat lands on their first word, and must not fall under an insert or full-frame template; a click or step without one is spread evenly. A beat spoken before its template has entered moves just after the enter, with a warning. A template that meets the caption band hides captions while it shows; one elsewhere, such as a small one at the top, leaves them. A full-frame template also hides the presenter, overlays and over-presenter templates while it shows, never meets a wipe or zoom insert, and the covered presenter is billed. At most 2 overlays and over-presenter templates show at once, on footprints that do not overlap. template_theme sets the look of them all. Kinds: tag (over): a short gradient pill over the presenter or an insert; without position it sits in the caption spot and hides captions while it shows; data text ≤ 32, position? top|center|bottom, size? small|medium|large. lower_third (over): a name and role bar low in the frame; captions are hidden while it shows; data name ≤ 28, role? ≤ 36, side left|right, size? small|medium|large. end_card (over): a site pill with an optional call to action in the caption spot; captions are hidden while it shows; data site ≤ 32, cta? ≤ 48, size? small|medium|large. title_card (full): a full-frame hook card: the title (up to two lines) on a white card beside an optional logo image, and an optional chip under it; data title ≤ 48, chip? ≤ 32, logo? {asset_id} image, size? small|medium|large. quote (full): a full-frame quote: marks, the text in up to four lines, then the author with an optional round photo, cut to a circle; data text ≤ 120, author? ≤ 32, photo? {asset_id} image (cut to fill), size? small|medium|large. stat (full|over): a number counting up from 0 to value (up to 2 decimals), with prefix and suffix around it and a label under it; full fills the frame, over sits at chest level on a card; data value number, prefix? ≤ 6, suffix? ≤ 6, label? ≤ 32, size? small|medium|large. callout (over): an arrow or ring that lands on a point of the frame and pulses, target {x,y} in % of the frame from its top left, with an optional label pill below or above it; it may point at the face, its label keeps off the face where it can; also over an insert; data target {x,y}, style arrow|ring, text? ≤ 24, size? small|medium|large. checklist (over): 2–4 rows, each an optional icon, a label and a switch or check box set on or off; a cursor clicks rows in turn (item is the row's index from 0), each click flipping it; below the face; data items 2–4 of {label ≤ 24, on true|false, icon? phone|briefcase|user|clock|chat|star}, clicks? 0–6 of {item number, quote? inner quote}, style? switch|check, size? small|medium|large. phone_call (over): an incoming call on a neutral phone at the side (right unless side left): the caller, a subtitle and a round avatar ring, then the call is answered on answer_at and its timer runs; beside the face in wide frames, under it in tall ones; data caller ≤ 24, subtitle? ≤ 32, avatar? {asset_id} image (cut to fill), answer_at inner quote, side? left|right, size? small|medium|large. compare (full): a full-frame card showing the before image, then the after image sweeps in on a diagonal on reveal_at and both stay side by side, each with an optional label pill; both images are cut to fill a 3:5 card; data before {asset_id} image (cut to fill), after {asset_id} image (cut to fill), labels? {before? ≤ 20, after? ≤ 20}, reveal_at inner quote, size? small|medium|large. notification (over): a phone notification at the top, above the face: an icon (else the app's initial), the app, a title and a body line; it drops in, holds at least 1.2 s, then leaves before its span ends; data app ≤ 20, title ≤ 32, body ≤ 80, icon? phone|briefcase|user|clock|chat|star, size? small|medium|large. progress (over): 2–5 steps in a column on a card, each completing with a check in turn, on its advance_at quote (one per step, in order) or spread evenly; below the face; data steps 2–5 of ≤ 20, advance_at? 2–5 of inner quote, size? small|medium|large. rating (over): five stars on a card filling in turn up to stars (1–5 in halves, a half star half filled), an optional label under them; at chest level; data stars number, label? ≤ 32, size? small|medium|large."New value: +"Graphic templates, each { id, kind, anchor, cover_words?, placement?, transition?, data }. On any script run. Templates never change the price: every run is billed by its parts as list_prices states them, and a presenter a template covers is still presenter time. Ids are unique across inserts, overlays, layout_windows and templates. Text is one line of Latin or the script's own letters, digits and common punctuation, with no emoji; a wide CJK glyph counts 2 toward a limit, and long text shrinks to fit the kind's width. size small|medium|large scales a kind; absent is medium. A media field takes { asset_id } of a ready asset of the kind it names. An inner quote names words inside the template's own words, after the one before it: its beat lands on their first word, and must not fall under an insert or full-frame template; a click or step without one is spread evenly. A beat spoken before its template has entered moves just after the enter, with a warning. A template that meets the caption band hides captions while it shows; one elsewhere, such as a small one at the top, leaves them. A full-frame template also hides the presenter, overlays and over-presenter templates while it shows, never meets a wipe or zoom insert, and the covered presenter is billed. At most 2 overlays and over-presenter templates show at once, on footprints that do not overlap. template_theme sets the look of them all. Kinds: tag (over): a short gradient pill over the presenter or an insert; without position it sits in the caption spot and hides captions while it shows; data text ≤ 32, position? top|center|bottom, size? small|medium|large. lower_third (over): a name and role bar low in the frame; captions are hidden while it shows; data name ≤ 28, role? ≤ 36, side left|right, size? small|medium|large. end_card (over): a site pill with an optional call to action in the caption spot; captions are hidden while it shows; data site ≤ 32, cta? ≤ 48, size? small|medium|large. title_card (full): a full-frame hook card: the title (up to two lines) on a white card beside an optional logo image, and an optional chip under it; data title ≤ 48, chip? ≤ 32, logo? {asset_id} image, size? small|medium|large. quote (full): a full-frame quote: marks, the text in up to four lines, then the author with an optional round photo, cut to a circle; data text ≤ 120, author? ≤ 32, photo? {asset_id} image (cut to fill), size? small|medium|large. stat (full|over): a number counting up from 0 to value (up to 2 decimals), with prefix and suffix around it and a label under it; full fills the frame, over sits at chest level on a card; data value number, prefix? ≤ 6, suffix? ≤ 6, label? ≤ 32, size? small|medium|large. callout (over): an arrow or ring that lands on a point of the frame and pulses, target {x,y} in % of the frame from its top left, with an optional label pill below or above it; it may point at the face, its label keeps off the face where it can; also over an insert; data target {x,y}, style arrow|ring, text? ≤ 24, size? small|medium|large. checklist (over): 2–4 rows, each an optional icon, a label and a switch or check box set on or off; a cursor clicks rows in turn (item is the row's index from 0), each click flipping it; below the face; data items 2–4 of {label ≤ 24, on true|false, icon? phone|briefcase|user|clock|chat|star}, clicks? 0–6 of {item number, quote? inner quote}, style? switch|check, size? small|medium|large. phone_call (over): an incoming call on a neutral phone at the side (right unless side left): the caller, a subtitle and a round avatar ring, then the call is answered on answer_at and its timer runs (or a hold banner shows); beside the face in wide frames, under it in tall ones; data caller ≤ 24, subtitle? ≤ 32, avatar? {asset_id} image (cut to fill), answer_at inner quote, side? left|right, size? small|medium|large, banner? ≤ 32, banner_note? ≤ 48, mask_number? true|false. compare (full): a full-frame card showing the before image, then the after image sweeps in on a diagonal on reveal_at and both stay side by side, each with an optional label pill; both images are cut to fill a 3:5 card; data before {asset_id} image (cut to fill), after {asset_id} image (cut to fill), labels? {before? ≤ 20, after? ≤ 20}, reveal_at inner quote, size? small|medium|large. notification (over): a phone notification at the top, above the face: an icon (else the app's initial), the app, a title and a body line; it drops in, holds at least 1.2 s, then leaves before its span ends; data app ≤ 20, title ≤ 32, body ≤ 80, icon? phone|briefcase|user|clock|chat|star, size? small|medium|large. progress (over): 2–5 steps in a column on a card, each completing with a check in turn, on its advance_at quote (one per step, in order) or spread evenly; below the face; data steps 2–5 of ≤ 20, advance_at? 2–5 of inner quote, size? small|medium|large. rating (over): five stars on a card filling in turn up to stars (1–5 in halves, a half star half filled), an optional label under them; at chest level; data stars number, label? ≤ 32, size? small|medium|large."
    • changedInput schema / properties / tts_model / description
      Previous value: -"Speech model: eleven_v3 | eleven_flash_v2_5 | eleven_turbo_v2_5 | eleven_v4 | gemini-3.8-flash-tts. Omitted means the model of the chosen voice (list_voices shows it): eleven_v4 for the Russian presets and for catalog voices named ru_*, gemini-3.8-flash-tts for its own voices, eleven_v3 for every other preset and catalog voice. A raw voice_id speaks eleven_v4 when the script is mostly Cyrillic and eleven_v3 otherwise. An explicit tts_model always wins. eleven_v4, eleven_v3 and gemini-3.8-flash-tts read stress marks (a capital vowel inside a Russian word, \"потОм\", becomes one; see script); eleven_flash_v2_5 and eleven_turbo_v2_5 are cheaper alternatives for languages other than Russian. gemini-3.8-flash-tts speaks only its own voices (list_voices with model=gemini-3.8-flash-tts; without voice, kore for a female actor and charon otherwise) and returns no word timings: a preset or catalog voice, voice_id, captions=true, segments and inserts are refused with it before any charge. Audio tags in square brackets are an eleven_v3 and eleven_v4 convention and are not measured on it. Script limits by speech model: eleven_v3: 5000 characters; eleven_flash_v2_5: 10000 characters; eleven_turbo_v2_5: 10000 characters; eleven_v4: 5000 characters; gemini-3.8-flash-tts: 5000 characters. Count includes spaces, audio tags and stress marks; emoji may count as two characters. Break tags are cut from the text sent to eleven_v4 and gemini-3.8-flash-tts and are not counted there. There is no word-count limit. Duration and price are estimates until measured."New value: +"Speech model: eleven_v3 | eleven_flash_v2_5 | eleven_turbo_v2_5 | eleven_v4 | gemini-3.8-flash-tts. Omitted means the model of the chosen voice (list_voices shows it): gemini-3.8-flash-tts for its own voices, eleven_v4 for every preset, catalog voice and raw voice_id. An explicit tts_model wins, except eleven_v3: it is no longer spoken, and a run naming it speaks eleven_v4 with a warning. eleven_v4 and gemini-3.8-flash-tts read stress marks (a capital vowel inside a Russian word, \"потОм\", becomes one; see script); eleven_flash_v2_5 and eleven_turbo_v2_5 are cheaper alternatives for languages other than Russian. gemini-3.8-flash-tts speaks only its own voices (list_voices with model=gemini-3.8-flash-tts; without voice, kore for a female actor and charon otherwise) and returns no word timings: a preset or catalog voice, voice_id, captions=true, segments and inserts are refused with it before any charge. Audio tags in square brackets are a convention of the other speech models and are not measured on it. Script limits by speech model: eleven_v3: 5000 characters; eleven_flash_v2_5: 10000 characters; eleven_turbo_v2_5: 10000 characters; eleven_v4: 5000 characters; gemini-3.8-flash-tts: 5000 characters. Count includes spaces, audio tags and stress marks; emoji may count as two characters. Break tags are cut from the text sent to eleven_v4 and gemini-3.8-flash-tts and are not counted there. There is no word-count limit. Duration and price are estimates until measured."
    • addedInput schema / properties / voice_pace
      Added value: +{
      +  "description": "Narration speed; 1 is the voice's own. gemini-3.8-flash-tts gets a style hint instead; eleven_v4 has no speed, so pick a voice by list_voices words_per_second; both named in warnings[].",
      +  "maximum": 1.2,
      +  "minimum": 0.7,
      +  "type": "number"
      +}
  5. Changed18 schema fields changedv0.34.0
    • addedInput schema / properties / caption_emphasis
      Added value: +{
      +  "description": "Key words or short phrases to emphasise, each quoted from script and matched as an insert quote is (case and punctuation ignored). An item is the quote, or { quote, look }: look punch shows a small lead-in line from the same sentence over the quote as a large glowing keyword, look pill shows the quote alone in a rounded pill, look color shows it in the accent colour at the same size. Without a look, punch draws punch, hormozi draws color, and other presets draw the quote larger in their highlight colour. Every occurrence is emphasised. Requires captions=true and script; a quote absent from script is refused before any charge.",
      +  "items": {
      +    "anyOf": [
      +      {
      +        "maxLength": 40,
      +        "minLength": 1,
      +        "type": "string"
      +      },
      +      {
      +        "additionalProperties": false,
      +        "properties": {
      +          "look": {
      +            "enum": [
      +              "punch",
      +              "pill",
      +              "color"
      +            ],
      +            "type": "string"
      +          },
      +          "punch_in": {
      +            "description": "Long form only: zoom into the presenter while the quote is spoken. Drawn only where captions are drawn and the presenter is on screen; otherwise warnings[] names it.",
      +            "type": "boolean"
      +          },
      +          "quote": {
      +            "maxLength": 40,
      +            "minLength": 1,
      +            "type": "string"
      +          }
      +        },
      +        "required": [
      +          "quote"
      +        ],
      +        "type": "object"
      +      }
      +    ]
      +  },
      +  "maxItems": 20,
      +  "minItems": 1,
      +  "type": "array"
      +}
    • addedInput schema / properties / caption_mode
      Added value: +{
      +  "description": "full (default when omitted): every spoken word is captioned. highlights: captions appear only around caption_emphasis quotes (lead-in, quote, short tail) and nowhere else; requires caption_emphasis. In both modes captions are hidden while a full-frame insert is on screen or a template meets their band.",
      +  "enum": [
      +    "full",
      +    "highlights"
      +  ],
      +  "type": "string"
      +}
    • changedInput schema / properties / caption_style / description
      Previous value: -"NOT HONORED YET: caption_style is not honored: captions are not rendered in this prototype (stage-B)"New value: +"Caption look when captions=true. hormozi: the default: condensed bold uppercase, two to four white words per cue mid-lower in the frame, one keyword per cue in orange (the emphasised words, or else the cue's longest word that is not a stop-word); Latin and Cyrillic in one font. tiktok: bold rounded uppercase, one or two words at a time; the spoken word turns yellow and grows. youtube: clean bold sans-serif, five words on a dark rounded box near the bottom; words fade in, the spoken word in red. instagram: comic uppercase with a pink outline, two words at a time; the spoken word pops in orange. minimalist: plain sans-serif, five words on a half-transparent dark band, gentle fade. neon: cyan uppercase with a magenta outline, two words at a time; the spoken word pops in white. genz: large comic uppercase, one word at a time, slamming in with a pink highlight. campfire: rounded comic uppercase, three words; spoken words light up gold and stay lit. midnight: spooky uppercase, two words, slow fade; the spoken word in red. plottwist: heavy sans-serif, three words; the spoken word turns sky blue and grows. headline: tall condensed uppercase on a solid black band, three words; the spoken word scales up in yellow. promo: heavy sans-serif on a blue pill, three words; the spoken word pops in yellow. lecture: readable sans-serif, six words on a dark rounded box; the spoken word in green. highlighter: heavy sans-serif, four words; spoken words turn lime and stay lit. studio: sans-serif, seven words typed in on a blurred dark box; the spoken word in amber. broadcast: outlined sans-serif, eight words low in the frame; the spoken word in pale yellow. arcade: blocky yellow uppercase, two words; the spoken word bounces in white. clutch: brush uppercase, one word at a time, slamming in green. bubblegum: rounded display letters with a pink outline, two words; the spoken word bounces in yellow. crayon: marker handwriting with a navy outline, two words; the spoken word pops in orange. lyrics: handwritten script, five words; spoken words light up pink and stay lit. bassdrop: outlined display uppercase, one word at a time, scaling in orange. punch: mid-frame setup and punch: a small white lead-in line over one or two large blue glowing keywords; other words small and white. Alias: minimal draws minimalist. A font that cannot draw the script's letters is replaced by a plain sans-serif."
    • changedInput schema / properties / caption_style / enum
      Previous value: -[
      -  "hormozi",
      -  "tiktok",
      -  "minimal"
      -]New value: +[
      +  "hormozi",
      +  "tiktok",
      +  "youtube",
      +  "instagram",
      +  "minimalist",
      +  "neon",
      +  "genz",
      +  "campfire",
      +  "midnight",
      +  "plottwist",
      +  "headline",
      +  "promo",
      +  "lecture",
      +  "highlighter",
      +  "studio",
      +  "broadcast",
      +  "arcade",
      +  "clutch",
      +  "bubblegum",
      +  "crayon",
      +  "lyrics",
      +  "bassdrop",
      +  "punch",
      +  "minimal"
      +]
    • changedInput schema / properties / captions / description
      Previous value: -"NOT HONORED YET: captions requested but not rendered in this prototype (stage-B)"New value: +"Burn word-timed captions into the video, over the presenter and over inserts. Not available with segments."
    • changedInput schema / properties / inserts / description
      Previous value: -"Text-anchored image inserts over full narration, each covering cover_words spoken words from its anchor; requires long-form qualification on the server, captions=false, 1080p and explicit broll_policy=anyone."New value: +"Text-anchored image or video inserts over full narration, each covering cover_words spoken words from its anchor; requires long-form qualification on the server, 1080p and explicit broll_policy=anyone. Captions draw over inserts."
    • addedInput schema / properties / inserts / items / properties / asset_id
      Added value: +{
      +  "description": "A ready PNG or JPEG image or MP4 video from your own assets (list_assets), instead of media_url. Pass exactly one of the two; media_type must match the asset's kind.",
      +  "pattern": "^ast_[a-f0-9]{32}$",
      +  "type": "string"
      +}
    • addedInput schema / properties / inserts / items / properties / image_motion / description
      Added value: +"Optional picture zoom. A picture always fills the frame, cut to its shape when the shapes differ (warnings[] names the share cut). amount is the zoom beyond filling: in grows from 1 to 1+amount, out shrinks from 1+amount to 1. No motion by default."
    • addedInput schema / properties / inserts / items / properties / media_type / description
      Added value: +"image (PNG or JPEG) or video (MP4, H.264 or HEVC, 8-bit SDR). A video plays muted from its first frame and is cut where its words end; one shorter than its words holds its last frame, and warnings[] names it."
    • addedInput schema / properties / inserts / items / properties / media_url / description
      Added value: +"Public https URL of the media. Pass exactly one of media_url or asset_id."
    • addedInput schema / properties / inserts / items / properties / transition
      Added value: +{
      +  "description": "How the insert comes in and goes out: cut (default), wipe (slides across the presenter), flash (a white flash on the cut) or zoom (eases in from a closer framing). It never moves the insert's start or end.",
      +  "enum": [
      +    "cut",
      +    "wipe",
      +    "flash",
      +    "zoom"
      +  ],
      +  "type": "string"
      +}
    • changedInput schema / properties / inserts / items / required
      Previous value: -[
      -  "id",
      -  "media_url",
      -  "media_type",
      -  "anchor"
      -]New value: +[
      +  "id",
      +  "media_type",
      +  "anchor"
      +]
    • addedInput schema / properties / layout_windows
      Added value: +{
      +  "description": "Text-anchored reframings of the presenter: split (9:16 only) or card. Windows may not overlap one another or an insert. Same requirements as inserts. A covered or blurred presenter is still delivered vendor work and is billed as face time.",
      +  "items": {
      +    "additionalProperties": false,
      +    "properties": {
      +      "anchor": {
      +        "anyOf": [
      +          {
      +            "additionalProperties": false,
      +            "properties": {
      +              "endWord": {
      +                "exclusiveMinimum": 0,
      +                "maximum": 9007199254740991,
      +                "type": "integer"
      +              },
      +              "startWord": {
      +                "maximum": 9007199254740991,
      +                "minimum": 0,
      +                "type": "integer"
      +              }
      +            },
      +            "required": [
      +              "startWord",
      +              "endWord"
      +            ],
      +            "type": "object"
      +          },
      +          {
      +            "additionalProperties": false,
      +            "properties": {
      +              "occurrence": {
      +                "maximum": 9007199254740991,
      +                "minimum": 0,
      +                "type": "integer"
      +              },
      +              "quote": {
      +                "maxLength": 10000,
      +                "minLength": 1,
      +                "type": "string"
      +              }
      +            },
      +            "required": [
      +              "quote"
      +            ],
      +            "type": "object"
      +          }
      +        ],
      +        "description": "The words it starts on, as an insert anchor: { startWord, endWord } or { quote, occurrence? }."
      +      },
      +      "asset_id": {
      +        "description": "A ready PNG or JPEG image or MP4 video from your own assets (list_assets), instead of media_url. Pass exactly one of the two; media_type must match the asset's kind.",
      +        "pattern": "^ast_[a-f0-9]{32}$",
      +        "type": "string"
      +      },
      +      "blur_presenter": {
      +        "description": "Card only: blur the presenter behind the card.",
      +        "type": "boolean"
      +      },
      +      "cover_words": {
      +        "description": "How many spoken words it stays on screen, counted from the first word of its anchor. Omitted means the anchored words only.",
      +        "exclusiveMinimum": 0,
      +        "maximum": 10000,
      +        "type": "integer"
      +      },
      +      "enter": {
      +        "description": "How it appears: cut (default), fade, slide (in from the nearest edge) or tilt_in. It leaves with a cut.",
      +        "enum": [
      +          "cut",
      +          "fade",
      +          "slide",
      +          "tilt_in"
      +        ],
      +        "type": "string"
      +      },
      +      "id": {
      +        "description": "Unique across inserts, overlays and layout_windows.",
      +        "pattern": "^[a-zA-Z0-9][a-zA-Z0-9_-]{0,63}$",
      +        "type": "string"
      +      },
      +      "layout": {
      +        "description": "split: presenter in the top half, media in the bottom half, captions on the seam (9:16 only). card: the media in a centred card over the presenter.",
      +        "enum": [
      +          "split",
      +          "card"
      +        ],
      +        "type": "string"
      +      },
      +      "media_type": {
      +        "description": "image (PNG or JPEG) or video (MP4, H.264 or HEVC, 8-bit SDR). A video plays muted from its first frame and is cut where its words end; one shorter than its words holds its last frame, and warnings[] names it.",
      +        "enum": [
      +          "image",
      +          "video"
      +        ],
      +        "type": "string"
      +      },
      +      "media_url": {
      +        "description": "Public https URL of the media. Pass exactly one of media_url or asset_id.",
      +        "format": "starts_with",
      +        "maxLength": 2048,
      +        "pattern": "^https:\\/\\/.*",
      +        "type": "string"
      +      }
      +    },
      +    "required": [
      +      "id",
      +      "media_type",
      +      "anchor",
      +      "layout"
      +    ],
      +    "type": "object"
      +  },
      +  "maxItems": 5,
      +  "minItems": 1,
      +  "type": "array"
      +}
    • addedInput schema / properties / overlays
      Added value: +{
      +  "description": "Text-anchored images or videos over the visible presenter, in a corner or a band at the top or bottom. At most 2 on screen at once, and two on screen together need positions that do not share a corner. Captions move to the middle or bottom third when an overlay meets them, never up over the face, and hide while neither is free. An overlay is not drawn while a full-frame insert is on screen. Same requirements as inserts: script, long-form qualification on the server, 1080p and explicit broll_policy=anyone. The presenter stays on screen, so the price does not change.",
      +  "items": {
      +    "additionalProperties": false,
      +    "properties": {
      +      "anchor": {
      +        "anyOf": [
      +          {
      +            "additionalProperties": false,
      +            "properties": {
      +              "endWord": {
      +                "exclusiveMinimum": 0,
      +                "maximum": 9007199254740991,
      +                "type": "integer"
      +              },
      +              "startWord": {
      +                "maximum": 9007199254740991,
      +                "minimum": 0,
      +                "type": "integer"
      +              }
      +            },
      +            "required": [
      +              "startWord",
      +              "endWord"
      +            ],
      +            "type": "object"
      +          },
      +          {
      +            "additionalProperties": false,
      +            "properties": {
      +              "occurrence": {
      +                "maximum": 9007199254740991,
      +                "minimum": 0,
      +                "type": "integer"
      +              },
      +              "quote": {
      +                "maxLength": 10000,
      +                "minLength": 1,
      +                "type": "string"
      +              }
      +            },
      +            "required": [
      +              "quote"
      +            ],
      +            "type": "object"
      +          }
      +        ],
      +        "description": "The words it starts on, as an insert anchor: { startWord, endWord } or { quote, occurrence? }."
      +      },
      +      "asset_id": {
      +        "description": "A ready PNG or JPEG image or MP4 video from your own assets (list_assets), instead of media_url. Pass exactly one of the two; media_type must match the asset's kind.",
      +        "pattern": "^ast_[a-f0-9]{32}$",
      +        "type": "string"
      +      },
      +      "cover_words": {
      +        "description": "How many spoken words it stays on screen, counted from the first word of its anchor. Omitted means the anchored words only.",
      +        "exclusiveMinimum": 0,
      +        "maximum": 10000,
      +        "type": "integer"
      +      },
      +      "enter": {
      +        "description": "How it appears: cut (default), fade, slide (in from the nearest edge) or tilt_in. It leaves with a cut.",
      +        "enum": [
      +          "cut",
      +          "fade",
      +          "slide",
      +          "tilt_in"
      +        ],
      +        "type": "string"
      +      },
      +      "id": {
      +        "description": "Unique across inserts, overlays and layout_windows.",
      +        "pattern": "^[a-zA-Z0-9][a-zA-Z0-9_-]{0,63}$",
      +        "type": "string"
      +      },
      +      "media_type": {
      +        "description": "image (PNG or JPEG) or video (MP4, H.264 or HEVC, 8-bit SDR). A video plays muted from its first frame and is cut where its words end; one shorter than its words holds its last frame, and warnings[] names it.",
      +        "enum": [
      +          "image",
      +          "video"
      +        ],
      +        "type": "string"
      +      },
      +      "media_url": {
      +        "description": "Public https URL of the media. Pass exactly one of media_url or asset_id.",
      +        "format": "starts_with",
      +        "maxLength": 2048,
      +        "pattern": "^https:\\/\\/.*",
      +        "type": "string"
      +      },
      +      "position": {
      +        "description": "A corner (top_left, top_right, bottom_left, bottom_right), or a band across the top or bottom.",
      +        "enum": [
      +          "top_left",
      +          "top_right",
      +          "bottom_left",
      +          "bottom_right",
      +          "top",
      +          "bottom"
      +        ],
      +        "type": "string"
      +      }
      +    },
      +    "required": [
      +      "id",
      +      "media_type",
      +      "anchor",
      +      "position"
      +    ],
      +    "type": "object"
      +  },
      +  "maxItems": 10,
      +  "minItems": 1,
      +  "type": "array"
      +}
    • changedInput schema / properties / segments / items / properties / image_motion / description
      Previous value: -"Optional image zoom: amount is the fractional reduction from fully contained size. No motion by default; no foreground crop."New value: +"Optional picture zoom. A picture always fills the frame, cut to its shape when the shapes differ (warnings[] names the share cut). amount is the zoom beyond filling: in grows from 1 to 1+amount, out shrinks from 1+amount to 1. No motion by default."
    • addedInput schema / properties / template_sounds
      Added value: +{
      +  "anyOf": [
      +    {
      +      "const": false,
      +      "type": "boolean"
      +    },
      +    {
      +      "additionalProperties": {
      +        "type": "string"
      +      },
      +      "propertyNames": {
      +        "type": "string"
      +      },
      +      "type": "object"
      +    }
      +  ],
      +  "description": "Template sounds: false for none, or { beat: name } over the defaults; list_template_sounds names them."
      +}
    • addedInput schema / properties / template_theme
      Added value: +{
      +  "additionalProperties": false,
      +  "description": "The look of every template in the run: a preset and an optional accent; only with templates.",
      +  "properties": {
      +    "accent": {
      +      "description": "#RRGGBB in place of the preset's accent: the pills' fill and the accent text. Refused below 3:1 against the colours it meets.",
      +      "pattern": "^#[0-9A-Fa-f]{6}$",
      +      "type": "string"
      +    },
      +    "preset": {
      +      "description": "clean_light (light cards on our blue gradient), bold_dark (dark cards, a yellow accent), neon (black, cyan to blue), paper (warm cream, terracotta) or mono (black and white); omitted is clean_light.",
      +      "enum": [
      +        "clean_light",
      +        "bold_dark",
      +        "neon",
      +        "paper",
      +        "mono"
      +      ],
      +      "type": "string"
      +    }
      +  },
      +  "type": "object"
      +}
    • addedInput schema / properties / templates
      Added value: +{
      +  "description": "Graphic templates, each { id, kind, anchor, cover_words?, placement?, transition?, data }. On any script run. Templates never change the price: a plain run is billed per second of finished video (30/s); a run with inserts, overlays or layout_windows is billed long-form-v1, and a covered presenter there is still face time. Ids are unique across inserts, overlays, layout_windows and templates. Text is one line of Latin or the script's own letters, digits and common punctuation, with no emoji; a wide CJK glyph counts 2 toward a limit, and long text shrinks to fit the kind's width. size small|medium|large scales a kind; absent is medium. A media field takes { asset_id } of a ready asset of the kind it names. An inner quote names words inside the template's own words, after the one before it: its beat lands on their first word, and must not fall under an insert or full-frame template; a click or step without one is spread evenly. A beat spoken before its template has entered moves just after the enter, with a warning. A template that meets the caption band hides captions while it shows; one elsewhere, such as a small one at the top, leaves them. A full-frame template also hides the presenter, overlays and over-presenter templates while it shows, never meets a wipe or zoom insert, and the covered presenter is billed. At most 2 overlays and over-presenter templates show at once, on footprints that do not overlap. template_theme sets the look of them all. Kinds: tag (over): a short gradient pill over the presenter or an insert; without position it sits in the caption spot and hides captions while it shows; data text ≤ 32, position? top|center|bottom, size? small|medium|large. lower_third (over): a name and role bar low in the frame; captions are hidden while it shows; data name ≤ 28, role? ≤ 36, side left|right, size? small|medium|large. end_card (over): a site pill with an optional call to action in the caption spot; captions are hidden while it shows; data site ≤ 32, cta? ≤ 48, size? small|medium|large. title_card (full): a full-frame hook card: the title (up to two lines) on a white card beside an optional logo image, and an optional chip under it; data title ≤ 48, chip? ≤ 32, logo? {asset_id} image, size? small|medium|large. quote (full): a full-frame quote: marks, the text in up to four lines, then the author with an optional round photo, cut to a circle; data text ≤ 120, author? ≤ 32, photo? {asset_id} image (cut to fill), size? small|medium|large. stat (full|over): a number counting up from 0 to value (up to 2 decimals), with prefix and suffix around it and a label under it; full fills the frame, over sits at chest level on a card; data value number, prefix? ≤ 6, suffix? ≤ 6, label? ≤ 32, size? small|medium|large. callout (over): an arrow or ring that lands on a point of the frame and pulses, target {x,y} in % of the frame from its top left, with an optional label pill below or above it; it may point at the face, its label keeps off the face where it can; also over an insert; data target {x,y}, style arrow|ring, text? ≤ 24, size? small|medium|large. checklist (over): 2–4 rows, each an optional icon, a label and a switch or check box set on or off; a cursor clicks rows in turn (item is the row's index from 0), each click flipping it; below the face; data items 2–4 of {label ≤ 24, on true|false, icon? phone|briefcase|user|clock|chat|star}, clicks? 0–6 of {item number, quote? inner quote}, style? switch|check, size? small|medium|large. phone_call (over): an incoming call on a neutral phone at the side (right unless side left): the caller, a subtitle and a round avatar ring, then the call is answered on answer_at and its timer runs; beside the face in wide frames, under it in tall ones; data caller ≤ 24, subtitle? ≤ 32, avatar? {asset_id} image (cut to fill), answer_at inner quote, side? left|right, size? small|medium|large. compare (full): a full-frame card showing the before image, then the after image sweeps in on a diagonal on reveal_at and both stay side by side, each with an optional label pill; both images are cut to fill a 3:5 card; data before {asset_id} image (cut to fill), after {asset_id} image (cut to fill), labels? {before? ≤ 20, after? ≤ 20}, reveal_at inner quote, size? small|medium|large. notification (over): a phone notification at the top, above the face: an icon (else the app's initial), the app, a title and a body line; it drops in, holds at least 1.2 s, then leaves before its span ends; data app ≤ 20, title ≤ 32, body ≤ 80, icon? phone|briefcase|user|clock|chat|star, size? small|medium|large. progress (over): 2–5 steps in a column on a card, each completing with a check in turn, on its advance_at quote (one per step, in order) or spread evenly; below the face; data steps 2–5 of ≤ 20, advance_at? 2–5 of inner quote, size? small|medium|large. rating (over): five stars on a card filling in turn up to stars (1–5 in halves, a half star half filled), an optional label under them; at chest level; data stars number, label? ≤ 32, size? small|medium|large.",
      +  "items": {
      +    "additionalProperties": false,
      +    "properties": {
      +      "anchor": {
      +        "anyOf": [
      +          {
      +            "additionalProperties": false,
      +            "properties": {
      +              "endWord": {
      +                "exclusiveMinimum": 0,
      +                "maximum": 9007199254740991,
      +                "type": "integer"
      +              },
      +              "startWord": {
      +                "maximum": 9007199254740991,
      +                "minimum": 0,
      +                "type": "integer"
      +              }
      +            },
      +            "required": [
      +              "startWord",
      +              "endWord"
      +            ],
      +            "type": "object"
      +          },
      +          {
      +            "additionalProperties": false,
      +            "properties": {
      +              "occurrence": {
      +                "maximum": 9007199254740991,
      +                "minimum": 0,
      +                "type": "integer"
      +              },
      +              "quote": {
      +                "maxLength": 10000,
      +                "minLength": 1,
      +                "type": "string"
      +              }
      +            },
      +            "required": [
      +              "quote"
      +            ],
      +            "type": "object"
      +          }
      +        ],
      +        "description": "The words it starts on, as an insert anchor: { startWord, endWord } or { quote, occurrence? }."
      +      },
      +      "cover_words": {
      +        "description": "How many spoken words it stays on screen, counted from the first word of its anchor. Omitted means the anchored words only.",
      +        "exclusiveMinimum": 0,
      +        "maximum": 10000,
      +        "type": "integer"
      +      },
      +      "data": {
      +        "additionalProperties": {},
      +        "description": "The kind's fields, as its catalog line in templates names them.",
      +        "propertyNames": {
      +          "type": "string"
      +        },
      +        "type": "object"
      +      },
      +      "id": {
      +        "description": "Unique across inserts, overlays, layout_windows and templates.",
      +        "pattern": "^[a-zA-Z0-9][a-zA-Z0-9_-]{0,63}$",
      +        "type": "string"
      +      },
      +      "kind": {
      +        "enum": [
      +          "tag",
      +          "lower_third",
      +          "end_card",
      +          "title_card",
      +          "quote",
      +          "stat",
      +          "callout",
      +          "checklist",
      +          "phone_call",
      +          "compare",
      +          "notification",
      +          "progress",
      +          "rating"
      +        ],
      +        "type": "string"
      +      },
      +      "placement": {
      +        "description": "over (drawn over the presenter) or full (fills the frame); omitted means the kind's first placement, and a kind takes only the placements its catalog line names.",
      +        "enum": [
      +          "over",
      +          "full"
      +        ],
      +        "type": "string"
      +      },
      +      "transition": {
      +        "description": "Full placement only, as an insert's transition.",
      +        "enum": [
      +          "cut",
      +          "wipe",
      +          "flash",
      +          "zoom"
      +        ],
      +        "type": "string"
      +      }
      +    },
      +    "required": [
      +      "id",
      +      "anchor",
      +      "kind",
      +      "data"
      +    ],
      +    "type": "object"
      +  },
      +  "maxItems": 12,
      +  "minItems": 1,
      +  "type": "array"
      +}
  6. Changed1 schema field changedv0.33.0
    • addedInput schema / properties / visible_ai_label
      Added value: +{
      +  "description": "Visible AI label for newly marked presenter videos, including long form; defaults to true in the server admission policy. False hides only the visible label and does not disable invisible marking or signed provenance. Historical outputs are unchanged.",
      +  "type": "boolean"
      +}
  7. Changed7 schema fields changedv0.25.0
    • changedInput schema / properties / actor_gender / description
      Previous value: -"Gender of the face in image: female | male. Only with image: picks the default voice of that gender (female: sarah, male: george). Refused with actor_id (its gender is known) and without image. An explicit voice or voice_id wins and the response warns that actor_gender changed nothing."New value: +"Gender of the face in image: female | male. Only with image: picks the default voice of that gender (female: sarah, male: george; on gemini-3.8-flash-tts: kore and charon). Refused with actor_id (its gender is known) and without image. An explicit voice or voice_id wins and the response warns that actor_gender changed nothing."
    • removedInput schema / properties / disclosure_overlay
      Removed value: -{
      -  "type": "boolean"
      -}
    • changedInput schema / properties / script / description
      Previous value: -"The words the actor says; required unless segments supplies the spoken text. Segments and text-anchored inserts require long-form qualification on the server. Script limits by speech model: eleven_v3: 5000 characters; eleven_flash_v2_5: 10000 characters; eleven_turbo_v2_5: 10000 characters. Count includes spaces, audio tags and stress marks; emoji may count as two characters. There is no word-count limit. Duration and price are estimates until measured. Russian stress: write the stressed vowel as a capital inside a lowercase word (\"потОм\", \"зАмок\") and eleven_v3 receives it as the stress mark U+0301 (\"пото́м\"); a mark typed directly is kept. A capital at the start of a word stays a capital, and a word with a second capital or a capital consonant inside (all caps, \"ВУЗы\") is left as it is. A single capital vowel inside a word is always read as stress, so write \"Яндекс Еда\", not \"ЯндексЕда\". Tell users writing in Russian that they can mark stress this way. eleven_flash_v2_5 and eleven_turbo_v2_5 cost less but misread stress marks: capitals reach them unchanged."New value: +"The words the actor says; required unless segments supplies the spoken text. Segments and text-anchored inserts require long-form qualification on the server. Script limits by speech model: eleven_v3: 5000 characters; eleven_flash_v2_5: 10000 characters; eleven_turbo_v2_5: 10000 characters; eleven_v4: 5000 characters; gemini-3.8-flash-tts: 5000 characters. Count includes spaces, audio tags and stress marks; emoji may count as two characters. Break tags are cut from the text sent to eleven_v4 and gemini-3.8-flash-tts and are not counted there. There is no word-count limit. Duration and price are estimates until measured. Russian stress: write the stressed vowel as a capital inside a lowercase word (\"потОм\", \"зАмок\") and eleven_v3, eleven_v4 and gemini-3.8-flash-tts receive it as the stress mark U+0301 (\"пото́м\"); a mark typed directly is kept. A capital at the start of a word stays a capital, and a word with a second capital or a capital consonant inside (all caps, \"ВУЗы\") is left as it is. A single capital vowel inside a word is always read as stress, so write \"Яндекс Еда\", not \"ЯндексЕда\". Tell users writing in Russian that they can mark stress this way. eleven_flash_v2_5 and eleven_turbo_v2_5 cost less but misread stress marks: capitals reach them unchanged."
    • changedInput schema / properties / tts_model / description
      Previous value: -"Speech model: eleven_v3 | eleven_flash_v2_5 | eleven_turbo_v2_5. Omitted means the model of the chosen preset (list_voices shows it; every preset speaks eleven_v3) or eleven_v3 for a raw voice_id. eleven_v3 is the most expressive and the only one that reads stress marks (a capital vowel inside a Russian word, \"потОм\", becomes one; see script); eleven_flash_v2_5 and eleven_turbo_v2_5 are cheaper alternatives for languages other than Russian. Script limits by speech model: eleven_v3: 5000 characters; eleven_flash_v2_5: 10000 characters; eleven_turbo_v2_5: 10000 characters. Count includes spaces, audio tags and stress marks; emoji may count as two characters. There is no word-count limit. Duration and price are estimates until measured."New value: +"Speech model: eleven_v3 | eleven_flash_v2_5 | eleven_turbo_v2_5 | eleven_v4 | gemini-3.8-flash-tts. Omitted means the model of the chosen voice (list_voices shows it): eleven_v4 for the Russian presets and for catalog voices named ru_*, gemini-3.8-flash-tts for its own voices, eleven_v3 for every other preset and catalog voice. A raw voice_id speaks eleven_v4 when the script is mostly Cyrillic and eleven_v3 otherwise. An explicit tts_model always wins. eleven_v4, eleven_v3 and gemini-3.8-flash-tts read stress marks (a capital vowel inside a Russian word, \"потОм\", becomes one; see script); eleven_flash_v2_5 and eleven_turbo_v2_5 are cheaper alternatives for languages other than Russian. gemini-3.8-flash-tts speaks only its own voices (list_voices with model=gemini-3.8-flash-tts; without voice, kore for a female actor and charon otherwise) and returns no word timings: a preset or catalog voice, voice_id, captions=true, segments and inserts are refused with it before any charge. Audio tags in square brackets are an eleven_v3 and eleven_v4 convention and are not measured on it. Script limits by speech model: eleven_v3: 5000 characters; eleven_flash_v2_5: 10000 characters; eleven_turbo_v2_5: 10000 characters; eleven_v4: 5000 characters; gemini-3.8-flash-tts: 5000 characters. Count includes spaces, audio tags and stress marks; emoji may count as two characters. Break tags are cut from the text sent to eleven_v4 and gemini-3.8-flash-tts and are not counted there. There is no word-count limit. Duration and price are estimates until measured."
    • changedInput schema / properties / tts_model / enum
      Previous value: -[
      -  "eleven_v3",
      -  "eleven_flash_v2_5",
      -  "eleven_turbo_v2_5"
      -]New value: +[
      +  "eleven_v3",
      +  "eleven_flash_v2_5",
      +  "eleven_turbo_v2_5",
      +  "eleven_v4",
      +  "gemini-3.8-flash-tts"
      +]
    • changedInput schema / properties / voice / description
      Previous value: -"Voice name from list_voices. Curated presets: owner_ru_clone | sarah | george | eric | daria_ru_female (owner_ru_clone is the Russian cloned voice). The API refuses a name list_voices does not return, before any charge. Omitted means the default voice for the actor's gender: the gender of actor_id, actor_gender with image, or george for the default actor and for image without actor_gender. Mutually exclusive with voice_id."New value: +"Voice name from list_voices. Curated presets: owner_ru_clone | sarah | george | eric | daria_ru_female (owner_ru_clone is the Russian cloned voice). The API refuses a name list_voices does not return, before any charge. Omitted means the default voice for the actor's gender: the gender of actor_id, actor_gender with image, or george for the default actor and for image without actor_gender. gemini-3.8-flash-tts speaks only its own voices (kind model_voice in list_voices, such as kore): naming one selects that model, and a voice is refused with a tts_model that does not speak it, before any charge. Mutually exclusive with voice_id."
    • changedInput schema / properties / voice_id / description
      Previous value: -"Raw vendor voice id (16–32 letters and digits) for a voice outside the catalog. Checked lazily: an unknown id fails the run, not the request. Mutually exclusive with voice."New value: +"Raw vendor voice id (16–32 letters and digits) for a voice outside the catalog. Checked lazily: an unknown id fails the run, not the request. Refused with tts_model=gemini-3.8-flash-tts. Mutually exclusive with voice."
  8. First observedv0.20.0

TDQS

A4/5.0
Behavior5/5

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

Annotations only say readOnlyHint=false and destructiveHint=false; the description adds substantial behavior beyond that, including the polling contract via get_run's poll.arguments, the non-obvious fact that a failed run can return to queued and appear in warnings[], and that fields marked NOT HONORED YET silently do not reach the renderer. It also discloses the full credit model, making the cost consequences of presenter choice and attempt-based reruns explicit.

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?

It is front-loaded with the input pointer and the action, then workflow, alternatives, and price, so the agent hits the essential facts first. The pricing block is long and partly duplicates quote_ugc's job, but for a 47-parameter credit-consuming generation tool most of the content earns its place.

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

Completeness3/5

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

With no output schema, the description does cover the post-call lifecycle (poll via get_run, warnings[], requeue behavior) and the cost model, which is the hard part. However, the enormous parameter surface is only partially addressed and the return value of the initial call (presumably a run identifier) is never stated, so an agent still has gaps before it can invoke confidently.

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

Parameters2/5

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

Schema description coverage is 0% across 47 parameters, so the description carries the full burden, yet it explains only attempt, actor_id, image, captions, and the format/resolution defaults. Dozens of parameters (call, look, shots, scenes, moves, presenter_gaze, broll_policy, visible_ai_label, etc.) are left entirely undefined and are not recoverable from 'the same fields as quote_ugc' without opening another tool.

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

Purpose4/5

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

The description names a specific verb and resource: 'Start a lip-synced UGC video', and pins the subject identity to actor_id, image, or the default actor. It is clearly differentiated from plan_reference_remake and quote_ugc, but the definition of the input surface is delegated to a sibling tool ('the same fields as quote_ugc'), which forces the agent to look elsewhere to understand what it is starting.

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

Usage Guidelines5/5

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

It gives explicit routing: quote first with quote_ugc, use plan_reference_remake with analysis_id instead when the target is a reference reel, and ask the user before enabling captions. It also states that attempt=2,3,… starts a new run rather than retrying in place, which is exactly the kind of when/when-not guidance an agent needs before spending credits.

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