Sora API replacement: four async video APIs and their job shapes
OpenAI's Videos API shut down 2026-09-24 with no replacement listed. OpenRouter, Luma, Runway and Sume all use submit-poll-download; here is each shape.

If you ported a Sora client, the lowest-effort replacement is an API that keeps the submit, poll, download shape. OpenAI's deprecations page lists the Videos API and the sora-2 model ids as shut down on 2026-09-24 and names no replacement. Four other APIs use the same asynchronous pattern, and they differ in paths, polling helpers and status names.
The four shapes side by side
Each row comes from that vendor's own page, read 2026-10-09. Runway's docs show a Node and Python SDK that blocks on a helper; the raw task endpoints are not on the page I read, so that cell says so instead of guessing.
| API | Submit | Poll | Download | Notes |
|---|---|---|---|---|
| OpenRouter | POST /api/v1/videos (202) | GET /api/v1/videos/{jobId}, 30 s suggested | GET .../content | statuses pending, in_progress, completed, failed |
| Luma Agents API | POST /v1/generations | GET /v1/generations/{generation_id} | presigned URLs | ray-3.2 for video; one endpoint also serves images |
| Runway | /v1/image_to_video, /v1/text_to_image, /v1/video_to_video | SDK wait_for_task_output | output URLs on the task | TaskFailedError on failure |
| Sume | POST /v1/videos | GET /v1/videos/{jobId} | GET /v1/videos/{jobId}/content | pending, in_progress, completed, failed, cancelled |
Which one needs the least change
Sume documents its /v1/videos surface as agreeing field for field with OpenRouter's, so a client built from OpenRouter's docs changes the base URL and key and nothing else, apart from the differences Sume lists (bare model ids such as seedance-2, no size field, no seed). The OpenRouter base-URL post walks through that change.
Luma and Runway need a new request body and, for Runway, a different task model, so they are a rewrite of the submit and poll code even though the pattern is the same.
What each replacement can run
The route is only half the choice. Sume lists seedance-2.5 (4 to 30 seconds), seedance-2, wan-3.0, minimax-h3, minimax-h3-max and gemini-omni-flash-1.1 on /v1/videos; it does not list Luma ray-3.2 or Runway's gen4.5. If the model matters more than the wire format, pick the model first and the route second. For per-duration picking, see the duration-cap guide.
A migration order that limits risk
Port in three steps. First, wrap your old Sora calls behind one function with the signature generate(prompt, seconds, size) -> bytes, so the vendor is a detail. Second, implement it for one replacement and run your 20 most used prompts through it. Third, keep the job-state handling generic: treat pending and in_progress as running, completed as success, and everything else as terminal.
OpenAI's page gives a shutdown date but no successor, so no vendor's model is a documented drop-in; expect to re-tune prompts whichever route you choose.
What I could not confirm
I did not read fal's or Replicate's pages for an equivalent video job API, so they are not in the table. OpenAI's page lists no replacement, and this post does not name one as official. All vendor figures were read on 2026-10-09 and are listed in the sources; Sume figures come from its public catalog and docs the same day.
Sources
Related posts
More in Comparisons
- Sume Music Router vs Music 1.0: same $0.125, different model ids
Both Sume music routes charge a fixed $0.125 per generation. Music Router adds a model field (sume/music-auto, lyria-3.5, lyria-3-pro); Music 1.0 is retiring.
- Sume POST /v1/images (sume/auto) vs Image 1.0: which for new code
Sume's docs say Image 1.0 is retiring and is an alias for Image Router Auto. New code should use POST /v1/images. The field differences.
- Sume TTS 1.0 vs TTS Router: same $0.0475 per 1,000 characters
Sume's catalog prices TTS 1.0 and TTS Router identically: $0.0475 per 1,000 characters, 20,000-character maximum. They differ in how you pick the model.
- Sume TTS is a job, not a stream: cost and fit for a voice agent reply
A 45-second spoken reply is about 675 characters: $0.0320625 on Sume TTS, $0.010125 on MAI-Voice-2.1-Flash. Sume returns a finished file, not a live stream.
Written by Sume