Skip to main content
Each example is a complete POST /v1/renders body with a video background and a text overlay. Only fields that differ from their defaults are shown (font_family: "Inter", text_color: "#ffffff", text_align: "center" are all defaults). See the element field reference for every default.
duration is required on text elements. Omitting it produces a zero-length window — the text will not appear in the render. The API returns 422 if duration is missing.
Every text overlay sets three groups of fields: x and y refer to the center anchor of the text box.

Minimal text

The required fields on a text element are text and duration. Centered on frame; visible from 1 s to 5 s.

Stroke (outline only, no fill)

Glyph outline with no fill — set stroke: true together with stroke_color and stroke_width. Top-center; visible from 0.5 s to 4.5 s. stroke_width is em-relative — a fraction of font_size, not pixels. 0.08 = 8% of the font size. Values above roughly 0.2 bury the glyph in its own outline.

Fill + stroke

White text with a colored stroke and fill — set stroke_color and stroke_width without stroke: true. Lower-third; visible from 2 s to 7 s.

Background

Solid color box behind the full text block. Bottom-center; visible from 1 s to 5 s.

Drop shadow

Text with a built-in drop shadow. Upper-center; visible from 0.5 s to 5.5 s.

Font controls

Bold italic with custom letter spacing and line height. Left-aligned block on the left edge; visible from 2 s to 8 s.
Set "text_direction": "rtl" for right-to-left scripts.

Per-word styling

words[] gives one word its own color and weight for the element’s whole life. The style vocabulary is exactly {color, bold, italic, underline}. Unlike word_animation, it coexists with motion[]. start/end are a separate channel: they retime that word inside a word-group animation and are ignored without one. Bind one of: a word_animation block, or a custom_animations.text entry with "group": "word" referenced from either motion[].custom (as below) or animation_preset. In the example, "launch" rises on its own 1.2–2.0 s window while the other three words run on the group’s default schedule. Swap the motion entry for a block preset like fade and the two timings stop doing anything.

Animated counter

counter rewrites the text from an eased numeric sweep — the animated stat hero. easing accepts named curves only (no spring / back / elastic). start_time is seconds into the element, not timeline seconds.
A counter element cannot also carry a per-glyph animation ("scope": "character", or a per-glyph animation_preset) — glyph timings are computed once against the placeholder text, so the later glyphs of a longer number never render. Use a block animation such as fade.

Glow

Soft glow around the glyphs. size is em-relative, like stroke_width.

Rotation

Tilted text using z_rotation — the only static rotation axis text has. x_rotation / y_rotation are a 422 on text. Offset to the lower-left; visible from 3 s to 8 s.

Shorthand animation preset

Use the animation_preset string for renderer animation presets like typewriter. Bottom-center caption bar; visible from 0 s to 6 s.

What text rejects

Text is a different renderer path from video and image, and the API refuses what the engine parses but never draws. Each of these returns 422 with a message naming the workaround.