Gemini Omni video_url edit: the two 400s and how to avoid them

video_url on Video Router means edit, and only gemini-omni-flash-1.1 accepts it. Sending frames or references with it, or another model, gives a 400.

4 min readSume
All posts

On Video Router, video_url is an edit source, and "video_url (edit) is supported only by model gemini-omni-flash-1.1." is the refusal for any other model. If you send video_url together with a frame or reference field, you get "Use either video_url (edit) or frame/reference_*_urls fields, not both." The edit prompt describes the change, the clip is the source.

One field, three behaviours

video_url is shared by three catalog models, and each reads it differently. For gemini-omni-flash-1.1 it starts a video-to-video edit. For higgsfield-genjutsu and h3-max-recast it is the source clip for a person or motion swap, and those two models run their own input builders before the general checks, so the edit-only message does not apply to them.

What video_url means per Video Router model on main (read 2026-10-05)
Modelvideo_url meansCombine with
gemini-omni-flash-1.1Source clip to edit with a promptNothing else: no frames, no references; aspect_ratio refused
higgsfield-genjutsuSource clip for motion transfer1 to 8 reference_image_urls, required
h3-max-recastSource clip for a person swap1 to 4 reference_image_urls, prompt optional
Any other modelNot accepted400: video_url (edit) is supported only by model gemini-omni-flash-1.1.

Edit mode specifics

In edit mode the Gemini Omni output keeps the source framing, so aspect_ratio is refused with a message saying so. The per-model duration check is skipped, because a duration there is only a hint for the reserve estimate. Resolution is optional and defaults to 720p. The prompt carries the instruction, for example the object to replace and what must stay.

A valid edit request

The body below is the shape from the Video Router docs. It builds and prints the dictionary, and it only sends when you set both a key and SEND=1, because a valid request is a billed job. Replace the clip URL with a public HTTPS file.

import os
import requests

body = {
    "model": "gemini-omni-flash-1.1",
    "prompt": "Replace the bottle with an apple. Keep everything else the same.",
    "video_url": "https://example.com/clip.mp4",
    "resolution": "720p",
    "mode": "async",
}
print(body)
if os.environ.get("SEND") == "1":
    r = requests.post("https://api.sume.com/v1/video-router/generate",
                      headers={"Authorization": "Bearer " + os.environ["SUME_API_KEY"],
                               "Idempotency-Key": "edit-demo-001"},
                      json=body, timeout=60)
    print(r.status_code)

When not to use edit

Edit is for changes to an existing clip. If you want new footage that follows a clip's motion, use a reference video on a model that takes one. If you want the same shot with another person, Recast is the purpose-built route. Do not send video_url and a first frame hoping the model will combine them; that is exactly the 400 above. If the edit needs a new object that looks like a specific product, do it in two steps: edit the clip, then check the result with stills before you pass it downstream.

Also keep in mind that edit billing follows the model's per-second pricing as a function of resolution, so a long source at 1080p costs more than the same clip at the default 720p. Read the catalog's pricing fields before you queue many edits, and start with a short clip to confirm the instruction does what you meant.

Sources

Related posts

More in Models

All Models posts

Written by Sume