Typed Sume video client from the OpenAPI JSON, after Sora
Sume publishes OpenAPI 3.0.3 at api.sume.com/reference/json. List the four video operations, then use the SDK's generated calls instead of hand-typing the wire.

If you want a typed client to replace the one you generated for Sora, start from Sume's OpenAPI document at https://api.sume.com/reference/json, which is OpenAPI 3.0.3 and, when I read it on 2026-10-08, listed 171 paths. The video surface is four operations: createVideoGeneration, getVideoGeneration, getVideoGenerationContent and listVideoGenerationModels. The @sume-com/sdk package already ships calls generated from this document, so most teams do not need to run a generator at all.
I did not run a code generator for this post; the listing script below is what I ran against the document.
The four operations
These are the paths and operation ids in the document for video generation. A job can also be read through the generic jobs routes.
| Method and path | operationId | Returns |
|---|---|---|
| POST /v1/videos | createVideoGeneration | 202 with id, polling_url, status, model |
| GET /v1/videos/{id} | getVideoGeneration | the job, with unsigned_urls once completed |
| GET /v1/videos/{id}/content | getVideoGenerationContent | 302 redirect, or 409 |
| GET /v1/videos/models | listVideoGenerationModels | { data: [VideoModel] } with limits and pricing_skus |
List them yourself
Run this as an ES module on Node 18 or later. It needs no key, because it reads the public document.
const res = await fetch("https://api.sume.com/reference/json");
const spec = await res.json();
console.log(spec.openapi, Object.keys(spec.paths).length, "paths");
for (const [path, item] of Object.entries(spec.paths)) {
if (!path.startsWith("/v1/videos")) continue;
for (const [method, op] of Object.entries(item)) {
if (op && typeof op === "object" && op.operationId) {
console.log(method.toUpperCase(), path, op.operationId);
}
}
}Use the SDK instead of generating
The SDK exports the same four operations and returns an object with data, error and response, so a 400 does not throw. Its client sends x-api-key by default and points at https://api.sume.com unless you pass a baseUrl. Helpers that are not in the public document, such as uploadFile, are written by hand in the package, which is why a client generated from the JSON alone will not have them.
Pin the SDK version in your lockfile and re-read the document in CI if you do generate your own types, because a drift check is cheaper than a failed production call. The post on routes missing from the public document lists what to expect not to find.
Sources
Related posts
More in Developers
- Generate then cut out: an image-model result into RMBG, in Python
Two Sume calls: generate a product shot, then POST its URL to /v1/rmbg-1.0/remove. Runnable Python, the polling loop, and the $0.1225 total per cutout.
- Read a Sume job's events to time the wait before generation
Read GET /v1/jobs/:id/events, find generation.submitted, and compute how long a job sat between created, queued and started. A Python helper with tested math.
- Get a 30-second track from Music 1.0 when there is no duration field
Music 1.0 rejects duration and duration_seconds. Steer length in the prompt, for example 'a 30-second track' with timestamped sections; a generation is $0.125.
- GET /v1/jobs returns 404 for a job another key created: Sume's rules
A Sume API key reads only jobs its own member created. A reconciler on a different member's key gets 404 not_found for a real job. How to design for it.
Written by Sume