/v1/videos model_not_found: 404 now, not 400. Fix retry logic
An unknown model id on /v1/videos returns 404 model_not_found. It was 400 through #2311 and changed in #2321. Update clients that match on 400.

POST /v1/videos with a model that is not a catalog id, an alias or sume/auto now returns 404 model_not_found. It was 400 through #2311 and changed to 404 in #2321, so that the platform has one convention. If your client treats 400 as "bad model", update it.
Error table and what to do
The Sume errors table for this surface is short. The last column is suggested handling, not a documented retry policy.
| HTTP | code | Suggested handling |
|---|---|---|
| 400 | invalid_request, unsupported_parameter, unsupported_capability | No, fix the body |
| 401 | unauthorized | No, fix the key |
| 402 | insufficient_credits | After a top-up |
| 404 | model_not_found | No, refresh the catalog |
| 404 | job_not_found | No, check the id and workspace |
| 409 | job_not_completed | Yes, keep polling |
| 429 | rate_limited | Yes, back off |
| 409 | job_failed | No, read the poll error |
| 502 | provider submission | Yes, resend with the same Idempotency-Key |
Update the check
The fix is to branch on the HTTP status and code together, and to treat any 404 on submit as "model id is wrong". A 404 on a poll or content call is a different code, job_not_found.
A small guard
This snippet refreshes the catalog when the model id is unknown.
import asyncio, os
import httpx
async def main():
headers = {"Authorization": f"Bearer {os.environ['SUME_API_KEY']}"}
async with httpx.AsyncClient(base_url="https://api.sume.com", headers=headers) as c:
r = await c.post("/v1/videos", json={"model": "no-such-model", "prompt": "test"})
if r.status_code == 404:
ids = [m["id"] for m in (await c.get("/v1/videos/models")).json()["data"]]
print("unknown model, valid ids:", ids)
else:
print(r.status_code, r.text)
asyncio.run(main())Common cause
Do not guess a replacement id. Sume ids are bare (seedance-2, not bytedance/seedance-2), so an id copied from an org/slug catalog is one likely cause of this 404.
Sources
Related posts
More in Developers
- /v1/videos size 1920x1080 returns 400: send resolution instead
POST /v1/videos rejects size with 400 unsupported_parameter because every model reports supported_sizes null. Send resolution plus aspect_ratio.
- /v1/videos failed: 'Could not download an input media URL' fix
A /v1/videos job fails with 'Could not download an input media URL (image_url)' when Sume cannot fetch your input. Make the URL public https and resubmit.
- /v1/videos poll status: pending, in_progress, and the Sume job state
On /v1/videos, a Sume job reads queued as pending, processing as in_progress, canceled as cancelled. The full status mapping, and why expired never appears.
- Veo 3.1 Lite: no 4K, no extension. Checklist before Oct 22
Veo 3.1 Lite has no 4K and cannot extend clips, and all three Veo 3.1 preview ids shut down October 22, 2026. Google points to gemini-omni-1.1-flash.
Written by Sume