Sora Batch API render queue gone: Sume async jobs instead
OpenAI's Sora guide listed Batch API support before the September 24 shutdown. On Sume the pattern is async jobs, a queue and signed webhooks.

If you queued overnight Sora renders through OpenAI's Batch API, that route ended with the Videos API on September 24, 2026. On Sume the equivalent is not a batch endpoint but a queue: submit many video jobs with mode: "async" or a callback_url, let them wait in queued, and verify the signed webhook when each finishes.
What did OpenAI say about Sora and batches?
OpenAI's video generation guide, read on 2026-10-02, says the Sora 2 models and the Videos API were permanently shut down on September 24, 2026, and that no one-to-one replacement API is available. It lists batch processing among the features that are now unavailable. The deprecations page confirms the shutdown date and lists sora-2, sora-2-pro and their dated snapshots with no replacement.
So there is nothing to migrate to at OpenAI for video. The question is how to rebuild the offline-queue pattern somewhere else.
How does Sume queue work?
Per the generation admission docs, a valid submit creates a durable job. If your workspace is at its processing concurrency, the job is accepted as queued while queue capacity remains, and workers move it to processing later. Concurrency is a dispatch limit, not a submit limit.
| Plan | Processing concurrency | Queue capacity | Accepted jobs |
|---|---|---|---|
| Free | 1 | 5 | 6 |
| Pro | 4 | 20 | 24 |
| Startup | 8 | 40 | 48 |
| Scale | 20 | 100 | 120 |
What happens when the queue is full?
New paid generation submissions fail with 429 queue_full, and request-volume limits fail with 429 rate_limited. Retry with backoff and an idempotency key. A shortfall in balance fails with 402 insufficient_credits before any provider work starts. These are four different controls, and the docs say not to confuse them. Check generation_limits.concurrency_limit for your effective number rather than trusting a static table.
How do I get results without polling?
Pass a public HTTPS callback_url on the video request; Sume signs the raw body with HMAC SHA-256 over <timestamp>.<raw_body> and sends x-sume-webhook-timestamp and x-sume-webhook-signature. The signature is sume-v1=<hex>. The sketch below verifies it, rejects an empty secret and a stale timestamp, and accepts any entry during a secret rotation.
import asyncio, hashlib, hmac, time
def verify(raw: bytes, ts: str, header: str, secret: str) -> bool:
if not secret or abs(time.time() - int(ts)) > 300:
return False
mac = hmac.new(secret.encode(), f"{ts}.".encode() + raw, hashlib.sha256)
want = "sume-v1=" + mac.hexdigest()
return any(hmac.compare_digest(e.strip(), want) for e in header.split(","))
async def main():
secret, raw, ts = "whsec_demo", b'{"event":"job.completed"}', str(int(time.time()))
sig = "sume-v1=" + hmac.new(secret.encode(), f"{ts}.".encode() + raw, hashlib.sha256).hexdigest()
print(verify(raw, ts, sig, secret), verify(raw, ts, sig, ""))
asyncio.run(main())What does Sume not give you?
There is no single batch file upload and no half-price batch tier in the documents I read, and Sume bills list times 1.25 on Video Router models, so do not expect a batch discount. Delivery is up to 10 attempts at a fixed 30-second spacing by default, so store the event and answer 2xx fast, keeping status_url polling as the fallback.
Use job_id as your idempotency key, and read the video docs for each model's supported durations and resolutions.
Sources
Related posts
More in Developers
- Sora shutdown lesson: run a one-hour video vendor exit drill
OpenAI discontinued the Sora API on 2026-09-24. Rehearse losing a video vendor: swap the model id, rerun five prompts, and record what broke.
- soundtrack_shorter_than_spine: loop the music bed in Timeline
Timeline warns soundtrack_shorter_than_spine when the music bed is shorter than the audio. Set soundtrack.loop to true; gain, fade and duck defaults inside.
- SQS FIFO 5-minute dedup vs a Sume Idempotency-Key: which wins?
SQS FIFO dedupes for only 5 minutes. A Sume Idempotency-Key covers the create call itself, so use both when a worker can retry after the window.
- StepAudio 3 Music preview is free, then retired: keep your API stable
stepaudio-3-music-preview is free for a limited time, then retired for a paid version. How to keep a music integration stable, and which Sume ids stay put.
Written by Sume