One Make webhook for Sume job.completed and format.run.terminal events
Sume sends job.completed for model jobs and format.run.terminal for Format runs, with one signature scheme. Branch on event, then on outcome, and dedupe by id.

One Make custom webhook URL can receive both kinds of Sume callbacks, because they differ in the event field. Model jobs send job.completed, job.failed or job.canceled. Action, Format and Agent Completion runs send action.run.terminal, format.run.terminal or agent.run.terminal. Branch on event first, then read the outcome field that belongs to that family.
The two payload shapes
Sume documents two webhook surfaces with different event sets and different payloads. The signature scheme is the same (HMAC-SHA256 over <timestamp>.<raw_body>, header x-sume-webhook-signature: sume-v1=<hex>), so one verifier covers both.
| Started with | Event | Dedupe on | Read the outcome in |
|---|---|---|---|
| A model endpoint such as a music, image or video generate call | job.completed, job.failed, job.canceled | job_id | status (OK or ERROR) and the artifacts in payload |
| A Format run | format.run.terminal | request_id (equals run_id) | outcome: ok, degraded or error |
| An Action run | action.run.terminal | request_id | outcome |
| An Agent Completion | agent.run.terminal | request_id | outcome |
Branch order that avoids mistakes
Do the checks in this order in Make, or in any tool that can route:
- Verify the signature against the raw body. If your tool cannot see the raw body, put a small verifier in front of it first.
- Route on
event. Anything that is not on your list gets a 2xx and no action, so Sume does not retry events you chose to ignore. - For runs, route on
outcome, not onstatus.degradedmeans the run completed and billed, with real media inartifacts[], but no usable structuredoutput. - For jobs, take the audio, image or video URL from
payload.artifacts[]wheretypematches what you asked for.
Two traps
A run that you cancel sends no webhook, and neither does a run that was skipped by on_active_run: "skip". Poll status_url after a cancel instead of waiting. And a run delivers one terminal event per turn, never one per artifact: if you need progress inside a turn, use the job layer.
Receipts above 1 MiB arrive with payload: null and an error.code of payload_too_large; fetch the receipt from result_url. A job webhook for a music track is tiny by comparison, because it carries only artifact URLs, never audio bytes.
Make's side
Make documents a default reply of 200 with the body Accepted, a rate limit of 300 requests per 10 seconds and a queue per webhook (read 2026-10-05). Those facts matter because Sume stops retrying after the first 2xx. Keep your branch logic idempotent and key it on job_id or request_id.
Do not use this pattern when the two families need different secrets or different retention. The signing secret is per workspace and shared by both surfaces, so a split by URL gives you routing, not isolation.
Sources
Related posts
More in Integrations
- Make takes 300 webhook requests per 10 seconds: fan in a Sume bulk run
Make returns 429 above 300 webhook requests per 10 seconds. A Sume bulk run holds up to 100 runs and has no queue webhook, so each child webhook_url fans in.
- Make's Accepted 200: why Sume won't retry a failed scenario
Make answers 200 Accepted as soon as the webhook is queued, so Sume sees success even if the scenario later fails. Reconcile by job id and use Redeliver.
- Mattermost incoming webhook for Sume jobs: markdown, 16,383 chars
Post a Sume job result to Mattermost with an incoming webhook: text is markdown, attachments sit at top level, and posts up to 16,383 characters are supported.
- MCP agent: trim, then captions? video-captions create is not listed
On Sume's hosted MCP, video_trim is a listed tool but captions are not creatable from tools_list. Use the REST endpoint for the burn step in an agent chain.
Written by Sume