Skip to main content
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