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.
- Go: net/http client for a 30-second Wan 3.0 clip, 30 lines
A 30-line Go program using only the standard library: submit wan-3.0 for 30 seconds, poll the job, write clip.mp4. Reserve and per-second rate included.
- gpt-image-2.5 quality auto reserves max: holds from $0.22 to $0.89
On Sume, gpt-image-2.5 with quality auto and auto size reserves $0.8895 per image, while omitting quality reserves $0.2224. Hold table and the safe request.
- Haiku 5.5 prompt caching for a Sume tool list: what breaks the cache
Haiku 5.5 cache hits cost $0.01 per million tokens. Keep the Sume tool list and effort setting stable so a long agent run keeps hitting the cache.
Written by Sume