Seedance 2.0 or Kling 3.0 gives 404 model_not_found: real ids
seedance-2.0 or kling-3.0 on /v1/videos gets 404 model_not_found. Sume's ids are seedance-2, seedance-2.5 and kling-3; list them from the models endpoint.

If POST /v1/videos answers 404 model_not_found for seedance-2.0 or kling-3.0, the request is fine and the id is wrong. Sume uses bare catalog ids: seedance-2.5, seedance-2, seedance-2-fast, seedance-2-mini and kling-3. Dots in the version number belong only to seedance-2.5.
The product names are Seedance 2.0 and Kling Video v3 Pro, which is exactly why people type a dotted id. The fix is a one-word change, and the durable fix is to read ids from the API instead of typing them. This post shows both, from Sume's video generation docs.
What does the 404 actually say?
The /v1/videos route documents that model accepts a catalog id from GET /v1/videos/models, or auto-, sume/auto or auto to let Sume pick. Anything else is 404 model_not_found, and the message tells you to use a catalog id from that listing. The error is raised before any reservation, so nothing is billed and nothing is queued.
The Video Router at POST /v1/video-router/generate also answers model_not_found for an unknown id. The two surfaces share one catalog of ids, so a fix on one carries over to the other. If you wrote a client against OpenRouter's video API, remember that Sume follows its field names but not its model slugs.
Which id maps to which product name?
The ids below are the ones in Sume's Video Router catalog. Use them verbatim.
| Product name | Sume id | Output length | Resolutions |
|---|---|---|---|
| Seedance 2.5 | seedance-2.5 | 4 to 30 s | 480p, 720p, 1080p |
| Seedance 2.0 | seedance-2 | 4 to 15 s | 480p, 720p, 1080p |
| Seedance 2.0 Fast | seedance-2-fast | 4 to 15 s | 480p, 720p, 1080p |
| Seedance 2.0 Mini | seedance-2-mini | 4 to 15 s | 480p, 720p, 1080p |
| Kling Video v3 Pro | kling-3 | 4 to 15 s | 720p, 1080p |
How do I read ids instead of typing them?
Call GET /v1/videos/models. Each entry carries id, supported_durations, supported_resolutions, supported_frame_images and supported_input_references, so you can validate a request before sending it. This script lists every Seedance and Kling id with its duration range.
import os, requests
r = requests.get(
"https://api.sume.com/v1/videos/models",
headers={"Authorization": f"Bearer {os.environ['SUME_API_KEY']}"},
timeout=30,
)
r.raise_for_status()
for m in r.json()["data"]:
if m["id"].startswith(("seedance", "kling")):
d = m["supported_durations"]
print(m["id"], f"{min(d)}-{max(d)}s",
m["supported_resolutions"], m["generate_audio"])
What if I do not care which model runs?
Send sume/auto and let Sume choose. The docs describe it as a router that picks a model for you, and on the Video Router it currently defaults to Gemini Omni Flash 1.1, so it will not necessarily give you a Seedance or Kling clip. If you need a specific family, pin the id. Do not treat auto as a Seedance alias.
Pinning also matters for cost. Billing is the provider list rate times 1.25, set per model, and the limits differ: seedance-2.5 is the only Seedance id that reaches 30 seconds, and kling-3 takes first and last frames but no reference images, video or audio.
Will the ids change?
Sume's docs do not promise a retirement schedule for these ids, so do not assume one. What they do say is to discover models from GET /v1/videos/models and GET /v1/catalog. A client that reads the list at startup, caches it for a short time and fails loudly on a missing id is the cheap defense against a surprise 404.
For picking between versions, see Seedance 2 Fast vs Mini and Kling 3.0 vs Seedance 2.0.
How do I confirm the fix worked?
Resubmit with the corrected id and look at the first response. A successful /v1/videos submit returns id, polling_url, status and model, with no content yet, because video generation is asynchronous. Poll the polling_url until the status is completed, then fetch GET /v1/videos/{id}/content.
Keep the test cheap. The shortest clip every Seedance id lists is 4 seconds, and 480p is the lowest resolution on that family, so a smoke test of a new id costs little. Check usage.cost on the poll response afterward to see what Sume reserved and captured. If the error persists with a corrected id, print the exact JSON you send; a stray space or a capital letter in the id fails the same way.
Sources
Related posts
More in Developers
- Seedance 2.5 60 FPS on Dreamina: is there a frame-rate field?
Dreamina's plan page lists frame-rate improvements up to 60 FPS and resolution upgrades. Sume's video request has no fps field; here is what it takes instead.
- Seedance 2.5 first frame plus references in one request: 400
On Sume's Video Router, image_url plus reference_*_urls returns 400 for seedance-2.5. Pick image-to-video or reference-to-video; /v1/videos lets frames win.
- Seedance 2.5 references: input_references or reference_image_urls?
POST /v1/videos takes frame_images and input_references for seedance-2.5; the Video Router takes image_url and reference_*_urls. The wrong shape gets 400.
- Seedance 2.5 reference audio alone returns 400: add an image
On Sume's Video Router, reference_audio_urls with no reference image or video returns 400. Pair the audio with an image or clip, within 3 audio and 12 total.
Written by Sume