Agent run webhook: degraded outcome, and canceled runs send nothing
A Sume agent.run webhook has outcome ok, degraded or error, and canceled or skipped runs deliver nothing. Which branch your handler needs to cover.

A Sume Agent Completions webhook carries two verdicts: status, which is OK or ERROR, and outcome, which is ok, degraded or error. Branch on outcome when the question is whether you got usable output. Two cases send no webhook at all: a canceled run and a skipped run. Sume's run webhooks page, read on 2026-10-04, documents all of this, and a handler that covers three outcomes and two silences does not hang.
What does degraded mean?
A run can complete, bill you and produce real media in artifacts[], yet fail to project it into your output_schema. Then status is OK, output is null and output_error gives the reason. outcome is degraded in that case. The usual cause is a schema that asks for a field the run never produces. A handler that reads only status works but cannot tell ok from degraded.
How should each case be handled?
| Case | Webhook? | What to do |
|---|---|---|
outcome: ok | yes | ship payload.output |
outcome: degraded | yes | review payload.artifacts and output_error |
outcome: error | yes | read payload.error, then retry or alert |
| Canceled run | no | poll status_url until payload.status is canceled |
| Skipped run | no | read status on the create response |
Why does a canceled run stay silent?
Cancel is a separate API path: you POST to the run's cancel_url, accept that response, and then poll status_url. Do not wait for a delivery. A skipped run is created in a terminal state without starting work, so the create response already told you. Sume applies this to Action, Format and Agent runs alike, with agent.run.terminal as the Agent Completions event.
Set a deadline of your own. If a run has produced neither a webhook nor a terminal status when your budget ends, cancel it and poll to confirm. The create call needs generation_spend_cap_usd, so the worst case is already bounded; see Agent Completions.
How do I avoid double handling?
Dedupe on the envelope request_id, which equals the run id and is stable across retries. The nested payload.request_id differs between a webhook and a poll, so ignore it. Use created_at to order deliveries, and note that continuing a run starts a new one with its own single terminal event. The original run's webhook does not fire again. One run is one agent turn, however many clips it made.
Read the full contract on Run webhooks.
Sources
Related posts
More in Agents
- AI video agent vs a single-model video generator: what you call
A single-model generator returns one clip from a prompt. An agent plans shots, calls tools and assembles a video. How the Sume calls differ.
- @-mention an agent on a video asset: Runway vs Sume
Runway Enterprise lets you @-mention its Agent in asset comments. Sume Agents take work via the Agent Completions API; media jobs report by webhook.
- Re-render Sora prompts from an agent: jobs_wait takes 20 ids
An agent re-rendering saved Sora prompts should wait on up to 20 Sume job ids per call, read results in one batch, and not resubmit after a wait slice expires.
- Cap a voiceover batch at $1: tts_create dry_run and max_spend_usd
Preview what a Sume TTS call will cost before it runs, and cap the spend. How dry_run and max_spend_usd work on tts_create, with a 20-line cost example.
Written by Sume