SEP 2, 2026
Table of contents
- Why the seed matters
- Step 1: one still of the presenter
- Step 2: the seed clip, first frame equals last frame
- Step 3: extend it
- Step 4: extend again
- Step 5: join them
- What to expect
- What it cost
Extending a clip that has no extend endpoint
POST /videos/extend is Veo-only. The way the Flow editor extends an Omni 1.1 Flash clip is a video-to-video edit: the clip goes back in as referenceVideo_1, the prompt keeps the person, the framing and the mannerisms and gives them the next line, and each output becomes the next input. A customer showed us that workflow, and it is exactly the request the API already makes for a V2V edit.
The catch is the join. Two takes cut together show a small jump at the cut, and this post is about the one precaution, taken at the very first clip, that makes the joins invisible. Everything runs through the public Google Flow API v1, nothing is processed locally.
The format this suits best is UGC, the user-generated-content style of one person talking to a phone camera that fills social feeds and ad libraries. Here is a 10-second UGC talking head built from one still and three 4-second Omni clips on a Google AI Pro account:
47 credits in total
Every step below is the real request that produced it, and every clip is the real output.
Why the seed matters
An edit replays its source: same length, same motion, same first and last frames. So every clip in the chain starts on the seed’s first frame and ends on the seed’s last frame, and if those two frames differ, every cut shows the difference. Make them the same frame, one still as both startImage and endImage, and every cut lands on it.
Step 1: one still of the presenter
A single image from POST /images, portrait, at rest, looking into the lens, hands in her lap. This frame becomes both ends of every clip, so it should be a pose she can naturally return to.
curl — POST /images
curl --location 'https://api.useapi.net/v1/google-flow/images' \
--header 'Authorization: Bearer user:1234-…' \
--form 'email="[email protected]"' \
--form 'aspectRatio="9:16"' \
--form 'count="1"' \
--form 'prompt="A young woman in a cozy oatmeal knit sweater sits on a bright living-room sofa facing the camera like a vlogger about to speak, waist-up, centered, soft window daylight, hands resting in her lap, a small closed-mouth smile, looking straight into the lens. Photoreal, phone-camera look, full frame, no text, no border."'
The response carries the image’s mediaGenerationId under media[0].image.generatedImage.
Step 2: the seed clip, first frame equals last frame
Omni’s first-plus-last-frame mode with the same still in both slots. The prompt gives the first line, asks for real movement in the middle, leaning in, both hands, a head tilt, a laugh, and says she begins and ends on this frame with a quiet beat on each side. The movement is free, only the two ends are pinned. Checked afterwards, the seed’s first and last frames are as alike as any two neighbouring frames inside the clip.
curl — POST /videos
curl --location 'https://api.useapi.net/v1/google-flow/videos' \
--header 'Authorization: Bearer user:1234-…' \
--form 'email="[email protected]"' \
--form 'model="omni-flash"' \
--form 'aspectRatio="portrait"' \
--form 'duration="4"' \
--form 'resolution="720p"' \
--form 'startImage="user:1234-email:…-image:01d1e6ff-…"' \
--form 'endImage="user:1234-email:…-image:01d1e6ff-…"' \
--form 'prompt="She talks straight to the camera like an animated vlogger: she leans in toward the lens as she starts, gestures with both hands, tilts her head, raises her eyebrows and laughs once, shifting on the sofa as she talks, with a warm friendly voice. She begins and ends exactly on this frame: hands resting in her lap, a small smile, looking into the lens, with a short quiet beat before she speaks and another after she settles back into it. She says: \"Okay, I finally did the lighthouse trail this weekend.\" Natural room tone, no music."'
7 credits
Step 3: extend it
The same endpoint, now with the seed as referenceVideo_1. This is the captured editor prompt with one sentence added: she begins and ends exactly as the video does. The first paragraph pins what must not change, the quoted line is the new content, and the last sentence keeps hands empty and strips any captions. No duration is sent, because an edit takes its length from the input.
curl — POST /videos
curl --location 'https://api.useapi.net/v1/google-flow/videos' \
--header 'Authorization: Bearer user:1234-…' \
--form 'email="[email protected]"' \
--form 'model="omni-flash"' \
--form 'aspectRatio="portrait"' \
--form 'resolution="720p"' \
--form 'referenceVideo_1="user:1234-email:…-video:e3d8ce7f-…"' \
--form 'prompt="Extend this video seamlessly. Same person, same outfit, same background, same framing and camera. Keep her movement style, energy, expressions, and mannerisms exactly like the video — the same animated, expressive way she talks with her hands, leaning in, tilting her head and shifting on the sofa. She begins and ends exactly as the video does: hands resting in her lap, looking at the camera with a small smile, a short quiet beat before she speaks and another after she settles back. She keeps talking naturally to the camera. What she says: \"Forty minutes up, and the view is unreal.\" She is not holding any objects — nothing in her hands. Remove all text, captions, buttons, and watermarks from the screen."'
20 credits
Same woman, same sweater, same sofa, same light, same voice. New line, and it opens and closes on the still.
Step 4: extend again
Clip 2 goes in as referenceVideo_1 and only the quoted line changes.
curl — POST /videos
curl --location 'https://api.useapi.net/v1/google-flow/videos' \
--header 'Authorization: Bearer user:1234-…' \
--form 'email="[email protected]"' \
--form 'model="omni-flash"' \
--form 'aspectRatio="portrait"' \
--form 'resolution="720p"' \
--form 'referenceVideo_1="user:1234-email:…-video:ce28ccf7-…"' \
--form 'prompt="Extend this video seamlessly. Same person, same outfit, same background, same framing and camera. Keep her movement style, energy, expressions, and mannerisms exactly like the video — the same animated, expressive way she talks with her hands, leaning in, tilting her head and shifting on the sofa. She begins and ends exactly as the video does: hands resting in her lap, looking at the camera with a small smile, a short quiet beat before she speaks and another after she settles back. She keeps talking naturally to the camera. What she says: \"Go early, the parking fills up by nine. Bye!\" She is not holding any objects — nothing in her hands. Remove all text, captions, buttons, and watermarks from the screen."'
20 credits
Step 5: join them
Concatenate takes the three ids in order and returns the joined file as base64. The trims matter here. The quiet beat that pins each clip to the still also shows up at a join: measured on these clips, she holds the still for about half a second before she speaks and takes about a third of a second to settle back into it at the end, so a plain join stacks the two into a freeze. trimEnd: 0.375 on clips 1 and 2 and trimStart: 0.458 on clips 2 and 3 cut both holds down to two frames each side of the cut. Concatenate reads each clip’s real length, so nothing else is lost.
curl — POST /videos/concatenate
curl --location 'https://api.useapi.net/v1/google-flow/videos/concatenate' \
--header 'Authorization: Bearer user:1234-…' \
--header 'Content-Type: application/json' \
--data '{
"media": [
{ "mediaGenerationId": "user:1234-email:…-video:e3d8ce7f-…", "trimEnd": 0.375 },
{ "mediaGenerationId": "user:1234-email:…-video:ce28ccf7-…", "trimStart": 0.458, "trimEnd": 0.375 },
{ "mediaGenerationId": "user:1234-email:…-video:9feb862d-…", "trimStart": 0.458 }
]
}'
0 credits
Checked frame by frame, the change across each join is smaller than the change between two ordinary neighbouring frames, the longest hold across a join is three frames, and the biggest changes anywhere in the file are her own gestures. She finishes one line, settles for an eighth of a second, and starts the next.
What to expect
- The gestures repeat. Every edit replays the seed’s movement over its own seconds, and on a talking head that is what takes look like. It is also what makes the joins work.
- Movement is free. A first version of this demo kept her almost still. This one asks the seed for leaning in, both hands, a head tilt and a laugh, and the edits inherit all of it. She moves a lot more and the joins stayed clean, because only the two ends of each clip are pinned to the still. Put the energy in the seed prompt and keep the quiet beat on both sides.
- Trim the beats at the joins. The beats are what pin the ends, and untrimmed they read as a freeze. Half a second off the start of each edit and a third of a second off the end of each clip but the last is what this run needed. Measure your own seed once and reuse the numbers, the edits inherit its timing.
- The voice carries. An edit keeps the voice of its source, so the whole run sounds like one person without any audio reference.
- Keep the lines short. An edit inherits the seed’s timing, so a line that runs long is cut off rather than sped up. The last clip here was asked for “Go early, the parking fills up by nine. Bye!” and the “Bye!” did not make it. About eight words per 4-second clip.
- Say what the frame is. An earlier run with “phone-video framing” in the prompt produced a drawn phone bezel on the opening frame. “Full frame, no text, no border” in the still’s prompt and the edits’ “remove all text, captions, buttons, and watermarks” line keep the picture clean.
- The presenter is invented. Google’s V2V moderation is stricter with real, identifiable people, and a clip that contains someone’s actual speech can be refused outright. Start from your own generated or original footage.
What it cost
| Step | Mode | Credits |
|---|---|---|
| The still, 9:16 | Nano Banana 2 Lite | 0 |
| Clip 1, 4s seed | I2V, first + last frame | 7 |
| Clip 2, extend | V2V edit | 20 |
| Clip 3, extend | V2V edit | 20 |
| Concatenate | — | 0 |
| Total | 47 |
A 4-second Omni clip costs 7 credits at 720p whether it is made from text, from an image, or from references. An edit costs 20 credits at 720p, or 10 at 360p, no matter how long the clip is. Full prices are in the credit table.
