OpenAI gave 184 days to leave the Videos API: a CI catalog check

Notice March 24, removal September 24, 2026, no replacement listed. An 18-line Python check fails CI when a video model id or duration leaves Sume's catalog.

4 min readSume
All posts

OpenAI's deprecations page says that on March 24, 2026 it notified developers that the Videos API and the Sora 2 model aliases and snapshots would be removed on September 24, 2026. That is 184 days. The page lists the Videos API, sora-2, sora-2-pro and three dated snapshots, and it names no recommended replacement (https://developers.openai.com/api/docs/deprecations, read 2026-10-05).

If your product depended on that API, you now know what a half-year window feels like: long enough to plan, short enough to miss. The lesson for the next vendor is not to avoid vendors. It is to make a vendor change fail loudly in a place you already look, instead of in a customer's render.

One check that would have caught it

Sume's catalog is machine-readable. GET /v1/videos/models returns every id with its supported_durations, so a script can compare what you actually request with what is currently offered. The script below lists your model ids and the longest clip you ask each for, fetches the catalog and exits 1 when an id disappears or a duration is no longer listed. It was run against a local stand-in catalog: with all three ids present it exited 0, and with a 1-second wan-3.0 request it printed the failure and exited 1.

import json, os, sys, urllib.request

USED = {"seedance-2.5": 8, "kling-3": 5, "wan-3.0": 2}  # model id -> longest clip you request
BASE = os.environ.get("SUME_API_BASE", "https://api.sume.com")
req = urllib.request.Request(f"{BASE}/v1/videos/models",
                             headers={"Authorization": f"Bearer {os.environ['SUME_API_KEY']}"})
catalog = {m["id"]: m for m in json.load(urllib.request.urlopen(req))["data"]}

problems = []
for model_id, seconds in USED.items():
    entry = catalog.get(model_id)
    if entry is None:
        problems.append(f"{model_id}: gone from the catalog")
    elif seconds not in entry["supported_durations"]:
        problems.append(f"{model_id}: {seconds}s no longer listed")
for line in problems:
    print("FAIL", line)
sys.exit(1 if problems else 0)

Where to run it

Run it nightly and on every deploy. A nightly run finds a catalog change within a day, long before a notice period ends, and a deploy-time run stops you from shipping a new prompt template that asks for a length the model does not take.

  • Keep the USED dictionary next to the code that builds requests, and generate it from your config rather than typing it twice.
  • Print the failure with the model id in the first words, so an alert is readable on a phone.
  • Treat a missing id as an incident, not a warning: the API answers an unknown model with 404 model_not_found.
  • Add the checks you care about, for example supported_resolutions or generate_audio, with one more elif.

What stays stable

Sume's video ids are bare names such as seedance-2.5, kling-3, wan-3.0, minimax-h3 and gemini-omni-flash-1.1, and one request shape covers all of them. Switching a model is a one-string change, which is what makes a check like this cheap to act on. It does not make the vendors' own schedules go away: a provider can still retire a model, and what you get is notice in your pipeline.

Dates in OpenAI's Sora 2 and Videos API deprecation entry (read 2026-10-05)
ItemValue
Notice dateMarch 24, 2026
Shutdown dateSeptember 24, 2026
Days between184
Replacement listedNone

Sources

Related posts

More in Developers

All Developers posts

Written by Sume