Send downpipes alerts to your own webhook
A webhook channel posts each event to any HTTPS endpoint you run, in a documented JSON shape you map yourself. This is the channel to point at your own automation or at a tool without a dedicated channel here.
What you need
- An HTTPS endpoint you control that can accept a JSON POST.
- Access to the downpipes console with permission to configure notifications (Operator, Approver or Owner) to add and test the channel.
Set it up
- Stand up, or choose, the HTTPS endpoint that will receive the events. It must be https and must not be a workers.dev host.
- In the downpipes console, open Notifications, choose Add a channel and pick Webhook (generic HTTPS POST). Adding a channel needs permission to configure notifications, so an Operator, Approver or Owner can add one.
- Paste the endpoint URL into the HTTPS URL field. It must be https and carry no embedded credentials. Name the channel and save it, then a rule routes events to it.
- Choose Test on the channel row to confirm delivery without sending real alert content, then check your endpoint received the POST.
What lands at your endpoint
Each event arrives as a downpipe-event-v1 JSON body:
{"kind":"downpipe-event-v1","at":"2026-07-05T04:14:08.123Z","event":"backup-failure","severity":"critical","downpipe":{"id":"dp_9f2","name":"prod-kv"},"detail":"prod-kv last run failed","dedupKey":"downpipe:dp_9f2:backup-failure"}
The downpipe object is omitted for an account-level event. Every body carries dedupKey, and a recovery also carries recovered: true. Map these fields to whatever your endpoint or downstream tool expects.
The downpipe-event-v1 body can get more optional fields in a later engine release. Make your endpoint ignore keys that it does not know. An endpoint that rejects unknown keys can reject every body after such a release, critical alerts included. If that endpoint also answers with a 2xx status, downpipes records the delivery as a success. Change such an endpoint before you upgrade the engine.
Good to know
- The outbound call is screened like every channel. downpipes re-screens the destination host at send time with the same egress guard the other channels use, and refuses an internal, private or link-local target by default. The console offers no control that waives that, so a private address cannot be set as a webhook channel from the console: put a public HTTPS front in place of it, or use the per-channel internal-sink override described in webhook egress security. The body carries only operational facts (the event, severity, downpipe id and name, a one-line detail, the time, and a correlation key built from the downpipe id and the event, and a recovered marker), never a secret or the data being backed up.
- An operator egress allowlist applies too. When your account sets one, the endpoint host must also match an entry on the list.
- A wildcard entry covers subdomains. An entry such as
*.example.commatches subdomains at any depth and never the bareexample.com(screenEgressAllowlist,engine/src/notify/types.ts). - Your endpoint does the dedup and the auto-resolve. The body gives it two fields for this.
dedupKeyisdownpipe:<id>:<event>, oraccount:<event>for an account-level event. It is the same key the PagerDuty, Jira Service Management / Opsgenie and ServiceNow channels use, and a trigger and the recovery that clears it carry the same value.recoveredis present, andtrue, only on the recovery of abackup-failure,backup-stale,replication-degradedorrun-at-risk-evictionalert. A recovery also carries the sameeventandseverityas the alert it clears, with a newdetailline andattime. An account-level event has one key for each event name. So repeated alerts of one account-level event, for example tworecovery-code-usedevents, group onto one open alert, and no recovery closes it. The canary is different: its recovery arrives as thecanary-recoveredevent. That event has norecoveredfield, and its key isaccount:canary-recovered, so a mapping keyed onrecovereddoes not close acanary-deadalert.
Last updated .