Move an OpenRouter video client to Sume: base URL, key, model ids

Sume POST /v1/videos matches the OpenRouter video API. Change the base URL, key and model id, then check size, seed, provider.options and webhooks.

5 min readSume
All posts

A client written against the OpenRouter video generation API works on Sume after you change the base URL to https://api.sume.com/v1/videos and the API key. Then fix four things: model ids, size, seed and provider.options, and the webhook envelope.

The docs say Sume agrees with that surface field for field, and list the differences, so this is a short checklist and not a rewrite.

The differences that bite

Model ids are bare catalog ids such as seedance-2.5, not org/slug. size returns 400 unsupported_parameter because each v1 model reports supported_sizes: null; use resolution plus aspect_ratio. No v1 model accepts seed, and a non-empty provider.options is rejected rather than ignored.

Webhooks carry Sume's job envelope with x-sume-webhook-signature, not the OpenRouter video.generation.* events. Verify with the Sume scheme before you trust the payload.

OpenRouter video API versus Sume (read 2026-10-07)
AreaOpenRouterSume
Base pathopenrouter.ai/api/v1/videosapi.sume.com/v1/videos
Model idsorg/slugBare catalog id
sizeIf model lists sizes400 unsupported_parameter
seedMany modelsNot accepted
IdempotencyNone on this routeIdempotency-Key header
BillingCreditsWorkspace USD balance

The same code, two lines changed

The snippet below posts to Sume with the fields you already had, and adds an idempotency key. Keep callback_url HTTPS and public.

import os, requests
r = requests.post(
    "https://api.sume.com/v1/videos",
    headers={"Authorization": f"Bearer {os.environ['SUME_API_KEY']}",
             "Idempotency-Key": "migrate-demo-001"},
    json={"model": "wan-3.0", "prompt": "A kite over a beach at sunset",
          "duration": 10, "resolution": "720p", "aspect_ratio": "16:9"},
    timeout=30)
r.raise_for_status()
print(r.json()["id"], r.json()["polling_url"])

What you gain

The same job is also readable at GET /v1/jobs/{id}/status and /result. model: "sume/auto" is a Sume addition if you do not want to pin a family.

Sources

Related posts

More in Developers

All Developers posts

Written by Sume