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.

4 min readSume
All posts

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?

Behavior from Sume's Run webhooks page, read 2026-10-04.
CaseWebhook?What to do
outcome: okyesship payload.output
outcome: degradedyesreview payload.artifacts and output_error
outcome: erroryesread payload.error, then retry or alert
Canceled runnopoll status_url until payload.status is canceled
Skipped runnoread 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

All Agents posts

Written by Sume