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.

5 min readSume
All posts

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.

Seedance and Kling ids on /v1/videos, read 2026-10-02
Product nameSume idOutput lengthResolutions
Seedance 2.5seedance-2.54 to 30 s480p, 720p, 1080p
Seedance 2.0seedance-24 to 15 s480p, 720p, 1080p
Seedance 2.0 Fastseedance-2-fast4 to 15 s480p, 720p, 1080p
Seedance 2.0 Miniseedance-2-mini4 to 15 s480p, 720p, 1080p
Kling Video v3 Prokling-34 to 15 s720p, 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

All Developers posts

Written by Sume