Extend a video Veo didn't make: which API takes an uploaded clip
Veo 3.1 extension only accepts Veo-made videos. Here is what Gemini Omni and Sume accept instead when you need to continue a clip you uploaded.

You cannot extend an arbitrary MP4 with Veo 3.1. Google's Veo page says extension works on Veo-generated videos only (read 2026-10-03). For a clip you shot or exported from another tool, Gemini Omni Flash is the Google route: its page says extension makes a 3 to 10 second continuation and that input videos for editing or extension must be 10 seconds or shorter (read 2026-10-03).
What each side accepts
Google also says editing or extending uploaded videos with Omni is not available in the EEA, Switzerland or the UK (read 2026-10-03).
| Route | Source clip | Output |
|---|---|---|
| Veo 3.1 extend | Veo-generated only, up to 141 s input, 720p, 9:16 or 16:9 | 7 s per extension, up to 20 extensions, up to 148 s total |
| Gemini Omni Flash extend | Uploaded or generated, 10 s or shorter | 3 to 10 s continuation |
On Sume
Sume has no extend endpoint. Its edit mode on gemini-omni-flash-1.1 takes a video_url through the Video Router and applies a prompt to it; that rewrites a clip, it does not append seconds. To lengthen a clip you can generate a longer clip directly (seedance-2.5 accepts 4 to 30 seconds) or chain clips by feeding the last frame of one into the first frame of the next.
The chaining pattern and its drift trade-offs are covered in the existing posts below.
Sources
Related posts
More in Developers
- Extend an AI clip by hand: last frame to the next clip, in Python
No extend endpoint? Pull a clip's last frame with Sume's video-frames API and feed it as the first frame of the next job. Python code under 30 lines.
- Where to find a voice ID for Sume text to speech: voices_list and voi_
Sume TTS wants a voice UUID or a voi_ library id, never a voice name like alloy. Where to copy it from, and the error you get for a name.
- Find every Sora call left in your codebase: a retired-id scan
OpenAI's Videos API shut down 2026-09-24. A 20-line Python scan lists every file still naming a retired sora-2 model id so you can swap them.
- Flask webhook receiver for Sume: verify sume-v1, refuse empty secret
A Flask route that verifies the Sume signature on the raw body, takes either rotation entry, checks the replay window, and will not boot without a secret.
Written by Sume