# Event types

> The full set of webhook events MailBlastr emits, the JSON payload shape, and a sample request body.

Events span three resource families — **email**, **contact**, and **domain** — each delivered with a dotted `type` such as `email.delivered` or `contact.created`. The tables below list every event you can subscribe to; click an event for its full per-event payload.

### Email events

| Event | Fires when |
| --- | --- |
| [`email.sent`](https://www.mailblastr.com/docs/webhooks/emails/sent) | The send request succeeded and the message was handed off to the sending infrastructure. |
| [`email.delivered`](https://www.mailblastr.com/docs/webhooks/emails/delivered) | The receiving mail server accepted the message for the recipient. |
| [`email.delivery_delayed`](https://www.mailblastr.com/docs/webhooks/emails/delivery-delayed) | Delivery was temporarily delayed (e.g. the recipient's inbox is full or the receiving server had a transient issue) and will be retried. |
| [`email.bounced`](https://www.mailblastr.com/docs/webhooks/emails/bounced) | The recipient's mail server permanently rejected the message. The recipient is added to your suppression list. |
| [`email.complained`](https://www.mailblastr.com/docs/webhooks/emails/complained) | The message was delivered but the recipient marked it as spam. The recipient is added to your suppression list. |
| [`email.opened`](https://www.mailblastr.com/docs/webhooks/emails/opened) | The recipient opened the email (requires open tracking on the domain). |
| [`email.clicked`](https://www.mailblastr.com/docs/webhooks/emails/clicked) | The recipient clicked a tracked link (requires click tracking on the domain). |
| [`email.failed`](https://www.mailblastr.com/docs/webhooks/emails/failed) | The email failed to send due to an error — e.g. an invalid recipient, a domain-verification problem, or a reached daily sending quota. |
| [`email.scheduled`](https://www.mailblastr.com/docs/webhooks/emails/scheduled) | A future-dated send (via `scheduled_at` or a natural-language schedule) was accepted and queued for its send time. |
| [`email.suppressed`](https://www.mailblastr.com/docs/webhooks/emails/suppressed) | A send was skipped because the recipient is on your account suppression list (typically from a prior hard bounce or complaint). |
| [`email.received`](https://www.mailblastr.com/docs/webhooks/emails/received) | An inbound email arrived at one of your verified domains (Inbound). Retrieve it at `GET /emails/receiving/:id`. |

### Contact events

| Event | Fires when |
| --- | --- |
| [`contact.created`](https://www.mailblastr.com/docs/webhooks/contacts/created) | A contact was successfully created in one of your audiences. Not fired for contacts added by a bulk CSV import. |
| [`contact.updated`](https://www.mailblastr.com/docs/webhooks/contacts/updated) | A contact was successfully updated — for example its name changed, or it was subscribed or unsubscribed. |
| [`contact.deleted`](https://www.mailblastr.com/docs/webhooks/contacts/deleted) | A contact was successfully deleted from one of your audiences. |

### Domain events

| Event | Fires when |
| --- | --- |
| [`domain.created`](https://www.mailblastr.com/docs/webhooks/domains/created) | A domain was successfully created in your account (before its DNS records are verified). |
| [`domain.updated`](https://www.mailblastr.com/docs/webhooks/domains/updated) | A domain changed — most commonly as its verification status advances toward `verified`. |
| [`domain.deleted`](https://www.mailblastr.com/docs/webhooks/domains/deleted) | A domain was successfully deleted from your account. |

## Payload envelope

Every event — regardless of family — is delivered in the same envelope. The resource-specific fields live under `data`; its shape depends on the event `type` (see each event page above).

**Envelope fields**

| Name | Type | Required | Description |
| --- | --- | --- | --- |
| `type` | string | No | The event type, e.g. `email.delivered`, `contact.created`, or `domain.updated`. |
| `created_at` | string | No | ISO 8601 time the delivery was dispatched. |
| `data` | object | No | The event-specific payload. For email events this includes `email_id`, `from`, `to`, `subject`, and event-specific detail (e.g. a `bounce`, `click`, or `suppressed` object); for contact/domain events it carries the contact or domain object. |

## Sample payload

```json
{
  "type": "email.delivered",
  "created_at": "2026-06-23T10:15:32.118Z",
  "data": {
    "email_id": "49a3999c-0ce1-4ea6-ab68-afcd6dc2e794",
    "campaign_id": null,
    "from": "Acme <news@yourdomain.com>",
    "to": ["recipient@example.com"],
    "subject": "What's new in June",
    "created_at": "2026-06-23T10:15:31.880Z"
  }
}
```

> **Note:** Each request also carries `X-Mailblastr-Event` (the event type) and `X-Mailblastr-Attempt` (the delivery attempt number, starting at 1) headers, plus the Svix signature headers used to [verify the request](https://www.mailblastr.com/docs/webhooks/verify). Because deliveries can be retried, dedupe on the `svix-id` header.
