How long can an AI video Format run take? 90-minute limit
A Sume Format run expires 90 minutes after creation, sooner if silent. How to poll with backoff, when to use a webhook, and what expired means.

A Sume Format run has a hard lifetime: its expires_at is 90 minutes after created_at, and earlier if the run goes silent. If you are making a long video through a Format, that is the budget for the whole run, so plan the piece to fit it or split the work across several runs.
Poll or take the webhook
The docs give two ways to learn the end state. Polling GET on the run works with backoff, up to 60 seconds between calls. A webhook, set through communication.webhook_url, delivers a format.run.terminal event when the run ends.
| Method | Detail | Watch for |
|---|---|---|
| Polling | Back off, cap at 60 s | Stop at expires_at |
| Webhook | format.run.terminal, HMAC-SHA256, 5-minute window, up to 10 retries | Verify the signature first |
| Replay | Same Idempotency-Key and body returns 200 with idempotency_hit: true | A 202 means a fresh run |
A polling loop that stops
This loop backs off, stops on any terminal status and gives up after the 90 minutes. It needs SUME_API_KEY and a run id.
import json, os, sys, time, urllib.request
TERMINAL = {"completed", "failed", "canceled", "skipped"}
def get(run_id):
req = urllib.request.Request(
f"https://api.sume.com/v1/format-runs/{run_id}",
headers={"Authorization": "Bearer " + os.environ["SUME_API_KEY"]})
with urllib.request.urlopen(req) as r:
return json.load(r)["data"]
def wait(run_id, limit=90 * 60):
start, delay = time.time(), 2
while time.time() - start < limit:
d = get(run_id)
if d["status"] in TERMINAL:
return d
time.sleep(delay)
delay = min(delay * 2, 60)
raise TimeoutError("run did not end inside 90 minutes")
if __name__ == "__main__":
print(wait(sys.argv[1])["status"])What to do when time runs short
A single Format call is a poor fit for a very long edit. Split it: one run per scene or chapter, each with its own spend cap, and join the results yourself on Timeline 1.0, whose audio track can run up to 1800 seconds. That way one slow scene does not take the whole piece down with it.
Also read the end state carefully. completed is not the same as success, because the receipt can carry outcome of degraded or an output_error. Check both before you pass the file on.
Log what you saw
Record the run id, the creation time and the final status for each run you start. When a run does expire, that log tells you how long it really ran and whether a different brief would have fit.
Why 90 minutes is usually plenty
Most single-clip Format runs end well inside the limit, and the limit exists so that a stuck run does not sit in your history forever. Treat a run that nears it as a signal to simplify the brief, not to wait longer. Use a spend cap on every long run, so that a run which is spending but not finishing is stopped by money before it is stopped by the clock.
Sources
Related posts
More in Developers
- How many 30-second videos can a Sume Pro key run at once? Wave math
Pro runs 4 generations at once and queues 20 more, so 24 accepted jobs. Use the plan table and a Python function to plan a 50-clip batch in waves.
- How many images can I get per AI image request? Read n, don't guess
Sume's docs allow n up to 10 per call but say per-model ceilings are lower. Here is how to read each model's real n range from the catalog in one request.
- How Sume TTS splits a script into sentence ids (. ! ? only)
Sume's script source cuts sentences at periods, exclamation and question marks only, keeps every character, and numbers them sent_000000. Examples and traps.
- Huey task that polls an AI video job with schedule(delay=...)
A Huey task reads Sume's job status once and reschedules itself with task.schedule(delay=...) from next_poll_after_seconds, so no worker thread sleeps.
Written by Sume