LTXV API Video to Video (Retake)
Regenerate part of a clip — or all of it — without leaving ComfyUI
- video
- video
- info
- width
- height
- frame_rate
- frame_count
"Retake" is Lightricks' official name for this endpoint, and it does what it says: it re-generates a section of a video you already have. Feed it a clip, tell it where to start and how long the redo should run, and LTX re-renders that stretch - new pixels, new motion, optionally new audio. Set start_time to 0 and duration to the full clip length and you've got a full video-to-video regen: same footage, wholesale restyle.
Why you'd reach for this
This is the node you grab when you have footage and you don't like how it came out, or when you want the LTX look applied to something that started elsewhere. The full-clip mode is the interesting one: take a clip you shot or generated with another model, point this at it with a restyle prompt, and get a version that re-renders the whole thing on Lightricks' hardware. It's the "open model, someone else's GPU" pattern from the rest of this pack - LTX-2.3's motion quality without the 100GB of local weights. And because it's video-in, video-out, it lives mid-workflow: Load Video → this node → SaveVideo, or chain it into a partner API node.
How it works
The node POSTs to /v1/retake and streams the result back as an MP4 - it's a sync call, same shape as the T2V/I2V nodes. The input arrives one of two ways: a VIDEO socket, or a public HTTPS URL in video_url (which wins when both are set). The mechanism detail that actually matters is what happens to your source:
- If the
VIDEOis file-backed - from Load Video or another LTXV node - the original MP4 bytes are uploaded directly. Audio is preserved, no re-encode. - If it's component-derived (a workflow that built a VIDEO from frames), the node re-encodes it as a video-only MP4, and the source audio is dropped on upload. If pristine audio matters, use
video_urlinstead.
The endpoint minimum is 2.0 seconds and the input clip needs at least 73 frames.
The inputs that matter
mode- the three-way switch that decides what gets regenerated:replace_audio_and_video(both, the default),replace_video(keep original audio, swap pixels),replace_audio(keep pixels, swap audio). This controls what rides back on thevideooutput.start_time/duration- seconds into the input where the redo starts, and how long it runs.start_time=0+duration=full clip= full-clip regen.model- retake only supports the pro line:ltx-2-3-pro(newer, the API default) orltx-2-pro.video_url- the escape hatch for big inputs. Public HTTPS URL only; the request uses it verbatim instead of base64.
Outputs are the standard sync set: video (audio content depends on your mode), info, and width / height / frame_rate / frame_count.
Installing it
Same as the rest of the pack - it's one repo, four nodes, no model downloads:
cd ComfyUI/custom_nodes
git clone https://github.com/am-pipeline-prod/comfyui-ltxv-api.git
cd comfyui-ltxv-api
pip install -r requirements.txt
Restart, find LTXV API in the menu. The key lives in the environment, not a widget:
export LTXV_API_KEY="ltxv_..."
or as api_key = "ltxv_..." in ~/.config/comfyui-ltxv-api/config.toml. Remember the pack's own caveat: MIT, self-serve, not actively maintained. It works today; don't assume someone's fixing it next month.
Where people get burned
HTTP 400about frame count - the input is under the 73-frame floor. Extend or re-time your source.durationunder 2.0 - the API minimum. The widget already floors you at 2.0, so this shows up as a 400 if something slips through.- Huge base64 request rejected - a long clip as a data URI balloons the body. Use
video_urlwith a public URL. - Input audio went missing - you're feeding a component-derived VIDEO, which gets re-encoded video-only. Go file-backed or use
video_url. HTTP 402- insufficient credits. Retake on-promodels at full clip length adds up fast; check the LTX console before you queue something long.
The mental model is simple: retake is a paid, remote re-render of footage you already own. If your card can run LTX-2.3 locally you probably don't need it - but if you're on the API path anyway, this is how you do V2V without ever downloading a weight.
Inputs (9)
| Name | Type | Default | Description |
|---|---|---|---|
| prompt | STRING | Optional but strongly recommended -- the prompt steers what the regenerated section should look like. | |
| model | COMBO | ltx-2-3-pro | Retake supports the Pro variants only. ltx-2-3-pro is the newer LTX-2.3 family and is the API default. |
| start_time | FLOAT | 0.00–600 | Seconds into the input where the regenerated section starts. Set to 0 (combined with duration=full clip length) for a full-clip video-to-video regen. |
| duration | FLOAT | 4.02–60 | Section length in seconds. API minimum is 2.0. Set to the full clip length (combined with start_time=0) for a full video-to-video regen. |
| mode | COMBO | replace_audio_and_video | Which streams to regenerate. replace_audio_and_video = both. replace_video = keep original audio, replace pixels. replace_audio = keep pixels, replace audio. |
| resolution | COMBO | (auto) | Output resolution. (auto) lets the API mirror the input. 1920x1080 / 1080x1920 are the documented supported outputs. |
| fps_for_encoding | FLOAT | 24.0001–60 | FPS used when re-encoding a component-derived VIDEO (VideoFromComponents) to MP4 for the request body. Ignored when video_url is used or when the VIDEO is file-backed (the original bytes ride through unchanged). |
| videoopt | VIDEO | Source video. The native input type for retake. When the VIDEO is backed by an on-disk MP4 (Load Video, another LTXV node) the original bytes are uploaded directly -- audio preserved, no re-encode. | |
| video_urlopt | STRING | Public HTTPS URL of the input video. When non-empty, this wins over the `video` socket and the request uses the URL verbatim. Recommended for inputs too large for base64 (10s of MB+). |
Outputs (6)
| Name | Type | Description |
|---|---|---|
| video | VIDEO | Native ComfyUI VIDEO wrapping the downloaded MP4 (lazy decode). Wire to SaveVideo / GetVideoComponents / partner API nodes. Audio track depends on `mode`: replace_audio_and_video / replace_audio ship API-generated audio; replace_video keeps the source's audio. |
| info | STRING | Human-readable summary. |
| width | INT | Frame width in pixels. |
| height | INT | Frame height in pixels. |
| frame_rate | FLOAT | MP4 frame rate as probed from the container. |
| frame_count | INT | Number of frames in the MP4 container. |