Switch video models by changing one string: what can still break

On Sume's /v1/videos you swap the model id and keep the body. Duration range, resolution and aspect ratio are the three fields that may need adjusting.

3 min readSume
All posts

Switching models on Sume is a one-field change: model in the POST /v1/videos body. Auth, polling, download and webhooks are identical for every id. What may need a second edit is anything the new model does not accept: a duration outside its range, a resolution it lacks, or a field it rejects.

One body, three models

Duration 6 sits inside the documented range of all three ids below, so this body is a fair test of the swap.

for M in wan-3.0 seedance-2.5 kling-3; do
  curl -s -X POST https://api.sume.com/v1/videos \
    -H "Authorization: Bearer $SUME_API_KEY" \
    -H "Content-Type: application/json" \
    -H "Idempotency-Key: switch-$M" \
    -d "{\"model\":\"$M\",\"prompt\":\"A kite over a cliff at sunset\",\"duration\":6}"
done

What can differ

Read the new model's entry in GET /v1/videos/models before you reuse a stored body.

Sume docs, read 2026-10-08
FieldWhere it differsExample
durationEach id has its own rangeminimax-h3 needs 5 s or more; gemini-omni-flash-1.1 stops at 10 s
resolutionValue sets differminimax-h3 uses 768p, not 720p
aspect_ratioSubsets differgemini-omni-flash-1.1 is 16:9 or 9:16 only
generate_audioSome models have no toggleOmni always produces native audio; kling-3 has a toggle
seed, size, provider.optionsRejected on every v1 model400 unsupported_parameter

Make the swap safe

  • Validate against the catalog at startup and fall back to the model's nearest valid value.
  • Use a new Idempotency-Key per model, since a replay returns the original job.
  • Compare usage.cost after a swap: prices differ by up to two orders of magnitude between ids.

A guard function

A few lines turn the catalog into a pre-flight check:

import os, requests

r = requests.get("https://api.sume.com/v1/videos/models",
                 headers={"Authorization": "Bearer " + os.environ["SUME_API_KEY"]})
catalog = {m["id"]: m for m in r.json()["data"]}

def fits(model, duration, resolution):
    m = catalog[model]
    return (duration in m["supported_durations"]
            and resolution in m["supported_resolutions"])

print(fits("minimax-h3", 4, "720p"))  # False: 5 s minimum, 768p not 720p

Sources

Related posts

More in Developers

All Developers posts

Written by Sume