Tool reference¶
The zeyocut server has 90 tools and 4 workflow prompts. Each is listed here as the server describes it to the model, with its parameters. The guide shows how they work together, with an example call and the real response for each. One more tool, describe_clip, appears only when a clip describer is configured (see the guide).
| Tool | What it does |
|---|---|
add_audio_layer |
Add an audio layer from an imported audio asset. |
add_caption_track |
Add the captions of one language as a track of their own: text layers under a null layer captions_<language> (e.g. captions_ja) tagged with that language, so each language's version shows only its own captions (render_frame and start_export take language). |
add_image_layer |
Add an image layer (a cutout part or a still). |
add_markers |
Add or change project markers in one call (one undo step; all-or-nothing): named points on the timeline, each a chapter (the default) or a scene. |
add_rig |
Place a rig from the library in the open project (one undo step). |
add_sfx |
Add a sound effect from the library at a time (one undo step): the file is imported into the project once (later adds of the same sound reuse the asset) and placed as an audio layer with role effects, so music ducking leaves it alone. |
add_text_layer |
Add a text layer (titles, subtitles). |
add_transition |
Add a transition between layerA and layerB, which must be back to back (or already overlapping). |
add_video_layer |
Add a video clip from a video asset. |
analyze_video |
Analyze a video (or audio) asset in the background: scene cuts (ffmpeg scdet), the noise floor and silences, and a word-level transcript (whisper-cli, if WHISPER_PATH/WHISPER_MODEL are set or whisper-cli is on PATH). |
apply_action |
Play a saved action on a rig in the open project (one undo step). |
apply_redaction |
Hide tracked faces, plates or objects (one undo step): adds a redaction layer (type redaction) that hides the box of each track on the video frame before the clip is drawn, in every clip that plays the track's footage, so moves, effects, the camera and subject cutouts all show it hidden, and splits, trims and speed changes keep it in step. |
apply_style |
Restyle a text layer, or every text layer under a group (e.g. 'captions'), with a library style (one undo step). |
attach_to_track |
Keep a text or image layer on a track's box (one undo step), such as a name over a face or a sticker on a sign: x and y keyframes, and scaleX and scaleY with followScale, on every frame where a clip shows the footage the track found the object in, through the clip's placement, parents and crop, the camera, and the layer's own parent. |
audio_levels |
Measure the sound exactly as the export would mix it (fades, music ducked under voice, loudness normalization): integrated loudness (LUFS, ITU-R BS.1770) and sample peak (dBFS) for the whole mix and per section, and flags clipping (samples at full scale), sections more than 10 LU quieter than the whole mix, a whole mix below -24 LUFS with normalization off, and silences of 1s or more in the middle (silence at the very start or end is listed but not flagged). |
auto_lip_flap |
Animate a mouth to a voice (one undo step): measures the loudness of every frame of the sound as it plays on the timeline (start and trim respected), gives quiet frames the closed drawing and louder frames the open drawings (listed from slightly to wide open), holds every drawing at least 2 frames so the mouth doesn't flicker, and writes hold keyframes on the mouth's drawing over the time both play, replacing the drawing keyframes there. |
build_from_script |
Build a whole episode from a script and open it as a new project: the canvas or a library template, then each scene's rigs (shown for that scene), actions, sound effects and captions at their times, and a scene marker at each scene's start. |
camera_shake |
Shake the camera (one undo step): writes seeded keyframes on the camera's shakeX, shakeY and shakeRotation channels, on top of its own movement, fading out to still at the end. |
check_project |
Check the open project for problems before export: assets whose files are missing, layers that are never on the canvas while shown, text reaching into the 5% title-safe margin (on vertical 9:16 canvases: the Shorts player UI, top 8%, bottom 25%, right 12%), characters a text's font has no glyphs for (each text is shaped with HarfBuzz, as it is drawn), stretches where nothing but the background shows, keyframes outside a layer's time that never play, and assets no layer uses. |
clear_keyframes |
Remove all keyframes of one property, or of every property of a layer when property is omitted (that also takes a motion path off). |
create_project |
Create a new project folder (project.json + assets/ renders/ exports/) and open it. |
cut_by_transcript |
Remove words from a video or audio layer by their transcript indices (the [n] numbers from get_transcript), with ripple. |
detect_and_track |
Find every face or license plate in a video clip with an AI model and link each into a track (face_1, face_2, ... |
detect_beats |
Find the beats of a music (or other audio or video) asset: onsets from the spectral flux of the sound, the tempo from their autocorrelation (60-200 BPM, favoring 120 between octaves), and a steady beat grid fitted to the onsets. |
duplicate_layer |
Copy a layer, by default with all its children (a whole rig), including keyframes. |
export_batch |
Export the open project once per preset in one background job, one file after another, to exports/<fileName>_<preset>.mp4 (e.g. launch_youtube_1080p.mp4 and launch_shorts_1080p.mp4). |
export_fcpxml |
Write the timeline as Final Cut Pro XML (FCPXML 1.9, which DaVinci Resolve also reads) to exports/<fileName>: the first video track as the primary storyline with gaps through to the end, and every other clip connected above it (video, then the layers prerendered by prerender_layers) or below it (the sound the export mixes), with their timing, trims and speed in whole frames, and the markers (chapters as chapter markers). |
export_frames |
Write every frame from startTime to endTime (both included, snapped to frames) as numbered images at the canvas size, exactly as exported, to exports/<project>frames/frame<frame>.png, where <frame> is the project frame number in 5 digits (frame_00012.png). |
export_language_versions |
Export the open project once per language and preset in one background job, one file after another, to exports/<fileName><language><preset>.mp4 (e.g. launch_ja_shorts_1080p.mp4). |
export_markers |
Write the chapter markers as a YouTube chapter list to exports/<fileName>, to paste into the video's description: a "m:ss Name" line per chapter ("h:mm:ss" from an hour on), in whole seconds. |
export_otio |
Write the timeline as OpenTimelineIO (.otio) to exports/<fileName>, for another editor such as DaVinci Resolve: each video clip's picture on video tracks (V1 at the bottom, a clip above the clips drawn before it that it overlaps), the layers prerendered by prerender_layers on tracks above them, the sound the export mixes on audio tracks, and the markers. |
export_srt |
Write the captions (the text layers under the caption group) as an .srt subtitle file to exports/<fileName>, with timeline times. |
export_thumbnail |
Save one frame as a PNG thumbnail in exports/ (default 1280x720, YouTube's thumbnail size) and return a preview of it. |
frame_diff |
Find glitch frames: renders every frame of the range small (160 px wide), scores how much each one changed from the previous one (0-100% mean color difference) and flags 'glitch' (a single frame unlike both neighbors while they match each other, e.g. a stray one-frame layer) and 'spike' (a large change with no layer starting, ending or swapping drawings there). |
generate_captions |
Turn the transcript of an analyzed asset (analyze_video) into caption text layers under a null layer 'captions' (one undo step). |
get_export_status |
Progress of an export job; when finished, the output path, duration, resolution, fps, codecs and file size. |
get_job_status |
Progress or result of a background job: import_N (import_video normalization), analyze_N (analyze_video), framediff_N (frame_diff), audiolevels_N (audio_levels), beats_N (detect_beats), batch_N (export_batch), versions_N (export_language_versions), frames_N (export_frames), prerender_N (prerender_layers), matte_N (remove_background, text_behind_subject or generate_captions with aiImage or aiVideo), occlusion_N (text_occlusion), captions_N (generate_captions behindSubject=auto), syscheck_N (system_check), tracking_N (track_object or reanchor_track over more than 150 frames), detect_N (detect_and_track; when done it also shows the contact sheet of the tracks), proxy_N (the 1920 px proxy of footage over 2560 px, made by import_video, import_folder and open_project) or export_N (start_export). |
get_logs |
Read the server's log, oldest first: the last lastN entries of the log files (zeyocut-yyyyMMdd.jsonl in the log folder, one JSON object per line). |
get_project |
Return the full project model (project.json) of the open project. |
get_transcript |
Read the word-level transcript of an analyzed asset (run analyze_video first). |
import_asset |
Copy an image (png/jpg/webp/bmp), audio (wav/mp3/m4a/aac/ogg/opus/flac) or font (ttf/otf/ttc) file into the project's assets folder and register it. |
import_folder |
Import every image, audio, font and video file in a folder (not its subfolders) whose name matches pattern, in order: by name with numbers in order (panel_2 before panel_10), or by date, oldest first. |
import_srt |
Import a .srt subtitle file as the caption track of its language, as add_caption_track does with srt: text layers under a null layer captions_<language>, replacing that language's track if there is one (one undo step). |
import_video |
Import a video file (mp4/mov/m4v/mkv/webm/avi) as a video asset. |
list_assets |
List the project's assets with their ids, types, sizes or durations, and which layers use them. |
list_layers |
Show the layers as a parent/child tree with type, zIndex, time range, language, anchor and keyframed properties. |
list_library |
List what is in the shared library: rigs, actions, styles and templates, with a short description of each. |
list_projects |
List the projects in the projects root folder. |
list_sfx |
List the sound effects in the shared library's sfx folder (wav, mp3, ogg and other audio files; subfolders are categories), with their durations. |
move_layer |
Move a layer to a new timeline start, together with its children and keyframes. |
new_project_from_template |
Create a new project from a library template and open it. |
open_project |
Open an existing project by name (a folder under the projects root) or by absolute folder path. |
prerender_layers |
Render layers alone, each with its children, on a transparent background as ProRes 4444 .mov files with alpha in exports/<project>_prerender/<layer id>.mov: every frame the layer is on, as render_frame draws it with layerId and a transparent background. |
preview_server |
Start or stop the preview page, for a browser on this computer: a timeline scrubber, the layers, and playback of low-res frames with the sound mixed as the export mixes it. |
reanchor_track |
Correct a track where it drifted (one undo step): set the box at 'time' (canvas pixels, as render_frame shows that frame) and track again from there, away from the frame track_object started at, up to the next box set by hand or the end of the track. |
redaction_report |
Check how well the redactions hide their tracks; changes nothing. |
redo |
Redo the last undone change. |
refine_matte |
Fix the edges of a removed background (one undo step): shrink pulls the edge in by that many pixels to cut off a halo of the old background (negative grows it back, whole pixels), feather softens it over about that many pixels. |
reframe_to_vertical |
Fit landscape video layers to a vertical canvas (switch it first with update_project preset=shorts_1080p): each clip gets a full-height crop with the canvas' aspect ratio at focusX, centered and scaled to fill the frame. |
remove_background |
Remove the background of an image or video layer so what is behind it shows through (one undo step; replaces an earlier removal, keeping refine_matte's shrink and feather). |
remove_keyframes |
Remove specific keyframes (all-or-nothing). |
remove_layer |
Remove a layer. |
remove_markers |
Remove project markers (one undo step): the ones named in markerIds, every marker with markerIds ["all"], or every marker of one kind with kind. |
remove_range |
Cut timeline seconds start..end out of one layer (and its children) or out of every layer (layerId "all"). |
remove_silences |
Cut the silent parts out of a video or audio layer with ripple (later layers move left and the project gets shorter), keeping 'padding' seconds of quiet next to the remaining sound. |
render_contact_sheet |
Render several evenly spaced frames into one labeled grid image to check motion over time in a single call. |
render_frame |
Render one frame exactly as it will appear in the export and return it as a PNG. |
report_render_stats |
Where a finished export's time went: per stage (evaluating keyframes, decoding video and images, redaction, background removal and cutouts, text, effects and masks, drawing layers, fitting the canvas into a preset, waiting for the encoder, measuring the loudness), the slowest layers and the slowest frames; times under 5 ms are left out. |
restore_backup |
List the open project's backups, newest first, or put one back. |
save_action |
Save a rig's animation between two times to the library as a reusable action (walk cycle, jump, wing flap, double-take). |
save_rig |
Save a character rig to the shared library (used by every project): the root layer and everything parented under it, with anchors, drawings, parenting and draw order, posed as it is at 'time'. |
save_style |
Save a text layer's look (font, bold, size, color, outline, alignment, line height, background box) as a named style in the library. |
save_template |
Save layers of the open project (intro, outro, end screen, watermark, fixed layers) with the canvas, frame rate and audio settings as a template in the library, with their asset files. |
set_camera |
Set the project camera's fixed values (one undo step). |
set_effect |
Add, change or remove one effect on a visual layer (one undo step). |
set_keyframes |
Add or replace many keyframes in one call (one undo step; all-or-nothing). |
set_mask |
Add, change or remove the layer's mask (one undo step): the layer shows only inside a rectangle, an ellipse or an image's opaque pixels, or only outside with invert=true. |
set_motion_path |
Move a layer along a curve through timed points (one undo step; replaces an earlier path). |
set_speed |
Change a video layer's playback speed (0.1..10) keeping its start; its keyframes and children stretch with it. |
split_layer |
Split a layer (and its children) at a timeline time into two layers that play exactly as before. |
start_export |
Start exporting the open project to exports/<fileName> as H.264 MP4 (yuv420p) with all audio layers mixed: music ducked under voice and the mix loudness-normalized (two-pass loudnorm, -14 LUFS by default; see update_project). |
system_check |
Report this computer: whether FFmpeg (needed for video and every export) and whisper (for transcripts) are installed, with how to install them; the folders ZeyoCut uses; and for the AI features the CPU, RAM, GPU, the ONNX Runtime version, which AI models are downloaded and the device each one runs on (DirectML on the GPU, or the CPU). |
text_behind_subject |
Put text behind the subject of a clip or picture, like a title behind a presenter (one undo step): the text stays in front of the background, and the subject is drawn again above it, cut out. |
text_occlusion |
Measure how much of a text layer is covered by what is drawn above it (a subject cutout from text_behind_subject, or any other layer), frame by frame: the min, max and average share of the text hidden, and the frames in runs of equal values (every frame is saved to renders/text_occlusion_<id>_<first>-<last>.json). |
track_object |
Follow an object through a video clip with OpenCV and save its box on every frame as a track (one undo step). |
tracks_to_keyframes |
Turn a hidden track's box into keyframes on its redaction (one undo step), to edit by hand: x, y, width and height keyframes named <track>.x, <track>.y, <track>.width and <track>.height on the redaction layer, made from the fail-safe box (padding, gaps, holds and smoothing included) and kept only where needed to stay within 0.2 px of it. |
undo |
Undo the last change to the open project (in-memory history of this session, up to 200 steps). |
update_layer |
Change static fields of a layer. |
update_project |
Change the open project's settings. |
view_source |
Contact sheet of a video asset's own frames (not the timeline), each labeled with its source time and frame number, to find trim and cut points before or after adding the clip. |
Tools¶
add_audio_layer¶
Add an audio layer from an imported audio asset. Audio is only heard in the export (mixed by FFmpeg).
| Parameter | Type | Description |
|---|---|---|
asset |
string, required | Audio asset id. |
id |
string | |
name |
string | |
start |
number | When the sound starts on the timeline, seconds. Default 0. |
end |
number | Cut the sound at this timeline time, seconds. |
trimIn |
number | Start point inside the source file, seconds. Default 0. |
trimOut |
number | End point inside the source file, seconds. Default: end of file. |
volume |
number | Linear gain, 1 = original. Default 1. |
fadeIn |
number | Fade-in length, seconds. |
fadeOut |
number | Fade-out length, seconds. |
role |
string | What the sound is in the mix: music (default; ducked under voice), voice (voiceover, dialogue) or effects. |
language |
string | Language tag (en, ja, my, pt-BR): the sound is only in that language's version, e.g. a dubbed voice. Default: every version. |
add_caption_track¶
Add the captions of one language as a track of their own: text layers under a null layer captions_<language> (e.g. captions_ja) tagged with that language, so each language's version shows only its own captions (render_frame and start_export take language). Give exactly one source: cues (the start, end and text of each caption, e.g. a translation you wrote from get_transcript), srt (SRT subtitle text, or the path to a .srt file) or fromTranscript (an analyzed asset: its transcript's words, timed through the clips that play it, as generate_captions does). Adding a language's track again replaces it; one undo step. The captions get the language's font from the settings (my: Myanmar Text, ja: Yu Gothic) unless fontFamily is given, and the look of the style: subtitle (default), bold_center, minimal or a library style. Cues without text or past the project end are left out, one running past the end is shortened, and overlapping cues are named. The reply warns about characters the font has no glyphs for.
| Parameter | Type | Description |
|---|---|---|
language |
string, required | The captions' language: en, ja, my, pt-BR. |
cues |
array of objects | The captions: [{start, end, text}], seconds on the timeline; \n in a text breaks the line. |
cues[].start |
number | When the caption appears, seconds on the timeline. |
cues[].end |
number | When it goes, seconds (after start). |
cues[].text |
string | The caption's text; \n breaks the line. |
srt |
string | SRT subtitle text, or the path to a .srt file. |
fromTranscript |
string | An analyzed asset (analyze_video) whose transcript becomes the captions. |
style |
string, default "subtitle" |
subtitle, bold_center, minimal or a library style name. Default subtitle. |
fontFamily |
string | Font family. Default: the language's font from the settings, otherwise the style's. |
fontSize |
number | Font size in pixels. Default: scaled to the canvas per style. |
color |
string | Text color. Default #FFFFFF. |
add_image_layer¶
Add an image layer (a cutout part or a still). Give one image with 'asset', or several named drawings with 'drawings' (swap them with keyframes on the 'drawing' property). With neither, the layer is an invisible null that only carries a transform (useful as a rig root). x,y is where the anchor lands in the parent's pixels (canvas for top-level layers).
| Parameter | Type | Description |
|---|---|---|
asset |
string | Image asset id for a single drawing named 'normal'. |
drawings |
object, name → string | Named drawings, e.g. {"normal": "head_png", "shocked": "head_shocked_png"}. |
drawing |
string | Drawing shown initially. Default: the first drawing. |
id |
string | Layer id. Default: derived from name or asset. |
name |
string | Display name. |
parentId |
string | Parent layer id; this layer then moves with the parent. |
x |
number | Position of the anchor in the parent's pixels. Default: canvas center, or the parent's anchor for children. |
y |
number | See x. |
anchorX |
number | Pivot in this image's own pixels. Default: image center. |
anchorY |
number | See anchorX. |
rotation |
number | Degrees, clockwise. |
scaleX |
number | |
scaleY |
number | |
opacity |
number | 0..1 |
zIndex |
integer | Draw order across all layers (higher is in front). Default: on top. |
start |
number | Seconds. Default 0. |
end |
number | Seconds (exclusive). Default: project end. |
flipX |
boolean | Mirror this layer's pixels around anchorX (children are not flipped). |
visible |
boolean | |
language |
string | Language tag (en, ja, my, pt-BR): the layer and its children are only in that language's version. Default: every version. |
add_markers¶
Add or change project markers in one call (one undo step; all-or-nothing): named points on the timeline, each a chapter (the default) or a scene. A marker whose id exists is changed: moved, renamed, and its kind changed only when given. Otherwise it is added, with an id made from its name unless one is given. Markers move with the timeline when remove_range, remove_silences, cut_by_transcript, set_speed or a crossfade ripple it; a marker inside removed time moves to where the cut is. list_layers shows them.
| Parameter | Type | Description |
|---|---|---|
markers |
array of objects, required | Markers: [{time, name, kind, id}]. |
markers[].time |
number | Time in seconds, from 0 to the project end. |
markers[].name |
string | The marker's name, one line; for a chapter, its title. |
markers[].kind |
string | chapter (the default for a new marker) or scene. |
markers[].id |
string | An existing marker's id, to change that marker; or the id for a new one (default: made from the name). |
add_rig¶
Place a rig from the library in the open project (one undo step). Layer ids are <instanceName>_<part> (tora_head, tora_2_head for a second copy); the drawings are copied into assets/ once and shared by later copies. The rig is drawn on top of the existing layers, keeping its own part order.
| Parameter | Type | Description |
|---|---|---|
name |
string, required | Rig name from list_library. |
x |
number | Where the root's anchor lands, canvas pixels. Default: canvas center. |
y |
number | See x. |
startTime |
number, default 0 |
When the rig appears, seconds. Default 0. |
scale |
number, default 1 |
Multiplies the root's scale (0..100]. Default 1. |
instanceName |
string | Id prefix for the parts. Default: the rig name, numbered when taken. |
add_sfx¶
Add a sound effect from the library at a time (one undo step): the file is imported into the project once (later adds of the same sound reuse the asset) and placed as an audio layer with role effects, so music ducking leaves it alone. Change it afterwards like any audio layer (update_layer, move_layer).
| Parameter | Type | Description |
|---|---|---|
name |
string, required | Sound effect name from list_sfx (impacts/thud, or thud when unique). |
time |
number, required | When it plays, seconds on the timeline. |
volume |
number, default 1 |
Volume 0-10, 1 = as recorded. Default 1. |
add_text_layer¶
Add a text layer (titles, subtitles). Complex scripts are shaped with HarfBuzz; use fontFamily "Myanmar Text" for Burmese and "Yu Gothic" for Japanese. With a language and neither fontFamily nor fontAsset, the text gets that language's font from the settings (my: Myanmar Text, ja: Yu Gothic), even over a style's font. Warns about characters the font has no glyphs for. The text's own pixel space starts at the top-left of its box; the box is maxWidth wide if set, otherwise as wide as the longest line. Returns the measured box size. 'style' fills in everything you leave out from a library style (save_style).
| Parameter | Type | Description |
|---|---|---|
text |
string, required | The text. Use \n for line breaks. |
id |
string | Layer id. Default: derived from the text. |
name |
string | |
fontFamily |
string | Installed font family. Default "Segoe UI". |
fontAsset |
string | Font asset id (an imported ttf/otf); overrides fontFamily. |
bold |
boolean | |
fontSize |
number | Pixels. Default 48. |
color |
string | #RRGGBB or #RRGGBBAA. Default #000000. |
strokeColor |
string | Outline color. |
strokeWidth |
number | Outline thickness in pixels outside the glyphs. Default 4 when strokeColor is set. |
align |
string | left, center or right (within the box). |
maxWidth |
number | Wrap lines to this width in pixels. |
lineHeight |
number | Multiple of the font's natural line spacing. Default 1. |
box |
object | Optional background box behind the text. |
box.color |
string | Box color, #RRGGBB or #RRGGBBAA (default #000000B3). |
box.padding |
number | Padding around the text in pixels (default 16). |
box.cornerRadius |
number | Corner radius in pixels (default 0). |
parentId |
string | |
x |
number | Where the anchor lands. Default: canvas center. |
y |
number | |
anchorX |
number | Pivot in the text box's pixels. Default: box center. |
anchorY |
number | |
rotation |
number | |
scaleX |
number | |
scaleY |
number | |
opacity |
number | |
zIndex |
integer | |
start |
number | |
end |
number | |
style |
string | Library style name (list_library); explicit parameters override it. |
language |
string | Language tag (en, ja, my, pt-BR): the layer and its children are only in that language's version. Default: every version. |
add_transition¶
Add a transition between layerA and layerB, which must be back to back (or already overlapping). crossfade overlaps them by 'duration' using unused source on each side where there is some and ripples B and later layers left for the rest, then fades B in (or A out if A is drawn on top) and crossfades the sound. fadeToBlack (image/video layers) darkens A to black over the last half of 'duration' and brings B up from black over the first half. wipe, slide, zoom and whipPan (image, text or video layers) overlap the clips the same way as crossfade, then: wipe sweeps an edge across the layer drawn on top with a rectangle mask (it must not have a mask yet); slide pushes A out of the frame and B in by the canvas width or height; zoom scales A up 2x (in) or down to half (out) while B comes from half size (or 2x) to its own size, around their centers, and the top one fades; whipPan is a slide with motion blur that peaks in the middle (blur effects are added). Everything is baked into keyframes you can adjust afterwards.
| Parameter | Type | Description |
|---|---|---|
layerA |
string, required | |
layerB |
string, required | |
type |
string, default "crossfade" |
crossfade, fadeToBlack, wipe, slide, zoom or whipPan. Default crossfade. |
duration |
number, default 0.5 |
Transition length, seconds. Default 0.5. |
direction |
string | wipe, slide, whipPan: which way the edge or the pictures move, left, right, up or down (default: wipe right, slide and whipPan left). zoom: in (default) or out. |
add_video_layer¶
Add a video clip from a video asset. The clip plays source seconds trimIn..trimOut at 'speed', starting at timelineStart; it lasts (trimOut - trimIn) / speed on the timeline (video layers have no 'end'). By default it is centered and scaled to fit the canvas. It takes every transform and keyframe like an image layer, plus brightness (-1..1, 0 = unchanged; -1 is black), contrast and saturation (0..4, 1 = unchanged) and an optional crop (cropWidth/cropHeight in source pixels via update_layer; cropX/cropY are animatable). Its sound is mixed into the export unless muted. A clip that runs past the project end extends the project.
| Parameter | Type | Description |
|---|---|---|
assetId |
string, required | Video asset id (from import_video). |
timelineStart |
number, default 0 |
Timeline time where the clip starts, seconds. Default 0. |
trimIn |
number, default 0 |
Start point inside the source, seconds. Default 0. |
trimOut |
number | End point inside the source, seconds. Default: end of the source. |
speed |
number, default 1 |
Playback speed, 0.1..10. Default 1. |
volume |
number, default 1 |
Linear gain for the clip's sound, 1 = original. Default 1. |
muted |
boolean, default false |
Drop the clip's sound. |
id |
string | Layer id. Default: derived from name or asset. |
name |
string | |
parentId |
string | Parent layer id; the clip then moves with the parent. |
x |
number | Where the anchor lands. Default: canvas center. |
y |
number | |
anchorX |
number | Pivot in the clip's own pixels. Default: frame center. |
anchorY |
number | |
rotation |
number | |
scaleX |
number | Default: fit the canvas. |
scaleY |
number | Default: fit the canvas. |
opacity |
number | |
zIndex |
integer | Draw order (higher is in front). Default: on top. |
fadeIn |
number | Sound fade-in, seconds. |
fadeOut |
number | Sound fade-out, seconds. |
role |
string | What the clip's sound is in the mix: voice (default), music or effects. Music is ducked under voice. |
language |
string | Language of the clip's sound (en, ja, my, pt-BR): other languages' versions mute it; its picture is in every version. Default: every version. |
analyze_video¶
Analyze a video (or audio) asset in the background: scene cuts (ffmpeg scdet), the noise floor and silences, and a word-level transcript (whisper-cli, if WHISPER_PATH/WHISPER_MODEL are set or whisper-cli is on PATH). Results are saved next to the asset as <name>.analysis.json, <name>.transcript.json and <name>.srt. Returns a jobId (analyze_N) to poll with get_job_status. Afterwards use get_transcript, cut_by_transcript and remove_silences mode=transcript. All times in the results are source seconds of the asset.
| Parameter | Type | Description |
|---|---|---|
assetId |
string, required | Video or audio asset id. |
language |
string, default "auto" |
Spoken language code for whisper (en, de, ja, ...), or auto. Default auto. |
apply_action¶
Play a saved action on a rig in the open project (one undo step). Parts are matched by role, so it works on any copy of the rig and on other rigs with the same part names. Replaces the keyframes of the moved properties inside the time the action covers. With loops > 1 the root's offsets carry on from loop to loop (a walk keeps walking).
| Parameter | Type | Description |
|---|---|---|
name |
string, required | Action name from list_library. |
rigRootId |
string, required | The rig's root layer. |
startTime |
number, required | When the action starts, seconds. |
speed |
number, default 1 |
Playback speed, 0.05-20. 2 = twice as fast. Default 1. |
loops |
integer, default 1 |
Times to play it back to back, 1-1000. Default 1. |
apply_redaction¶
Hide tracked faces, plates or objects (one undo step): adds a redaction layer (type redaction) that hides the box of each track on the video frame before the clip is drawn, in every clip that plays the track's footage, so moves, effects, the camera and subject cutouts all show it hidden, and splits, trims and speed changes keep it in step. Styles: pixelate (default), blur, solid (a color). Strength scales with the box: the pixelate block (or blur radius) is the box's long side over 20 at strength 0 down to 4 at 100 (12 at the default 50), never under 4 source pixels, so a small plate is as unreadable as a big face. The fail-safe: every box is padded by paddingPercent; frames the track lost between two detections get a box moved straight between them that grows with each missed frame, so no frame between them is uncovered; the box is held (and grows) for holdFrames before the first detection and after the last, but not across a scene cut that analyze_video found in the footage; and the box's motion is smoothed while always containing the frame's own box. feather adds a soft edge outside the box. Running it again on the same tracks changes their redaction; tracks in another redaction move to the new one. update_layer changes the settings (style, strength, paddingPercent, feather, holdFrames, color, visible); tracks_to_keyframes turns a track's box into keyframes to edit by hand. Check with render_frame.
| Parameter | Type | Description |
|---|---|---|
trackIds |
array of strings, required | Track ids to hide (list_layers shows a clip's tracks as tracks=), or ["all"] for every track. |
style |
string, default "pixelate" |
pixelate, blur or solid. Default pixelate. |
strength |
number, default 50 |
0-100: pixelate blocks or blur across the box, 20 at 0 down to 4 at 100. Default 50. |
paddingPercent |
number, default 15 |
Each side of the box grows by this percent of its width or height. Default 15. |
feather |
number, default 4 |
Soft edge outside the box, in source pixels. Default 4. |
holdFrames |
integer, default 15 |
Frames the box is held, and grows, before a track's first detection and after its last; a scene cut that analyze_video found ends the hold sooner. Default 15. |
color |
string, default "#000000" |
solid: the fill, #RRGGBB or #RRGGBBAA. Default #000000. |
apply_style¶
Restyle a text layer, or every text layer under a group (e.g. 'captions'), with a library style (one undo step). Text, position and timing stay; anchors keep their place in the text box.
| Parameter | Type | Description |
|---|---|---|
name |
string, required | Style name from list_library. |
layerId |
string, required | A text layer or a group of text layers. |
attach_to_track¶
Keep a text or image layer on a track's box (one undo step), such as a name over a face or a sticker on a sign: x and y keyframes, and scaleX and scaleY with followScale, on every frame where a clip shows the footage the track found the object in, through the clip's placement, parents and crop, the camera, and the layer's own parent. Frames the track lost are filled in straight between the frames around them. The layer's anchor sits at the box's center plus offset (canvas pixels at the first frame it follows); without offset it stays where it is at that frame, so place it first. With followScale (default) the layer and its offset grow and shrink with the box, from their size at that first frame. The keyframes are kept only where needed to stay within 0.5 px of every frame, and replace the layer's own x and y (and scale) keyframes in that time, and its motion path. They are timeline keyframes: after trimming, moving or changing the speed of the clip, run attach_to_track again.
| Parameter | Type | Description |
|---|---|---|
layerId |
string, required | The text or image layer to move with the track. |
trackId |
string, required | The track to follow (from track_object or detect_and_track). |
offset |
object | The layer's anchor from the center of the track's box, in canvas pixels at the first frame it follows: x, y. Default: where the layer is at that frame. |
offset.x |
number | Right of the box's center, canvas pixels (negative: left). |
offset.y |
number | Below the box's center, canvas pixels (negative: above). |
followScale |
boolean, default true |
Scale the layer, and the offset, with the box's size from the first frame it follows. Default true. |
audio_levels¶
Measure the sound exactly as the export would mix it (fades, music ducked under voice, loudness normalization): integrated loudness (LUFS, ITU-R BS.1770) and sample peak (dBFS) for the whole mix and per section, and flags clipping (samples at full scale), sections more than 10 LU quieter than the whole mix, a whole mix below -24 LUFS with normalization off, and silences of 1s or more in the middle (silence at the very start or end is listed but not flagged). Mixes up to 120s answer directly; longer ones run in the background and return a jobId (audiolevels_N) for get_job_status.
| Parameter | Type | Description |
|---|---|---|
sectionSeconds |
number, default 5 |
Section length in seconds, 1-60. Default 5. |
auto_lip_flap¶
Animate a mouth to a voice (one undo step): measures the loudness of every frame of the sound as it plays on the timeline (start and trim respected), gives quiet frames the closed drawing and louder frames the open drawings (listed from slightly to wide open), holds every drawing at least 2 frames so the mouth doesn't flicker, and writes hold keyframes on the mouth's drawing over the time both play, replacing the drawing keyframes there. The drawing before and after stays as it was.
| Parameter | Type | Description |
|---|---|---|
mouthLayerId |
string, required | Image layer with the mouth drawings. |
audioLayerId |
string, required | Audio layer with the voice, or a video layer with sound. |
closedDrawing |
string, required | Drawing name of the closed mouth. |
openDrawings |
array of strings, required | Open drawing names, 1-8, from slightly to wide open. |
sensitivity |
number, default 0.5 |
0-1: higher opens the mouth on quieter sounds. Default 0.5. |
build_from_script¶
Build a whole episode from a script and open it as a new project: the canvas or a library template, then each scene's rigs (shown for that scene), actions, sound effects and captions at their times, and a scene marker at each scene's start. The script is JSON or Markdown in fixed line patterns (docs/GUIDE.md has both); times inside a scene are seconds from its start. Anything it can't map (an unknown rig, action or sound, a time past its scene, a line it doesn't understand) is listed in the reply and the rest is built. The build is one undo step on top of the empty project.
| Parameter | Type | Description |
|---|---|---|
scriptFile |
string | Absolute path of the script: .json, or .md (Markdown). Give this or script. |
script |
string | The script's text instead of a file: JSON if it starts with '{', Markdown otherwise. |
name |
string | Project name, also the folder name. Default: the script's title. |
directory |
string | Optional absolute folder for the project inside the projects root, instead of <projectsRoot>/<name>. |
camera_shake¶
Shake the camera (one undo step): writes seeded keyframes on the camera's shakeX, shakeY and shakeRotation channels, on top of its own movement, fading out to still at the end. The same seed always gives the same shake; change the seed for a different one. Replaces earlier shake keys inside the time range. Remove a shake with clear_keyframes layerId "camera" property shakeX/shakeY/shakeRotation, or undo.
| Parameter | Type | Description |
|---|---|---|
startTime |
number, required | When the shake starts, seconds. |
duration |
number, required | How long it lasts, seconds (max 60). |
intensity |
number, default 20 |
Strongest offset in screen pixels at the start (it fades out), max 1000. Rotation shakes 0.05° per pixel. Default 20. |
frequency |
number, default 12 |
Direction changes per second, 0.5-60. Default 12. |
seed |
integer, default 1 |
Random seed. Default 1. |
check_project¶
Check the open project for problems before export: assets whose files are missing, layers that are never on the canvas while shown, text reaching into the 5% title-safe margin (on vertical 9:16 canvases: the Shorts player UI, top 8%, bottom 25%, right 12%), characters a text's font has no glyphs for (each text is shaped with HarfBuzz, as it is drawn), stretches where nothing but the background shows, keyframes outside a layer's time that never play, and assets no layer uses. Read-only; every frame is checked.
No parameters.
clear_keyframes¶
Remove all keyframes of one property, or of every property of a layer when property is omitted (that also takes a motion path off). The static values then apply again. layerId "camera" clears the camera (property shakeX, shakeY, shakeRotation removes a camera_shake). On a redaction layer, property is a track id: its keyframed box goes, and the box worked out from the track applies again.
| Parameter | Type | Description |
|---|---|---|
layerId |
string, required | Layer id, or "camera". |
property |
string | x, y, rotation, scaleX, scaleY, opacity, brightness, contrast, saturation, cropX, cropY, drawing, or an effect or mask property such as shadow.x or mask.width; for the camera x, y, zoom, rotation, shakeX, shakeY or shakeRotation; for a redaction a track id. Omit for all. |
create_project¶
Create a new project folder (project.json + assets/ renders/ exports/) and open it. Width and height must be even. preset youtube_1080p (1920x1080) or shorts_1080p (1080x1920 vertical) sets the canvas and frame rate. Exports are loudness-normalized to -14 LUFS with music ducked under voice unless changed with update_project.
| Parameter | Type | Description |
|---|---|---|
name |
string, required | Project name. Also used as the folder name under the projects root. |
width |
integer | Width in pixels (even). Default 1920, or the preset's. |
height |
integer | Height in pixels (even). Default 1080, or the preset's. |
fps |
integer | Frames per second. Default 30, or the preset's. |
duration |
number, default 10 |
Duration in seconds. Default 10. |
backgroundColor |
string, default "#FFFFFF" |
Background color #RRGGBB or #RRGGBBAA. Default #FFFFFF. |
directory |
string | Optional absolute folder for the project inside the projects root, instead of <projectsRoot>/<name>. |
preset |
string | youtube_1080p or shorts_1080p. |
cut_by_transcript¶
Remove words from a video or audio layer by their transcript indices (the [n] numbers from get_transcript), with ripple. Each range cuts from the first word's start to the next kept word's start, so the pause after the removed words goes too; a quiet sliver under 0.3s left at the clip's edge goes as well. Word timing comes from whisper, fitted to the measured silences, and can still be off by a few tenths of a second; check the result with render_frame or view_source.
| Parameter | Type | Description |
|---|---|---|
layerId |
string, required | Video or audio layer that plays the words. |
wordRanges |
array of objects, required | Word index ranges to remove: [{from, to}] (inclusive). |
wordRanges[].from |
integer | Index of the first word to remove (the [n] numbers in get_transcript). |
wordRanges[].to |
integer | Index of the last word to remove (inclusive). Same as 'from' for a single word. |
dryRun |
boolean, default false |
Only report the planned cuts; change nothing. |
detect_and_track¶
Find every face or license plate in a video clip with an AI model and link each into a track (face_1, face_2, ... or plate_1, plate_2, ...) to hide with apply_redaction. It runs as a detect_N job (poll get_job_status) that searches every frame from startTime to endTime (default: the whole clip) at up to 1920 px. Faces: YuNet (230 KB, MIT), also searched at a third and an eighth of that size, so faces from about 10 px across to the whole frame are found. Plates: open-image-models' YOLOv9-t (8 MB; MIT code, the weights' license isn't stated), which sees the frame at 640 px, so each corner of it is searched too (2x2 overlapping tiles), finding plates down to about 2% of the frame's width (40 px in 1080p). The model is downloaded on first use. Boxes are linked from frame to frame like ByteTrack: confident detections (minConfidence, default 0.6 for faces, 0.3 for plates) start and continue tracks, weaker ones (down to half of it) only continue a track found on the frame before, and a track ends after 1 s without one. Nothing identifies a person or reads a plate: someone or a car gone for longer comes back as a new track. Detections on fewer than 3 frames are left out and listed. When it is done, the tracks are added as one undo step, saved in the clip's own frames and pixels like track_object's, and get_job_status shows a contact sheet with one labeled picture per track and lists each track's span, frames found and missed, and average size. Before starting it estimates the time; a job over 5 minutes isn't started without confirmLongJob=true. render_frame debug=true draws each track's box.
| Parameter | Type | Description |
|---|---|---|
layerId |
string, required | The video layer (clip) to search. |
target |
string, required | What to find: faces or plates. |
startTime |
number | Timeline time in seconds to start at. Default: where the clip starts. |
endTime |
number | Timeline time in seconds to stop at. Default: where the clip ends. |
minConfidence |
number | How sure the model must be to start a track: above 0, at most 1. Default 0.6 for faces, 0.3 for plates. Lower finds more, and more false ones; detections down to half of it keep a track going. |
confirmLongJob |
boolean, default false |
Start even if it would take more than 5 minutes. Without it, such a job isn't started and the reply gives the estimate; tell the user first. |
detect_beats¶
Find the beats of a music (or other audio or video) asset: onsets from the spectral flux of the sound, the tempo from their autocorrelation (60-200 BPM, favoring 120 between octaves), and a steady beat grid fitted to the onsets. Returns the BPM, the beat times, the onsets and how many beats land on an onset; saved next to the asset as <name>.beats.json. Times are source seconds of the asset: a layer starting at s0 with trimIn t0 plays source time t at s0 + t - t0. Sounds up to 120s answer directly; longer ones run in the background and return a jobId (beats_N) for get_job_status.
| Parameter | Type | Description |
|---|---|---|
assetId |
string, required | Audio asset id, or a video asset with sound. |
duplicate_layer¶
Copy a layer, by default with all its children (a whole rig), including keyframes. New ids replace 'replaceFrom' with 'replaceTo' (e.g. tora -> mimi), or get a numeric suffix.
| Parameter | Type | Description |
|---|---|---|
layerId |
string, required | |
includeChildren |
boolean, default true |
Copy descendants too. Default true. |
newParentId |
string | Parent for the copy. Omit to keep the original's parent; "" for none. |
replaceFrom |
string | Substring of ids/names to replace in the copies. |
replaceTo |
string | Replacement for replaceFrom. |
zIndexOffset |
integer, default 0 |
Added to every copied layer's zIndex. |
export_batch¶
Export the open project once per preset in one background job, one file after another, to exports/<fileName>_<preset>.mp4 (e.g. launch_youtube_1080p.mp4 and launch_shorts_1080p.mp4). Each file is encoded like start_export with that preset. A preset with another shape than the canvas (shorts_1080p from a landscape canvas, or youtube_1080p from a vertical one) gets the whole canvas fitted in the middle over a blurred, enlarged copy of itself, so nothing is cut off. Returns a jobId (batch_N); get_job_status shows which export is running and lists every finished file.
| Parameter | Type | Description |
|---|---|---|
presets |
array of strings, required | Preset names, e.g. ["youtube_1080p", "shorts_1080p"]. |
fileName |
string | Base file name, e.g. "launch"; _<preset>.mp4 is added. Default: the project name. |
export_fcpxml¶
Write the timeline as Final Cut Pro XML (FCPXML 1.9, which DaVinci Resolve also reads) to exports/<fileName>: the first video track as the primary storyline with gaps through to the end, and every other clip connected above it (video, then the layers prerendered by prerender_layers) or below it (the sound the export mixes), with their timing, trims and speed in whole frames, and the markers (chapters as chapter markers). Clips point at the files in the project's assets folder. The reply lists what the timeline can't hold, as export_otio's does.
| Parameter | Type | Description |
|---|---|---|
fileName |
string | Output file name, e.g. "edit.fcpxml" (no folders). Default <project>.fcpxml. |
export_frames¶
Write every frame from startTime to endTime (both included, snapped to frames) as numbered images at the canvas size, exactly as exported, to exports/<project>frames/frame<frame>.png, where <frame> is the project frame number in 5 digits (frame_00012.png). Frames an earlier export_frames left in that folder are deleted first, so it holds just this sequence. Runs in the background and returns a jobId (frames_N) for get_job_status.
| Parameter | Type | Description |
|---|---|---|
startTime |
number, required | First time in seconds. |
endTime |
number, required | Last time in seconds (included). |
format |
string, default "png" |
png (default) or jpg (quality 95, much smaller files). |
export_language_versions¶
Export the open project once per language and preset in one background job, one file after another, to exports/<fileName><language><preset>.mp4 (e.g. launch_ja_shorts_1080p.mp4). Each language's version leaves out the layers tagged with other languages (with their children, such as another language's caption track) and mutes the clips whose sound is in another language; untagged layers are in every version. Each file is encoded like export_batch with that preset: a preset with another shape than the canvas gets the whole canvas fitted over a blurred copy of itself. Returns a jobId (versions_N); get_job_status shows which file is being written and lists every finished one. Like export_batch, it starts again if the server stops while it runs.
| Parameter | Type | Description |
|---|---|---|
languages |
array of strings, required | Language tags, e.g. ["en", "ja", "my"]. |
presets |
array of strings, required | Preset names, e.g. ["youtube_1080p", "shorts_1080p"]. |
fileName |
string | Base file name, e.g. "launch"; <language><preset>.mp4 is added. Default: the project name. |
export_markers¶
Write the chapter markers as a YouTube chapter list to exports/<fileName>, to paste into the video's description: a "m:ss Name" line per chapter ("h:mm:ss" from an hour on), in whole seconds. Scene markers are left out. YouTube shows chapters only when the first is at 0:00, there are at least 3 and each lasts at least 10 s (the last one runs to the project end); the reply warns about each rule the chapters break.
| Parameter | Type | Description |
|---|---|---|
fileName |
string | Output file name, e.g. "chapters.txt" (no folders). Default <project>_chapters.txt. |
export_otio¶
Write the timeline as OpenTimelineIO (.otio) to exports/<fileName>, for another editor such as DaVinci Resolve: each video clip's picture on video tracks (V1 at the bottom, a clip above the clips drawn before it that it overlaps), the layers prerendered by prerender_layers on tracks above them, the sound the export mixes on audio tracks, and the markers. Clips keep their timing, trims and speed and point at the files in the project's assets folder. The reply lists what the timeline can't hold: keyframes, effects, the camera, the place and size of clips that don't fill the frame, text and other layers that weren't prerendered (or changed since), volume, fades, ducking and loudness.
| Parameter | Type | Description |
|---|---|---|
fileName |
string | Output file name, e.g. "edit.otio" (no folders). Default <project>.otio. |
export_srt¶
Write the captions (the text layers under the caption group) as an .srt subtitle file to exports/<fileName>, with timeline times.
| Parameter | Type | Description |
|---|---|---|
fileName |
string, required | Output file name, e.g. "talk.srt" (no folders). |
groupId |
string, default "captions" |
Caption group id. Default captions. |
export_thumbnail¶
Save one frame as a PNG thumbnail in exports/ (default 1280x720, YouTube's thumbnail size) and return a preview of it. Titles and other overlays are ordinary text layers, so add and style them first; a layer that should only be in the thumbnail can start and end around this time. A size with another shape than the canvas is filled by enlarging the frame and cropping the rest evenly from the center. Warns when the PNG is over 2 MB, YouTube's limit.
| Parameter | Type | Description |
|---|---|---|
time |
number, required | Time in seconds; snaps to the nearest frame. |
width |
integer, default 1280 |
Width in pixels (16-7680). Default 1280. |
height |
integer, default 720 |
Height in pixels (16-7680). Default 720. |
fileName |
string | Output file name, e.g. "thumb.png" (no folders). Default thumbnail_<frame>.png. |
language |
string | Language version to show (en, ja, my, pt-BR): layers of other languages are left out. Default: every layer. |
frame_diff¶
Find glitch frames: renders every frame of the range small (160 px wide), scores how much each one changed from the previous one (0-100% mean color difference) and flags 'glitch' (a single frame unlike both neighbors while they match each other, e.g. a stray one-frame layer) and 'spike' (a large change with no layer starting, ending or swapping drawings there). Layer starts and ends, drawing swaps, hold keyframes and analyzed scene cuts are listed as expected cuts. The scores are saved to renders/frame_diff_<first>-<last>.json. Up to 150 frames answers directly; longer ranges run in the background and return a jobId (framediff_N) for get_job_status.
| Parameter | Type | Description |
|---|---|---|
startTime |
number, default 0 |
First time to compare, seconds. Default 0. |
endTime |
number | Last time to compare, seconds. Default: the end of the project. |
generate_captions¶
Turn the transcript of an analyzed asset (analyze_video) into caption text layers under a null layer 'captions' (one undo step). Word times are mapped through the clips that play the asset, so silences and words cut before this are followed; run it again after later cuts and it replaces the old captions. A cue holds up to maxLines balanced lines of maxWordsPerLine words and ends at a sentence end or a pause. Styles: subtitle (white on a dark box, bottom), bold_center (large bold white with a black outline, center; lower-middle on vertical canvases), minimal (small white with a thin outline, bottom), or the name of a library style (save_style), scaled to the canvas and placed at its captionPosition. Move or hide all captions through the 'captions' layer. behindSubject=on puts the captions behind the person in the clip, as text_behind_subject does: a cutout of their own ('captions_subject', aiVideo or the matte of the clip's text_behind_subject cutout) draws the subject again above them; a clip whose background is removed already just goes in front of them. behindSubject=auto does that too, but wherever the subject would cover more than occlusionThreshold percent of a caption, the captions show in front: the cutout fades out over 0.25 s before such a span and back in after (spans less than 0.5 s apart join); with a clip that is its own subject, those captions draw in front of it. Auto measures every caption frame; up to 600 frames with the matte computed answers directly, otherwise the captions are added at once and the fades follow from a background job (captions_N) as their own undo step.
| Parameter | Type | Description |
|---|---|---|
assetId |
string | Asset whose clips get captions (all video/audio layers playing it). Give this or layerId. |
layerId |
string | Only this video/audio layer. Give this or assetId. |
style |
string, default "subtitle" |
subtitle, bold_center, minimal or a library style name. Default subtitle. |
maxWordsPerLine |
integer, default 6 |
Words per line, 1-20. Default 6. |
maxLines |
integer, default 2 |
Lines per cue, 1-4. Default 2. |
fontFamily |
string | Font family. Default Segoe UI; use "Myanmar Text" for Burmese, "Yu Gothic" for Japanese. |
fontSize |
number | Font size in pixels. Default: scaled to the canvas per style. |
color |
string | Text color. Default #FFFFFF. |
groupId |
string, default "captions" |
Id of the caption group (null layer). Default captions. |
behindSubject |
string, default "off" |
off, on or auto: put the captions behind the subject of the clip (on), and in front where it would cover too much of a caption (auto). Default off; off also takes away the cutout an earlier on/auto made. |
occlusionThreshold |
number | behindSubject=auto: how much of a caption, in percent, the subject may cover before the captions show in front. Default 35. |
confirmLongJob |
boolean, default false |
behindSubject: start the subject's AI matte even if it would take more than 5 minutes. Without it, such a job isn't started and the reply gives the estimate; tell the user first. |
get_export_status¶
Progress of an export job; when finished, the output path, duration, resolution, fps, codecs and file size.
| Parameter | Type | Description |
|---|---|---|
jobId |
string, required | The jobId returned by start_export. |
get_job_status¶
Progress or result of a background job: import_N (import_video normalization), analyze_N (analyze_video), framediff_N (frame_diff), audiolevels_N (audio_levels), beats_N (detect_beats), batch_N (export_batch), versions_N (export_language_versions), frames_N (export_frames), prerender_N (prerender_layers), matte_N (remove_background, text_behind_subject or generate_captions with aiImage or aiVideo), occlusion_N (text_occlusion), captions_N (generate_captions behindSubject=auto), syscheck_N (system_check), tracking_N (track_object or reanchor_track over more than 150 frames), detect_N (detect_and_track; when done it also shows the contact sheet of the tracks), proxy_N (the 1920 px proxy of footage over 2560 px, made by import_video, import_folder and open_project) or export_N (start_export). A running job's status estimates the time left. Without jobId, lists this session's jobs and the latest ones of earlier sessions. Jobs are kept in the jobs folder for 7 days, so they outlast a restart: an export (export_N, batch_N or versions_N) that was running when the server stopped starts again under its id, up to 3 times; any other job that was running shows as failed, with how far it got, and has to be started again.
| Parameter | Type | Description |
|---|---|---|
jobId |
string | The jobId returned by import_video, analyze_video, frame_diff, audio_levels, detect_beats, export_batch, export_language_versions, export_frames, remove_background or start_export. Omit to list all jobs. |
get_logs¶
Read the server's log, oldest first: the last lastN entries of the log files (zeyocut-yyyyMMdd.jsonl in the log folder, one JSON object per line). Every tool call is logged with its arguments and how long it took, a failed call with its error, and the server logs its start, its settings, jobs started again after a restart, and problems. Use it to find out what happened before, or why something failed.
| Parameter | Type | Description |
|---|---|---|
lastN |
integer, default 50 |
How many entries to return, 1-1000. Default 50. |
level |
string | The lowest level to include: trace, debug, information, warning, error or critical. Default: every level. |
contains |
string | Only entries that contain this text, in any case (in the message, the category, a value or the exception). |
get_project¶
Return the full project model (project.json) of the open project.
No parameters.
get_transcript¶
Read the word-level transcript of an analyzed asset (run analyze_video first). Each line is a phrase with its source time range; [n] before a word is its index for cut_by_transcript. Pauses of 0.5s or more start a new line. Times are source seconds of the asset, not timeline times.
| Parameter | Type | Description |
|---|---|---|
assetId |
string, required | Video or audio asset id. |
startTime |
number | Only words from this source time on, seconds. |
endTime |
number | Only words up to this source time, seconds. |
import_asset¶
Copy an image (png/jpg/webp/bmp), audio (wav/mp3/m4a/aac/ogg/opus/flac) or font (ttf/otf/ttc) file into the project's assets folder and register it. Returns the asset id to use in layers. Video files go through import_video.
| Parameter | Type | Description |
|---|---|---|
path |
string, required | Absolute path of the file to import, in an import folder, the library or the projects folder. |
id |
string | Optional asset id (letters, digits, _ or -). Default: derived from the file name. |
import_folder¶
Import every image, audio, font and video file in a folder (not its subfolders) whose name matches pattern, in order: by name with numbers in order (panel_2 before panel_10), or by date, oldest first. Images, audio, fonts and videos that need no normalizing are imported at once, as one undo step. Videos that do (variable frame rate, rotated, HDR, ...) are normalized one after another in one background job (import_N) and added as each finishes; poll get_job_status. Asset ids come from the file names. The reply lists the assets in order, the files of other types it skipped and any file it couldn't read. At most 500 files.
| Parameter | Type | Description |
|---|---|---|
path |
string, required | Absolute path of the folder, in an import folder, the library or the projects folder. |
pattern |
string | File name pattern with * and ?, in any case, such as *.png or panel_*. Default * (every file). |
sortBy |
string | name (default): by file name, numbers in order; date: by when each file last changed, oldest first. |
import_srt¶
Import a .srt subtitle file as the caption track of its language, as add_caption_track does with srt: text layers under a null layer captions_<language>, replacing that language's track if there is one (one undo step). The language is language, or else the one at the end of the file name (talk.ja.srt, talk_pt-BR.srt). The cue times are timeline times.
| Parameter | Type | Description |
|---|---|---|
path |
string, required | Path to the .srt file. |
language |
string | The captions' language: en, ja, my, pt-BR. Default: the one at the end of the file name (talk.ja.srt). |
style |
string, default "subtitle" |
subtitle, bold_center, minimal or a library style name. Default subtitle. |
fontFamily |
string | Font family. Default: the language's font from the settings, otherwise the style's. |
fontSize |
number | Font size in pixels. Default: scaled to the canvas per style. |
color |
string | Text color. Default #FFFFFF. |
import_video¶
Import a video file (mp4/mov/m4v/mkv/webm/avi) as a video asset. A constant-frame-rate, upright, 8-bit file is copied into the project's assets folder and registered at once. Anything else (variable frame rate from phones, rotation metadata, 10-bit or HDR, non-square pixels) is transcoded in the background to H.264 CRF 16 at a constant standard frame rate, upright, 8-bit BT.709, with a keyframe every second: the call then returns a jobId (import_N) to poll with get_job_status, and the asset is added when the job completes, as its own undo step. Footage over 2560 px also gets a 1920 px proxy in a proxy_N job, which previews and object tracking read once it is done (exports read the original).
| Parameter | Type | Description |
|---|---|---|
path |
string, required | Absolute path of the video file, in an import folder, the library or the projects folder. |
id |
string | Optional asset id (letters, digits, _ or -). Default: derived from the file name. |
list_assets¶
List the project's assets with their ids, types, sizes or durations, and which layers use them.
No parameters.
list_layers¶
Show the layers as a parent/child tree with type, zIndex, time range, language, anchor and keyframed properties.
No parameters.
list_library¶
List what is in the shared library: rigs, actions, styles and templates, with a short description of each.
| Parameter | Type | Description |
|---|---|---|
type |
string, default "all" |
rigs, actions, styles, templates or all. Default all. |
list_projects¶
List the projects in the projects root folder.
No parameters.
list_sfx¶
List the sound effects in the shared library's sfx folder (wav, mp3, ogg and other audio files; subfolders are categories), with their durations. Names are paths inside sfx without the extension (impacts/thud); add_sfx takes the full name or, when unique, the file name alone.
| Parameter | Type | Description |
|---|---|---|
filter |
string | Only names containing this text (not case-sensitive). |
move_layer¶
Move a layer to a new timeline start, together with its children and keyframes. The project grows if the layer now runs past the end.
| Parameter | Type | Description |
|---|---|---|
layerId |
string, required | |
start |
number, required | New start time, seconds. |
new_project_from_template¶
Create a new project from a library template and open it. The folder is <projectsRoot>/<name> unless 'directory' is given. With a new duration, layers that ran to the template's end stretch, pinned layers move with the end, and the rest keep their times.
| Parameter | Type | Description |
|---|---|---|
template |
string, required | Template name from list_library. |
name |
string, required | Project name, also the folder name. |
duration |
number | Duration in seconds. Default: the template's. |
directory |
string | Optional absolute folder for the project inside the projects root, instead of <projectsRoot>/<name>. |
open_project¶
Open an existing project by name (a folder under the projects root) or by absolute folder path. Returns the layer tree.
| Parameter | Type | Description |
|---|---|---|
nameOrPath |
string, required | Project name from list_projects, or an absolute path to a project folder inside the projects root. |
prerender_layers¶
Render layers alone, each with its children, on a transparent background as ProRes 4444 .mov files with alpha in exports/<project>_prerender/<layer id>.mov: every frame the layer is on, as render_frame draws it with layerId and a transparent background. They are for an editor that opens the timeline of export_otio or export_fcpxml, which put each prerendered layer on a track above the clips, so its text, keyframed motion, effects and camera move carry over. A layer whose prerender is current (nothing it shows has changed) isn't drawn again. Runs in the background and returns a jobId (prerender_N) for get_job_status.
| Parameter | Type | Description |
|---|---|---|
layerIds |
array of strings, required | Layer ids; each is drawn with its children. |
preview_server¶
Start or stop the preview page, for a browser on this computer: a timeline scrubber, the layers, and playback of low-res frames with the sound mixed as the export mixes it. It shows the open project and follows every edit within a second; it only shows, so edits are made with the tools. It listens on 127.0.0.1 only, at a random port with a secret token in its address, so other sites can't read it. start returns the address.
| Parameter | Type | Description |
|---|---|---|
action |
string, default "start" |
start (default) or stop. |
reanchor_track¶
Correct a track where it drifted (one undo step): set the box at 'time' (canvas pixels, as render_frame shows that frame) and track again from there, away from the frame track_object started at, up to the next box set by hand or the end of the track. Frames on the other side stay as they are. Time and box are mapped through the clip the track was made on, or layerId (another clip of the same footage, such as a piece split off it). Up to 150 frames answers directly; more run as a tracking_N job.
| Parameter | Type | Description |
|---|---|---|
trackId |
string, required | The track to correct (track_object's id). |
time |
number, required | Timeline time in seconds of the frame to correct (the nearest frame, as render_frame shows it). |
box |
object, required | The object's box in canvas pixels at that time: x, y (top-left corner), width, height. |
box.x |
number | Left edge, canvas pixels. |
box.y |
number | Top edge, canvas pixels. |
box.width |
number | Width, canvas pixels. |
box.height |
number | Height, canvas pixels. |
layerId |
string | The clip to map time and box through. Default: the clip the track was made on. |
redaction_report¶
Check how well the redactions hide their tracks; changes nothing. For each track: the redaction that hides it, the frames its box covers, how many come from a detection, how many the fail-safe holds between detections or before and after them, and how many frames the track spans that no box covers; its confidence and box sizes. Then the spans to look at, with their times on the timeline (only parts of the footage some clip plays): frames not covered; confidence under 0.5 (a tracker drifting, or a weak detection); no detection for 0.5 s or more, where the box only moves straight between detections; fast motion (the box moving a quarter of its size or more a frame); boxes under 12 px, where padding adds little; and footage that plays before a track's box starts or after it is let go while the box is inside the frame (more than 2% of the frame's size from every edge), where the face, plate or object may still show uncovered. Tracks no redaction hides are listed too. A redaction works in every clip that plays its footage, so no clip is left out. Look at each span with render_frame (debug=true draws each track's box).
| Parameter | Type | Description |
|---|---|---|
trackIds |
array of strings | Track ids to report on, or ["all"]. Default: every track. |
redo¶
Redo the last undone change.
No parameters.
refine_matte¶
Fix the edges of a removed background (one undo step): shrink pulls the edge in by that many pixels to cut off a halo of the old background (negative grows it back, whole pixels), feather softens it over about that many pixels. Both are in the layer's own pixels; values you leave out stay.
| Parameter | Type | Description |
|---|---|---|
layerId |
string, required | Layer id with a removed background. |
shrink |
number | Pixels to pull the edge in, -100 to 100 (negative grows). Default: unchanged. |
feather |
number | Edge softness in pixels, 0-100. Default: unchanged. |
reframe_to_vertical¶
Fit landscape video layers to a vertical canvas (switch it first with update_project preset=shorts_1080p): each clip gets a full-height crop with the canvas' aspect ratio at focusX, centered and scaled to fill the frame. Zoom differences between pieces (punch-in) are kept. cropX is animatable: keyframe it (set_keyframes, source pixels) to follow the subject.
| Parameter | Type | Description |
|---|---|---|
layerId |
string, default "all" |
Video layer to reframe, or "all" for every video layer. Default all. |
focusX |
number, default 0.5 |
Horizontal position of the crop: 0 = left edge, 0.5 = center (default), 1 = right edge. |
remove_background¶
Remove the background of an image or video layer so what is behind it shows through (one undo step; replaces an earlier removal, keeping refine_matte's shrink and feather). Methods: chroma keys out a screen color while drawing (green or blue screen; images and video): color is the screen's color (default: picked from the picture's edges), tolerance 0-1 how far from it still goes (default 0.4), softness 0-1 the soft edge after that (default 0.2), spill 0-1 how much of the screen's tint is taken out of what stays (default 1). edgeFill removes everything connected to the image's border that is close to the background color (art on a plain background; image layers): color is the background (default: the most common border color), tolerance 0-1 (default 0.1); areas of that color enclosed by the art stay. aiImage finds the subject of a photo or drawing with an AI model (BiRefNet; image layers); aiVideo follows a person through a clip with an AI model (Robust Video Matting; video layers). Both take no settings and are computed in the background as a matte_N job (the first use downloads the model, 224 MB or 15 MB); the removal applies at once, but until the job is done the layer is drawn with its background and exports refuse. Mattes are cached next to the asset. Check the edges with render_frame checkerboard=true layerId=<layer>, and fix halos with refine_matte. remove=true takes the removal off.
| Parameter | Type | Description |
|---|---|---|
layerId |
string, required | Image or video layer id. |
method |
string | chroma, edgeFill, aiImage or aiVideo. Required unless remove=true. |
color |
string | chroma: the screen color; edgeFill: the background color. #RRGGBB. Default: picked from the picture. |
tolerance |
number | 0-1. Default 0.4 (chroma), 0.1 (edgeFill). |
softness |
number | chroma: 0-1, how soft the edge is. Default 0.2. |
spill |
number | chroma: 0-1, how much screen tint to take out of the kept pixels. Default 1. |
remove |
boolean, default false |
Take the background removal off. |
confirmLongJob |
boolean, default false |
aiImage or aiVideo: start even if it would take more than 5 minutes. Without it, such a job isn't started and the reply gives the estimate; tell the user first. |
remove_keyframes¶
Remove specific keyframes (all-or-nothing).
| Parameter | Type | Description |
|---|---|---|
entries |
array of objects, required | Keyframes to remove: [{layerId, property, time}]. |
entries[].layerId |
string | Layer id, or "camera". |
entries[].property |
string | x, y, rotation, scaleX, scaleY, opacity, brightness, contrast, saturation, cropX, cropY, drawing, or an effect or mask property such as shadow.x or mask.width; for the camera x, y, zoom, rotation, shakeX, shakeY or shakeRotation. |
entries[].time |
number | Time of the keyframe to remove, in seconds. |
remove_layer¶
Remove a layer. A layer with children is only removed together with its children when withChildren is true.
| Parameter | Type | Description |
|---|---|---|
layerId |
string, required | |
withChildren |
boolean, default false |
Also remove all descendants. |
remove_markers¶
Remove project markers (one undo step): the ones named in markerIds, every marker with markerIds ["all"], or every marker of one kind with kind.
| Parameter | Type | Description |
|---|---|---|
markerIds |
array of strings | Marker ids, or ["all"]. |
kind |
string | chapter or scene: removes every marker of this kind (with markerIds omitted or ["all"]). |
remove_range¶
Cut timeline seconds start..end out of one layer (and its children) or out of every layer (layerId "all"). With ripple (default) everything after the cut moves left, keyframes and children included, and the project gets shorter by the removed length; without ripple a gap is left.
| Parameter | Type | Description |
|---|---|---|
layerId |
string | Layer to cut, or "all" for every layer. Default "all". |
start |
number, default 0 |
Start of the range, timeline seconds. |
end |
number, default 0 |
End of the range, timeline seconds. |
ripple |
boolean, default true |
Close the gap. Default true. |
remove_silences¶
Cut the silent parts out of a video or audio layer with ripple (later layers move left and the project gets shorter), keeping 'padding' seconds of quiet next to the remaining sound. mode=audio measures the clip's noise floor first and treats sound below noise floor + 6 dB as silence (ffmpeg silencedetect; override with thresholdDb). mode=transcript uses the gaps between spoken words instead (needs analyze_video), which works for clips with background music. dryRun=true only reports the planned cuts. punchIn=true zooms every second piece to punchInZoom to hide the jump cuts. Pieces are named clip, clip_2, clip_3, ... in time order.
| Parameter | Type | Description |
|---|---|---|
layerId |
string, required | Video or audio layer. |
minSilence |
number, default 0.7 |
Shortest pause to cut, seconds. Default 0.7. |
padding |
number, default 0.1 |
Quiet kept before and after each remaining sound, seconds. Default 0.1. |
mode |
string, default "audio" |
audio (silencedetect on the sound) or transcript (gaps between words). Default audio. |
thresholdDb |
number | mode=audio: silence threshold in dBFS instead of the measured noise floor + 6 dB, e.g. -40. |
dryRun |
boolean, default false |
Only report the planned cuts and the new duration; change nothing. |
punchIn |
boolean, default false |
Zoom every second piece to hide the jump cuts. |
punchInZoom |
number, default 1.1 |
Zoom of the punched-in pieces. Default 1.1. |
render_contact_sheet¶
Render several evenly spaced frames into one labeled grid image to check motion over time in a single call.
| Parameter | Type | Description |
|---|---|---|
startTime |
number, default 0 |
First time in seconds. Default 0. |
endTime |
number | Last time in seconds. Default: the last frame. |
count |
integer, default 12 |
Number of frames (1-64). Default 12. |
columns |
integer, default 4 |
Grid columns. Default 4. |
maxWidth |
integer, default 1600 |
Width of the whole sheet. Default 1600. |
debug |
boolean, default false |
Draw anchors, outlines and layer names, and the box of each track on a clip, in every cell. |
language |
string | Language version to show (en, ja, my, pt-BR): layers of other languages are left out. Default: every layer. |
render_frame¶
Render one frame exactly as it will appear in the export and return it as a PNG. The time snaps to the nearest frame. The full-resolution frame is also saved in renders/. debug=true draws anchors, outlines, parent bones and layer ids. checkerboard=true shows transparent parts as gray squares instead of the background color, and layerId draws only that layer and its children: together they show the edges of a removed background (remove_background) without the layers behind it.
| Parameter | Type | Description |
|---|---|---|
time |
number, required | Time in seconds. |
maxWidth |
integer, default 960 |
Maximum width of the returned image. Default 960. |
debug |
boolean, default false |
Draw anchors, outlines and layer names, and the box of each track on a clip. |
checkerboard |
boolean, default false |
Show transparency as a gray checkerboard instead of the background color. |
layerId |
string | Draw only this layer and its children (or only a subject cutout). |
language |
string | Language version to show (en, ja, my, pt-BR): layers of other languages are left out. Default: every layer. |
report_render_stats¶
Where a finished export's time went: per stage (evaluating keyframes, decoding video and images, redaction, background removal and cutouts, text, effects and masks, drawing layers, fitting the canvas into a preset, waiting for the encoder, measuring the loudness), the slowest layers and the slowest frames; times under 5 ms are left out. jobId is a start_export (export_N), export_batch (batch_N) or export_language_versions (versions_N) job; default: the newest finished one. Read-only; use it to find what makes an export slow.
| Parameter | Type | Description |
|---|---|---|
jobId |
string | export_N, batch_N or versions_N. Default: the newest finished export. |
restore_backup¶
List the open project's backups, newest first, or put one back. Before every save the project.json being replaced is copied to the project's backups folder, named after the edit saved over it; the last 20 are kept. When open_project updates a file from an older ZeyoCut, the file as it was is kept there too, for good. Backups hold project.json only, not the assets. Restoring is one undo step, and what it replaces is backed up as well.
| Parameter | Type | Description |
|---|---|---|
backup |
string | A backup's name from the list; its time (e.g. 20261104-161502-123) is enough. Omit to list them. |
save_action¶
Save a rig's animation between two times to the library as a reusable action (walk cycle, jump, wing flap, double-take). Keyframes are stored by part role and relative to startTime; the root's x, y and rotation as offsets and its scale as a factor, so the action plays wherever the rig stands. Both window edges are sampled, so the action starts and ends exactly as the rig looks there. Not an undo step.
| Parameter | Type | Description |
|---|---|---|
rigRootId |
string, required | The rig's root layer. |
startTime |
number, required | Window start, seconds. |
endTime |
number, required | Window end, seconds. For a cycle, end on the pose the cycle starts with. |
name |
string, required | Library name: letters, digits, spaces, '_' or '-'. |
overwrite |
boolean, default false |
Replace an action of the same name. |
save_rig¶
Save a character rig to the shared library (used by every project): the root layer and everything parented under it, with anchors, drawings, parenting and draw order, posed as it is at 'time'. Each part gets a role that save_action/apply_action match by: its rigRole if set (update_layer {"rigRole": "arm_l"}), otherwise its id without the prefix the part ids share (tora_head → head); the root is always 'root'. Saving doesn't change the project, so it isn't an undo step.
| Parameter | Type | Description |
|---|---|---|
rootLayerId |
string, required | The rig's root layer (often a null layer). |
name |
string, required | Library name: letters, digits, spaces, '_' or '-' (not case-sensitive). |
time |
number | Pose to save, seconds. Default: the root's start. |
overwrite |
boolean, default false |
Replace a rig of the same name. |
save_style¶
Save a text layer's look (font, bold, size, color, outline, alignment, line height, background box) as a named style in the library. Sizes are stored relative to the canvas, so the style looks the same on other canvas sizes. Use it with apply_style, add_text_layer style or generate_captions style. Not an undo step.
| Parameter | Type | Description |
|---|---|---|
layerId |
string, required | A text layer. |
name |
string, required | Library name: letters, digits, spaces, '_' or '-'. |
captionPosition |
string, default "bottom" |
Where generate_captions puts captions in this style: bottom or center. Default bottom. |
overwrite |
boolean, default false |
Replace a style of the same name. |
save_template¶
Save layers of the open project (intro, outro, end screen, watermark, fixed layers) with the canvas, frame rate and audio settings as a template in the library, with their asset files. Layers that run to the project's end stretch to a new project's length; pinToEnd layers (an end screen) keep their distance from the end; others keep their times. Not an undo step.
| Parameter | Type | Description |
|---|---|---|
name |
string, required | Library name: letters, digits, spaces, '_' or '-'. |
layerIds |
array of strings | Layers to keep (each with its children). Default: all layers. |
pinToEnd |
array of strings | Layers (with their children) that move with the end of the video. |
overwrite |
boolean, default false |
Replace a template of the same name. |
set_camera¶
Set the project camera's fixed values (one undo step). The camera moves the whole scene: x, y is the scene point shown at the center of the frame (default: the canvas center), zoom 2 shows half as much (twice as close), rotation turns the camera clockwise so the picture turns the other way. Layers with ignoreCamera (captions get it) stay put. To move the camera over time use set_keyframes with layerId "camera" (properties x, y, zoom, rotation). reset=true removes the camera with all its keyframes and shake.
| Parameter | Type | Description |
|---|---|---|
x |
number | Scene x shown at the frame's center, pixels. |
y |
number | Scene y shown at the frame's center, pixels. |
zoom |
number | 0.01-100; 1 shows the whole canvas, 2 is twice as close. |
rotation |
number | Degrees, clockwise camera roll. |
reset |
boolean, default false |
Remove the camera (and its keyframes) first. |
set_effect¶
Add, change or remove one effect on a visual layer (one undo step). The effect is on that layer only, not its children. shadow (color, x, y, blur, opacity; default #000000, 8, 8, 6, 0.5): a soft copy behind the layer, offset right/down. outline (color, width; default #FFFFFF, 4): a border around the layer's shape. blur (x, y; default 4, 4): softens the layer, x and y separately (x alone gives a horizontal motion blur). tint (color, amount; color required): mixes the layer toward a color, amount 1 paints it solid in it. Sizes are in pixels at the layer's scale and grow with it and the camera; blur sizes are the Gaussian's standard deviation. Numbers are animatable with set_keyframes as shadow.x, shadow.y, shadow.blur, shadow.opacity, outline.width, blur.x, blur.y, tint.amount; colors are fixed. Fields you leave out keep their value. remove=true removes the effect with its keyframes.
| Parameter | Type | Description |
|---|---|---|
layerId |
string, required | Layer id. |
effect |
string, required | shadow, outline, blur or tint. |
color |
string | #RRGGBB or #RRGGBBAA (shadow, outline, tint). |
x |
number | shadow: offset right in pixels; blur: horizontal blur. |
y |
number | shadow: offset down in pixels; blur: vertical blur. |
blur |
number | shadow: softness, 0-500 (0 = hard edge). |
opacity |
number | shadow: 0-1. |
width |
number | outline: thickness in pixels, 0-100. |
amount |
number | tint: 0-1 (1 = solid color). |
remove |
boolean, default false |
Remove the effect. |
set_keyframes¶
Add or replace many keyframes in one call (one undo step; all-or-nothing). A keyframe at the same layer/property/time is replaced. Each keyframe's easing shapes the segment from it to the next keyframe. Before the first and after the last keyframe a property holds that keyframe's value; once a property has keyframes its static value is ignored. layerId "camera" animates the project camera (x, y, zoom, rotation), which moves every layer except those with ignoreCamera. Effect and mask numbers (shadow.x, blur.x, mask.width, ...) animate after set_effect / set_mask added them. x or y keyframes take a set_motion_path path off the layer. On a redaction layer the properties are its keyframed boxes from tracks_to_keyframes (<track>.x, .y, .width, .height), with time in the footage's own seconds.
| Parameter | Type | Description |
|---|---|---|
entries |
array of objects, required | Keyframes: [{layerId, property, time, value, easing}]. |
entries[].layerId |
string | Layer id, or "camera" for the project camera. |
entries[].property |
string | x, y, rotation, scaleX, scaleY, opacity; brightness, contrast, saturation (image and video layers); cropX, cropY (video layers); drawing (image layers); shadow.x, shadow.y, shadow.blur, shadow.opacity, outline.width, blur.x, blur.y, tint.amount (after set_effect); mask.x, mask.y, mask.width, mask.height, mask.feather (after set_mask). Camera: x, y (the scene point at the frame's center), zoom, rotation, shakeX, shakeY, shakeRotation. |
entries[].time |
number | Time in seconds. |
entries[].value |
any | A number, or a drawing name (string) for the drawing property. |
entries[].easing |
string | Easing of the segment that STARTS at this keyframe: linear (default), hold, easeIn, easeOut, easeInOut, easeOutBack, easeOutBounce, easeOutElastic. Ignored for drawing (always hold). |
set_mask¶
Add, change or remove the layer's mask (one undo step): the layer shows only inside a rectangle, an ellipse or an image's opaque pixels, or only outside with invert=true. The box (x, y = top-left corner, width, height) is in the layer's own pixels, like its anchor, so it moves, turns and scales with the layer; a new mask fits the layer's content unless you give it. An image mask stretches the image asset's alpha over the box. feather softens the edge over about that many pixels. x, y, width, height and feather are animatable with set_keyframes as mask.x, mask.y, mask.width, mask.height, mask.feather (a growing width is a wipe). Fields you leave out keep their value. remove=true removes the mask.
| Parameter | Type | Description |
|---|---|---|
layerId |
string, required | Layer id. |
type |
string | rectangle, ellipse or image. Required for a new mask. |
asset |
string | Image asset id for type image. |
x |
number | Left edge of the box, layer pixels. |
y |
number | Top edge of the box, layer pixels. |
width |
number | Box width, layer pixels. |
height |
number | Box height, layer pixels. |
feather |
number | Edge softness in pixels, 0-1000. Default 0. |
invert |
boolean | Show the layer outside the shape instead. |
remove |
boolean, default false |
Remove the mask. |
set_motion_path¶
Move a layer along a curve through timed points (one undo step; replaces an earlier path). The layer's anchor reaches each point at its time, in the same pixel space as its x, y (the canvas for top-level layers). Each segment is a cubic bezier: inX/inY and outX/outY are a point's handles relative to the point; handles you leave out are set for a smooth curve (one handle alone is mirrored). Inside a segment the layer moves at an even speed along the curve, shaped by the easing of the point the segment starts at. autoOrient=true turns the layer with the path on top of its rotation (draw it facing right). The path replaces x and y: their keyframes are cleared, and setting x or y keyframes (or x/y with update_layer) later removes the path. Ripple edits, splits and speed changes retime it like other keyframes. remove=true takes the path off.
| Parameter | Type | Description |
|---|---|---|
layerId |
string, required | Layer id. |
points |
array of objects | At least 2 points, in time order: [{time, x, y, inX, inY, outX, outY, easing}]. |
points[].time |
number | When the layer reaches this point, seconds. |
points[].x |
number | Point x, pixels (the parent's space, the canvas for top-level layers). |
points[].y |
number | Point y, pixels. |
points[].inX |
number | Incoming handle x, relative to the point. Optional. |
points[].inY |
number | Incoming handle y, relative to the point. Optional. |
points[].outX |
number | Outgoing handle x, relative to the point. Optional. |
points[].outY |
number | Outgoing handle y, relative to the point. Optional. |
points[].easing |
string | Easing of the segment that starts at this point: linear (default), hold, easeIn, easeOut, easeInOut, easeOutBack, easeOutBounce, easeOutElastic. |
autoOrient |
boolean, default false |
Turn the layer along the path's direction. Default false. |
remove |
boolean, default false |
Remove the path. |
set_speed¶
Change a video layer's playback speed (0.1..10) keeping its start; its keyframes and children stretch with it. With ripple (default) the layers after it move to stay back to back and the project duration changes by the same amount.
| Parameter | Type | Description |
|---|---|---|
layerId |
string, required | |
speed |
number, required | New speed, 0.1..10. |
ripple |
boolean, default true |
Move later layers. Default true. |
split_layer¶
Split a layer (and its children) at a timeline time into two layers that play exactly as before. The left part keeps the id; the right part gets the next free id like 'clip_2'. Keyframes are trimmed to each part and children follow the part that is showing when they start.
| Parameter | Type | Description |
|---|---|---|
layerId |
string, required | Layer to split. |
time |
number, required | Timeline time of the split, seconds; must be inside the layer. |
start_export¶
Start exporting the open project to exports/<fileName> as H.264 MP4 (yuv420p) with all audio layers mixed: music ducked under voice and the mix loudness-normalized (two-pass loudnorm, -14 LUFS by default; see update_project). Runs in the background and returns a jobId; poll get_export_status. Later edits don't affect a running export. preset youtube_1080p or shorts_1080p encodes for upload (H.264 high profile, 2 B-frames, keyframe every half second) at the preset size; the canvas must have the preset's aspect ratio.
| Parameter | Type | Description |
|---|---|---|
fileName |
string, required | Output file name, e.g. "jump.mp4" (no folders). |
crf |
integer | Quality 0-51, lower is better. Default 18 (visually lossless). |
preset |
string | youtube_1080p or shorts_1080p. |
language |
string | Language version to export (en, ja, my, pt-BR): layers of other languages are left out and clips whose sound is in another language are muted. Default: every layer. |
system_check¶
Report this computer: whether FFmpeg (needed for video and every export) and whisper (for transcripts) are installed, with how to install them; the folders ZeyoCut uses; and for the AI features the CPU, RAM, GPU, the ONNX Runtime version, which AI models are downloaded and the device each one runs on (DirectML on the GPU, or the CPU). Then it benchmarks every downloaded model on the CPU and on DirectML, and 1080p decoding, in the background (syscheck_N, usually under a minute): the result gives each AI feature's time per minute of 1080p video (per image for aiImage). The results are saved (library\benchmark.json): AI jobs estimate their time from them, and AiDevice=auto (the default) runs a model on DirectML only where it worked and took at most 80% of the CPU's time. DirectML is tried in a separate process, stopped after 60 s, so a GPU driver that hangs can't hang the server. Run it again after installing models or changing hardware.
No parameters.
text_behind_subject¶
Put text behind the subject of a clip or picture, like a title behind a presenter (one undo step): the text stays in front of the background, and the subject is drawn again above it, cut out. For a video layer this adds a subject cutout layer (type cutout) above the texts, cut out with aiVideo by default (or chroma for a green screen); for an image layer with aiImage by default (or edgeFill or chroma); the methods work as in remove_background. The cutout always follows its source and the pieces splits made of it on the same track: timing, trims, speed, transforms, effects and keyframes carry over, and its own settings are only name, zIndex, visible and opacity (keyframes too). If the subject is already a layer of its own (a removed background, a transparent picture, or a group of layers), no cutout is needed and the texts move directly below it. Texts drawn below the clip are lifted just above it. AI mattes are computed in the background as a matte_N job; until then the text shows in front and exports refuse. Running it again on the same clip reuses its cutout (with a new method if you give one). Check with render_frame (layerId=<cutout> shows the subject alone); text_occlusion measures how much of a text is covered.
| Parameter | Type | Description |
|---|---|---|
videoLayerId |
string, required | The video (or image) layer with the subject in it, or a group whose layers are the subject. |
textLayerIds |
array of strings, required | Text layers to put behind the subject; a group (like captions) stands for the text layers under it. |
method |
string | How the cutout finds the subject: aiVideo (default for video), aiImage (default for images), chroma or edgeFill. Default for an existing cutout: unchanged. |
color |
string | chroma: the screen color; edgeFill: the background color. #RRGGBB. Default: picked from the picture. |
tolerance |
number | chroma or edgeFill: 0-1. Default 0.4 (chroma), 0.1 (edgeFill). |
confirmLongJob |
boolean, default false |
AI methods: start even if computing the matte would take more than 5 minutes. Without it, such a job isn't started and the reply gives the estimate; tell the user first. |
text_occlusion¶
Measure how much of a text layer is covered by what is drawn above it (a subject cutout from text_behind_subject, or any other layer), frame by frame: the min, max and average share of the text hidden, and the frames in runs of equal values (every frame is saved to renders/text_occlusion_<id>_<first>-<last>.json). A half-transparent layer counts half; frames where the text isn't shown are left out of the numbers. Default range: the text's own time. Up to 150 frames answers directly; longer ranges run in the background and return a jobId (occlusion_N) for get_job_status.
| Parameter | Type | Description |
|---|---|---|
textLayerId |
string, required | Text layer id. |
startTime |
number | First time to measure, seconds. Default: the text's start. |
endTime |
number | End of the range (not included), seconds. Default: the text's end. |
track_object¶
Follow an object through a video clip with OpenCV and save its box on every frame as a track (one undo step). Draw the box around the object in canvas pixels at 'time', as render_frame shows that frame; it is mapped into the clip's own frames and pixels (through its placement, parents, the camera and its crop), so the track keeps fitting after trims, speed changes and splits, and every clip of the same footage shares it. direction forward tracks to the end of the clip's trimmed range, backward to its start, both both ways. Methods: csrt (default; OpenCV's CSRT tracker: follows changes of shape and size, which can wobble a little), template (finds the starting picture near the last box: fast and a fixed size, for things that don't turn or grow), opticalFlow (moves the box with the points inside it and scales it with their spread: for textured things). Every frame gets a confidence (0-1: how well the starting picture still matches in the box); the reply lists spans under 0.5 as possible drift, and where the tracker loses the object it holds the box before. Look at those frames with render_frame debug=true, which draws each track's box, and correct the box with reanchor_track. Up to 150 frames answers directly; longer runs are a tracking_N job (poll get_job_status) that adds the track as its own undo step. list_layers shows each clip's tracks.
| Parameter | Type | Description |
|---|---|---|
layerId |
string, required | The video layer (clip) the object is in. |
time |
number, required | Timeline time in seconds of the frame the box is drawn on (the nearest frame, as render_frame shows it). |
box |
object, required | The object's box in canvas pixels at that time: x, y (top-left corner), width, height. |
box.x |
number | Left edge, canvas pixels. |
box.y |
number | Top edge, canvas pixels. |
box.width |
number | Width, canvas pixels. |
box.height |
number | Height, canvas pixels. |
direction |
string, default "forward" |
forward (to the end of the clip), backward (to its start) or both. Default forward. |
method |
string, default "csrt" |
csrt, template or opticalFlow. Default csrt. |
id |
string | Track id. Default track_N. |
tracks_to_keyframes¶
Turn a hidden track's box into keyframes on its redaction (one undo step), to edit by hand: x, y, width and height keyframes named <track>.x, <track>.y, <track>.width and <track>.height on the redaction layer, made from the fail-safe box (padding, gaps, holds and smoothing included) and kept only where needed to stay within 0.2 px of it. The box is 0.5 px bigger on each side, so on every frame it contains the box it was made from. The keyframes are in the footage's own seconds and pixels, like the track, so the box keeps following trims, speed changes and splits; the redaction then hides that box from its first keyframe to its last, and paddingPercent and holdFrames no longer change it. Edit it with set_keyframes and remove_keyframes (time in the footage's seconds); clear_keyframes with property "<track>" goes back to the box worked out from the track. Running it again remakes the keyframes from the track.
| Parameter | Type | Description |
|---|---|---|
trackId |
string, required | The track whose box to turn into keyframes; apply_redaction must hide it first. |
undo¶
Undo the last change to the open project (in-memory history of this session, up to 200 steps).
No parameters.
update_layer¶
Change static fields of a layer. 'changes' is an object of field: value, using the field names from get_project, e.g. {"x": 640, "parentId": "tora_body", "anchorX": 120, "end": 2.5, "text": "Hi", "box": {"padding": 20}}. For animatable properties a number sets the static value (used only when the property has no keyframes). Use parentId "" to unparent. language (en, ja, my, pt-BR) puts the layer and its children in that language's version only; on a video it is the language of its sound; "" puts it back in every version. Nested objects are merged; null removes a nested key. A redaction's own fields are name, visible, style, strength, paddingPercent, feather, holdFrames and color.
| Parameter | Type | Description |
|---|---|---|
layerId |
string, required | Layer id. |
changes |
any, required | Fields to change. |
update_project¶
Change the open project's settings. Only the parameters you pass change. Keyframe times are in seconds, so changing fps keeps the timing; changing the canvas size does not move layers (for landscape footage on a new vertical canvas use reframe_to_vertical). Extend the duration when a voiceover or music runs past the end; the result warns about audio that would be cut and keyframes or layers past a shorter end. Audio: loudnessTarget (LUFS, two-pass loudnorm at export; 0 = off) and ducking (music under voice).
| Parameter | Type | Description |
|---|---|---|
name |
string | New display name (the folder is not renamed). |
width |
integer | Canvas width in pixels (even, 16-8192). |
height |
integer | Canvas height in pixels (even, 16-8192). |
fps |
integer | Frames per second (1-120). |
duration |
number | Duration in seconds. |
backgroundColor |
string | Background color #RRGGBB or #RRGGBBAA. |
preset |
string | youtube_1080p (1920x1080) or shorts_1080p (1080x1920): sets width, height, fps and loudness. |
loudnessTarget |
number | Export loudness in LUFS, -40..-5 (-14 for YouTube and most platforms); 0 turns normalization off. |
ducking |
boolean | Duck music (role music) under voice (role voice) in the export. |
view_source¶
Contact sheet of a video asset's own frames (not the timeline), each labeled with its source time and frame number, to find trim and cut points before or after adding the clip.
| Parameter | Type | Description |
|---|---|---|
assetId |
string, required | Video asset id. |
startTime |
number, default 0 |
First source time, seconds. Default 0. |
endTime |
number | Last source time, seconds. Default: the end of the clip. |
count |
integer, default 12 |
Number of frames (1-64). Default 12. |
columns |
integer, default 4 |
Grid columns. Default 4. |
maxWidth |
integer, default 1600 |
Width of the whole sheet. Default 1600. |
Workflow prompts¶
A client shows these as ready-made requests, such as slash commands. Each fills in a step-by-step plan for the model from its arguments.
comic_panels¶
Turn a folder of comic panels into a video: the camera moves from panel to panel, timed to a voiceover, with captions.
| Argument | Required | Description |
|---|---|---|
folder |
yes | Absolute path of the folder with the panels. |
voiceover |
no | Absolute path of the voiceover. Optional. |
name |
no | Project name. Default: the folder's name. |
new_episode¶
Start a new animated episode from the library: a template, the scenes as markers, then the rigs, actions, sounds and titles of each scene.
| Argument | Required | Description |
|---|---|---|
name |
yes | Project name for the episode. |
template |
no | Library template to start from. Default: ask the user. |
script |
no | Absolute path of an episode script (.json or .md) for build_from_script. Optional. |
privacy_blur¶
Find the faces and license plates in a video, let the user choose which to hide, hide them and check every frame before export.
| Argument | Required | Description |
|---|---|---|
video |
yes | Absolute path of the video. |
target |
no | What to find: faces, plates or both. Default both. |
name |
no | Project name. Default: the video's file name. |
talking_head_cleanup¶
Clean up a talking-head video: cut the pauses with punch-in zooms, add captions, check the loudness and export 16:9 and 9:16.
| Argument | Required | Description |
|---|---|---|
video |
yes | Absolute path of the video. |
name |
no | Project name. Default: the video's file name. |
language |
no | Spoken language code for the transcript (en, ja, my, ...). Default auto. |