Sume job webhooks are terminal-only: drive a queue from three events
Sume sends job.completed, job.failed and job.canceled only, with no progress events. Publish on completed, alert on failed, and poll events for progress.

Sume job webhooks carry terminal events only: job.completed, job.failed and job.canceled. There are no progress or partial deliveries, so a publish queue should start work on completed, alert on failed, and clear its row on canceled. If you need progress while a job runs, read GET /v1/jobs/{id}/events; it is a pull snapshot, not a stream.
A webhook is a delivery optimization, not your only recovery path, so keep status_url polls for the events that never arrive.
What does each event mean?
From Sume's webhook docs.
| Event | When it is sent | Publish queue action |
|---|---|---|
job.completed | The job completed and a public result is available | Fetch the result, then enqueue the posts |
job.failed | The job failed with a public error | Alert; fix the input before any retry |
job.canceled | The job reached the canceled state | Drop the pending posts |
How do I route them?
Branch on event and return 204 for any other value. The sample maps events to queue actions.
ACTIONS = {
"job.completed": "enqueue_posts",
"job.failed": "alert",
"job.canceled": "drop",
}
def route(event: dict) -> str:
return ACTIONS.get(event.get("event", ""), "ignore")
if __name__ == "__main__":
for name in ["job.completed", "job.failed", "job.canceled", "webhook.test"]:
print(name, route({"event": name}))Where do run webhooks differ?
Action, Format and Agent Completion runs use *.run.terminal events with a different payload, but the same signature scheme, so one verifier covers both (Run webhooks).
Sources
Related posts
More in Developers
- Sume MCP assets_create vs upload: registered URLs are unverified
On Sume MCP, assets_create registers unverified metadata for a remote URL. For bytes you own, use assets_upload_url, a client PUT, then assets_complete.
- Sume MCP conflicting_model: top-level model vs payload.model
avatar-image-to-video_create lifts payload.model to the top level. If the two differ you get conflicting_model plus supported_models. Send one, or match them.
- Sume MCP dry run: next_step is only dry_run false, merge your payload
A paid Sume MCP dry run returns would_submit false and next_step arguments of just dry_run false. Re-send your original idempotency_key and payload with it.
- Sume MCP generation_admission_rejected: read the preview first
generation_admission_rejected means the admission preview would not accept the request. Read the preview, then change the request or wait before retrying.
Written by Sume