Sora 2 API Alternatives Compared, With Code: Seedance 2.5, Omni Flash, MiniMax H3, Kling v3
9 min read • September 21, 2026
Table of contents
- Introduction
- What is actually being removed
- The four replacements
- Pricing
- Getting the video back
- Step 1: one character, reused everywhere
- Step 2: a start frame per model
- Step 3: the farewell clip, on Sora 2 itself
- Step 4: one clip per replacement
- What changes when you move off Sora 2
- What it cost
- Run it yourself
- Frequently asked questions
- Conclusion
Introduction
OpenAI removes sora-2, sora-2-pro and the whole Videos API on September 24, 2026, and its deprecation table names no replacement — so the migration is to another vendor, and through the useapi.net APIs the same six-second shot costs between $0.08 and $1.80 depending on which one you pick.
The most expensive of the four costs 22 times the cheapest — $1.80 against $0.08 — from the same brief, the same character and the same framing. At any real volume that gap, not the output quality, is what decides the choice.
So the comparison is not just a table, the same scene was shot five times with one character: a neon-sign maker retires a SORA 2 sign, then presents each replacement in turn. Every clip was generated by the model whose name is on the sign, so what you are watching is each model describing itself, at its own price:
$3.68 in total, all five clips · watch on YouTube
What is actually being removed
On March 24, 2026 OpenAI notified developers that the Videos API and every Sora 2 alias and snapshot — sora-2, sora-2-pro, sora-2-2025-10-06, sora-2-2025-12-08, sora-2-pro-2025-10-06 — would be removed on September 24, 2026. The Sora consumer app had already closed on April 26, 2026. After the removal date the endpoints stop answering, and OpenAI says it will permanently delete the data associated with your use of Sora once any final export window closes — so anything you still need has to come down before then.
The detail that decides the migration is the shape of the deprecations table itself. Most rows name a recommended replacement. The Sora 2 and Videos API rows leave that column empty, because OpenAI has no other video model to move you to. There is no in-house upgrade path — the only question is which vendor you go to instead.
The four replacements
Each of these generates video from a start frame with synchronised speech, which is the capability most Sora 2 pipelines were using. Prices are for a six-second clip at each model’s nearest tier to 720p, on the best per-credit rate of each route.
| Model | Vendor | Route | Six seconds | Notes |
|---|---|---|---|---|
| Omni 1.1 Flash | Google Flow API | $0.08 | generates at 360p or 720p, free upscale to 1080p | |
| Kling v3 | Kuaishou | Kling API | $0.44 | up to 4K, derives aspect from the frame |
| MiniMax H3 | MiniMax | PixVerse API | $0.72 | 768p or 1440p, no 720p tier |
| Seedance 2.5 | ByteDance | PixVerse API | $1.80 | reference audio and video, via create-fusion |
MiniMax H3 is also the only one of the four whose weights are public, which matters if you are thinking about self-hosting. The FAQ covers what the licence actually allows.
Pricing
Every route here is flat-fee. You bring your own vendor account and add a flat $15/month to useapi.net for API access, with no per-generation surcharge from us — the credits above are the vendor’s own, spent on your own plan.
The figures use the best per-credit rate on each route, on monthly billing: PixVerse Premium at $0.00400 per credit, Google AI Ultra $199 at roughly $0.008 per Flow credit, and Kling Ultra monthly at $0.00615. These are the lowest per-credit rates, not the cheapest plans — Premium is $60 a month and Ultra $199 is Google’s top tier. Yearly billing is cheaper again on all three. Full per-model, per-plan tables are on the PixVerse overview, the Google Flow overview and the Kling overview, and the numbers move when vendors change their promotions, so treat them as current-as-of-publication rather than contractual.
Route matters as much as plan. MiniMax H3 also runs on our own MiniMax API at 7 credits per second, about $0.32 for the same six seconds against $0.72 on PixVerse. Both PixVerse clips here were kept on one account for convenience, not because it was the cheapest way to buy them. The model matrix lists every API that carries a given model.
Getting the video back
Every create call below is asynchronous — it returns an id, not a file. All of them authenticate the same way, with your useapi.net token as Authorization: Bearer user:1234-… (see Setup), and that one token reaches all four vendors.
| Route | Poll | Finished when | The file |
|---|---|---|---|
| PixVerse | GET /videos/{video_id} | video_status_final: true | url |
| Google Flow | GET /jobs/{jobId} | status: "completed" | fifeUrl on the returned media |
| Kling | GET /tasks/{task_id} | status_final: true | works[0].resource.resource |
Any create call also accepts replyUrl, which calls you back when the job finishes instead of making you poll.
Step 1: one character, reused everywhere
Everything starts from a single generated portrait. Images are free on Google Flow — Nano Banana Pro is billed at $0.134 an image on the official Gemini API and included here — so this stage costs nothing however many times you run it. It is passed as reference_1 to every later image request, which is what keeps the same face, the same room and the same bench across five clips made by four different vendors. Nothing else carries identity between them.
The character is invented rather than photographed. In our runs Google’s moderation was markedly stricter with real, identifiable people, and a generated reference sidesteps that entirely.
curl — POST /images — the character, free on the Google Flow API
curl --location 'https://api.useapi.net/v1/google-flow/images' \
--header 'Authorization: Bearer user:1234-…' \
--form 'email="[email protected]"' \
--form 'model="nano-banana-pro"' \
--form 'aspectRatio="9:16"' \
--form 'count="4"' \
--form 'prompt="Photoreal vertical phone video still, handheld, mid-shot from the waist up. A man in his late twenties stands behind a brushed steel workbench in a neon sign workshop: short black hair, thin glasses, plain black t-shirt. Bare pale wall behind him, nothing else in the room. He looks straight into the lens, mouth closed, expression flat. Natural phone-camera look, slight sensor noise, no colour grade."'
Step 2: a start frame per model
One image request per clip, each passing the character as reference_1 and changing only the sign’s text and colour. Holding the wording identical — “Same man, same room, same framing as the reference image … change only the sign” — is what keeps the framing stable enough that the five clips cut together.
Text on a generated sign is the fragile part. Twelve characters (SEEDANCE 2.5) rendered cleanly here, but that is close to where image models start mangling glyphs, so check every frame before spending a credit on video. Pick the variant where the whole sign sits inside the frame, not one that runs off the edge — once the clip animates, anything near the border clips out of shot.
curl — POST /images — a start frame, free on the Google Flow API
curl --location 'https://api.useapi.net/v1/google-flow/images' \
--header 'Authorization: Bearer user:1234-…' \
--form 'email="[email protected]"' \
--form 'model="nano-banana-pro"' \
--form 'aspectRatio="9:16"' \
--form 'count="4"' \
--form 'reference_1="user:1234-email:…-image:168caede-…"' \
--form 'prompt="Same man, same room, same framing as the reference image: he stands behind the brushed steel workbench, both hands resting on the top edge of a large upright neon sign standing on the bench in front of him. Change only the sign: it now reads \"SEEDANCE 2.5\" in bright pink neon tubing on a clear acrylic backing, spanning the width of the bench, reflecting in the steel. He looks straight into the lens, mouth closed, expression flat. Photoreal vertical phone video still, natural phone-camera look, slight sensor noise, no colour grade."'
reference_1 is the character from Step 1.
The start frames live in Google Flow, and the video calls below are on three different vendors. Omni 1.1 Flash takes the Flow mediaGenerationId directly. For the others, download the frame with GET /assets/{mediaGenerationId}, then upload the file to POST /files for PixVerse and use the returned path, or to POST /assets for Kling and use the returned URL.
Step 3: the farewell clip, on Sora 2 itself
The opening clip was generated on Sora 2 while it still answers, through PixVerse rather than OpenAI directly. The sign maker boxes the sign and ships it off. Sora 2 only accepts 4, 8 or 12 seconds — there is no six-second option — so this one is eight, trimmed back to six in the reel.
curl — POST /videos/create-v4 — Sora 2, via the PixVerse API
curl --location 'https://api.useapi.net/v2/pixverse/videos/create-v4' \
--header 'Authorization: Bearer user:1234-…' \
--form 'email="[email protected]"' \
--form 'model="sora-2"' \
--form 'quality="720p"' \
--form 'duration="8"' \
--form 'first_frame_path="upload/96c1035e-….jpeg"' \
--form 'prompt="He looks into the lens and says, flat: \"Sora 2'\''s done. Museum of useless AI shit.\" He drags an open cardboard box into frame from the right, lifts the neon sign off the bench and drops it in, folds the lid shut, then shoves the box out of frame to the right. Handheld phone camera, slight drift."'
first_frame_path comes from POST /files.
$0.64 for eight seconds
Step 4: one clip per replacement
The same prompt shape drives all four, with only the model name and the closing line changed. Each names itself, gives a flat endorsement, then an honest catch.
curl — POST /videos/create-v4 — Seedance 2.5 and MiniMax H3, via the PixVerse API
curl --location 'https://api.useapi.net/v2/pixverse/videos/create-v4' \
--header 'Authorization: Bearer user:1234-…' \
--form 'email="[email protected]"' \
--form 'model="seedance-2.5"' \
--form 'quality="720p"' \
--form 'duration="6"' \
--form 'first_frame_path="upload/8bb69d77-….jpeg"' \
--form 'prompt="The man holds the neon sign on the bench with both hands. He looks into the lens and says, flat: \"Seedance two point five. Best model.\" He pauses. He says: \"Pricey as fuck.\" The neon sign flickers off and back on twice while he speaks. Handheld phone camera, slight drift."'
For MiniMax H3 change model to minimax-h3 and quality to 768p — it publishes no 720p tier. Neither model accepts an audio field — both generate native audio and reject the flag. Both also require duration and quality, which are optional only on PixVerse’s own models.
curl — POST /videos — Omni 1.1 Flash, via the Google Flow API
curl --location 'https://api.useapi.net/v1/google-flow/videos' \
--header 'Authorization: Bearer user:1234-…' \
--form 'email="[email protected]"' \
--form 'model="omni-flash"' \
--form 'aspectRatio="portrait"' \
--form 'resolution="720p"' \
--form 'duration="6"' \
--form 'startImage="user:1234-email:…-image:aeecdde7-…"' \
--form 'prompt="The man holds the neon sign on the bench with both hands. He looks into the lens and says, flat: \"Omni Flash. Google'\''s finest.\" He pauses. He says: \"Insane moderation. But real cheap.\" The neon sign flashes off and back on several times while he speaks. Handheld phone camera, slight drift."'
aspectRatio defaults to landscape here and the start frame does not override it — pass portrait explicitly or a 9:16 frame still returns a 16:9 clip.
curl — POST /videos/image2video-frames — Kling v3, via the Kling API
curl --location 'https://api.useapi.net/v1/kling/videos/image2video-frames' \
--header 'Authorization: Bearer user:1234-…' \
--form 'email="[email protected]"' \
--form 'model_name="kling-v3-0"' \
--form 'mode="pro"' \
--form 'duration="6"' \
--form 'image="https://s15-kling.klingai.com/kimg/…"' \
--form 'prompt="The green neon sign switches off completely, then back on. It does this twice. The man holds the sign on the bench with both hands and looks into the lens, his face blank and still. He says, flat: \"Kling V3. Kling is the King.\" He pauses. He says: \"Nuff said.\" Handheld phone camera, slight drift."'
image is a URL returned by POST /assets. Kling v3 rejects aspect_ratio and derives it from the frame, and audio is on by default.
$1.80
$0.08
$0.72
$0.44
What changes when you move off Sora 2
- Duration grids differ, and a hard-coded value will not port. Sora 2 took 4, 8 or 12 seconds. Omni 1.1 Flash takes 4, 6, 8 or 10, MiniMax H3 5 to 15, Kling v3 3 to 15, and Seedance 2.5 anything from 4 to 30.
- Resolution tiers are not uniform either. Omni 1.1 Flash generates at 360p or 720p, MiniMax H3 skips 720p entirely and jumps 768p to 1440p, Seedance 2.5 reaches 1080p and Kling v3 goes to 4K. Mixing them means conforming everything to the lowest common size, so pick that size before you shoot.
- Quality varies more than the resolution numbers suggest. At the same nominal size the H3 clip came back at 1.3 Mbps against Seedance’s 6.5 Mbps, and it is visibly the softest of the set.
- Voice is the one capability that does not port cleanly. Seedance 2.5 is the only one of the four that accepts an uploaded audio clip as a reference, and only through create-fusion. Omni 1.1 Flash offers Google’s preset voices through
referenceAudio_1, and Kling can carry a voice on a character element. Each clip here uses its model’s own native voice, which is why they differ. - Prompts mostly carry over, with one habit worth adopting: give each physical action its own sentence and describe expressions positively. Trailing clauses and negations get dropped, unevenly, by all four.
What it cost
| Step | Model | Credits | Cost |
|---|---|---|---|
| Character portrait, 9:16 | Nano Banana Pro | 0 | $0 |
| Four start frames, 9:16 | Nano Banana Pro | 0 | $0 |
| Clip 1, Sora 2, 8s 720p, trimmed to 6s | sora-2 | 160 | $0.64 |
| Clip 2, Seedance 2.5, 6s 720p | seedance-2.5 | 450 | $1.80 |
| Clip 3, Omni 1.1 Flash, 6s 720p | omni-flash | 10 | $0.08 |
| Clip 4, MiniMax H3, 6s 768p | minimax-h3 | 180 | $0.72 |
| Clip 5, Kling v3, 6s 1080p | kling-v3-0 | 72 | $0.44 |
| Total | $3.68 |
Images cost nothing on Google Flow, so iterate on the character and the signs as long as you like before spending anything on video. All five clips together came to $3.68, and the cheapest of them is the $0.08 one.
Run it yourself
Every call on this page chains into two scripts. useapi/sora-2-alternatives holds them along with every prompt above in prompts.json: frames/ generates the character and a start frame per model, and clips/ sends each frame to the model named on its sign, then prints the credit cost the API returned.
The frame stage is free, so you can iterate on the character and the signs as long as you like before spending anything. One command does the cheap end of the comparison on its own:
node clips.mjs <API_TOKEN> omni
Frequently asked questions
- When exactly does the Sora 2 API stop working? September 24, 2026. OpenAI announced it on March 24, 2026, covering the Videos API and every
sora-2alias and snapshot. After that date the endpoints stop answering and OpenAI permanently deletes the associated data once any final export window closes, so download anything you still need first. - What does OpenAI recommend migrating to? Nothing. The deprecations table leaves the recommended-replacement column empty for both rows, because OpenAI has no other video model in the API. Migration means another vendor.
- Which alternative is closest to Sora 2 in capability? For the common case — a start frame plus synchronised speech — all four here do it. Seedance 2.5 is the most capable, taking up to 30 reference images plus 10 reference videos and 10 reference audios — 50 in total, through create-fusion — and it is also the most expensive at $1.80 per six seconds. Omni 1.1 Flash does the same core job for $0.08 with a 720p ceiling.
- Is MiniMax H3 really open source? Its weights are public — MiniMax published them in early August 2026, 33B parameters, on Hugging Face. It is open-weight under a custom community licence whose territory clause requires an application form for the USA, EU, UK and South Korea, so “open source” is a loose description of it. The full repository runs to hundreds of gigabytes, though the smallest usable checkpoint is far smaller.
- Do I pay useapi.net per generation? No. You bring your own vendor account and pay a flat $15/month for API access. The credits in the table are the vendor’s own, spent against your plan. See Pricing.
Conclusion
Visit our Discord Server or
Telegram Channel for any support questions and concerns.
Check our GitHub repo with code examples.
Cross posted
Also published on dev.to, discussed on Reddit, and shared on Bluesky.




