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.

5 min readSume
All posts

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.

Sume job webhook events (read 2026-10-05)
EventWhen it is sentPublish queue action
job.completedThe job completed and a public result is availableFetch the result, then enqueue the posts
job.failedThe job failed with a public errorAlert; fix the input before any retry
job.canceledThe job reached the canceled stateDrop 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

All Developers posts

Written by Sume