Find every Sora call left in your codebase: a retired-id scan
OpenAI's Videos API shut down 2026-09-24. A 20-line Python scan lists every file still naming a retired sora-2 model id so you can swap them.

Run a scan for the retired ids before you debug anything else. OpenAI's deprecations page lists the Videos API shutdown as 2026-09-24 and names sora-2, sora-2-pro, sora-2-2025-10-06, sora-2-2025-12-08 and sora-2-pro-2025-10-06; it lists no replacement (read 2026-10-03).
The scanner
The pattern puts the longest id first so a dated id is reported whole, not cut off at sora-2. It skips common vendor folders.
import asyncio, re, pathlib
IDS = [
"sora-2-pro-2025-10-06", "sora-2-2025-12-08", "sora-2-2025-10-06",
"sora-2-pro", "sora-2",
]
PAT = re.compile("|".join(re.escape(i) for i in IDS))
SKIP = {"node_modules", ".git", ".venv", "dist", ".next"}
async def main():
hits = 0
for p in pathlib.Path(".").rglob("*"):
if not p.is_file() or SKIP & set(p.parts):
continue
try:
text = p.read_text(errors="ignore")
except OSError:
continue
for n, line in enumerate(text.splitlines(), 1):
if m := PAT.search(line):
hits += 1
print(f"{p}:{n}: {m.group(0)}")
print(f"{hits} hit(s)")
asyncio.run(main())What to look for besides the model string
The id is only one coupling. Sora's request used seconds and size; Sume's POST /v1/videos uses duration and resolution, and size returns 400 unsupported_parameter. Webhook handlers and stored job ids are the other places an old integration hides.
| Place | Search for | Sume equivalent |
|---|---|---|
| Request body | seconds, size | duration, resolution plus aspect_ratio |
| Model string | sora-2* | bare model id from GET /v1/videos/models |
| Polling | video id lookups | GET /v1/videos/{id} or polling_url |
| Completion | Sora event names | job webhook with callback_url (HTTPS) |
Sources
Related posts
More in Developers
- Flask webhook receiver for Sume: verify sume-v1, refuse empty secret
A Flask route that verifies the Sume signature on the raw body, takes either rotation entry, checks the replay window, and will not boot without a secret.
- FLUX 3 bounding box to a mask_url: Python region edit on Sume
FLUX 3 Image boxes use [top, left, bottom, right] on a 0-1000 grid. Convert one to an RGBA mask with Pillow and run the region edit on Sume's GPT Image 2.5.
- FLUX 3 Image on OpenRouter: n=1, seed, base64 vs Sume
OpenRouter lists FLUX.3 Image with one image per call, a seed and base64 PNG output. How each differs from Sume's POST /v1/images, where FLUX 3 is not listed.
- FLUX 3 Image on Replicate: safety_tolerance 0-4 vs Sume
Replicate's FLUX 3 Image form has safety_tolerance 0-4, grounding, output_quality and 768sq-4k. Which of those inputs Sume's image API has, and what it returns.
Written by Sume