Sora API ended Sept 24: replacements for 15-second clips on Sume

If your Sora code made 15-second clips, Sume has Kling 3, MiniMax H3 and Seedance 2.5 or Wan 3.0 at that length, with prices per clip and one request shape.

6 min readSume
All posts

Four Sume models make a 15-second clip: kling-3 (4 to 15 s), minimax-h3 (5 to 15 s), seedance-2.5 (4 to 30 s) and wan-3.0 (2 to 30 s). Magic Hour's tracker, read 2026-10-06, records that the OpenAI Sora API ended on 2026-09-24, so any code that asked Sora for 15 seconds needs a new target. The cheapest 15-second 720p-class clip on Sume is Wan 3.0 at $1.88; the dearest of the four is Seedance 2.5 at 1080p.

The shutdown date is on the tracker. Limits and ids are in the Video Router docs.

15 seconds on each model

Billed prices are the provider list price times 1.25. Seedance 2.5 is priced by tokens, so its figure uses the 16:9 frame size.

Prices computed from the Sume pricing tables for a 15-second 16:9 clip, read 2026-10-06.
ModelSetting15 s priceSound
wan-3.0720p$1.88yes
wan-3.01080p$3.75yes
kling-31080p, sound off$2.10no
kling-31080p, sound on$3.15yes
minimax-h3768p$1.13stereo
seedance-2.5720p$8.67yes
seedance-2.51080p$21.33yes

Porting the call

The Sume request is the same for every model: model, prompt, duration, resolution and aspect_ratio in a JSON body, a 202 with a job id, then polling. Only model changes. A value outside a model's catalog gets a 400 unsupported_capability, so a wrong resolution fails fast instead of rendering something you did not ask for. Fields Sume does not take, such as seed or size, get a 400 unsupported_parameter, which is worth knowing if your Sora wrapper passed them.

import os, time, requests

H = {"Authorization": f"Bearer {os.environ['SUME_API_KEY']}"}
r = requests.post("https://api.sume.com/v1/videos", headers=H, timeout=60, json={
    "model": "kling-3", "prompt": "A lighthouse in a storm, slow push-in",
    "duration": 15, "resolution": "1080p", "aspect_ratio": "16:9"})
r.raise_for_status()
url = r.json()["polling_url"]
while True:
    j = requests.get(url, headers=H, timeout=30).json()
    if j["status"] in ("completed", "failed", "canceled"):
        break
    time.sleep(5)
print(j["status"], j.get("unsigned_urls"))

Which one for which Sora job

Pick Kling 3 when the old clips were cinematic single takes and you want a sound toggle. Pick MiniMax H3 when you want stereo sound built in and a plain 5 to 15 second range. Pick Wan 3.0 for volume, since its rate is the lowest of the four in the table. Pick Seedance 2.5 when the clip needs first and last frames or a reference video. If your Sora clips were shorter, the by-length mapping covers the 3 to 10 second range with Omni Flash.

Before you flip the switch, grep your code for the old ids. The retired-id scan does that in Python.

What changes in the response

The job is asynchronous. You get 202 with an id and a polling URL, and the finished file comes from unsigned_urls[0]. If your Sora wrapper expected a synchronous return, add a poll loop, or register a webhook and let Sume call you on job.completed, job.failed and job.canceled.

Cost control changes too. The price is reserved at submit and, where applicable, released or refunded if the job fails, so check your usage before assuming a retry loop is free. Add an Idempotency-Key header and a retry on a network timeout returns the same job instead of making a second one. That is worth doing before you point a queue of old prompts at the new endpoint.

One more check: Sora clips often came with sound. Wan 3.0, MiniMax H3 and Seedance 2.5 include audio, and Kling 3 has a toggle that adds 50 percent to the rate, so confirm the sound setting for every row of your old prompt list before you rerun.

A migration order that limits risk

Start with ten of your most common prompts and run them on two candidate models at the length you used most. Compare, pick, and pin the model id in config rather than in code. Then replay the rest of the list in batches of twenty or so, watching for 400 errors that name a field your old wrapper sent. Each one is a one-line fix. Finally, delete the retired client, so no one reaches for it by habit.

Sources

Related posts

More in Models

All Models posts

Written by Sume