Clipwright
Clipwright lets you plan, quote, generate, and revise short actor-led or faceless videos, plus manage the media and reference-analysis workflows around them.
List and read workflow methods and their availability.
Create, read, approve, quote, and run workflow plans without auto-spending.
Generate talking-actor UGC videos with scripts, actors/images, voices, captions, templates, inserts, overlays, and framing.
Generate faceless videos from scripts or briefs with narration, scene images, captions, and style/character references.
Quote paid operations first, then poll runs until completion.
Inspect run shots, quote and start revisions, and create shot candidates.
Analyze reference ads/reels into profiles, then compile reference-remake plans.
Generate images and silent video clips with model, aspect ratio, resolution, duration, and reference controls.
Upload images and manage assets: create, list, read, rename, and delete.
List voices, actors, template sounds, prices, and account credits.
Create and delete personal actors, and set actor B-roll defaults.
Send feedback about missing or confusing capabilities.
Provides an importable n8n workflow and hosted MCP server access through n8n's MCP Client node, enabling quote checks, render starts, and polling for Clipwright UGC video generation.
Clipwright clients
Open-source clients for Clipwright: an API that turns a script into a short video of an actor speaking it, or a script or a short brief into a faceless video without an on-camera presenter: narration over an opening animated clip and image scenes, ending with the narration (select 30–90 seconds; it runs 25 seconds or more, usually at most a quarter past the selection and 90; a longer narration runs to its end). Your agent quotes the price for free, starts the render, and gets a video URL back. Clipwright returns the file; it does not publish anywhere.
Package | What it is |
MCP server over stdio for Claude Code, Claude Desktop, Cursor, Cline and any other MCP host | |
command-line client ( | |
TypeScript client | |
shared request and response schemas (zod) |
Claude Code plugin
claude plugin marketplace add seocombat/clipwright-mcp
claude plugin install clipwright@clipwrightThe plugin connects the hosted server at https://mcp.clipwright.io/mcp and
adds a skill that tells the agent to quote before it spends credits. Run /mcp
in a session, choose clipwright and sign in with your Clipwright account: no
key goes into a config file. The same repository is a Cursor plugin
(.cursor-plugin/plugin.json, mcp.json).
Related MCP server: instantclips
n8n
n8n's built-in MCP Client node reaches the hosted server with a key; no community
node is needed. n8n/clipwright-ugc.json is a workflow
to import: it quotes a script, stops if the quote is above max_credits, starts
the render and polls get_run every 15 seconds until the run ends. The whole
workflow ran on n8n Cloud on 2026-10-20 and returned the MP4; n8n's OAuth
credential has not been tried with Clipwright yet. Setup:
packages/mcp-server/README.md.
MCP server in one line
claude mcp add clipwright -e CLIPWRIGHT_API_KEY=cw_... -- npx -y -p @clipwright/mcp-server clipwright-mcpPut your own key from app.clipwright.io/api-keys
in place of cw_.... It needs Node.js 20 or newer. Other hosts, the tool list and
the environment variables: packages/mcp-server/README.md.
Quotes, voices, actors and the balance are free. Renders spend credits: an account opened by signing up starts with 420 trial credits, enough for one 90-second faceless video. Buy more at clipwright.io/pricing.
Build from source
pnpm install
pnpm -r buildThis repository mirrors the client packages of the Clipwright monorepo; each release is synced here from there. Documentation: clipwright.io/docs. Privacy: clipwright.io/privacy.
MIT License — see LICENSE.
Available Tools
45 toolsanalyze_referenceAnalyse a reference adAIdempotentInspect
Read a reference ad into a reference_profile: its beats (role, timing as shares of the clip, whether the presenter speaks, listens or is off screen), the graphics in our template vocabulary, captions, pacing, palette and music. It keeps the reference's words: transcript (timed words), hook (the words of its first 3 s, through the end of that sentence), each beat's spoken_summary and each graphic's label_hint. What we cannot draw is in unmapped with a substitute and in warnings. Pass asset_id of an MP4 asset (create_asset with kind: "video"), at most 120 s and 100 MiB, or source_url: an Instagram reel or post link (instagram.com/reel/, /reels/, /p/) or a TikTok video link (tiktok.com/@/video/, vm.tiktok.com/). A link becomes an analysis-only asset of this account (asset_id in the answer) and the answer's source carries the post's views, likes, comments, views per hour, the author's median views around it and over their 12 latest reels, each with the ratio, the top comments and the code words commenters repeat; a number the platform did not give is null and named in warnings. A YouTube link is refused: upload its MP4 with create_asset. mode: "data" skips the vision pass and answers data instead of a profile: duration, size and fps, the timed transcript, the hook and a 3×3 frame sheet (a signed JPEG link), with source for a link as above; a reel with no speech gives an empty transcript and a warning. 70 credits for full, 10 for data, held at the start and charged once it succeeds; a failed analysis costs nothing. 10 new full and 60 new data analyses per hour per account. Answers at once with state queued; call get_reference_analysis every 10 seconds until succeeded (about a minute) or failed. The same asset, or the same reel by its full link, in the same mode returns the same analysis, free, unless it failed; a short vm.tiktok.com link always starts a new one. The asset is not changed. The profile names techniques; it copies no face, voice, music or brand of the reference. Price: 70 credits per call; data mode: 10 credits per call. Quote first with quote_analysis; list_prices names every price.
| Name | Required | Description | Default |
|---|---|---|---|
| mode | No | full (default, 70 credits): the reference_profile. data (10 credits): duration, size, timed transcript, hook and a 3×3 frame sheet, without the vision pass | |
| asset_id | No | asset_id of an MP4 asset of this account, at most 120 s and 100 MiB | |
| source_url | No | instead of asset_id: an Instagram reel or post link (instagram.com/reel/<code>, /reels/<code>, /p/<code>) or a TikTok video link (tiktok.com/@<user>/video/<id>, vm.tiktok.com/<code>); YouTube is refused |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations only mark it non-readonly and idempotent; the description goes far beyond by disclosing credit hold/charge semantics (70/10, failed analysis free), per-hour rate limits (10 full / 60 data), the async contract (answers 'queued', poll every 10 s, ~1 minute), and the caching rule including the vm.tiktok.com exception. It also states the asset itself is not mutated, which reconciles readOnlyHint=false with destructiveHint=false.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
It is front-loaded and dense with useful facts, but the pricing line is stated twice (mode description plus a closing 'Price: 70 credits per call; data mode: 10 credits per call'), and the source_url formats are repeated in the same sentence structure as the schema. The single block paragraph also makes it harder to scan than it needs to be.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a high-cost, async, quota-limited analysis tool with no output schema, the description supplies everything an agent needs: inputs and their limits, the async polling loop, cost and quota behavior, idempotency/caching rules, and what the answer contains in each mode. Nothing consequential about correct invocation is left unstated.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100%, so the baseline is 3, but the description adds genuine meaning beyond the schema: the 120 s / 100 MiB limits, the exact link shapes accepted, that a link becomes an analysis-only asset of this account with its asset_id returned, and what mode 'data' produces. Only marginal detail (e.g. that no parameter is required and the default is 'full') duplicates the schema.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
Opening sentence gives a specific verb and resource ('Read a reference ad into a reference_profile') and immediately enumerates the concrete contents of that profile (beats, graphics, captions, pacing, palette, music). It is clearly distinguishable from siblings like quote_analysis (pricing), get_reference_analysis (polling) and plan_reference_remake (downstream use).
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Explicitly names the alternative paths: use create_asset to upload a YouTube MP4 because a YouTube link is refused, quote_analysis to price first, and get_reference_analysis to poll. It also states which input to supply (asset_id vs source_url) and the two mode choices, with the credit cost of each.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
approve_workflow_planApprove a workflow revisionAInspect
Explicitly approve the chosen plan revision and content_digest. Free; it stores approval but starts no run. Read all issues and warnings first. Approval is separate from a quote and a paid launch.
| Name | Required | Description | Default |
|---|---|---|---|
| plan_id | Yes | ||
| revision | Yes | ||
| content_digest | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations only give the safety profile (readOnlyHint=false, destructiveHint=false), so the description carries the interesting load and does so: it discloses cost ('Free'), the exact side effect ('stores approval but starts no run'), and a prerequisite ('read all issues and warnings first'). It stops short of saying whether approval is idempotent or required before launch.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Four short sentences, front-loaded with the core action and each carrying a distinct fact (what it does, cost/side effect, precondition, non-scope). The telegraphic 'Free;' fragment is slightly choppy but nothing is wasted.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a 3-parameter mutation with no output schema and only safety annotations, the description supplies the key missing context: cost, absence of a run side effect, and the warning-review prerequisite. Missing only edge-case behavior (idempotency, failure modes, whether prior approval blocks re-approval).
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 0% for all three parameters, so the description must compensate. It names and couples two of them ('the chosen plan revision and content_digest'), implying the digest must correspond to the revision, but it never explains revision numbering, digest format/matching rules, or plan_id. Partial compensation only.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb (approve) and resource (the chosen plan revision + content_digest), and explicitly distinguishes itself from the quote and paid-launch operations that appear as siblings (quote_workflow_plan, run_workflow_plan). 'Explicitly approve' also clarifies this is a deliberate act, not an implicit side effect.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Gives a concrete precondition ('Read all issues and warnings first') and clarifies what this tool is NOT for ('separate from a quote and a paid launch'), which routes the agent away from quote/run siblings. It does not state the inverse case — e.g., when approval is unnecessary or how to undo it — so it falls short of full when/when-not guidance.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
create_actorCreate a personal actorAInspect
Create a personal actor for this account from words describing a fictional adult: a 9:16 portrait with exactly one face, plus the other requested formats edited from it. Returns a run_id immediately; poll get_run until 'succeeded' (created_actor.actor_id, then pass it as actor_id to make_ugc) or 'failed'. Each published image is charged at the price quote shows; refused descriptions and unusable portraits cost nothing. When generation is switched off the call fails with actor_generation_disabled. With from_actor_id it derives a new personal actor from a library or own actor: the same face (checked; a mismatch costs nothing), with framing wide, objects in holding or a new setting. A held object's picture is an image asset (upload, URL import or a found picture, rights_confirmed). Price: medium portrait: 4 credits per image; medium other format: 8 credits per image; high portrait: 12 credits per image; high other format: 18 credits per image. Quote first with quote_actor; list_prices names every price.
| Name | Required | Description | Default |
|---|---|---|---|
| name | Yes | Name shown in list_actors. | |
| gender | No | female | male. Fixes the actor's gender and the default voice of videos with this actor. Required unless from_actor_id is given. | |
| attempt | No | ||
| framing | No | wide: the camera further back, the head lower with room above; make_ugc then renders it as a wide view. | |
| holding | No | Up to 2 objects the presenter holds, one per hand. | |
| quality | No | Image quality: medium | high. Omitted means medium. The price per image depends on it; quote shows it before any charge. | medium |
| setting | No | The room or background to put the presenter in, in words. | |
| description | No | Words describing a fictional adult: appearance, clothing, setting. Naming a real person or a likeness to one is refused before any charge (actor_prompt_refused). Required unless from_actor_id is given. | |
| aspect_ratios | No | Formats to create: 9:16 | 1:1 | 16:9, always including 9:16. Omitted means all three. Formats that fail the identity check are not charged and are named in warnings. | |
| from_actor_id | No | Derive a new personal actor from this one (a library actor or your own): the same face, gender and age, with the view changed by framing, holding or setting. Omit description, gender and approximate_age. | |
| approximate_age | No | Approximate age in years, 18 to 90: actors are adults. Required unless from_actor_id is given. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Beyond the annotations, the description discloses asynchronous run behavior, immediate run_id return, polling semantics, billing per published image, no-charge conditions for refused descriptions and identity-check failures, generation-disabled errors, and the from_actor_id identity-check behavior.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The critical scope and workflow are front-loaded, and most clauses carry useful behavioral or billing information. However, the description is a dense semicolon chain that repeats pricing concepts already available via quote_actor and list_prices, reducing readability.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a complex asynchronous creation tool with no output schema, the description covers return handling, polling, billing, failure modes, derivation, and downstream use well. The main gap is that the attempt parameter's purpose is not explained anywhere, and some output details are left to get_run.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 91%, so the schema already documents nearly all parameters, including from_actor_id omissions, holding asset requirements, quality pricing dependency, and aspect ratio constraints. The description restates some of this context but adds little parameter-level meaning beyond the schema, and the attempt parameter remains undocumented.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description states a precise verb and resource: create a personal actor from a fictional-adult description, with a 9:16 portrait and additional formats. It also clearly distinguishes the derivation mode via from_actor_id and names make_ugc as the downstream consumer of the created actor_id.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
It gives explicit workflow guidance: quote first with quote_actor, call create_actor, poll get_run until succeeded or failed, then pass created_actor.actor_id to make_ugc. It also states the alternative derivation path when from_actor_id is supplied and names the disabled-generation failure condition.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
create_assetCreate an assetAInspect
Save a picture or a clip as an asset of this account, kept until you delete it: a character, location, style, prop or other, with a name. source is {run_id} of a succeeded generate_image or generate_video run of this account, {upload_id} of an upload from upload_image or create_upload, a public https {url} the server downloads (add kind: "video" for an MP4), {base64, media_type} of a PNG or JPEG up to 700000 bytes, or {put: {media_type, bytes, sha256}} to PUT a local file yourself: the answer carries upload.put_url and put_headers; run curl -X PUT -H 'content-type: <media_type>' --data-binary @<file> '<put_url>' within 15 minutes, then call get_asset. On a server running on your machine also {path} of a local PNG, JPEG or MP4. A clip is an MP4 in h264 or hevc, up to 120 seconds and 100 MB; a url clip or a PUT is checked in the background, so the answer says state: "processing" (or "awaiting_upload") and get_asset says ready or failed within minutes. For your own material (upload_id, url, base64, put, path) pass rights_confirmed: true, which states once that you may use the people and works in it. A reference you only want analysed, such as someone else's ad for analyze_reference, takes analysis_only: true instead: no rights claim, and no render or generation ever takes it. Use a picture's asset_id as {asset_id} in references, first_frame or last_frame of quote_image, generate_image, quote_video and generate_video; clips are kept for assembly and are no generation reference yet. Assets are free: creating, storing and using one spends no credits. An account keeps up to 2000 assets and 20 GB, and makes up to 100 new ones per day.
| Name | Required | Description | Default |
|---|---|---|---|
| name | Yes | ||
| role | Yes | ||
| source | Yes | ||
| analysis_only | No | Keep it for analyze_reference only, without rights_confirmed: it never reaches a render or a generation. | |
| rights_confirmed | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Goes well beyond the annotations by disclosing the 15-minute PUT window and required curl command, background verification states (processing, awaiting_upload, then ready/failed via get_asset), clip limits (120 seconds, 100 MB, h264/hevc), quota limits (2000 assets, 20 GB, 100/day), and the fact that assets are free. The readOnlyHint=false / destructiveHint=false annotations are consistent with a non-destructive create.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The purpose is front-loaded and every paragraph carries operational value. It is dense and somewhat run-on, especially the source enumeration, so it earns a 4 rather than a 5 for structure.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a complex five-parameter creation tool with no output schema, the description covers source options, rights behavior, asynchronous processing, follow-up calls, quota constraints, and downstream reference usage. Nothing an agent needs before invoking it appears to be missing.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is only 20%, but the description compensates by explaining every source variant in detail: run_id, upload_id, url plus kind, base64 plus media_type, put with media_type/bytes/sha256, and path. It also explains rights_confirmed and analysis_only, giving meaning the bare schema does not.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
Starts with a specific verb and resource: save a picture or clip as an account asset, kept until deleted. Enumerates the roles (character, location, style, prop, other) and distinguishes the tool from siblings such as analyze_reference, upload_image, create_upload, and get_asset.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Explicitly routes between source types: a succeeded generate_image/generate_video run_id, an upload_id from upload_image/create_upload, a public https URL, base64 bytes, a self-directed PUT, or a local path. It also states when to use rights_confirmed instead of analysis_only, and instructs the follow-up get_asset call after a PUT.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
create_candidateMake a shot candidateAInspect
Make a shot candidate of a run made by make_faceless (paid): a NEW run of skill edit_shot that generates one picture or clip for one shot, to keep or discard in a later revision. Call quote_candidate first and show the user the price. A delivered candidate is charged its one unit whether it is kept or discarded; one that fails is charged nothing. An identical request returns the same run it started before, so a call repeated after a lost answer starts nothing new; to make another candidate with the same request on purpose, pass take 2. An original has a limit on candidates running at once and on candidates failed or unfinished, apart from its revisions; a refusal names which. While shot candidates are closed it answers editing_disabled and charges nothing. The result is a new run: poll it with get_run; once it succeeded, its candidate.preview_url shows what was made. Price: picture: 7 credits per image; clip: 49 credits per clip; clip with a new picture: 56 credits per clip. Quote first with quote_candidate; list_prices names every price.
| Name | Required | Description | Default |
|---|---|---|---|
| take | No | Take number, 1 by default: the same request and take return the same run; take 2 makes another candidate. | |
| run_id | Yes | The faceless run whose shot the candidate is for: a succeeded original or revision. | |
| shot_id | Yes | The shot to make a candidate for, as get_run_shots names it. | |
| operation | Yes | What to generate: one of the operations get_run_shots lists for the shot. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
The description adds substantial behavior beyond the annotations: paid charging rules for kept, discarded, and failed candidates; idempotency by request and take; concurrency and failure limits; refusal behavior; and polling via get_run with candidate.preview_url. This is unusually complete for a paid mutation tool.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is front-loaded with the purpose and key charging rule, and most sentences carry operational information. It is somewhat long and repeats the quote_candidate instruction near the end, but the density is justified for a paid, stateful tool.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a paid mutation with no output schema, the description covers the essential context: cost, idempotency, refusal behavior, limits, polling, and where the resulting preview appears. An agent has enough information to invoke it correctly and set user expectations.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%, so the baseline is 3. The description adds useful pricing context for picture versus clip operations and clarifies the take idempotency rule, but it does not explain the distinct operation modes such as retake, new_picture, edit_picture, and animate beyond what the schema already provides.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description states a specific verb and resource: making a shot candidate for a run produced by make_faceless, implemented as a new edit_shot run. It clearly distinguishes this from revising an existing run by saying the candidate is kept or discarded in a later revision.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
It gives an explicit prerequisite to call quote_candidate first and show the user the price, and explains the take parameter for intentional repeats. It also states the editing_disabled refusal case, though it does not explicitly route users to revise_run instead when they want to modify an existing run rather than generate a candidate.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
create_uploadCreate a presigned uploadAInspect
Upload a LOCAL PNG or JPEG (up to 10 MB) through a one-time presigned PUT; use it when this server is remote and you have a shell. Pass media_type, the exact size in bytes and the file's sha256 (sha256sum <file> or shasum -a 256 <file>). Within 15 minutes run: curl -X PUT -H 'content-type: <media_type>' --data-binary @<file> '<put_url>' (curl sends the content-length itself; both headers must match what you declared). Once the PUT finished, the upload_id works as {upload_id, rights_confirmed: true} in quote_image, generate_image, quote_video and generate_video; before that they answer upload_not_finished. Call get_upload to confirm and to read content_digest, width and height; other tools that take an upload_id need that call first. Use the upload_id within 24 hours. Free; counts toward 20 uploads per day.
| Name | Required | Description | Default |
|---|---|---|---|
| bytes | Yes | Exact file size in bytes | |
| sha256 | Yes | Lowercase hex SHA-256 of the file | |
| filename | No | ||
| media_type | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Goes far beyond the readOnlyHint=false/destructiveHint=false annotations: one-time presigned PUT, a 15-minute window to complete the PUT, 24-hour upload_id validity, header/content-length must match what was declared, and a free tier capped at 20 uploads per day. It also discloses the pre-PUT failure mode ('before that they answer upload_not_finished').
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Front-loaded with the core action and its prerequisites; every sentence is operational rather than filler. The single dense paragraph packs many distinct obligations together, which is efficient but slightly harder to scan than a short structured list would be.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
No output schema exists, and the description conveys the useful return values contextually (put_url used in the curl command, upload_id used downstream) and directs the agent to get_upload for content_digest/width/height. It never explicitly states the create_upload response shape, which is the remaining gap.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
With 50% schema coverage, the description compensates by explaining how to produce sha256 (`sha256sum <file>` / `shasum -a 256 <file>`) and that the content-type header must match the declared media_type. It says nothing about the optional `filename` parameter, leaving that field undocumented in both places.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb and resource ('Upload a LOCAL PNG or JPEG ... through a one-time presigned PUT') with hard constraints (10 MB, PNG/JPEG). It also distinguishes the sibling path by scoping itself to 'when this server is remote and you have a shell', which separates it from the direct upload_image route.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Gives a clear selecting condition ('when this server is remote and you have a shell') and downstream sequencing ('Call get_upload to confirm ... other tools that take an upload_id need that call first'). The when-not side and the alternative tool name (upload_image) are only implied by contrast, not stated outright.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
delete_actorDelete a personal actorADestructiveInspect
Delete a personal actor of this account by actor_id. Videos already made with it stay as they are, and new runs can no longer use it. An actor used by a run that has not finished is refused until that run ends. Catalog actors belong to Clipwright and are not deletable.
| Name | Required | Description | Default |
|---|---|---|---|
| actor_id | Yes | Personal actor id from list_actors. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already flag the operation as destructive, but the description adds meaningful behavioral consequences beyond that: existing videos remain intact, new runs can no longer use the actor, and in-progress runs block deletion until completion. This substantially exceeds the annotation baseline.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Three sentences, all providing essential information: the action, the side effect on existing videos, and the blocking condition for ongoing runs. Nothing is wasted, and the most critical information is front-loaded.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a single-parameter destructive tool with no output schema, the description covers the deletion scope, persistent effects, failure condition, and non-deletable catalog actors. An agent has everything needed to invoke it safely and interpret outcomes.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%, with the only parameter clearly documented as 'Personal actor id from list_actors.' The description itself only restates 'by actor_id' without adding new semantic detail, so the baseline of 3 applies here.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description begins with a specific verb and resource: 'Delete a personal actor of this account by actor_id.' It clearly distinguishes personal actors from catalog actors and clarifies that catalog actors are not deletable, which differentiates this tool from any catalog-related operations.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description provides explicit when-to-use and when-not-to-use guidance: it applies only to personal actors ('Catalog actors belong to Clipwright and are not deletable'), and it states a temporal restriction ('An actor used by a run that has not finished is refused until that run ends'). This gives the agent clear conditions without needing to inspect siblings.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
delete_assetDelete an assetADestructiveInspect
Delete an asset by asset_id. It leaves the list at once and a new generation can no longer use it; its file is removed from our storage by a daily cleanup once 7 days have passed. Runs already made with it stay as they are. Free.
| Name | Required | Description | Default |
|---|---|---|---|
| asset_id | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Goes well beyond the destructiveHint=true annotation: it discloses immediate removal from listings, a 7-day deferred storage cleanup, that already-completed runs are unaffected, and that the operation is free. This is exactly the consequence detail an agent needs before a destructive call.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Four short clauses, each carrying a distinct load-bearing fact (timing, storage, run history, cost), with the primary effect front-loaded. No filler.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a destructive single-param tool with no output schema, the consequences of deletion are well covered. Minor gaps: whether errors occur for unknown/in-use asset_ids and whether the asset can be recovered during the 7-day window before cleanup.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 0%, so the description carries the burden, but it only says the asset is selected 'by asset_id' — no format or provenance guidance (the ast_ pattern lives only in the schema). Acceptable for a single obvious identifier, but it adds little meaning.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
Opens with a specific verb and resource ('Delete an asset by asset_id') and names the identifier. It is trivially distinguishable from get_asset, update_asset, list_assets and create_asset, so no further sibling differentiation is needed.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Usage is only implied: deletion is permanent removal, so an agent infers this is the terminal operation rather than update_asset. There is no explicit when-to-use/when-not, no mention of alternative ways to retire an asset, and no prerequisites (permissions, ownership) stated.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
generate_imageGenerate an imageAInspect
Generate one image from a prompt (paid): a NEW run of skill generate_image, charged the quoted credits per image once it is delivered. Call quote_image first and show the user the price. Poll the run with get_run; once it succeeded, generation.url is the image and its run_id can be a reference of a later generation. A reference is {upload_id, rights_confirmed: true} for a picture from upload_image or create_upload (rights_confirmed states you may use the people and works in it), {run_id} of a succeeded generate_image run of this account until its reusable_until, or {asset_id} of a picture asset from create_asset, whose rights were confirmed when it was made. A generation that fails is charged nothing. An identical request returns the same run it started before, so a call repeated after a lost answer starts nothing new; to make another one with the same request on purpose, pass attempt 2. While generations are closed it answers generations_disabled or generations_marking_pending and charges nothing. Price: seedream-5.0-flash: 3 credits per image; flare: 4 credits per image. Quote first with quote_image; list_prices names every price.
| Name | Required | Description | Default |
|---|---|---|---|
| model | Yes | ||
| prompt | Yes | ||
| attempt | No | ||
| references | No | ||
| aspect_ratio | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
While annotations only say non-read-only and non-destructive, the description adds billing semantics (charged per image only on delivery), failure behavior (charged nothing), idempotency (identical request returns the same run), and the closed-generations error codes. This is exactly the extra context annotations can't carry.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The purpose is front-loaded, but the body is a dense block of very long compound sentences and the quote-first instruction is duplicated ("Call quote_image first" then "Quote first with quote_image; list_prices names every price"). The information earns its place, but the packaging is heavier than needed.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a paid, asynchronous, multi-parameter tool with no output schema, the description covers everything an agent needs: pricing and quote flow, polling via get_run, where the artifact appears (generation.url), reference provenance and rights rules, idempotency, and error paths. No material gap remains.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
With 0% schema description coverage the description must compensate, and it does for the hard parameters: it enumerates per-model prices, spells out all three reference object shapes and rights_confirmed, and explains attempt. It says nothing about prompt or aspect_ratio beyond the enum values, which are self-evident, so only a small gap remains.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The opening sentence names a specific verb and resource ("Generate one image from a prompt") and immediately frames it as a paid, NEW run, distinguishing it from quote_image, revise_run, and generate_video in the sibling list. An agent knows exactly what gets created and what it costs.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
It gives an explicit prerequisite and ordering ("Call quote_image first and show the user the price"), a follow-up step ("Poll the run with get_run"), and names alternatives for references (upload_image, create_upload, create_asset). It even covers the repeat-call case with "pass attempt 2," leaving nothing to inference.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
generate_videoGenerate a clipAInspect
Generate one silent clip (paid): a NEW run of skill generate_video, charged unit_credits per second of duration_s once it is delivered. Modes: text; first_frame (first_frame, optional last_frame, of the requested aspect ratio within 2%); reference (1 to 4 references). Call quote_video first and show the user the price. Poll the run with get_run; once it succeeded, generation.url is the clip. A reference is {upload_id, rights_confirmed: true} for a picture from upload_image or create_upload (rights_confirmed states you may use the people and works in it), {run_id} of a succeeded generate_image run of this account until its reusable_until, or {asset_id} of a picture asset from create_asset, whose rights were confirmed when it was made. A generation that fails is charged nothing. An identical request returns the same run it started before, so a call repeated after a lost answer starts nothing new; to make another one with the same request on purpose, pass attempt 2. While generations are closed it answers generations_disabled or generations_marking_pending and charges nothing. Price: 3 to 90 credits per second of clip, by model and size. Quote first with quote_video; list_prices names every price.
| Name | Required | Description | Default |
|---|---|---|---|
| mode | Yes | ||
| model | Yes | ||
| camera | No | ||
| prompt | Yes | ||
| attempt | No | ||
| duration_s | Yes | ||
| last_frame | No | ||
| references | No | ||
| resolution | Yes | ||
| first_frame | No | ||
| aspect_ratio | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations only declare readOnlyHint=false/destructiveHint=false, and the description adds substantial context beyond that: per-second credit charging, failures charged nothing, idempotent replay of identical requests, and the generations_disabled/generations_marking_pending refusal states. The only gap is that it doesn't discuss async timing expectations beyond "poll", but pricing and failure semantics are unusually well disclosed for a write tool.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Purpose and cost are front-loaded in the first sentence, then modes, workflow and reference formats follow in logical order. It is dense but nearly every clause carries operational meaning; the only slack is the restatement of the price range/quote guidance at the end.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
With 11 parameters, no output schema, and nested reference objects, the description supplies the workflow (quote, generate, poll), the success path ("generation.url is the clip"), the failure path (no charge) and the dedup rule. Missing only guidance on choosing model/resolution/camera, which an agent would otherwise have to infer from list_prices and list_generation_models.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 0%, so the description carries the burden, and it explains the hardest parts: the three accepted reference shapes with rights_confirmed semantics, reusable_until for run_id references, and the 2% aspect-ratio tolerance for first_frame/last_frame. It also ties duration_s to billing and attempt to deduplication. It leaves model, resolution, aspect_ratio, camera and prompt uncharacterized, so it doesn't fully compensate.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb and resource ("Generate one silent clip") plus the charging unit, and names the siblings it interacts with (quote_video, get_run, list_prices). It also enumerates its three modes, so an agent can distinguish it from generate_image or quote_video without opening a schema.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Gives an explicit pre-call step ("Call quote_video first and show the user the price"), a post-call step ("Poll the run with get_run"), and a fallback (list_prices names every price). It also states how to force a duplicate (pass attempt 2), which is exactly when-to-use-this-vs-what guidance.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
get_accountGet account creditsARead-onlyInspect
Read this account's credits. Free, spends nothing. debt_credits above zero means make_ugc is refused with debt_outstanding whatever the balance, until the account buys credits; with no debt, balance_credits is what a new run can spend. holds_credits are reserved for runs still in progress and settle when they finish. grants lists unexpired credit grants. quote_ugc already warns when make_ugc would be refused; this tool gives the numbers behind it.
| Name | Required | Description | Default |
|---|---|---|---|
No parameters | |||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already indicate readOnlyHint=true and destructiveHint=false, and the description adds meaningful behavioral context: 'Free, spends nothing,' and detailed semantics for debt_credits, balance_credits, holds_credits, and grants. This goes well beyond what the annotations provide.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is compact yet information-dense, with the core purpose front-loaded in the first sentence. Every subsequent sentence explains a meaningful field or behavioral nuance without redundancy.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Despite having no output schema, the description explains the return semantics of every key field (debt_credits, balance_credits, holds_credits, grants) and connects them to make_ugc refusal behavior. Nothing an agent needs to interpret the result is missing.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
The tool has zero parameters, so there are no parameter semantics to explain. The description correctly focuses on behavior and return field meaning instead. Baseline 4 for no-parameter tools is appropriate.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description opens with 'Read this account's credits,' a precise verb and resource that clearly states what the tool does. It also distinguishes itself from siblings by explaining that it provides the underlying numbers behind quote_ugc's warnings.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description explicitly differentiates this tool from quote_ugc: quote_ugc warns when make_ugc would be refused, while get_account gives the underlying figures. This gives the agent clear guidance on when to use this tool versus the sibling alternative.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
get_actor_defaultsGet actor B-roll defaultARead-onlyInspect
Read this account actor's saved B-roll default. 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.
| Name | Required | Description | Default |
|---|---|---|---|
| actor_id | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already mark readOnlyHint and non-destructive, and the description enriches them by defining the policy values (anyone/no_actor/no_people), stating the setting only affects B-roll and not actor-only videos, and noting that run override wins with no_people as fallback. No contradiction with annotations.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The purpose sentence is front-loaded and the remaining sentences explain policy semantics and precedence with little fluff. It is slightly dense—'Segmented media generation is closed' is cryptic—but each sentence contributes useful context.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a one-parameter read tool with a readOnly annotation, the description covers policy meaning, scope, and fallback behavior. However, with no output schema, it does not mention return format or what happens when no default is set, leaving some ambiguity about the tool's output.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
The schema provides only actor_id as a required string with no description, so coverage is 0%. The description refers to 'this account actor's' default, which implies actor_id identifies an account actor, but it does not elaborate on format, ownership validation, or the exact role of the parameter beyond that.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description opens with 'Read this account actor's saved B-roll default,' which names a specific verb, resource, and scope. It clearly differentiates from the write-oriented sibling set_actor_defaults and from other actor tools by focusing on the saved B-roll policy.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
It gives clear context for when this tool matters: reading the saved B-roll default for an account actor and understanding that run overrides take precedence. It does not explicitly name alternatives like get_run or set_actor_defaults, but the read-vs-write and override semantics make the intended use obvious.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
get_assetGet an assetARead-onlyInspect
Read one asset by asset_id with a freshly signed url (valid for an hour), its role, name, media_type, bytes, width, height, content_digest and, for a clip, duration_frames, fps, codec and pix_fmt. An asset still in progress answers state awaiting_upload (PUT the file, then read again) or processing (read again in a few seconds); a refused one answers state failed with error.code. A deleted asset answers asset_not_found. Free.
| Name | Required | Description | Default |
|---|---|---|---|
| asset_id | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare a safe read, yet the description still adds real value: the signed URL expires in an hour, the full set of returned attributes, the three terminal states, and error.code on failure. The 'Free' note also discloses a cost trait the annotations cannot express.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
One dense paragraph with the core read described first, then states and errors. Every clause conveys information, though the field enumeration is slightly list-heavy and could be trimmed without losing meaning.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a single-parameter read tool with no output schema, the description covers return shape, the async state machine, the re-read workflow, the deleted-asset failure mode, and cost. Nothing an agent needs before calling is missing.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 0% for the single parameter, so the description must carry the load. It says only 'by asset_id', leaving the ast_<32 hex> pattern and exact identifier format to the schema. The single required parameter keeps the risk low, so this is adequate but not additive.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb and resource ('Read one asset by asset_id') and enumerates the returned fields, so it is immediately distinguishable from list_assets, create_asset, and update_asset in the sibling list.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Gives explicit action guidance for each lifecycle state: PUT the file then re-read for awaiting_upload, re-read in a few seconds for processing, and asset_not_found for deleted assets. It stops short of naming the sibling to use for enumeration or bulk lookup, but the conditional paths are clear.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
get_reference_analysisGet a reference analysisARead-onlyInspect
Read an analysis started by analyze_reference: state queued or analyzing, succeeded with reference_profile (mode full) or data (mode data) and warnings, or failed with error.code and error.message (timed_out, analysis_failed, asset_gone, enqueue_failed); source holds the post's metrics for an analysis started by source_url. credits_charged is the price once succeeded, 0 once failed. Free.
| Name | Required | Description | Default |
|---|---|---|---|
| analysis_id | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations only establish readOnly/no-destructive; the description goes far beyond by disclosing the full state machine (queued, analyzing, succeeded, failed), which payload each terminal state carries (reference_profile in mode full vs data in mode data, plus warnings), the complete error code set (timed_out, analysis_failed, asset_gone, enqueue_failed), and billing behavior (credits_charged is the price on success, 0 on failure, free to call). This is exactly the kind of behavioral context the description should carry.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Front-loaded with the core purpose, then structured by outcome (success/failure) with the cost note last. Every clause adds decision-relevant information; nothing is padding.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
With no output schema, the description must explain return values, and it does so thoroughly: per-state payload shapes, error structure with enumerated codes, and the credits_charged semantics. An agent has enough to parse results and decide whether to keep polling.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
There is one required parameter with 0% schema description coverage, so the description carries the burden. It implies provenance (the analysis_id coming from analyze_reference) but never states the expected id format, whether a stale or foreign id is tolerated, or what happens with an unknown id — the pattern ^ref_[a-f0-9]{32}$ is only visible in the schema. Adequate but leaves a real gap for the sole input.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
Opens with a specific verb+resource ("Read an analysis started by analyze_reference") and immediately distinguishes it from the enqueue/start sibling, which is the only tool that creates these analyses. An agent can tell exactly what it gets back without opening a schema.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description makes clear this is the read side of analyze_reference and that it must be called with the id from that call, implying the poll-until-terminal pattern through the enumerated queued/analyzing/succeeded/failed states. It stops short of stating polling cadence or explicitly excluding alternatives (e.g. re-calling analyze_reference or quote_analysis).
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
get_runGet run statusARead-onlyInspect
Check the status of a video generation started by make_ugc or make_faceless, or of a generate_image or generate_video run. Pass the run_id. While the run is still working it returns status IN_PROGRESS with a next_action telling you to poll again; repeat every ~5 seconds until it reaches a terminal state — SUCCEEDED (with video_url, or generation.url for generate_image and generate_video) or FAILED.
| Name | Required | Description | Default |
|---|---|---|---|
| run_id | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already cover the safety profile (readOnlyHint=true, destructiveHint=false), and the description adds substantial context beyond them: the IN_PROGRESS/succeeded/failed lifecycle, the next_action field, the recommended poll interval, and where the artifact lands (video_url vs generation.url). That is exactly the behavioral disclosure a read-only polling tool needs.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Front-loads the purpose, then the parameter, then the polling loop and terminal states. Dense and mostly free of redundancy, though the long em-dash sentence packing statuses and URLs could be split for easier scanning.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
There is no output schema, so the description absorbs the burden of explaining returns, and it does so by enumerating status values and result fields. Minor gaps remain — it doesn't describe FAILED payloads or error details — but an agent has enough to call it and interpret the result.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 0%, so the description carries some burden. It says 'Pass the run_id' and ties that id to the originating generation tools, but adds no format or provenance detail beyond the pattern the schema already encodes (^run_[a-zA-Z0-9]+$).
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb (check) and resource (run status) and names exactly which originating tools produce a run (make_ugc, make_faceless, generate_image, generate_video). An agent can distinguish this from siblings like get_run_shots or revise_run without opening any schema.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Gives explicit operational guidance: poll every ~5 seconds until terminal state, and treat next_action as the cue to poll again. It does not mention when to prefer a sibling such as get_run_shots for per-shot detail, so the routing picture is clear but not complete.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
get_run_shotsGet the shots of a runARead-onlyInspect
Read the shots of a video made by make_faceless or make_ugc. Pass the run_id. Free and read-only: it changes nothing and starts nothing. With planned=true the answer holds the frame size, the frame rate, the narration words with their timing, and for each shot its id, its span in frames, its kind, the words it covers, its description and preview_url, a signed link to the shot's source picture or clip. That link is a large file and it expires: read the shots again for a fresh one, never store it. A field named in withheld is null on every shot. planned=false is a normal answer, not an error: the run has no shots to show, and editable.state with editable.reason says why. editable.media_available_until is how long the media of the run are stored. paid_edits.enabled says whether a video can be made from an edit; while it is false, none can.
| Name | Required | Description | Default |
|---|---|---|---|
| run_id | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already cover read-only/no-destruction, yet the description adds substantial behavioral context beyond them: preview_url is a large, expiring signed link that must not be stored, withheld fields are nulled, planned=false is a normal outcome, media_available_until limits storage, and paid_edits.enabled gates edit-based video creation. This is the kind of disclosure that changes how an agent behaves.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Purpose and required input are front-loaded, and with no output schema the detailed field rundown earns its space. It is delivered as one dense unbroken block of prose, which makes the later return-shape details harder to scan than they need to be.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Because there is no output schema, the description must explain the return payload, and it does so thoroughly: frame size/rate, narration timing, per-shot fields, preview_url semantics, withheld, editable.state/reason, media_available_until, and paid_edits.enabled. An agent has everything needed to interpret both success and empty states.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 0% for the single parameter, so the description carries the burden, but it only says 'Pass the run_id' without format or provenance detail (the run_ prefix pattern lives only in the schema). Minimal compensation for the coverage gap, hence the baseline 3.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
Opens with a specific verb+resource ('Read the shots of a video') and names the exact producer tools (make_faceless, make_ugc) plus the required input. This distinguishes it cleanly from the sibling get_run, which returns run-level data rather than shots.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Gives clear context: call it after make_faceless/make_ugc, pass the run_id, and expect planned=false as a legitimate no-shots answer rather than an error. It does not explicitly contrast the choice against the sibling get_run, so the boundary between run-level and shot-level retrieval is only implied.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
get_uploadGet an uploadARead-onlyInspect
Read one upload by upload_id: a freshly signed https url, content_digest, media_type, bytes, width, height and usable_until. After create_upload it also confirms the PUT: it answers upload_not_finished until the file is there and upload_expired after 24 hours. Free.
| Name | Required | Description | Default |
|---|---|---|---|
| upload_id | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint=true and destructiveHint=false, and the description adds real value on top: the signed URL is freshly minted per call, the tool surfaces a three-state result (present / not finished / expired) with a 24-hour cutoff, and it is free. It omits error behavior for unknown or malformed ids and any auth or rate-limit notes.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Three tight sentences, front-loaded with the verb and return payload, then the lifecycle behavior, then cost. No filler and no repetition of the schema.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
No output schema exists, and the description compensates by naming every returned field plus the signed-URL freshness property. The state machine around PUT confirmation is spelled out, which is the one non-obvious behavior for this tool.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 0%, so the single upload_id parameter is documented only by the pattern in the schema. The description implies provenance (ids come from create_upload) but never states the upl_ format or that the id is required, leaving the schema to carry the rest.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb and resource ("Read one upload by upload_id") and enumerates the returned fields, so the agent knows exactly what it gets back. The mention of create_upload and the PUT-confirmation role separates it cleanly from the write-side siblings.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Gives concrete usage context: call it after create_upload to confirm the PUT completed, and it explains the polling semantics (upload_not_finished until the file lands, upload_expired after 24 hours). It does not name an alternative tool or state when not to use it, so it stops short of a 5.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
get_workflowRead a workflow methodARead-onlyInspect
Read one workflow method by method_id: required inputs, script rules, evidence, limitations and current availability. Free and read-only. Use the returned method and capability digests in a plan.
| Name | Required | Description | Default |
|---|---|---|---|
| method_id | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint=true and destructiveHint=false, and the description's 'Free and read-only' largely restates them. It does add that the record exposes 'current availability', hinting at stateful/live data, but says nothing about auth requirements, caching freshness, or error behavior when a method_id is unknown.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Two compact sentences, front-loaded with the operation and scope before the content list and the usage hint. 'Free and read-only' is the only near-redundant clause against the annotations, but it is short and not disruptive.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a one-parameter read tool with no output schema, the description usefully enumerates the returned fields, which is the main thing an agent needs to decide whether to call it. The absence of any statement about what happens with an invalid method_id is the only real gap.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 0% and the single method_id property has no inline description. The description compensates minimally by framing it as the identifier that selects exactly one workflow method, which is the minimum needed but adds no format, length, or validity detail.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a precise verb+resource: 'Read one workflow method by method_id', and enumerates what the record contains (required inputs, script rules, evidence, limitations, availability). The singular 'one workflow method' implicitly separates it from the sibling list_workflows, though no sibling is named explicitly.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
'Use the returned method and capability digests in a plan' gives a downstream-usage hint, which is real but thin guidance. It never states when to prefer this over list_workflows or the plan tools (prepare_workflow_plan, get_workflow_plan), so the when/when-not decision is left to inference.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
get_workflow_planRead a workflow planARead-onlyInspect
Read the current account-owned plan, revision, content digest, readiness issues and warnings. Free and read-only. The document is intent; it is not a delivered video or creative acceptance.
| Name | Required | Description | Default |
|---|---|---|---|
| plan_id | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint=true and destructiveHint=false, so safety is covered; the description adds that the call is free (no quota/cost) and clarifies the semantic boundary that the document is intent, not a delivered video or creative acceptance. That boundary is real added value, though return-shape details like pagination or freshness are absent.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Three short sentences, front-loaded with the resource and its contents, then the cost/safety note, then the semantic boundary. Nothing is wasted and no filler is present.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
With no output schema, the description carries the burden of describing return values and does so explicitly (plan, revision, content digest, readiness issues, warnings). It is close to complete for a single-parameter read; only the parameter's semantics and behavior on error are missing.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 0% and the single plan_id parameter is never mentioned in the description, so the agent gets no added meaning about the expected wfp_ prefix format, ownership scoping, or what happens when the plan_id is unknown. The schema pattern is the only guidance available.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb ('Read') and resource ('the current account-owned plan') and enumerates what the payload contains (revision, content digest, readiness issues, warnings). It does not, however, distinguish itself from the sibling get_workflow, which an agent would plausibly confuse it with.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
'Free and read-only' implies this is the cheap inspection call to use before spending on quote/approve steps, which is useful implied guidance. There is no explicit when-to-use vs get_workflow, no prerequisites, and no stated alternatives.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
list_actorsList actorsARead-onlyInspect
List saved Clipwright actors with stable IDs, gender, age and verified image formats. Choose actor_id for quote_ugc and make_ugc. Preview URLs expire; actor IDs remain reusable. Do not combine actor_id with image, person or actor_gender. Without voice, the actor speaks the default voice of their gender.
| Name | Required | Description | Default |
|---|---|---|---|
No parameters | |||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already mark this as read-only, and the description adds meaningful behavior beyond that: preview URLs expire while actor IDs remain reusable, and the default-voice behavior when no voice is supplied. These are useful operational details an agent would not infer from the annotation.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Five short sentences, each carrying distinct information: what is listed, how to use the ID, a URL-lifecycle caveat, a combination prohibition, and voice default behavior. No filler or redundancy.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a parameterless read-only list tool with no output schema, this description is complete: it names the output fields, explains ID reuse, warns about expiring previews, and covers interactions with related tools. Nothing essential is missing.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
The tool has zero parameters, so the schema has nothing to document; the baseline for this case is 4. The description compensates by explaining the significance of actor_id (reusable, suitable for quote_ugc/make_ugc) and what output fields are present.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description opens with a specific verb and resource ('List saved Clipwright actors') and enumerates the returned attributes (stable IDs, gender, age, verified image formats). It also ties the tool to downstream use in quote_ugc and make_ugc, making its role distinct even among siblings.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
It gives clear context for when to use the result: choose actor_id for quote_ugc and make_ugc, and provides two prohibitions/constraints (do not combine actor_id with image/person/actor_gender; no voice means default gender voice). It does not explicitly contrast with an alternative such as get_actor_defaults, so exclusions are absent.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
list_assetsList assetsARead-onlyInspect
List the assets of this account, newest first, each with a freshly signed url, its role, name, size and content_digest; filter by role and kind, and pass next_cursor as cursor for the next page. pending lists assets still awaiting their upload or processing, and those that failed today with the reason. usage says how much of the 2000 assets and 20 GB is used. Free.
| Name | Required | Description | Default |
|---|---|---|---|
| kind | No | ||
| role | No | ||
| limit | No | ||
| cursor | No | next_cursor of the previous page |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already establish this as a safe read (readOnlyHint=true, destructiveHint=false), and the description adds genuinely useful context beyond them: newest-first ordering, urls are freshly signed (i.e., time-limited), and the account quota is 2000 assets / 20 GB, plus it is 'Free'. The only weakness is the unclear 'pending'/'usage' clauses, which muddy rather than clarify behavior.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Purpose and return fields are front-loaded, which is good, but the whole thing is a single run-on semicolon chain, and the final two clauses about pending/usage do not earn their place because they correspond to nothing in the schema.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
With no output schema, the description correctly enumerates the returned fields and ordering, which is the essential missing piece. It also covers pagination and quota, so an agent can call it correctly; only the limit parameter and the dangling pending/usage references are left unclear.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is only 25% (only cursor is documented), so the description must compensate. It partially does by explaining that role and kind are filters and that cursor takes the previous page's next_cursor, but it never explains 'limit' (range 1-100) or clarifies what 'pending'/'usage' would map to, despite those not existing in the schema.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb and resource ('List the assets of this account') plus scope details an agent can act on: newest-first ordering and the exact fields returned (signed url, role, name, size, content_digest). This clearly separates it from get_asset, create_asset, and the other asset siblings.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
It does tell the agent how to filter (role, kind) and how to paginate ('pass next_cursor as cursor for the next page'), which is real guidance. However, the trailing sentences about 'pending' and 'usage' reference no corresponding parameter and no sibling tool, so they add ambiguity rather than routing guidance, and no alternative tool is named explicitly.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
list_generation_modelsList generation modelsARead-onlyInspect
List the models generate_image and generate_video take, each with its modes, aspect ratios, resolutions, durations, output width and height, and unit_credits: credits per image, or per second of a clip. Only measured combinations are listed; any other is refused with unsupported_combination before any charge. Free.
| Name | Required | Description | Default |
|---|---|---|---|
No parameters | |||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint/destructiveHint=false, so the safety profile is covered; the description earns credit for what the annotations can't say — that the call is free, that only measured combinations are returned, and that invalid ones fail with unsupported_combination before any charge. It omits the response shape (presumably a list keyed by model) and whether results are cacheable/static.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
One dense sentence that front-loads the purpose, then extends to return fields, then the error/charging guarantee, plus a one-word cost note. No filler and no repetition of the title.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
With no output schema, the description carries the return-value burden and does it: it names the fields returned and the unit_credits semantics (per image vs per second of clip). Combined with the free/error behavior, an agent has everything needed to call this zero-param tool correctly.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Zero parameters, so there is nothing for the description to disambiguate and the baseline of 4 applies. Nothing in the text contradicts the empty schema.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
A specific verb (List) plus a specific resource (the models consumed by generate_image and generate_video), and it explicitly ties itself to those two sibling tools. The enumeration of returned attributes (modes, aspect ratios, resolutions, durations, dimensions, unit_credits) removes any ambiguity about what 'models' means here.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
'Only measured combinations are listed; any other is refused with unsupported_combination before any charge' tells the agent this is a pre-flight lookup that gates the generate/quote siblings. It never states outright 'call this before generate_image', so the routing is strongly implied rather than prescribed.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
list_pricesList pricesARead-onlyInspect
List what every Clipwright tool costs in credits. Free, spends nothing. Each entry names the tool, its REST route and its price: lines of credits per unit (call, second of video, second the presenter is in the video, image, clip, second of clip), added up, with minimum_credits when there is one; or, where the price depends on the input, a formula. Free tools cost 0. For the exact number of a paid call, use the quote tool the entry names.
| Name | Required | Description | Default |
|---|---|---|---|
No parameters | |||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare this is a safe read-only operation. The description adds substantial behavioral context beyond annotations: it spends nothing, free tools cost 0, and each entry includes tool name, REST route, price lines, minimum_credits, or a formula when input-dependent.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is front-loaded with the core purpose and cost behavior. The long sentence enumerating unit types and formula handling is dense but useful because there is no output schema to explain the returned entry structure.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a zero-parameter read-only catalog tool with no output schema, the description is complete enough: it explains what is returned, how prices are represented, how free tools appear, and when to use quote tools instead.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
The tool takes zero parameters, so parameter semantics are not a meaningful differentiator. Per the zero-parameter baseline, this is adequately handled by the schema and requires no parameter explanation in the description.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description states a specific verb and resource: it lists what every Clipwright tool costs in credits. It also distinguishes this catalog/price-list function from sibling quote tools by explaining that exact paid-call numbers come from the quote tool named in each entry.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
It explains the central usage distinction: use this tool to see all prices, formulas, and free tools, but use the named quote tool for the exact number of a paid call. This directly routes the agent between list_prices and the quote_* siblings.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
list_template_soundsList template soundsARead-onlyInspect
List the sounds make_ugc templates play, by beat: where each beat plays, its default and every name it takes. A run plays the defaults; template_sounds { beat: name } swaps a beat's sound, and template_sounds=false plays none. The edit beat plays on every cut only with make_ugc edit_sounds=true. Sounds never change the price. Free.
| Name | Required | Description | Default |
|---|---|---|---|
No parameters | |||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already cover read-only/safe, but the description adds real context: sounds never change the price and the call is free, plus the edit_sounds dependency. These are behavioral facts not derivable from the annotations. Minor gap: no mention of return format or ordering beyond 'by beat'.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Purpose is front-loaded, but the text is dense and packs several distinct concepts (beat semantics, template_sounds override, edit_sounds dependency, pricing) into one block. The closing 'Sounds never change the price. Free.' is redundant, restating the same cost point twice.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
With no output schema, the description carries the burden of explaining returns and does so adequately ('where each beat plays, its default and every name it takes'). It also ties the result to the make_ugc parameters that consume it, giving an agent enough to use it correctly.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
The tool takes zero parameters, so the schema carries no semantic burden and baseline 4 applies. The description correctly implies no inputs are needed while clarifying how the returned names feed make_ugc parameters.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb (List) and resource (template sounds that make_ugc templates play) with the scope 'by beat'. It is clearly the discovery tool for sound names, distinct from make_ugc/revise_run siblings, though it never names an alternative explicitly.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
It explains the downstream usage (template_sounds { beat: name } swaps a sound, template_sounds=false plays none) which implies you call this to discover valid names before configuring make_ugc. But it never states when to call this tool versus simply running a template, leaving usage implied rather than explicit.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
list_voicesList voicesARead-onlyInspect
List the voices for the voice field of make_ugc, or of make_faceless with skill=make_faceless. Without skill the list holds the make_ugc voices only. Each voice names the one skill that speaks it in skill, and the other skill refuses it before any charge. skill=make_faceless lists the 17 narration voices of make_faceless (kind faceless_voice, each with a language and a gender; without voice it speaks narrator_en_wise_lady; it takes no voice_id). The rest of this text is about the make_ugc voices: the presets first, then the 30 voices of gemini-3.8-flash-tts (kind model_voice), then catalog voices in 31 languages. Filter by language (the voice's native language; any voice speaks any supported language), gender, age, use_case and model; an unknown filter value is refused with the allowed values. Pick a voice by name (e.g. voice="george"); a name always means the same voice. A model_voice voice is spoken only by its model: naming it selects that model, it has no language of its own and matches the languages measured on the model, and its gender is listed only where it is known. voice_id is an escape hatch for a raw vendor voice id that is not listed, such as a cloned voice. Without voice or voice_id the default voice follows the actor's gender: sarah for a woman, george for a man, taken from actor_id or from actor_gender next to image. With image and no actor_gender the voice is george and a warning says so: pass the gender of the person in the photo as actor_gender (ask the user only when you cannot tell), or pick a voice here. Keep any voice the user chose. A voice with preview_url has a short-lived audio sample spoken by that voice with that model; play it to the user before a paid render instead of judging a voice by its description. A model_voice sample is in English, or in the language you filter by. It expires at preview_expires_at: call this tool again for a fresh link, never store it. A voice without preview_url has no sample yet. words_per_second is an English voice's measured pace; eleven_v4 has no speed setting, so to match a reference presenter pick the voice nearest its pace. Free. 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.
| Name | Required | Description | Default |
|---|---|---|---|
| age | No | Age label as list_voices prints it (young, middle_aged, old); an unknown value is refused with the allowed list | |
| model | No | Only voices this speech model speaks: presets and catalog voices whose language it supports, or the model's own voices (kind model_voice). These are the models of make_ugc: no make_faceless voice matches | |
| skill | No | The skill whose voices to list: make_faceless lists the narration voices of make_faceless (kind faceless_voice), make_ugc every other voice. Omitted means make_ugc. A voice is refused by the other skill before any charge | |
| gender | No | Gender label of the voice | |
| language | No | Native language of the voice. A filter, not a limit: any voice speaks any supported language. A voice with no language of its own (kind model_voice) matches the languages measured on its model | |
| use_case | No | Use case label as list_voices prints it (narrative_story, social_media, …); an unknown value is refused with the allowed list |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already cover read-only/non-destructive; the description goes further with 'Free', per-skill refusal before any charge, unknown filter values being rejected with the allowed set, and preview_url being short-lived, expiring at preview_expires_at and never to be stored. The character-limit and break-tag paragraphs add behavior but belong to the render tools, not this listing, so transparency is rich but padded.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
A single ~350-word block with no structure; the script character limits for eleven_v3/v4/gemini, emoji counting and break tags are irrelevant to listing voices and dilute the actionable guidance. The useful front-loading (skill behavior, defaults, previews) is buried mid-paragraph.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
There is no output schema, so naming the returned fields (kind, skill, preview_url, preview_expires_at, words_per_second) is legitimately valuable. Coverage of the real filters and the defaulting logic is complete; the missing piece is any indication of result size or which fields identify a voice entry.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100%, so baseline is 3. The description adds real semantics for `model` (only voices that model speaks; model_voice has no language of its own) and `language` (a filter, not a limit), but it also describes `voice`, `voice_id`, `actor_id`, `actor_gender` and `image`, none of which exist in this tool's schema — a genuine risk that an agent tries to pass them here.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
Opens with a concrete verb and resource ('List the voices for the `voice` field of make_ugc'), scoped to the two consuming skills. It does not differentiate itself from adjacent list tools (list_template_sounds, list_generation_models), so the sibling-distinguishing credit is only partial.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Explicit routing: `skill` selects make_faceless vs make_ugc, no `skill` means make_ugc, `voice_id` is the escape hatch for unlisted/cloned voices, and the default-voice rule (sarah/george from actor gender) plus the 'ask the user only when you cannot tell' guidance is spelled out. It also says to preserve a user-chosen voice, which is genuine when/when-not guidance.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
list_workflowsList workflow methodsARead-onlyInspect
List seven workflow methods and their current availability. Free and read-only. Five methods use native executors; website-proof-demo and kinetic-launch remain execution_blocked. Availability is not account-specific permission to buy.
| Name | Required | Description | Default |
|---|---|---|---|
No parameters | |||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already cover readOnly/destructive, but the description adds real behavioral context: five methods run on native executors, website-proof-demo and kinetic-launch are execution_blocked, and availability does not equal purchasing permission. That is exactly the kind of state detail an agent needs before planning a run.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Three short sentences, front-loaded with the core action and followed by the executor/blocked distinction. Every sentence carries information, though the executor detail is packaged densely enough to read as a status dump.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
With no output schema, the description must convey what comes back, and it does (seven methods, each with availability and blocked status). Nothing about calling it is missing, though it could say whether results are static or change over time.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
The tool takes zero parameters, so there is nothing for the description to disambiguate; baseline 4 applies. The description correctly implies a no-argument full-enumeration call.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb (List) and resource (seven workflow methods) plus what each entry conveys (current availability). This is clearly distinguishable from siblings like get_workflow (single item) or list_generation_models (different resource).
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The line 'Free and read-only' hints this is a safe discovery call, and the availability caveat implies you call it before attempting a buy. But it never says explicitly when to use this versus get_workflow or prepare_workflow_plan, leaving the routing to inference.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
make_facelessMake a faceless videoAInspect
Start a paid finished faceless video from a script or brief. You select 30–90 seconds; the video ends with its narration, runs at least 25 seconds and at most a quarter past the selection, never beyond 90. The video has an opening animated clip and image scenes. Captions are on by default and can be turned off. Call quote_faceless first and show the user the price. This does NOT wait for the video: it starts the run and returns a run_id IMMEDIATELY. Then poll get_run with that run_id until the state is 'succeeded' (video_url) or 'failed'. Pass attempt=2,3,… to deliberately start a NEW run for the same input. Price: generated picture 7 credits per image plus opening clip 49 credits per clip plus production (story, voice and render) 1 credits per second of video, at least 50. Quote first with quote_faceless; list_prices names every price.
| Name | Required | Description | Default |
|---|---|---|---|
| brief | No | What the video is about; the narration is written from it. Required when input_mode is 'brief'; must be absent when it is 'script'. | |
| voice | No | Narration voice: a name from list_voices with skill=make_faceless (kind faceless_voice). Omitted means narrator_en_wise_lady. Choose a voice in the language of the narration: a voice reads any language, with the accent of its own. The API refuses an unknown name and a make_ugc voice before any charge. A raw voice_id is not accepted here. | |
| script | No | The narration, read as written. Required when input_mode is 'script'; must be absent when it is 'brief'. | |
| attempt | No | ||
| captions | No | Burned-in captions; on by default. | |
| input_mode | Yes | 'script' narrates your exact text; 'brief' writes the narration from a short description. Send exactly one of script or brief, matching this mode. | |
| scene_images | No | Optional images of your own, each placed at a word range or quote of the narration. | |
| style_reference | No | Optional public https image whose visual style the scenes follow. | |
| duration_seconds | Yes | Selected length, 30 to 90 seconds, on a 1/25 s frame boundary. The video ends with its narration and runs at least 25 seconds, usually at most a quarter past the selection and 90 seconds; when the narration takes longer, the video runs to its end. A video more than 5 seconds longer than the selection says so in warnings[]. The charge never exceeds the quote. A script is accepted when its estimated length is 21 seconds to the selection plus 5, at most 90. | |
| character_details | No | Optional fixed visual details for the referenced person or figure, such as hairstyle, clothing and absent accessories; applied to every generated scene. | |
| character_reference | No | Optional public https image of a person or figure to keep consistent across scenes. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations only declare non-read-only/non-destructive; the description adds the asynchrony ('does NOT wait for the video: it starts the run and returns a run_id IMMEDIATELY'), the polling contract, the billing model in credits, the fact that charge never exceeds the quote, and the effects of attempt. Contradicts nothing in the annotations.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Purpose and the quote-first rule are front-loaded, and no sentence is filler — even the pricing sentence is load-bearing for a paid tool. It is densely packed with several multi-clause sentences (duration rules, pricing arithmetic) that could be split for faster scanning.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For an 11-parameter asynchronous paid generator with no output schema, the description supplies everything needed to call it correctly and interpret the result: what is produced, how long it runs, what it costs, what is returned (run_id, video_url), and how to wait. No material gap remains.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 91% and most parameters are already documented, so the baseline is 3. The description earns extra credit for explaining attempt, which has no schema description, and for restating the duration overrun rule and the captions default in call-level terms. It does not cover scene_images, voice or style_reference, which is why it stops short of 5.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
Opens with a specific verb and resource ('Start a paid finished faceless video from a script or brief'), and the surrounding detail about narration, opening clip and image scenes clearly separates it from make_ugc and quote_faceless. An agent can identify the tool and its output without opening the schema.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Explicit prerequisites and sequencing: 'Call quote_faceless first and show the user the price', then 'poll get_run with that run_id until the state is succeeded or failed'. It also names the alternative path for reruns ('Pass attempt=2,3,… to deliberately start a NEW run') and points to list_prices for full pricing.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
make_ugcMake a talking-actor videoAInspect
Start generation of a lip-synced UGC video. Give a script within the selected speech model's text limit; the actor comes from actor_id (a saved actor from list_actors) or image, otherwise the default actor is used. Format and resolution follow the request and the source, defaulting to 1080x1920. Captions are OPT-IN: ask the user first. Fields the renderer does not honor yet carry a NOT HONORED YET note in their own description — read it instead of guessing. Call quote_ugc before generating and show the cost. This does NOT wait for the video: it starts the run and returns a run_id IMMEDIATELY. You MUST then poll get_run with that run_id until the state is 'succeeded' (video_url) or 'failed'. A 'failed' run whose video is still being made can go back to 'queued' and reach 'succeeded' later; whenever that happens it is named in warnings[]. Pass attempt=2,3,… to deliberately start a NEW run for the same input (retry after a failure). Price: HeyGen presenter: presenter, HeyGen Avatar IV 9 credits per second the presenter is in the video, covered or not plus production (voice and render) 1 credits per second of video plus live avatar on a call 400 credits per call still in the video, at least 50; OmniHuman presenter: presenter, OmniHuman 2.0 22 credits per second the presenter is in the video, covered or not plus production (voice and render) 1 credits per second of video plus live avatar on a call 400 credits per call still in the video, at least 50. Quote first with quote_ugc; list_prices names every price.
| Name | Required | Description | Default |
|---|---|---|---|
| call | No | A call the presenter listens to: { after: { quote }, lines: [{ speaker: agent|caller, text }] (2–12), voices?, phone? }. | |
| look | No | NOT HONORED YET: look is not honored yet: it does not reach the renderer | natural |
| name | No | NOT HONORED YET: name is not honored yet: it does not reach the renderer | |
| image | No | 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. | |
| voice | No | 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. | |
| person | No | 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 | |
| script | No | 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. | |
| attempt | No | ||
| framing | No | 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. | |
| inserts | No | 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. | |
| actor_id | No | 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. | |
| captions | No | Burn word-timed captions into the video, over the presenter and over inserts. Not available with segments. | |
| overlays | No | 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. | |
| segments | No | Ordered actor and image segments; requires long-form qualification on the server, captions=false and 1080p. Image media requires explicit broll_policy=anyone. | |
| voice_id | No | 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. | |
| templates | No | 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. | |
| tts_model | No | 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. | |
| background | No | ||
| pause_trim | No | Shorten narration pauses longer than these seconds, cutting silence only. | |
| resolution | No | Output resolution: 720p | 1080p | 4k (short side 720 / 1080 / 2160 px). Omitted means 1080p. | |
| voice_pace | No | 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[]. | |
| edit_sounds | No | 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. | |
| actor_gender | No | 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. | |
| aspect_ratio | No | 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. | |
| broll_policy | No | 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. | |
| caption_mode | No | 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. | |
| caption_style | No | 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 | hormozi |
| presenter_mic | No | 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[]. | |
| layout_windows | No | 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. | |
| template_theme | No | The look of every template in the run: a preset and an optional accent; only with templates. | |
| template_sounds | No | Template sounds: false for none, or { beat: name } over the defaults; list_template_sounds names them. | |
| caption_emphasis | No | 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. | |
| caption_position | No | Where captions sit: top, middle, lower or bottom (80% of the height). Omitted means the caption_style's own place. Requires captions=true. | |
| visible_ai_label | No | 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. | |
| presenter_framing | No | close (default) or wide: presenter lower, room above. Needs the actor's wide view (list_actors), 9:16 only; else close plus warnings[]. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With only readOnlyHint=false and destructiveHint=false in annotations, the description carries the full behavioral burden and does: it is asynchronous and returns a run_id immediately rather than waiting, must be polled, can transition failed→queued→succeeded (surfaced in warnings[]), and attempt=2,3 deliberately starts a new billable run. It also discloses that many fields are refused before any charge, which is exactly the kind of safety context annotations don't provide.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The lifecycle and consent instructions are front-loaded and earn their place, but the closing price block is a garbled, near-duplicated dump of two vendor pricing menus that ends by admitting quote_ugc and list_prices are the authoritative sources — so it is largely dead weight in a definition already dense with 35 parameters.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
No output schema exists, yet the description covers the return contract (run_id now, video_url via get_run), the warnings[] channel, and failure recovery, which is what an agent needs for an async tool. For a 35-parameter tool it leaves the advanced composition params to their rich schema docs, which is defensible at 94% coverage.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is already 94%, so the bar is high, but the description still adds real meaning: attempt has no schema description at all and is explained here (deliberate new run for the same input), captions is reframed as opt-in requiring user consent, and the actor_id/image/default-actor precedence is stated. It does not attempt to explain the large insert/overlay/template/framing params, which is reasonable since their own schema text is extensive.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
Opens with a specific verb+resource: "Start generation of a lip-synced UGC video," and immediately pins down the inputs that define it (script, actor_id or image, default actor). It sets itself apart from quote_ugc by being the generation step, but never distinguishes itself from siblings like make_faceless or generate_video, which an agent must choose between.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Gives concrete preconditions and sequencing: call quote_ugc before generating and show the cost, ask the user before enabling captions, and poll get_run with the returned run_id until 'succeeded' or 'failed'. It names partners (list_actors, list_prices, quote_ugc) but gives no explicit when-not/alternative rule against the other generation tools.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
plan_reference_remakeCompile a reference remake planAInspect
Compile a reference remake into a new workflow plan without paying or starting a run. Free. Pass the reference_profile of the ad to remake, the accepted script (copied unchanged), actor_id, a voice and optional ready ast_* assets. The server lays the script on the reference beats and picks templates, captions and sounds; its warnings name everything the plan does not reproduce. Nothing is generated: make missing media separately with generate_image or generate_video, each with its own quote, and compile again. Then approve, quote and run the plan as any other.
| Name | Required | Description | Default |
|---|---|---|---|
| call | No | Your call for a reference beat where the presenter listens to a recorded call: the presenter listens, then freezes, while it plays. The reference's own words are never offered; without lines the presenter keeps talking there. | |
| site | No | Your site, for an end card on the closing beat. | |
| voice | No | 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. | |
| assets | No | Your ready ast_* media, used in order by graphics that need it: a compare takes two images. Nothing is generated. | |
| script | Yes | The accepted narration, copied into the plan unchanged. | |
| message | No | ||
| actor_id | Yes | ||
| audience | No | ||
| voice_id | No | 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. | |
| reference_profile | Yes | The reference_profile analyze_reference returned, or one you wrote to the same schema. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations only say readOnlyHint=false and destructiveHint=false; the description goes well beyond that by disclosing that the call is free, starts no run, copies the script unchanged, and that the server auto-assigns templates, captions and sounds. It also explains that warnings enumerate everything the plan fails to reproduce — exactly the kind of behavioral disclosure an agent needs before invoking a mutating-but-non-destructive tool.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The cost/no-run guarantee is front-loaded in the first two sentences, and the rest follows a logical order: inputs, what the server does, what it does not do, then next steps. A few clauses are slightly redundant ('Nothing is generated' partially echoes 'without paying or starting a run'), but no sentence is wasted.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a 10-parameter tool with a very large nested schema and no output schema, the description covers the whole workflow: inputs, server behavior, warnings, missing-media handling, and the approve/quote/run handoff. It does not describe what the returned plan object contains or how to retrieve it afterward, which is the one remaining gap for a compile-and-return tool.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
With 70% schema coverage, the description adds real meaning for several parameters: the script is 'copied unchanged,' assets must be 'ready ast_*' and are consumed in order, and voice selection interacts with actor gender. It stays silent on call, site, message, audience and voice_id, several of which carry only thin or no schema descriptions, so it does not fully close the coverage gap.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb and resource: 'Compile a reference remake into a new workflow plan,' with the key scoping detail that no run is started and nothing is charged. It implicitly separates itself from the generic prepare_workflow_plan by tying the output to a reference_profile, but it never names that sibling, so the differentiation is left partly to inference.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Gives a clear trigger (you have a reference_profile and an accepted script) and explicit routing for the gap case: 'make missing media separately with generate_image or generate_video, each with its own quote, and compile again.' It also lays out the downstream sequence (approve, quote, run). What it lacks is an explicit 'do not use this when...' against prepare_workflow_plan for non-remake work.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
prepare_workflow_planCreate or save a workflow planAInspect
Create or save a workflow plan without paying or starting a run. Supply the complete document. Omit both plan_id and base_version to create; supply both to save a revision. The document is strict and bounded to 256000 JSON bytes. Preserve exact accepted narration. After a lost save answer, read and compare the saved document; do not automatically approve or purchase.
| Name | Required | Description | Default |
|---|---|---|---|
| plan_id | No | ||
| document | Yes | ||
| base_version | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations declare mutation (readOnlyHint false) without destruction (destructiveHint false). The description adds valuable context beyond annotations: it does not cause payment or start a run, the document is strictly bounded to 256000 JSON bytes, and after a lost save answer one should read/compare rather than auto-approve or purchase. These are meaningful operational details.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is five sentences, front-loaded with purpose and side effects, then usage rules, then constraints and recovery. Every sentence appears relevant, though 'Preserve exact accepted narration' is slightly cryptic without more context.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Given three parameters including a large nested document, no output schema, and annotations, the description covers purpose, create/save logic, size bound, and recovery. It omits the return value (e.g., plan id/version) and deeper parameter semantics, leaving some gaps for an agent to infer.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 0%, so the description must compensate. It explains the conditional combination of plan_id and base_version for create vs save, but does not define what plan_id represents (beyond its pattern), what base_version is (a version number for concurrency), or what happens if only one is supplied. Partial compensation for low coverage.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description states a specific verb (Create or save) and resource (workflow plan) and clarifies the side effect scope (without paying or starting a run), which distinguishes it from run/approve siblings. However, it does not explicitly name an alternative tool, so sibling differentiation is implied but not stated.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description gives explicit conditional usage: 'Omit both plan_id and base_version to create; supply both to save a revision.' It also provides a recovery guideline after a lost save answer. It lacks guidance on when to use this versus quote_workflow_plan or approve_workflow_plan, but the create-vs-save distinction is clear.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
quote_actorQuote a personal actorARead-onlyInspect
Estimate the credit cost of create_actor WITHOUT spending credits. Call this first and show the price before create_actor: each requested format is a separate charged image.
| Name | Required | Description | Default |
|---|---|---|---|
| name | Yes | Name shown in list_actors. | |
| gender | No | female | male. Fixes the actor's gender and the default voice of videos with this actor. Required unless from_actor_id is given. | |
| framing | No | wide: the camera further back, the head lower with room above; make_ugc then renders it as a wide view. | |
| holding | No | Up to 2 objects the presenter holds, one per hand. | |
| quality | No | Image quality: medium | high. Omitted means medium. The price per image depends on it; quote shows it before any charge. | medium |
| setting | No | The room or background to put the presenter in, in words. | |
| description | No | Words describing a fictional adult: appearance, clothing, setting. Naming a real person or a likeness to one is refused before any charge (actor_prompt_refused). Required unless from_actor_id is given. | |
| aspect_ratios | No | Formats to create: 9:16 | 1:1 | 16:9, always including 9:16. Omitted means all three. Formats that fail the identity check are not charged and are named in warnings. | |
| from_actor_id | No | Derive a new personal actor from this one (a library actor or your own): the same face, gender and age, with the view changed by framing, holding or setting. Omit description, gender and approximate_age. | |
| approximate_age | No | Approximate age in years, 18 to 90: actors are adults. Required unless from_actor_id is given. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint=true, and the description reinforces that with 'WITHOUT spending credits' plus the pricing model ('each requested format is a separate charged image'), which is context the annotations cannot carry. It stops short of describing the quote response itself (currency, breakdown, total).
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Two sentences, zero filler, with the cost-free guarantee front-loaded and the workflow instruction second. Nothing is repeated from the title.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a 10-parameter quote tool with full schema documentation and no output schema, the description covers purpose, cost behavior and sequencing. The one gap is what the returned quote looks like (per-format lines vs a single total), which an agent must guess.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100%, so baseline would be 3, but the description adds real meaning: aspect_ratios drives cost multiplicatively because each requested format is a separately charged image. That is a semantic link the schema states only obliquely.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb and resource ('Estimate the credit cost of create_actor') and immediately marks the key distinction from the write sibling: it spends nothing. The title plus the create_actor reference make it unambiguous which quote tool this is versus quote_image, quote_video or quote_faceless.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
'Call this first and show the price before create_actor' gives explicit ordering and the alternative tool to route to. There is no explicit when-not case, but for a pre-flight pricing tool the only relevant alternative is named.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
quote_analysisQuote a reference analysisARead-onlyInspect
Price analyze_reference for an asset_id or a source_url and a mode before starting it: credits_estimate is what a start holds and charges once it succeeds (70 full, 10 data), 0 when the asset or the reel already has an analysis in that mode that a start would answer (replays_analysis_id). A YouTube or unknown link is refused here too. Free; starts nothing.
| Name | Required | Description | Default |
|---|---|---|---|
| mode | No | full (default, 70 credits): the reference_profile. data (10 credits): duration, size, timed transcript, hook and a 3×3 frame sheet, without the vision pass | |
| asset_id | No | asset_id of an MP4 asset of this account, at most 120 s and 100 MiB | |
| source_url | No | instead of asset_id: an Instagram reel or post link (instagram.com/reel/<code>, /reels/<code>, /p/<code>) or a TikTok video link (tiktok.com/@<user>/video/<id>, vm.tiktok.com/<code>); YouTube is refused |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already cover readOnly/non-destructive, and the description adds the credit model: 70 full / 10 data, what a start holds and charges, 0 when a replay would satisfy the start (replays_analysis_id). That's genuine behavioral context beyond structured fields.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Front-loaded with the key verb, but it's a single dense run-on sentence with nested parentheticals that slows parsing. Every clause carries information, but structure could be cleaner.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
With no output schema, the description helpfully names the return fields (credits_estimate, replays_analysis_id) and their semantics. For a 3-param read-only pricing tool this is nearly complete; minor gap in not stating the exact shape of the quote response.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100% so baseline is 3, but the description links mode to concrete credit costs and the replay-eligibility condition, giving meaning the enum alone doesn't convey. It doesn't re-explain the asset_id format, which is fine given schema richness.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb+resource: price/quote analyze_reference for asset_id or source_url, prep before starting. Implicitly distinguishes itself from analyze_reference (which starts) and get_reference_analysis (which retrieves), though it never names siblings explicitly. An agent can infer it's the dry-run pricing step.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
'before starting it' establishes when to call, and 'Free; starts nothing' reinforces it's a pre-flight check. It also states YouTube or unknown links are refused, which sets invocation boundaries. No explicit exclusion naming the alternative quote/get tools, so not a 5.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
quote_candidateQuote a shot candidateARead-onlyInspect
Price one shot candidate of a run WITHOUT spending credits: one picture or clip made for one shot, to keep or discard in a revision. Pass run_id, shot_id and operation, the same as create_candidate; the answer names the unit, its credits and usable_until, the last moment the candidate can enter a revision. Always call this first and show the user the price before create_candidate. A delivered candidate is charged its one unit whether it is kept or discarded; one that fails is charged nothing. While shot candidates are closed it answers editing_disabled and charges nothing.
| Name | Required | Description | Default |
|---|---|---|---|
| take | No | Take number, 1 by default: the same request and take return the same run; take 2 makes another candidate. | |
| run_id | Yes | The faceless run whose shot the candidate is for: a succeeded original or revision. | |
| shot_id | Yes | The shot to make a candidate for, as get_run_shots names it. | |
| operation | Yes | What to generate: one of the operations get_run_shots lists for the shot. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint=true and destructiveHint=false, and the description is consistent with that ("WITHOUT spending credits"). It goes well beyond annotations by disclosing billing semantics (a delivered candidate is charged whether kept or discarded; a failure is free) and the closed-state response "editing_disabled" with no charge.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The key constraint (no credits spent) is front-loaded in the first clause, and each subsequent sentence contributes a distinct fact: argument parity with create_candidate, return fields, call ordering, charge policy, and closed-state behavior.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
There is no output schema, so the description compensates by naming the return fields (unit, credits, usable_until) and defines usable_until. It also covers the error path (editing_disabled), leaving nothing an agent needs to call this safely.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100%, so the schema already carries parameter meaning; the description adds the useful mapping that run_id, shot_id and operation are the same as for create_candidate. It does not mention the optional 'take' parameter's role, which is the only gap at this level.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a precise verb ("Price") and resource ("one shot candidate of a run") and immediately scopes it against its sibling by naming create_candidate as the paid counterpart. An agent can distinguish it from quote_image, quote_video and quote_revision because the description ties the unit to 'one shot' of a 'run'.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
"Always call this first and show the user the price before create_candidate" gives an explicit ordering rule and names the alternative tool it gates. No inference is required about when to prefer quoting over generating.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
quote_facelessQuote a faceless videoARead-onlyInspect
Estimate the credit cost of make_faceless WITHOUT spending credits. Always call this first and show the user the price before make_faceless.
| Name | Required | Description | Default |
|---|---|---|---|
| brief | No | What the video is about; the narration is written from it. Required when input_mode is 'brief'; must be absent when it is 'script'. | |
| voice | No | Narration voice: a name from list_voices with skill=make_faceless (kind faceless_voice). Omitted means narrator_en_wise_lady. Choose a voice in the language of the narration: a voice reads any language, with the accent of its own. The API refuses an unknown name and a make_ugc voice before any charge. A raw voice_id is not accepted here. | |
| script | No | The narration, read as written. Required when input_mode is 'script'; must be absent when it is 'brief'. | |
| captions | No | Burned-in captions; on by default. | |
| input_mode | Yes | 'script' narrates your exact text; 'brief' writes the narration from a short description. Send exactly one of script or brief, matching this mode. | |
| scene_images | No | Optional images of your own, each placed at a word range or quote of the narration. | |
| style_reference | No | Optional public https image whose visual style the scenes follow. | |
| duration_seconds | Yes | Selected length, 30 to 90 seconds, on a 1/25 s frame boundary. The video ends with its narration and runs at least 25 seconds, usually at most a quarter past the selection and 90 seconds; when the narration takes longer, the video runs to its end. A video more than 5 seconds longer than the selection says so in warnings[]. The charge never exceeds the quote. A script is accepted when its estimated length is 21 seconds to the selection plus 5, at most 90. | |
| character_details | No | Optional fixed visual details for the referenced person or figure, such as hairstyle, clothing and absent accessories; applied to every generated scene. | |
| character_reference | No | Optional public https image of a person or figure to keep consistent across scenes. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint=true and destructiveHint=false; the description usefully adds that no credits are consumed, which is the key behavioral fact. However, it says nothing about whether the quote is binding or how priced inputs (duration, voice, scene images) affect the estimate, and no output schema exists to cover the returned cost breakdown.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Two short sentences, zero filler, with the cost-free framing and the ordering rule both front-loaded.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a read-only estimator whose 10 parameters are fully documented in the schema, the description covers purpose and call ordering adequately. It would be stronger if it stated that the quote mirrors make_faceless inputs and described the shape of the returned cost estimate, since no output schema exists.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100% across 10 parameters, so the schema fully documents each field. The description adds no parameter-level guidance (e.g., that it accepts the same arguments as make_faceless), so baseline 3 applies.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb+resource: estimate the credit cost of make_faceless, and adds the distinguishing scope 'WITHOUT spending credits'. An agent can immediately separate it from make_faceless and the other quote_* siblings.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Explicitly prescribes the workflow: 'Always call this first and show the user the price before make_faceless.' That is both a when-to-use rule and the required follow-up action, leaving nothing to inference.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
quote_imageQuote an imageARead-onlyInspect
Price one generate_image call WITHOUT spending credits: its credits (one image at its model's unit_credits), its width and height, and warnings. Always call this first and show the user the price before generate_image. A reference is {upload_id, rights_confirmed: true} for a picture from upload_image or create_upload (rights_confirmed states you may use the people and works in it), {run_id} of a succeeded generate_image run of this account until its reusable_until, or {asset_id} of a picture asset from create_asset, whose rights were confirmed when it was made. A generation that fails is charged nothing. An identical request returns the same run it started before, so a call repeated after a lost answer starts nothing new; to make another one with the same request on purpose, pass attempt 2. While generations are closed it answers generations_disabled or generations_marking_pending and charges nothing.
| Name | Required | Description | Default |
|---|---|---|---|
| model | Yes | ||
| prompt | Yes | ||
| references | No | ||
| aspect_ratio | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint=true, and the description reinforces this with "WITHOUT spending credits" plus non-obvious behavior: failed generations are charged nothing, and closed generations answer generations_disabled/generations_marking_pending at no charge. The idempotency discussion (identical request returns the prior run, pass attempt 2) is useful but blurs into generate_image's behavior and references an `attempt` parameter this schema does not accept.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The core value proposition and the "call this first" rule are front-loaded, and most sentences carry real information. It is a single dense paragraph with a digression into idempotency/attempt semantics that belongs more to generate_image than to a pricing call.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
With no output schema, the description correctly compensates by describing the return payload (credits, width, height, warnings) and the error responses. The only gap is the unexplained model/aspect_ratio semantics and the phantom `attempt` parameter, which could cause a rejected call.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 0%, so the description must carry the load. It does a good job on `references`, spelling out all three shapes and the meaning of rights_confirmed, but says nothing about `model` (only that its unit_credits drive the price), `aspect_ratio`, or `prompt` constraints, and mentions an `attempt` field that additionalProperties:false would reject.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
Opens with a specific verb+resource+scope: "Price one generate_image call WITHOUT spending credits", and immediately enumerates what is returned (credits, width/height, warnings). It is unambiguously distinguishable from the sibling generate_image, which it names directly.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
"Always call this first and show the user the price before generate_image" states the exact sequencing rule and the user-facing obligation. It also routes the agent to the correct prerequisite tools for each reference form (upload_image, create_upload, create_asset, or a succeeded generate_image run_id).
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
quote_revisionQuote a revision of a runARead-onlyInspect
Price a revision of a run WITHOUT spending credits: what it would change (summary) and what it costs (billing.total_credits). Pass run_id and exactly one of changes or document, the same as revise_run. Always call this first and show the user the price before revise_run. A revision that delivers is charged its quoted total; one that fails is charged nothing. While paid edits are closed it answers editing_disabled and charges nothing.
| Name | Required | Description | Default |
|---|---|---|---|
| run_id | Yes | The run to revise: a succeeded make_faceless run, an original or a revision. | |
| changes | No | Shots to generate anew over the run as it is: each a shot_id and the operation to generate for it. | |
| document | No | The whole edited document, as the run's draft holds it; retimes, deletions and uploads go this way. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint=true and destructiveHint=false, so the safety profile is covered. The description adds substantial context beyond that: no credits are spent, a delivering revision is charged its quoted total, a failing one is charged nothing, and it returns editing_disabled when paid edits are closed. This is strong behavioral disclosure; only minor gaps (e.g. format of summary) remain.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The free/no-credits guarantee is front-loaded, followed by the parameter constraint and the ordering directive. Every sentence carries actionable information with no waste.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Given the annotation coverage and 100% schema description, the description completes the picture by naming the return fields (summary, billing.total_credits) even without an output schema, and by explaining the ordering relative to revise_run. Nothing essential for correct invocation is missing.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100%, so baseline is 3, but the description adds a real constraint not encoded in the schema: 'exactly one of changes or document,' which the schema does not enforce (only run_id is required). It also ties run_id semantics to revise_run, adding value beyond the property descriptions.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb (price/quote) and resource (a revision of a run), and clarifies it does NOT spend credits. It distinguishes itself from the sibling revise_run, which actually performs the edit, so the agent can tell the two apart without opening either schema.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Gives an explicit directive: 'Always call this first and show the user the price before revise_run.' This names the alternative and the sequencing condition. It also notes the editing_disabled case, telling the agent what happens when edits are closed.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
quote_ugcQuote a videoARead-onlyInspect
Estimate the credit cost of a make_ugc call WITHOUT spending credits. Always call this first and show the user the price before make_ugc.
| Name | Required | Description | Default |
|---|---|---|---|
| call | No | A call the presenter listens to: { after: { quote }, lines: [{ speaker: agent|caller, text }] (2–12), voices?, phone? }. | |
| look | No | NOT HONORED YET: look is not honored yet: it does not reach the renderer | natural |
| name | No | NOT HONORED YET: name is not honored yet: it does not reach the renderer | |
| image | No | 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. | |
| voice | No | 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. | |
| person | No | 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 | |
| script | No | 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. | |
| framing | No | 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. | |
| inserts | No | 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. | |
| actor_id | No | 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. | |
| captions | No | Burn word-timed captions into the video, over the presenter and over inserts. Not available with segments. | |
| overlays | No | 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. | |
| segments | No | Ordered actor and image segments; requires long-form qualification on the server, captions=false and 1080p. Image media requires explicit broll_policy=anyone. | |
| voice_id | No | 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. | |
| templates | No | 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. | |
| tts_model | No | 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. | |
| background | No | ||
| pause_trim | No | Shorten narration pauses longer than these seconds, cutting silence only. | |
| resolution | No | Output resolution: 720p | 1080p | 4k (short side 720 / 1080 / 2160 px). Omitted means 1080p. | |
| voice_pace | No | 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[]. | |
| edit_sounds | No | 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. | |
| actor_gender | No | 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. | |
| aspect_ratio | No | 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. | |
| broll_policy | No | 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. | |
| caption_mode | No | 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. | |
| caption_style | No | 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 | hormozi |
| presenter_mic | No | 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[]. | |
| layout_windows | No | 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. | |
| template_theme | No | The look of every template in the run: a preset and an optional accent; only with templates. | |
| template_sounds | No | Template sounds: false for none, or { beat: name } over the defaults; list_template_sounds names them. | |
| caption_emphasis | No | 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. | |
| caption_position | No | Where captions sit: top, middle, lower or bottom (80% of the height). Omitted means the caption_style's own place. Requires captions=true. | |
| visible_ai_label | No | 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. | |
| presenter_framing | No | close (default) or wide: presenter lower, room above. Needs the actor's wide view (list_actors), 9:16 only; else close plus warnings[]. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
The 'WITHOUT spending credits' guarantee adds real value beyond readOnlyHint=true, since it promises no charge rather than merely no mutation. However, with no output schema and 34 params, the description says nothing about what comes back (credit total, duration estimate, warnings), whether the call validates and refuses unusable sources before charging (the schema claims this repeatedly), or whether params must mirror make_ugc exactly.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Two short sentences, zero waste, and the highest-value constraint (no credits spent) and the routing rule are both front-loaded.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a 34-parameter, deeply nested quote endpoint with no output schema, the definition is thin: an agent cannot tell from it whether the full make_ugc body is expected, what fields the quote returns, or whether a quote is a pre-flight validation. Purpose and routing are covered, but the shape of the interaction is not.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 97%, so the schema already carries parameter meaning. The description adds nothing about params, not even that it accepts the same 34-parameter body as make_ugc. Baseline 3 applies when structured fields do the heavy lifting.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
Specific verb+resource: 'Estimate the credit cost of a make_ugc call'. It names the sibling it shadows (make_ugc) and the 'WITHOUT spending credits' clause locks in the distinction from every other sibling in the quote_* family.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Explicit routing rule: 'Always call this first and show the user the price before make_ugc.' Both the when (before make_ugc) and the required agent behavior (surface the price to the user) are stated, leaving nothing to inference.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
quote_videoQuote a clipARead-onlyInspect
Price one generate_video call WITHOUT spending credits: its credits (unit_credits per second of duration_s), its width and height, and warnings. Always call this first and show the user the price before generate_video. A reference is {upload_id, rights_confirmed: true} for a picture from upload_image or create_upload (rights_confirmed states you may use the people and works in it), {run_id} of a succeeded generate_image run of this account until its reusable_until, or {asset_id} of a picture asset from create_asset, whose rights were confirmed when it was made. A generation that fails is charged nothing. An identical request returns the same run it started before, so a call repeated after a lost answer starts nothing new; to make another one with the same request on purpose, pass attempt 2. While generations are closed it answers generations_disabled or generations_marking_pending and charges nothing.
| Name | Required | Description | Default |
|---|---|---|---|
| mode | Yes | ||
| model | Yes | ||
| camera | No | ||
| prompt | Yes | ||
| duration_s | Yes | ||
| last_frame | No | ||
| references | No | ||
| resolution | Yes | ||
| first_frame | No | ||
| aspect_ratio | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Adds substantial context beyond readOnlyHint=true/destructiveHint=false: no credits consumed, failed generations are free, and the generations_disabled / generations_marking_pending answers. However, the idempotency and "pass attempt 2" sentences describe generate_video semantics rather than a read-only pricing call, which muddies the side-effect picture and risks the agent believing quoting can start a run.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Front-loaded well, opening with the value proposition and the call-ordering rule in the first two sentences. The back half drifts into generate_video's retry and idempotency behavior, which does not belong in a pricing tool's description and competes for attention with the reference-shape guidance that actually matters here.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
With no output schema and zero schema text, the description does the heavy lifting: it names what comes back (credits as unit_credits per second of duration_s, width, height, warnings) and enumerates the reference provenance needed to build a valid call. Gaps remain on how model/mode/resolution choices affect the quoted price, which is the core reason an agent would call this tool.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 0% across 10 parameters, and the description earns real credit for the `references` / `first_frame` shape: it explains the three accepted variants, their provenance (upload_image, create_upload, a succeeded generate_image run until reusable_until, create_asset) and the meaning of rights_confirmed. But required parameters that drive the price itself — mode, model, resolution, aspect_ratio, duration_s — get no semantic treatment, and it references an `attempt` parameter that does not exist in the schema.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a concrete verb and resource ("price one generate_video call") and immediately disambiguates from the sibling that actually spends credits with "WITHOUT spending credits". The contrast with generate_video makes the tool's role unmistakable without opening a schema.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Gives an explicit ordering directive: "Always call this first and show the user the price before generate_video." It also names the exact trigger for the related pricing siblings by scoping itself to generate_video, and it covers the blocked state ("while generations are closed") so the agent knows quoting still works when generation does not.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
quote_workflow_planQuote a workflow runARead-onlyInspect
Quote the approved current plan without spending credits. Free and read-only. Show the native price and every warning before requesting a paid launch. The returned quote_id expires and binds the exact revision and semantic input. Its launch is the ready run_workflow_plan body, with a fresh idempotency_key.
| Name | Required | Description | Default |
|---|---|---|---|
| plan_id | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint=true and destructiveHint=false, but the description adds substantial non-obvious context: it is free, the quote_id expires, it binds the exact revision and semantic input, and launching requires a fresh idempotency_key. That is meaningful behavior beyond the annotation.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Four tight sentences, front-loaded with the free/no-credit fact, then the quote semantics, then the launch relationship. No filler.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a single-parameter read-only tool with no output schema, the description covers cost, return content (price and warnings), quote_id lifetime, binding semantics, and the handoff to run_workflow_plan. Nothing essential is missing.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 0% with one required plan_id, so the description must carry the load. 'Approved current plan' and 'binds the exact revision' imply plan_id identifies an approved plan revision, but the wfp_ format and rejection of unapproved plans are left to the schema pattern and inference.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb and resource ('Quote the approved current plan') plus the key scope constraint ('without spending credits'), and it is distinguishable from the many sibling quote_* tools by naming the plan workflow rather than an image/video/actor asset.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Explicitly says to call this 'before requesting a paid launch' and names the downstream alternative (run_workflow_plan, whose body this produces). An agent knows both when to use it and what to do next.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
revise_runRevise a runAInspect
Start a revision of a run made by make_faceless (paid): a NEW run that renders the video again with the shots you change, by changes (a shot and what to generate for it) or by document (the whole edited document); pass exactly one. Call quote_revision first and show the user the price. An identical request returns the same run it started before, so a call repeated after a lost answer starts nothing new; to start a second revision with the same request on purpose, pass attempt 2. A revision that delivers is charged its quoted total; one that fails is charged nothing. An original has a limit on revisions running at once and on revisions failed or unfinished, and paid edits of it close some days after it finished; a refusal names which. While paid edits are closed it answers editing_disabled and charges nothing. The result is a new run: poll it with get_run; once it succeeded it is editable under its own run_id. Price: each shot generated anew: picture 7, clip 49, clip with a new picture 56; plus 13 to render. A revision that generates nothing: 13. A kept candidate adds nothing. Quote first with quote_revision; list_prices names every price.
| Name | Required | Description | Default |
|---|---|---|---|
| run_id | Yes | The run to revise: a succeeded make_faceless run, an original or a revision. | |
| attempt | No | ||
| changes | No | Shots to generate anew over the run as it is: each a shot_id and the operation to generate for it. | |
| document | No | The whole edited document, as the run's draft holds it; retimes, deletions and uploads go this way. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations only cover readOnly=false/destructive=false, but the description adds substantial behavior: idempotent dedup on identical requests, charging semantics (charged quoted total on delivery, nothing on failure), concurrency/failure limits, the editing window closing, and polling results with get_run. This is rich context beyond the annotations.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Front-loads what the tool does, then prerequisites, then idempotency, then pricing. Dense but mostly purposeful; the granular price breakdown is arguably verbose given quote_revision/list_prices exist, but it is front-loaded and structured rather than rambling.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Given no output schema and a nested multi-mode input, the description covers what the result is (a new run), how to poll it, when it becomes editable, all the error/refusal states, and pricing. An agent has everything needed to call it correctly.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
With 75% schema coverage, the description usefully explains the otherwise-undocumented attempt param (deliberate second revision) and the mutual exclusivity of changes vs document, plus that retimes/deletions/uploads go via document. It does not explain the individual operation modes (retake/new_picture/edit_picture/animate) beyond their names, leaving a small gap.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb (start a revision) and resource (a run made by make_faceless), clarifies it produces a NEW run, and explicitly contrasts the two input modes (changes vs document) and the sibling quote_revision prerequisite. An agent can distinguish this from make_faceless, get_run, and quote_revision without opening any schema.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Explicit routing: 'pass exactly one' of changes/document, 'Call quote_revision first and show the user the price', use attempt 2 for a deliberate repeat, and editing_disabled means paid edits are closed. It names the prerequisite tool and the failure/refusal conditions directly.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
run_workflow_planStart a paid workflow runAInspect
Start one explicitly approved paid workflow run: pass the launch object of its quote unchanged (revision, content_digest, semantic_input_digest, quote_id and idempotency_key). Over REST, send the header Idempotency-Key equal to launch.idempotency_key; this tool sets it for you. Returns immediately with its captured receipt and native run_id; poll get_run. Never auto-approve, auto-quote or invent a new key. If delivery is uncertain, recover with the original request and key; a new key can pay twice. Technical evidence is separate from human creative acceptance. Price: the price of the native run it starts, make_ugc or make_faceless, as its quote states it. Quote first with quote_workflow_plan; list_prices names every price.
| Name | Required | Description | Default |
|---|---|---|---|
| plan_id | Yes | ||
| quote_id | Yes | ||
| revision | Yes | ||
| content_digest | Yes | ||
| idempotency_key | Yes | ||
| semantic_input_digest | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations only say this is a non-read-only, non-destructive mutation; the description adds the material context that it spends money, that the request is idempotent via a specific header, that it returns immediately with a receipt and run_id rather than blocking, and that retrying with a new key can double-charge. It also clarifies that technical success is distinct from human creative acceptance.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Front-loaded with the action and the immutability constraint, then transport detail, then the return/poll contract, then safety and pricing. Dense but nearly every clause carries operational weight; the 'technical evidence vs human creative acceptance' sentence is slightly tangential to invoking the tool.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
With no output schema, the description supplies the return shape (captured receipt and native run_id), the non-blocking nature, the polling path, the price attribution, and failure/recovery semantics. An agent has what it needs to call this safely without seeing the schema.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 0%, so the description carries the burden: it names five of the six fields, constrains them to be passed from the quote unchanged, and explains that idempotency_key is transported as the Idempotency-Key header over REST. It omits plan_id entirely and never explains what content_digest vs semantic_input_digest represent, leaving a gap.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
Opens with a specific verb and resource — start one explicitly approved paid workflow run — and names the exact object it consumes (the quote's launch object). It is clearly separable from quote_workflow_plan (which precedes it) and get_run (which follows it).
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Gives explicit preconditions ('explicitly approved', quote first with quote_workflow_plan), the follow-up action (poll get_run), the price source (make_ugc/make_faceless, list_prices), and hard exclusions ('Never auto-approve, auto-quote or invent a new key'). It also prescribes recovery behavior for uncertain delivery.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
send_feedbackSend feedbackAIdempotentInspect
Tell Clipwright what is missing or wrong. Call it when no tool does what the user asked (kind missing_capability), or when an answer was confusing (confusing), wrong (wrong_result) or far too slow (slow), instead of rephrasing the request and giving up. Say what the user wanted, what you tried and what came back; pass run_id when it is about a run. We read every one. Free, spends nothing. Sending the same kind, text and run again within 24 hours answers the same feedback_id. 20 per hour per account.
| Name | Required | Description | Default |
|---|---|---|---|
| kind | Yes | missing_capability: no tool does what the user asked; confusing: an answer or description was unclear; wrong_result: a result is not what was asked; slow: something took far longer than it said. | |
| text | Yes | What the user wanted, what you tried and what came back, in plain words. | |
| run_id | No | The run it is about, if any. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations only give the generic write/idempotent/non-destructive profile; the description adds genuinely new traits: it is free and spends no credits, humans read every submission, duplicate (kind, text, run_id) within 24 hours returns the same feedback_id, and there is a rate limit of 20 per hour per account. Those are exactly the facts an agent needs before submitting.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Purpose is front-loaded in the first clause, followed by triggers, content guidance, and operational facts in descending order of importance. Every sentence carries information an agent would otherwise have to guess; there is no filler.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a three-parameter mutation tool with no output schema, the description covers cost, rate limits, deduplication and return identifier well. It does not say what the immediate response contains beyond feedback_id, nor what happens if the 20/hour limit is hit, which are the only notable gaps.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100%, so the enum meanings and run_id pattern are already documented. The description still adds behavioral guidance on content ("Say what the user wanted, what you tried and what came back") and on when run_id applies, which is more than the schema's terse "if any."
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
"Tell Clipwright what is missing or wrong" states a specific verb and resource, and no sibling tool does anything similar, so the function is unmistakable. The kinds enumerated immediately after anchor what 'feedback' means here.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
It names the triggering condition (no tool does what the user asked; an answer was confusing, wrong or too slow) and explicitly says to do this "instead of rephrasing the request and giving up," which tells the agent both when to call and what not to do instead. It also scopes run_id: "pass run_id when it is about a run."
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
set_actor_defaultsSet actor B-roll defaultAIdempotentInspect
Save this account actor's B-roll default without spending credits. 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.
| Name | Required | Description | Default |
|---|---|---|---|
| actor_id | Yes | ||
| broll_policy | Yes | 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. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations declare idempotentHint=true and destructiveHint=false, but the description adds substantial behavioral context: it notes the operation is stored only, has no effect on actor-only videos, explains the policy precedence, and clarifies that segmented media generation is closed. This goes well beyond the annotations and is crucial for an agent to predict side effects.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is moderately long but every sentence contributes meaning: the opening states purpose and cost, the middle defines policy semantics, and the end covers scope and precedence. It is logically ordered and front-loaded with the most critical information.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a simple set operation with two parameters and no output schema, the description covers all essential aspects: the action, the policy meanings, cost implications, scope (stored only, no effect on actor-only videos), and precedence. Nothing an agent needs to call it correctly is missing.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 50%: broll_policy has a full description in the schema, but actor_id has none. The description repeats and slightly elaborates the broll_policy enum values, and it references 'this account actor's' to give actor_id context. However, it does not explicitly define actor_id or its format, leaving half the parameters only implicitly documented.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description opens with a clear verb and resource: 'Save this account actor's B-roll default'. It also adds a key differentiator, 'without spending credits', which separates it from potential alternatives. The policy enum is explained in detail, making the tool's purpose unambiguous.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description implies usage context through the cost note and precedence rules ('Run override wins...'), but it does not explicitly state when to use this tool versus get_actor_defaults or other siblings. The absence of explicit exclusions is a minor gap, though the credit-saving angle provides practical guidance.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
update_assetRename an assetBIdempotentInspect
Rename an asset or change its role; the picture itself does not change. Free.
| Name | Required | Description | Default |
|---|---|---|---|
| name | No | ||
| role | No | ||
| asset_id | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint=false, idempotentHint=true and destructiveHint=false, so the safety profile is covered. The description adds two genuinely useful facts beyond that: the underlying image is preserved and the call is free. It still omits validation/error behavior and what happens if neither name nor role is provided.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
One sentence, front-loaded with the action and immediately followed by the key scoping constraint and the cost note. No filler.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a 3-parameter mutation tool with no output schema and zero parameter description coverage, the description should convey required vs optional fields and the role enum. As written, the critical invocation details (asset_id required, at least one of name/role) exist only in the raw schema.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 0%, so the description carries the burden, and it only names the two mutable fields at a conceptual level. It never mentions the required asset_id, the 1-80 character name bound, or the five allowed role values, so an agent must open the schema to call this correctly.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb+resource pair (rename an asset / change its role) and distinguishes it from create_asset, delete_asset and get_asset by making explicit that only metadata changes. Slightly under-covers the 'update' framing in the tool name, but the intent is unmistakable.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Usage is implied by 'rename ... or change its role', and 'the picture itself does not change' rules out regeneration use cases. However it never says when to choose this over siblings like create_asset, nor whether one or both of name/role must be supplied.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
upload_imageUpload an imageAInspect
Get an upload_id and a signed https url for a PNG or JPEG up to 10 MB: from a LOCAL file (path, only when this server runs on your machine) or from a public https url that the server downloads (up to 20 seconds; redirects are followed up to 3 times). Pass the url as image to quote_ugc / make_ugc, and the upload_id as {upload_id, rights_confirmed: true} in references, first_frame or last_frame of quote_image, generate_image, quote_video and generate_video. The url is signed for 24 hours; the upload_id stays usable for 30 days. For workflow assets, use the upload_id as asset_id and content_digest directly: it is the SHA-256 of the original bytes. Set aspect_ratio EXPLICITLY to match the picture. For a file on your disk while this server is remote, use create_upload. Free: spends no credits; 20 uploads per day per account, and at most 30 url downloads per hour.
| Name | Required | Description | Default |
|---|---|---|---|
| url | No | Public https URL of a PNG or JPEG; the server downloads it | |
| path | No | Absolute or cwd-relative path to a PNG or JPEG file; only on a server running on your machine |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Beyond the annotations, the description discloses important behavioral traits: the signed URL lasts 24 hours, the upload_id lasts 30 days, the operation is free and spends no credits, and quotas apply at 20 uploads/day and 30 URL downloads/hour. It also notes download timeout and redirect behavior and explains that the upload_id doubles as asset_id with a SHA-256 content_digest for workflow assets.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is dense but front-loaded with the core action and return values, and every sentence contributes operational detail such as validity windows, quotas, downstream usage, or alternatives. The long first sentence is justified by the amount of routing information it carries.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Given two simple parameters, no output schema, and non-read-only/non-destructive annotations, the description is complete: it explains what is returned, how long each return value is valid, how to use both values downstream, what it costs, and what limits apply. No material gap remains for an agent deciding whether and how to call it.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is already 100%, so the schema documents both path and url, but the description adds useful constraints: PNG/JPEG only, 10 MB cap, url download behavior, and the local-server condition for path. It could be slightly stronger by explicitly stating that exactly one source should be provided, since both parameters are optional in the schema.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description uses a specific verb-plus-result framing: it obtains an upload_id and signed HTTPS URL for a PNG/JPEG up to 10 MB from either a local path or a public URL. It clearly distinguishes this tool from create_upload for the remote-server/local-file case and explains how the returned values are consumed by sibling tools.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
It gives explicit routing conditions: use path only when the server runs locally, use url for a public HTTPS download, and use create_upload when the file is on the caller's disk but the server is remote. It also tells the agent exactly where to pass the returned url and upload_id in downstream tools.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
Tool Schema Changelog
Recent tool additions, removals, and schema changes observed during successful MCP inspections.
9 tool updates
v0.36.0- Changed
analyze_reference3 fields changed- added
Input schema / properties / modeAdded value: +{ + "description": "full (default, 70 credits): the reference_profile. data (10 credits): duration, size, timed transcript, hook and a 3×3 frame sheet, without the vision pass", + "enum": [ + "full", + "data" + ], + "type": "string" +} - added
Input schema / properties / source_urlAdded value: +{ + "description": "instead of asset_id: an Instagram reel or post link (instagram.com/reel/<code>, /reels/<code>, /p/<code>) or a TikTok video link (tiktok.com/@<user>/video/<id>, vm.tiktok.com/<code>); YouTube is refused", + "format": "starts_with", + "maxLength": 2048, + "pattern": "^https:\\/\\/.*", + "type": "string" +} - removed
Input schema / requiredRemoved value: -[ - "asset_id" -]
- Changed
make_faceless1 field changed- changed
Input schema / properties / duration_seconds / descriptionPrevious value: -"Selected length, 30 to 90 seconds, on a 1/25 s frame boundary. The video ends with its narration, runs at least 25 seconds and may exceed the selection by up to a quarter, never beyond 90 seconds; a video more than 5 seconds longer says so in warnings[]. The charge never exceeds the quote. A script is accepted when its estimated length is 21 seconds to the selection plus 5, at most 90."New value: +"Selected length, 30 to 90 seconds, on a 1/25 s frame boundary. The video ends with its narration and runs at least 25 seconds, usually at most a quarter past the selection and 90 seconds; when the narration takes longer, the video runs to its end. A video more than 5 seconds longer than the selection says so in warnings[]. The charge never exceeds the quote. A script is accepted when its estimated length is 21 seconds to the selection plus 5, at most 90."
- Changed
make_ugc2 fields changed- changed
Input schema / properties / aspect_ratio / descriptionPrevious 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." - changed
Input schema / properties / voice / descriptionPrevious 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."
- Changed
plan_reference_remake7 fields changed- added
Input schema / properties / reference_profile / properties / beats / items / properties / graphics / items / properties / label_hint / descriptionAdded value: +"What the vision pass saw on it, in its words, such as \"Blue banner 'DEVELOP THE STORY'\"; empty when it gave none." - changed
Input schema / properties / reference_profile / properties / beats / items / properties / graphics / items / properties / source_kind / enumPrevious value: -[ - "toggle_checklist", - "phone_call", - "notification", - "before_after_split", - "split_screen", - "stat", - "product_ui", - "screenshot", - "title_card", - "end_card", - "particles", - "tag", - "lower_third", - "quote", - "callout", - "checklist", - "compare", - "progress", - "rating", - "overlay_media", - "insert_media", - "layout_split", - "unmapped", - "other" -]New value: +[ + "toggle_checklist", + "phone_call", + "notification", + "before_after_split", + "split_screen", + "stat", + "product_ui", + "screenshot", + "title_card", + "end_card", + "particles", + "banner", + "logo_card", + "comment_box", + "price_card", + "concept_card", + "tag", + "lower_third", + "quote", + "callout", + "checklist", + "compare", + "progress", + "rating", + "overlay_media", + "insert_media", + "layout_split", + "unmapped", + "other" +] - added
Input schema / properties / reference_profile / properties / beats / items / properties / spoken_summary / descriptionAdded value: +"The words spoken in the beat, cut at 200 characters; empty when none were heard." - added
Input schema / properties / reference_profile / properties / hookAdded value: +{ + "additionalProperties": false, + "properties": { + "caption": { + "description": "The first on-screen caption line the vision pass read inside the hook's window.", + "maxLength": 120, + "type": "string" + }, + "end_s": { + "description": "Where the hook's last word ends, else where its window does.", + "minimum": 0, + "type": "number" + }, + "text": { + "description": "The words that start in the first 3 s, through the end of their sentence (no word starting past 6 s); empty when none do.", + "maxLength": 200, + "type": "string" + } + }, + "required": [ + "text", + "end_s" + ], + "type": "object" +} - changed
Input schema / properties / reference_profile / properties / staging / properties / elements / items / properties / kind / enumPrevious value: -[ - "toggle_checklist", - "phone_call", - "notification", - "before_after_split", - "split_screen", - "stat", - "product_ui", - "screenshot", - "title_card", - "end_card", - "particles", - "tag", - "lower_third", - "quote", - "callout", - "checklist", - "compare", - "progress", - "rating", - "overlay_media", - "insert_media", - "layout_split", - "unmapped", - "other" -]New value: +[ + "toggle_checklist", + "phone_call", + "notification", + "before_after_split", + "split_screen", + "stat", + "product_ui", + "screenshot", + "title_card", + "end_card", + "particles", + "banner", + "logo_card", + "comment_box", + "price_card", + "concept_card", + "tag", + "lower_third", + "quote", + "callout", + "checklist", + "compare", + "progress", + "rating", + "overlay_media", + "insert_media", + "layout_split", + "unmapped", + "other" +] - added
Input schema / properties / reference_profile / properties / transcriptAdded value: +{ + "description": "The reference's speech as timed words, in order.", + "items": { + "additionalProperties": false, + "properties": { + "end_s": { + "minimum": 0, + "type": "number" + }, + "speaker": { + "description": "The transcription's speaker label, such as speaker_0; absent when it gave none.", + "maxLength": 40, + "minLength": 1, + "type": "string" + }, + "start_s": { + "minimum": 0, + "type": "number" + }, + "text": { + "maxLength": 64, + "minLength": 1, + "type": "string" + } + }, + "required": [ + "text", + "start_s", + "end_s" + ], + "type": "object" + }, + "maxItems": 1000, + "type": "array" +} - changed
Input schema / properties / voice / descriptionPrevious 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."
- Changed
prepare_workflow_plan7 fields changed- changed
Input schema / properties / document / properties / brief / properties / native / oneOfPrevious value: -[ - { - "additionalProperties": false, - "properties": { - "input": { - "additionalProperties": false, - "properties": { - "actor_gender": { - "description": "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.", - "enum": [ - "female", - "male" - ], - "type": "string" - }, - "actor_id": { - "description": "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.", - "pattern": "^actor_[a-z0-9][a-z0-9_-]{0,63}$", - "type": "string" - }, - "aspect_ratio": { - "description": "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.", - "enum": [ - "9:16", - "1:1", - "16:9" - ], - "type": "string" - }, - "background": { - "enum": [ - "white", - "blur", - "contain" - ], - "type": "string" - }, - "broll_policy": { - "description": "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.", - "enum": [ - "anyone", - "no_actor", - "no_people" - ], - "type": "string" - }, - "call": { - "additionalProperties": false, - "description": "A phone call after a quote: the presenter listens, then freezes while the call plays as a phone line, with a ring first, and an in-call phone beside them shows it (a phone_call template covering the call is used instead). Needs script, a 9:16 frame and words after it. The frozen presenter and the call add production seconds, not presenter seconds, and a live-avatar still shown on the call has its own price in list_prices. Long-form qualification on the server.", - "properties": { - "after": { - "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 the call follows: the presenter stops after the quote's last word and resumes on the next one." - }, - "lines": { - "description": "The call's turns in order, from both speakers; at most 1500 characters and about 45 s in all.", - "items": { - "additionalProperties": false, - "properties": { - "speaker": { - "enum": [ - "agent", - "caller" - ], - "type": "string" - }, - "text": { - "maxLength": 400, - "minLength": 1, - "type": "string" - } - }, - "required": [ - "speaker", - "text" - ], - "type": "object" - }, - "maxItems": 12, - "minItems": 2, - "type": "array" - }, - "phone": { - "additionalProperties": false, - "description": "The in-call phone drawn over the call when no phone_call template covers it; omitted fields are +1 (305) 555-0147 with its digits after the area code masked, \"Hold This Call?\" and \"You'll be notified to pick up.\".", - "properties": { - "banner": { - "maxLength": 32, - "minLength": 1, - "type": "string" - }, - "banner_note": { - "maxLength": 48, - "minLength": 1, - "type": "string" - }, - "caller": { - "maxLength": 24, - "minLength": 1, - "type": "string" - }, - "mask_number": { - "type": "boolean" - } - }, - "type": "object" - }, - "stage": { - "additionalProperties": false, - "description": "Where the in-call phone settles and how it rises, as a reference measured them (plan_reference_remake writes it); omitted is the reference call scene's own place and rise.", - "properties": { - "enter": { - "additionalProperties": false, - "properties": { - "anchor": { - "additionalProperties": false, - "description": "When the rise starts: seconds from the call's freeze, negative before it.", - "properties": { - "id": { - "const": "freeze_start#1", - "type": "string" - }, - "offset_s": { - "maximum": 0, - "minimum": -10, - "type": "number" - } - }, - "required": [ - "id", - "offset_s" - ], - "type": "object" - }, - "displacement": { - "additionalItems": false, - "description": "Settled minus first position, in shares of width and height.", - "items": [ - { - "maximum": 1, - "minimum": -1, - "type": "number" - }, - { - "maximum": 1, - "minimum": -1, - "type": "number" - } - ], - "maxItems": 2, - "minItems": 2, - "type": "array" - }, - "duration_s": { - "maximum": 5, - "minimum": 0.1, - "type": "number" - }, - "from": { - "enum": [ - "bottom", - "lower_left", - "lower_right" - ], - "type": "string" - } - }, - "required": [ - "from", - "displacement", - "duration_s", - "anchor" - ], - "type": "object" - }, - "layer": { - "enum": [ - "behind_presenter" - ], - "type": "string" - }, - "rect": { - "additionalProperties": false, - "description": "Where the phone settles, in shares of the frame.", - "properties": { - "height": { - "maximum": 1, - "minimum": 0, - "type": "number" - }, - "left": { - "maximum": 1, - "minimum": 0, - "type": "number" - }, - "top": { - "maximum": 1, - "minimum": 0, - "type": "number" - }, - "width": { - "maximum": 1, - "minimum": 0, - "type": "number" - } - }, - "required": [ - "left", - "top", - "width", - "height" - ], - "type": "object" - }, - "rect_face": { - "additionalProperties": false, - "description": "The same place relative to the presenter's face: origin the face centre, unit the face height.", - "properties": { - "height": { - "exclusiveMinimum": 0, - "maximum": 20, - "type": "number" - }, - "left": { - "maximum": 20, - "minimum": -20, - "type": "number" - }, - "top": { - "maximum": 20, - "minimum": -20, - "type": "number" - }, - "width": { - "exclusiveMinimum": 0, - "maximum": 20, - "type": "number" - } - }, - "required": [ - "left", - "top", - "width", - "height" - ], - "type": "object" - } - }, - "required": [ - "rect" - ], - "type": "object" - }, - "voices": { - "additionalProperties": false, - "description": "Voice names from list_voices; omitted means en_female_cassidy for the agent and en_male_mark for the caller.", - "properties": { - "agent": { - "pattern": "^[A-Za-z0-9][A-Za-z0-9_-]{0,63}$", - "type": "string" - }, - "caller": { - "pattern": "^[A-Za-z0-9][A-Za-z0-9_-]{0,63}$", - "type": "string" - } - }, - "type": "object" - } - }, - "required": [ - "after", - "lines" - ], - "type": "object" - }, - "caption_emphasis": { - "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 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.", - "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" - }, - "caption_mode": { - "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" - }, - "caption_position": { - "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" - }, - "caption_style": { - "default": "hormozi", - "description": "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", - "enum": [ - "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" - ], - "type": "string" - }, - "captions": { - "default": false, - "description": "Burn word-timed captions into the video, over the presenter and over inserts. Not available with segments.", - "type": "boolean" - }, - "edit_sounds": { - "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" - }, - "framing": { - "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" - }, - "image": { - "description": "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.", - "format": "starts_with", - "maxLength": 2048, - "pattern": "^https:\\/\\/.*", - "type": "string" - }, - "inserts": { - "description": "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.", - "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" - } - ] - }, - "asset_id": { - "description": "A ready PNG or JPEG image or MP4 video from your own assets (list_assets), instead of media_url. Pass exactly one of the two; media_type must match the asset's kind.", - "pattern": "^ast_[a-f0-9]{32}$", - "type": "string" - }, - "cover_words": { - "description": "How many spoken words this insert covers, counted from the first word of its anchor. Omitted means the anchored words only. The insert ends where the first uncovered word begins, so inserts whose coverage meets are adjacent frame for frame and leave no actor shot between them.", - "exclusiveMinimum": 0, - "maximum": 10000, - "type": "integer" - }, - "id": { - "pattern": "^[a-zA-Z0-9][a-zA-Z0-9_-]{0,63}$", - "type": "string" - }, - "image_motion": { - "additionalProperties": false, - "description": "Optional picture zoom. A picture always fills the frame, cut to its shape when the shapes differ (warnings[] names the share cut). amount is the zoom beyond filling: in grows from 1 to 1+amount, out shrinks from 1+amount to 1. No motion by default.", - "properties": { - "amount": { - "exclusiveMaximum": 1, - "minimum": 0, - "type": "number" - }, - "direction": { - "enum": [ - "in", - "out" - ], - "type": "string" - } - }, - "required": [ - "direction", - "amount" - ], - "type": "object" - }, - "media_type": { - "description": "image (PNG or JPEG) or video (MP4, H.264 or HEVC, 8-bit SDR). A video plays muted from its first frame and is cut where its words end; one shorter than its words holds its last frame, and warnings[] names it.", - "enum": [ - "image", - "video" - ], - "type": "string" - }, - "media_url": { - "description": "Public https URL of the media. Pass exactly one of media_url or asset_id.", - "format": "starts_with", - "maxLength": 2048, - "pattern": "^https:\\/\\/.*", - "type": "string" - }, - "transition": { - "description": "How the insert comes in and goes out: cut (default), wipe (slides across the presenter), flash (a white flash on the cut) or zoom (eases in from a closer framing). It never moves the insert's start or end.", - "enum": [ - "cut", - "wipe", - "flash", - "zoom" - ], - "type": "string" - } - }, - "required": [ - "id", - "media_type", - "anchor" - ], - "type": "object" - }, - "maxItems": 49, - "minItems": 1, - "type": "array" - }, - "layout_windows": { - "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" - }, - "look": { - "default": "natural", - "enum": [ - "natural", - "commercial", - "raw_iphone" - ], - "type": "string" - }, - "name": { - "maxLength": 100, - "type": "string" - }, - "overlays": { - "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" - }, - "pause_trim": { - "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" - }, - "person": { - "maxLength": 500, - "minLength": 1, - "type": "string" - }, - "presenter_framing": { - "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" - }, - "presenter_mic": { - "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" - }, - "resolution": { - "description": "Output resolution: 720p | 1080p | 4k (short side 720 / 1080 / 2160 px). Omitted means 1080p.", - "enum": [ - "720p", - "1080p", - "4k" - ], - "type": "string" - }, - "script": { - "description": "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.", - "maxLength": 10000, - "minLength": 1, - "type": "string" - }, - "segments": { - "items": { - "additionalProperties": false, - "properties": { - "duration_seconds": { - "description": "Required for an image segment; its display duration in seconds. Not accepted for actor or video segments.", - "exclusiveMinimum": 0, - "type": "number" - }, - "image_motion": { - "additionalProperties": false, - "properties": { - "amount": { - "exclusiveMaximum": 1, - "minimum": 0, - "type": "number" - }, - "direction": { - "enum": [ - "in", - "out" - ], - "type": "string" - } - }, - "required": [ - "direction", - "amount" - ], - "type": "object" - }, - "kind": { - "enum": [ - "actor", - "media" - ], - "type": "string" - }, - "media_type": { - "description": "Explicit media source type; omission means video, regardless of URL suffix. Availability follows the segments field.", - "enum": [ - "image", - "video" - ], - "type": "string" - }, - "media_url": { - "format": "uri", - "maxLength": 2048, - "type": "string" - }, - "script": { - "maxLength": 10000, - "minLength": 1, - "type": "string" - } - }, - "required": [ - "kind" - ], - "type": "object" - }, - "maxItems": 5, - "minItems": 1, - "type": "array" - }, - "template_sounds": { - "anyOf": [ - { - "const": false, - "type": "boolean" - }, - { - "additionalProperties": false, - "properties": { - "answer": { - "enum": [ - "answer_confirm", - "answer_open", - "answer_pop", - "answer_select", - "pickup" - ], - "type": "string" - }, - "click": { - "enum": [ - "click_mouse", - "click_soft", - "click_crisp", - "click_light" - ], - "type": "string" - }, - "edit": { - "enum": [ - "swell_hit", - "whoosh_deep", - "whoosh_low", - "boom_low", - "sub_drop", - "riser_boom", - "riser_hit" - ], - "type": "string" - }, - "flash": { - "enum": [ - "shutter", - "glitch", - "swish" - ], - "type": "string" - }, - "hangup": { - "enum": [ - "phone" - ], - "type": "string" - }, - "money": { - "enum": [ - "cash_register", - "coins" - ], - "type": "string" - }, - "notify": { - "enum": [ - "chime", - "glass_ping", - "glass_soft", - "bong", - "question_ping" - ], - "type": "string" - }, - "pop": { - "enum": [ - "plop" - ], - "type": "string" - }, - "ring": { - "enum": [ - "ring_classic", - "ring_marimba", - "ring_digital", - "ring_double" - ], - "type": "string" - }, - "step": { - "enum": [ - "drop", - "drop_high", - "tick", - "pluck", - "pluck_bright" - ], - "type": "string" - }, - "toggle": { - "enum": [ - "switch_flip", - "toggle_snap", - "switch_heavy", - "switch_light" - ], - "type": "string" - }, - "whoosh": { - "enum": [ - "whoosh", - "whip", - "paper_swipe", - "sweep", - "slide_quick" - ], - "type": "string" - } - }, - "type": "object" - } - ], - "description": "Template sounds: false for none, or { beat: name } over the defaults; list_template_sounds names them." - }, - "template_theme": { - "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" - }, - "templates": { - "description": "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.", - "items": { - "oneOf": [ - { - "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": false, - "properties": { - "position": { - "enum": [ - "top", - "center", - "bottom" - ], - "type": "string" - }, - "size": { - "enum": [ - "small", - "medium", - "large" - ], - "type": "string" - }, - "text": { - "maxLength": 32, - "minLength": 1, - "type": "string" - } - }, - "required": [ - "text" - ], - "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": { - "const": "tag", - "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" - }, - { - "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": false, - "properties": { - "name": { - "maxLength": 28, - "minLength": 1, - "type": "string" - }, - "role": { - "maxLength": 36, - "minLength": 1, - "type": "string" - }, - "side": { - "enum": [ - "left", - "right" - ], - "type": "string" - }, - "size": { - "enum": [ - "small", - "medium", - "large" - ], - "type": "string" - } - }, - "required": [ - "name", - "side" - ], - "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": { - "const": "lower_third", - "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" - }, - { - "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": false, - "properties": { - "cta": { - "maxLength": 48, - "minLength": 1, - "type": "string" - }, - "site": { - "maxLength": 32, - "minLength": 1, - "type": "string" - }, - "size": { - "enum": [ - "small", - "medium", - "large" - ], - "type": "string" - } - }, - "required": [ - "site" - ], - "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": { - "const": "end_card", - "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" - }, - { - "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": false, - "properties": { - "chip": { - "maxLength": 32, - "minLength": 1, - "type": "string" - }, - "logo": { - "additionalProperties": false, - "properties": { - "asset_id": { - "description": "A ready asset from list_assets, of the kind the slot takes.", - "pattern": "^ast_[a-f0-9]{32}$", - "type": "string" - } - }, - "required": [ - "asset_id" - ], - "type": "object" - }, - "size": { - "enum": [ - "small", - "medium", - "large" - ], - "type": "string" - }, - "title": { - "maxLength": 48, - "minLength": 1, - "type": "string" - } - }, - "required": [ - "title" - ], - "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": { - "const": "title_card", - "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" - }, - { - "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": false, - "properties": { - "author": { - "maxLength": 32, - "minLength": 1, - "type": "string" - }, - "photo": { - "additionalProperties": false, - "properties": { - "asset_id": { - "description": "A ready asset from list_assets, of the kind the slot takes.", - "pattern": "^ast_[a-f0-9]{32}$", - "type": "string" - } - }, - "required": [ - "asset_id" - ], - "type": "object" - }, - "size": { - "enum": [ - "small", - "medium", - "large" - ], - "type": "string" - }, - "text": { - "maxLength": 120, - "minLength": 1, - "type": "string" - } - }, - "required": [ - "text" - ], - "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": { - "const": "quote", - "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" - }, - { - "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": false, - "properties": { - "label": { - "maxLength": 32, - "minLength": 1, - "type": "string" - }, - "prefix": { - "maxLength": 6, - "minLength": 1, - "type": "string" - }, - "size": { - "enum": [ - "small", - "medium", - "large" - ], - "type": "string" - }, - "suffix": { - "maxLength": 6, - "minLength": 1, - "type": "string" - }, - "value": { - "maximum": 999999999, - "minimum": 0, - "multipleOf": 0.01, - "type": "number" - } - }, - "required": [ - "value" - ], - "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": { - "const": "stat", - "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" - }, - { - "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": false, - "properties": { - "size": { - "enum": [ - "small", - "medium", - "large" - ], - "type": "string" - }, - "style": { - "enum": [ - "arrow", - "ring" - ], - "type": "string" - }, - "target": { - "additionalProperties": false, - "properties": { - "x": { - "maximum": 100, - "minimum": 0, - "type": "number" - }, - "y": { - "maximum": 100, - "minimum": 0, - "type": "number" - } - }, - "required": [ - "x", - "y" - ], - "type": "object" - }, - "text": { - "maxLength": 24, - "minLength": 1, - "type": "string" - } - }, - "required": [ - "target", - "style" - ], - "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": { - "const": "callout", - "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" - }, - { - "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": false, - "properties": { - "clicks": { - "items": { - "additionalProperties": false, - "properties": { - "item": { - "maximum": 3, - "minimum": 0, - "type": "integer" - }, - "quote": { - "maxLength": 200, - "minLength": 1, - "type": "string" - } - }, - "required": [ - "item" - ], - "type": "object" - }, - "maxItems": 6, - "type": "array" - }, - "items": { - "items": { - "additionalProperties": false, - "properties": { - "icon": { - "enum": [ - "phone", - "briefcase", - "user", - "clock", - "chat", - "star" - ], - "type": "string" - }, - "label": { - "maxLength": 24, - "minLength": 1, - "type": "string" - }, - "on": { - "type": "boolean" - } - }, - "required": [ - "label", - "on" - ], - "type": "object" - }, - "maxItems": 4, - "minItems": 2, - "type": "array" - }, - "size": { - "enum": [ - "small", - "medium", - "large" - ], - "type": "string" - }, - "style": { - "enum": [ - "switch", - "check" - ], - "type": "string" - } - }, - "required": [ - "items" - ], - "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": { - "const": "checklist", - "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" - }, - { - "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": false, - "properties": { - "answer_at": { - "maxLength": 200, - "minLength": 1, - "type": "string" - }, - "avatar": { - "additionalProperties": false, - "properties": { - "asset_id": { - "description": "A ready asset from list_assets, of the kind the slot takes.", - "pattern": "^ast_[a-f0-9]{32}$", - "type": "string" - } - }, - "required": [ - "asset_id" - ], - "type": "object" - }, - "banner": { - "maxLength": 32, - "minLength": 1, - "type": "string" - }, - "banner_note": { - "maxLength": 48, - "minLength": 1, - "type": "string" - }, - "caller": { - "maxLength": 24, - "minLength": 1, - "type": "string" - }, - "mask_number": { - "type": "boolean" - }, - "side": { - "enum": [ - "left", - "right" - ], - "type": "string" - }, - "size": { - "enum": [ - "small", - "medium", - "large" - ], - "type": "string" - }, - "subtitle": { - "maxLength": 32, - "minLength": 1, - "type": "string" - } - }, - "required": [ - "caller", - "answer_at" - ], - "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": { - "const": "phone_call", - "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" - }, - { - "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": false, - "properties": { - "after": { - "additionalProperties": false, - "properties": { - "asset_id": { - "description": "A ready asset from list_assets, of the kind the slot takes.", - "pattern": "^ast_[a-f0-9]{32}$", - "type": "string" - } - }, - "required": [ - "asset_id" - ], - "type": "object" - }, - "before": { - "additionalProperties": false, - "properties": { - "asset_id": { - "description": "A ready asset from list_assets, of the kind the slot takes.", - "pattern": "^ast_[a-f0-9]{32}$", - "type": "string" - } - }, - "required": [ - "asset_id" - ], - "type": "object" - }, - "labels": { - "additionalProperties": false, - "properties": { - "after": { - "maxLength": 20, - "minLength": 1, - "type": "string" - }, - "before": { - "maxLength": 20, - "minLength": 1, - "type": "string" - } - }, - "type": "object" - }, - "reveal_at": { - "maxLength": 200, - "minLength": 1, - "type": "string" - }, - "size": { - "enum": [ - "small", - "medium", - "large" - ], - "type": "string" - } - }, - "required": [ - "before", - "after", - "reveal_at" - ], - "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": { - "const": "compare", - "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" - }, - { - "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": false, - "properties": { - "app": { - "maxLength": 20, - "minLength": 1, - "type": "string" - }, - "body": { - "maxLength": 80, - "minLength": 1, - "type": "string" - }, - "icon": { - "enum": [ - "phone", - "briefcase", - "user", - "clock", - "chat", - "star" - ], - "type": "string" - }, - "size": { - "enum": [ - "small", - "medium", - "large" - ], - "type": "string" - }, - "title": { - "maxLength": 32, - "minLength": 1, - "type": "string" - } - }, - "required": [ - "app", - "title", - "body" - ], - "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": { - "const": "notification", - "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" - }, - { - "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": false, - "properties": { - "advance_at": { - "items": { - "maxLength": 200, - "minLength": 1, - "type": "string" - }, - "maxItems": 5, - "minItems": 2, - "type": "array" - }, - "size": { - "enum": [ - "small", - "medium", - "large" - ], - "type": "string" - }, - "steps": { - "items": { - "maxLength": 20, - "minLength": 1, - "type": "string" - }, - "maxItems": 5, - "minItems": 2, - "type": "array" - } - }, - "required": [ - "steps" - ], - "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": { - "const": "progress", - "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" - }, - { - "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": false, - "properties": { - "label": { - "maxLength": 32, - "minLength": 1, - "type": "string" - }, - "size": { - "enum": [ - "small", - "medium", - "large" - ], - "type": "string" - }, - "stars": { - "maximum": 5, - "minimum": 1, - "multipleOf": 0.5, - "type": "number" - } - }, - "required": [ - "stars" - ], - "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": { - "const": "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" - }, - "tts_model": { - "description": "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.", - "enum": [ - "eleven_v3", - "eleven_flash_v2_5", - "eleven_turbo_v2_5", - "eleven_v4", - "gemini-3.8-flash-tts" - ], - "type": "string" - }, - "visible_ai_label": { - "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" - }, - "voice": { - "description": "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.", - "pattern": "^[A-Za-z0-9][A-Za-z0-9_-]{0,63}$", - "type": "string" - }, - "voice_id": { - "description": "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.", - "pattern": "^[A-Za-z0-9]{16,32}$", - "type": "string" - }, - "voice_pace": { - "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" - } - }, - "type": "object" - }, - "skill": { - "const": "make_ugc", - "type": "string" - } - }, - "required": [ - "skill", - "input" - ], - "type": "object" - }, - { - "additionalProperties": false, - "properties": { - "input": { - "oneOf": [ - { - "additionalProperties": false, - "properties": { - "captions": { - "default": true, - "type": "boolean" - }, - "character_details": { - "maxLength": 400, - "minLength": 1, - "type": "string" - }, - "character_reference": { - "format": "starts_with", - "maxLength": 2048, - "pattern": "^https:\\/\\/.*", - "type": "string" - }, - "duration_seconds": { - "maximum": 90, - "minimum": 30, - "type": "number" - }, - "input_mode": { - "const": "script", - "type": "string" - }, - "scene_images": { - "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": 500, - "minLength": 1, - "type": "string" - } - }, - "required": [ - "quote" - ], - "type": "object" - } - ] - }, - "image_url": { - "format": "starts_with", - "maxLength": 2048, - "pattern": "^https:\\/\\/.*", - "type": "string" - } - }, - "required": [ - "image_url", - "anchor" - ], - "type": "object" - }, - "maxItems": 30, - "type": "array" - }, - "script": { - "maxLength": 10000, - "minLength": 1, - "type": "string" - }, - "style_reference": { - "format": "starts_with", - "maxLength": 2048, - "pattern": "^https:\\/\\/.*", - "type": "string" - }, - "voice": { - "pattern": "^[A-Za-z0-9][A-Za-z0-9_-]{0,63}$", - "type": "string" - }, - "voice_id": { - "not": {} - } - }, - "required": [ - "duration_seconds", - "input_mode", - "script" - ], - "type": "object" - }, - { - "additionalProperties": false, - "properties": { - "brief": { - "maxLength": 5000, - "minLength": 1, - "type": "string" - }, - "captions": { - "default": true, - "type": "boolean" - }, - "character_details": { - "maxLength": 400, - "minLength": 1, - "type": "string" - }, - "character_reference": { - "format": "starts_with", - "maxLength": 2048, - "pattern": "^https:\\/\\/.*", - "type": "string" - }, - "duration_seconds": { - "maximum": 90, - "minimum": 30, - "type": "number" - }, - "input_mode": { - "const": "brief", - "type": "string" - }, - "scene_images": { - "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": 500, - "minLength": 1, - "type": "string" - } - }, - "required": [ - "quote" - ], - "type": "object" - } - ] - }, - "image_url": { - "format": "starts_with", - "maxLength": 2048, - "pattern": "^https:\\/\\/.*", - "type": "string" - } - }, - "required": [ - "image_url", - "anchor" - ], - "type": "object" - }, - "maxItems": 30, - "type": "array" - }, - "style_reference": { - "format": "starts_with", - "maxLength": 2048, - "pattern": "^https:\\/\\/.*", - "type": "string" - }, - "voice": { - "pattern": "^[A-Za-z0-9][A-Za-z0-9_-]{0,63}$", - "type": "string" - }, - "voice_id": { - "not": {} - } - }, - "required": [ - "duration_seconds", - "input_mode", - "brief" - ], - "type": "object" - } - ] - }, - "skill": { - "const": "make_faceless", - "type": "string" - } - }, - "required": [ - "skill", - "input" - ], - "type": "object" - } -]New value: +[ + { + "additionalProperties": false, + "properties": { + "input": { + "additionalProperties": false, + "properties": { + "actor_gender": { + "description": "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.", + "enum": [ + "female", + "male" + ], + "type": "string" + }, + "actor_id": { + "description": "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.", + "pattern": "^actor_[a-z0-9][a-z0-9_-]{0,63}$", + "type": "string" + }, + "aspect_ratio": { + "description": "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.", + "enum": [ + "9:16", + "1:1", + "16:9" + ], + "type": "string" + }, + "background": { + "enum": [ + "white", + "blur", + "contain" + ], + "type": "string" + }, + "broll_policy": { + "description": "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.", + "enum": [ + "anyone", + "no_actor", + "no_people" + ], + "type": "string" + }, + "call": { + "additionalProperties": false, + "description": "A phone call after a quote: the presenter listens, then freezes while the call plays as a phone line, with a ring first, and an in-call phone beside them shows it (a phone_call template covering the call is used instead). Needs script, a 9:16 frame and words after it. The frozen presenter and the call add production seconds, not presenter seconds, and a live-avatar still shown on the call has its own price in list_prices. Long-form qualification on the server.", + "properties": { + "after": { + "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 the call follows: the presenter stops after the quote's last word and resumes on the next one." + }, + "lines": { + "description": "The call's turns in order, from both speakers; at most 1500 characters and about 45 s in all.", + "items": { + "additionalProperties": false, + "properties": { + "speaker": { + "enum": [ + "agent", + "caller" + ], + "type": "string" + }, + "text": { + "maxLength": 400, + "minLength": 1, + "type": "string" + } + }, + "required": [ + "speaker", + "text" + ], + "type": "object" + }, + "maxItems": 12, + "minItems": 2, + "type": "array" + }, + "phone": { + "additionalProperties": false, + "description": "The in-call phone drawn over the call when no phone_call template covers it; omitted fields are +1 (305) 555-0147 with its digits after the area code masked, \"Hold This Call?\" and \"You'll be notified to pick up.\".", + "properties": { + "banner": { + "maxLength": 32, + "minLength": 1, + "type": "string" + }, + "banner_note": { + "maxLength": 48, + "minLength": 1, + "type": "string" + }, + "caller": { + "maxLength": 24, + "minLength": 1, + "type": "string" + }, + "mask_number": { + "type": "boolean" + } + }, + "type": "object" + }, + "stage": { + "additionalProperties": false, + "description": "Where the in-call phone settles and how it rises, as a reference measured them (plan_reference_remake writes it); omitted is the reference call scene's own place and rise.", + "properties": { + "enter": { + "additionalProperties": false, + "properties": { + "anchor": { + "additionalProperties": false, + "description": "When the rise starts: seconds from the call's freeze, negative before it.", + "properties": { + "id": { + "const": "freeze_start#1", + "type": "string" + }, + "offset_s": { + "maximum": 0, + "minimum": -10, + "type": "number" + } + }, + "required": [ + "id", + "offset_s" + ], + "type": "object" + }, + "displacement": { + "additionalItems": false, + "description": "Settled minus first position, in shares of width and height.", + "items": [ + { + "maximum": 1, + "minimum": -1, + "type": "number" + }, + { + "maximum": 1, + "minimum": -1, + "type": "number" + } + ], + "maxItems": 2, + "minItems": 2, + "type": "array" + }, + "duration_s": { + "maximum": 5, + "minimum": 0.1, + "type": "number" + }, + "from": { + "enum": [ + "bottom", + "lower_left", + "lower_right" + ], + "type": "string" + } + }, + "required": [ + "from", + "displacement", + "duration_s", + "anchor" + ], + "type": "object" + }, + "layer": { + "enum": [ + "behind_presenter" + ], + "type": "string" + }, + "rect": { + "additionalProperties": false, + "description": "Where the phone settles, in shares of the frame.", + "properties": { + "height": { + "maximum": 1, + "minimum": 0, + "type": "number" + }, + "left": { + "maximum": 1, + "minimum": 0, + "type": "number" + }, + "top": { + "maximum": 1, + "minimum": 0, + "type": "number" + }, + "width": { + "maximum": 1, + "minimum": 0, + "type": "number" + } + }, + "required": [ + "left", + "top", + "width", + "height" + ], + "type": "object" + }, + "rect_face": { + "additionalProperties": false, + "description": "The same place relative to the presenter's face: origin the face centre, unit the face height.", + "properties": { + "height": { + "exclusiveMinimum": 0, + "maximum": 20, + "type": "number" + }, + "left": { + "maximum": 20, + "minimum": -20, + "type": "number" + }, + "top": { + "maximum": 20, + "minimum": -20, + "type": "number" + }, + "width": { + "exclusiveMinimum": 0, + "maximum": 20, + "type": "number" + } + }, + "required": [ + "left", + "top", + "width", + "height" + ], + "type": "object" + } + }, + "required": [ + "rect" + ], + "type": "object" + }, + "voices": { + "additionalProperties": false, + "description": "Voice names from list_voices; omitted means en_female_cassidy for the agent and en_male_mark for the caller.", + "properties": { + "agent": { + "pattern": "^[A-Za-z0-9][A-Za-z0-9_-]{0,63}$", + "type": "string" + }, + "caller": { + "pattern": "^[A-Za-z0-9][A-Za-z0-9_-]{0,63}$", + "type": "string" + } + }, + "type": "object" + } + }, + "required": [ + "after", + "lines" + ], + "type": "object" + }, + "caption_emphasis": { + "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 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.", + "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" + }, + "caption_mode": { + "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" + }, + "caption_position": { + "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" + }, + "caption_style": { + "default": "hormozi", + "description": "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", + "enum": [ + "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" + ], + "type": "string" + }, + "captions": { + "default": false, + "description": "Burn word-timed captions into the video, over the presenter and over inserts. Not available with segments.", + "type": "boolean" + }, + "edit_sounds": { + "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" + }, + "framing": { + "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" + }, + "image": { + "description": "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.", + "format": "starts_with", + "maxLength": 2048, + "pattern": "^https:\\/\\/.*", + "type": "string" + }, + "inserts": { + "description": "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.", + "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" + } + ] + }, + "asset_id": { + "description": "A ready PNG or JPEG image or MP4 video from your own assets (list_assets), instead of media_url. Pass exactly one of the two; media_type must match the asset's kind.", + "pattern": "^ast_[a-f0-9]{32}$", + "type": "string" + }, + "cover_words": { + "description": "How many spoken words this insert covers, counted from the first word of its anchor. Omitted means the anchored words only. The insert ends where the first uncovered word begins, so inserts whose coverage meets are adjacent frame for frame and leave no actor shot between them.", + "exclusiveMinimum": 0, + "maximum": 10000, + "type": "integer" + }, + "id": { + "pattern": "^[a-zA-Z0-9][a-zA-Z0-9_-]{0,63}$", + "type": "string" + }, + "image_motion": { + "additionalProperties": false, + "description": "Optional picture zoom. A picture always fills the frame, cut to its shape when the shapes differ (warnings[] names the share cut). amount is the zoom beyond filling: in grows from 1 to 1+amount, out shrinks from 1+amount to 1. No motion by default.", + "properties": { + "amount": { + "exclusiveMaximum": 1, + "minimum": 0, + "type": "number" + }, + "direction": { + "enum": [ + "in", + "out" + ], + "type": "string" + } + }, + "required": [ + "direction", + "amount" + ], + "type": "object" + }, + "media_type": { + "description": "image (PNG or JPEG) or video (MP4, H.264 or HEVC, 8-bit SDR). A video plays muted from its first frame and is cut where its words end; one shorter than its words holds its last frame, and warnings[] names it.", + "enum": [ + "image", + "video" + ], + "type": "string" + }, + "media_url": { + "description": "Public https URL of the media. Pass exactly one of media_url or asset_id.", + "format": "starts_with", + "maxLength": 2048, + "pattern": "^https:\\/\\/.*", + "type": "string" + }, + "transition": { + "description": "How the insert comes in and goes out: cut (default), wipe (slides across the presenter), flash (a white flash on the cut) or zoom (eases in from a closer framing). It never moves the insert's start or end.", + "enum": [ + "cut", + "wipe", + "flash", + "zoom" + ], + "type": "string" + } + }, + "required": [ + "id", + "media_type", + "anchor" + ], + "type": "object" + }, + "maxItems": 49, + "minItems": 1, + "type": "array" + }, + "layout_windows": { + "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" + }, + "look": { + "default": "natural", + "enum": [ + "natural", + "commercial", + "raw_iphone" + ], + "type": "string" + }, + "name": { + "maxLength": 100, + "type": "string" + }, + "overlays": { + "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" + }, + "pause_trim": { + "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" + }, + "person": { + "maxLength": 500, + "minLength": 1, + "type": "string" + }, + "presenter_framing": { + "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" + }, + "presenter_mic": { + "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" + }, + "resolution": { + "description": "Output resolution: 720p | 1080p | 4k (short side 720 / 1080 / 2160 px). Omitted means 1080p.", + "enum": [ + "720p", + "1080p", + "4k" + ], + "type": "string" + }, + "script": { + "description": "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.", + "maxLength": 10000, + "minLength": 1, + "type": "string" + }, + "segments": { + "items": { + "additionalProperties": false, + "properties": { + "duration_seconds": { + "description": "Required for an image segment; its display duration in seconds. Not accepted for actor or video segments.", + "exclusiveMinimum": 0, + "type": "number" + }, + "image_motion": { + "additionalProperties": false, + "properties": { + "amount": { + "exclusiveMaximum": 1, + "minimum": 0, + "type": "number" + }, + "direction": { + "enum": [ + "in", + "out" + ], + "type": "string" + } + }, + "required": [ + "direction", + "amount" + ], + "type": "object" + }, + "kind": { + "enum": [ + "actor", + "media" + ], + "type": "string" + }, + "media_type": { + "description": "Explicit media source type; omission means video, regardless of URL suffix. Availability follows the segments field.", + "enum": [ + "image", + "video" + ], + "type": "string" + }, + "media_url": { + "format": "uri", + "maxLength": 2048, + "type": "string" + }, + "script": { + "maxLength": 10000, + "minLength": 1, + "type": "string" + } + }, + "required": [ + "kind" + ], + "type": "object" + }, + "maxItems": 5, + "minItems": 1, + "type": "array" + }, + "template_sounds": { + "anyOf": [ + { + "const": false, + "type": "boolean" + }, + { + "additionalProperties": false, + "properties": { + "answer": { + "enum": [ + "answer_confirm", + "answer_open", + "answer_pop", + "answer_select", + "pickup" + ], + "type": "string" + }, + "click": { + "enum": [ + "click_mouse", + "click_soft", + "click_crisp", + "click_light" + ], + "type": "string" + }, + "edit": { + "enum": [ + "swell_hit", + "whoosh_deep", + "whoosh_low", + "boom_low", + "sub_drop", + "riser_boom", + "riser_hit" + ], + "type": "string" + }, + "flash": { + "enum": [ + "shutter", + "glitch", + "swish" + ], + "type": "string" + }, + "hangup": { + "enum": [ + "phone" + ], + "type": "string" + }, + "money": { + "enum": [ + "cash_register", + "coins" + ], + "type": "string" + }, + "notify": { + "enum": [ + "chime", + "glass_ping", + "glass_soft", + "bong", + "question_ping" + ], + "type": "string" + }, + "pop": { + "enum": [ + "plop" + ], + "type": "string" + }, + "ring": { + "enum": [ + "ring_classic", + "ring_marimba", + "ring_digital", + "ring_double" + ], + "type": "string" + }, + "step": { + "enum": [ + "drop", + "drop_high", + "tick", + "pluck", + "pluck_bright" + ], + "type": "string" + }, + "toggle": { + "enum": [ + "switch_flip", + "toggle_snap", + "switch_heavy", + "switch_light" + ], + "type": "string" + }, + "whoosh": { + "enum": [ + "whoosh", + "whip", + "paper_swipe", + "sweep", + "slide_quick" + ], + "type": "string" + } + }, + "type": "object" + } + ], + "description": "Template sounds: false for none, or { beat: name } over the defaults; list_template_sounds names them." + }, + "template_theme": { + "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" + }, + "templates": { + "description": "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.", + "items": { + "oneOf": [ + { + "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": false, + "properties": { + "position": { + "enum": [ + "top", + "center", + "bottom" + ], + "type": "string" + }, + "size": { + "enum": [ + "small", + "medium", + "large" + ], + "type": "string" + }, + "text": { + "maxLength": 32, + "minLength": 1, + "type": "string" + } + }, + "required": [ + "text" + ], + "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": { + "const": "tag", + "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" + }, + { + "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": false, + "properties": { + "name": { + "maxLength": 28, + "minLength": 1, + "type": "string" + }, + "role": { + "maxLength": 36, + "minLength": 1, + "type": "string" + }, + "side": { + "enum": [ + "left", + "right" + ], + "type": "string" + }, + "size": { + "enum": [ + "small", + "medium", + "large" + ], + "type": "string" + } + }, + "required": [ + "name", + "side" + ], + "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": { + "const": "lower_third", + "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" + }, + { + "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": false, + "properties": { + "cta": { + "maxLength": 48, + "minLength": 1, + "type": "string" + }, + "site": { + "maxLength": 32, + "minLength": 1, + "type": "string" + }, + "size": { + "enum": [ + "small", + "medium", + "large" + ], + "type": "string" + } + }, + "required": [ + "site" + ], + "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": { + "const": "end_card", + "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" + }, + { + "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": false, + "properties": { + "chip": { + "maxLength": 32, + "minLength": 1, + "type": "string" + }, + "logo": { + "additionalProperties": false, + "properties": { + "asset_id": { + "description": "A ready asset from list_assets, of the kind the slot takes.", + "pattern": "^ast_[a-f0-9]{32}$", + "type": "string" + } + }, + "required": [ + "asset_id" + ], + "type": "object" + }, + "size": { + "enum": [ + "small", + "medium", + "large" + ], + "type": "string" + }, + "title": { + "maxLength": 48, + "minLength": 1, + "type": "string" + } + }, + "required": [ + "title" + ], + "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": { + "const": "title_card", + "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" + }, + { + "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": false, + "properties": { + "author": { + "maxLength": 32, + "minLength": 1, + "type": "string" + }, + "photo": { + "additionalProperties": false, + "properties": { + "asset_id": { + "description": "A ready asset from list_assets, of the kind the slot takes.", + "pattern": "^ast_[a-f0-9]{32}$", + "type": "string" + } + }, + "required": [ + "asset_id" + ], + "type": "object" + }, + "size": { + "enum": [ + "small", + "medium", + "large" + ], + "type": "string" + }, + "text": { + "maxLength": 120, + "minLength": 1, + "type": "string" + } + }, + "required": [ + "text" + ], + "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": { + "const": "quote", + "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" + }, + { + "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": false, + "properties": { + "label": { + "maxLength": 32, + "minLength": 1, + "type": "string" + }, + "prefix": { + "maxLength": 6, + "minLength": 1, + "type": "string" + }, + "size": { + "enum": [ + "small", + "medium", + "large" + ], + "type": "string" + }, + "suffix": { + "maxLength": 6, + "minLength": 1, + "type": "string" + }, + "value": { + "maximum": 999999999, + "minimum": 0, + "multipleOf": 0.01, + "type": "number" + } + }, + "required": [ + "value" + ], + "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": { + "const": "stat", + "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" + }, + { + "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": false, + "properties": { + "size": { + "enum": [ + "small", + "medium", + "large" + ], + "type": "string" + }, + "style": { + "enum": [ + "arrow", + "ring" + ], + "type": "string" + }, + "target": { + "additionalProperties": false, + "properties": { + "x": { + "maximum": 100, + "minimum": 0, + "type": "number" + }, + "y": { + "maximum": 100, + "minimum": 0, + "type": "number" + } + }, + "required": [ + "x", + "y" + ], + "type": "object" + }, + "text": { + "maxLength": 24, + "minLength": 1, + "type": "string" + } + }, + "required": [ + "target", + "style" + ], + "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": { + "const": "callout", + "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" + }, + { + "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": false, + "properties": { + "clicks": { + "items": { + "additionalProperties": false, + "properties": { + "item": { + "maximum": 3, + "minimum": 0, + "type": "integer" + }, + "quote": { + "maxLength": 200, + "minLength": 1, + "type": "string" + } + }, + "required": [ + "item" + ], + "type": "object" + }, + "maxItems": 6, + "type": "array" + }, + "items": { + "items": { + "additionalProperties": false, + "properties": { + "icon": { + "enum": [ + "phone", + "briefcase", + "user", + "clock", + "chat", + "star" + ], + "type": "string" + }, + "label": { + "maxLength": 24, + "minLength": 1, + "type": "string" + }, + "on": { + "type": "boolean" + } + }, + "required": [ + "label", + "on" + ], + "type": "object" + }, + "maxItems": 4, + "minItems": 2, + "type": "array" + }, + "size": { + "enum": [ + "small", + "medium", + "large" + ], + "type": "string" + }, + "style": { + "enum": [ + "switch", + "check" + ], + "type": "string" + } + }, + "required": [ + "items" + ], + "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": { + "const": "checklist", + "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" + }, + { + "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": false, + "properties": { + "answer_at": { + "maxLength": 200, + "minLength": 1, + "type": "string" + }, + "avatar": { + "additionalProperties": false, + "properties": { + "asset_id": { + "description": "A ready asset from list_assets, of the kind the slot takes.", + "pattern": "^ast_[a-f0-9]{32}$", + "type": "string" + } + }, + "required": [ + "asset_id" + ], + "type": "object" + }, + "banner": { + "maxLength": 32, + "minLength": 1, + "type": "string" + }, + "banner_note": { + "maxLength": 48, + "minLength": 1, + "type": "string" + }, + "caller": { + "maxLength": 24, + "minLength": 1, + "type": "string" + }, + "mask_number": { + "type": "boolean" + }, + "side": { + "enum": [ + "left", + "right" + ], + "type": "string" + }, + "size": { + "enum": [ + "small", + "medium", + "large" + ], + "type": "string" + }, + "subtitle": { + "maxLength": 32, + "minLength": 1, + "type": "string" + } + }, + "required": [ + "caller", + "answer_at" + ], + "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": { + "const": "phone_call", + "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" + }, + { + "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": false, + "properties": { + "after": { + "additionalProperties": false, + "properties": { + "asset_id": { + "description": "A ready asset from list_assets, of the kind the slot takes.", + "pattern": "^ast_[a-f0-9]{32}$", + "type": "string" + } + }, + "required": [ + "asset_id" + ], + "type": "object" + }, + "before": { + "additionalProperties": false, + "properties": { + "asset_id": { + "description": "A ready asset from list_assets, of the kind the slot takes.", + "pattern": "^ast_[a-f0-9]{32}$", + "type": "string" + } + }, + "required": [ + "asset_id" + ], + "type": "object" + }, + "labels": { + "additionalProperties": false, + "properties": { + "after": { + "maxLength": 20, + "minLength": 1, + "type": "string" + }, + "before": { + "maxLength": 20, + "minLength": 1, + "type": "string" + } + }, + "type": "object" + }, + "reveal_at": { + "maxLength": 200, + "minLength": 1, + "type": "string" + }, + "size": { + "enum": [ + "small", + "medium", + "large" + ], + "type": "string" + } + }, + "required": [ + "before", + "after", + "reveal_at" + ], + "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": { + "const": "compare", + "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" + }, + { + "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": false, + "properties": { + "app": { + "maxLength": 20, + "minLength": 1, + "type": "string" + }, + "body": { + "maxLength": 80, + "minLength": 1, + "type": "string" + }, + "icon": { + "enum": [ + "phone", + "briefcase", + "user", + "clock", + "chat", + "star" + ], + "type": "string" + }, + "size": { + "enum": [ + "small", + "medium", + "large" + ], + "type": "string" + }, + "title": { + "maxLength": 32, + "minLength": 1, + "type": "string" + } + }, + "required": [ + "app", + "title", + "body" + ], + "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": { + "const": "notification", + "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" + }, + { + "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": false, + "properties": { + "advance_at": { + "items": { + "maxLength": 200, + "minLength": 1, + "type": "string" + }, + "maxItems": 5, + "minItems": 2, + "type": "array" + }, + "size": { + "enum": [ + "small", + "medium", + "large" + ], + "type": "string" + }, + "steps": { + "items": { + "maxLength": 20, + "minLength": 1, + "type": "string" + }, + "maxItems": 5, + "minItems": 2, + "type": "array" + } + }, + "required": [ + "steps" + ], + "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": { + "const": "progress", + "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" + }, + { + "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": false, + "properties": { + "label": { + "maxLength": 32, + "minLength": 1, + "type": "string" + }, + "size": { + "enum": [ + "small", + "medium", + "large" + ], + "type": "string" + }, + "stars": { + "maximum": 5, + "minimum": 1, + "multipleOf": 0.5, + "type": "number" + } + }, + "required": [ + "stars" + ], + "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": { + "const": "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" + }, + "tts_model": { + "description": "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.", + "enum": [ + "eleven_v3", + "eleven_flash_v2_5", + "eleven_turbo_v2_5", + "eleven_v4", + "gemini-3.8-flash-tts" + ], + "type": "string" + }, + "visible_ai_label": { + "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" + }, + "voice": { + "description": "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.", + "pattern": "^[A-Za-z0-9][A-Za-z0-9_-]{0,63}$", + "type": "string" + }, + "voice_id": { + "description": "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.", + "pattern": "^[A-Za-z0-9]{16,32}$", + "type": "string" + }, + "voice_pace": { + "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" + } + }, + "type": "object" + }, + "skill": { + "const": "make_ugc", + "type": "string" + } + }, + "required": [ + "skill", + "input" + ], + "type": "object" + }, + { + "additionalProperties": false, + "properties": { + "input": { + "oneOf": [ + { + "additionalProperties": false, + "properties": { + "captions": { + "default": true, + "type": "boolean" + }, + "character_details": { + "maxLength": 400, + "minLength": 1, + "type": "string" + }, + "character_reference": { + "format": "starts_with", + "maxLength": 2048, + "pattern": "^https:\\/\\/.*", + "type": "string" + }, + "duration_seconds": { + "maximum": 90, + "minimum": 30, + "type": "number" + }, + "input_mode": { + "const": "script", + "type": "string" + }, + "scene_images": { + "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": 500, + "minLength": 1, + "type": "string" + } + }, + "required": [ + "quote" + ], + "type": "object" + } + ] + }, + "image_url": { + "format": "starts_with", + "maxLength": 2048, + "pattern": "^https:\\/\\/.*", + "type": "string" + } + }, + "required": [ + "image_url", + "anchor" + ], + "type": "object" + }, + "maxItems": 30, + "type": "array" + }, + "script": { + "maxLength": 10000, + "minLength": 1, + "type": "string" + }, + "style_reference": { + "format": "starts_with", + "maxLength": 2048, + "pattern": "^https:\\/\\/.*", + "type": "string" + }, + "voice": { + "pattern": "^[A-Za-z0-9][A-Za-z0-9_-]{0,63}$", + "type": "string" + }, + "voice_id": { + "not": {} + } + }, + "required": [ + "duration_seconds", + "input_mode", + "script" + ], + "type": "object" + }, + { + "additionalProperties": false, + "properties": { + "brief": { + "maxLength": 5000, + "minLength": 1, + "type": "string" + }, + "captions": { + "default": true, + "type": "boolean" + }, + "character_details": { + "maxLength": 400, + "minLength": 1, + "type": "string" + }, + "character_reference": { + "format": "starts_with", + "maxLength": 2048, + "pattern": "^https:\\/\\/.*", + "type": "string" + }, + "duration_seconds": { + "maximum": 90, + "minimum": 30, + "type": "number" + }, + "input_mode": { + "const": "brief", + "type": "string" + }, + "scene_images": { + "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": 500, + "minLength": 1, + "type": "string" + } + }, + "required": [ + "quote" + ], + "type": "object" + } + ] + }, + "image_url": { + "format": "starts_with", + "maxLength": 2048, + "pattern": "^https:\\/\\/.*", + "type": "string" + } + }, + "required": [ + "image_url", + "anchor" + ], + "type": "object" + }, + "maxItems": 30, + "type": "array" + }, + "style_reference": { + "format": "starts_with", + "maxLength": 2048, + "pattern": "^https:\\/\\/.*", + "type": "string" + }, + "voice": { + "pattern": "^[A-Za-z0-9][A-Za-z0-9_-]{0,63}$", + "type": "string" + }, + "voice_id": { + "not": {} + } + }, + "required": [ + "duration_seconds", + "input_mode", + "brief" + ], + "type": "object" + } + ] + }, + "skill": { + "const": "make_faceless", + "type": "string" + } + }, + "required": [ + "skill", + "input" + ], + "type": "object" + } +] - added
Input schema / properties / document / properties / brief / properties / reference_profile / properties / beats / items / properties / graphics / items / properties / label_hint / descriptionAdded value: +"What the vision pass saw on it, in its words, such as \"Blue banner 'DEVELOP THE STORY'\"; empty when it gave none." - changed
Input schema / properties / document / properties / brief / properties / reference_profile / properties / beats / items / properties / graphics / items / properties / source_kind / enumPrevious value: -[ - "toggle_checklist", - "phone_call", - "notification", - "before_after_split", - "split_screen", - "stat", - "product_ui", - "screenshot", - "title_card", - "end_card", - "particles", - "tag", - "lower_third", - "quote", - "callout", - "checklist", - "compare", - "progress", - "rating", - "overlay_media", - "insert_media", - "layout_split", - "unmapped", - "other" -]New value: +[ + "toggle_checklist", + "phone_call", + "notification", + "before_after_split", + "split_screen", + "stat", + "product_ui", + "screenshot", + "title_card", + "end_card", + "particles", + "banner", + "logo_card", + "comment_box", + "price_card", + "concept_card", + "tag", + "lower_third", + "quote", + "callout", + "checklist", + "compare", + "progress", + "rating", + "overlay_media", + "insert_media", + "layout_split", + "unmapped", + "other" +] - added
Input schema / properties / document / properties / brief / properties / reference_profile / properties / beats / items / properties / spoken_summary / descriptionAdded value: +"The words spoken in the beat, cut at 200 characters; empty when none were heard." - added
Input schema / properties / document / properties / brief / properties / reference_profile / properties / hookAdded value: +{ + "additionalProperties": false, + "properties": { + "caption": { + "description": "The first on-screen caption line the vision pass read inside the hook's window.", + "maxLength": 120, + "type": "string" + }, + "end_s": { + "description": "Where the hook's last word ends, else where its window does.", + "minimum": 0, + "type": "number" + }, + "text": { + "description": "The words that start in the first 3 s, through the end of their sentence (no word starting past 6 s); empty when none do.", + "maxLength": 200, + "type": "string" + } + }, + "required": [ + "text", + "end_s" + ], + "type": "object" +} - changed
Input schema / properties / document / properties / brief / properties / reference_profile / properties / staging / properties / elements / items / properties / kind / enumPrevious value: -[ - "toggle_checklist", - "phone_call", - "notification", - "before_after_split", - "split_screen", - "stat", - "product_ui", - "screenshot", - "title_card", - "end_card", - "particles", - "tag", - "lower_third", - "quote", - "callout", - "checklist", - "compare", - "progress", - "rating", - "overlay_media", - "insert_media", - "layout_split", - "unmapped", - "other" -]New value: +[ + "toggle_checklist", + "phone_call", + "notification", + "before_after_split", + "split_screen", + "stat", + "product_ui", + "screenshot", + "title_card", + "end_card", + "particles", + "banner", + "logo_card", + "comment_box", + "price_card", + "concept_card", + "tag", + "lower_third", + "quote", + "callout", + "checklist", + "compare", + "progress", + "rating", + "overlay_media", + "insert_media", + "layout_split", + "unmapped", + "other" +] - added
Input schema / properties / document / properties / brief / properties / reference_profile / properties / transcriptAdded value: +{ + "description": "The reference's speech as timed words, in order.", + "items": { + "additionalProperties": false, + "properties": { + "end_s": { + "minimum": 0, + "type": "number" + }, + "speaker": { + "description": "The transcription's speaker label, such as speaker_0; absent when it gave none.", + "maxLength": 40, + "minLength": 1, + "type": "string" + }, + "start_s": { + "minimum": 0, + "type": "number" + }, + "text": { + "maxLength": 64, + "minLength": 1, + "type": "string" + } + }, + "required": [ + "text", + "start_s", + "end_s" + ], + "type": "object" + }, + "maxItems": 1000, + "type": "array" +}
- Changed
quote_analysis3 fields changed- added
Input schema / properties / modeAdded value: +{ + "description": "full (default, 70 credits): the reference_profile. data (10 credits): duration, size, timed transcript, hook and a 3×3 frame sheet, without the vision pass", + "enum": [ + "full", + "data" + ], + "type": "string" +} - added
Input schema / properties / source_urlAdded value: +{ + "description": "instead of asset_id: an Instagram reel or post link (instagram.com/reel/<code>, /reels/<code>, /p/<code>) or a TikTok video link (tiktok.com/@<user>/video/<id>, vm.tiktok.com/<code>); YouTube is refused", + "format": "starts_with", + "maxLength": 2048, + "pattern": "^https:\\/\\/.*", + "type": "string" +} - removed
Input schema / requiredRemoved value: -[ - "asset_id" -]
- Changed
quote_faceless1 field changed- changed
Input schema / properties / duration_seconds / descriptionPrevious value: -"Selected length, 30 to 90 seconds, on a 1/25 s frame boundary. The video ends with its narration, runs at least 25 seconds and may exceed the selection by up to a quarter, never beyond 90 seconds; a video more than 5 seconds longer says so in warnings[]. The charge never exceeds the quote. A script is accepted when its estimated length is 21 seconds to the selection plus 5, at most 90."New value: +"Selected length, 30 to 90 seconds, on a 1/25 s frame boundary. The video ends with its narration and runs at least 25 seconds, usually at most a quarter past the selection and 90 seconds; when the narration takes longer, the video runs to its end. A video more than 5 seconds longer than the selection says so in warnings[]. The charge never exceeds the quote. A script is accepted when its estimated length is 21 seconds to the selection plus 5, at most 90."
- Changed
quote_ugc2 fields changed- changed
Input schema / properties / aspect_ratio / descriptionPrevious 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." - changed
Input schema / properties / voice / descriptionPrevious 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."
- Added
send_feedback
11 tool updates
v0.35.0- Added
analyze_reference - Changed
create_actor8 fields changed- changed
Input schema / properties / approximate_age / descriptionPrevious value: -"Approximate age in years, 18 to 90: actors are adults."New value: +"Approximate age in years, 18 to 90: actors are adults. Required unless from_actor_id is given." - changed
Input schema / properties / description / descriptionPrevious value: -"Words describing a fictional adult: appearance, clothing, setting. Naming a real person or a likeness to one is refused before any charge (actor_prompt_refused)."New value: +"Words describing a fictional adult: appearance, clothing, setting. Naming a real person or a likeness to one is refused before any charge (actor_prompt_refused). Required unless from_actor_id is given." - added
Input schema / properties / framingAdded value: +{ + "description": "wide: the camera further back, the head lower with room above; make_ugc then renders it as a wide view.", + "enum": [ + "wide" + ], + "type": "string" +} - added
Input schema / properties / from_actor_idAdded value: +{ + "description": "Derive a new personal actor from this one (a library actor or your own): the same face, gender and age, with the view changed by framing, holding or setting. Omit description, gender and approximate_age.", + "pattern": "^actor_[a-z0-9][a-z0-9_-]{0,63}$", + "type": "string" +} - changed
Input schema / properties / gender / descriptionPrevious value: -"female | male. Fixes the actor's gender and the default voice of videos with this actor."New value: +"female | male. Fixes the actor's gender and the default voice of videos with this actor. Required unless from_actor_id is given." - added
Input schema / properties / holdingAdded value: +{ + "description": "Up to 2 objects the presenter holds, one per hand.", + "items": { + "additionalProperties": false, + "properties": { + "description": { + "description": "The object, e.g. \"a white coffee mug\".", + "maxLength": 200, + "minLength": 1, + "type": "string" + }, + "hand": { + "description": "left | right; omitted lets the edit choose.", + "enum": [ + "left", + "right" + ], + "type": "string" + }, + "reference": { + "additionalProperties": false, + "description": "A PNG or JPEG picture of the object: an image asset of this account (upload, URL import or a found picture, rights_confirmed).", + "properties": { + "asset_id": { + "pattern": "^ast_[a-f0-9]{32}$", + "type": "string" + } + }, + "required": [ + "asset_id" + ], + "type": "object" + } + }, + "required": [ + "description" + ], + "type": "object" + }, + "maxItems": 2, + "minItems": 1, + "type": "array" +} - added
Input schema / properties / settingAdded value: +{ + "description": "The room or background to put the presenter in, in words.", + "maxLength": 300, + "minLength": 1, + "type": "string" +} - changed
Input schema / requiredPrevious value: -[ - "description", - "gender", - "approximate_age", - "name" -]New value: +[ + "name" +]
- Changed
create_asset1 field changed- added
Input schema / properties / analysis_onlyAdded value: +{ + "const": true, + "description": "Keep it for analyze_reference only, without rights_confirmed: it never reaches a render or a generation.", + "type": "boolean" +}
- Added
get_reference_analysis - Added
list_prices - Changed
make_ugc14 fields changed- added
Input schema / properties / callAdded 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" +} - changed
Input schema / properties / caption_emphasis / descriptionPrevious 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." - added
Input schema / properties / caption_positionAdded 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" +} - changed
Input schema / properties / caption_style / descriptionPrevious 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" - changed
Input schema / properties / caption_style / enumPrevious 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" +] - added
Input schema / properties / edit_soundsAdded 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" +} - added
Input schema / properties / framingAdded 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" +} - added
Input schema / properties / pause_trimAdded 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" +} - added
Input schema / properties / presenter_framingAdded 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" +} - added
Input schema / properties / presenter_micAdded 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" +} - changed
Input schema / properties / script / descriptionPrevious 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." - changed
Input schema / properties / templates / descriptionPrevious 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." - changed
Input schema / properties / tts_model / descriptionPrevious 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." - added
Input schema / properties / voice_paceAdded 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" +}
- Added
plan_reference_remake - Changed
prepare_workflow_plan3 fields changed- changed
Input schema / properties / document / properties / brief / properties / native / oneOfPrevious value: -[ - { - "additionalProperties": false, - "properties": { - "input": { - "additionalProperties": false, - "properties": { - "actor_gender": { - "description": "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.", - "enum": [ - "female", - "male" - ], - "type": "string" - }, - "actor_id": { - "description": "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.", - "pattern": "^actor_[a-z0-9][a-z0-9_-]{0,63}$", - "type": "string" - }, - "aspect_ratio": { - "description": "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.", - "enum": [ - "9:16", - "1:1", - "16:9" - ], - "type": "string" - }, - "background": { - "enum": [ - "white", - "blur", - "contain" - ], - "type": "string" - }, - "broll_policy": { - "description": "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.", - "enum": [ - "anyone", - "no_actor", - "no_people" - ], - "type": "string" - }, - "caption_emphasis": { - "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" - }, - "caption_mode": { - "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" - }, - "caption_style": { - "default": "hormozi", - "description": "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.", - "enum": [ - "hormozi", - "tiktok", - "youtube", - "instagram", - "minimalist", - "neon", - "genz", - "campfire", - "midnight", - "plottwist", - "headline", - "promo", - "lecture", - "highlighter", - "studio", - "broadcast", - "arcade", - "clutch", - "bubblegum", - "crayon", - "lyrics", - "bassdrop", - "punch", - "minimal" - ], - "type": "string" - }, - "captions": { - "default": false, - "description": "Burn word-timed captions into the video, over the presenter and over inserts. Not available with segments.", - "type": "boolean" - }, - "image": { - "description": "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.", - "format": "starts_with", - "maxLength": 2048, - "pattern": "^https:\\/\\/.*", - "type": "string" - }, - "inserts": { - "description": "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.", - "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" - } - ] - }, - "asset_id": { - "description": "A ready PNG or JPEG image or MP4 video from your own assets (list_assets), instead of media_url. Pass exactly one of the two; media_type must match the asset's kind.", - "pattern": "^ast_[a-f0-9]{32}$", - "type": "string" - }, - "cover_words": { - "description": "How many spoken words this insert covers, counted from the first word of its anchor. Omitted means the anchored words only. The insert ends where the first uncovered word begins, so inserts whose coverage meets are adjacent frame for frame and leave no actor shot between them.", - "exclusiveMinimum": 0, - "maximum": 10000, - "type": "integer" - }, - "id": { - "pattern": "^[a-zA-Z0-9][a-zA-Z0-9_-]{0,63}$", - "type": "string" - }, - "image_motion": { - "additionalProperties": false, - "description": "Optional picture zoom. A picture always fills the frame, cut to its shape when the shapes differ (warnings[] names the share cut). amount is the zoom beyond filling: in grows from 1 to 1+amount, out shrinks from 1+amount to 1. No motion by default.", - "properties": { - "amount": { - "exclusiveMaximum": 1, - "minimum": 0, - "type": "number" - }, - "direction": { - "enum": [ - "in", - "out" - ], - "type": "string" - } - }, - "required": [ - "direction", - "amount" - ], - "type": "object" - }, - "media_type": { - "description": "image (PNG or JPEG) or video (MP4, H.264 or HEVC, 8-bit SDR). A video plays muted from its first frame and is cut where its words end; one shorter than its words holds its last frame, and warnings[] names it.", - "enum": [ - "image", - "video" - ], - "type": "string" - }, - "media_url": { - "description": "Public https URL of the media. Pass exactly one of media_url or asset_id.", - "format": "starts_with", - "maxLength": 2048, - "pattern": "^https:\\/\\/.*", - "type": "string" - }, - "transition": { - "description": "How the insert comes in and goes out: cut (default), wipe (slides across the presenter), flash (a white flash on the cut) or zoom (eases in from a closer framing). It never moves the insert's start or end.", - "enum": [ - "cut", - "wipe", - "flash", - "zoom" - ], - "type": "string" - } - }, - "required": [ - "id", - "media_type", - "anchor" - ], - "type": "object" - }, - "maxItems": 49, - "minItems": 1, - "type": "array" - }, - "layout_windows": { - "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" - }, - "look": { - "default": "natural", - "enum": [ - "natural", - "commercial", - "raw_iphone" - ], - "type": "string" - }, - "name": { - "maxLength": 100, - "type": "string" - }, - "overlays": { - "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" - }, - "person": { - "maxLength": 500, - "minLength": 1, - "type": "string" - }, - "resolution": { - "description": "Output resolution: 720p | 1080p | 4k (short side 720 / 1080 / 2160 px). Omitted means 1080p.", - "enum": [ - "720p", - "1080p", - "4k" - ], - "type": "string" - }, - "script": { - "description": "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.", - "maxLength": 10000, - "minLength": 1, - "type": "string" - }, - "segments": { - "items": { - "additionalProperties": false, - "properties": { - "duration_seconds": { - "description": "Required for an image segment; its display duration in seconds. Not accepted for actor or video segments.", - "exclusiveMinimum": 0, - "type": "number" - }, - "image_motion": { - "additionalProperties": false, - "properties": { - "amount": { - "exclusiveMaximum": 1, - "minimum": 0, - "type": "number" - }, - "direction": { - "enum": [ - "in", - "out" - ], - "type": "string" - } - }, - "required": [ - "direction", - "amount" - ], - "type": "object" - }, - "kind": { - "enum": [ - "actor", - "media" - ], - "type": "string" - }, - "media_type": { - "description": "Explicit media source type; omission means video, regardless of URL suffix. Availability follows the segments field.", - "enum": [ - "image", - "video" - ], - "type": "string" - }, - "media_url": { - "format": "uri", - "maxLength": 2048, - "type": "string" - }, - "script": { - "maxLength": 10000, - "minLength": 1, - "type": "string" - } - }, - "required": [ - "kind" - ], - "type": "object" - }, - "maxItems": 5, - "minItems": 1, - "type": "array" - }, - "template_sounds": { - "anyOf": [ - { - "const": false, - "type": "boolean" - }, - { - "additionalProperties": false, - "properties": { - "answer": { - "enum": [ - "answer_confirm", - "answer_open", - "answer_pop", - "answer_select" - ], - "type": "string" - }, - "click": { - "enum": [ - "click_mouse", - "click_soft", - "click_crisp", - "click_light" - ], - "type": "string" - }, - "flash": { - "enum": [ - "shutter", - "glitch" - ], - "type": "string" - }, - "notify": { - "enum": [ - "chime", - "glass_ping", - "glass_soft", - "bong", - "question_ping" - ], - "type": "string" - }, - "ring": { - "enum": [ - "ring_classic", - "ring_marimba", - "ring_digital" - ], - "type": "string" - }, - "step": { - "enum": [ - "drop", - "drop_high", - "tick", - "pluck", - "pluck_bright" - ], - "type": "string" - }, - "toggle": { - "enum": [ - "switch_flip", - "toggle_snap", - "switch_heavy", - "switch_light" - ], - "type": "string" - }, - "whoosh": { - "enum": [ - "whoosh", - "whip", - "paper_swipe", - "sweep" - ], - "type": "string" - } - }, - "type": "object" - } - ], - "description": "Template sounds: false for none, or { beat: name } over the defaults; list_template_sounds names them." - }, - "template_theme": { - "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" - }, - "templates": { - "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": { - "oneOf": [ - { - "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": false, - "properties": { - "position": { - "enum": [ - "top", - "center", - "bottom" - ], - "type": "string" - }, - "size": { - "enum": [ - "small", - "medium", - "large" - ], - "type": "string" - }, - "text": { - "maxLength": 32, - "minLength": 1, - "type": "string" - } - }, - "required": [ - "text" - ], - "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": { - "const": "tag", - "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" - }, - { - "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": false, - "properties": { - "name": { - "maxLength": 28, - "minLength": 1, - "type": "string" - }, - "role": { - "maxLength": 36, - "minLength": 1, - "type": "string" - }, - "side": { - "enum": [ - "left", - "right" - ], - "type": "string" - }, - "size": { - "enum": [ - "small", - "medium", - "large" - ], - "type": "string" - } - }, - "required": [ - "name", - "side" - ], - "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": { - "const": "lower_third", - "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" - }, - { - "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": false, - "properties": { - "cta": { - "maxLength": 48, - "minLength": 1, - "type": "string" - }, - "site": { - "maxLength": 32, - "minLength": 1, - "type": "string" - }, - "size": { - "enum": [ - "small", - "medium", - "large" - ], - "type": "string" - } - }, - "required": [ - "site" - ], - "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": { - "const": "end_card", - "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" - }, - { - "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": false, - "properties": { - "chip": { - "maxLength": 32, - "minLength": 1, - "type": "string" - }, - "logo": { - "additionalProperties": false, - "properties": { - "asset_id": { - "description": "A ready asset from list_assets, of the kind the slot takes.", - "pattern": "^ast_[a-f0-9]{32}$", - "type": "string" - } - }, - "required": [ - "asset_id" - ], - "type": "object" - }, - "size": { - "enum": [ - "small", - "medium", - "large" - ], - "type": "string" - }, - "title": { - "maxLength": 48, - "minLength": 1, - "type": "string" - } - }, - "required": [ - "title" - ], - "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": { - "const": "title_card", - "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" - }, - { - "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": false, - "properties": { - "author": { - "maxLength": 32, - "minLength": 1, - "type": "string" - }, - "photo": { - "additionalProperties": false, - "properties": { - "asset_id": { - "description": "A ready asset from list_assets, of the kind the slot takes.", - "pattern": "^ast_[a-f0-9]{32}$", - "type": "string" - } - }, - "required": [ - "asset_id" - ], - "type": "object" - }, - "size": { - "enum": [ - "small", - "medium", - "large" - ], - "type": "string" - }, - "text": { - "maxLength": 120, - "minLength": 1, - "type": "string" - } - }, - "required": [ - "text" - ], - "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": { - "const": "quote", - "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" - }, - { - "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": false, - "properties": { - "label": { - "maxLength": 32, - "minLength": 1, - "type": "string" - }, - "prefix": { - "maxLength": 6, - "minLength": 1, - "type": "string" - }, - "size": { - "enum": [ - "small", - "medium", - "large" - ], - "type": "string" - }, - "suffix": { - "maxLength": 6, - "minLength": 1, - "type": "string" - }, - "value": { - "maximum": 999999999, - "minimum": 0, - "multipleOf": 0.01, - "type": "number" - } - }, - "required": [ - "value" - ], - "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": { - "const": "stat", - "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" - }, - { - "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": false, - "properties": { - "size": { - "enum": [ - "small", - "medium", - "large" - ], - "type": "string" - }, - "style": { - "enum": [ - "arrow", - "ring" - ], - "type": "string" - }, - "target": { - "additionalProperties": false, - "properties": { - "x": { - "maximum": 100, - "minimum": 0, - "type": "number" - }, - "y": { - "maximum": 100, - "minimum": 0, - "type": "number" - } - }, - "required": [ - "x", - "y" - ], - "type": "object" - }, - "text": { - "maxLength": 24, - "minLength": 1, - "type": "string" - } - }, - "required": [ - "target", - "style" - ], - "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": { - "const": "callout", - "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" - }, - { - "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": false, - "properties": { - "clicks": { - "items": { - "additionalProperties": false, - "properties": { - "item": { - "maximum": 3, - "minimum": 0, - "type": "integer" - }, - "quote": { - "maxLength": 200, - "minLength": 1, - "type": "string" - } - }, - "required": [ - "item" - ], - "type": "object" - }, - "maxItems": 6, - "type": "array" - }, - "items": { - "items": { - "additionalProperties": false, - "properties": { - "icon": { - "enum": [ - "phone", - "briefcase", - "user", - "clock", - "chat", - "star" - ], - "type": "string" - }, - "label": { - "maxLength": 24, - "minLength": 1, - "type": "string" - }, - "on": { - "type": "boolean" - } - }, - "required": [ - "label", - "on" - ], - "type": "object" - }, - "maxItems": 4, - "minItems": 2, - "type": "array" - }, - "size": { - "enum": [ - "small", - "medium", - "large" - ], - "type": "string" - }, - "style": { - "enum": [ - "switch", - "check" - ], - "type": "string" - } - }, - "required": [ - "items" - ], - "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": { - "const": "checklist", - "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" - }, - { - "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": false, - "properties": { - "answer_at": { - "maxLength": 200, - "minLength": 1, - "type": "string" - }, - "avatar": { - "additionalProperties": false, - "properties": { - "asset_id": { - "description": "A ready asset from list_assets, of the kind the slot takes.", - "pattern": "^ast_[a-f0-9]{32}$", - "type": "string" - } - }, - "required": [ - "asset_id" - ], - "type": "object" - }, - "caller": { - "maxLength": 24, - "minLength": 1, - "type": "string" - }, - "side": { - "enum": [ - "left", - "right" - ], - "type": "string" - }, - "size": { - "enum": [ - "small", - "medium", - "large" - ], - "type": "string" - }, - "subtitle": { - "maxLength": 32, - "minLength": 1, - "type": "string" - } - }, - "required": [ - "caller", - "answer_at" - ], - "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": { - "const": "phone_call", - "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" - }, - { - "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": false, - "properties": { - "after": { - "additionalProperties": false, - "properties": { - "asset_id": { - "description": "A ready asset from list_assets, of the kind the slot takes.", - "pattern": "^ast_[a-f0-9]{32}$", - "type": "string" - } - }, - "required": [ - "asset_id" - ], - "type": "object" - }, - "before": { - "additionalProperties": false, - "properties": { - "asset_id": { - "description": "A ready asset from list_assets, of the kind the slot takes.", - "pattern": "^ast_[a-f0-9]{32}$", - "type": "string" - } - }, - "required": [ - "asset_id" - ], - "type": "object" - }, - "labels": { - "additionalProperties": false, - "properties": { - "after": { - "maxLength": 20, - "minLength": 1, - "type": "string" - }, - "before": { - "maxLength": 20, - "minLength": 1, - "type": "string" - } - }, - "type": "object" - }, - "reveal_at": { - "maxLength": 200, - "minLength": 1, - "type": "string" - }, - "size": { - "enum": [ - "small", - "medium", - "large" - ], - "type": "string" - } - }, - "required": [ - "before", - "after", - "reveal_at" - ], - "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": { - "const": "compare", - "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" - }, - { - "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": false, - "properties": { - "app": { - "maxLength": 20, - "minLength": 1, - "type": "string" - }, - "body": { - "maxLength": 80, - "minLength": 1, - "type": "string" - }, - "icon": { - "enum": [ - "phone", - "briefcase", - "user", - "clock", - "chat", - "star" - ], - "type": "string" - }, - "size": { - "enum": [ - "small", - "medium", - "large" - ], - "type": "string" - }, - "title": { - "maxLength": 32, - "minLength": 1, - "type": "string" - } - }, - "required": [ - "app", - "title", - "body" - ], - "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": { - "const": "notification", - "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" - }, - { - "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": false, - "properties": { - "advance_at": { - "items": { - "maxLength": 200, - "minLength": 1, - "type": "string" - }, - "maxItems": 5, - "minItems": 2, - "type": "array" - }, - "size": { - "enum": [ - "small", - "medium", - "large" - ], - "type": "string" - }, - "steps": { - "items": { - "maxLength": 20, - "minLength": 1, - "type": "string" - }, - "maxItems": 5, - "minItems": 2, - "type": "array" - } - }, - "required": [ - "steps" - ], - "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": { - "const": "progress", - "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" - }, - { - "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": false, - "properties": { - "label": { - "maxLength": 32, - "minLength": 1, - "type": "string" - }, - "size": { - "enum": [ - "small", - "medium", - "large" - ], - "type": "string" - }, - "stars": { - "maximum": 5, - "minimum": 1, - "multipleOf": 0.5, - "type": "number" - } - }, - "required": [ - "stars" - ], - "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": { - "const": "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" - }, - "tts_model": { - "description": "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.", - "enum": [ - "eleven_v3", - "eleven_flash_v2_5", - "eleven_turbo_v2_5", - "eleven_v4", - "gemini-3.8-flash-tts" - ], - "type": "string" - }, - "visible_ai_label": { - "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" - }, - "voice": { - "description": "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.", - "pattern": "^[A-Za-z0-9][A-Za-z0-9_-]{0,63}$", - "type": "string" - }, - "voice_id": { - "description": "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.", - "pattern": "^[A-Za-z0-9]{16,32}$", - "type": "string" - } - }, - "type": "object" - }, - "skill": { - "const": "make_ugc", - "type": "string" - } - }, - "required": [ - "skill", - "input" - ], - "type": "object" - }, - { - "additionalProperties": false, - "properties": { - "input": { - "oneOf": [ - { - "additionalProperties": false, - "properties": { - "captions": { - "default": true, - "type": "boolean" - }, - "character_details": { - "maxLength": 400, - "minLength": 1, - "type": "string" - }, - "character_reference": { - "format": "starts_with", - "maxLength": 2048, - "pattern": "^https:\\/\\/.*", - "type": "string" - }, - "duration_seconds": { - "maximum": 90, - "minimum": 30, - "type": "number" - }, - "input_mode": { - "const": "script", - "type": "string" - }, - "scene_images": { - "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": 500, - "minLength": 1, - "type": "string" - } - }, - "required": [ - "quote" - ], - "type": "object" - } - ] - }, - "image_url": { - "format": "starts_with", - "maxLength": 2048, - "pattern": "^https:\\/\\/.*", - "type": "string" - } - }, - "required": [ - "image_url", - "anchor" - ], - "type": "object" - }, - "maxItems": 30, - "type": "array" - }, - "script": { - "maxLength": 10000, - "minLength": 1, - "type": "string" - }, - "style_reference": { - "format": "starts_with", - "maxLength": 2048, - "pattern": "^https:\\/\\/.*", - "type": "string" - }, - "voice": { - "pattern": "^[A-Za-z0-9][A-Za-z0-9_-]{0,63}$", - "type": "string" - }, - "voice_id": { - "not": {} - } - }, - "required": [ - "duration_seconds", - "input_mode", - "script" - ], - "type": "object" - }, - { - "additionalProperties": false, - "properties": { - "brief": { - "maxLength": 5000, - "minLength": 1, - "type": "string" - }, - "captions": { - "default": true, - "type": "boolean" - }, - "character_details": { - "maxLength": 400, - "minLength": 1, - "type": "string" - }, - "character_reference": { - "format": "starts_with", - "maxLength": 2048, - "pattern": "^https:\\/\\/.*", - "type": "string" - }, - "duration_seconds": { - "maximum": 90, - "minimum": 30, - "type": "number" - }, - "input_mode": { - "const": "brief", - "type": "string" - }, - "scene_images": { - "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": 500, - "minLength": 1, - "type": "string" - } - }, - "required": [ - "quote" - ], - "type": "object" - } - ] - }, - "image_url": { - "format": "starts_with", - "maxLength": 2048, - "pattern": "^https:\\/\\/.*", - "type": "string" - } - }, - "required": [ - "image_url", - "anchor" - ], - "type": "object" - }, - "maxItems": 30, - "type": "array" - }, - "style_reference": { - "format": "starts_with", - "maxLength": 2048, - "pattern": "^https:\\/\\/.*", - "type": "string" - }, - "voice": { - "pattern": "^[A-Za-z0-9][A-Za-z0-9_-]{0,63}$", - "type": "string" - }, - "voice_id": { - "not": {} - } - }, - "required": [ - "duration_seconds", - "input_mode", - "brief" - ], - "type": "object" - } - ] - }, - "skill": { - "const": "make_faceless", - "type": "string" - } - }, - "required": [ - "skill", - "input" - ], - "type": "object" - } -]New value: +[ + { + "additionalProperties": false, + "properties": { + "input": { + "additionalProperties": false, + "properties": { + "actor_gender": { + "description": "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.", + "enum": [ + "female", + "male" + ], + "type": "string" + }, + "actor_id": { + "description": "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.", + "pattern": "^actor_[a-z0-9][a-z0-9_-]{0,63}$", + "type": "string" + }, + "aspect_ratio": { + "description": "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.", + "enum": [ + "9:16", + "1:1", + "16:9" + ], + "type": "string" + }, + "background": { + "enum": [ + "white", + "blur", + "contain" + ], + "type": "string" + }, + "broll_policy": { + "description": "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.", + "enum": [ + "anyone", + "no_actor", + "no_people" + ], + "type": "string" + }, + "call": { + "additionalProperties": false, + "description": "A phone call after a quote: the presenter listens, then freezes while the call plays as a phone line, with a ring first, and an in-call phone beside them shows it (a phone_call template covering the call is used instead). Needs script, a 9:16 frame and words after it. The frozen presenter and the call add production seconds, not presenter seconds, and a live-avatar still shown on the call has its own price in list_prices. Long-form qualification on the server.", + "properties": { + "after": { + "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 the call follows: the presenter stops after the quote's last word and resumes on the next one." + }, + "lines": { + "description": "The call's turns in order, from both speakers; at most 1500 characters and about 45 s in all.", + "items": { + "additionalProperties": false, + "properties": { + "speaker": { + "enum": [ + "agent", + "caller" + ], + "type": "string" + }, + "text": { + "maxLength": 400, + "minLength": 1, + "type": "string" + } + }, + "required": [ + "speaker", + "text" + ], + "type": "object" + }, + "maxItems": 12, + "minItems": 2, + "type": "array" + }, + "phone": { + "additionalProperties": false, + "description": "The in-call phone drawn over the call when no phone_call template covers it; omitted fields are +1 (305) 555-0147 with its digits after the area code masked, \"Hold This Call?\" and \"You'll be notified to pick up.\".", + "properties": { + "banner": { + "maxLength": 32, + "minLength": 1, + "type": "string" + }, + "banner_note": { + "maxLength": 48, + "minLength": 1, + "type": "string" + }, + "caller": { + "maxLength": 24, + "minLength": 1, + "type": "string" + }, + "mask_number": { + "type": "boolean" + } + }, + "type": "object" + }, + "stage": { + "additionalProperties": false, + "description": "Where the in-call phone settles and how it rises, as a reference measured them (plan_reference_remake writes it); omitted is the reference call scene's own place and rise.", + "properties": { + "enter": { + "additionalProperties": false, + "properties": { + "anchor": { + "additionalProperties": false, + "description": "When the rise starts: seconds from the call's freeze, negative before it.", + "properties": { + "id": { + "const": "freeze_start#1", + "type": "string" + }, + "offset_s": { + "maximum": 0, + "minimum": -10, + "type": "number" + } + }, + "required": [ + "id", + "offset_s" + ], + "type": "object" + }, + "displacement": { + "additionalItems": false, + "description": "Settled minus first position, in shares of width and height.", + "items": [ + { + "maximum": 1, + "minimum": -1, + "type": "number" + }, + { + "maximum": 1, + "minimum": -1, + "type": "number" + } + ], + "maxItems": 2, + "minItems": 2, + "type": "array" + }, + "duration_s": { + "maximum": 5, + "minimum": 0.1, + "type": "number" + }, + "from": { + "enum": [ + "bottom", + "lower_left", + "lower_right" + ], + "type": "string" + } + }, + "required": [ + "from", + "displacement", + "duration_s", + "anchor" + ], + "type": "object" + }, + "layer": { + "enum": [ + "behind_presenter" + ], + "type": "string" + }, + "rect": { + "additionalProperties": false, + "description": "Where the phone settles, in shares of the frame.", + "properties": { + "height": { + "maximum": 1, + "minimum": 0, + "type": "number" + }, + "left": { + "maximum": 1, + "minimum": 0, + "type": "number" + }, + "top": { + "maximum": 1, + "minimum": 0, + "type": "number" + }, + "width": { + "maximum": 1, + "minimum": 0, + "type": "number" + } + }, + "required": [ + "left", + "top", + "width", + "height" + ], + "type": "object" + }, + "rect_face": { + "additionalProperties": false, + "description": "The same place relative to the presenter's face: origin the face centre, unit the face height.", + "properties": { + "height": { + "exclusiveMinimum": 0, + "maximum": 20, + "type": "number" + }, + "left": { + "maximum": 20, + "minimum": -20, + "type": "number" + }, + "top": { + "maximum": 20, + "minimum": -20, + "type": "number" + }, + "width": { + "exclusiveMinimum": 0, + "maximum": 20, + "type": "number" + } + }, + "required": [ + "left", + "top", + "width", + "height" + ], + "type": "object" + } + }, + "required": [ + "rect" + ], + "type": "object" + }, + "voices": { + "additionalProperties": false, + "description": "Voice names from list_voices; omitted means en_female_cassidy for the agent and en_male_mark for the caller.", + "properties": { + "agent": { + "pattern": "^[A-Za-z0-9][A-Za-z0-9_-]{0,63}$", + "type": "string" + }, + "caller": { + "pattern": "^[A-Za-z0-9][A-Za-z0-9_-]{0,63}$", + "type": "string" + } + }, + "type": "object" + } + }, + "required": [ + "after", + "lines" + ], + "type": "object" + }, + "caption_emphasis": { + "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 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.", + "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" + }, + "caption_mode": { + "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" + }, + "caption_position": { + "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" + }, + "caption_style": { + "default": "hormozi", + "description": "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", + "enum": [ + "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" + ], + "type": "string" + }, + "captions": { + "default": false, + "description": "Burn word-timed captions into the video, over the presenter and over inserts. Not available with segments.", + "type": "boolean" + }, + "edit_sounds": { + "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" + }, + "framing": { + "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" + }, + "image": { + "description": "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.", + "format": "starts_with", + "maxLength": 2048, + "pattern": "^https:\\/\\/.*", + "type": "string" + }, + "inserts": { + "description": "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.", + "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" + } + ] + }, + "asset_id": { + "description": "A ready PNG or JPEG image or MP4 video from your own assets (list_assets), instead of media_url. Pass exactly one of the two; media_type must match the asset's kind.", + "pattern": "^ast_[a-f0-9]{32}$", + "type": "string" + }, + "cover_words": { + "description": "How many spoken words this insert covers, counted from the first word of its anchor. Omitted means the anchored words only. The insert ends where the first uncovered word begins, so inserts whose coverage meets are adjacent frame for frame and leave no actor shot between them.", + "exclusiveMinimum": 0, + "maximum": 10000, + "type": "integer" + }, + "id": { + "pattern": "^[a-zA-Z0-9][a-zA-Z0-9_-]{0,63}$", + "type": "string" + }, + "image_motion": { + "additionalProperties": false, + "description": "Optional picture zoom. A picture always fills the frame, cut to its shape when the shapes differ (warnings[] names the share cut). amount is the zoom beyond filling: in grows from 1 to 1+amount, out shrinks from 1+amount to 1. No motion by default.", + "properties": { + "amount": { + "exclusiveMaximum": 1, + "minimum": 0, + "type": "number" + }, + "direction": { + "enum": [ + "in", + "out" + ], + "type": "string" + } + }, + "required": [ + "direction", + "amount" + ], + "type": "object" + }, + "media_type": { + "description": "image (PNG or JPEG) or video (MP4, H.264 or HEVC, 8-bit SDR). A video plays muted from its first frame and is cut where its words end; one shorter than its words holds its last frame, and warnings[] names it.", + "enum": [ + "image", + "video" + ], + "type": "string" + }, + "media_url": { + "description": "Public https URL of the media. Pass exactly one of media_url or asset_id.", + "format": "starts_with", + "maxLength": 2048, + "pattern": "^https:\\/\\/.*", + "type": "string" + }, + "transition": { + "description": "How the insert comes in and goes out: cut (default), wipe (slides across the presenter), flash (a white flash on the cut) or zoom (eases in from a closer framing). It never moves the insert's start or end.", + "enum": [ + "cut", + "wipe", + "flash", + "zoom" + ], + "type": "string" + } + }, + "required": [ + "id", + "media_type", + "anchor" + ], + "type": "object" + }, + "maxItems": 49, + "minItems": 1, + "type": "array" + }, + "layout_windows": { + "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" + }, + "look": { + "default": "natural", + "enum": [ + "natural", + "commercial", + "raw_iphone" + ], + "type": "string" + }, + "name": { + "maxLength": 100, + "type": "string" + }, + "overlays": { + "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" + }, + "pause_trim": { + "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" + }, + "person": { + "maxLength": 500, + "minLength": 1, + "type": "string" + }, + "presenter_framing": { + "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" + }, + "presenter_mic": { + "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" + }, + "resolution": { + "description": "Output resolution: 720p | 1080p | 4k (short side 720 / 1080 / 2160 px). Omitted means 1080p.", + "enum": [ + "720p", + "1080p", + "4k" + ], + "type": "string" + }, + "script": { + "description": "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.", + "maxLength": 10000, + "minLength": 1, + "type": "string" + }, + "segments": { + "items": { + "additionalProperties": false, + "properties": { + "duration_seconds": { + "description": "Required for an image segment; its display duration in seconds. Not accepted for actor or video segments.", + "exclusiveMinimum": 0, + "type": "number" + }, + "image_motion": { + "additionalProperties": false, + "properties": { + "amount": { + "exclusiveMaximum": 1, + "minimum": 0, + "type": "number" + }, + "direction": { + "enum": [ + "in", + "out" + ], + "type": "string" + } + }, + "required": [ + "direction", + "amount" + ], + "type": "object" + }, + "kind": { + "enum": [ + "actor", + "media" + ], + "type": "string" + }, + "media_type": { + "description": "Explicit media source type; omission means video, regardless of URL suffix. Availability follows the segments field.", + "enum": [ + "image", + "video" + ], + "type": "string" + }, + "media_url": { + "format": "uri", + "maxLength": 2048, + "type": "string" + }, + "script": { + "maxLength": 10000, + "minLength": 1, + "type": "string" + } + }, + "required": [ + "kind" + ], + "type": "object" + }, + "maxItems": 5, + "minItems": 1, + "type": "array" + }, + "template_sounds": { + "anyOf": [ + { + "const": false, + "type": "boolean" + }, + { + "additionalProperties": false, + "properties": { + "answer": { + "enum": [ + "answer_confirm", + "answer_open", + "answer_pop", + "answer_select", + "pickup" + ], + "type": "string" + }, + "click": { + "enum": [ + "click_mouse", + "click_soft", + "click_crisp", + "click_light" + ], + "type": "string" + }, + "edit": { + "enum": [ + "swell_hit", + "whoosh_deep", + "whoosh_low", + "boom_low", + "sub_drop", + "riser_boom", + "riser_hit" + ], + "type": "string" + }, + "flash": { + "enum": [ + "shutter", + "glitch", + "swish" + ], + "type": "string" + }, + "hangup": { + "enum": [ + "phone" + ], + "type": "string" + }, + "money": { + "enum": [ + "cash_register", + "coins" + ], + "type": "string" + }, + "notify": { + "enum": [ + "chime", + "glass_ping", + "glass_soft", + "bong", + "question_ping" + ], + "type": "string" + }, + "pop": { + "enum": [ + "plop" + ], + "type": "string" + }, + "ring": { + "enum": [ + "ring_classic", + "ring_marimba", + "ring_digital", + "ring_double" + ], + "type": "string" + }, + "step": { + "enum": [ + "drop", + "drop_high", + "tick", + "pluck", + "pluck_bright" + ], + "type": "string" + }, + "toggle": { + "enum": [ + "switch_flip", + "toggle_snap", + "switch_heavy", + "switch_light" + ], + "type": "string" + }, + "whoosh": { + "enum": [ + "whoosh", + "whip", + "paper_swipe", + "sweep", + "slide_quick" + ], + "type": "string" + } + }, + "type": "object" + } + ], + "description": "Template sounds: false for none, or { beat: name } over the defaults; list_template_sounds names them." + }, + "template_theme": { + "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" + }, + "templates": { + "description": "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.", + "items": { + "oneOf": [ + { + "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": false, + "properties": { + "position": { + "enum": [ + "top", + "center", + "bottom" + ], + "type": "string" + }, + "size": { + "enum": [ + "small", + "medium", + "large" + ], + "type": "string" + }, + "text": { + "maxLength": 32, + "minLength": 1, + "type": "string" + } + }, + "required": [ + "text" + ], + "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": { + "const": "tag", + "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" + }, + { + "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": false, + "properties": { + "name": { + "maxLength": 28, + "minLength": 1, + "type": "string" + }, + "role": { + "maxLength": 36, + "minLength": 1, + "type": "string" + }, + "side": { + "enum": [ + "left", + "right" + ], + "type": "string" + }, + "size": { + "enum": [ + "small", + "medium", + "large" + ], + "type": "string" + } + }, + "required": [ + "name", + "side" + ], + "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": { + "const": "lower_third", + "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" + }, + { + "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": false, + "properties": { + "cta": { + "maxLength": 48, + "minLength": 1, + "type": "string" + }, + "site": { + "maxLength": 32, + "minLength": 1, + "type": "string" + }, + "size": { + "enum": [ + "small", + "medium", + "large" + ], + "type": "string" + } + }, + "required": [ + "site" + ], + "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": { + "const": "end_card", + "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" + }, + { + "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": false, + "properties": { + "chip": { + "maxLength": 32, + "minLength": 1, + "type": "string" + }, + "logo": { + "additionalProperties": false, + "properties": { + "asset_id": { + "description": "A ready asset from list_assets, of the kind the slot takes.", + "pattern": "^ast_[a-f0-9]{32}$", + "type": "string" + } + }, + "required": [ + "asset_id" + ], + "type": "object" + }, + "size": { + "enum": [ + "small", + "medium", + "large" + ], + "type": "string" + }, + "title": { + "maxLength": 48, + "minLength": 1, + "type": "string" + } + }, + "required": [ + "title" + ], + "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": { + "const": "title_card", + "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" + }, + { + "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": false, + "properties": { + "author": { + "maxLength": 32, + "minLength": 1, + "type": "string" + }, + "photo": { + "additionalProperties": false, + "properties": { + "asset_id": { + "description": "A ready asset from list_assets, of the kind the slot takes.", + "pattern": "^ast_[a-f0-9]{32}$", + "type": "string" + } + }, + "required": [ + "asset_id" + ], + "type": "object" + }, + "size": { + "enum": [ + "small", + "medium", + "large" + ], + "type": "string" + }, + "text": { + "maxLength": 120, + "minLength": 1, + "type": "string" + } + }, + "required": [ + "text" + ], + "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": { + "const": "quote", + "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" + }, + { + "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": false, + "properties": { + "label": { + "maxLength": 32, + "minLength": 1, + "type": "string" + }, + "prefix": { + "maxLength": 6, + "minLength": 1, + "type": "string" + }, + "size": { + "enum": [ + "small", + "medium", + "large" + ], + "type": "string" + }, + "suffix": { + "maxLength": 6, + "minLength": 1, + "type": "string" + }, + "value": { + "maximum": 999999999, + "minimum": 0, + "multipleOf": 0.01, + "type": "number" + } + }, + "required": [ + "value" + ], + "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": { + "const": "stat", + "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" + }, + { + "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": false, + "properties": { + "size": { + "enum": [ + "small", + "medium", + "large" + ], + "type": "string" + }, + "style": { + "enum": [ + "arrow", + "ring" + ], + "type": "string" + }, + "target": { + "additionalProperties": false, + "properties": { + "x": { + "maximum": 100, + "minimum": 0, + "type": "number" + }, + "y": { + "maximum": 100, + "minimum": 0, + "type": "number" + } + }, + "required": [ + "x", + "y" + ], + "type": "object" + }, + "text": { + "maxLength": 24, + "minLength": 1, + "type": "string" + } + }, + "required": [ + "target", + "style" + ], + "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": { + "const": "callout", + "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" + }, + { + "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": false, + "properties": { + "clicks": { + "items": { + "additionalProperties": false, + "properties": { + "item": { + "maximum": 3, + "minimum": 0, + "type": "integer" + }, + "quote": { + "maxLength": 200, + "minLength": 1, + "type": "string" + } + }, + "required": [ + "item" + ], + "type": "object" + }, + "maxItems": 6, + "type": "array" + }, + "items": { + "items": { + "additionalProperties": false, + "properties": { + "icon": { + "enum": [ + "phone", + "briefcase", + "user", + "clock", + "chat", + "star" + ], + "type": "string" + }, + "label": { + "maxLength": 24, + "minLength": 1, + "type": "string" + }, + "on": { + "type": "boolean" + } + }, + "required": [ + "label", + "on" + ], + "type": "object" + }, + "maxItems": 4, + "minItems": 2, + "type": "array" + }, + "size": { + "enum": [ + "small", + "medium", + "large" + ], + "type": "string" + }, + "style": { + "enum": [ + "switch", + "check" + ], + "type": "string" + } + }, + "required": [ + "items" + ], + "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": { + "const": "checklist", + "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" + }, + { + "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": false, + "properties": { + "answer_at": { + "maxLength": 200, + "minLength": 1, + "type": "string" + }, + "avatar": { + "additionalProperties": false, + "properties": { + "asset_id": { + "description": "A ready asset from list_assets, of the kind the slot takes.", + "pattern": "^ast_[a-f0-9]{32}$", + "type": "string" + } + }, + "required": [ + "asset_id" + ], + "type": "object" + }, + "banner": { + "maxLength": 32, + "minLength": 1, + "type": "string" + }, + "banner_note": { + "maxLength": 48, + "minLength": 1, + "type": "string" + }, + "caller": { + "maxLength": 24, + "minLength": 1, + "type": "string" + }, + "mask_number": { + "type": "boolean" + }, + "side": { + "enum": [ + "left", + "right" + ], + "type": "string" + }, + "size": { + "enum": [ + "small", + "medium", + "large" + ], + "type": "string" + }, + "subtitle": { + "maxLength": 32, + "minLength": 1, + "type": "string" + } + }, + "required": [ + "caller", + "answer_at" + ], + "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": { + "const": "phone_call", + "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" + }, + { + "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": false, + "properties": { + "after": { + "additionalProperties": false, + "properties": { + "asset_id": { + "description": "A ready asset from list_assets, of the kind the slot takes.", + "pattern": "^ast_[a-f0-9]{32}$", + "type": "string" + } + }, + "required": [ + "asset_id" + ], + "type": "object" + }, + "before": { + "additionalProperties": false, + "properties": { + "asset_id": { + "description": "A ready asset from list_assets, of the kind the slot takes.", + "pattern": "^ast_[a-f0-9]{32}$", + "type": "string" + } + }, + "required": [ + "asset_id" + ], + "type": "object" + }, + "labels": { + "additionalProperties": false, + "properties": { + "after": { + "maxLength": 20, + "minLength": 1, + "type": "string" + }, + "before": { + "maxLength": 20, + "minLength": 1, + "type": "string" + } + }, + "type": "object" + }, + "reveal_at": { + "maxLength": 200, + "minLength": 1, + "type": "string" + }, + "size": { + "enum": [ + "small", + "medium", + "large" + ], + "type": "string" + } + }, + "required": [ + "before", + "after", + "reveal_at" + ], + "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": { + "const": "compare", + "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" + }, + { + "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": false, + "properties": { + "app": { + "maxLength": 20, + "minLength": 1, + "type": "string" + }, + "body": { + "maxLength": 80, + "minLength": 1, + "type": "string" + }, + "icon": { + "enum": [ + "phone", + "briefcase", + "user", + "clock", + "chat", + "star" + ], + "type": "string" + }, + "size": { + "enum": [ + "small", + "medium", + "large" + ], + "type": "string" + }, + "title": { + "maxLength": 32, + "minLength": 1, + "type": "string" + } + }, + "required": [ + "app", + "title", + "body" + ], + "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": { + "const": "notification", + "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" + }, + { + "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": false, + "properties": { + "advance_at": { + "items": { + "maxLength": 200, + "minLength": 1, + "type": "string" + }, + "maxItems": 5, + "minItems": 2, + "type": "array" + }, + "size": { + "enum": [ + "small", + "medium", + "large" + ], + "type": "string" + }, + "steps": { + "items": { + "maxLength": 20, + "minLength": 1, + "type": "string" + }, + "maxItems": 5, + "minItems": 2, + "type": "array" + } + }, + "required": [ + "steps" + ], + "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": { + "const": "progress", + "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" + }, + { + "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": false, + "properties": { + "label": { + "maxLength": 32, + "minLength": 1, + "type": "string" + }, + "size": { + "enum": [ + "small", + "medium", + "large" + ], + "type": "string" + }, + "stars": { + "maximum": 5, + "minimum": 1, + "multipleOf": 0.5, + "type": "number" + } + }, + "required": [ + "stars" + ], + "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": { + "const": "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" + }, + "tts_model": { + "description": "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.", + "enum": [ + "eleven_v3", + "eleven_flash_v2_5", + "eleven_turbo_v2_5", + "eleven_v4", + "gemini-3.8-flash-tts" + ], + "type": "string" + }, + "visible_ai_label": { + "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" + }, + "voice": { + "description": "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.", + "pattern": "^[A-Za-z0-9][A-Za-z0-9_-]{0,63}$", + "type": "string" + }, + "voice_id": { + "description": "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.", + "pattern": "^[A-Za-z0-9]{16,32}$", + "type": "string" + }, + "voice_pace": { + "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" + } + }, + "type": "object" + }, + "skill": { + "const": "make_ugc", + "type": "string" + } + }, + "required": [ + "skill", + "input" + ], + "type": "object" + }, + { + "additionalProperties": false, + "properties": { + "input": { + "oneOf": [ + { + "additionalProperties": false, + "properties": { + "captions": { + "default": true, + "type": "boolean" + }, + "character_details": { + "maxLength": 400, + "minLength": 1, + "type": "string" + }, + "character_reference": { + "format": "starts_with", + "maxLength": 2048, + "pattern": "^https:\\/\\/.*", + "type": "string" + }, + "duration_seconds": { + "maximum": 90, + "minimum": 30, + "type": "number" + }, + "input_mode": { + "const": "script", + "type": "string" + }, + "scene_images": { + "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": 500, + "minLength": 1, + "type": "string" + } + }, + "required": [ + "quote" + ], + "type": "object" + } + ] + }, + "image_url": { + "format": "starts_with", + "maxLength": 2048, + "pattern": "^https:\\/\\/.*", + "type": "string" + } + }, + "required": [ + "image_url", + "anchor" + ], + "type": "object" + }, + "maxItems": 30, + "type": "array" + }, + "script": { + "maxLength": 10000, + "minLength": 1, + "type": "string" + }, + "style_reference": { + "format": "starts_with", + "maxLength": 2048, + "pattern": "^https:\\/\\/.*", + "type": "string" + }, + "voice": { + "pattern": "^[A-Za-z0-9][A-Za-z0-9_-]{0,63}$", + "type": "string" + }, + "voice_id": { + "not": {} + } + }, + "required": [ + "duration_seconds", + "input_mode", + "script" + ], + "type": "object" + }, + { + "additionalProperties": false, + "properties": { + "brief": { + "maxLength": 5000, + "minLength": 1, + "type": "string" + }, + "captions": { + "default": true, + "type": "boolean" + }, + "character_details": { + "maxLength": 400, + "minLength": 1, + "type": "string" + }, + "character_reference": { + "format": "starts_with", + "maxLength": 2048, + "pattern": "^https:\\/\\/.*", + "type": "string" + }, + "duration_seconds": { + "maximum": 90, + "minimum": 30, + "type": "number" + }, + "input_mode": { + "const": "brief", + "type": "string" + }, + "scene_images": { + "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": 500, + "minLength": 1, + "type": "string" + } + }, + "required": [ + "quote" + ], + "type": "object" + } + ] + }, + "image_url": { + "format": "starts_with", + "maxLength": 2048, + "pattern": "^https:\\/\\/.*", + "type": "string" + } + }, + "required": [ + "image_url", + "anchor" + ], + "type": "object" + }, + "maxItems": 30, + "type": "array" + }, + "style_reference": { + "format": "starts_with", + "maxLength": 2048, + "pattern": "^https:\\/\\/.*", + "type": "string" + }, + "voice": { + "pattern": "^[A-Za-z0-9][A-Za-z0-9_-]{0,63}$", + "type": "string" + }, + "voice_id": { + "not": {} + } + }, + "required": [ + "duration_seconds", + "input_mode", + "brief" + ], + "type": "object" + } + ] + }, + "skill": { + "const": "make_faceless", + "type": "string" + } + }, + "required": [ + "skill", + "input" + ], + "type": "object" + } +] - added
Input schema / properties / document / properties / brief / properties / reference_profileAdded value: +{ + "additionalProperties": false, + "properties": { + "analysis": { + "additionalProperties": false, + "properties": { + "cost_usd": { + "minimum": 0, + "type": "number" + }, + "latency_ms": { + "maximum": 9007199254740991, + "minimum": 0, + "type": "integer" + }, + "models": { + "items": { + "maxLength": 60, + "minLength": 1, + "type": "string" + }, + "minItems": 1, + "type": "array" + }, + "warnings": { + "description": "What the analysis could not measure, such as the voice pass; also in warnings[].", + "items": { + "maxLength": 200, + "type": "string" + }, + "maxItems": 8, + "type": "array" + } + }, + "required": [ + "models", + "latency_ms" + ], + "type": "object" + }, + "beats": { + "items": { + "additionalProperties": false, + "properties": { + "camera": { + "enum": [ + "static", + "punch_in", + "zoom_out", + "shake", + "other" + ], + "type": "string" + }, + "end_frac": { + "maximum": 1, + "minimum": 0, + "type": "number" + }, + "end_s": { + "minimum": 0, + "type": "number" + }, + "graphics": { + "items": { + "additionalProperties": false, + "properties": { + "kind": { + "enum": [ + "tag", + "lower_third", + "end_card", + "title_card", + "quote", + "stat", + "callout", + "checklist", + "phone_call", + "compare", + "notification", + "progress", + "rating", + "overlay_media", + "insert_media", + "layout_split", + "particles", + "unmapped" + ], + "type": "string" + }, + "label_hint": { + "maxLength": 120, + "type": "string" + }, + "position": { + "enum": [ + "full_screen", + "top", + "center", + "bottom", + "top_left", + "top_right", + "bottom_left", + "bottom_right", + "split_top", + "split_bottom", + "other" + ], + "type": "string" + }, + "source_kind": { + "description": "The analyser's own word for it, or other.", + "enum": [ + "toggle_checklist", + "phone_call", + "notification", + "before_after_split", + "split_screen", + "stat", + "product_ui", + "screenshot", + "title_card", + "end_card", + "particles", + "tag", + "lower_third", + "quote", + "callout", + "checklist", + "compare", + "progress", + "rating", + "overlay_media", + "insert_media", + "layout_split", + "unmapped", + "other" + ], + "type": "string" + }, + "state_changes": { + "items": { + "additionalProperties": false, + "properties": { + "at_frac": { + "description": "Share of the beat.", + "maximum": 1, + "minimum": 0, + "type": "number" + }, + "change": { + "enum": [ + "appears", + "disappears", + "toggles_on", + "toggles_off", + "checked", + "value_changes", + "highlighted", + "other" + ], + "type": "string" + } + }, + "required": [ + "at_frac", + "change" + ], + "type": "object" + }, + "maxItems": 12, + "type": "array" + } + }, + "required": [ + "kind", + "source_kind", + "position", + "state_changes", + "label_hint" + ], + "type": "object" + }, + "maxItems": 8, + "type": "array" + }, + "presenter_behaviour": { + "enum": [ + "speaking", + "listening", + "reacting", + "absent" + ], + "type": "string" + }, + "role": { + "enum": [ + "hook", + "problem", + "agitation", + "solution", + "demo", + "proof", + "before_after", + "social_proof", + "offer", + "cta", + "other" + ], + "type": "string" + }, + "sounds": { + "items": { + "additionalProperties": false, + "properties": { + "at_frac": { + "maximum": 1, + "minimum": 0, + "type": "number" + }, + "kind": { + "enum": [ + "click", + "toggle", + "ring", + "answer", + "notify", + "step", + "whoosh", + "flash", + "pop", + "hangup", + "money", + "edit", + "music", + "recorded_audio", + "other" + ], + "type": "string" + } + }, + "required": [ + "at_frac", + "kind" + ], + "type": "object" + }, + "maxItems": 12, + "type": "array" + }, + "spoken_summary": { + "maxLength": 200, + "type": "string" + }, + "start_frac": { + "maximum": 1, + "minimum": 0, + "type": "number" + }, + "start_s": { + "description": "Seconds of the reference, kept as evidence only.", + "minimum": 0, + "type": "number" + }, + "transition_in": { + "enum": [ + "none", + "cut", + "wipe", + "flash", + "zoom", + "other" + ], + "type": "string" + } + }, + "required": [ + "start_frac", + "end_frac", + "start_s", + "end_s", + "role", + "spoken_summary", + "graphics", + "camera", + "transition_in", + "sounds", + "presenter_behaviour" + ], + "type": "object" + }, + "maxItems": 40, + "minItems": 1, + "type": "array" + }, + "captions": { + "additionalProperties": false, + "properties": { + "emphasis_style": { + "enum": [ + "punch", + "pill", + "color", + "none" + ], + "type": "string" + }, + "hidden_under_graphics": { + "type": "boolean" + }, + "position": { + "enum": [ + "top", + "middle", + "lower", + "bottom" + ], + "type": "string" + }, + "present": { + "type": "boolean" + }, + "words_per_caption_max": { + "maximum": 12, + "minimum": 1, + "type": "integer" + } + }, + "required": [ + "present", + "words_per_caption_max", + "position", + "emphasis_style", + "hidden_under_graphics" + ], + "type": "object" + }, + "format": { + "enum": [ + "talking_head_graphics", + "faceless", + "broll", + "other" + ], + "type": "string" + }, + "music": { + "maxLength": 200, + "type": "string" + }, + "pacing": { + "additionalProperties": false, + "properties": { + "face_share": { + "maximum": 1, + "minimum": 0, + "type": "number" + }, + "layer_change_every_s": { + "exclusiveMinimum": 0, + "type": "number" + } + }, + "required": [ + "layer_change_every_s", + "face_share" + ], + "type": "object" + }, + "palette": { + "items": { + "pattern": "^#[0-9A-F]{6}$", + "type": "string" + }, + "maxItems": 8, + "type": "array" + }, + "presenter_framing": { + "description": "wide: the top of the presenter's head is below ~35% of the frame height, with visible room above; close otherwise.", + "enum": [ + "close", + "wide" + ], + "type": "string" + }, + "presenter_mic": { + "description": "true when the presenter holds a small handheld or clip-on microphone in their hand while speaking (not clipped to clothing).", + "type": "boolean" + }, + "source": { + "additionalProperties": false, + "properties": { + "digest": { + "pattern": "^sha256:[0-9a-f]{64}$", + "type": "string" + }, + "duration_s": { + "exclusiveMinimum": 0, + "type": "number" + }, + "height": { + "exclusiveMinimum": 0, + "maximum": 9007199254740991, + "type": "integer" + }, + "url": { + "format": "uri", + "maxLength": 2048, + "type": "string" + }, + "width": { + "exclusiveMinimum": 0, + "maximum": 9007199254740991, + "type": "integer" + } + }, + "required": [ + "digest", + "duration_s", + "width", + "height" + ], + "type": "object" + }, + "staging": { + "additionalProperties": false, + "properties": { + "analysis_width": { + "exclusiveMinimum": 0, + "maximum": 9007199254740991, + "type": "integer" + }, + "anchors": { + "items": { + "additionalProperties": false, + "properties": { + "id": { + "pattern": "^(cut|flash|freeze_start|freeze_end|beat)#\\d+$", + "type": "string" + }, + "t_s": { + "minimum": 0, + "type": "number" + } + }, + "required": [ + "id", + "t_s" + ], + "type": "object" + }, + "maxItems": 80, + "type": "array" + }, + "elements": { + "items": { + "additionalProperties": false, + "properties": { + "beat_index": { + "maximum": 9007199254740991, + "minimum": 0, + "type": "integer" + }, + "entry": { + "additionalProperties": false, + "properties": { + "anchors": { + "items": { + "additionalProperties": false, + "properties": { + "id": { + "pattern": "^(cut|flash|freeze_start|freeze_end|beat)#\\d+$", + "type": "string" + }, + "offset_s": { + "type": "number" + } + }, + "required": [ + "id", + "offset_s" + ], + "type": "object" + }, + "maxItems": 3, + "type": "array" + }, + "displacement": { + "additionalItems": false, + "description": "Settled minus first position, in shares of width and height.", + "items": [ + { + "type": "number" + }, + { + "type": "number" + } + ], + "maxItems": 2, + "minItems": 2, + "type": "array" + }, + "duration_s": { + "minimum": 0, + "type": "number" + }, + "first_visible_s": { + "minimum": 0, + "type": "number" + }, + "from": { + "enum": [ + "left", + "right", + "top", + "bottom", + "lower_left", + "lower_right", + "upper_left", + "upper_right", + "none" + ], + "type": "string" + }, + "method": { + "enum": [ + "cv-cells/v1", + "cv-template/v1", + "cv-parallax/v1", + "cv-before-after/v1", + "yunet-native/v1", + "vision-video", + "vision-still" + ], + "type": "string" + }, + "scale_from": { + "exclusiveMinimum": 0, + "type": "number" + }, + "settled_s": { + "minimum": 0, + "type": "number" + }, + "style": { + "enum": [ + "pop", + "fade", + "blur_in", + "slide", + "scale_up", + "tilt_in", + "typewriter", + "wipe", + "unknown" + ], + "type": "string" + } + }, + "type": "object" + }, + "exit": { + "additionalProperties": false, + "properties": { + "anchors": { + "items": { + "additionalProperties": false, + "properties": { + "id": { + "pattern": "^(cut|flash|freeze_start|freeze_end|beat)#\\d+$", + "type": "string" + }, + "offset_s": { + "type": "number" + } + }, + "required": [ + "id", + "offset_s" + ], + "type": "object" + }, + "maxItems": 3, + "type": "array" + }, + "displacement": { + "additionalItems": false, + "items": [ + { + "type": "number" + }, + { + "type": "number" + } + ], + "maxItems": 2, + "minItems": 2, + "type": "array" + }, + "duration_s": { + "minimum": 0, + "type": "number" + }, + "last_visible_s": { + "minimum": 0, + "type": "number" + }, + "method": { + "enum": [ + "cv-cells/v1", + "cv-template/v1", + "cv-parallax/v1", + "cv-before-after/v1", + "yunet-native/v1", + "vision-video", + "vision-still" + ], + "type": "string" + }, + "style": { + "enum": [ + "pop", + "fade", + "blur_in", + "slide", + "scale_up", + "tilt_in", + "typewriter", + "wipe", + "unknown", + "cut", + "flash" + ], + "type": "string" + }, + "to": { + "enum": [ + "left", + "right", + "top", + "bottom", + "lower_left", + "lower_right", + "upper_left", + "upper_right", + "none" + ], + "type": "string" + } + }, + "type": "object" + }, + "graphic_index": { + "anyOf": [ + { + "maximum": 9007199254740991, + "minimum": 0, + "type": "integer" + }, + { + "type": "null" + } + ], + "description": "Its graphic in beats[beat_index].graphics; null when the beat pass missed it." + }, + "id": { + "pattern": "^[a-z0-9_]{1,24}$", + "type": "string" + }, + "kind": { + "enum": [ + "toggle_checklist", + "phone_call", + "notification", + "before_after_split", + "split_screen", + "stat", + "product_ui", + "screenshot", + "title_card", + "end_card", + "particles", + "tag", + "lower_third", + "quote", + "callout", + "checklist", + "compare", + "progress", + "rating", + "overlay_media", + "insert_media", + "layout_split", + "unmapped", + "other" + ], + "type": "string" + }, + "layer": { + "additionalProperties": false, + "properties": { + "blurs_presenter": { + "type": "boolean" + }, + "covered_by": { + "items": { + "enum": [ + "hair", + "face", + "shoulder", + "hand", + "body", + "chair", + "microphone", + "desk", + "other" + ], + "type": "string" + }, + "maxItems": 6, + "type": "array" + }, + "face_clear": { + "description": "The face core stays clear in every measured frame of the element's life.", + "type": "boolean" + }, + "face_core_cover_max": { + "description": "The largest share of the face core the element covers in any measured frame.", + "maximum": 1, + "minimum": 0, + "type": "number" + }, + "face_covered_share": { + "description": "The share of measured frames in which the element covers the face core.", + "maximum": 1, + "minimum": 0, + "type": "number" + }, + "method": { + "enum": [ + "cv-cells/v1", + "cv-template/v1", + "cv-parallax/v1", + "cv-before-after/v1", + "yunet-native/v1", + "vision-video", + "vision-still" + ], + "type": "string" + }, + "value": { + "enum": [ + "in_front_of_presenter", + "behind_presenter", + "no_overlap", + "presenter_absent", + "unknown" + ], + "type": "string" + } + }, + "required": [ + "value", + "method", + "covered_by" + ], + "type": "object" + }, + "motion": { + "additionalProperties": false, + "properties": { + "drift_per_s": { + "additionalItems": false, + "items": [ + { + "type": "number" + }, + { + "type": "number" + } + ], + "maxItems": 2, + "minItems": 2, + "type": "array" + }, + "kind": { + "enum": [ + "static", + "float", + "drift", + "scale", + "moves_with_frame", + "pushed" + ], + "type": "string" + }, + "scale_per_s": { + "type": "number" + }, + "wobble": { + "additionalProperties": false, + "properties": { + "amplitude": { + "maximum": 1, + "minimum": 0, + "type": "number" + }, + "period_s": { + "minimum": 0, + "type": "number" + } + }, + "required": [ + "amplitude", + "period_s" + ], + "type": "object" + } + }, + "type": "object" + }, + "rect_hold": { + "additionalProperties": false, + "properties": { + "height": { + "maximum": 1, + "minimum": 0, + "type": "number" + }, + "left": { + "maximum": 1, + "minimum": 0, + "type": "number" + }, + "top": { + "maximum": 1, + "minimum": 0, + "type": "number" + }, + "width": { + "maximum": 1, + "minimum": 0, + "type": "number" + } + }, + "required": [ + "left", + "top", + "width", + "height" + ], + "type": "object" + }, + "rect_hold_face": { + "additionalProperties": false, + "properties": { + "height": { + "exclusiveMinimum": 0, + "maximum": 20, + "type": "number" + }, + "left": { + "maximum": 20, + "minimum": -20, + "type": "number" + }, + "top": { + "maximum": 20, + "minimum": -20, + "type": "number" + }, + "width": { + "exclusiveMinimum": 0, + "maximum": 20, + "type": "number" + } + }, + "required": [ + "left", + "top", + "width", + "height" + ], + "type": "object" + }, + "rect_method": { + "enum": [ + "cv-cells/v1", + "cv-template/v1", + "cv-parallax/v1", + "cv-before-after/v1", + "yunet-native/v1", + "vision-video", + "vision-still" + ], + "type": "string" + }, + "rects": { + "items": { + "additionalProperties": false, + "properties": { + "rect": { + "additionalProperties": false, + "properties": { + "height": { + "maximum": 1, + "minimum": 0, + "type": "number" + }, + "left": { + "maximum": 1, + "minimum": 0, + "type": "number" + }, + "top": { + "maximum": 1, + "minimum": 0, + "type": "number" + }, + "width": { + "maximum": 1, + "minimum": 0, + "type": "number" + } + }, + "required": [ + "left", + "top", + "width", + "height" + ], + "type": "object" + }, + "t_s": { + "minimum": 0, + "type": "number" + }, + "visible": { + "maximum": 1, + "minimum": 0, + "type": "number" + } + }, + "required": [ + "t_s", + "rect", + "visible" + ], + "type": "object" + }, + "maxItems": 60, + "type": "array" + } + }, + "required": [ + "id", + "beat_index", + "graphic_index", + "kind" + ], + "type": "object" + }, + "maxItems": 40, + "type": "array" + }, + "freezes": { + "items": { + "additionalProperties": false, + "properties": { + "anchors": { + "items": { + "additionalProperties": false, + "properties": { + "id": { + "pattern": "^(cut|flash|freeze_start|freeze_end|beat)#\\d+$", + "type": "string" + }, + "offset_s": { + "type": "number" + } + }, + "required": [ + "id", + "offset_s" + ], + "type": "object" + }, + "maxItems": 3, + "type": "array" + }, + "end_s": { + "minimum": 0, + "type": "number" + }, + "ends_with": { + "enum": [ + "cut", + "flash", + "unfreeze", + "end" + ], + "type": "string" + }, + "expression": { + "enum": [ + "neutral", + "smile", + "surprised", + "thinking", + "other" + ], + "type": "string" + }, + "face_box_end": { + "additionalProperties": false, + "properties": { + "height": { + "maximum": 1, + "minimum": 0, + "type": "number" + }, + "left": { + "maximum": 1, + "minimum": 0, + "type": "number" + }, + "top": { + "maximum": 1, + "minimum": 0, + "type": "number" + }, + "width": { + "maximum": 1, + "minimum": 0, + "type": "number" + } + }, + "required": [ + "left", + "top", + "width", + "height" + ], + "type": "object" + }, + "face_box_start": { + "additionalProperties": false, + "properties": { + "height": { + "maximum": 1, + "minimum": 0, + "type": "number" + }, + "left": { + "maximum": 1, + "minimum": 0, + "type": "number" + }, + "top": { + "maximum": 1, + "minimum": 0, + "type": "number" + }, + "width": { + "maximum": 1, + "minimum": 0, + "type": "number" + } + }, + "required": [ + "left", + "top", + "width", + "height" + ], + "type": "object" + }, + "frame_motion": { + "additionalProperties": false, + "properties": { + "centre_shift": { + "additionalItems": false, + "items": [ + { + "type": "number" + }, + { + "type": "number" + } + ], + "maxItems": 2, + "minItems": 2, + "type": "array" + }, + "scale_end": { + "exclusiveMinimum": 0, + "maximum": 4, + "type": "number" + } + }, + "required": [ + "scale_end", + "centre_shift" + ], + "type": "object" + }, + "gaze": { + "enum": [ + "camera", + "up_left", + "up_right", + "left", + "right", + "down", + "element", + "closed" + ], + "type": "string" + }, + "hands": { + "enum": [ + "at_chest", + "gesturing", + "out_of_frame", + "other" + ], + "type": "string" + }, + "head_roll": { + "enum": [ + "left", + "right", + "upright" + ], + "type": "string" + }, + "pitch": { + "maximum": 3, + "minimum": 0, + "type": "number" + }, + "roll_deg": { + "maximum": 90, + "minimum": -90, + "type": "number" + }, + "start_s": { + "minimum": 0, + "type": "number" + }, + "yaw": { + "maximum": 3, + "minimum": -3, + "type": "number" + } + }, + "required": [ + "start_s", + "end_s", + "anchors", + "face_box_start", + "face_box_end", + "roll_deg", + "yaw", + "pitch", + "head_roll", + "ends_with" + ], + "type": "object" + }, + "maxItems": 8, + "type": "array" + }, + "version": { + "const": "reference-staging-v1", + "type": "string" + } + }, + "required": [ + "version", + "analysis_width", + "anchors", + "elements", + "freezes" + ], + "type": "object" + }, + "unmapped": { + "items": { + "additionalProperties": false, + "properties": { + "beat_index": { + "maximum": 9007199254740991, + "minimum": 0, + "type": "integer" + }, + "suggested_substitute": { + "maxLength": 200, + "type": "string" + }, + "what": { + "maxLength": 200, + "type": "string" + } + }, + "required": [ + "what", + "beat_index", + "suggested_substitute" + ], + "type": "object" + }, + "maxItems": 40, + "type": "array" + }, + "version": { + "const": "reference-profile-v1", + "type": "string" + }, + "voice": { + "additionalProperties": false, + "properties": { + "method": { + "additionalProperties": false, + "properties": { + "cut_safe_db": { + "exclusiveMaximum": 0, + "type": "number" + }, + "pause_drop_db": { + "exclusiveMinimum": 0, + "type": "number" + }, + "pause_min_run_s": { + "exclusiveMinimum": 0, + "type": "number" + }, + "pitch": { + "const": "yin", + "type": "string" + }, + "sample_rate": { + "exclusiveMinimum": 0, + "maximum": 9007199254740991, + "type": "integer" + } + }, + "required": [ + "pause_drop_db", + "pause_min_run_s", + "cut_safe_db", + "pitch", + "sample_rate" + ], + "type": "object" + }, + "presenter_speaker": { + "type": [ + "string", + "null" + ] + }, + "speakers": { + "items": { + "additionalProperties": false, + "properties": { + "hinge": { + "additionalProperties": false, + "properties": { + "coverage": { + "anyOf": [ + { + "maximum": 1, + "minimum": 0, + "type": "number" + }, + { + "type": "null" + } + ] + }, + "evaluated_sentences": { + "maximum": 9007199254740991, + "minimum": 0, + "type": "integer" + }, + "median_position": { + "anyOf": [ + { + "maximum": 1, + "minimum": 0, + "type": "number" + }, + { + "type": "null" + } + ], + "description": "Where the hinge falls, as the share of the sentence's words before it." + }, + "median_seconds": { + "anyOf": [ + { + "minimum": 0, + "type": "number" + }, + { + "type": "null" + } + ] + }, + "sentence_share": { + "anyOf": [ + { + "maximum": 1, + "minimum": 0, + "type": "number" + }, + { + "type": "null" + } + ], + "description": "Share of acoustically evaluated sentences with an internal pause of 150 ms or more; not all sentences." + }, + "status": { + "enum": [ + "measured", + "not_evaluated" + ], + "type": "string" + }, + "timestamp_sentence_share": { + "anyOf": [ + { + "maximum": 1, + "minimum": 0, + "type": "number" + }, + { + "type": "null" + } + ] + } + }, + "required": [ + "status", + "sentence_share", + "evaluated_sentences", + "coverage", + "timestamp_sentence_share", + "median_position", + "median_seconds" + ], + "type": "object" + }, + "long_pause_count": { + "description": "Same-speaker pauses over two seconds, kept with their punctuation kind.", + "maximum": 9007199254740991, + "minimum": 0, + "type": "integer" + }, + "loudness": { + "additionalProperties": false, + "properties": { + "range_db_p10_p90": { + "anyOf": [ + { + "minimum": 0, + "type": "number" + }, + { + "type": "null" + } + ] + }, + "status": { + "enum": [ + "measured", + "unmeasured" + ], + "type": "string" + } + }, + "required": [ + "status", + "range_db_p10_p90" + ], + "type": "object" + }, + "pace": { + "additionalProperties": false, + "properties": { + "basis": { + "enum": [ + "sentence_spans", + "turn_spans" + ], + "type": "string" + }, + "status": { + "enum": [ + "measured", + "unmeasured" + ], + "type": "string" + }, + "words_per_second": { + "anyOf": [ + { + "exclusiveMinimum": 0, + "type": "number" + }, + { + "type": "null" + } + ], + "description": "Words over the sum of sentence spans: pauses inside a sentence count, gaps between sentences and other speakers do not." + } + }, + "required": [ + "status", + "words_per_second", + "basis" + ], + "type": "object" + }, + "pauses": { + "additionalProperties": false, + "properties": { + "comma": { + "additionalProperties": false, + "properties": { + "acoustic_no_dip_count": { + "maximum": 9007199254740991, + "minimum": 0, + "type": "integer" + }, + "acoustic_pause": { + "additionalProperties": false, + "properties": { + "count": { + "maximum": 9007199254740991, + "minimum": 0, + "type": "integer" + }, + "count_ge150ms": { + "maximum": 9007199254740991, + "minimum": 0, + "type": "integer" + }, + "median_s": { + "anyOf": [ + { + "minimum": 0, + "type": "number" + }, + { + "type": "null" + } + ] + }, + "p90_s": { + "anyOf": [ + { + "minimum": 0, + "type": "number" + }, + { + "type": "null" + } + ] + } + }, + "required": [ + "count", + "median_s", + "p90_s", + "count_ge150ms" + ], + "type": "object" + }, + "acoustic_unconfirmed_count": { + "maximum": 9007199254740991, + "minimum": 0, + "type": "integer" + }, + "cut_safe": { + "additionalProperties": false, + "properties": { + "count": { + "maximum": 9007199254740991, + "minimum": 0, + "type": "integer" + }, + "count_ge150ms": { + "maximum": 9007199254740991, + "minimum": 0, + "type": "integer" + }, + "median_s": { + "anyOf": [ + { + "minimum": 0, + "type": "number" + }, + { + "type": "null" + } + ] + }, + "p90_s": { + "anyOf": [ + { + "minimum": 0, + "type": "number" + }, + { + "type": "null" + } + ] + } + }, + "required": [ + "count", + "median_s", + "p90_s", + "count_ge150ms" + ], + "type": "object" + }, + "timestamp": { + "additionalProperties": false, + "properties": { + "count": { + "maximum": 9007199254740991, + "minimum": 0, + "type": "integer" + }, + "count_ge150ms": { + "maximum": 9007199254740991, + "minimum": 0, + "type": "integer" + }, + "median_s": { + "anyOf": [ + { + "minimum": 0, + "type": "number" + }, + { + "type": "null" + } + ] + }, + "p90_s": { + "anyOf": [ + { + "minimum": 0, + "type": "number" + }, + { + "type": "null" + } + ] + } + }, + "required": [ + "count", + "median_s", + "p90_s", + "count_ge150ms" + ], + "type": "object" + } + }, + "required": [ + "timestamp", + "acoustic_pause", + "cut_safe", + "acoustic_no_dip_count", + "acoustic_unconfirmed_count" + ], + "type": "object" + }, + "mid_phrase": { + "additionalProperties": false, + "properties": { + "acoustic_no_dip_count": { + "maximum": 9007199254740991, + "minimum": 0, + "type": "integer" + }, + "acoustic_pause": { + "additionalProperties": false, + "properties": { + "count": { + "maximum": 9007199254740991, + "minimum": 0, + "type": "integer" + }, + "count_ge150ms": { + "maximum": 9007199254740991, + "minimum": 0, + "type": "integer" + }, + "median_s": { + "anyOf": [ + { + "minimum": 0, + "type": "number" + }, + { + "type": "null" + } + ] + }, + "p90_s": { + "anyOf": [ + { + "minimum": 0, + "type": "number" + }, + { + "type": "null" + } + ] + } + }, + "required": [ + "count", + "median_s", + "p90_s", + "count_ge150ms" + ], + "type": "object" + }, + "acoustic_unconfirmed_count": { + "maximum": 9007199254740991, + "minimum": 0, + "type": "integer" + }, + "cut_safe": { + "additionalProperties": false, + "properties": { + "count": { + "maximum": 9007199254740991, + "minimum": 0, + "type": "integer" + }, + "count_ge150ms": { + "maximum": 9007199254740991, + "minimum": 0, + "type": "integer" + }, + "median_s": { + "anyOf": [ + { + "minimum": 0, + "type": "number" + }, + { + "type": "null" + } + ] + }, + "p90_s": { + "anyOf": [ + { + "minimum": 0, + "type": "number" + }, + { + "type": "null" + } + ] + } + }, + "required": [ + "count", + "median_s", + "p90_s", + "count_ge150ms" + ], + "type": "object" + }, + "timestamp": { + "additionalProperties": false, + "properties": { + "count": { + "maximum": 9007199254740991, + "minimum": 0, + "type": "integer" + }, + "count_ge150ms": { + "maximum": 9007199254740991, + "minimum": 0, + "type": "integer" + }, + "median_s": { + "anyOf": [ + { + "minimum": 0, + "type": "number" + }, + { + "type": "null" + } + ] + }, + "p90_s": { + "anyOf": [ + { + "minimum": 0, + "type": "number" + }, + { + "type": "null" + } + ] + } + }, + "required": [ + "count", + "median_s", + "p90_s", + "count_ge150ms" + ], + "type": "object" + } + }, + "required": [ + "timestamp", + "acoustic_pause", + "cut_safe", + "acoustic_no_dip_count", + "acoustic_unconfirmed_count" + ], + "type": "object" + }, + "sentence_end": { + "additionalProperties": false, + "properties": { + "acoustic_no_dip_count": { + "maximum": 9007199254740991, + "minimum": 0, + "type": "integer" + }, + "acoustic_pause": { + "additionalProperties": false, + "properties": { + "count": { + "maximum": 9007199254740991, + "minimum": 0, + "type": "integer" + }, + "count_ge150ms": { + "maximum": 9007199254740991, + "minimum": 0, + "type": "integer" + }, + "median_s": { + "anyOf": [ + { + "minimum": 0, + "type": "number" + }, + { + "type": "null" + } + ] + }, + "p90_s": { + "anyOf": [ + { + "minimum": 0, + "type": "number" + }, + { + "type": "null" + } + ] + } + }, + "required": [ + "count", + "median_s", + "p90_s", + "count_ge150ms" + ], + "type": "object" + }, + "acoustic_unconfirmed_count": { + "maximum": 9007199254740991, + "minimum": 0, + "type": "integer" + }, + "cut_safe": { + "additionalProperties": false, + "properties": { + "count": { + "maximum": 9007199254740991, + "minimum": 0, + "type": "integer" + }, + "count_ge150ms": { + "maximum": 9007199254740991, + "minimum": 0, + "type": "integer" + }, + "median_s": { + "anyOf": [ + { + "minimum": 0, + "type": "number" + }, + { + "type": "null" + } + ] + }, + "p90_s": { + "anyOf": [ + { + "minimum": 0, + "type": "number" + }, + { + "type": "null" + } + ] + } + }, + "required": [ + "count", + "median_s", + "p90_s", + "count_ge150ms" + ], + "type": "object" + }, + "timestamp": { + "additionalProperties": false, + "properties": { + "count": { + "maximum": 9007199254740991, + "minimum": 0, + "type": "integer" + }, + "count_ge150ms": { + "maximum": 9007199254740991, + "minimum": 0, + "type": "integer" + }, + "median_s": { + "anyOf": [ + { + "minimum": 0, + "type": "number" + }, + { + "type": "null" + } + ] + }, + "p90_s": { + "anyOf": [ + { + "minimum": 0, + "type": "number" + }, + { + "type": "null" + } + ] + } + }, + "required": [ + "count", + "median_s", + "p90_s", + "count_ge150ms" + ], + "type": "object" + } + }, + "required": [ + "timestamp", + "acoustic_pause", + "cut_safe", + "acoustic_no_dip_count", + "acoustic_unconfirmed_count" + ], + "type": "object" + } + }, + "required": [ + "sentence_end", + "comma", + "mid_phrase" + ], + "type": "object" + }, + "pitch": { + "additionalProperties": false, + "properties": { + "ceiling_basis": { + "description": "default 400 Hz; low_f0: a median under 165 Hz at 400 is measured again at 300 Hz.", + "enum": [ + "default", + "low_f0", + "configured" + ], + "type": "string" + }, + "ceiling_hz": { + "exclusiveMinimum": 0, + "type": "number" + }, + "median_hz": { + "anyOf": [ + { + "exclusiveMinimum": 0, + "type": "number" + }, + { + "type": "null" + } + ] + }, + "p10_hz": { + "anyOf": [ + { + "exclusiveMinimum": 0, + "type": "number" + }, + { + "type": "null" + } + ] + }, + "p90_hz": { + "anyOf": [ + { + "exclusiveMinimum": 0, + "type": "number" + }, + { + "type": "null" + } + ] + }, + "range_st": { + "anyOf": [ + { + "minimum": 0, + "type": "number" + }, + { + "type": "null" + } + ] + }, + "status": { + "enum": [ + "measured", + "no_voiced_frames" + ], + "type": "string" + }, + "voiced_frames": { + "maximum": 9007199254740991, + "minimum": 0, + "type": "integer" + } + }, + "required": [ + "status", + "ceiling_hz", + "ceiling_basis", + "median_hz", + "p10_hz", + "p90_hz", + "range_st", + "voiced_frames" + ], + "type": "object" + }, + "sentence_count": { + "maximum": 9007199254740991, + "minimum": 0, + "type": "integer" + }, + "speaker": { + "description": "The transcription vendor's speaker id.", + "pattern": "^[A-Za-z0-9_-]{1,40}$", + "type": "string" + }, + "warnings": { + "items": { + "enum": [ + "no_sentence_terminal_punctuation_pace_uses_turn_spans", + "background_music_present_f0_and_intensity_may_be_contaminated" + ], + "type": "string" + }, + "maxItems": 2, + "type": "array" + }, + "word_count": { + "maximum": 9007199254740991, + "minimum": 0, + "type": "integer" + } + }, + "required": [ + "speaker", + "word_count", + "sentence_count", + "pace", + "pauses", + "long_pause_count", + "hinge", + "pitch", + "loudness", + "warnings" + ], + "type": "object" + }, + "maxItems": 6, + "minItems": 1, + "type": "array" + }, + "version": { + "const": "voice-profile-v1", + "type": "string" + } + }, + "required": [ + "version", + "method", + "presenter_speaker", + "speakers" + ], + "type": "object" + } + }, + "required": [ + "version", + "source", + "format", + "beats", + "captions", + "pacing", + "palette", + "music", + "unmapped", + "analysis" + ], + "type": "object" +} - changed
Input schema / properties / document / properties / method / properties / method_id / enumPrevious value: -[ - "ugc-product-intro", - "ugc-faq-answer", - "faceless-explainer", - "product-image-story", - "website-proof-demo", - "kinetic-launch" -]New value: +[ + "ugc-product-intro", + "ugc-faq-answer", + "faceless-explainer", + "product-image-story", + "website-proof-demo", + "kinetic-launch", + "reference-remake" +]
- Changed
quote_actor8 fields changed- changed
Input schema / properties / approximate_age / descriptionPrevious value: -"Approximate age in years, 18 to 90: actors are adults."New value: +"Approximate age in years, 18 to 90: actors are adults. Required unless from_actor_id is given." - changed
Input schema / properties / description / descriptionPrevious value: -"Words describing a fictional adult: appearance, clothing, setting. Naming a real person or a likeness to one is refused before any charge (actor_prompt_refused)."New value: +"Words describing a fictional adult: appearance, clothing, setting. Naming a real person or a likeness to one is refused before any charge (actor_prompt_refused). Required unless from_actor_id is given." - added
Input schema / properties / framingAdded value: +{ + "description": "wide: the camera further back, the head lower with room above; make_ugc then renders it as a wide view.", + "enum": [ + "wide" + ], + "type": "string" +} - added
Input schema / properties / from_actor_idAdded value: +{ + "description": "Derive a new personal actor from this one (a library actor or your own): the same face, gender and age, with the view changed by framing, holding or setting. Omit description, gender and approximate_age.", + "pattern": "^actor_[a-z0-9][a-z0-9_-]{0,63}$", + "type": "string" +} - changed
Input schema / properties / gender / descriptionPrevious value: -"female | male. Fixes the actor's gender and the default voice of videos with this actor."New value: +"female | male. Fixes the actor's gender and the default voice of videos with this actor. Required unless from_actor_id is given." - added
Input schema / properties / holdingAdded value: +{ + "description": "Up to 2 objects the presenter holds, one per hand.", + "items": { + "additionalProperties": false, + "properties": { + "description": { + "description": "The object, e.g. \"a white coffee mug\".", + "maxLength": 200, + "minLength": 1, + "type": "string" + }, + "hand": { + "description": "left | right; omitted lets the edit choose.", + "enum": [ + "left", + "right" + ], + "type": "string" + }, + "reference": { + "additionalProperties": false, + "description": "A PNG or JPEG picture of the object: an image asset of this account (upload, URL import or a found picture, rights_confirmed).", + "properties": { + "asset_id": { + "pattern": "^ast_[a-f0-9]{32}$", + "type": "string" + } + }, + "required": [ + "asset_id" + ], + "type": "object" + } + }, + "required": [ + "description" + ], + "type": "object" + }, + "maxItems": 2, + "minItems": 1, + "type": "array" +} - added
Input schema / properties / settingAdded value: +{ + "description": "The room or background to put the presenter in, in words.", + "maxLength": 300, + "minLength": 1, + "type": "string" +} - changed
Input schema / requiredPrevious value: -[ - "description", - "gender", - "approximate_age", - "name" -]New value: +[ + "name" +]
- Added
quote_analysis - Changed
quote_ugc14 fields changed- added
Input schema / properties / callAdded 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" +} - changed
Input schema / properties / caption_emphasis / descriptionPrevious 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." - added
Input schema / properties / caption_positionAdded 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" +} - changed
Input schema / properties / caption_style / descriptionPrevious 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" - changed
Input schema / properties / caption_style / enumPrevious 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" +] - added
Input schema / properties / edit_soundsAdded 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" +} - added
Input schema / properties / framingAdded 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" +} - added
Input schema / properties / pause_trimAdded 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" +} - added
Input schema / properties / presenter_framingAdded 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" +} - added
Input schema / properties / presenter_micAdded 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" +} - changed
Input schema / properties / script / descriptionPrevious 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." - changed
Input schema / properties / templates / descriptionPrevious 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." - changed
Input schema / properties / tts_model / descriptionPrevious 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." - added
Input schema / properties / voice_paceAdded 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" +}
7 tool updates
v0.34.0- Changed
create_asset1 field changed- changed
Input schema / properties / source / anyOfPrevious value: -[ - { - "additionalProperties": false, - "properties": { - "run_id": { - "pattern": "^run_[a-zA-Z0-9]+$", - "type": "string" - } - }, - "required": [ - "run_id" - ], - "type": "object" - }, - { - "additionalProperties": false, - "properties": { - "upload_id": { - "pattern": "^upl_[a-f0-9]{32}$", - "type": "string" - } - }, - "required": [ - "upload_id" - ], - "type": "object" - }, - { - "additionalProperties": false, - "properties": { - "url": { - "format": "starts_with", - "maxLength": 2048, - "pattern": "^https:\\/\\/.*", - "type": "string" - } - }, - "required": [ - "url" - ], - "type": "object" - }, - { - "additionalProperties": false, - "properties": { - "base64": { - "maxLength": 933336, - "minLength": 1, - "pattern": "^[A-Za-z0-9+/]+={0,2}$", - "type": "string" - }, - "media_type": { - "enum": [ - "image/png", - "image/jpeg" - ], - "type": "string" - } - }, - "required": [ - "base64", - "media_type" - ], - "type": "object" - }, - { - "additionalProperties": false, - "properties": { - "path": { - "description": "Absolute or cwd-relative path to a PNG or JPEG file; only on a server running on your machine", - "minLength": 1, - "type": "string" - } - }, - "required": [ - "path" - ], - "type": "object" - } -]New value: +[ + { + "additionalProperties": false, + "properties": { + "run_id": { + "pattern": "^run_[a-zA-Z0-9]+$", + "type": "string" + } + }, + "required": [ + "run_id" + ], + "type": "object" + }, + { + "additionalProperties": false, + "properties": { + "upload_id": { + "pattern": "^upl_[a-f0-9]{32}$", + "type": "string" + } + }, + "required": [ + "upload_id" + ], + "type": "object" + }, + { + "additionalProperties": false, + "properties": { + "kind": { + "enum": [ + "image", + "video" + ], + "type": "string" + }, + "url": { + "format": "starts_with", + "maxLength": 2048, + "pattern": "^https:\\/\\/.*", + "type": "string" + } + }, + "required": [ + "url" + ], + "type": "object" + }, + { + "additionalProperties": false, + "properties": { + "base64": { + "maxLength": 933336, + "minLength": 1, + "pattern": "^[A-Za-z0-9+/]+={0,2}$", + "type": "string" + }, + "media_type": { + "enum": [ + "image/png", + "image/jpeg" + ], + "type": "string" + } + }, + "required": [ + "base64", + "media_type" + ], + "type": "object" + }, + { + "additionalProperties": false, + "properties": { + "put": { + "additionalProperties": false, + "properties": { + "bytes": { + "exclusiveMinimum": 0, + "maximum": 104857600, + "type": "integer" + }, + "media_type": { + "enum": [ + "image/png", + "image/jpeg", + "video/mp4" + ], + "type": "string" + }, + "sha256": { + "pattern": "^[a-f0-9]{64}$", + "type": "string" + } + }, + "required": [ + "media_type", + "bytes", + "sha256" + ], + "type": "object" + } + }, + "required": [ + "put" + ], + "type": "object" + }, + { + "additionalProperties": false, + "properties": { + "path": { + "description": "Absolute or cwd-relative path to a PNG, JPEG or MP4 file; only on a server running on your machine", + "minLength": 1, + "type": "string" + } + }, + "required": [ + "path" + ], + "type": "object" + } +]
- Changed
generate_video3 fields changed- added
Input schema / properties / cameraAdded value: +{ + "enum": [ + "static", + "push_in", + "pull_back", + "pan" + ], + "type": "string" +} - changed
Input schema / properties / model / enumPrevious value: -[ - "seedance-2.0", - "seedance-2.0-mini", - "seedance-2.0-fast", - "seedance-2.5" -]New value: +[ + "seedance-2.0", + "seedance-2.0-mini", + "seedance-2.0-fast", + "seedance-2.5", + "kling-3.0", + "gemini-omni-flash-1.1" +] - changed
Input schema / properties / resolution / enumPrevious value: -[ - "480p", - "720p", - "1080p" -]New value: +[ + "360p", + "480p", + "720p", + "1080p" +]
- Added
list_template_sounds - Changed
make_ugc18 fields changed- added
Input schema / properties / caption_emphasisAdded 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" +} - added
Input schema / properties / caption_modeAdded 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" +} - changed
Input schema / properties / caption_style / descriptionPrevious 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." - changed
Input schema / properties / caption_style / enumPrevious 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" +] - changed
Input schema / properties / captions / descriptionPrevious 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." - changed
Input schema / properties / inserts / descriptionPrevious 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." - added
Input schema / properties / inserts / items / properties / asset_idAdded 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" +} - added
Input schema / properties / inserts / items / properties / image_motion / descriptionAdded 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." - added
Input schema / properties / inserts / items / properties / media_type / descriptionAdded 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." - added
Input schema / properties / inserts / items / properties / media_url / descriptionAdded value: +"Public https URL of the media. Pass exactly one of media_url or asset_id." - added
Input schema / properties / inserts / items / properties / transitionAdded 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" +} - changed
Input schema / properties / inserts / items / requiredPrevious value: -[ - "id", - "media_url", - "media_type", - "anchor" -]New value: +[ + "id", + "media_type", + "anchor" +] - added
Input schema / properties / layout_windowsAdded 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" +} - added
Input schema / properties / overlaysAdded 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" +} - changed
Input schema / properties / segments / items / properties / image_motion / descriptionPrevious 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." - added
Input schema / properties / template_soundsAdded 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." +} - added
Input schema / properties / template_themeAdded 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" +} - added
Input schema / properties / templatesAdded 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" +}
- Changed
prepare_workflow_plan1 field changed- changed
Input schema / properties / document / properties / brief / properties / native / oneOfPrevious value: -[ - { - "additionalProperties": false, - "properties": { - "input": { - "additionalProperties": false, - "properties": { - "actor_gender": { - "description": "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.", - "enum": [ - "female", - "male" - ], - "type": "string" - }, - "actor_id": { - "description": "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.", - "pattern": "^actor_[a-z0-9][a-z0-9_-]{0,63}$", - "type": "string" - }, - "aspect_ratio": { - "description": "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.", - "enum": [ - "9:16", - "1:1", - "16:9" - ], - "type": "string" - }, - "background": { - "enum": [ - "white", - "blur", - "contain" - ], - "type": "string" - }, - "broll_policy": { - "description": "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.", - "enum": [ - "anyone", - "no_actor", - "no_people" - ], - "type": "string" - }, - "caption_style": { - "default": "hormozi", - "enum": [ - "hormozi", - "tiktok", - "minimal" - ], - "type": "string" - }, - "captions": { - "default": false, - "type": "boolean" - }, - "image": { - "description": "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.", - "format": "starts_with", - "maxLength": 2048, - "pattern": "^https:\\/\\/.*", - "type": "string" - }, - "inserts": { - "description": "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.", - "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" - } - ] - }, - "cover_words": { - "description": "How many spoken words this insert covers, counted from the first word of its anchor. Omitted means the anchored words only. The insert ends where the first uncovered word begins, so inserts whose coverage meets are adjacent frame for frame and leave no actor shot between them.", - "exclusiveMinimum": 0, - "maximum": 10000, - "type": "integer" - }, - "id": { - "pattern": "^[a-zA-Z0-9][a-zA-Z0-9_-]{0,63}$", - "type": "string" - }, - "image_motion": { - "additionalProperties": false, - "properties": { - "amount": { - "exclusiveMaximum": 1, - "minimum": 0, - "type": "number" - }, - "direction": { - "enum": [ - "in", - "out" - ], - "type": "string" - } - }, - "required": [ - "direction", - "amount" - ], - "type": "object" - }, - "media_type": { - "enum": [ - "image", - "video" - ], - "type": "string" - }, - "media_url": { - "format": "starts_with", - "maxLength": 2048, - "pattern": "^https:\\/\\/.*", - "type": "string" - } - }, - "required": [ - "id", - "media_url", - "media_type", - "anchor" - ], - "type": "object" - }, - "maxItems": 49, - "minItems": 1, - "type": "array" - }, - "look": { - "default": "natural", - "enum": [ - "natural", - "commercial", - "raw_iphone" - ], - "type": "string" - }, - "name": { - "maxLength": 100, - "type": "string" - }, - "person": { - "maxLength": 500, - "minLength": 1, - "type": "string" - }, - "resolution": { - "description": "Output resolution: 720p | 1080p | 4k (short side 720 / 1080 / 2160 px). Omitted means 1080p.", - "enum": [ - "720p", - "1080p", - "4k" - ], - "type": "string" - }, - "script": { - "description": "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.", - "maxLength": 10000, - "minLength": 1, - "type": "string" - }, - "segments": { - "items": { - "additionalProperties": false, - "properties": { - "duration_seconds": { - "description": "Required for an image segment; its display duration in seconds. Not accepted for actor or video segments.", - "exclusiveMinimum": 0, - "type": "number" - }, - "image_motion": { - "additionalProperties": false, - "properties": { - "amount": { - "exclusiveMaximum": 1, - "minimum": 0, - "type": "number" - }, - "direction": { - "enum": [ - "in", - "out" - ], - "type": "string" - } - }, - "required": [ - "direction", - "amount" - ], - "type": "object" - }, - "kind": { - "enum": [ - "actor", - "media" - ], - "type": "string" - }, - "media_type": { - "description": "Explicit media source type; omission means video, regardless of URL suffix. Availability follows the segments field.", - "enum": [ - "image", - "video" - ], - "type": "string" - }, - "media_url": { - "format": "uri", - "maxLength": 2048, - "type": "string" - }, - "script": { - "maxLength": 10000, - "minLength": 1, - "type": "string" - } - }, - "required": [ - "kind" - ], - "type": "object" - }, - "maxItems": 5, - "minItems": 1, - "type": "array" - }, - "tts_model": { - "description": "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.", - "enum": [ - "eleven_v3", - "eleven_flash_v2_5", - "eleven_turbo_v2_5", - "eleven_v4", - "gemini-3.8-flash-tts" - ], - "type": "string" - }, - "visible_ai_label": { - "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" - }, - "voice": { - "description": "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.", - "pattern": "^[A-Za-z0-9][A-Za-z0-9_-]{0,63}$", - "type": "string" - }, - "voice_id": { - "description": "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.", - "pattern": "^[A-Za-z0-9]{16,32}$", - "type": "string" - } - }, - "type": "object" - }, - "skill": { - "const": "make_ugc", - "type": "string" - } - }, - "required": [ - "skill", - "input" - ], - "type": "object" - }, - { - "additionalProperties": false, - "properties": { - "input": { - "oneOf": [ - { - "additionalProperties": false, - "properties": { - "captions": { - "default": true, - "type": "boolean" - }, - "character_details": { - "maxLength": 400, - "minLength": 1, - "type": "string" - }, - "character_reference": { - "format": "starts_with", - "maxLength": 2048, - "pattern": "^https:\\/\\/.*", - "type": "string" - }, - "duration_seconds": { - "maximum": 90, - "minimum": 30, - "type": "number" - }, - "input_mode": { - "const": "script", - "type": "string" - }, - "scene_images": { - "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": 500, - "minLength": 1, - "type": "string" - } - }, - "required": [ - "quote" - ], - "type": "object" - } - ] - }, - "image_url": { - "format": "starts_with", - "maxLength": 2048, - "pattern": "^https:\\/\\/.*", - "type": "string" - } - }, - "required": [ - "image_url", - "anchor" - ], - "type": "object" - }, - "maxItems": 30, - "type": "array" - }, - "script": { - "maxLength": 10000, - "minLength": 1, - "type": "string" - }, - "style_reference": { - "format": "starts_with", - "maxLength": 2048, - "pattern": "^https:\\/\\/.*", - "type": "string" - }, - "voice": { - "pattern": "^[A-Za-z0-9][A-Za-z0-9_-]{0,63}$", - "type": "string" - }, - "voice_id": { - "not": {} - } - }, - "required": [ - "duration_seconds", - "input_mode", - "script" - ], - "type": "object" - }, - { - "additionalProperties": false, - "properties": { - "brief": { - "maxLength": 5000, - "minLength": 1, - "type": "string" - }, - "captions": { - "default": true, - "type": "boolean" - }, - "character_details": { - "maxLength": 400, - "minLength": 1, - "type": "string" - }, - "character_reference": { - "format": "starts_with", - "maxLength": 2048, - "pattern": "^https:\\/\\/.*", - "type": "string" - }, - "duration_seconds": { - "maximum": 90, - "minimum": 30, - "type": "number" - }, - "input_mode": { - "const": "brief", - "type": "string" - }, - "scene_images": { - "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": 500, - "minLength": 1, - "type": "string" - } - }, - "required": [ - "quote" - ], - "type": "object" - } - ] - }, - "image_url": { - "format": "starts_with", - "maxLength": 2048, - "pattern": "^https:\\/\\/.*", - "type": "string" - } - }, - "required": [ - "image_url", - "anchor" - ], - "type": "object" - }, - "maxItems": 30, - "type": "array" - }, - "style_reference": { - "format": "starts_with", - "maxLength": 2048, - "pattern": "^https:\\/\\/.*", - "type": "string" - }, - "voice": { - "pattern": "^[A-Za-z0-9][A-Za-z0-9_-]{0,63}$", - "type": "string" - }, - "voice_id": { - "not": {} - } - }, - "required": [ - "duration_seconds", - "input_mode", - "brief" - ], - "type": "object" - } - ] - }, - "skill": { - "const": "make_faceless", - "type": "string" - } - }, - "required": [ - "skill", - "input" - ], - "type": "object" - } -]New value: +[ + { + "additionalProperties": false, + "properties": { + "input": { + "additionalProperties": false, + "properties": { + "actor_gender": { + "description": "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.", + "enum": [ + "female", + "male" + ], + "type": "string" + }, + "actor_id": { + "description": "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.", + "pattern": "^actor_[a-z0-9][a-z0-9_-]{0,63}$", + "type": "string" + }, + "aspect_ratio": { + "description": "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.", + "enum": [ + "9:16", + "1:1", + "16:9" + ], + "type": "string" + }, + "background": { + "enum": [ + "white", + "blur", + "contain" + ], + "type": "string" + }, + "broll_policy": { + "description": "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.", + "enum": [ + "anyone", + "no_actor", + "no_people" + ], + "type": "string" + }, + "caption_emphasis": { + "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" + }, + "caption_mode": { + "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" + }, + "caption_style": { + "default": "hormozi", + "description": "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.", + "enum": [ + "hormozi", + "tiktok", + "youtube", + "instagram", + "minimalist", + "neon", + "genz", + "campfire", + "midnight", + "plottwist", + "headline", + "promo", + "lecture", + "highlighter", + "studio", + "broadcast", + "arcade", + "clutch", + "bubblegum", + "crayon", + "lyrics", + "bassdrop", + "punch", + "minimal" + ], + "type": "string" + }, + "captions": { + "default": false, + "description": "Burn word-timed captions into the video, over the presenter and over inserts. Not available with segments.", + "type": "boolean" + }, + "image": { + "description": "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.", + "format": "starts_with", + "maxLength": 2048, + "pattern": "^https:\\/\\/.*", + "type": "string" + }, + "inserts": { + "description": "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.", + "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" + } + ] + }, + "asset_id": { + "description": "A ready PNG or JPEG image or MP4 video from your own assets (list_assets), instead of media_url. Pass exactly one of the two; media_type must match the asset's kind.", + "pattern": "^ast_[a-f0-9]{32}$", + "type": "string" + }, + "cover_words": { + "description": "How many spoken words this insert covers, counted from the first word of its anchor. Omitted means the anchored words only. The insert ends where the first uncovered word begins, so inserts whose coverage meets are adjacent frame for frame and leave no actor shot between them.", + "exclusiveMinimum": 0, + "maximum": 10000, + "type": "integer" + }, + "id": { + "pattern": "^[a-zA-Z0-9][a-zA-Z0-9_-]{0,63}$", + "type": "string" + }, + "image_motion": { + "additionalProperties": false, + "description": "Optional picture zoom. A picture always fills the frame, cut to its shape when the shapes differ (warnings[] names the share cut). amount is the zoom beyond filling: in grows from 1 to 1+amount, out shrinks from 1+amount to 1. No motion by default.", + "properties": { + "amount": { + "exclusiveMaximum": 1, + "minimum": 0, + "type": "number" + }, + "direction": { + "enum": [ + "in", + "out" + ], + "type": "string" + } + }, + "required": [ + "direction", + "amount" + ], + "type": "object" + }, + "media_type": { + "description": "image (PNG or JPEG) or video (MP4, H.264 or HEVC, 8-bit SDR). A video plays muted from its first frame and is cut where its words end; one shorter than its words holds its last frame, and warnings[] names it.", + "enum": [ + "image", + "video" + ], + "type": "string" + }, + "media_url": { + "description": "Public https URL of the media. Pass exactly one of media_url or asset_id.", + "format": "starts_with", + "maxLength": 2048, + "pattern": "^https:\\/\\/.*", + "type": "string" + }, + "transition": { + "description": "How the insert comes in and goes out: cut (default), wipe (slides across the presenter), flash (a white flash on the cut) or zoom (eases in from a closer framing). It never moves the insert's start or end.", + "enum": [ + "cut", + "wipe", + "flash", + "zoom" + ], + "type": "string" + } + }, + "required": [ + "id", + "media_type", + "anchor" + ], + "type": "object" + }, + "maxItems": 49, + "minItems": 1, + "type": "array" + }, + "layout_windows": { + "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" + }, + "look": { + "default": "natural", + "enum": [ + "natural", + "commercial", + "raw_iphone" + ], + "type": "string" + }, + "name": { + "maxLength": 100, + "type": "string" + }, + "overlays": { + "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" + }, + "person": { + "maxLength": 500, + "minLength": 1, + "type": "string" + }, + "resolution": { + "description": "Output resolution: 720p | 1080p | 4k (short side 720 / 1080 / 2160 px). Omitted means 1080p.", + "enum": [ + "720p", + "1080p", + "4k" + ], + "type": "string" + }, + "script": { + "description": "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.", + "maxLength": 10000, + "minLength": 1, + "type": "string" + }, + "segments": { + "items": { + "additionalProperties": false, + "properties": { + "duration_seconds": { + "description": "Required for an image segment; its display duration in seconds. Not accepted for actor or video segments.", + "exclusiveMinimum": 0, + "type": "number" + }, + "image_motion": { + "additionalProperties": false, + "properties": { + "amount": { + "exclusiveMaximum": 1, + "minimum": 0, + "type": "number" + }, + "direction": { + "enum": [ + "in", + "out" + ], + "type": "string" + } + }, + "required": [ + "direction", + "amount" + ], + "type": "object" + }, + "kind": { + "enum": [ + "actor", + "media" + ], + "type": "string" + }, + "media_type": { + "description": "Explicit media source type; omission means video, regardless of URL suffix. Availability follows the segments field.", + "enum": [ + "image", + "video" + ], + "type": "string" + }, + "media_url": { + "format": "uri", + "maxLength": 2048, + "type": "string" + }, + "script": { + "maxLength": 10000, + "minLength": 1, + "type": "string" + } + }, + "required": [ + "kind" + ], + "type": "object" + }, + "maxItems": 5, + "minItems": 1, + "type": "array" + }, + "template_sounds": { + "anyOf": [ + { + "const": false, + "type": "boolean" + }, + { + "additionalProperties": false, + "properties": { + "answer": { + "enum": [ + "answer_confirm", + "answer_open", + "answer_pop", + "answer_select" + ], + "type": "string" + }, + "click": { + "enum": [ + "click_mouse", + "click_soft", + "click_crisp", + "click_light" + ], + "type": "string" + }, + "flash": { + "enum": [ + "shutter", + "glitch" + ], + "type": "string" + }, + "notify": { + "enum": [ + "chime", + "glass_ping", + "glass_soft", + "bong", + "question_ping" + ], + "type": "string" + }, + "ring": { + "enum": [ + "ring_classic", + "ring_marimba", + "ring_digital" + ], + "type": "string" + }, + "step": { + "enum": [ + "drop", + "drop_high", + "tick", + "pluck", + "pluck_bright" + ], + "type": "string" + }, + "toggle": { + "enum": [ + "switch_flip", + "toggle_snap", + "switch_heavy", + "switch_light" + ], + "type": "string" + }, + "whoosh": { + "enum": [ + "whoosh", + "whip", + "paper_swipe", + "sweep" + ], + "type": "string" + } + }, + "type": "object" + } + ], + "description": "Template sounds: false for none, or { beat: name } over the defaults; list_template_sounds names them." + }, + "template_theme": { + "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" + }, + "templates": { + "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": { + "oneOf": [ + { + "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": false, + "properties": { + "position": { + "enum": [ + "top", + "center", + "bottom" + ], + "type": "string" + }, + "size": { + "enum": [ + "small", + "medium", + "large" + ], + "type": "string" + }, + "text": { + "maxLength": 32, + "minLength": 1, + "type": "string" + } + }, + "required": [ + "text" + ], + "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": { + "const": "tag", + "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" + }, + { + "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": false, + "properties": { + "name": { + "maxLength": 28, + "minLength": 1, + "type": "string" + }, + "role": { + "maxLength": 36, + "minLength": 1, + "type": "string" + }, + "side": { + "enum": [ + "left", + "right" + ], + "type": "string" + }, + "size": { + "enum": [ + "small", + "medium", + "large" + ], + "type": "string" + } + }, + "required": [ + "name", + "side" + ], + "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": { + "const": "lower_third", + "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" + }, + { + "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": false, + "properties": { + "cta": { + "maxLength": 48, + "minLength": 1, + "type": "string" + }, + "site": { + "maxLength": 32, + "minLength": 1, + "type": "string" + }, + "size": { + "enum": [ + "small", + "medium", + "large" + ], + "type": "string" + } + }, + "required": [ + "site" + ], + "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": { + "const": "end_card", + "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" + }, + { + "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": false, + "properties": { + "chip": { + "maxLength": 32, + "minLength": 1, + "type": "string" + }, + "logo": { + "additionalProperties": false, + "properties": { + "asset_id": { + "description": "A ready asset from list_assets, of the kind the slot takes.", + "pattern": "^ast_[a-f0-9]{32}$", + "type": "string" + } + }, + "required": [ + "asset_id" + ], + "type": "object" + }, + "size": { + "enum": [ + "small", + "medium", + "large" + ], + "type": "string" + }, + "title": { + "maxLength": 48, + "minLength": 1, + "type": "string" + } + }, + "required": [ + "title" + ], + "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": { + "const": "title_card", + "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" + }, + { + "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": false, + "properties": { + "author": { + "maxLength": 32, + "minLength": 1, + "type": "string" + }, + "photo": { + "additionalProperties": false, + "properties": { + "asset_id": { + "description": "A ready asset from list_assets, of the kind the slot takes.", + "pattern": "^ast_[a-f0-9]{32}$", + "type": "string" + } + }, + "required": [ + "asset_id" + ], + "type": "object" + }, + "size": { + "enum": [ + "small", + "medium", + "large" + ], + "type": "string" + }, + "text": { + "maxLength": 120, + "minLength": 1, + "type": "string" + } + }, + "required": [ + "text" + ], + "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": { + "const": "quote", + "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" + }, + { + "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": false, + "properties": { + "label": { + "maxLength": 32, + "minLength": 1, + "type": "string" + }, + "prefix": { + "maxLength": 6, + "minLength": 1, + "type": "string" + }, + "size": { + "enum": [ + "small", + "medium", + "large" + ], + "type": "string" + }, + "suffix": { + "maxLength": 6, + "minLength": 1, + "type": "string" + }, + "value": { + "maximum": 999999999, + "minimum": 0, + "multipleOf": 0.01, + "type": "number" + } + }, + "required": [ + "value" + ], + "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": { + "const": "stat", + "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" + }, + { + "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": false, + "properties": { + "size": { + "enum": [ + "small", + "medium", + "large" + ], + "type": "string" + }, + "style": { + "enum": [ + "arrow", + "ring" + ], + "type": "string" + }, + "target": { + "additionalProperties": false, + "properties": { + "x": { + "maximum": 100, + "minimum": 0, + "type": "number" + }, + "y": { + "maximum": 100, + "minimum": 0, + "type": "number" + } + }, + "required": [ + "x", + "y" + ], + "type": "object" + }, + "text": { + "maxLength": 24, + "minLength": 1, + "type": "string" + } + }, + "required": [ + "target", + "style" + ], + "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": { + "const": "callout", + "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" + }, + { + "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": false, + "properties": { + "clicks": { + "items": { + "additionalProperties": false, + "properties": { + "item": { + "maximum": 3, + "minimum": 0, + "type": "integer" + }, + "quote": { + "maxLength": 200, + "minLength": 1, + "type": "string" + } + }, + "required": [ + "item" + ], + "type": "object" + }, + "maxItems": 6, + "type": "array" + }, + "items": { + "items": { + "additionalProperties": false, + "properties": { + "icon": { + "enum": [ + "phone", + "briefcase", + "user", + "clock", + "chat", + "star" + ], + "type": "string" + }, + "label": { + "maxLength": 24, + "minLength": 1, + "type": "string" + }, + "on": { + "type": "boolean" + } + }, + "required": [ + "label", + "on" + ], + "type": "object" + }, + "maxItems": 4, + "minItems": 2, + "type": "array" + }, + "size": { + "enum": [ + "small", + "medium", + "large" + ], + "type": "string" + }, + "style": { + "enum": [ + "switch", + "check" + ], + "type": "string" + } + }, + "required": [ + "items" + ], + "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": { + "const": "checklist", + "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" + }, + { + "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": false, + "properties": { + "answer_at": { + "maxLength": 200, + "minLength": 1, + "type": "string" + }, + "avatar": { + "additionalProperties": false, + "properties": { + "asset_id": { + "description": "A ready asset from list_assets, of the kind the slot takes.", + "pattern": "^ast_[a-f0-9]{32}$", + "type": "string" + } + }, + "required": [ + "asset_id" + ], + "type": "object" + }, + "caller": { + "maxLength": 24, + "minLength": 1, + "type": "string" + }, + "side": { + "enum": [ + "left", + "right" + ], + "type": "string" + }, + "size": { + "enum": [ + "small", + "medium", + "large" + ], + "type": "string" + }, + "subtitle": { + "maxLength": 32, + "minLength": 1, + "type": "string" + } + }, + "required": [ + "caller", + "answer_at" + ], + "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": { + "const": "phone_call", + "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" + }, + { + "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": false, + "properties": { + "after": { + "additionalProperties": false, + "properties": { + "asset_id": { + "description": "A ready asset from list_assets, of the kind the slot takes.", + "pattern": "^ast_[a-f0-9]{32}$", + "type": "string" + } + }, + "required": [ + "asset_id" + ], + "type": "object" + }, + "before": { + "additionalProperties": false, + "properties": { + "asset_id": { + "description": "A ready asset from list_assets, of the kind the slot takes.", + "pattern": "^ast_[a-f0-9]{32}$", + "type": "string" + } + }, + "required": [ + "asset_id" + ], + "type": "object" + }, + "labels": { + "additionalProperties": false, + "properties": { + "after": { + "maxLength": 20, + "minLength": 1, + "type": "string" + }, + "before": { + "maxLength": 20, + "minLength": 1, + "type": "string" + } + }, + "type": "object" + }, + "reveal_at": { + "maxLength": 200, + "minLength": 1, + "type": "string" + }, + "size": { + "enum": [ + "small", + "medium", + "large" + ], + "type": "string" + } + }, + "required": [ + "before", + "after", + "reveal_at" + ], + "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": { + "const": "compare", + "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" + }, + { + "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": false, + "properties": { + "app": { + "maxLength": 20, + "minLength": 1, + "type": "string" + }, + "body": { + "maxLength": 80, + "minLength": 1, + "type": "string" + }, + "icon": { + "enum": [ + "phone", + "briefcase", + "user", + "clock", + "chat", + "star" + ], + "type": "string" + }, + "size": { + "enum": [ + "small", + "medium", + "large" + ], + "type": "string" + }, + "title": { + "maxLength": 32, + "minLength": 1, + "type": "string" + } + }, + "required": [ + "app", + "title", + "body" + ], + "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": { + "const": "notification", + "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" + }, + { + "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": false, + "properties": { + "advance_at": { + "items": { + "maxLength": 200, + "minLength": 1, + "type": "string" + }, + "maxItems": 5, + "minItems": 2, + "type": "array" + }, + "size": { + "enum": [ + "small", + "medium", + "large" + ], + "type": "string" + }, + "steps": { + "items": { + "maxLength": 20, + "minLength": 1, + "type": "string" + }, + "maxItems": 5, + "minItems": 2, + "type": "array" + } + }, + "required": [ + "steps" + ], + "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": { + "const": "progress", + "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" + }, + { + "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": false, + "properties": { + "label": { + "maxLength": 32, + "minLength": 1, + "type": "string" + }, + "size": { + "enum": [ + "small", + "medium", + "large" + ], + "type": "string" + }, + "stars": { + "maximum": 5, + "minimum": 1, + "multipleOf": 0.5, + "type": "number" + } + }, + "required": [ + "stars" + ], + "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": { + "const": "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" + }, + "tts_model": { + "description": "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.", + "enum": [ + "eleven_v3", + "eleven_flash_v2_5", + "eleven_turbo_v2_5", + "eleven_v4", + "gemini-3.8-flash-tts" + ], + "type": "string" + }, + "visible_ai_label": { + "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" + }, + "voice": { + "description": "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.", + "pattern": "^[A-Za-z0-9][A-Za-z0-9_-]{0,63}$", + "type": "string" + }, + "voice_id": { + "description": "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.", + "pattern": "^[A-Za-z0-9]{16,32}$", + "type": "string" + } + }, + "type": "object" + }, + "skill": { + "const": "make_ugc", + "type": "string" + } + }, + "required": [ + "skill", + "input" + ], + "type": "object" + }, + { + "additionalProperties": false, + "properties": { + "input": { + "oneOf": [ + { + "additionalProperties": false, + "properties": { + "captions": { + "default": true, + "type": "boolean" + }, + "character_details": { + "maxLength": 400, + "minLength": 1, + "type": "string" + }, + "character_reference": { + "format": "starts_with", + "maxLength": 2048, + "pattern": "^https:\\/\\/.*", + "type": "string" + }, + "duration_seconds": { + "maximum": 90, + "minimum": 30, + "type": "number" + }, + "input_mode": { + "const": "script", + "type": "string" + }, + "scene_images": { + "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": 500, + "minLength": 1, + "type": "string" + } + }, + "required": [ + "quote" + ], + "type": "object" + } + ] + }, + "image_url": { + "format": "starts_with", + "maxLength": 2048, + "pattern": "^https:\\/\\/.*", + "type": "string" + } + }, + "required": [ + "image_url", + "anchor" + ], + "type": "object" + }, + "maxItems": 30, + "type": "array" + }, + "script": { + "maxLength": 10000, + "minLength": 1, + "type": "string" + }, + "style_reference": { + "format": "starts_with", + "maxLength": 2048, + "pattern": "^https:\\/\\/.*", + "type": "string" + }, + "voice": { + "pattern": "^[A-Za-z0-9][A-Za-z0-9_-]{0,63}$", + "type": "string" + }, + "voice_id": { + "not": {} + } + }, + "required": [ + "duration_seconds", + "input_mode", + "script" + ], + "type": "object" + }, + { + "additionalProperties": false, + "properties": { + "brief": { + "maxLength": 5000, + "minLength": 1, + "type": "string" + }, + "captions": { + "default": true, + "type": "boolean" + }, + "character_details": { + "maxLength": 400, + "minLength": 1, + "type": "string" + }, + "character_reference": { + "format": "starts_with", + "maxLength": 2048, + "pattern": "^https:\\/\\/.*", + "type": "string" + }, + "duration_seconds": { + "maximum": 90, + "minimum": 30, + "type": "number" + }, + "input_mode": { + "const": "brief", + "type": "string" + }, + "scene_images": { + "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": 500, + "minLength": 1, + "type": "string" + } + }, + "required": [ + "quote" + ], + "type": "object" + } + ] + }, + "image_url": { + "format": "starts_with", + "maxLength": 2048, + "pattern": "^https:\\/\\/.*", + "type": "string" + } + }, + "required": [ + "image_url", + "anchor" + ], + "type": "object" + }, + "maxItems": 30, + "type": "array" + }, + "style_reference": { + "format": "starts_with", + "maxLength": 2048, + "pattern": "^https:\\/\\/.*", + "type": "string" + }, + "voice": { + "pattern": "^[A-Za-z0-9][A-Za-z0-9_-]{0,63}$", + "type": "string" + }, + "voice_id": { + "not": {} + } + }, + "required": [ + "duration_seconds", + "input_mode", + "brief" + ], + "type": "object" + } + ] + }, + "skill": { + "const": "make_faceless", + "type": "string" + } + }, + "required": [ + "skill", + "input" + ], + "type": "object" + } +]
- Changed
quote_ugc18 fields changed- added
Input schema / properties / caption_emphasisAdded 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" +} - added
Input schema / properties / caption_modeAdded 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" +} - changed
Input schema / properties / caption_style / descriptionPrevious 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." - changed
Input schema / properties / caption_style / enumPrevious 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" +] - changed
Input schema / properties / captions / descriptionPrevious 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." - changed
Input schema / properties / inserts / descriptionPrevious 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." - added
Input schema / properties / inserts / items / properties / asset_idAdded 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" +} - added
Input schema / properties / inserts / items / properties / image_motion / descriptionAdded 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." - added
Input schema / properties / inserts / items / properties / media_type / descriptionAdded 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." - added
Input schema / properties / inserts / items / properties / media_url / descriptionAdded value: +"Public https URL of the media. Pass exactly one of media_url or asset_id." - added
Input schema / properties / inserts / items / properties / transitionAdded 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" +} - changed
Input schema / properties / inserts / items / requiredPrevious value: -[ - "id", - "media_url", - "media_type", - "anchor" -]New value: +[ + "id", + "media_type", + "anchor" +] - added
Input schema / properties / layout_windowsAdded 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" +} - added
Input schema / properties / overlaysAdded 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" +} - changed
Input schema / properties / segments / items / properties / image_motion / descriptionPrevious 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." - added
Input schema / properties / template_soundsAdded 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." +} - added
Input schema / properties / template_themeAdded 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" +} - added
Input schema / properties / templatesAdded 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" +}
- Changed
quote_video3 fields changed- added
Input schema / properties / cameraAdded value: +{ + "enum": [ + "static", + "push_in", + "pull_back", + "pan" + ], + "type": "string" +} - changed
Input schema / properties / model / enumPrevious value: -[ - "seedance-2.0", - "seedance-2.0-mini", - "seedance-2.0-fast", - "seedance-2.5" -]New value: +[ + "seedance-2.0", + "seedance-2.0-mini", + "seedance-2.0-fast", + "seedance-2.5", + "kling-3.0", + "gemini-omni-flash-1.1" +] - changed
Input schema / properties / resolution / enumPrevious value: -[ - "480p", - "720p", - "1080p" -]New value: +[ + "360p", + "480p", + "720p", + "1080p" +]
16 tool updates
v0.33.0- Added
create_asset - Added
create_upload - Added
delete_asset - Added
generate_image - Added
generate_video - Added
get_asset - Added
get_upload - Added
list_assets - Added
list_generation_models - Changed
make_ugc1 field changed- added
Input schema / properties / visible_ai_labelAdded 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" +}
- Changed
prepare_workflow_plan1 field changed- changed
Input schema / properties / document / properties / brief / properties / native / oneOfPrevious value: -[ - { - "additionalProperties": false, - "properties": { - "input": { - "additionalProperties": false, - "properties": { - "actor_gender": { - "description": "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.", - "enum": [ - "female", - "male" - ], - "type": "string" - }, - "actor_id": { - "description": "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.", - "pattern": "^actor_[a-z0-9][a-z0-9_-]{0,63}$", - "type": "string" - }, - "aspect_ratio": { - "description": "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.", - "enum": [ - "9:16", - "1:1", - "16:9" - ], - "type": "string" - }, - "background": { - "enum": [ - "white", - "blur", - "contain" - ], - "type": "string" - }, - "broll_policy": { - "description": "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.", - "enum": [ - "anyone", - "no_actor", - "no_people" - ], - "type": "string" - }, - "caption_style": { - "default": "hormozi", - "enum": [ - "hormozi", - "tiktok", - "minimal" - ], - "type": "string" - }, - "captions": { - "default": false, - "type": "boolean" - }, - "image": { - "description": "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.", - "format": "starts_with", - "maxLength": 2048, - "pattern": "^https:\\/\\/.*", - "type": "string" - }, - "inserts": { - "description": "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.", - "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" - } - ] - }, - "cover_words": { - "description": "How many spoken words this insert covers, counted from the first word of its anchor. Omitted means the anchored words only. The insert ends where the first uncovered word begins, so inserts whose coverage meets are adjacent frame for frame and leave no actor shot between them.", - "exclusiveMinimum": 0, - "maximum": 10000, - "type": "integer" - }, - "id": { - "pattern": "^[a-zA-Z0-9][a-zA-Z0-9_-]{0,63}$", - "type": "string" - }, - "image_motion": { - "additionalProperties": false, - "properties": { - "amount": { - "exclusiveMaximum": 1, - "minimum": 0, - "type": "number" - }, - "direction": { - "enum": [ - "in", - "out" - ], - "type": "string" - } - }, - "required": [ - "direction", - "amount" - ], - "type": "object" - }, - "media_type": { - "enum": [ - "image", - "video" - ], - "type": "string" - }, - "media_url": { - "format": "starts_with", - "maxLength": 2048, - "pattern": "^https:\\/\\/.*", - "type": "string" - } - }, - "required": [ - "id", - "media_url", - "media_type", - "anchor" - ], - "type": "object" - }, - "maxItems": 49, - "minItems": 1, - "type": "array" - }, - "look": { - "default": "natural", - "enum": [ - "natural", - "commercial", - "raw_iphone" - ], - "type": "string" - }, - "name": { - "maxLength": 100, - "type": "string" - }, - "person": { - "maxLength": 500, - "minLength": 1, - "type": "string" - }, - "resolution": { - "description": "Output resolution: 720p | 1080p | 4k (short side 720 / 1080 / 2160 px). Omitted means 1080p.", - "enum": [ - "720p", - "1080p", - "4k" - ], - "type": "string" - }, - "script": { - "description": "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.", - "maxLength": 10000, - "minLength": 1, - "type": "string" - }, - "segments": { - "items": { - "additionalProperties": false, - "properties": { - "duration_seconds": { - "description": "Required for an image segment; its display duration in seconds. Not accepted for actor or video segments.", - "exclusiveMinimum": 0, - "type": "number" - }, - "image_motion": { - "additionalProperties": false, - "properties": { - "amount": { - "exclusiveMaximum": 1, - "minimum": 0, - "type": "number" - }, - "direction": { - "enum": [ - "in", - "out" - ], - "type": "string" - } - }, - "required": [ - "direction", - "amount" - ], - "type": "object" - }, - "kind": { - "enum": [ - "actor", - "media" - ], - "type": "string" - }, - "media_type": { - "description": "Explicit media source type; omission means video, regardless of URL suffix. Availability follows the segments field.", - "enum": [ - "image", - "video" - ], - "type": "string" - }, - "media_url": { - "format": "uri", - "maxLength": 2048, - "type": "string" - }, - "script": { - "maxLength": 10000, - "minLength": 1, - "type": "string" - } - }, - "required": [ - "kind" - ], - "type": "object" - }, - "maxItems": 5, - "minItems": 1, - "type": "array" - }, - "tts_model": { - "description": "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.", - "enum": [ - "eleven_v3", - "eleven_flash_v2_5", - "eleven_turbo_v2_5", - "eleven_v4", - "gemini-3.8-flash-tts" - ], - "type": "string" - }, - "voice": { - "description": "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.", - "pattern": "^[A-Za-z0-9][A-Za-z0-9_-]{0,63}$", - "type": "string" - }, - "voice_id": { - "description": "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.", - "pattern": "^[A-Za-z0-9]{16,32}$", - "type": "string" - } - }, - "type": "object" - }, - "skill": { - "const": "make_ugc", - "type": "string" - } - }, - "required": [ - "skill", - "input" - ], - "type": "object" - }, - { - "additionalProperties": false, - "properties": { - "input": { - "oneOf": [ - { - "additionalProperties": false, - "properties": { - "captions": { - "default": true, - "type": "boolean" - }, - "character_details": { - "maxLength": 400, - "minLength": 1, - "type": "string" - }, - "character_reference": { - "format": "starts_with", - "maxLength": 2048, - "pattern": "^https:\\/\\/.*", - "type": "string" - }, - "duration_seconds": { - "maximum": 90, - "minimum": 30, - "type": "number" - }, - "input_mode": { - "const": "script", - "type": "string" - }, - "scene_images": { - "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": 500, - "minLength": 1, - "type": "string" - } - }, - "required": [ - "quote" - ], - "type": "object" - } - ] - }, - "image_url": { - "format": "starts_with", - "maxLength": 2048, - "pattern": "^https:\\/\\/.*", - "type": "string" - } - }, - "required": [ - "image_url", - "anchor" - ], - "type": "object" - }, - "maxItems": 30, - "type": "array" - }, - "script": { - "maxLength": 10000, - "minLength": 1, - "type": "string" - }, - "style_reference": { - "format": "starts_with", - "maxLength": 2048, - "pattern": "^https:\\/\\/.*", - "type": "string" - }, - "voice": { - "pattern": "^[A-Za-z0-9][A-Za-z0-9_-]{0,63}$", - "type": "string" - }, - "voice_id": { - "not": {} - } - }, - "required": [ - "duration_seconds", - "input_mode", - "script" - ], - "type": "object" - }, - { - "additionalProperties": false, - "properties": { - "brief": { - "maxLength": 5000, - "minLength": 1, - "type": "string" - }, - "captions": { - "default": true, - "type": "boolean" - }, - "character_details": { - "maxLength": 400, - "minLength": 1, - "type": "string" - }, - "character_reference": { - "format": "starts_with", - "maxLength": 2048, - "pattern": "^https:\\/\\/.*", - "type": "string" - }, - "duration_seconds": { - "maximum": 90, - "minimum": 30, - "type": "number" - }, - "input_mode": { - "const": "brief", - "type": "string" - }, - "scene_images": { - "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": 500, - "minLength": 1, - "type": "string" - } - }, - "required": [ - "quote" - ], - "type": "object" - } - ] - }, - "image_url": { - "format": "starts_with", - "maxLength": 2048, - "pattern": "^https:\\/\\/.*", - "type": "string" - } - }, - "required": [ - "image_url", - "anchor" - ], - "type": "object" - }, - "maxItems": 30, - "type": "array" - }, - "style_reference": { - "format": "starts_with", - "maxLength": 2048, - "pattern": "^https:\\/\\/.*", - "type": "string" - }, - "voice": { - "pattern": "^[A-Za-z0-9][A-Za-z0-9_-]{0,63}$", - "type": "string" - }, - "voice_id": { - "not": {} - } - }, - "required": [ - "duration_seconds", - "input_mode", - "brief" - ], - "type": "object" - } - ] - }, - "skill": { - "const": "make_faceless", - "type": "string" - } - }, - "required": [ - "skill", - "input" - ], - "type": "object" - } -]New value: +[ + { + "additionalProperties": false, + "properties": { + "input": { + "additionalProperties": false, + "properties": { + "actor_gender": { + "description": "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.", + "enum": [ + "female", + "male" + ], + "type": "string" + }, + "actor_id": { + "description": "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.", + "pattern": "^actor_[a-z0-9][a-z0-9_-]{0,63}$", + "type": "string" + }, + "aspect_ratio": { + "description": "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.", + "enum": [ + "9:16", + "1:1", + "16:9" + ], + "type": "string" + }, + "background": { + "enum": [ + "white", + "blur", + "contain" + ], + "type": "string" + }, + "broll_policy": { + "description": "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.", + "enum": [ + "anyone", + "no_actor", + "no_people" + ], + "type": "string" + }, + "caption_style": { + "default": "hormozi", + "enum": [ + "hormozi", + "tiktok", + "minimal" + ], + "type": "string" + }, + "captions": { + "default": false, + "type": "boolean" + }, + "image": { + "description": "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.", + "format": "starts_with", + "maxLength": 2048, + "pattern": "^https:\\/\\/.*", + "type": "string" + }, + "inserts": { + "description": "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.", + "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" + } + ] + }, + "cover_words": { + "description": "How many spoken words this insert covers, counted from the first word of its anchor. Omitted means the anchored words only. The insert ends where the first uncovered word begins, so inserts whose coverage meets are adjacent frame for frame and leave no actor shot between them.", + "exclusiveMinimum": 0, + "maximum": 10000, + "type": "integer" + }, + "id": { + "pattern": "^[a-zA-Z0-9][a-zA-Z0-9_-]{0,63}$", + "type": "string" + }, + "image_motion": { + "additionalProperties": false, + "properties": { + "amount": { + "exclusiveMaximum": 1, + "minimum": 0, + "type": "number" + }, + "direction": { + "enum": [ + "in", + "out" + ], + "type": "string" + } + }, + "required": [ + "direction", + "amount" + ], + "type": "object" + }, + "media_type": { + "enum": [ + "image", + "video" + ], + "type": "string" + }, + "media_url": { + "format": "starts_with", + "maxLength": 2048, + "pattern": "^https:\\/\\/.*", + "type": "string" + } + }, + "required": [ + "id", + "media_url", + "media_type", + "anchor" + ], + "type": "object" + }, + "maxItems": 49, + "minItems": 1, + "type": "array" + }, + "look": { + "default": "natural", + "enum": [ + "natural", + "commercial", + "raw_iphone" + ], + "type": "string" + }, + "name": { + "maxLength": 100, + "type": "string" + }, + "person": { + "maxLength": 500, + "minLength": 1, + "type": "string" + }, + "resolution": { + "description": "Output resolution: 720p | 1080p | 4k (short side 720 / 1080 / 2160 px). Omitted means 1080p.", + "enum": [ + "720p", + "1080p", + "4k" + ], + "type": "string" + }, + "script": { + "description": "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.", + "maxLength": 10000, + "minLength": 1, + "type": "string" + }, + "segments": { + "items": { + "additionalProperties": false, + "properties": { + "duration_seconds": { + "description": "Required for an image segment; its display duration in seconds. Not accepted for actor or video segments.", + "exclusiveMinimum": 0, + "type": "number" + }, + "image_motion": { + "additionalProperties": false, + "properties": { + "amount": { + "exclusiveMaximum": 1, + "minimum": 0, + "type": "number" + }, + "direction": { + "enum": [ + "in", + "out" + ], + "type": "string" + } + }, + "required": [ + "direction", + "amount" + ], + "type": "object" + }, + "kind": { + "enum": [ + "actor", + "media" + ], + "type": "string" + }, + "media_type": { + "description": "Explicit media source type; omission means video, regardless of URL suffix. Availability follows the segments field.", + "enum": [ + "image", + "video" + ], + "type": "string" + }, + "media_url": { + "format": "uri", + "maxLength": 2048, + "type": "string" + }, + "script": { + "maxLength": 10000, + "minLength": 1, + "type": "string" + } + }, + "required": [ + "kind" + ], + "type": "object" + }, + "maxItems": 5, + "minItems": 1, + "type": "array" + }, + "tts_model": { + "description": "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.", + "enum": [ + "eleven_v3", + "eleven_flash_v2_5", + "eleven_turbo_v2_5", + "eleven_v4", + "gemini-3.8-flash-tts" + ], + "type": "string" + }, + "visible_ai_label": { + "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" + }, + "voice": { + "description": "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.", + "pattern": "^[A-Za-z0-9][A-Za-z0-9_-]{0,63}$", + "type": "string" + }, + "voice_id": { + "description": "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.", + "pattern": "^[A-Za-z0-9]{16,32}$", + "type": "string" + } + }, + "type": "object" + }, + "skill": { + "const": "make_ugc", + "type": "string" + } + }, + "required": [ + "skill", + "input" + ], + "type": "object" + }, + { + "additionalProperties": false, + "properties": { + "input": { + "oneOf": [ + { + "additionalProperties": false, + "properties": { + "captions": { + "default": true, + "type": "boolean" + }, + "character_details": { + "maxLength": 400, + "minLength": 1, + "type": "string" + }, + "character_reference": { + "format": "starts_with", + "maxLength": 2048, + "pattern": "^https:\\/\\/.*", + "type": "string" + }, + "duration_seconds": { + "maximum": 90, + "minimum": 30, + "type": "number" + }, + "input_mode": { + "const": "script", + "type": "string" + }, + "scene_images": { + "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": 500, + "minLength": 1, + "type": "string" + } + }, + "required": [ + "quote" + ], + "type": "object" + } + ] + }, + "image_url": { + "format": "starts_with", + "maxLength": 2048, + "pattern": "^https:\\/\\/.*", + "type": "string" + } + }, + "required": [ + "image_url", + "anchor" + ], + "type": "object" + }, + "maxItems": 30, + "type": "array" + }, + "script": { + "maxLength": 10000, + "minLength": 1, + "type": "string" + }, + "style_reference": { + "format": "starts_with", + "maxLength": 2048, + "pattern": "^https:\\/\\/.*", + "type": "string" + }, + "voice": { + "pattern": "^[A-Za-z0-9][A-Za-z0-9_-]{0,63}$", + "type": "string" + }, + "voice_id": { + "not": {} + } + }, + "required": [ + "duration_seconds", + "input_mode", + "script" + ], + "type": "object" + }, + { + "additionalProperties": false, + "properties": { + "brief": { + "maxLength": 5000, + "minLength": 1, + "type": "string" + }, + "captions": { + "default": true, + "type": "boolean" + }, + "character_details": { + "maxLength": 400, + "minLength": 1, + "type": "string" + }, + "character_reference": { + "format": "starts_with", + "maxLength": 2048, + "pattern": "^https:\\/\\/.*", + "type": "string" + }, + "duration_seconds": { + "maximum": 90, + "minimum": 30, + "type": "number" + }, + "input_mode": { + "const": "brief", + "type": "string" + }, + "scene_images": { + "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": 500, + "minLength": 1, + "type": "string" + } + }, + "required": [ + "quote" + ], + "type": "object" + } + ] + }, + "image_url": { + "format": "starts_with", + "maxLength": 2048, + "pattern": "^https:\\/\\/.*", + "type": "string" + } + }, + "required": [ + "image_url", + "anchor" + ], + "type": "object" + }, + "maxItems": 30, + "type": "array" + }, + "style_reference": { + "format": "starts_with", + "maxLength": 2048, + "pattern": "^https:\\/\\/.*", + "type": "string" + }, + "voice": { + "pattern": "^[A-Za-z0-9][A-Za-z0-9_-]{0,63}$", + "type": "string" + }, + "voice_id": { + "not": {} + } + }, + "required": [ + "duration_seconds", + "input_mode", + "brief" + ], + "type": "object" + } + ] + }, + "skill": { + "const": "make_faceless", + "type": "string" + } + }, + "required": [ + "skill", + "input" + ], + "type": "object" + } +]
- Added
quote_image - Changed
quote_ugc1 field changed- added
Input schema / properties / visible_ai_labelAdded 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" +}
- Added
quote_video - Added
update_asset - Changed
upload_image3 fields changed- changed
Input schema / properties / path / descriptionPrevious value: -"Absolute or cwd-relative path to a PNG or JPEG file"New value: +"Absolute or cwd-relative path to a PNG or JPEG file; only on a server running on your machine" - added
Input schema / properties / urlAdded value: +{ + "description": "Public https URL of a PNG or JPEG; the server downloads it", + "format": "uri", + "type": "string" +} - removed
Input schema / requiredRemoved value: -[ - "path" -]
9 tool updates
v0.29.0- Added
approve_workflow_plan - Added
create_candidate - Added
get_workflow - Added
get_workflow_plan - Added
list_workflows - Added
prepare_workflow_plan - Added
quote_candidate - Added
quote_workflow_plan - Added
run_workflow_plan
2 tool updates
v0.28.0- Added
quote_revision - Added
revise_run
4 tool updates
v0.27.0- Added
get_run_shots - Changed
list_voices2 fields changed- changed
Input schema / properties / model / descriptionPrevious value: -"Only voices this speech model speaks: presets and catalog voices whose language it supports, or the model's own voices (kind model_voice)"New value: +"Only voices this speech model speaks: presets and catalog voices whose language it supports, or the model's own voices (kind model_voice). These are the models of make_ugc: no make_faceless voice matches" - added
Input schema / properties / skillAdded value: +{ + "description": "The skill whose voices to list: make_faceless lists the narration voices of make_faceless (kind faceless_voice), make_ugc every other voice. Omitted means make_ugc. A voice is refused by the other skill before any charge", + "enum": [ + "make_ugc", + "make_faceless" + ], + "type": "string" +}
- Changed
make_faceless3 fields changed- added
Input schema / additionalPropertiesAdded value: +false - changed
Input schema / properties / duration_seconds / descriptionPrevious value: -"Selected length, 30 to 90 seconds, on a 1/25 s frame boundary. The video ends with its narration, runs at least 25 seconds and may exceed the selection by up to 5 seconds, never beyond 90 seconds. The charge never exceeds the quote. A script must fit this output range."New value: +"Selected length, 30 to 90 seconds, on a 1/25 s frame boundary. The video ends with its narration, runs at least 25 seconds and may exceed the selection by up to a quarter, never beyond 90 seconds; a video more than 5 seconds longer says so in warnings[]. The charge never exceeds the quote. A script is accepted when its estimated length is 21 seconds to the selection plus 5, at most 90." - added
Input schema / properties / voiceAdded value: +{ + "description": "Narration voice: a name from list_voices with skill=make_faceless (kind faceless_voice). Omitted means narrator_en_wise_lady. Choose a voice in the language of the narration: a voice reads any language, with the accent of its own. The API refuses an unknown name and a make_ugc voice before any charge. A raw voice_id is not accepted here.", + "pattern": "^[A-Za-z0-9][A-Za-z0-9_-]{0,63}$", + "type": "string" +}
- Changed
quote_faceless3 fields changed- added
Input schema / additionalPropertiesAdded value: +false - changed
Input schema / properties / duration_seconds / descriptionPrevious value: -"Selected length, 30 to 90 seconds, on a 1/25 s frame boundary. The video ends with its narration, runs at least 25 seconds and may exceed the selection by up to 5 seconds, never beyond 90 seconds. The charge never exceeds the quote. A script must fit this output range."New value: +"Selected length, 30 to 90 seconds, on a 1/25 s frame boundary. The video ends with its narration, runs at least 25 seconds and may exceed the selection by up to a quarter, never beyond 90 seconds; a video more than 5 seconds longer says so in warnings[]. The charge never exceeds the quote. A script is accepted when its estimated length is 21 seconds to the selection plus 5, at most 90." - added
Input schema / properties / voiceAdded value: +{ + "description": "Narration voice: a name from list_voices with skill=make_faceless (kind faceless_voice). Omitted means narrator_en_wise_lady. Choose a voice in the language of the narration: a voice reads any language, with the accent of its own. The API refuses an unknown name and a make_ugc voice before any charge. A raw voice_id is not accepted here.", + "pattern": "^[A-Za-z0-9][A-Za-z0-9_-]{0,63}$", + "type": "string" +}
5 tool updates
v0.25.0- Changed
list_voices3 fields changed- changed
Input schema / properties / language / descriptionPrevious value: -"Native language of the voice. A filter, not a limit: any voice speaks any supported language"New value: +"Native language of the voice. A filter, not a limit: any voice speaks any supported language. A voice with no language of its own (kind model_voice) matches the languages measured on its model" - changed
Input schema / properties / model / descriptionPrevious value: -"Only voices whose language this speech model supports"New value: +"Only voices this speech model speaks: presets and catalog voices whose language it supports, or the model's own voices (kind model_voice)" - changed
Input schema / properties / model / enumPrevious 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" +]
- Changed
make_faceless1 field changed- added
Input schema / properties / character_detailsAdded value: +{ + "description": "Optional fixed visual details for the referenced person or figure, such as hairstyle, clothing and absent accessories; applied to every generated scene.", + "maxLength": 400, + "minLength": 1, + "type": "string" +}
- Changed
make_ugc7 fields changed- changed
Input schema / properties / actor_gender / descriptionPrevious 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." - removed
Input schema / properties / disclosure_overlayRemoved value: -{ - "type": "boolean" -} - changed
Input schema / properties / script / descriptionPrevious 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." - changed
Input schema / properties / tts_model / descriptionPrevious 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." - changed
Input schema / properties / tts_model / enumPrevious 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" +] - changed
Input schema / properties / voice / descriptionPrevious 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." - changed
Input schema / properties / voice_id / descriptionPrevious 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."
- Changed
quote_faceless1 field changed- added
Input schema / properties / character_detailsAdded value: +{ + "description": "Optional fixed visual details for the referenced person or figure, such as hairstyle, clothing and absent accessories; applied to every generated scene.", + "maxLength": 400, + "minLength": 1, + "type": "string" +}
- Changed
quote_ugc7 fields changed- changed
Input schema / properties / actor_gender / descriptionPrevious 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." - removed
Input schema / properties / disclosure_overlayRemoved value: -{ - "type": "boolean" -} - changed
Input schema / properties / script / descriptionPrevious 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." - changed
Input schema / properties / tts_model / descriptionPrevious 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." - changed
Input schema / properties / tts_model / enumPrevious 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" +] - changed
Input schema / properties / voice / descriptionPrevious 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." - changed
Input schema / properties / voice_id / descriptionPrevious 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."
2 tool updates
v0.21.1- Added
make_faceless - Added
quote_faceless
12 tool updates
v0.20.0- First observed
create_actor - First observed
delete_actor - First observed
get_account - First observed
get_actor_defaults - First observed
get_run - First observed
list_actors - First observed
list_voices - First observed
make_ugc - First observed
quote_actor - First observed
quote_ugc - First observed
set_actor_defaults - First observed
upload_image
TDQS
Scored across 45 tools
Tools are mostly distinct thanks to detailed descriptions and cross-references, but with 45 tools there is inherent cognitive load and some pairs (e.g., upload_image vs create_upload, make_ugc vs make_faceless vs generate_video) require careful reading. The quote_* family clearly mirrors its corresponding action tools, reducing confusion.
All tools use snake_case with a consistent verb_noun pattern (e.g., list_*, get_*, create_*, quote_*, delete_*). No mixing of styles or vague verbs; the convention is predictable across the entire set.
45 tools is excessive for a single server, even a complex video-generation platform. Many tools could be consolidated (e.g., separate quote tools, multiple upload methods), making the surface feel heavy and harder to navigate.
The surface is remarkably thorough, covering planning, quoting, generation, editing, assets, actors, voices, analysis, and account management. Minor gaps exist (e.g., no list_runs or cancel_run), but core workflows are fully supported without dead ends.
Maintenance
Related MCP Connectors
UGC videos for your app with AI influencers who keep the same face. Hosted (OAuth) or local.
- PrizmadOAuthcom.prizmad
Generate AI UGC video ads from any product URL — avatars, voiceover, OAuth Connect.
Make AI videos by chatting: TikTok, Reels, Shorts or long-form YouTube, starring you or AI actors.
AI UGC videos of your store's products: read a product, write 3 scripts, make the video.
Related MCP Servers
- AlicenseNot gradedqualityDmaintenanceGenerate AI UGC video ads from any product URL in 5 minutes. Realistic AI avatars, natural voiceover, proven ad templates. No actors, no editing, no experience required.55 npm1MIT

instantclipsofficial
AlicenseAqualityBmaintenanceEnables turning e-commerce products into short-form vertical videos for TikTok, Instagram Reels and Stories, with tools for importing products, editing creative direction, and rendering videos.10417 npmMIT- AlicenseAqualityAmaintenanceMake UGC videos for mobile apps with AI influencers who keep the same face, from any MCP client. Create a character, generate new looks, turn a look into a 5 or 10 second clip, add your app screen recording and a hook, then download the finished vertical video. Needs a ClipUGC API key.1297 npm2MIT
- AlicenseNot gradedqualityBmaintenanceEnables AI assistants to create finished short-form videos with script, voiceover, scenes, captions, and music, delivering an MP4 ready for TikTok, Instagram Reels, and YouTube Shorts.206 npmMIT