Motion presets are set via the motion array on video, image, text, and shape elements, and on groups[].animations. Only fields that differ from their defaults are shown (reversed defaults to false). easing is accepted but ignored by the renderer — a preset’s curve is baked into its keyframes; to control the curve, author a custom animation and set easing (or spring / back / elastic / bezier) on its keyframes.
For text and image elements, duration is required — the API returns 422 if it is missing. video and audio elements have no duration field — use out_point to control clip length.
Fade in
Fade the element in over 0.5 seconds at the start. Text is visible from 1 s to 5 s over video. time on the motion object is absolute timeline seconds — the same clock as the element’s own time. Match it to the element’s time for entrances, and set it to element time + duration − motion duration for exits. delay pushes the start later still — it is folded into the wire start time rather than being a standalone pre-start pause, and on loop presets it spaces the repeats instead.
Fade out (reversed)
Use "reversed": true to play the exit variant of any motion preset. Text visible from 0 s to 6 s; the fade-out runs during the last second of that window.
Position in (slide)
Text slides in at 2 s, stays for 3 s, anchored on the left side of the frame.
Ken Burns (video / image)
Slow pan and zoom on footage.
Looping animation
Continuous motion while the element is visible. Text visible from 1 s to 7 s; set the loop preset duration to match the element’s duration.
Loop presets split by surface: loop_breathe, loop_shimmer, and loop_rotate resolve on text; the rest are element-only and return 422 on a text element.
The element-only loops go on video / image / shape instead.
Per-character animation (text only)
Animate each character individually with "scope": "character". Only supported on text elements. Text visible from 0.5 s to 4.5 s.
Supported types: bounce, blur, evaporate, rubber_in, whip_up, whip_down, glitch_pop, drift_in, drift_out, loop_breathe, loop_shimmer. Add spacing — a stagger multiplier, 1 = fully sequential, smaller values overlap the glyph windows — to control the cascade.
Block-level presets (fade, slide_*, zoom_in, zoom_out) move the whole text block and return 422 for scope: "character". GET /v1/capabilities carries the per-preset truth in motions[].character.
Audio-reactive motion
Offsets driven by the soundtrack’s FFT. feature is one of amplitude, bass, mid, high, beat; scale, opacity, rotate, and translate are offsets per unit feature. For a pure generator with no visible motion of its own, use type: "identity" — the engine’s no-op carrier.
audio works on video, image, shape, and group animations. It is a 422 on text — the engine never arms the FFT for a text animation; put the text in an audio-reactive group instead.
Custom animations
Name a custom_animations entry with motion[].custom instead of type. Exactly one of type or custom must be set — both, or neither, is a 422. Keyframe time here is a 0–1 fraction of the animation, not seconds.
reversed: true and scope: "character" are both 422 on a custom motion — author the exit as its own entry, and put "group": "glyph" (or "word") on the definition for per-glyph work. Text definitions go in custom_animations.text, element definitions in custom_animations.element; a motion[].custom name resolves only against this request’s registry.
All motion types
42 presets. Surface says where a preset resolves — element covers video / image / shape and groups[].animations; text block is a whole text element; character is per-glyph via "scope": "character". Asking for a preset on a surface it does not cover is a 422; GET /v1/capabilities carries the same matrix in motions[].
Types marked both have an exit variant — add "reversed": true to play it. The six exit only types (zoom_out, evaporate, whip_down, drift_out, swing_out, elastic_drop) set reversed for you and never need it in the request. Asking for "reversed": true on an entrance-only preset is a 422 — the error names the exit-only replacement.
Opacity
Position
Scale & bounce
Wipe
Rotation
Ken Burns
Element-only
Text-only
Looping