Guides
Configuring Destinations
Attach a public HTTPS endpoint and verify DeadHook outbound signatures.
On this page
A Destination is a public HTTPS endpoint attached to a Source. DeadHook signs every attempt with a Destination-specific signing secret.
Requirements
https://only;- public hostname and address; private, local, metadata, reserved, and custom-port targets are rejected;
- no URL credentials;
- timeout between 1,000 and 30,000 ms (default 10,000);
- redirects are not followed;
- the hostname must resolve to a public address when the request is made.
A Destination that does not meet these requirements becomes a terminal policy failure rather than an endless retry loop.
Add a Destination
In the dashboard, open a Source and choose Add Destination:
URL: https://example.com/webhooks/deadhook
Timeout: 10000 ms
Capture response body: off
The Destination signing secret is returned once. Store it on your receiving service and never in frontend code:
export DEADHOOK_DESTINATION_SECRET='whsec_REPLACE_WITH_DESTINATION_SECRET'
Verify outbound signatures
Every attempt includes fresh headers:
content-type: application/json
webhook-id: msg_<delivery-reference>
webhook-timestamp: <unix-seconds>
webhook-signature: v1,<base64-hmac>
x-relay-event-id: <event-uuid>
x-relay-source-id: <source-uuid>
x-relay-attempt: <attempt-number>
The signed content is:
{webhook-id}.{webhook-timestamp}.{raw-body}
Use the base64-decoded Destination secret (whsec_ prefix removed) as the HMAC-SHA256 key. Compare
in constant time, reject old timestamps, and deduplicate by webhook-id before applying side effects.
webhook-id is stable across retries of one Delivery (msg_<delivery-reference>), so a consumer can use it
as an idempotency key. A replay is a new dispatch cycle but keeps the same Delivery identity; combine
webhook-id with your own business key if you need replay to be distinguishable.
Response inspection
Turn on Capture response body only when you need to debug a Destination. Capture is opt-in, bounded, and retained for a limited period. It stores a snippet of the response, not the full body. See HTTP response inspection.
Update, disable, archive
- Update changes the URL, timeout, response-capture setting, or enabled state.
- Disable removes the Destination from new fan-out; existing Deliveries keep their state.
- Archive removes it from the active list and frees its plan slot. Existing accepted Deliveries continue; replay is blocked while archived. See Archive and restore.
Multiple Destinations
Where your workspace and plan support multiple active Destinations, you can add more than one to a Source. Each receives its own independent Delivery. If the option is unavailable, that workspace is limited to one active Destination.