Raw schema
{
"type": "object",
"properties": {
"title": {
"type": "string",
"maxLength": 120
},
"format": {
"default": "16:9",
"type": "string",
"enum": [
"16:9",
"9:16",
"4:5",
"1:1"
]
},
"duration": {
"type": "number",
"minimum": 3,
"maximum": 600
},
"script": {
"description": "One story beat per line; the Director paces scenes and captions to match mood and pace. Provide script OR entries.",
"type": "string",
"maxLength": 8000
},
"mood": {
"type": "string",
"enum": [
"cinematic",
"energetic",
"intimate",
"dark",
"dreamy",
"editorial"
]
},
"pace": {
"type": "string",
"enum": [
"slow",
"balanced",
"fast"
]
},
"presetId": {
"description": "Visual preset; see list_visual_presets.",
"type": "string",
"enum": [
"cinematic-noir",
"neon-pulse",
"paper-journal",
"dream-haze",
"horror-signal",
"clean-editorial",
"stage-spot",
"tape-deck",
"ice-cut",
"clean-slate"
]
},
"entries": {
"description": "Explicitly timed text, when you already know the timings.",
"maxItems": 300,
"type": "array",
"items": {
"type": "object",
"properties": {
"words": {
"type": "string",
"minLength": 1,
"maxLength": 200
},
"start": {
"type": "number",
"minimum": 0
},
"end": {
"type": "number",
"exclusiveMinimum": 0
},
"effect": {
"description": "How the line animates in. fade: The whole line fades from transparent to opaque without moving; on a word-timed line each word fades in separately over 0.3s at its own start. rise: The line fades in while travelling 18px (at 1080p, or an exact `distance`) from the `direction` side — up by default, so it starts below and settles upward. pop: The line scales up from 70% to full size while fading in, overshooting slightly past 100% before settling; set `fromScale` above 1 to settle down into place instead. slide: The line fades in while travelling 64px (at 1080p, or an exact `distance`) from the `direction` side — left by default, so it enters from the right. blur: The line resolves from a 14px defocus to sharp while fading in, then holds perfectly sharp and still; entrance only, never per-word. typewriter: Types the line one CHARACTER at a time at a constant rate, left to right, over `revealDuration` (default: the caption minus its hold). word-reveal: Reveals the line one whole WORD at a time with no motion — chunkier and more legible than typing; use `typewriter` for character-by-character. karaoke: The full line is visible from the first frame and the accent colour sweeps continuously through it, left to right, following measured word timings when the line has them. cascade: Words rise 18px and fade in one after another, 0.3s each and `stagger` (default 0.06s) apart, then hold still — a one-time ripple entrance, not a repeating wave. scatter: Breaks the line into separate words placed around the anchor at seeded offsets, tilts and sizes, each stamping in over 0.34s from 35% size; a lyric-card collage, best on 2–5 word lines. beat: The line snaps 5.5% larger on each detected music beat (9% on downbeats) and springs back within about a quarter second; with no beat grid it ticks steadily every 0.75s. breathe: The line oscillates smoothly and continuously between 97.5% and 102.5% scale, twice a second by default (`breathePeriod`), for as long as it is on screen. float: Each word drifts continuously in a slow figure-eight of about 4px vertically and 2px horizontally on a 2.2s loop, out of phase with its neighbours. slam: The line arrives at 190% size and accelerates down to full size in under 0.25s; set `fromScale` below 1 to punch UP from small instead, and `wobble` above 0 to add a decaying rattle. glitch: After the normal fade-in the line tears in 80ms bursts about a third of the time — red/cyan copies offset up to 6px plus a small jitter — for as long as it is on screen.",
"type": "string",
"enum": [
"fade",
"rise",
"pop",
"slide",
"blur",
"typewriter",
"word-reveal",
"karaoke",
"cascade",
"scatter",
"beat",
"breathe",
"float",
"slam",
"glitch"
]
}
},
"required": [
"words",
"start",
"end"
]
}
},
"scenes": {
"maxItems": 60,
"type": "array",
"items": {
"type": "object",
"properties": {
"name": {
"type": "string",
"maxLength": 60
},
"start": {
"type": "number",
"minimum": 0
},
"end": {
"type": "number",
"exclusiveMinimum": 0
},
"background": {
"description": "CSS color or gradient only — images are added by the human in the editor.",
"type": "string",
"maxLength": 300
}
},
"required": [
"start",
"end"
]
}
}
},
"$schema": "http://json-schema.org/draft-07/schema#"
}