Seven pre-flight checks before an Omni, H3 or Recast job
Duration, resolution, ratio, edit conflicts, reference counts, refused fields and URLs: seven per-model checks that catch a refused Sume video request.

Most refused video requests on Sume fail one of seven checks, and five of them can be run in code before you submit. Omni wants 3-10 seconds, MiniMax 5-15, and Recast a 5-30 second source; each model also has its own resolution strings and its own list of refused fields.
The table is the checklist. Every limit comes from the Sume docs and catalog (read 2026-10-09).
The checklist by model
Check 1 and 2 catch most mistakes. A 12-second Omni request, a 720p MiniMax request and a 480p Recast request all fail there.
| Check | Omni Flash 1.1 | H3 and H3 Max | H3 Max Recast |
|---|---|---|---|
| 1. Duration | 3-10 s | 5-15 s | Source 5-30 s, no shot over 15 s |
| 2. Resolution | 360p, 720p, 1080p, 4K | H3: 480p, 768p, 2K, 4K. H3 Max: 480p, 768p, 1080p | 768p or 1080p |
| 3. Aspect ratio | 16:9 or 9:16 | adaptive, 21:9, 16:9, 4:3, 1:1, 3:4, 9:16 | None |
| 4. Edit conflicts | video_url alone: no frames, no references | Not an edit model | video_url plus photos only |
| 5. Reference counts | 10 images, 3 videos of 3 s or less | 9 images, 3 videos, 3 audio, 12 in all | 1-4 photos |
| 6. Refused fields | generate_audio: false, bitrate_mode, reference_audio_urls | generate_audio, bitrate_mode | Frames, audio, aspect_ratio, model_params |
| 7. URLs | Public HTTPS | Public HTTPS | Public HTTPS |
A pre-flight function
This covers the numeric checks and the edit conflict. It is a filter for obvious errors; the API remains the authority.
RULES = {
"gemini-omni-flash-1.1": (3, 10, {"360p", "720p", "1080p", "4K"}),
"minimax-h3": (5, 15, {"480p", "768p", "2K", "4K"}),
"minimax-h3-max": (5, 15, {"480p", "768p", "1080p"}),
"h3-max-recast": (5, 30, {"768p", "1080p"}),
}
def preflight(body):
lo, hi, res = RULES[body["model"]]
errs = []
d = body.get("duration")
if d is not None and not lo <= d <= hi:
errs.append(f"duration {d} outside {lo}-{hi}")
r = body.get("resolution")
if r is not None and r not in res:
errs.append(f"resolution {r} not accepted")
if "video_url" in body and body["model"] == "gemini-omni-flash-1.1":
for k in ("image_url", "end_image_url", "reference_image_urls", "reference_video_urls"):
if k in body:
errs.append(f"video_url cannot ride with {k}")
return errsA refused body and its fix
This Omni body fails twice: 12 seconds is above the 10-second limit, and 768p is not an Omni resolution. The fixed body below it uses 10 seconds and 720p, which is $1.25 on Sume (10 x $0.125).
// refused
{ "model": "gemini-omni-flash-1.1", "prompt": "Harbor at dawn", "duration": 12, "resolution": "768p" }
// accepted
{ "model": "gemini-omni-flash-1.1", "prompt": "Harbor at dawn", "duration": 10, "resolution": "720p", "mode": "async" }Limits and gotchas
Add the price check last: multiply the per-second rate for the resolution by the seconds, and stop if the total exceeds the budget you set for that request.
- Omni edit sends no
aspect_ratioand nodurationas a rule; the output keeps the source framing. - A request refused at validation comes back as an error, not as an accepted job, so the fix costs time and not a job.
- Send an
Idempotency-Keyon every real submit, so a retry does not create a second paid job. - The checks move when the catalog moves. Re-read
GET /v1/videos/modelswhen you update the table.
Sources
Related posts
More in Developers
- Size a Sume submit wave: limit 100, 30 processing, 10 queued gives 60
How many new jobs can a Sume workspace take? max(0, limit - active - queued), capped by queue_capacity_remaining. Worked numbers and a TypeScript helper.
- Make an SRT file from Sume STT word timings in Python (7 words a cue)
Sume STT always returns words[] with word, start and end in seconds. This Python function turns the list into an SRT file, seven words a cue.
- Stable idempotency keys for pause-cut trims: hash source, start, end
Derive each trim's Idempotency-Key from a hash of source, start, end and precision. A retried batch then returns the same jobs and bills 8 trims once.
- Still on /v1/image-router/generate? It works but gets no new params
Sume's legacy image-router generate and models routes still work but are deprecated and get no new parameters. What to change to move to POST /v1/images.
Written by Sume