Canceled and skipped Sume agent runs send no webhook: what to poll

A Sume run webhook fires only when a run completes or fails. Canceled and skipped runs send nothing, so your scheduler must read status_url for them.

5 min readSume
All posts

Waiting for a webhook on a run that was canceled or skipped will wait forever. Sume's run webhook sends one signed POST when a run completes or fails, and nothing for canceled or skipped. After you call cancel, accept the response and poll status_url until the status is canceled. For a skipped run, the create response already told you.

This applies to all three run families (Action, Format and Agent Completion), each with one terminal event: action.run.terminal, format.run.terminal and agent.run.terminal.

Which outcomes notify you

From the Run webhooks and Runs and results pages, read 2026-10-09.

Which run endings send a webhook
Terminal statusWebhook?What your code should do
completedYes, status: OKBranch on outcome: ok, or degraded when output is null but artifacts exist
failedYes, status: ERRORRead payload and error; the receipt still has artifacts
canceledNoPoll status_url after POST ...cancel
skippedNoRead status and skip_reason (previous_run_active) on the create response; next_action is retry_later

Why skipped runs surprise agent schedulers

A schedule's on_active_run defaults to skip. If a nightly run is still going when the next trigger fires, the new run is recorded as skipped immediately, with no work started, so no completion exists to announce. A job runner that only listens for webhooks will see nothing and may assume the trigger never fired.

Choose reject instead if you want the conflict to be an error at the API, or keep skip and have your runner treat a skipped receipt as a normal event. Format runs differ: their default is allow, which runs concurrently.

A small reconciliation rule

Do not make the webhook your only source of truth.

  • Store every run id you create along with its create-time status.
  • On a timer, list runs still not terminal and read their status_url.
  • Mark canceled and skipped as done when you see them; do not retry on a missing webhook.
  • Dedupe webhook deliveries on request_id, which equals the run id and is stable across retries.

Example: a cancel that never reports

A scheduler decides a run is too slow and posts to cancel_url. The response is accepted, but a webhook handler waiting for agent.run.terminal never fires. The correct flow is to poll status_url with a short backoff until payload.status reads canceled, then mark the run closed in your own database. If you also set a deadline, treat a run that is still processing after the cancel as a case for an alert, not for another cancel loop.

The same thinking covers the receipt for an oversized run: the webhook then carries payload: null and an error pointing at result_url, so even completed runs sometimes need a fetch. Design the handler so that fetching the receipt by run id is its normal fallback.

Sources

Related posts

More in Agents

All Agents posts

Written by Sume