Developers
Building on the Sume API: keys and hosts, jobs and runs, polling, webhooks, idempotency, errors and rate limits, the SDK, the CLI, and MCP auth.
Start with Sume API quickstart: your first video generation call in five steps

List Sume assets: limit, cursor, media_type and status filters
GET /v1/assets returns up to 100 assets per page, newest first, with a null next_cursor on the last page. Filters, defaults, and what a bad cursor does.

Litestar handler for Sume webhooks: await request.body() and 204
A Litestar post handler that awaits request.body(), verifies the Sume HMAC signature, sets status_code=204 explicitly, and raises 401 on a mismatch.

Phoenix: cache the raw body with Plug.Parsers body_reader for Sume
Phoenix parses JSON before your controller runs. Cache the raw bytes with a Plug.Parsers body_reader, then verify the Sume webhook HMAC signature.

Quarkus REST endpoint for Sume webhooks: @HeaderParam and byte[]
A Quarkus REST resource that takes the Sume webhook body as byte[], reads the signature headers with @HeaderParam, and answers 204 or 401.

Sanic webhook route for Sume: request.body, HMAC, empty() 204
Verify a Sume webhook in Sanic with request.body bytes and hmac.compare_digest, then return an empty 204 so the delivery counts as done.

Sume asset complete 409s: checksum, content type, wrong state
POST /v1/assets/{id}/complete checks state, expiry, content type, size and checksum in a fixed order, and deletes the object when it rejects one.

Sume asset download URL: 300 seconds and the 409 cases
GET /v1/assets/{id}/download-url returns a signed GET link that expires in 300 seconds by default, and 409s for registered URLs or assets not yet ready.

An uploaded Sume asset you never complete: what happens
A pending_upload asset has a 15-minute URL by default. After the window and a one-hour grace, a reaper deletes the object and marks the row failed.

TTS voice list returns 503: provider_unavailable vs not_configured
GET /v1/tts-router/voices can return 503 two ways on Sume. provider_unavailable is a retry; provider_not_configured is not. Cache, timeout and a retry loop.

Vapor 4: collect the body, verify a Sume webhook with swift-crypto
Use body: .collect(maxSize:) in Vapor 4, read req.body.data, and verify the Sume HMAC SHA-256 signature with swift-crypto before returning .noContent.

Vert.x Web: verify a Sume webhook after BodyHandler reads the body
Install BodyHandler before your Vert.x route, read the body as bytes, recompute HMAC SHA-256 over timestamp.body, and return 204 to a Sume delivery.

PowerShell Invoke-RestMethod: a Sume video job to replace Sora
Replace a PowerShell script that called the Sora Videos API: submit to Sume /v1/videos with Invoke-RestMethod, poll polling_url, download the mp4.

Caddy in front of a Sume webhook receiver: body limit and timeouts
Does Caddy break Sume webhook signatures? reverse_proxy passes headers and body through; set max_size above 1 MiB and an 8 s upstream timeout.

Clojure: Ring middleware that verifies a Sume webhook from raw bytes
Verify a Sume webhook in Clojure: slurp Ring's one-shot body as bytes, HMAC-SHA256 with javax.crypto, MessageDigest/isEqual, rotation entries, 300 s window.

Erlang: verify a Sume webhook with crypto:mac and crypto:hash_equals
Verify a Sume webhook in Erlang/OTP 26+: crypto:mac over timestamp.raw_body, binary:encode_hex, crypto:hash_equals, rotation entries, and an empty-secret guard.

Port a gemini-nano-banana-2.1 image call to Sume POST /v1/images
Map Google's response_format aspect_ratio and image_size, base64 output and inline inputs to Sume's aspect_ratio, resolution, data[].url and input_references.

Gleam: verify a Sume webhook with gleam_crypto and secure_compare
Verify a Sume webhook in Gleam: crypto.hmac over timestamp.raw_body as a BitArray, lower-cased base16, secure_compare, rotation entries, and a 300 s window.

Grok Imagine Video 1.5 Lite on Vercel AI Gateway vs Sume /v1/videos
Vercel added Grok Imagine Video 1.5 Lite to AI Gateway on Oct 8. What generateVideo gives you, and the equivalent text-to-video call on Sume's /v1/videos.

Julia: verify a Sume webhook with SHA.jl and a hand-rolled compare
Verify a Sume webhook in Julia: SHA.hmac_sha256 over timestamp.raw_body, a hand-rolled constant-time compare, rotation entries, and a five-minute replay window.

Nushell: submit a Sume job and poll it to a result, no jq needed
A Nushell script that POSTs a Sume image job with an Idempotency-Key, polls /v1/jobs/{id}/status by next_poll_after_seconds, then fetches the result.

Eleven rows on Sume return MP3 only: use Sonic when you need WAV
Sume's eleven-* TTS Router ids return MP3 only, and three of the five accept just one format. WAV, avatar voices and word timings belong to the sonic ids.

Inngest Bursty Concurrency 3x: will Sume answer queue_full?
Inngest can lift step concurrency 3x for 60 minutes a month. Sume's limit does not move: size bursts to accepted capacity and retry queue_full with one key.

One-job limits in Sume's TTS Router: v3 5,000, v4 10,000, Sonic 20,000
Each TTS Router id has its own max_characters. A Python planner splits a script on paragraph breaks so each request fits the row you picked.

Sonic 3.6 vs Eleven v4 Turbo: one script, one Python A/B run on Sume
Send the same text to sonic-3.6 and eleven-v4-turbo through the TTS Router with one Python script, poll both jobs, and compare the files by ear.

Sume job failed worker_job_stalled or worker_lease_expired: what now
A Sume job stuck in processing can end as worker_job_stalled or worker_lease_expired. Both are terminal job.failed events with the hold refunded. Resubmit.

Sume queue_admission_unavailable and usage_reservation_unavailable
Two Sume submit failures that are not 402 or 429: admission or the usage hold could not be evaluated. The row is failed and refunded; retry with the same key.

CircleCI no_output_timeout: poll a Sume video job without a kill
CircleCI kills a run step after 10 silent minutes. Print a status line on every poll, raise no_output_timeout, and keep one Sume Idempotency-Key per workflow.

Empty job_id next to job_ids: how Sume MCP treats placeholders
Some agent clients fill every optional tool field with empty strings, zeros and empty arrays. What Sume's MCP drops, what it keeps, and what still errors.

On a 402, try a cheaper rung: a Python ladder with fresh keys
A 402 on Sume means nothing was reserved, so a cheaper request can go straight through. Python ladder: Seedance 720p, 480p, then Wan 480p, one key per rung.

Sume failed job says [redacted_url]: what was removed
A [redacted_url] in a Sume job error is by design: URLs, provider ids, env names and secrets are masked, and the provider reason is capped at 300 characters.

Is there a lipsync-1.0 endpoint on Sume? Old paths 404; use Fabric
Sume's old /v1/lipsync-1.0 paths return 404 and its model ids return model_not_found. Send the same still and audio to veed/fabric-1.0 or H3 Max lip-sync.

Make a vertical Short clip with curl and jq: submit, poll, download
A 20-line shell script that asks Sume for an 8-second 9:16 clip at 1080p, polls the job, and saves short.mp4, matched to YouTube's Shorts page.

Node script for a 9:16 TikTok video: check the model, then submit
A Node 20 fetch script that confirms a Sume model lists 9:16 and your duration, submits one 12-second 720p job, and saves an MP4 that fits TikTok's API limits.

Revoked a Sume API key and it still works? Up to 15 seconds
After you revoke a Sume API key, the API can keep accepting it for up to 15 seconds by default, because the key lookup is cached. What that means for a leak.

Sume public_reason: generation_rejected vs temporary error
How Sume picks generation_rejected, temporary_generation_error or generation_failed on a failed job from the provider HTTP status and the retryable flag.

Sume "Generation could not start": rejected request or outage
Generation could not start is the fallback when a provider rejects a submit. A 4xx gives generation_rejected_request; anything else gives submit_failed.

Sume job error details.input_field: the parameter that failed
When a provider rejects one request field, Sume publishes its name as details.input_field beside provider_error_message. Map it back to your body and fix it.

Sume job failed artifact_too_large: shrink the output
A finished file that storage refuses with HTTP 413 fails as artifact_too_large and is not retryable. Shorten the cut, lower the resolution or the bitrate.

Sume content_policy_rejected: image, music and video messages
Sume scans a provider's rejection text for six phrases and answers with one of three fixed content-policy messages and next_action fix_input.

Sume job failed: generation_output_unavailable, retry or not
generation_output_unavailable means Sume could not copy a finished output into its storage. Retryable true gives retry_later; false gives contact_support.

Sume job failed: image_content_rejected, what to change
image_content_rejected marks a non-retryable failure at an image-input stage such as first_frame. Sume sets next_action to fix_input: swap the picture.

Sume command line tool on Linux arm64: Graviton, Docker on a Mac
The Sume command line tool ships Linux arm64 and x64 binaries plus macOS arm64 and x64. Windows is x64 only. Pick the right asset for Graviton or Docker.

The agent field in Sume MCP results: next_step and poll_after
Sume's hosted MCP adds an agent object to tool results with next_step, poll_after_seconds, adjustments and recovery. What each field means and when it is null.

Upgraded your Sume plan but ratelimit-limit is still the old number?
A plan change can take up to 60 seconds to reach the per-key rate limit, because the tier is cached. Why ratelimit-limit lags, and what changes at once.

Generate a Go client from the Sume OpenAPI with oapi-codegen
The full Sume spec trips oapi-codegen on a [number, null] type, but filtering to the operations you use works. Config, generated names and a short caller.

What to log from a Sume API error: request_id, code, no secrets
Log the status, error.code, error.request_id, retry-after and the path without its query. Keep keys, signed URLs and media URLs out. A 25-line Python logger.

Retry or not: a decision table for failed Sume submit calls
Which Sume errors deserve a retry with the same Idempotency-Key, which mean poll the job, and which mean fix the request. One table and a 15-line classifier.

Clear a full Sume queue: cancel queued jobs after 429 queue_full
When submits fail with 429 queue_full, list queued jobs with GET /v1/jobs?status=queued and cancel the ones you no longer need. Safe on a 409, with a script.