Skip to main content
Glama

Quote a video

quote_ugc
Read-only

Estimate the credit cost of a UGC video render before spending credits, so the price can be shown before calling make_ugc.

Instructions

Estimate the credit cost of a make_ugc call WITHOUT spending credits; show the user the price before make_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": "quote_ugc"
  }
}

Input Schema

NameRequiredDescriptionDefault
callNo
lookNoNOT HONORED YET: it does not reach the renderer.natural
nameNoNOT HONORED YET: it does not reach the renderer.
imageNoPublic https URL of the actor's photo (PNG, JPEG or WebP, up to 10 MB; a local file via upload_image); another source is refused (unusable_source) before any charge.
movesNo
musicNoMusic under the voice, off unless asked: "auto" or { mood }. 60 credits per video, charged only when delivered with it.
shotsNoLive shots of the actor on script words, no overlaps; 9:16, long-form qualification. Acting shots: wide or full, a cast from pictures. Each kind has its presenter-second price in list_prices.
voiceNoA list_voices name (presets sarah | george | eric | daria_ru_female); another is refused before any charge. Omitted: the actor's gender default.
designNo
personNoNOT HONORED YET: the default actor is used; pick actor_id from list_actors or pass image.
scenesNo25 credits per scene, charged only for scenes drawn in the delivered video. Needs script and long-form qualification.
scriptNoThe words the actor says; required unless segments supplies them. 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. Spaces, audio tags and stress marks count.
framingNo
insertsNoInserts on script words; need long-form qualification, 1080p and broll_policy=anyone.
actor_idNoFrom list_actors; not with image, person or actor_gender.
captionsNo
overlaysNoImages or videos over the presenter; at most 3 at once. Price unchanged.
segmentsNo
voice_idNoRaw vendor voice id outside the catalog; an unknown id fails the run, not the request.
interviewNo
templatesNoPrice unchanged, a covered presenter still billed. Kinds: tag, lower_third, end_card, title_card, quote, stat, callout, checklist, phone_call, compare, notification, progress, rating, chat_window, video_grid, word_title, phone_screen, terminal, pointer_chips, chart, race, hand_title, word_fill. Data and limits per kind: describe_tool.
tts_modelNoSpeech model; omitted, the voice's own. gemini-3.8-flash-tts speaks only its own voices and refuses voice_id, captions, segments and inserts before any charge.
backgroundNo
end_hold_sNo
pause_trimNo
resolutionNo
voice_paceNo
edit_soundsNo
actor_genderNo
aspect_ratioNoOmitted: 9:16, or the supported format nearest the image. A source more than 15% off the request is refused (aspect_conflict) before any charge.
broll_policyNoanyone, no_actor or no_people (the default). Templates with your own media need anyone.
caption_modeNo
motion_styleNoFree drawing style of captions, templates and scenes; describe_tool quote_ugc motion_style lists the styles and spans.
caption_placeNo
caption_styleNohormozi
presenter_micNo
layout_windowsNoPresenter reframings: split (9:16 only) or card. A covered or blurred presenter is billed as face time.
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. Changed189 schema fields changedv0.45.0
    • changedInput schema / $defs / d0 / anyOf
      Previous value: -[
      -  {
      -    "$ref": "#/$defs/d6"
      -  },
      -  {
      -    "$ref": "#/$defs/d7"
      -  }
      -]New value: +[
      +  {
      +    "properties": {
      +      "endWord": {
      +        "exclusiveMinimum": 0,
      +        "type": "integer"
      +      },
      +      "startWord": {
      +        "minimum": 0,
      +        "type": "integer"
      +      }
      +    },
      +    "required": [
      +      "startWord",
      +      "endWord"
      +    ],
      +    "type": "object"
      +  },
      +  {
      +    "properties": {
      +      "occurrence": {
      +        "minimum": 0,
      +        "type": "integer"
      +      },
      +      "quote": {
      +        "$ref": "#/$defs/d9"
      +      }
      +    },
      +    "required": [
      +      "quote"
      +    ],
      +    "type": "object"
      +  }
      +]
    • removedInput schema / $defs / d0 / description
      Removed value: -"The words it starts on, as an insert anchor: { startWord,…"
    • removedInput schema / $defs / d1 / description
      Removed value: -"Public https URL of the media."
    • removedInput schema / $defs / d1 / format
      Removed value: -"starts_with"
    • removedInput schema / $defs / d1 / maxLength
      Removed value: -2048
    • changedInput schema / $defs / d1 / pattern
      Previous value: -"^https:\\/\\/.*"New value: +"^[a-zA-Z0-9][a-zA-Z0-9_-]{0,63}$"
    • removedInput schema / $defs / d10
      Removed value: -{
      -  "maximum": 2,
      -  "minimum": 0.05,
      -  "type": "number"
      -}
    • removedInput schema / $defs / d2 / description
      Removed value: -"How many spoken words it stays on screen, counted from the…"
    • removedInput schema / $defs / d3 / description
      Removed value: -"A ready PNG or JPEG image or MP4 video from your own assets…"
    • removedInput schema / $defs / d3 / pattern
      Removed value: -"^ast_[a-f0-9]{32}$"
    • addedInput schema / $defs / d3 / properties
      Added value: +{
      +  "amount": {
      +    "exclusiveMaximum": 1,
      +    "minimum": 0,
      +    "type": "number"
      +  },
      +  "direction": {
      +    "enum": [
      +      "in",
      +      "out"
      +    ],
      +    "type": "string"
      +  }
      +}
    • addedInput schema / $defs / d3 / required
      Added value: +[
      +  "direction",
      +  "amount"
      +]
    • changedInput schema / $defs / d3 / type
      Previous value: -"string"New value: +"object"
    • removedInput schema / $defs / d4 / description
      Removed value: -"Optional picture zoom."
    • addedInput schema / $defs / d4 / maxLength
      Added value: +2048
    • addedInput schema / $defs / d4 / pattern
      Added value: +"^https:\\/\\/.*"
    • removedInput schema / $defs / d4 / properties
      Removed value: -{
      -  "amount": {
      -    "exclusiveMaximum": 1,
      -    "minimum": 0,
      -    "type": "number"
      -  },
      -  "direction": {
      -    "enum": [
      -      "in",
      -      "out"
      -    ],
      -    "type": "string"
      -  }
      -}
    • removedInput schema / $defs / d4 / required
      Removed value: -[
      -  "direction",
      -  "amount"
      -]
    • changedInput schema / $defs / d4 / type
      Previous value: -"object"New value: +"string"
    • removedInput schema / $defs / d5 / description
      Removed value: -"image (PNG or JPEG) or video (MP4, H.264 or HEVC, 8-bit…"
    • removedInput schema / $defs / d5 / enum
      Removed value: -[
      -  "image",
      -  "video"
      -]
    • addedInput schema / $defs / d5 / pattern
      Added value: +"^ast_[a-f0-9]{32}$"
    • addedInput schema / $defs / d6 / enum
      Added value: +[
      +  "image",
      +  "video"
      +]
    • removedInput schema / $defs / d6 / properties
      Removed value: -{
      -  "endWord": {
      -    "exclusiveMinimum": 0,
      -    "type": "integer"
      -  },
      -  "startWord": {
      -    "minimum": 0,
      -    "type": "integer"
      -  }
      -}
    • removedInput schema / $defs / d6 / required
      Removed value: -[
      -  "startWord",
      -  "endWord"
      -]
    • changedInput schema / $defs / d6 / type
      Previous value: -"object"New value: +"string"
    • addedInput schema / $defs / d7 / enum
      Added value: +[
      +  "cut",
      +  "fade",
      +  "slide",
      +  "tilt_in",
      +  "pop",
      +  "scale_up"
      +]
    • removedInput schema / $defs / d7 / properties
      Removed value: -{
      -  "occurrence": {
      -    "minimum": 0,
      -    "type": "integer"
      -  },
      -  "quote": {
      -    "maxLength": 10000,
      -    "minLength": 1,
      -    "type": "string"
      -  }
      -}
    • removedInput schema / $defs / d7 / required
      Removed value: -[
      -  "quote"
      -]
    • changedInput schema / $defs / d7 / type
      Previous value: -"object"New value: +"string"
    • removedInput schema / $defs / d8 / description
      Removed value: -"How it appears: cut (default), fade, slide (in from the…"
    • removedInput schema / $defs / d8 / enum
      Removed value: -[
      -  "cut",
      -  "fade",
      -  "slide",
      -  "tilt_in",
      -  "pop",
      -  "scale_up"
      -]
    • addedInput schema / $defs / d8 / maximum
      Added value: +2
    • addedInput schema / $defs / d8 / minimum
      Added value: +0.05
    • changedInput schema / $defs / d8 / type
      Previous value: -"string"New value: +"number"
    • removedInput schema / $defs / d9 / description
      Removed value: -"Unique across inserts, overlays and layout_windows."
    • addedInput schema / $defs / d9 / maxLength
      Added value: +10000
    • addedInput schema / $defs / d9 / minLength
      Added value: +1
    • removedInput schema / $defs / d9 / pattern
      Removed value: -"^[a-zA-Z0-9][a-zA-Z0-9_-]{0,63}$"
    • 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."
    • changedInput schema / properties / actor_id / description
      Previous 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."New value: +"From list_actors; not with image, person or actor_gender."
    • changedInput schema / properties / aspect_ratio / description
      Previous 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."New value: +"Omitted: 9:16, or the supported format nearest the image. A source more than 15% off the request is refused (aspect_conflict) before any charge."
    • changedInput schema / properties / broll_policy / description
      Previous 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."New value: +"anyone, no_actor or no_people (the default). Templates with your own media need anyone."
    • 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"
      -  },
      -  {
      -    "properties": {
      -      "look": {
      -        "enum": [
      -          "punch",
      -          "pill",
      -          "color"
      -        ],
      -        "type": "string"
      -      },
      -      "punch_in": {
      -        "description": "Long form only: zoom into the presenter while the quote is…",
      -        "type": "boolean"
      -      },
      -      "quote": {
      -        "maxLength": 40,
      -        "minLength": 1,
      -        "type": "string"
      -      }
      -    },
      -    "required": [
      -      "quote"
      -    ],
      -    "type": "object"
      -  }
      -]New value: +[
      +  {
      +    "maxLength": 120,
      +    "minLength": 1,
      +    "type": "string"
      +  },
      +  {
      +    "properties": {
      +      "look": {
      +        "enum": [
      +          "punch",
      +          "pill",
      +          "color",
      +          "box"
      +        ],
      +        "type": "string"
      +      },
      +      "punch_in": {
      +        "type": "boolean"
      +      },
      +      "quote": {
      +        "maxLength": 120,
      +        "minLength": 1,
      +        "type": "string"
      +      }
      +    },
      +    "required": [
      +      "quote"
      +    ],
      +    "type": "object"
      +  }
      +]
    • changedInput schema / properties / caption_emphasis / maxItems
      Previous value: -20New value: +60
    • 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_place / additionalProperties
      Removed value: -{}
    • removedInput schema / properties / caption_place / description
      Removed value: -"Pinned captions instead of caption_position: {relative_to:frame|face,y,edge?:top|center|bottom,max_width?}; y is a frame share, or face heights from the face centre."
    • removedInput schema / properties / caption_place / propertyNames
      Removed value: -{
      -  "type": "string"
      -}
    • 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_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 / captions / description
      Removed value: -"Burn word-timed captions into the video, over the presenter and over inserts. Not available with segments."
    • addedInput schema / properties / design
      Added value: +{
      +  "properties": {
      +    "fonts": {
      +      "properties": {
      +        "body": {
      +          "type": "string"
      +        },
      +        "display": {
      +          "type": "string"
      +        }
      +      },
      +      "type": "object"
      +    },
      +    "logo_asset_id": {
      +      "type": "string"
      +    },
      +    "look": {
      +      "type": "string"
      +    },
      +    "motion": {
      +      "enum": [
      +        "calm",
      +        "playful",
      +        "premium",
      +        "punchy"
      +      ],
      +      "type": "string"
      +    },
      +    "palette": {
      +      "properties": {
      +        "accent": {
      +          "type": "string"
      +        },
      +        "accent_ink": {
      +          "type": "string"
      +        },
      +        "background": {
      +          "type": "string"
      +        },
      +        "ink": {
      +          "type": "string"
      +        },
      +        "surface": {
      +          "type": "string"
      +        }
      +      },
      +      "type": "object"
      +    },
      +    "radius": {
      +      "enum": [
      +        "square",
      +        "soft",
      +        "round",
      +        "pill"
      +      ],
      +      "type": "string"
      +    },
      +    "style": {
      +      "type": "string"
      +    }
      +  },
      +  "type": "object"
      +}
    • 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."
    • removedInput schema / properties / end_hold_s / description
      Removed value: -"Seconds the last frame stays after the last word: the presenter freezes and every layer on screen then stays. Production seconds, not presenter seconds. Needs script and long-form qualification."
    • 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."
    • addedInput schema / properties / framing / items / properties / cover_words / $ref
      Added value: +"#/$defs/d2"
    • removedInput schema / properties / framing / items / properties / cover_words / description
      Removed value: -"How many spoken words the size holds, counted from the…"
    • removedInput schema / properties / framing / items / properties / cover_words / exclusiveMinimum
      Removed value: -0
    • removedInput schema / properties / framing / items / properties / cover_words / maximum
      Removed value: -10000
    • removedInput schema / properties / framing / items / properties / cover_words / type
      Removed value: -"integer"
    • addedInput schema / properties / framing / items / properties / id / $ref
      Added value: +"#/$defs/d1"
    • removedInput schema / properties / framing / items / properties / id / description
      Removed value: -"Unique across inserts, overlays, layout_windows, templates…"
    • removedInput schema / properties / framing / items / properties / id / pattern
      Removed value: -"^[a-zA-Z0-9][a-zA-Z0-9_-]{0,63}$"
    • removedInput schema / properties / framing / items / properties / id / type
      Removed value: -"string"
    • removedInput schema / properties / framing / items / properties / size / description
      Removed value: -"close: the presenter 1.18 times larger about the face;"
    • changedInput schema / properties / framing / items / properties / size / enum
      Previous value: -[
      -  "close",
      -  "medium"
      -]New value: +[
      +  "close",
      +  "medium",
      +  "full"
      +]
    • removedInput schema / properties / framing / items / properties / transition / description
      Removed value: -"cut: a hard cut to the size;"
    • changedInput schema / properties / framing / maxItems
      Previous value: -20New value: +60
    • changedInput schema / properties / image / description
      Previous 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."New value: +"Public https URL of the actor's photo (PNG, JPEG or WebP, up to 10 MB; a local file via upload_image); another source is refused (unusable_source) before any charge."
    • removedInput schema / properties / image / format
      Removed value: -"starts_with"
    • changedInput schema / properties / inserts / description
      Previous 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."New value: +"Inserts on script words; need long-form qualification, 1080p and broll_policy=anyone."
    • addedInput schema / properties / inserts / items / properties / anchor / $ref
      Added value: +"#/$defs/d0"
    • removedInput schema / properties / inserts / items / properties / anchor / anyOf
      Removed value: -[
      -  {
      -    "$ref": "#/$defs/d6"
      -  },
      -  {
      -    "$ref": "#/$defs/d7"
      -  }
      -]
    • changedInput schema / properties / inserts / items / properties / asset_id / $ref
      Previous value: -"#/$defs/d3"New value: +"#/$defs/d5"
    • addedInput schema / properties / inserts / items / properties / box
      Added value: +{
      +  "properties": {
      +    "height": {
      +      "minimum": 0.1,
      +      "type": "number"
      +    },
      +    "left": {
      +      "type": "number"
      +    },
      +    "top": {
      +      "type": "number"
      +    },
      +    "width": {
      +      "minimum": 0.1,
      +      "type": "number"
      +    }
      +  },
      +  "required": [
      +    "left",
      +    "top",
      +    "width",
      +    "height"
      +  ],
      +  "type": "object"
      +}
    • addedInput schema / properties / inserts / items / properties / cover_words / $ref
      Added value: +"#/$defs/d2"
    • removedInput schema / properties / inserts / items / properties / cover_words / description
      Removed value: -"How many spoken words this insert covers, counted from the…"
    • removedInput schema / properties / inserts / items / properties / cover_words / exclusiveMinimum
      Removed value: -0
    • removedInput schema / properties / inserts / items / properties / cover_words / maximum
      Removed value: -10000
    • removedInput schema / properties / inserts / items / properties / cover_words / type
      Removed value: -"integer"
    • addedInput schema / properties / inserts / items / properties / fit
      Added value: +{
      +  "enum": [
      +    "cover",
      +    "contain",
      +    "auto"
      +  ],
      +  "type": "string"
      +}
    • addedInput schema / properties / inserts / items / properties / id / $ref
      Added value: +"#/$defs/d1"
    • removedInput schema / properties / inserts / items / properties / id / pattern
      Removed value: -"^[a-zA-Z0-9][a-zA-Z0-9_-]{0,63}$"
    • removedInput schema / properties / inserts / items / properties / id / type
      Removed value: -"string"
    • changedInput schema / properties / inserts / items / properties / image_motion / $ref
      Previous value: -"#/$defs/d4"New value: +"#/$defs/d3"
    • changedInput schema / properties / inserts / items / properties / media_type / $ref
      Previous value: -"#/$defs/d5"New value: +"#/$defs/d6"
    • changedInput schema / properties / inserts / items / properties / media_url / $ref
      Previous value: -"#/$defs/d1"New value: +"#/$defs/d4"
    • addedInput schema / properties / inserts / items / properties / motion
      Added value: +{
      +  "properties": {
      +    "direction": {
      +      "enum": [
      +        "down",
      +        "up",
      +        "left",
      +        "right"
      +      ],
      +      "type": "string"
      +    },
      +    "kind": {
      +      "enum": [
      +        "scroll",
      +        "pan"
      +      ],
      +      "type": "string"
      +    }
      +  },
      +  "required": [
      +    "kind",
      +    "direction"
      +  ],
      +  "type": "object"
      +}
    • addedInput schema / properties / inserts / items / properties / retime
      Added value: +{
      +  "properties": {
      +    "at_s": {
      +      "maximum": 600,
      +      "minimum": 0,
      +      "type": "number"
      +    },
      +    "mode": {
      +      "enum": [
      +        "ramp",
      +        "stutter"
      +      ],
      +      "type": "string"
      +    }
      +  },
      +  "required": [
      +    "mode"
      +  ],
      +  "type": "object"
      +}
    • removedInput schema / properties / inserts / items / properties / transition / description
      Removed value: -"How the insert comes in and goes out: cut (default), wipe…"
    • changedInput schema / properties / inserts / items / properties / transition / enum
      Previous value: -[
      -  "cut",
      -  "wipe",
      -  "flash",
      -  "zoom"
      -]New value: +[
      +  "cut",
      +  "wipe",
      +  "flash",
      +  "zoom",
      +  "light_leak",
      +  "glitch",
      +  "power"
      +]
    • changedInput schema / properties / inserts / maxItems
      Previous value: -49New value: +99
    • removedInput schema / properties / interview / additionalProperties
      Removed value: -{}
    • removedInput schema / properties / interview / description
      Removed value: -"Off-screen speaker: { turns: [{ anchor: { quote }, cover_words? }] (words of script they say), off_screen?: { voice?, caption?: { style?, place? } }, gaze?: camera|left|right }. The presenter answers and holds still while they talk."
    • removedInput schema / properties / interview / propertyNames
      Removed value: -{
      -  "type": "string"
      -}
    • changedInput schema / properties / layout_windows / description
      Previous 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."New value: +"Presenter reframings: split (9:16 only) or card. A covered or blurred presenter is billed as face time."
    • changedInput schema / properties / layout_windows / items / properties / asset_id / $ref
      Previous value: -"#/$defs/d3"New value: +"#/$defs/d5"
    • removedInput schema / properties / layout_windows / items / properties / blur_presenter / description
      Removed value: -"Card only: blur the presenter behind the card."
    • changedInput schema / properties / layout_windows / items / properties / enter / $ref
      Previous value: -"#/$defs/d8"New value: +"#/$defs/d7"
    • changedInput schema / properties / layout_windows / items / properties / id / $ref
      Previous value: -"#/$defs/d9"New value: +"#/$defs/d1"
    • removedInput schema / properties / layout_windows / items / properties / layout / description
      Removed value: -"split: presenter in the top half, media in the bottom half,…"
    • addedInput schema / properties / layout_windows / items / properties / media_share
      Added value: +{
      +  "maximum": 0.7,
      +  "minimum": 0.3,
      +  "type": "number"
      +}
    • addedInput schema / properties / layout_windows / items / properties / media_side
      Added value: +{
      +  "enum": [
      +    "top",
      +    "bottom"
      +  ],
      +  "type": "string"
      +}
    • changedInput schema / properties / layout_windows / items / properties / media_type / $ref
      Previous value: -"#/$defs/d5"New value: +"#/$defs/d6"
    • changedInput schema / properties / layout_windows / items / properties / media_url / $ref
      Previous value: -"#/$defs/d1"New value: +"#/$defs/d4"
    • changedInput schema / properties / layout_windows / maxItems
      Previous value: -5New value: +15
    • changedInput schema / properties / look / description
      Previous value: -"NOT HONORED YET: look is not honored yet: it does not reach the renderer"New value: +"NOT HONORED YET: it does not reach the renderer."
    • addedInput schema / properties / motion_style
      Added value: +{
      +  "description": "Free drawing style of captions, templates and scenes; describe_tool quote_ugc motion_style lists the styles and spans.",
      +  "type": "object"
      +}
    • addedInput schema / properties / moves
      Added value: +{
      +  "items": {
      +    "properties": {
      +      "anchor": {
      +        "properties": {
      +          "occurrence": {
      +            "minimum": 0,
      +            "type": "integer"
      +          },
      +          "quote": {
      +            "maxLength": 2000,
      +            "minLength": 1,
      +            "type": "string"
      +          }
      +        },
      +        "required": [
      +          "quote"
      +        ],
      +        "type": "object"
      +      },
      +      "cover_words": {
      +        "$ref": "#/$defs/d2"
      +      },
      +      "data": {
      +        "type": "object"
      +      },
      +      "name": {
      +        "maxLength": 48,
      +        "minLength": 1,
      +        "pattern": "^[a-z0-9]+(-[a-z0-9]+)*$",
      +        "type": "string"
      +      },
      +      "placement": {
      +        "enum": [
      +          "over",
      +          "full"
      +        ],
      +        "type": "string"
      +      }
      +    },
      +    "required": [
      +      "name",
      +      "anchor"
      +    ],
      +    "type": "object"
      +  },
      +  "maxItems": 40,
      +  "minItems": 1,
      +  "type": "array"
      +}
    • addedInput schema / properties / music
      Added value: +{
      +  "anyOf": [
      +    {
      +      "const": "auto",
      +      "type": "string"
      +    },
      +    {
      +      "properties": {
      +        "mood": {
      +          "maxLength": 400,
      +          "minLength": 1,
      +          "pattern": "^[^\\p{Cc}]+$",
      +          "type": "string"
      +        }
      +      },
      +      "required": [
      +        "mood"
      +      ],
      +      "type": "object"
      +    }
      +  ],
      +  "description": "Music under the voice, off unless asked: \"auto\" or { mood }. 60 credits per video, charged only when delivered with it."
      +}
    • changedInput schema / properties / name / description
      Previous value: -"NOT HONORED YET: name is not honored yet: it does not reach the renderer"New value: +"NOT HONORED YET: it does not reach the renderer."
    • changedInput schema / properties / overlays / description
      Previous value: -"Text-anchored images or videos over the visible presenter, each at one position or place. At most 2 on screen at once, on boxes that do not overlap. Captions move to the middle or bottom third off an overlay, never over the face, and hide while neither is free. Hidden under full-frame inserts. 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."New value: +"Images or videos over the presenter; at most 3 at once. Price unchanged."
    • changedInput schema / properties / overlays / items / properties / asset_id / $ref
      Previous value: -"#/$defs/d3"New value: +"#/$defs/d5"
    • changedInput schema / properties / overlays / items / properties / enter / $ref
      Previous value: -"#/$defs/d8"New value: +"#/$defs/d7"
    • removedInput schema / properties / overlays / items / properties / enter_duration_s / description
      Removed value: -"Default 0.32."
    • removedInput schema / properties / overlays / items / properties / enter_offset_s / description
      Removed value: -"Seconds from its first word, negative before;"
    • removedInput schema / properties / overlays / items / properties / exit / description
      Removed value: -"How it leaves: cut (default), fade, pop_out or slide."
    • changedInput schema / properties / overlays / items / properties / id / $ref
      Previous value: -"#/$defs/d9"New value: +"#/$defs/d1"
    • changedInput schema / properties / overlays / items / properties / media_type / $ref
      Previous value: -"#/$defs/d5"New value: +"#/$defs/d6"
    • changedInput schema / properties / overlays / items / properties / media_url / $ref
      Previous value: -"#/$defs/d1"New value: +"#/$defs/d4"
    • removedInput schema / properties / overlays / items / properties / place / additionalProperties
      Removed value: -{}
    • removedInput schema / properties / overlays / items / properties / place / description
      Removed value: -"Instead of position, a pinned box:…"
    • removedInput schema / properties / overlays / items / properties / place / propertyNames
      Removed value: -{
      -  "type": "string"
      -}
    • removedInput schema / properties / overlays / items / properties / position / description
      Removed value: -"A corner (top_left, top_right, bottom_left, bottom_right),…"
    • changedInput schema / properties / overlays / maxItems
      Previous value: -10New value: +30
    • addedInput schema / properties / pause_trim / anyOf
      Added value: +[
      +  {
      +    "const": false,
      +    "type": "boolean"
      +  },
      +  {
      +    "properties": {
      +      "comma_s": {
      +        "$ref": "#/$defs/d8"
      +      },
      +      "mid_phrase_s": {
      +        "$ref": "#/$defs/d8"
      +      },
      +      "sentence_end_s": {
      +        "$ref": "#/$defs/d8"
      +      }
      +    },
      +    "type": "object"
      +  }
      +]
    • 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": {
      -    "$ref": "#/$defs/d10"
      -  },
      -  "mid_phrase_s": {
      -    "$ref": "#/$defs/d10"
      -  },
      -  "sentence_end_s": {
      -    "$ref": "#/$defs/d10"
      -  }
      -}
    • removedInput schema / properties / pause_trim / type
      Removed value: -"object"
    • changedInput schema / properties / person / description
      Previous 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"New value: +"NOT HONORED YET: the default actor is used; pick actor_id from list_actors or pass image."
    • changedInput schema / properties / person / maxLength
      Previous value: -500New value: +2000
    • 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[]."
    • changedInput schema / properties / presenter_framing / enum
      Previous value: -[
      -  "close",
      -  "wide"
      -]New value: +[
      +  "close",
      +  "wide",
      +  "full"
      +]
    • removedInput schema / properties / presenter_gaze / description
      Removed value: -"[{ anchor: { quote }, cover_words?, gaze: camera|left|right }]. Where the presenter looks on these words, as the viewer sees it: camera, left or right. Needs actor_id with that view (list_actors); a change of gaze is a cut."
    • removedInput schema / properties / presenter_gaze / items / additionalProperties
      Removed value: -{}
    • removedInput schema / properties / presenter_gaze / items / propertyNames
      Removed value: -{
      -  "type": "string"
      -}
    • changedInput schema / properties / presenter_gaze / maxItems
      Previous value: -6New value: +20
    • 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[]."
    • removedInput schema / properties / presenter_place / additionalProperties
      Removed value: -{}
    • removedInput schema / properties / presenter_place / description
      Removed value: -"{face_height,face_centre:[x,y]} in frame shares; needs actor_id."
    • removedInput schema / properties / presenter_place / propertyNames
      Removed value: -{
      -  "type": "string"
      -}
    • addedInput schema / properties / product_asset_id
      Added value: +{
      +  "$ref": "#/$defs/d5"
      +}
    • removedInput schema / properties / resolution / description
      Removed value: -"Output resolution: 720p | 1080p | 4k (short side 720 / 1080 / 2160 px). Omitted means 1080p."
    • changedInput schema / properties / resolution / enum
      Previous value: -[
      -  "720p",
      -  "1080p",
      -  "4k"
      -]New value: +[
      +  "720p",
      +  "1080p"
      +]
    • addedInput schema / properties / scenes
      Added value: +{
      +  "description": "25 credits per scene, charged only for scenes drawn in the delivered video. Needs script and long-form qualification.",
      +  "items": {
      +    "properties": {
      +      "anchor": {
      +        "$ref": "#/$defs/d0"
      +      },
      +      "brief": {
      +        "maxLength": 2000,
      +        "minLength": 1,
      +        "pattern": "^[^\\p{Cc}]+$",
      +        "type": "string"
      +      },
      +      "colors": {
      +        "items": {
      +          "pattern": "^#[0-9a-fA-F]{6}$",
      +          "type": "string"
      +        },
      +        "maxItems": 4,
      +        "minItems": 1,
      +        "type": "array"
      +      },
      +      "cover_words": {
      +        "$ref": "#/$defs/d2"
      +      },
      +      "id": {
      +        "$ref": "#/$defs/d1"
      +      },
      +      "placement": {
      +        "default": "over",
      +        "enum": [
      +          "over",
      +          "full"
      +        ],
      +        "type": "string"
      +      },
      +      "text": {
      +        "maxLength": 200,
      +        "minLength": 1,
      +        "pattern": "^[^\\p{Cc}]+$",
      +        "type": "string"
      +      }
      +    },
      +    "required": [
      +      "id",
      +      "anchor",
      +      "brief"
      +    ],
      +    "type": "object"
      +  },
      +  "maxItems": 12,
      +  "minItems": 1,
      +  "type": "array"
      +}
    • 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_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 them. 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. Spaces, audio tags and stress marks count."
    • 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 / properties / duration_seconds / description
      Removed value: -"Required for an image segment;"
    • changedInput schema / properties / segments / items / properties / image_motion / $ref
      Previous value: -"#/$defs/d4"New value: +"#/$defs/d3"
    • addedInput schema / properties / segments / items / properties / media_type / $ref
      Added value: +"#/$defs/d6"
    • removedInput schema / properties / segments / items / properties / media_type / description
      Removed value: -"Explicit media source type;"
    • removedInput schema / properties / segments / items / properties / media_type / enum
      Removed value: -[
      -  "image",
      -  "video"
      -]
    • removedInput schema / properties / segments / items / properties / media_type / type
      Removed value: -"string"
    • addedInput schema / properties / segments / items / properties / script / $ref
      Added value: +"#/$defs/d9"
    • removedInput schema / properties / segments / items / properties / script / maxLength
      Removed value: -10000
    • removedInput schema / properties / segments / items / properties / script / minLength
      Removed value: -1
    • removedInput schema / properties / segments / items / properties / script / type
      Removed value: -"string"
    • changedInput schema / properties / segments / maxItems
      Previous value: -5New value: +20
    • addedInput schema / properties / shots
      Added value: +{
      +  "description": "Live shots of the actor on script words, no overlaps; 9:16, long-form qualification. Acting shots: wide or full, a cast from pictures. Each kind has its presenter-second price in list_prices.",
      +  "items": {
      +    "type": "object"
      +  },
      +  "maxItems": 16,
      +  "minItems": 1,
      +  "type": "array"
      +}
    • changedInput schema / properties / template_sounds / anyOf
      Previous value: -[
      -  {
      -    "const": false,
      -    "type": "boolean"
      -  },
      -  {
      -    "additionalProperties": {
      -      "type": "string"
      -    },
      -    "propertyNames": {
      -      "type": "string"
      -    },
      -    "type": "object"
      -  }
      -]New value: +[
      +  {
      +    "const": false,
      +    "type": "boolean"
      +  },
      +  {
      +    "additionalProperties": {
      +      "type": "string"
      +    },
      +    "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 / 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 / accent / description
      Removed value: -"#RRGGBB in place of the preset's accent: the pills' fill…"
    • removedInput schema / properties / template_theme / properties / preset / description
      Removed value: -"clean_light (light cards on our blue gradient), bold_dark…"
    • 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: 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."New value: +"Price unchanged, a covered presenter still billed. Kinds: tag, lower_third, end_card, title_card, quote, stat, callout, checklist, phone_call, compare, notification, progress, rating, chat_window, video_grid, word_title, phone_screen, terminal, pointer_chips, chart, race, hand_title, word_fill. Data and limits per kind: describe_tool."
    • removedInput schema / properties / templates / items / properties / data / additionalProperties
      Removed value: -{}
    • removedInput schema / properties / templates / items / properties / data / description
      Removed value: -"The kind's fields, as its catalog line in templates names…"
    • removedInput schema / properties / templates / items / properties / data / propertyNames
      Removed value: -{
      -  "type": "string"
      -}
    • addedInput schema / properties / templates / items / properties / id / $ref
      Added value: +"#/$defs/d1"
    • removedInput schema / properties / templates / items / properties / id / description
      Removed value: -"Unique across inserts, overlays, layout_windows and…"
    • removedInput schema / properties / templates / items / properties / id / pattern
      Removed value: -"^[a-zA-Z0-9][a-zA-Z0-9_-]{0,63}$"
    • removedInput schema / properties / templates / items / properties / id / type
      Removed value: -"string"
    • changedInput schema / properties / templates / items / properties / kind / enum
      Previous value: -[
      -  "tag",
      -  "lower_third",
      -  "end_card",
      -  "title_card",
      -  "quote",
      -  "stat",
      -  "callout",
      -  "checklist",
      -  "phone_call",
      -  "compare",
      -  "notification",
      -  "progress",
      -  "rating"
      -]New value: +[
      +  "tag",
      +  "lower_third",
      +  "end_card",
      +  "title_card",
      +  "quote",
      +  "stat",
      +  "callout",
      +  "checklist",
      +  "phone_call",
      +  "compare",
      +  "notification",
      +  "progress",
      +  "rating",
      +  "chat_window",
      +  "video_grid",
      +  "word_title",
      +  "phone_screen",
      +  "terminal",
      +  "pointer_chips",
      +  "chart",
      +  "race",
      +  "hand_title",
      +  "word_fill"
      +]
    • removedInput schema / properties / templates / items / properties / place / additionalProperties
      Removed value: -{}
    • removedInput schema / properties / templates / items / properties / place / description
      Removed value: -"Over placement only: a box as an overlay's place (not by…"
    • removedInput schema / properties / templates / items / properties / place / propertyNames
      Removed value: -{
      -  "type": "string"
      -}
    • removedInput schema / properties / templates / items / properties / placement / description
      Removed value: -"over (drawn over the presenter) or full (fills the frame);"
    • removedInput schema / properties / templates / items / properties / transition / description
      Removed value: -"Full placement only, as an insert's transition."
    • changedInput schema / properties / templates / maxItems
      Previous value: -12New value: +40
    • 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): 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."New value: +"Speech model; omitted, the voice's own. gemini-3.8-flash-tts speaks only its own voices and refuses voice_id, captions, segments and inserts before any charge."
    • 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."
    • changedInput schema / properties / voice / description
      Previous 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."New value: +"A list_voices name (presets sarah | george | eric | daria_ru_female); another is refused before any charge. Omitted: the actor's gender default."
    • 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. Refused with tts_model=gemini-3.8-flash-tts. Mutually exclusive with voice."New value: +"Raw vendor voice id outside the catalog; an unknown id fails the run, not the request."
    • 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[]."
  2. Changed147 schema fields changedv0.39.0
    • addedInput schema / $defs
      Added value: +{
      +  "d0": {
      +    "anyOf": [
      +      {
      +        "$ref": "#/$defs/d6"
      +      },
      +      {
      +        "$ref": "#/$defs/d7"
      +      }
      +    ],
      +    "description": "The words it starts on, as an insert anchor: { startWord,…"
      +  },
      +  "d1": {
      +    "description": "Public https URL of the media.",
      +    "format": "starts_with",
      +    "maxLength": 2048,
      +    "pattern": "^https:\\/\\/.*",
      +    "type": "string"
      +  },
      +  "d10": {
      +    "maximum": 2,
      +    "minimum": 0.05,
      +    "type": "number"
      +  },
      +  "d2": {
      +    "description": "How many spoken words it stays on screen, counted from the…",
      +    "exclusiveMinimum": 0,
      +    "maximum": 10000,
      +    "type": "integer"
      +  },
      +  "d3": {
      +    "description": "A ready PNG or JPEG image or MP4 video from your own assets…",
      +    "pattern": "^ast_[a-f0-9]{32}$",
      +    "type": "string"
      +  },
      +  "d4": {
      +    "description": "Optional picture zoom.",
      +    "properties": {
      +      "amount": {
      +        "exclusiveMaximum": 1,
      +        "minimum": 0,
      +        "type": "number"
      +      },
      +      "direction": {
      +        "enum": [
      +          "in",
      +          "out"
      +        ],
      +        "type": "string"
      +      }
      +    },
      +    "required": [
      +      "direction",
      +      "amount"
      +    ],
      +    "type": "object"
      +  },
      +  "d5": {
      +    "description": "image (PNG or JPEG) or video (MP4, H.264 or HEVC, 8-bit…",
      +    "enum": [
      +      "image",
      +      "video"
      +    ],
      +    "type": "string"
      +  },
      +  "d6": {
      +    "properties": {
      +      "endWord": {
      +        "exclusiveMinimum": 0,
      +        "type": "integer"
      +      },
      +      "startWord": {
      +        "minimum": 0,
      +        "type": "integer"
      +      }
      +    },
      +    "required": [
      +      "startWord",
      +      "endWord"
      +    ],
      +    "type": "object"
      +  },
      +  "d7": {
      +    "properties": {
      +      "occurrence": {
      +        "minimum": 0,
      +        "type": "integer"
      +      },
      +      "quote": {
      +        "maxLength": 10000,
      +        "minLength": 1,
      +        "type": "string"
      +      }
      +    },
      +    "required": [
      +      "quote"
      +    ],
      +    "type": "object"
      +  },
      +  "d8": {
      +    "description": "How it appears: cut (default), fade, slide (in from the…",
      +    "enum": [
      +      "cut",
      +      "fade",
      +      "slide",
      +      "tilt_in",
      +      "pop",
      +      "scale_up"
      +    ],
      +    "type": "string"
      +  },
      +  "d9": {
      +    "description": "Unique across inserts, overlays and layout_windows.",
      +    "pattern": "^[a-zA-Z0-9][a-zA-Z0-9_-]{0,63}$",
      +    "type": "string"
      +  }
      +}
    • removedInput schema / $schema
      Removed value: -"http://json-schema.org/draft-07/schema#"
    • addedInput schema / additionalProperties
      Added value: +false
    • 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: +[
      +  {
      +    "maxLength": 40,
      +    "minLength": 1,
      +    "type": "string"
      +  },
      +  {
      +    "properties": {
      +      "look": {
      +        "enum": [
      +          "punch",
      +          "pill",
      +          "color"
      +        ],
      +        "type": "string"
      +      },
      +      "punch_in": {
      +        "description": "Long form only: zoom into the presenter while the quote is…",
      +        "type": "boolean"
      +      },
      +      "quote": {
      +        "maxLength": 40,
      +        "minLength": 1,
      +        "type": "string"
      +      }
      +    },
      +    "required": [
      +      "quote"
      +    ],
      +    "type": "object"
      +  }
      +]
    • addedInput schema / properties / caption_place
      Added value: +{
      +  "additionalProperties": {},
      +  "description": "Pinned captions instead of caption_position: {relative_to:frame|face,y,edge?:top|center|bottom,max_width?}; y is a frame share, or face heights from the face centre.",
      +  "propertyNames": {
      +    "type": "string"
      +  },
      +  "type": "object"
      +}
    • addedInput schema / properties / end_hold_s
      Added value: +{
      +  "description": "Seconds the last frame stays after the last word: the presenter freezes and every layer on screen then stays. Production seconds, not presenter seconds. Needs script and long-form qualification.",
      +  "maximum": 5,
      +  "minimum": 0.2,
      +  "type": "number"
      +}
    • removedInput schema / properties / framing / items / additionalProperties
      Removed value: -false
    • addedInput schema / properties / framing / items / properties / anchor / $ref
      Added value: +"#/$defs/d0"
    • removedInput schema / properties / framing / items / properties / anchor / anyOf
      Removed value: -[
      -  {
      -    "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"
      -  }
      -]
    • removedInput schema / properties / framing / items / properties / anchor / description
      Removed value: -"The words it starts on, as an insert anchor: { startWord, endWord } or { quote, occurrence? }."
    • changedInput schema / properties / framing / items / properties / cover_words / description
      Previous value: -"How many spoken words the size holds, counted from the first word of its anchor. Omitted means the anchored words only."New value: +"How many spoken words the size holds, counted from the…"
    • changedInput schema / properties / framing / items / properties / id / description
      Previous value: -"Unique across inserts, overlays, layout_windows, templates and framing."New value: +"Unique across inserts, overlays, layout_windows, templates…"
    • changedInput schema / properties / framing / items / properties / size / description
      Previous value: -"close: the presenter 1.18 times larger about the face; medium: the take as rendered."New value: +"close: the presenter 1.18 times larger about the face;"
    • changedInput schema / properties / framing / items / properties / transition / description
      Previous value: -"cut: a hard cut to the size; flash: a warm light leak over the cut."New value: +"cut: a hard cut to the size;"
    • removedInput schema / properties / inserts / items / additionalProperties
      Removed value: -false
    • changedInput schema / properties / inserts / items / properties / anchor / anyOf
      Previous value: -[
      -  {
      -    "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"
      -  }
      -]New value: +[
      +  {
      +    "$ref": "#/$defs/d6"
      +  },
      +  {
      +    "$ref": "#/$defs/d7"
      +  }
      +]
    • addedInput schema / properties / inserts / items / properties / asset_id / $ref
      Added value: +"#/$defs/d3"
    • removedInput schema / properties / inserts / items / properties / asset_id / description
      Removed value: -"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."
    • removedInput schema / properties / inserts / items / properties / asset_id / pattern
      Removed value: -"^ast_[a-f0-9]{32}$"
    • removedInput schema / properties / inserts / items / properties / asset_id / type
      Removed value: -"string"
    • changedInput schema / properties / inserts / items / properties / cover_words / description
      Previous value: -"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."New value: +"How many spoken words this insert covers, counted from the…"
    • addedInput schema / properties / inserts / items / properties / image_motion / $ref
      Added value: +"#/$defs/d4"
    • removedInput schema / properties / inserts / items / properties / image_motion / additionalProperties
      Removed value: -false
    • removedInput schema / properties / inserts / items / properties / image_motion / description
      Removed 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."
    • removedInput schema / properties / inserts / items / properties / image_motion / properties
      Removed value: -{
      -  "amount": {
      -    "exclusiveMaximum": 1,
      -    "minimum": 0,
      -    "type": "number"
      -  },
      -  "direction": {
      -    "enum": [
      -      "in",
      -      "out"
      -    ],
      -    "type": "string"
      -  }
      -}
    • removedInput schema / properties / inserts / items / properties / image_motion / required
      Removed value: -[
      -  "direction",
      -  "amount"
      -]
    • removedInput schema / properties / inserts / items / properties / image_motion / type
      Removed value: -"object"
    • addedInput schema / properties / inserts / items / properties / media_type / $ref
      Added value: +"#/$defs/d5"
    • removedInput schema / properties / inserts / items / properties / media_type / description
      Removed 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."
    • removedInput schema / properties / inserts / items / properties / media_type / enum
      Removed value: -[
      -  "image",
      -  "video"
      -]
    • removedInput schema / properties / inserts / items / properties / media_type / type
      Removed value: -"string"
    • addedInput schema / properties / inserts / items / properties / media_url / $ref
      Added value: +"#/$defs/d1"
    • removedInput schema / properties / inserts / items / properties / media_url / description
      Removed value: -"Public https URL of the media. Pass exactly one of media_url or asset_id."
    • removedInput schema / properties / inserts / items / properties / media_url / format
      Removed value: -"starts_with"
    • removedInput schema / properties / inserts / items / properties / media_url / maxLength
      Removed value: -2048
    • removedInput schema / properties / inserts / items / properties / media_url / pattern
      Removed value: -"^https:\\/\\/.*"
    • removedInput schema / properties / inserts / items / properties / media_url / type
      Removed value: -"string"
    • changedInput schema / properties / inserts / items / properties / transition / description
      Previous value: -"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."New value: +"How the insert comes in and goes out: cut (default), wipe…"
    • addedInput schema / properties / interview
      Added value: +{
      +  "additionalProperties": {},
      +  "description": "Off-screen speaker: { turns: [{ anchor: { quote }, cover_words? }] (words of script they say), off_screen?: { voice?, caption?: { style?, place? } }, gaze?: camera|left|right }. The presenter answers and holds still while they talk.",
      +  "propertyNames": {
      +    "type": "string"
      +  },
      +  "type": "object"
      +}
    • removedInput schema / properties / layout_windows / items / additionalProperties
      Removed value: -false
    • addedInput schema / properties / layout_windows / items / properties / anchor / $ref
      Added value: +"#/$defs/d0"
    • removedInput schema / properties / layout_windows / items / properties / anchor / anyOf
      Removed value: -[
      -  {
      -    "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"
      -  }
      -]
    • removedInput schema / properties / layout_windows / items / properties / anchor / description
      Removed value: -"The words it starts on, as an insert anchor: { startWord, endWord } or { quote, occurrence? }."
    • addedInput schema / properties / layout_windows / items / properties / asset_id / $ref
      Added value: +"#/$defs/d3"
    • removedInput schema / properties / layout_windows / items / properties / asset_id / description
      Removed value: -"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."
    • removedInput schema / properties / layout_windows / items / properties / asset_id / pattern
      Removed value: -"^ast_[a-f0-9]{32}$"
    • removedInput schema / properties / layout_windows / items / properties / asset_id / type
      Removed value: -"string"
    • addedInput schema / properties / layout_windows / items / properties / cover_words / $ref
      Added value: +"#/$defs/d2"
    • removedInput schema / properties / layout_windows / items / properties / cover_words / description
      Removed value: -"How many spoken words it stays on screen, counted from the first word of its anchor. Omitted means the anchored words only."
    • removedInput schema / properties / layout_windows / items / properties / cover_words / exclusiveMinimum
      Removed value: -0
    • removedInput schema / properties / layout_windows / items / properties / cover_words / maximum
      Removed value: -10000
    • removedInput schema / properties / layout_windows / items / properties / cover_words / type
      Removed value: -"integer"
    • addedInput schema / properties / layout_windows / items / properties / enter / $ref
      Added value: +"#/$defs/d8"
    • removedInput schema / properties / layout_windows / items / properties / enter / description
      Removed value: -"How it appears: cut (default), fade, slide (in from the nearest edge) or tilt_in. It leaves with a cut."
    • removedInput schema / properties / layout_windows / items / properties / enter / enum
      Removed value: -[
      -  "cut",
      -  "fade",
      -  "slide",
      -  "tilt_in"
      -]
    • removedInput schema / properties / layout_windows / items / properties / enter / type
      Removed value: -"string"
    • addedInput schema / properties / layout_windows / items / properties / id / $ref
      Added value: +"#/$defs/d9"
    • removedInput schema / properties / layout_windows / items / properties / id / description
      Removed value: -"Unique across inserts, overlays and layout_windows."
    • removedInput schema / properties / layout_windows / items / properties / id / pattern
      Removed value: -"^[a-zA-Z0-9][a-zA-Z0-9_-]{0,63}$"
    • removedInput schema / properties / layout_windows / items / properties / id / type
      Removed value: -"string"
    • changedInput schema / properties / layout_windows / items / properties / layout / description
      Previous value: -"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."New value: +"split: presenter in the top half, media in the bottom half,…"
    • addedInput schema / properties / layout_windows / items / properties / media_type / $ref
      Added value: +"#/$defs/d5"
    • removedInput schema / properties / layout_windows / items / properties / media_type / description
      Removed 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."
    • removedInput schema / properties / layout_windows / items / properties / media_type / enum
      Removed value: -[
      -  "image",
      -  "video"
      -]
    • removedInput schema / properties / layout_windows / items / properties / media_type / type
      Removed value: -"string"
    • addedInput schema / properties / layout_windows / items / properties / media_url / $ref
      Added value: +"#/$defs/d1"
    • removedInput schema / properties / layout_windows / items / properties / media_url / description
      Removed value: -"Public https URL of the media. Pass exactly one of media_url or asset_id."
    • removedInput schema / properties / layout_windows / items / properties / media_url / format
      Removed value: -"starts_with"
    • removedInput schema / properties / layout_windows / items / properties / media_url / maxLength
      Removed value: -2048
    • removedInput schema / properties / layout_windows / items / properties / media_url / pattern
      Removed value: -"^https:\\/\\/.*"
    • removedInput schema / properties / layout_windows / items / properties / media_url / type
      Removed value: -"string"
    • changedInput schema / properties / overlays / description
      Previous 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."New value: +"Text-anchored images or videos over the visible presenter, each at one position or place. At most 2 on screen at once, on boxes that do not overlap. Captions move to the middle or bottom third off an overlay, never over the face, and hide while neither is free. Hidden under full-frame inserts. 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 / additionalProperties
      Removed value: -false
    • addedInput schema / properties / overlays / items / properties / anchor / $ref
      Added value: +"#/$defs/d0"
    • removedInput schema / properties / overlays / items / properties / anchor / anyOf
      Removed value: -[
      -  {
      -    "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"
      -  }
      -]
    • removedInput schema / properties / overlays / items / properties / anchor / description
      Removed value: -"The words it starts on, as an insert anchor: { startWord, endWord } or { quote, occurrence? }."
    • addedInput schema / properties / overlays / items / properties / asset_id / $ref
      Added value: +"#/$defs/d3"
    • removedInput schema / properties / overlays / items / properties / asset_id / description
      Removed value: -"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."
    • removedInput schema / properties / overlays / items / properties / asset_id / pattern
      Removed value: -"^ast_[a-f0-9]{32}$"
    • removedInput schema / properties / overlays / items / properties / asset_id / type
      Removed value: -"string"
    • addedInput schema / properties / overlays / items / properties / cover_words / $ref
      Added value: +"#/$defs/d2"
    • removedInput schema / properties / overlays / items / properties / cover_words / description
      Removed value: -"How many spoken words it stays on screen, counted from the first word of its anchor. Omitted means the anchored words only."
    • removedInput schema / properties / overlays / items / properties / cover_words / exclusiveMinimum
      Removed value: -0
    • removedInput schema / properties / overlays / items / properties / cover_words / maximum
      Removed value: -10000
    • removedInput schema / properties / overlays / items / properties / cover_words / type
      Removed value: -"integer"
    • addedInput schema / properties / overlays / items / properties / enter / $ref
      Added value: +"#/$defs/d8"
    • removedInput schema / properties / overlays / items / properties / enter / description
      Removed value: -"How it appears: cut (default), fade, slide (in from the nearest edge) or tilt_in. It leaves with a cut."
    • removedInput schema / properties / overlays / items / properties / enter / enum
      Removed value: -[
      -  "cut",
      -  "fade",
      -  "slide",
      -  "tilt_in"
      -]
    • removedInput schema / properties / overlays / items / properties / enter / type
      Removed value: -"string"
    • addedInput schema / properties / overlays / items / properties / enter_duration_s
      Added value: +{
      +  "description": "Default 0.32.",
      +  "maximum": 1.5,
      +  "minimum": 0.05,
      +  "type": "number"
      +}
    • addedInput schema / properties / overlays / items / properties / enter_offset_s
      Added value: +{
      +  "description": "Seconds from its first word, negative before;",
      +  "maximum": 0.5,
      +  "minimum": -0.5,
      +  "type": "number"
      +}
    • addedInput schema / properties / overlays / items / properties / exit
      Added value: +{
      +  "description": "How it leaves: cut (default), fade, pop_out or slide.",
      +  "enum": [
      +    "cut",
      +    "fade",
      +    "pop_out",
      +    "slide"
      +  ],
      +  "type": "string"
      +}
    • addedInput schema / properties / overlays / items / properties / id / $ref
      Added value: +"#/$defs/d9"
    • removedInput schema / properties / overlays / items / properties / id / description
      Removed value: -"Unique across inserts, overlays and layout_windows."
    • removedInput schema / properties / overlays / items / properties / id / pattern
      Removed value: -"^[a-zA-Z0-9][a-zA-Z0-9_-]{0,63}$"
    • removedInput schema / properties / overlays / items / properties / id / type
      Removed value: -"string"
    • addedInput schema / properties / overlays / items / properties / media_type / $ref
      Added value: +"#/$defs/d5"
    • removedInput schema / properties / overlays / items / properties / media_type / description
      Removed 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."
    • removedInput schema / properties / overlays / items / properties / media_type / enum
      Removed value: -[
      -  "image",
      -  "video"
      -]
    • removedInput schema / properties / overlays / items / properties / media_type / type
      Removed value: -"string"
    • addedInput schema / properties / overlays / items / properties / media_url / $ref
      Added value: +"#/$defs/d1"
    • removedInput schema / properties / overlays / items / properties / media_url / description
      Removed value: -"Public https URL of the media. Pass exactly one of media_url or asset_id."
    • removedInput schema / properties / overlays / items / properties / media_url / format
      Removed value: -"starts_with"
    • removedInput schema / properties / overlays / items / properties / media_url / maxLength
      Removed value: -2048
    • removedInput schema / properties / overlays / items / properties / media_url / pattern
      Removed value: -"^https:\\/\\/.*"
    • removedInput schema / properties / overlays / items / properties / media_url / type
      Removed value: -"string"
    • addedInput schema / properties / overlays / items / properties / place
      Added value: +{
      +  "additionalProperties": {},
      +  "description": "Instead of position, a pinned box:…",
      +  "propertyNames": {
      +    "type": "string"
      +  },
      +  "type": "object"
      +}
    • changedInput schema / properties / overlays / items / properties / position / description
      Previous value: -"A corner (top_left, top_right, bottom_left, bottom_right), or a band across the top or bottom."New value: +"A corner (top_left, top_right, bottom_left, bottom_right),…"
    • changedInput schema / properties / overlays / items / required
      Previous value: -[
      -  "id",
      -  "media_type",
      -  "anchor",
      -  "position"
      -]New value: +[
      +  "id",
      +  "media_type",
      +  "anchor"
      +]
    • removedInput schema / properties / pause_trim / additionalProperties
      Removed value: -false
    • addedInput schema / properties / pause_trim / properties / comma_s / $ref
      Added value: +"#/$defs/d10"
    • removedInput schema / properties / pause_trim / properties / comma_s / maximum
      Removed value: -2
    • removedInput schema / properties / pause_trim / properties / comma_s / minimum
      Removed value: -0.05
    • removedInput schema / properties / pause_trim / properties / comma_s / type
      Removed value: -"number"
    • addedInput schema / properties / pause_trim / properties / mid_phrase_s / $ref
      Added value: +"#/$defs/d10"
    • removedInput schema / properties / pause_trim / properties / mid_phrase_s / maximum
      Removed value: -2
    • removedInput schema / properties / pause_trim / properties / mid_phrase_s / minimum
      Removed value: -0.05
    • removedInput schema / properties / pause_trim / properties / mid_phrase_s / type
      Removed value: -"number"
    • addedInput schema / properties / pause_trim / properties / sentence_end_s / $ref
      Added value: +"#/$defs/d10"
    • removedInput schema / properties / pause_trim / properties / sentence_end_s / maximum
      Removed value: -2
    • removedInput schema / properties / pause_trim / properties / sentence_end_s / minimum
      Removed value: -0.05
    • removedInput schema / properties / pause_trim / properties / sentence_end_s / type
      Removed value: -"number"
    • addedInput schema / properties / presenter_gaze
      Added value: +{
      +  "description": "[{ anchor: { quote }, cover_words?, gaze: camera|left|right }]. Where the presenter looks on these words, as the viewer sees it: camera, left or right. Needs actor_id with that view (list_actors); a change of gaze is a cut.",
      +  "items": {
      +    "additionalProperties": {},
      +    "propertyNames": {
      +      "type": "string"
      +    },
      +    "type": "object"
      +  },
      +  "maxItems": 6,
      +  "minItems": 1,
      +  "type": "array"
      +}
    • addedInput schema / properties / presenter_place
      Added value: +{
      +  "additionalProperties": {},
      +  "description": "{face_height,face_centre:[x,y]} in frame shares; needs actor_id.",
      +  "propertyNames": {
      +    "type": "string"
      +  },
      +  "type": "object"
      +}
    • changedInput schema / properties / segments / items / properties / duration_seconds / description
      Previous value: -"Required for an image segment; its display duration in seconds. Not accepted for actor or video segments."New value: +"Required for an image segment;"
    • addedInput schema / properties / segments / items / properties / image_motion / $ref
      Added value: +"#/$defs/d4"
    • removedInput schema / properties / segments / items / properties / image_motion / description
      Removed 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."
    • removedInput schema / properties / segments / items / properties / image_motion / properties
      Removed value: -{
      -  "amount": {
      -    "exclusiveMaximum": 1,
      -    "minimum": 0,
      -    "type": "number"
      -  },
      -  "direction": {
      -    "enum": [
      -      "in",
      -      "out"
      -    ],
      -    "type": "string"
      -  }
      -}
    • removedInput schema / properties / segments / items / properties / image_motion / required
      Removed value: -[
      -  "direction",
      -  "amount"
      -]
    • removedInput schema / properties / segments / items / properties / image_motion / type
      Removed value: -"object"
    • changedInput schema / properties / segments / items / properties / media_type / description
      Previous value: -"Explicit media source type; omission means video, regardless of URL suffix. Availability follows the segments field."New value: +"Explicit media source type;"
    • removedInput schema / properties / template_theme / additionalProperties
      Removed value: -false
    • changedInput schema / properties / template_theme / properties / accent / description
      Previous value: -"#RRGGBB in place of the preset's accent: the pills' fill and the accent text. Refused below 3:1 against the colours it meets."New value: +"#RRGGBB in place of the preset's accent: the pills' fill…"
    • changedInput schema / properties / template_theme / properties / preset / description
      Previous value: -"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."New value: +"clean_light (light cards on our blue gradient), bold_dark…"
    • removedInput schema / properties / templates / items / additionalProperties
      Removed value: -false
    • addedInput schema / properties / templates / items / properties / anchor / $ref
      Added value: +"#/$defs/d0"
    • removedInput schema / properties / templates / items / properties / anchor / anyOf
      Removed value: -[
      -  {
      -    "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"
      -  }
      -]
    • removedInput schema / properties / templates / items / properties / anchor / description
      Removed value: -"The words it starts on, as an insert anchor: { startWord, endWord } or { quote, occurrence? }."
    • addedInput schema / properties / templates / items / properties / cover_words / $ref
      Added value: +"#/$defs/d2"
    • removedInput schema / properties / templates / items / properties / cover_words / description
      Removed value: -"How many spoken words it stays on screen, counted from the first word of its anchor. Omitted means the anchored words only."
    • removedInput schema / properties / templates / items / properties / cover_words / exclusiveMinimum
      Removed value: -0
    • removedInput schema / properties / templates / items / properties / cover_words / maximum
      Removed value: -10000
    • removedInput schema / properties / templates / items / properties / cover_words / type
      Removed value: -"integer"
    • changedInput schema / properties / templates / items / properties / data / description
      Previous value: -"The kind's fields, as its catalog line in templates names them."New value: +"The kind's fields, as its catalog line in templates names…"
    • changedInput schema / properties / templates / items / properties / id / description
      Previous value: -"Unique across inserts, overlays, layout_windows and templates."New value: +"Unique across inserts, overlays, layout_windows and…"
    • addedInput schema / properties / templates / items / properties / place
      Added value: +{
      +  "additionalProperties": {},
      +  "description": "Over placement only: a box as an overlay's place (not by…",
      +  "propertyNames": {
      +    "type": "string"
      +  },
      +  "type": "object"
      +}
    • changedInput schema / properties / templates / items / properties / placement / description
      Previous value: -"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."New value: +"over (drawn over the presenter) or full (fills the frame);"
  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

A3.7/5.0
Behavior3/5

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

The 'WITHOUT spending credits' clause adds genuine value beyond the readOnlyHint=true/destructiveHint=false annotations by confirming no credits are consumed, and it is consistent with them. However, for a 46-parameter tool the description says nothing about whether the same argument set must mirror make_ugc, whether it validates and rejects, or what a quote response contains — gaps the annotations do not fill.

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

Conciseness5/5

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

A single front-loaded sentence with zero filler: the no-charge guarantee comes first and the call-site (before make_ugc) second. Every clause earns its place.

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

Completeness2/5

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

With 46 parameters, nested objects, no output schema and no documented return shape, the definition leaves the agent guessing whether the quote returns a single credit total or a per-component breakdown (music 60 credits, scenes 25 credits, presenter seconds, etc., which the schema hints at). For a tool this complex, a one-line description is under-specified on both inputs and outputs.

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 only 41% across 46 parameters, and several parameters are undocumented (e.g. call, interview, presenter_gaze, presenter_place, caption_place). The description adds no parameter meaning at all — it never says the arguments are the make_ugc arguments, which is the single most useful fact an agent needs to populate them correctly.

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

Purpose5/5

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

States a specific verb and object ('Estimate the credit cost of a make_ugc call') and names the exact sibling it precedes, so an agent can immediately tell it apart from make_ugc and from the other quote_* tools. Nothing about the core purpose is ambiguous.

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

Usage Guidelines4/5

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

Gives a clear when: before calling make_ugc, and an explicit directive to show the user the price first. It stops short of stating exclusions (e.g. that other quote_* tools cover video, image, faceless or revision work, or that repeat quoting is unnecessary), so it is clear context without full routing guidance.

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