Seedance 2.5 is live — 30-second cinematic video with native audio & real-person references
Sora 2 API Shutdown: Export, Migrate, and What It Costs
2026/08/25

Sora 2 API Shutdown: Export, Migrate, and What It Costs

The Sora 2 API shutdown hits September 24, 2026 with no official replacement. Export your library, remap the endpoints, and see what each tier really costs.

The Sora 2 API shutdown lands on September 24, 2026, and OpenAI's own deprecation table lists no replacement. Every row — the Videos API itself, sora-2, sora-2-pro, and all three dated snapshots — has an empty "Recommended replacement" cell[1]. That is unusual. When OpenAI retired gpt-image-1, it pointed developers at gpt-image-2 in the same table[1]. Video generation gets no such hand-off.

So this is not a model swap. It is an endpoint removal, and it breaks two things at once: the code that calls POST /videos, and the stored assets you can only reach through GET /videos/{video_id}/content. This guide covers what actually disappears, how to get your library out before it does, the exact parameter differences you will hit rewriting the calls, and what the replacement costs at each tier you might be on today.

TL;DR

  • The shutdown date is September 24, 2026, announced March 24, 2026, covering the Videos API, sora-2, sora-2-pro, sora-2-2025-10-06, sora-2-2025-12-08, and sora-2-pro-2025-10-06[1].
  • No official replacement exists. The replacement column is empty for all six rows, unlike every other deprecation in the same table[1].
  • Your rendered videos live behind the API that is going away. GET /videos enumerates them and GET /videos/{video_id}/content downloads them[2]. Export before the endpoints stop answering.
  • If you are on sora-2 at $0.10/s, savings are modest but real. Comparable 720p-with-audio rates run $0.076–$0.11/s[3][4][9].
  • If you are on sora-2-pro at 1080p, you have been paying $0.70/s and the same clip runs $0.111/s on veo3.1-fast-official[3][4].
  • Watch the clip-length ceiling. Sora 2 does 16 and 20 seconds[2]; Veo 3.1 tops out at 8 seconds per generation[4].

What the Sora 2 API shutdown actually removes

OpenAI announced the deprecation on March 24, 2026, notifying developers using the Videos API and the Sora 2 aliases and snapshots of "their deprecation and removal from the API on September 24, 2026"[1]. The video generation guide carries the same notice at the top of the page[2].

Six identifiers go dark:

Shutdown dateModel / systemRecommended replacement
2026-09-24Videos API(none)
2026-09-24sora-2(none)
2026-09-24sora-2-pro(none)
2026-09-24sora-2-2025-10-06(none)
2026-09-24sora-2-2025-12-08(none)
2026-09-24sora-2-pro-2025-10-06(none)

Source: OpenAI deprecations page[1].

The first row is the one people underestimate. Pinning a dated snapshot does not buy time, because the transport goes away with the models. Anything that touches POST /videos, GET /videos/{video_id}, GET /videos/{video_id}/content, GET /videos, or DELETE /videos/{video_id} needs rewriting, not repointing[2].

Export your library before the endpoints stop answering

Your finished renders are not on your disk. They sit in OpenAI's storage and the documented way to retrieve one is GET /videos/{video_id}/content[2]. When that route is removed, the documented retrieval path for those files is removed with it. Do the export first, before any code rewriting, because it is the only part of this migration with a hard deadline attached.

GET /videos enumerates your library with pagination and sorting[2]:

curl "https://api.openai.com/v1/videos?limit=20&after=video_123&order=asc" \
  -H "Authorization: Bearer $OPENAI_API_KEY" | jq .

Page through it, keep every id, then pull each file:

import os, requests

KEY = os.environ["OPENAI_API_KEY"]
H = {"Authorization": f"Bearer {KEY}"}

def all_video_ids():
    after, ids = None, []
    while True:
        params = {"limit": 100, "order": "asc"}
        if after:
            params["after"] = after
        page = requests.get("https://api.openai.com/v1/videos",
                            headers=H, params=params, timeout=60).json()
        batch = page.get("data", [])
        if not batch:
            return ids
        ids += [v["id"] for v in batch]
        after = batch[-1]["id"]

for vid in all_video_ids():
    dest = f"export/{vid}.mp4"
    if os.path.exists(dest):
        continue
    r = requests.get(f"https://api.openai.com/v1/videos/{vid}/content",
                     headers=H, timeout=600)
    r.raise_for_status()
    os.makedirs("export", exist_ok=True)
    with open(dest, "wb") as f:
        f.write(r.content)

Save the JSON from the listing call too, not just the MP4s. It carries the model, seconds, size, and created_at for each job[2], which is the metadata you will want when you rebuild prompts against a different model and need to know what the original was rendered at.

Rewriting the call: where the two shapes disagree

Both APIs are async submit-then-poll, so the control flow survives. The field names do not.

StepOpenAI Videos API[2]reAPI[5]
SubmitPOST /v1/videosPOST /api/v1/videos/generations
Model fieldmodel: "sora-2"model: "<model id>"
Prompt fieldpromptprompt
Resolutionsize: "1280x720" (pixel pair)resolution: "720p" + size: "16:9"
Durationseconds: "8" (string)duration: 5 (number)
Job handleid on the responsetask_id on the response
PollGET /v1/videos/{video_id}GET /api/v1/tasks/{id}
Fetch the fileGET /v1/videos/{video_id}/contentalready in output.video_urls

Three of these bite in practice. size means different things on the two sides: a pixel pair on one, an aspect ratio on the other, with the resolution split into its own field. seconds is a string and duration is a number, so a naive copy of the value lands a type error rather than a clear validation message. And the download step disappears entirely, since the poll response already carries output.video_urls[5] instead of making you call a third endpoint for the bytes.

A submit that looked like this:

video = openai.videos.create(model="sora-2", prompt=PROMPT,
                             size="1280x720", seconds="8")

becomes:

r = requests.post("https://reapi.ai/api/v1/videos/generations",
                  headers={"Authorization": f"Bearer {REAPI_KEY}"},
                  json={"model": MODEL, "prompt": PROMPT,
                        "resolution": "720p", "size": "16:9", "duration": 8})
task_id = r.json()["task_id"]

What the migration actually costs, by the tier you are on now

Most write-ups of this shutdown quote a single headline saving. That only works if you ignore which Sora tier the reader is actually on, and the honest answer splits in two.

OpenAI's published Sora rates, per second[3]:

ModelSizeStandardBatch
sora-2720p$0.10$0.05
sora-2-pro720p$0.30$0.15
sora-2-pro1024p$0.50$0.25
sora-2-pro1080p$0.70$0.35

Against 720p-with-audio rates on reAPI[4][6]:

Your current tierSora rateComparable rateChange
sora-2 720p$0.10/sveo3.1-fast-official 720P + audio, $0.092/s−8%
sora-2 720p$0.10/sWan 3.0 720P, $0.076/s−24%
sora-2 720p$0.10/sKling 3.0 std 720p + audio, $0.11/s+10%
sora-2-pro 720p$0.30/sveo3.1-fast-official 720P + audio, $0.092/s−69%
sora-2-pro 1080p$0.70/sveo3.1-fast-official 1080P + audio, $0.111/s−84%
sora-2-pro 1080p$0.70/sKling 3.0 pro 1080p + audio, $0.149/s−79%
sora-2-pro 1080p$0.70/sWan 3.0 1080P, $0.151/s−78%
sora-2-pro 1080p$0.70/sSeedance 2.5 1080P, $0.462/s−34%

If you are on plain sora-2 at 720p, the $0.10/s base tier was priced competitively and most swaps land within a few cents of it. Wan 3.0 at 720P is the exception at $0.076/s with an audio track by default[9], about 24% under. That is a real saving, not the order-of-magnitude cut some write-ups promise. If you were running sora-2 through the Batch API at $0.05/s[3], you were on the cheapest audio-capable rate in this comparison and should expect your per-second cost to rise.

The sora-2-pro picture is the opposite. At 1080p you have been paying $0.70/s, and the same second of 1080p footage with audio runs $0.111/s on veo3.1-fast-official[4]. On a 20-second clip that is $14.00 against $2.22.

One billing detail to carry over carefully: Veo 3.1's per-generation tiers bill per render, not per second[4], while the -official variants above bill per second. Those are different units. If your cost model assumes per-second everywhere, the per-generation tiers will not reconcile against it.

The 20-second problem

Sora 2 supports 16- and 20-second generations on both variants[2]. Not every replacement reaches that in a single pass, and this is the constraint most likely to force a real rewrite rather than a config change.

ModelLongest single generation
sora-2 / sora-2-pro20 s[2]
Seedance 2.530 s[6]
Wan 3.030 s[9]
Kling 3.015 s[7]
MiniMax H315 s[8]
Veo 3.18 s[4]

A 20-second Sora shot becomes three Veo 3.1 renders plus a stitch. If your pipeline emits single long takes, two models here clear Sora's ceiling on their own: Seedance 2.5 at 4 to 30 seconds with synced audio[6], and Wan 3.0 at 2 to 30 seconds with an audio track by default[9]. Check this before you benchmark quality. A model that cannot produce your shot length is not a candidate no matter how it scores.

FAQ

When exactly does the Sora 2 API stop working?

September 24, 2026. OpenAI notified affected developers on March 24, 2026[1].

Does OpenAI recommend a replacement model?

No. The "Recommended replacement" column is empty for the Videos API and all five Sora 2 identifiers[1].

Can I keep using a pinned snapshot like sora-2-2025-10-06?

No. The dated snapshots are listed on the same September 24 date as the aliases, and the Videos API that serves them is deprecated too[1].

What happens to videos I already generated?

They are retrieved through GET /videos/{video_id}/content, part of the deprecated Videos API[2]. Once that endpoint is removed there is no documented API route to those files, so export before the date.

Will migrating lower my bill?

It depends on your tier. From sora-2-pro at 1080p ($0.70/s), yes, substantially. From plain sora-2 at $0.10/s, roughly break-even. From sora-2 on Batch at $0.05/s, expect an increase[3].

Do the replacements generate audio like Sora 2 did?

Some do and it is often a separate price tier. Kling 3.0 and Veo 3.1 both list distinct with-audio and no-audio rates[4][7], while Seedance 2.5 generates speech, sound effects and music with audio on by default[6] and Wan 3.0 ships an audio track by default[9].

How much of my code has to change?

The async submit-then-poll structure carries over. What changes is field naming, the split of size into resolution plus aspect ratio, seconds as a string versus duration as a number, and dropping the separate content-download call[2][5].

Are Sora 2's content restrictions the same elsewhere?

Not necessarily. Sora 2 rejects real people including public figures, copyrighted characters and music, and input images containing human faces[2]. Other models draw those lines differently, so prompts that failed on Sora may pass elsewhere and vice versa.

Sequencing the work before the date

Export first. It is the only step with a deadline that cannot move, and it needs nothing more than an API key and disk space. Then pick a model against your hard constraints in this order: clip length, then audio, then resolution, then rate. Length eliminates candidates fastest, and rate is the easiest thing to change later.

Rewriting the calls is a smaller job than it looks, because the submit-poll shape survives and the file-download step goes away. The part worth slowing down on is the cost model. If you are coming off sora-2-pro the savings are real and large; if you are coming off sora-2 at $0.10/s, or Batch at $0.05/s, plan for flat-to-higher per-second cost and pick on capability instead. Either way the Sora 2 API shutdown gives you a fixed date to work back from, and the export is the part that stops being possible after it.

References

  1. OpenAI. Deprecations: Sora 2 video generation models and Videos API. Retrieved August 2026 from developers.openai.com/api/docs/deprecations
  2. OpenAI. Video generation with Sora: Videos API guide. Retrieved August 2026 from developers.openai.com/api/docs/guides/video-generation
  3. OpenAI. Pricing: video generation models, standard and batch per-second rates. Retrieved August 2026 from developers.openai.com/api/docs/pricing
  4. reAPI. Veo 3.1: model page and per-tier pricing. Retrieved August 2026 from reapi.ai/models/veo3-1
  5. reAPI. Seedance 2.5 API: request shape, task polling and output fields. Retrieved August 2026 from reapi.ai/docs/seedance-2-5
  6. reAPI. Seedance 2.5: model page, duration range and per-resolution pricing. Retrieved August 2026 from reapi.ai/models/seedance-2-5
  7. reAPI. Kling 3.0: model page, audio tiers and per-second pricing. Retrieved August 2026 from reapi.ai/models/kling-3-0
  8. reAPI. MiniMax H3: model page, duration range and per-second pricing. Retrieved August 2026 from reapi.ai/models/minimax-h3
  9. reAPI. Wan 3.0: model page, duration range and per-resolution pricing. Retrieved August 2026 from reapi.ai/models/wan-3-0