sourceId from create_source (kind: "image" or kind: "video" — upload the bytes first); the overlay type follows the source’s kind.
- Position is a percentage
point, so it survives aspect-ratio changes; size is a pixeldimensionsbox, so the shape never distorts. - New overlays start with a hard cut unless you pass
animation. Useanimationon adds or updates to make them fade, slide, scale, rotate, or blur in and out. - New overlays start in front. Pass
depthtoadd_overlayorupdate_overlayto place one behind the person on camera, andzIndexonupdate_overlayto change their stacking order. That works in any layout: a fullscreen clip keeps its room, with the overlay between the room and the person, so it needs no cut-out layout.
All times are milliseconds on the clip’s playback timeline — the video as watched, with cuts applied. It is the same timeline as
get_transcript, thumbnails, and previews, so nothing needs converting. A start at or past the end of the clip is rejected with a 400.Animate overlays
Passanimation to add_overlay or update_overlay to animate the overlay’s entrance and exit. The same input works on the matching REST API routes and the add_media_overlay / update_media_overlay operations in apply_video_edits.
intromoves from a hidden state into the overlay’s resting position;outromoves back to a hidden state.presetcan befade,slide_up,slide_down,slide_left,slide_right,mask_up,mask_down,grow,shrink,blur, orblur_slide_up. Directions describe travel:slide_upenters from below and exits upwards.- Customize a side with
moveX/moveY(fractions of the overlay’s width / height, positive right / down),rotate(clockwise degrees),scale(1 is resting size),opacity(0–1),blur(0–200 pixels), orclip(restrict motion to the overlay’s box). durationMsis 50–5000 ms, defaulting to 500 for a new side. Entrance and exit durations shorten together if they cannot fit the overlay’s time range.easingtakes acurve:linear,smooth,natural,slow_down,accelerate,elastic,bounce,overshoot,impulse,swing,custom, orspring. Shaped curves acceptintensityfrom 0–1 (default 0.5). Forcustom, supplybezier: [x1, y1, x2, y2]; forspring, supplyspring: {stiffness, damping, mass}. Spring physics determine the duration.motionBlurdefaults totrue; set it tofalseto disable motion blur for this overlay.
intro: null or outro: null removes that side. A side starts from the supplied preset, or its current settings, and other supplied fields adjust it.
An animation replaces transition. Send animation: null on an update to restore the stored transition. Setting transition without animation also removes the animation. Unsupported combinations return an argument error (HTTP 400 on REST); in a batch, validation rejects the whole batch before any edits apply.
list_overlays
List the image, video and Tella Motion overlays on a clip. A Tella Motion overlay is listed withtype: "motion" and the motionDocumentId it plays. Each result includes its zIndex in the shared image, video, text, and Lottie overlay stack, from 0 (back) upward. Lottie overlays share the stack but aren’t listed, so the reported positions can skip a number.
string
required
Video ID
string
required
Clip ID
add_overlay
Add an image or video overlay on top of a clip. Callcreate_source first (kind: "image" or kind: "video"), PUT the bytes, then pass the returned sourceId — the overlay type follows the source’s kind. When point/dimensions are omitted, a centered box is computed from the source.
string
required
Video ID
string
required
Clip ID
integer
required
Start time in ms
integer
required
Duration in ms
string
Source ID from
create_source. Pass this or motionDocumentId.string
In place of
sourceId: a Tella Motion document of this video’s (ffd_…), from create_motion_document, or one of yours that no video plays yet, which this video then takes over. It is linked, not copied, so edits to the document show in the video at once. The document must not play anywhere else yet; one that another overlay, b-roll or clip plays returns 409, so copy it with duplicate_motion_document first.string
Overlay name
object
Top-left corner —
{xPct, yPct} (0-100), as a percentage of the video canvasobject
Overlay size in artboard pixels —
{width, height}, both greater than 0enum<string>
front (default) or behind_presenter, the same values as update_overlay.array
Changes of
depth over the overlay’s own time, each held until the next: {"atMs": 1200, "depth": "front"} moves it in front of the presenter 1.2 s after the overlay starts, so one overlay can pass behind and in front of them (a ring orbiting their head, a title they step in front of). depth is where it starts. On updates, omit it to leave the changes as they are and pass [] to remove them. The same field works on the matching REST routes and apply_video_edits operations.object
Entrance and exit animation. See Animate overlays.
update_overlay
Update an existing overlay. Only provided fields change.string
required
Video ID
string
required
Clip ID
string
required
Overlay ID
integer
New start time in ms
integer
New duration in ms
string
Overlay name
object
New top-left —
{xPct, yPct} (0-100)object
New size in artboard pixels —
{width, height}, both greater than 0object | null
Update entrance and exit animation;
null restores transition. See Animate overlays.enum<string>
Intro and outro animation —
smooth fades the overlay in and out, while hard_cut makes it appear and disappear instantly. Setting this without animation removes any animation.enum<string>
front paints the overlay over everything. behind_presenter places it behind the presenter (the person in the clip’s camera recording, or in its uploaded footage when there is no camera) but over everything else. In fullscreen and framed layouts the recorded room stays around the person, so the overlay sits between the room and them; a cut-out layout replaces the room with the clip background. Without a presenter, the overlay stays in front.array
Changes of
depth over the overlay’s own time, each held until the next: {"atMs": 1200, "depth": "front"} moves it in front of the presenter 1.2 s after the overlay starts, so one overlay can pass behind and in front of them (a ring orbiting their head, a title they step in front of). depth is where it starts. On updates, omit it to leave the changes as they are and pass [] to remove them. The same field works on the matching REST routes and apply_video_edits operations.integer
Stacking position, 0 at the back. Must be non-negative; a value past the top moves the overlay to the front. Other overlays keep their relative order.
list_overlays, add_overlay, and update_overlay return the current animation (or null), transition, depth, and zIndex. depth takes precedence over stacking order: behind_presenter stays behind the presenter at any zIndex. The video timeline also reports zIndex. To reorder several overlays in one call, pass zIndex on update_media_overlay operations in apply_video_edits.
remove_overlay
Remove an overlay from a clip.string
required
Video ID
string
required
Clip ID
string
required
Overlay ID