A video provider interface after the Sora shutdown, Sume behind it
OpenAI lists the Sora API shutdown as 2026-09-24 with no replacement. Put video generation behind one interface so the next vendor exit is a config change.

OpenAI's deprecations page lists the Sora video API shutdown date as September 24, 2026 and names no recommended replacement (read 2026-10-03). Code that called it directly now needs a new backend; code that called it through one interface needs a new adapter. The interface below is small on purpose, shaped by what an async job API actually returns.
Shape the interface around jobs
Every hosted video API is asynchronous, so do not model generation as a function that returns a video. Model it as submit, then a handle you can persist, then a poll that yields a terminal state with output URLs. That maps directly to a Sume job: the submit returns a job id, GET /v1/jobs/:id/status reports terminal, and the result carries artifacts on media.sume.com.
export type VideoRequest = {
prompt: string;
imageUrl?: string;
durationSeconds?: number;
resolution?: "720p" | "1080p";
idempotencyKey: string;
};
export type VideoStatus =
| { state: "pending"; pollAfterSeconds?: number }
| { state: "done"; urls: string[] }
| { state: "failed"; code: string; retryable: boolean };
export interface VideoProvider {
submit(req: VideoRequest): Promise<{ handle: string }>;
status(handle: string): Promise<VideoStatus>;
cancel(handle: string): Promise<void>;
}What the Sume adapter maps
On Video 1.0, prompt, image_url, duration and resolution are documented request fields, and Idempotency-Key is the header for safe retries. Video 1.0 is documented as a retiring compatibility alias; for new code the docs point to POST /v1/videos with a catalog model id, so check the live OpenAPI before you hard-code a path.
| Interface | Sume Video 1.0 field | Notes |
|---|---|---|
| prompt | prompt | Required |
| imageUrl | image_url | First frame, public HTTPS |
| durationSeconds | duration | Integer seconds, validated per model |
| resolution | resolution | 720p default, 1080p allowed |
| idempotencyKey | Idempotency-Key header | Same key only for the same payload |
Keep vendor quirks inside the adapter
Polling cadence, download URL lifetimes and size rules differ by vendor, so they belong in each adapter, not in callers. Run the same five prompts through every adapter in CI and record what differs; that is the exit drill, written as a test.
Sources
Related posts
More in Developers
- video_url 400 on Sume: edit is supported only by Omni Flash 1.1
A video_url on any other model returns 400 on the Sume Video Router. Which models take a source video, and how to pick one for your edit.
- Virtual try-on API: which Sume call returns an image, which a video
Need a try-on photo or a try-on clip? On Sume the two catalog try-on Formats return video; a still comes from the image API. The table, plus one call for each.
- Unit-test a Sume submit-and-poll loop in Vitest with fake replies
Test a Sume polling loop without spending credits: inject the sleep, replay queued then completed replies, and assert next_poll_after_seconds is honored.
- Test a webhook endpoint before go-live: a Sume CI gate (Python)
Use POST /v1/webhooks/test-deliveries to fire a signed webhook.test at your deployed URL and fail the deploy unless it answers 2xx. Python script included.
Written by Sume