Signed webhooks and an events feed for every email
Every attempt is on record with its answer and timing, so a missed event is never a mystery.
Every attempt is on record with its answer and timing, so a missed event is never a mystery.
Webhooks
https://fernbank.example/api/minket
Delivery of email.bounced
| Attempt | At | Result | Took |
|---|---|---|---|
| 1 | 10:39:05 | 502 Bad Gateway | 1.2 s |
| 2 | +5 s | 502 Bad Gateway | 0.9 s |
| 3 | +5 min | 200 OK | 0.3 s |
Signing secret
whsec_<shown once>
Any svix library verifies a delivery with the endpoint's whsec_ secret.
import { Webhook } from "svix";
const event = new Webhook(process.env.MINKET_WEBHOOK_SECRET)
.verify(await request.text(), {
"svix-id": request.headers.get("svix-id"),
"svix-timestamp": request.headers.get("svix-timestamp"),
"svix-signature": request.headers.get("svix-signature"),
});Each retry carries the same svix-id, so your endpoint can skip a repeat.
When each attempt goes, from the first failure. The axis is compressed before 5 hours.
Replay sends what it missed, oldest first, up to 100 deliveries a call.
For 24 hours after a rotation, both secrets sign every delivery.
svix-signature: v1,K1lQb2w3YnE1Y0F0 v1,Hk9vUm4yT1pxR0dE
GET /v1/events lists them newest first, by type, email, contact and time, for 13 months.
22 event types
email.sentemail.scheduledemail.deliveredemail.delivery_delayedemail.complainedemail.bouncedemail.openedemail.clickedemail.receivedemail.failedemail.suppressedemail.canceledcontact.createdcontact.updatedcontact.deleteddomain.createddomain.updateddomain.deletedbroadcast.startedbroadcast.completedautomation.completedautomation.failedTest keys' events reach test endpoints only.
Up to 20 endpoints in each, with their own secrets.
Payloads, signatures, retries and replay.
Any 2xx answer within 15 seconds.
Yes: each endpoint subscribes to the event types it wants.