# 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.

Canonical: https://minket.com/webhooks. Updated: 2026-10-28.

*A webhook endpoint in the console.* One delivery of email.bounced: two attempts answered 502, the third 200, each with its timing; below it, the endpoint's signing secret.

## Signed with svix headers over the exact body

Any svix library verifies a delivery with the endpoint's `whsec_` secret.

**In your endpoint**

```ts
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"),
  });
```

## 12 attempts in 3 days

Each retry carries the same `svix-id`, so your endpoint can skip a repeat.

When each attempt goes, from the first failure. now, +5 s, +5 min, +30 min, +2 h, +5 h, +10 h, +10 h, +10 h, +10 h, +10 h, +10 h, then the attempts stop.

## Replay catches up a disabled endpoint

Replay sends what it missed, oldest first, up to 100 deliveries a call.

**One endpoint's week**

- Failing, Mon: every attempt answered 503
- Disabled, Thu: after 3 days of failures
- Replayed, Thu: what it missed

## Rotate a secret without dropping a delivery

For 24 hours after a rotation, both secrets sign every delivery.

**One delivery during a rotation**

```http
svix-signature: v1,K1lQb2w3YnE1Y0F0 v1,Hk9vUm4yT1pxR0dE
```

## The same events, to pull

`GET /v1/events` lists them newest first, by type, email, contact and time, for 13 months.

**22 event types**

- email: `email.sent`, `email.scheduled`, `email.delivered`, `email.delivery_delayed`, `email.complained`, `email.bounced`, `email.opened`, `email.clicked`, `email.received`, `email.failed`, `email.suppressed`, `email.canceled`
- contact: `contact.created`, `contact.updated`, `contact.deleted`
- domain: `domain.created`, `domain.updated`, `domain.deleted`
- broadcast: `broadcast.started`, `broadcast.completed`
- automation: `automation.completed`, `automation.failed`

## Test events and environments

- **Test events**: Test keys' events reach test endpoints only.
- **Environments**: Up to 20 endpoints in each, with their own secrets.
- **[Guide](https://docs.minket.com/webhooks/)**: Payloads, signatures, retries and replay.

## Questions

### What counts as delivered?

Any `2xx` answer within 15 seconds.

### Can an endpoint pick its events?

Yes: each endpoint subscribes to the event types it wants.

More: Read the webhooks guide, https://docs.minket.com/webhooks/
