Nodaro Docs
DocumentationNode ReferenceModelsAI Agents (MCP)DevelopersSelf-hostingResearch
Tools reference

Video editing

Trim, join, loop, caption, overlay and assemble video from an AI assistant with Nodaro's editing tools, several of which run without AI and cost no credits.

The video editing tools turn generated clips into a finished video: trim, join, loop and caption them, lay images over them, add or replace their sound, and assemble narrated videos. Most of them render with FFmpeg rather than an AI model, so they are fast, give the same result every time, and cost few or no credits. Every tool needs the workflows:execute permission and returns a job id.

ToolWhat it doesCredits
trim_videoCuts a clip by time, by frames, or at its cleanest loop point10
combine_videosJoins clips, with transitions or a seamless smart cut30
loop_videoRepeats a clip a number of times or to a length10
extract_frameTakes one frame as an image10
merge_video_audioAdds or replaces the sound of a video20
add_captionsBurns subtitles or word-by-word captions into a video30, or 50 for animated or styled captions
overlay_imagesShows images over a video at set times20
still_to_videoTurns one image and one audio track into a videoFree
slideshowTurns 2 to 100 images and optional audio into a slideshowFree
gif_to_videoConverts an animated GIF to MP4Free
assemble_narrated_videoFits voice blocks over their clips in one narrated video40

trim_video

Cuts a clip. Choose one of three modes: by time, by frames, or at the cleanest loop point. It works like the Trim Video node.

Permission: workflows:execute. Credits: 10.

ParameterTypeNotes
video_url or video_asset_idstringThe source clip.
start_time, end_timenumberBy time: the window to keep, in seconds. end_time must be later than start_time.
trim_start_frames, trim_end_framesintegerBy frames: frames to drop from the start or the end. They override the times. Useful when exact frames matter, as with VEO 3.1 clips at 24 fps.
smart_loop_cutbooleanFinds the last frame that best matches frame 0 and cuts there, for a clean loop. It overrides the other modes.
smart_loop_cut_lookbackintegerHow many final frames to compare, from 2 to 64. Default 16.
silentbooleanRemoves the sound. Default false.

Returns: a job id. A smart loop cut reports the chosen frame in output_data.smartLoopCut.

combine_videos

Joins two or more clips into one video, with a transition or a seamless smart cut. It works like the Combine Videos node.

Permission: workflows:execute. Credits: 30.

ParameterTypeNotes
videosarrayRequired. At least 2 clips, each { url } or { asset_id }, in play order.
transitionstringThe transition between clips, such as cut, fade, dissolve, dip-to-black, wipe-left, slide-up, circle-open, pixelize or zoom-in. The tool lists about 50.
transition_durationnumberFrom 0 to 5 seconds.
audio_modestringkeep, crossfade or remove.
audio_crossfade_durationnumberA crossfade of the sound only, from 0 to 5 seconds. The picture is not changed. By default it follows transition_duration.
audio_crossfade_curvestringWith crossfade: linear, equal-power, smooth, logarithmic or exponential.
smart_cutbooleanCompares the last frames of each clip with the first frames of the next and cuts where they match. Seamless for clips generated from the previous clip's last frame. Nodaro Cloud only.
smart_cut_modestringbest-pair (default), preroll-keep-prev or preroll-keep-next, which decide which side of an overlap is kept.
smart_cut_frames_prev, smart_cut_frames_nextintegerThe search window at the end and at the start of each clip, from 1 to 24 frames. Default 8.

Returns: a job id.

loop_video

Repeats a clip a number of times, or until it reaches a length. It works like the Loop Video node.

Permission: workflows:execute. Credits: 10.

ParameterTypeNotes
modestringRequired. repeat for a number of copies, or duration to loop to a length and trim there.
video_url or video_asset_idstringThe source clip.
repeat_countintegerFor repeat: 2 to 20 copies.
target_durationnumberFor duration: the length, from 1 to 300 seconds.
smart_cut_before_repeatbooleanTrims the clip to its cleanest loop point before repeating it, so no seam shows at any repeat. Recommended for VEO 3.1 clips made from a first and a last frame.
smart_cut_lookbackintegerHow many final frames to compare, from 2 to 64. Default 16.

Returns: a job id.

extract_frame

Takes one frame of a video as an image: the first, the last, or the one at a time you choose. Use the last frame of a clip as the first frame of the next one to chain shots. It works like the Extract Frame node.

Permission: workflows:execute. Credits: 10.

ParameterTypeNotes
video_url or video_asset_idstringThe source video.
modestringfirst, last or timestamp.
time_secondsnumberThe time of the frame. Passing it implies timestamp.

Returns: a job id. The result is an image.

merge_video_audio

Adds sound to a video or replaces it: a voiceover, a soundtrack or a dub. It works like the Merge Video & Audio node.

Permission: workflows:execute. Credits: 20.

ParameterTypeNotes
video_url or video_asset_idstringThe video.
audio_url or audio_asset_idstringOne audio track.
audio_tracksarraySeveral tracks instead, each { url, start_time, volume }: when it starts in the video, in seconds, and its volume from 0 to 200, where 100 is the original.
voiceover_volumenumberThe new audio's volume, from 0 to 200. Default 100.
keep_original_audiobooleanKeeps the video's own sound under the new audio. Default true.
background_volumenumberThe volume of the video's own sound, from 0 to 200. Default 30.

Returns: a job id.

add_captions

Burns captions into a video: one static subtitle block, or animated captions timed word by word. It works like the Add Captions node, which documents every style and option.

Permission: workflows:execute. Credits: 30 for a plain subtitle; 50 for an animated style, or for a subtitle with styling options.

StyleWhat it shows
subtitle (default)A static block. With text, that text is burned as it is for the whole video and never replaced by a transcript. Without text, the speech is captioned.
word-highlight, karaoke, bouncyOne line at a time, timed word by word, with the spoken word highlighted
tiktok-wordsShort pages of words. A page never crosses the end of a sentence or a pause, and stays at most 1.5 seconds.
word-popOne word at a time. Each word stays until the next one starts, at most 1.5 seconds.
ParameterTypeNotes
video_url or video_asset_idstringThe video.
stylestringOne of the styles above. Default subtitle.
textstringOn subtitle, the exact text to burn. On an animated style, only a fallback when transcription returns nothing or is off.
captionsarrayYour own timed words, one { text, startMs, endMs } per word, in milliseconds. This is the shape transcribe returns.
auto_transcribebooleanTranscribes the video's speech to time the words.
transcribe_providerstringincredibly-fast-whisper (default), elevenlabs-stt or whisper. Animated styles need word timings, so whisper is refused when transcription is their only source.
lookstringoutline (Montserrat 900, uppercase, black outline, yellow spoken word) or clean. Unset, it is outline on animated styles and clean on subtitle.
font_family, font_size, font_weight, color, uppercaseThe type. Rubik, Heebo, Cairo and Tajawal cover Hebrew and Arabic.
stroke_color, stroke_width, background_colorThe outline and the background box.
position, position_ybottom, top or center, or the block's center as a percent of the height. About 65 sits below a face and above an app's buttons.
max_words_per_lineinteger1 to 20 words per line, or per page of tiktok-words. 1 or 2 gives the punchy social look. Unset fits the width. No effect on word-pop.
highlight_color, animateAnimated styles only: the color of the spoken word, and false to stop the word motion.
segmentsarrayDifferent treatments for time ranges of the same video, each with start_ms, end_ms, its own options and optionally its own text. Ranges must not overlap.

The styling options also work on subtitle, but a styled subtitle bills at the animated price. For your own corrected transcript, map the words from transcribe into captions, one entry per word.

Returns: a job id.

overlay_images

Shows 1 to 20 images over a video, each for a time range: a logo, a product shot, a screenshot or a card. No AI model runs, and the video's sound is kept as it is. It works like the Video Overlay node.

Permission: workflows:execute. Credits: 20 on Nodaro Cloud.

ParameterTypeNotes
video_url or video_asset_idstringThe base video, for example a combine_videos result.
layersarrayRequired. 1 to 20 layers.
output_aspectstringRenders onto a 16:9, 9:16, 1:1 or 4:5 canvas instead of the video's own size, with base_fit (cover, the default, or contain) and a background_color.

Each layer takes an image, url or asset_id, which can be an image_overlay result, and these fields:

Layer fieldNotes
start, endstart is required. The time range in seconds. Without end, the layer stays to the end of the video.
presetcard (centered, fitted into 78% by 60% of the frame), corner-badge (18% wide, near the corner, bottom right by default) or full-frame.
anchor, x, y, width, height, fitAn exact box, in the same percent units as image_overlay. A box field overrides the preset. With neither, the layer is a corner badge.
opacity, animate, z_indexOpacity, a short fade and scale in and out (on by default), and the stacking order.

Layers past the end of the video are cut or skipped, and an animated image shows its first frame; the job output lists both as warnings. A layer id that cannot be found is refused before anything runs, with its position in the list. Pass the result's job id to add_captions as video_asset_id to caption it next.

Returns: a job id.

still_to_video

Turns one image and one audio track into a video, rendered locally without an AI model. The video lasts exactly as long as the audio. Use it for narrated slides, a cover art video for a song, or a still moment inside a longer edit. For AI motion, use animate_image. It works like the Still to Video node.

Permission: workflows:execute. Credits: free.

ParameterTypeNotes
image_url or image_asset_idstringThe image.
audio_url or audio_asset_idstringThe audio, which sets the length.
motionstringnone (default), zoom-in, zoom-out, pan-left, pan-right or ken-burns.
intensityintegerThe motion strength, from 1 to 10. Default 3.
resolutionstring720p, 1080p (default) or 4K. 4K with motion is slower.
aspect_ratiostring16:9 (default), 9:16, 1:1 or 4:3.
fpsnumber24 or 30 (default).
fit, pad_colorstringcover (default, crops to fill) or contain (adds bars in pad_color, black by default).

Returns: a job id.

slideshow

Turns 2 to 100 images and one optional audio track into a slideshow video, rendered locally without an AI model. It works like the Slideshow node.

Permission: workflows:execute. Credits: free.

ParameterTypeNotes
image_urls or image_asset_idsarray2 to 100 images, in order.
audio_url or audio_asset_idstringOptional. With audio, the video lasts exactly as long as the audio, and the slides share it equally.
image_durationsarraySeconds for each slide, or null for automatic. With audio, totals that do not match are scaled to fit, and the job output says by how much.
per_image_durationnumberWithout audio: seconds per slide, from 0.5 to 60. Default 3.
transition, transition_durationA transition such as cut, fade, dissolve, dip-to-black or wipe-left, and its length up to 5 seconds. An unknown transition falls back to cut.
motion, intensitynone, zoom-in, zoom-out, ken-burns or alternate, which switches the zoom on every slide, with a strength from 1 to 10.
resolution, aspect_ratio, fps, fit, pad_colorAs on still_to_video.

For one image, use still_to_video. For AI motion between images, use animate_image.

Returns: a job id.

gif_to_video

Converts an animated GIF into an H.264 MP4, rendered locally without an AI model. Use it to pass a GIF as a motion reference to a video model that does not accept GIFs, such as Seedance. It works like the Gif to Video node.

Permission: workflows:execute. Credits: free.

ParameterTypeNotes
gif_url or gif_asset_idstringThe GIF.
loop_to_minimumbooleanLoops a short GIF up to target_duration. Default true. A GIF that does not loop cleanly plays forward and backward instead, so no jump appears.
target_durationnumberThe loop length, from 2 to 8 seconds. Default 3.
interpolatebooleanAdds frames for smooth 24 fps motion. Default true. false keeps the GIF's original timing.
alpha_backgroundstringThe background of a transparent GIF: white (default) or black.

Returns: a job id. A GIF with one frame becomes a short still clip.

assemble_narrated_video

Fits ordered blocks of a clip and a voice into one narrated video. When a voice is shorter than its clip, it is centered with silence around it. When it is longer, the clip slows down to fit, up to a limit, and then holds its last frame. The voice is never cut. It works like the Assemble Narrated Video node.

Permission: workflows:execute. Credits: 40.

ParameterTypeNotes
blocksarrayRequired. 1 to 60 blocks in play order, each with a video (video_url or video_asset_id) and an optional voice (audio_url or audio_asset_id). The clips must contain no dialogue.
voice_volumenumberThe voice's loudness in percent, from 0 to 200. Default 100.
clip_audio_volumenumberThe clips' own sound under the voice, from 0 to 200. Default 40.
max_slowdownnumberHow much a clip may slow down for a long voice, from 1 to 2. Default 1.5.
trim_start_frames, trim_end_framesintegerFrames trimmed from the start of every block after the first, and from the end of every block before the last, for seamless joins. Up to 120. Default 0.

Returns: a job id. The video-explainer recipe finishes with this tool; see Content recipes.

Frequently asked questions

Last updated on

On this page