{
  "$schema": "https://json-schema.org/draft/2020-12/schema",
  "$id": "https://artifacts.apis.io/cliponit-app/json-schema/cliponit-app-explainer-script-schema.json",
  "title": "ExplainerScript",
  "description": "Explainer script `{title, box, theme?, voice, cast?, gap?, subscribe_text?, scenes:[{say, date, credit, stamp?, camera?, elements:[{el, x, y, in, anim, loop, out, exit, k, color?, tint?, who?, scale?, anchor?, zoom?, …}]}]}` (see docs/explainer.md §1). `in`/`out`: seconds or `{word, occurrence?=1, offset?=0, edge?: \"end\"}` (instant that word of the scene's `say` is spoken, from the real voice timing). `cast` `{id: {hair, hair_color, beard, glasses, outfit, colors, party, label…}}` merged under any element with `who: id` (element wins). `scale` 0.25..6, `anchor` center|bottom, `zoom` `{to, at:[t0,t1], x?, y?}`; scene `camera.target` = element index. `gap` = silence between scenes (s, default 0.3, 0..2; 0 with an imported audio). `subscribe_text` = end-screen slogan (\"\" = none). `voice` = `{voice_id, model?, style?: 0..1 expressiveness, speed?: 0.5..2}` (ElevenLabs; catalogue and defaults in `GET /api/explainer/schema`, `voice.voice_id`); an old OpenAI voice `{model, voice, instructions}` still renders with OpenAI.",
  "x-generated": "2026-11-04",
  "x-method": "derived",
  "x-generator": "derive-json-schema.py",
  "x-source": "openapi/cliponit-app-openapi.yml#/components/schemas/ExplainerScript",
  "type": "object",
  "additionalProperties": true
}