Sora API removed 2026-09-24: point a /v1/videos client at Sume
OpenAI lists the Videos API and sora-2 as removed on 2026-09-24, no replacement. A client written to the OpenRouter video guide changes three values for Sume.

OpenAI's deprecations page lists the Videos API and the sora-2, sora-2-pro, sora-2-2025-10-06, sora-2-2025-12-08 and sora-2-pro-2025-10-06 models as removed on 2026-09-24, with developers notified on 2026-03-24 and no replacement listed. If your video client follows the OpenRouter-style /v1/videos wire, moving it to Sume changes three values: the base URL, the API key and the model id. Sume does not list any Sora model, so you must pick a model from the Sume catalog.
What the vendor page says
| Item | Value |
|---|---|
| Affected | Videos API; sora-2, sora-2-pro, sora-2-2025-10-06, sora-2-2025-12-08, sora-2-pro-2025-10-06 |
| Developers notified | 2026-03-24 |
| Removal date | 2026-09-24 |
| Replacement listed | None |
What Sume ships instead
Sume's /v1/videos route follows the OpenRouter video generation guide field for field: submit with POST, poll polling_url, download from unsigned_urls[0]. The documented differences are small and listed on the video docs page.
| Setting | Before | After on Sume |
|---|---|---|
| Base URL | your previous host | https://api.sume.com/v1/videos (no /api segment) |
| Auth | your previous key | Authorization: Bearer $SUME_API_KEY |
| Model | a removed id | a bare catalog id such as seedance-2.5, or sume/auto |
| Retry safety | none on that route | Idempotency-Key header, replay returns the original job |
| Webhook | vendor events | callback_url (HTTPS), Sume job envelope, sume-v1 signature |
Pick a replacement and check it
No Sora model maps one to one, because Sume does not carry one. Decide on duration, resolution, audio and price, then read the live catalog. GET /v1/videos/models returns supported_durations, supported_resolutions, supported_aspect_ratios and generate_audio for each model. Pinned models accept longer clips than Auto, which is limited to 3 to 10 seconds.
The snippet below is the smallest change: a request that names a Sume model. It prints the job id and the polling URL.
import os
import httpx
key = os.environ.get("SUME_API_KEY", "")
if not key:
raise SystemExit("set SUME_API_KEY")
r = httpx.post(
"https://api.sume.com/v1/videos",
headers={"Authorization": f"Bearer {key}",
"Idempotency-Key": "sora-migration-001"},
json={
"model": "seedance-2.5", # was a removed Sora id
"prompt": "A golden retriever playing fetch on a beach",
"duration": 8,
"resolution": "720p",
"aspect_ratio": "16:9",
},
timeout=60,
)
r.raise_for_status()
job = r.json()
print(job["id"], job["polling_url"])Search before you ship
Search your repositories for the removed ids and for the old host, and test with a short clip first. The prompt style that worked on one model may not transfer unchanged, so compare a few outputs before you move production traffic.
What this post does not claim
It does not claim that Sume has a Sora model, because it does not list one. It does not claim that an OpenAI client library works against Sume without changes: the Sume route follows the OpenRouter video generation guide, so the request fields come from that guide. And it does not claim that outputs match. Prompts that worked on one model need a fresh look on another.
What is documented is the wire: submit with POST, read polling_url, poll until completed, then download from unsigned_urls[0] or the content endpoint. Bare catalog ids replace provider-prefixed ones, and Sume adds Idempotency-Key, sume/auto, and a standard job webhook.
Start with the model list, choose two or three candidates by duration and resolution, run one short clip on each, then switch the config. Keep the old call path behind a flag until the new one has handled a day of traffic. The Sora removal date has passed, so the old path should already be failing, and the flag only exists to let you compare your own logs.
Sources
Related posts
More in Developers
- Sora content rules vs Sume generation_rejected: read the job events
A prompt Sora refused may behave differently on Sume. How a rejection shows up as generation_rejected, which events to read, and why you must not assume parity.
- Sora download_content vs Sume /content: the 302 and two 409 errors
OpenAI's content endpoint took variant=video, thumbnail or spritesheet. Sume's /content redirects with a 302 and returns two different 409s. How to branch.
- Sora ended Sept 24, Veo 3.1 previews end Oct 22: one plan for both
OpenAI's Sora API ended Sept 24 and Google's Veo 3.1 preview ids end Oct 22, 28 days later. One adapter and one Sume model id can cover both moves.
- Sora input_reference image: upload with uploadFile, use frame_images
OpenAI took the first-frame image as multipart input_reference. Sume wants an HTTPS URL: upload with the SDK's uploadFile, then pass it as frame_images.
Written by Sume