# Email events

> The lifecycle of every outgoing and inbound email, from acceptance to delivery, opens, clicks and unsubscribes.



## email.accepted

> Sent when the Emailit API accepts an email for delivery. One event per recipient, with the sender, subject and your metadata.

# email.accepted

Sent when [Send an email](/docs/api-reference/emails/send/) or [Forward an email](/docs/api-reference/emails/forward/) accepts an email for immediate delivery. Emailit sends one event per recipient, because every recipient gets their own email ID. Emails submitted over SMTP and emails created with [Retry an email](/docs/api-reference/emails/retry/) don't send this event.

Webhook requests carry a JSON array of events like this one; see [Webhook requests](/docs/webhooks/webhook-requests/).

```json
{
  "event_id": "evt_2xLc9Rr4Tn6Wb1Qm8Ks3Vf0Hd7a",
  "type": "email.accepted",
  "object": {
    "id": "em_2xLc8Mm3Pq5Vn0Ra7Jt2Wd9Fb4e",
    "object": "email",
    "from": "Acme <hello@acme.com>",
    "to": "ada@example.com",
    "subject": "Your order has shipped",
    "meta": {
      "order_id": "1042"
    },
    "timestamp": "2026-10-01T10:02:11.583000+00:00"
  },
  "data": {
    "object": {
      "id": "em_2xLc8Mm3Pq5Vn0Ra7Jt2Wd9Fb4e",
      "object": "email",
      "from": "Acme <hello@acme.com>",
      "to": "ada@example.com",
      "subject": "Your order has shipped",
      "meta": {
        "order_id": "1042"
      },
      "timestamp": "2026-10-01T10:02:11.583000+00:00"
    }
  }
}
```

## Fields

- `event_id` (string): Event ID (`evt_…`). A retried request carries the same ID, so use it to skip events you already handled. You can also look the event up with [Retrieve an event](/docs/api-reference/events/get/).

- `type` (string): Always `email.accepted`.

- `object` (object): The email the event describes. Its fields are listed below.

- `data.object` (object): The same object again, in the shape that the [Events API](/docs/api-reference/events/get/) returns in `data`.

### Email object

- `id` (string): Email ID (`em_…`).

- `object` (string): Always `email`.

- `from` (string): Sender as given in the request. It can include a display name, for example `Acme <hello@acme.com>`.

- `to` (string): Recipient address. Emailit creates a separate email, with its own ID, for every recipient.

- `subject` (string): Subject line.

- `meta` (object | null): The `meta` object you sent with the email, or `null`.

- `timestamp` (string): When the email was accepted, in ISO 8601 with a UTC offset.

---
Source: https://emailit.com/docs/webhooks/events/email/email-accepted/

## email.scheduled

> Sent when the Emailit API accepts an email with a future send time. One event per recipient, including the scheduled time.

# email.scheduled

Sent when [Send an email](/docs/api-reference/emails/send/) accepts an email with a `scheduled_at` in the future. Emailit sends one event per recipient. When the scheduled time arrives, Emailit sends the email without an `email.accepted` event; the next event is a delivery event such as [`email.delivered`](/docs/webhooks/events/email/delivered/).

Webhook requests carry a JSON array of events like this one; see [Webhook requests](/docs/webhooks/webhook-requests/).

```json
{
  "event_id": "evt_2xLc9Rr4Tn6Wb1Qm8Ks3Vf0Hd7a",
  "type": "email.scheduled",
  "object": {
    "id": "em_2xLc8Mm3Pq5Vn0Ra7Jt2Wd9Fb4e",
    "object": "email",
    "from": "Acme <hello@acme.com>",
    "to": "ada@example.com",
    "subject": "Your October invoice",
    "meta": {
      "invoice_id": "INV-2026-0142"
    },
    "scheduled_at": "2026-10-02T09:00:00.000000+00:00",
    "timestamp": "2026-10-01T10:02:11.583000+00:00"
  },
  "data": {
    "object": {
      "id": "em_2xLc8Mm3Pq5Vn0Ra7Jt2Wd9Fb4e",
      "object": "email",
      "from": "Acme <hello@acme.com>",
      "to": "ada@example.com",
      "subject": "Your October invoice",
      "meta": {
        "invoice_id": "INV-2026-0142"
      },
      "scheduled_at": "2026-10-02T09:00:00.000000+00:00",
      "timestamp": "2026-10-01T10:02:11.583000+00:00"
    }
  }
}
```

## Fields

- `event_id` (string): Event ID (`evt_…`). A retried request carries the same ID, so use it to skip events you already handled. You can also look the event up with [Retrieve an event](/docs/api-reference/events/get/).

- `type` (string): Always `email.scheduled`.

- `object` (object): The email the event describes. Its fields are listed below.

- `data.object` (object): The same object again, in the shape that the [Events API](/docs/api-reference/events/get/) returns in `data`.

### Email object

- `id` (string): Email ID (`em_…`).

- `object` (string): Always `email`.

- `from` (string): Sender as given in the request. It can include a display name, for example `Acme <hello@acme.com>`.

- `to` (string): Recipient address. Emailit creates a separate email, with its own ID, for every recipient.

- `subject` (string): Subject line.

- `meta` (object | null): The `meta` object you sent with the email, or `null`.

- `scheduled_at` (string): When Emailit will send the email.

- `timestamp` (string): When the email was accepted, in ISO 8601 with a UTC offset.

---
Source: https://emailit.com/docs/webhooks/events/email/email-scheduled/

## email.delivered

> Sent when the recipient's mail server accepts an email. Includes the sender, recipient, subject and your metadata.

# email.delivered

Sent when the recipient's mail server accepts the email. Delivered means the receiving server took responsibility for the message; it can still filter it into a spam folder. [Email statuses](/docs/logs/email-statuses/) explains every status.

Webhook requests carry a JSON array of events like this one; see [Webhook requests](/docs/webhooks/webhook-requests/).

```json
{
  "event_id": "evt_2xLc9Rr4Tn6Wb1Qm8Ks3Vf0Hd7a",
  "type": "email.delivered",
  "object": {
    "id": "em_2xLc8Mm3Pq5Vn0Ra7Jt2Wd9Fb4e",
    "object": "email",
    "from": "hello@acme.com",
    "to": "ada@example.com",
    "subject": "Your order has shipped",
    "status": "delivered",
    "meta": {
      "order_id": "1042"
    },
    "updated_at": "2026-10-01T10:02:12.104000+00:00",
    "created_at": "2026-10-01T10:02:11.583000+00:00"
  },
  "data": {
    "object": {
      "id": "em_2xLc8Mm3Pq5Vn0Ra7Jt2Wd9Fb4e",
      "object": "email",
      "from": "hello@acme.com",
      "to": "ada@example.com",
      "subject": "Your order has shipped",
      "status": "delivered",
      "meta": {
        "order_id": "1042"
      },
      "updated_at": "2026-10-01T10:02:12.104000+00:00",
      "created_at": "2026-10-01T10:02:11.583000+00:00"
    }
  }
}
```

## Fields

- `event_id` (string): Event ID (`evt_…`). A retried request carries the same ID, so use it to skip events you already handled. You can also look the event up with [Retrieve an event](/docs/api-reference/events/get/).

- `type` (string): Always `email.delivered`.

- `object` (object): The email the event describes. Its fields are listed below.

- `data.object` (object): The same object again, in the shape that the [Events API](/docs/api-reference/events/get/) returns in `data`.

### Email object

- `id` (string): Email ID (`em_…`).

- `object` (string): Always `email`.

- `from` (string): Sender address, without the display name.

- `to` (string): Recipient address. Emailit creates a separate email for every recipient.

- `subject` (string | null): Subject line.

- `status` (string): Always `delivered`.

- `meta` (object | null): The `meta` object sent with the email, or `null`.

- `updated_at` (string): When the email record was last updated before this event, in ISO 8601 with a UTC offset. It can be earlier than the status change itself.

- `created_at` (string): When Emailit accepted the email.

---
Source: https://emailit.com/docs/webhooks/events/email/email-delivered/

## email.attempted

> Sent each time a delivery attempt fails with a temporary error and Emailit will retry. Includes the SMTP reply of the receiving server.

# email.attempted

Sent each time a delivery attempt fails with a temporary error, such as greylisting or a rate limit at the receiving server, and Emailit will try again. Emailit keeps retrying with increasing delays for about 21 hours; if delivery still fails, the email is bounced and you receive [`email.bounced`](/docs/webhooks/events/email/bounced/).

Webhook requests carry a JSON array of events like this one; see [Webhook requests](/docs/webhooks/webhook-requests/).

```json
{
  "event_id": "evt_2xLc9Rr4Tn6Wb1Qm8Ks3Vf0Hd7a",
  "type": "email.attempted",
  "object": {
    "id": "em_2xLc8Mm3Pq5Vn0Ra7Jt2Wd9Fb4e",
    "object": "email",
    "from": "hello@acme.com",
    "to": "ada@example.com",
    "subject": "Your order has shipped",
    "status": "attempted",
    "meta": {
      "order_id": "1042"
    },
    "updated_at": "2026-10-01T10:02:12.104000+00:00",
    "created_at": "2026-10-01T10:02:11.583000+00:00",
    "smtp_code": 421,
    "smtp_enhanced_code": "4.7.0",
    "smtp_response": "421 4.7.0 Try again later, closing connection."
  },
  "data": {
    "object": {
      "id": "em_2xLc8Mm3Pq5Vn0Ra7Jt2Wd9Fb4e",
      "object": "email",
      "from": "hello@acme.com",
      "to": "ada@example.com",
      "subject": "Your order has shipped",
      "status": "attempted",
      "meta": {
        "order_id": "1042"
      },
      "updated_at": "2026-10-01T10:02:12.104000+00:00",
      "created_at": "2026-10-01T10:02:11.583000+00:00",
      "smtp_code": 421,
      "smtp_enhanced_code": "4.7.0",
      "smtp_response": "421 4.7.0 Try again later, closing connection."
    }
  }
}
```

## Fields

- `event_id` (string): Event ID (`evt_…`). A retried request carries the same ID, so use it to skip events you already handled. You can also look the event up with [Retrieve an event](/docs/api-reference/events/get/).

- `type` (string): Always `email.attempted`.

- `object` (object): The email the event describes. Its fields are listed below.

- `data.object` (object): The same object again, in the shape that the [Events API](/docs/api-reference/events/get/) returns in `data`.

### Email object

- `id` (string): Email ID (`em_…`).

- `object` (string): Always `email`.

- `from` (string): Sender address, without the display name.

- `to` (string): Recipient address. Emailit creates a separate email for every recipient.

- `subject` (string | null): Subject line.

- `status` (string): Always `attempted`.

- `meta` (object | null): The `meta` object sent with the email, or `null`.

- `updated_at` (string): When the email record was last updated before this event, in ISO 8601 with a UTC offset. It can be earlier than the status change itself.

- `created_at` (string): When Emailit accepted the email.

- `smtp_code` (integer | null): SMTP reply code from the receiving server, for example `421`. `null` when Emailit postponed the attempt itself, for example during a delivery back-off for that server.

- `smtp_enhanced_code` (string | null): Enhanced status code from the reply, for example `4.7.0`. See [Enhanced status codes](/docs/dictionary/enhanced-status-codes/).

- `smtp_response` (string | null): Full reply from the receiving server.

---
Source: https://emailit.com/docs/webhooks/events/email/email-attempted/

## email.bounced

> Sent when an email permanently fails: a hard bounce, a bounce notification that arrives later, or retries that ran out.

# email.bounced

Sent when an email can't be delivered: the receiving server rejected it with a permanent error, a bounce notification arrived after delivery, every retry failed, or Emailit couldn't send it at all, for example because its sending domain was deleted. Depending on your auto-suppression settings, Emailit also suppresses the address. See [Bounces and complaints](/docs/deliverability/bounces-and-complaints/).

Webhook requests carry a JSON array of events like this one; see [Webhook requests](/docs/webhooks/webhook-requests/).

```json
{
  "event_id": "evt_2xLc9Rr4Tn6Wb1Qm8Ks3Vf0Hd7a",
  "type": "email.bounced",
  "object": {
    "id": "em_2xLc8Mm3Pq5Vn0Ra7Jt2Wd9Fb4e",
    "object": "email",
    "from": "hello@acme.com",
    "to": "ada@example.com",
    "subject": "Your order has shipped",
    "status": "bounced",
    "meta": {
      "order_id": "1042"
    },
    "updated_at": "2026-10-01T10:02:12.104000+00:00",
    "created_at": "2026-10-01T10:02:11.583000+00:00"
  },
  "data": {
    "object": {
      "id": "em_2xLc8Mm3Pq5Vn0Ra7Jt2Wd9Fb4e",
      "object": "email",
      "from": "hello@acme.com",
      "to": "ada@example.com",
      "subject": "Your order has shipped",
      "status": "bounced",
      "meta": {
        "order_id": "1042"
      },
      "updated_at": "2026-10-01T10:02:12.104000+00:00",
      "created_at": "2026-10-01T10:02:11.583000+00:00"
    }
  }
}
```

## Fields

- `event_id` (string): Event ID (`evt_…`). A retried request carries the same ID, so use it to skip events you already handled. You can also look the event up with [Retrieve an event](/docs/api-reference/events/get/).

- `type` (string): Always `email.bounced`.

- `object` (object): The email the event describes. Its fields are listed below.

- `data.object` (object): The same object again, in the shape that the [Events API](/docs/api-reference/events/get/) returns in `data`.

### Email object

- `id` (string): Email ID (`em_…`).

- `object` (string): Always `email`.

- `from` (string): Sender address, without the display name.

- `to` (string): Recipient address. Emailit creates a separate email for every recipient.

- `subject` (string | null): Subject line.

- `status` (string): Always `bounced`.

- `meta` (object | null): The `meta` object sent with the email, or `null`.

- `updated_at` (string): When the email record was last updated before this event, in ISO 8601 with a UTC offset. It can be earlier than the status change itself.

- `created_at` (string): When Emailit accepted the email.

---
Source: https://emailit.com/docs/webhooks/events/email/email-bounced/

## email.failed

> Sent when Emailit fails to process a bounce notification addressed to your workspace. Rare; delivery failures send email.bounced.

# email.failed

Sent when Emailit can't process a bounce notification that arrived at your workspace's return-path address, for example because of an internal error. The object describes the bounce message, not the email you sent. This event is rare: failed deliveries send [`email.bounced`](/docs/webhooks/events/email/bounced/) or [`email.attempted`](/docs/webhooks/events/email/attempted/).

Webhook requests carry a JSON array of events like this one; see [Webhook requests](/docs/webhooks/webhook-requests/).

```json
{
  "event_id": "evt_2xLc9Rr4Tn6Wb1Qm8Ks3Vf0Hd7a",
  "type": "email.failed",
  "object": {
    "id": "em_2xLc8Mm3Pq5Vn0Ra7Jt2Wd9Fb4e",
    "object": "email",
    "from": "mailer-daemon@mx1.example.com",
    "to": "2xKw0aNf5Zs8Yt1Lq4Ve7Mc3Pb6@emailit.acme.com",
    "subject": "Undelivered Mail Returned to Sender",
    "status": "failed",
    "meta": null,
    "updated_at": "2026-10-01T10:02:12.104000+00:00",
    "created_at": "2026-10-01T10:02:11.583000+00:00"
  },
  "data": {
    "object": {
      "id": "em_2xLc8Mm3Pq5Vn0Ra7Jt2Wd9Fb4e",
      "object": "email",
      "from": "mailer-daemon@mx1.example.com",
      "to": "2xKw0aNf5Zs8Yt1Lq4Ve7Mc3Pb6@emailit.acme.com",
      "subject": "Undelivered Mail Returned to Sender",
      "status": "failed",
      "meta": null,
      "updated_at": "2026-10-01T10:02:12.104000+00:00",
      "created_at": "2026-10-01T10:02:11.583000+00:00"
    }
  }
}
```

## Fields

- `event_id` (string): Event ID (`evt_…`). A retried request carries the same ID, so use it to skip events you already handled. You can also look the event up with [Retrieve an event](/docs/api-reference/events/get/).

- `type` (string): Always `email.failed`.

- `object` (object): The bounce message the event describes. Its fields are listed below.

- `data.object` (object): The same object again, in the shape that the [Events API](/docs/api-reference/events/get/) returns in `data`.

### Email object

- `id` (string): Email ID (`em_…`) of the bounce message.

- `object` (string): Always `email`.

- `from` (string): Sender of the bounce message, usually the receiving server's mailer daemon.

- `to` (string): Your workspace's return-path address on the `emailit.` subdomain of your sending domain.

- `subject` (string | null): Subject of the bounce message.

- `status` (string): Always `failed`.

- `meta` (object | null): Always `null` for bounce messages.

- `updated_at` (string): When the bounce message was last updated before this event, in ISO 8601 with a UTC offset.

- `created_at` (string): When Emailit received the bounce message.

---
Source: https://emailit.com/docs/webhooks/events/email/email-failed/

## email.rejected

> Sent when Emailit refuses to send an email because the workspace isn't approved for production and the recipient isn't a member.

# email.rejected

Sent when Emailit refuses to send an email because your workspace doesn't have [production access](/docs/workspaces/production-access/) yet and the recipient isn't a member of the workspace. Until the workspace is approved, you can only send to the account addresses of workspace members.

Webhook requests carry a JSON array of events like this one; see [Webhook requests](/docs/webhooks/webhook-requests/).

```json
{
  "event_id": "evt_2xLc9Rr4Tn6Wb1Qm8Ks3Vf0Hd7a",
  "type": "email.rejected",
  "object": {
    "id": "em_2xLc8Mm3Pq5Vn0Ra7Jt2Wd9Fb4e",
    "object": "email",
    "from": "hello@acme.com",
    "to": "ada@example.com",
    "subject": "Your order has shipped",
    "status": "rejected",
    "meta": {
      "order_id": "1042"
    },
    "updated_at": "2026-10-01T10:02:12.104000+00:00",
    "created_at": "2026-10-01T10:02:11.583000+00:00"
  },
  "data": {
    "object": {
      "id": "em_2xLc8Mm3Pq5Vn0Ra7Jt2Wd9Fb4e",
      "object": "email",
      "from": "hello@acme.com",
      "to": "ada@example.com",
      "subject": "Your order has shipped",
      "status": "rejected",
      "meta": {
        "order_id": "1042"
      },
      "updated_at": "2026-10-01T10:02:12.104000+00:00",
      "created_at": "2026-10-01T10:02:11.583000+00:00"
    }
  }
}
```

## Fields

- `event_id` (string): Event ID (`evt_…`). A retried request carries the same ID, so use it to skip events you already handled. You can also look the event up with [Retrieve an event](/docs/api-reference/events/get/).

- `type` (string): Always `email.rejected`.

- `object` (object): The email the event describes. Its fields are listed below.

- `data.object` (object): The same object again, in the shape that the [Events API](/docs/api-reference/events/get/) returns in `data`.

### Email object

- `id` (string): Email ID (`em_…`).

- `object` (string): Always `email`.

- `from` (string): Sender address, without the display name.

- `to` (string): Recipient address. Emailit creates a separate email for every recipient.

- `subject` (string | null): Subject line.

- `status` (string): Always `rejected`.

- `meta` (object | null): The `meta` object sent with the email, or `null`.

- `updated_at` (string): When the email record was last updated before this event, in ISO 8601 with a UTC offset. It can be earlier than the status change itself.

- `created_at` (string): When Emailit accepted the email.

---
Source: https://emailit.com/docs/webhooks/events/email/email-rejected/

## email.suppressed

> Sent when Emailit skips an email because the recipient address has a recipient suppression on your suppression list.

# email.suppressed

Sent when Emailit doesn't send an email because the recipient has a `recipient` suppression on your [suppression list](/docs/suppressions/). To email the address again, remove it with [Delete a suppression](/docs/api-reference/suppressions/delete/).

Webhook requests carry a JSON array of events like this one; see [Webhook requests](/docs/webhooks/webhook-requests/).

```json
{
  "event_id": "evt_2xLc9Rr4Tn6Wb1Qm8Ks3Vf0Hd7a",
  "type": "email.suppressed",
  "object": {
    "id": "em_2xLc8Mm3Pq5Vn0Ra7Jt2Wd9Fb4e",
    "object": "email",
    "from": "hello@acme.com",
    "to": "ada@example.com",
    "subject": "Your order has shipped",
    "status": "suppressed",
    "meta": {
      "order_id": "1042"
    },
    "updated_at": "2026-10-01T10:02:12.104000+00:00",
    "created_at": "2026-10-01T10:02:11.583000+00:00"
  },
  "data": {
    "object": {
      "id": "em_2xLc8Mm3Pq5Vn0Ra7Jt2Wd9Fb4e",
      "object": "email",
      "from": "hello@acme.com",
      "to": "ada@example.com",
      "subject": "Your order has shipped",
      "status": "suppressed",
      "meta": {
        "order_id": "1042"
      },
      "updated_at": "2026-10-01T10:02:12.104000+00:00",
      "created_at": "2026-10-01T10:02:11.583000+00:00"
    }
  }
}
```

## Fields

- `event_id` (string): Event ID (`evt_…`). A retried request carries the same ID, so use it to skip events you already handled. You can also look the event up with [Retrieve an event](/docs/api-reference/events/get/).

- `type` (string): Always `email.suppressed`.

- `object` (object): The email the event describes. Its fields are listed below.

- `data.object` (object): The same object again, in the shape that the [Events API](/docs/api-reference/events/get/) returns in `data`.

### Email object

- `id` (string): Email ID (`em_…`).

- `object` (string): Always `email`.

- `from` (string): Sender address, without the display name.

- `to` (string): Recipient address. Emailit creates a separate email for every recipient.

- `subject` (string | null): Subject line.

- `status` (string): Always `suppressed`.

- `meta` (object | null): The `meta` object sent with the email, or `null`.

- `updated_at` (string): When the email record was last updated before this event, in ISO 8601 with a UTC offset. It can be earlier than the status change itself.

- `created_at` (string): When Emailit accepted the email.

---
Source: https://emailit.com/docs/webhooks/events/email/email-suppressed/

## email.held

> Sent when Emailit holds an email instead of sending it, for example because of a high spam score or missing credits.

# email.held

Sent when Emailit holds an email instead of sending it. That happens when the workspace is suspended, the sending domain is paused, the API key is set to hold messages, the workspace is out of credits, or the [spam check](/docs/deliverability/spam-checks/) score is at or above the threshold (7 by default). After you fix the cause, send the email again with [Retry an email](/docs/api-reference/emails/retry/).

`email.held` isn't in the dashboard's event list. You receive it on webhooks that have `all_events` turned on, or by adding it to `events` with [Update a webhook](/docs/api-reference/webhooks/update/).

Webhook requests carry a JSON array of events like this one; see [Webhook requests](/docs/webhooks/webhook-requests/).

```json
{
  "event_id": "evt_2xLc9Rr4Tn6Wb1Qm8Ks3Vf0Hd7a",
  "type": "email.held",
  "object": {
    "id": "em_2xLc8Mm3Pq5Vn0Ra7Jt2Wd9Fb4e",
    "object": "email",
    "from": "hello@acme.com",
    "to": "ada@example.com",
    "subject": "Your order has shipped",
    "status": "held",
    "meta": {
      "order_id": "1042"
    },
    "updated_at": "2026-10-01T10:02:12.104000+00:00",
    "created_at": "2026-10-01T10:02:11.583000+00:00"
  },
  "data": {
    "object": {
      "id": "em_2xLc8Mm3Pq5Vn0Ra7Jt2Wd9Fb4e",
      "object": "email",
      "from": "hello@acme.com",
      "to": "ada@example.com",
      "subject": "Your order has shipped",
      "status": "held",
      "meta": {
        "order_id": "1042"
      },
      "updated_at": "2026-10-01T10:02:12.104000+00:00",
      "created_at": "2026-10-01T10:02:11.583000+00:00"
    }
  }
}
```

## Fields

- `event_id` (string): Event ID (`evt_…`). A retried request carries the same ID, so use it to skip events you already handled. You can also look the event up with [Retrieve an event](/docs/api-reference/events/get/).

- `type` (string): Always `email.held`.

- `object` (object): The email the event describes. Its fields are listed below.

- `data.object` (object): The same object again, in the shape that the [Events API](/docs/api-reference/events/get/) returns in `data`.

### Email object

- `id` (string): Email ID (`em_…`).

- `object` (string): Always `email`.

- `from` (string): Sender address, without the display name.

- `to` (string): Recipient address. Emailit creates a separate email for every recipient.

- `subject` (string | null): Subject line.

- `status` (string): Always `held`.

- `meta` (object | null): The `meta` object sent with the email, or `null`.

- `updated_at` (string): When the email record was last updated before this event, in ISO 8601 with a UTC offset. It can be earlier than the status change itself.

- `created_at` (string): When Emailit accepted the email.

---
Source: https://emailit.com/docs/webhooks/events/email/email-held/

## email.canceled

> Sent when you cancel a scheduled, accepted or attempted email. Includes the status the email had before it was canceled.

# email.canceled

Sent when you cancel an email with [Cancel an email](/docs/api-reference/emails/cancel/). If a delivery attempt was already running, it can still complete, so a delivery event can follow.

Webhook requests carry a JSON array of events like this one; see [Webhook requests](/docs/webhooks/webhook-requests/).

```json
{
  "event_id": "evt_2xLc9Rr4Tn6Wb1Qm8Ks3Vf0Hd7a",
  "type": "email.canceled",
  "object": {
    "id": "em_2xLc8Mm3Pq5Vn0Ra7Jt2Wd9Fb4e",
    "object": "email",
    "from": "Acme <hello@acme.com>",
    "to": "ada@example.com",
    "subject": "Your October invoice",
    "status": "canceled",
    "previous_status": "scheduled",
    "meta": {
      "invoice_id": "INV-2026-0142"
    },
    "timestamp": "2026-10-01T10:02:14.307000+00:00"
  },
  "data": {
    "object": {
      "id": "em_2xLc8Mm3Pq5Vn0Ra7Jt2Wd9Fb4e",
      "object": "email",
      "from": "Acme <hello@acme.com>",
      "to": "ada@example.com",
      "subject": "Your October invoice",
      "status": "canceled",
      "previous_status": "scheduled",
      "meta": {
        "invoice_id": "INV-2026-0142"
      },
      "timestamp": "2026-10-01T10:02:14.307000+00:00"
    }
  }
}
```

## Fields

- `event_id` (string): Event ID (`evt_…`). A retried request carries the same ID, so use it to skip events you already handled. You can also look the event up with [Retrieve an event](/docs/api-reference/events/get/).

- `type` (string): Always `email.canceled`.

- `object` (object): The email the event describes. Its fields are listed below.

- `data.object` (object): The same object again, in the shape that the [Events API](/docs/api-reference/events/get/) returns in `data`.

### Email object

- `id` (string): Email ID (`em_…`).

- `object` (string): Always `email`.

- `from` (string): Sender as stored on the email. It can include a display name.

- `to` (string): Recipient address.

- `subject` (string): Subject line.

- `status` (string): Always `canceled`.

- `previous_status` (string): Status before the cancellation: `scheduled`, `accepted` or `attempted`.

- `meta` (object | null): The `meta` object sent with the email, or `null`.

- `timestamp` (string): When the email was canceled, in ISO 8601 with a UTC offset.

---
Source: https://emailit.com/docs/webhooks/events/email/email-canceled/

## email.complained

> Sent when a recipient reports your email as spam and their mailbox provider passes the complaint to Emailit.

# email.complained

Sent when a recipient marks your email as spam and their mailbox provider reports it to Emailit through a feedback loop. Depending on your auto-suppression settings, Emailit adds a `complaint` suppression for the address. See [Bounces and complaints](/docs/deliverability/bounces-and-complaints/).

Webhook requests carry a JSON array of events like this one; see [Webhook requests](/docs/webhooks/webhook-requests/).

```json
{
  "event_id": "evt_2xLc9Rr4Tn6Wb1Qm8Ks3Vf0Hd7a",
  "type": "email.complained",
  "object": {
    "id": "em_2xLc8Mm3Pq5Vn0Ra7Jt2Wd9Fb4e",
    "object": "email",
    "from": "hello@acme.com",
    "to": "ada@example.com",
    "subject": "Your order has shipped",
    "status": "complained",
    "meta": {
      "order_id": "1042"
    },
    "updated_at": "2026-10-01T10:02:12.104000+00:00",
    "created_at": "2026-10-01T10:02:11.583000+00:00"
  },
  "data": {
    "object": {
      "id": "em_2xLc8Mm3Pq5Vn0Ra7Jt2Wd9Fb4e",
      "object": "email",
      "from": "hello@acme.com",
      "to": "ada@example.com",
      "subject": "Your order has shipped",
      "status": "complained",
      "meta": {
        "order_id": "1042"
      },
      "updated_at": "2026-10-01T10:02:12.104000+00:00",
      "created_at": "2026-10-01T10:02:11.583000+00:00"
    }
  }
}
```

## Fields

- `event_id` (string): Event ID (`evt_…`). A retried request carries the same ID, so use it to skip events you already handled. You can also look the event up with [Retrieve an event](/docs/api-reference/events/get/).

- `type` (string): Always `email.complained`.

- `object` (object): The email the event describes. Its fields are listed below.

- `data.object` (object): The same object again, in the shape that the [Events API](/docs/api-reference/events/get/) returns in `data`.

### Email object

- `id` (string): Email ID (`em_…`).

- `object` (string): Always `email`.

- `from` (string): Sender address, without the display name.

- `to` (string): Recipient address. Emailit creates a separate email for every recipient.

- `subject` (string | null): Subject line.

- `status` (string): Always `complained`.

- `meta` (object | null): The `meta` object sent with the email, or `null`.

- `updated_at` (string): When the email record was last updated before this event, in ISO 8601 with a UTC offset. It can be earlier than the status change itself.

- `created_at` (string): When Emailit accepted the email.

---
Source: https://emailit.com/docs/webhooks/events/email/email-complained/

## email.received

> Sent when an email arrives at one of your inbound addresses. Use the email ID to fetch its body and attachments.

# email.received

Sent when Emailit receives an email at one of your [inbound](/docs/inbound/) addresses. The payload has the envelope only: fetch the body and attachments with [Retrieve an email](/docs/api-reference/emails/get/) using the `id`.

Webhook requests carry a JSON array of events like this one; see [Webhook requests](/docs/webhooks/webhook-requests/).

```json
{
  "event_id": "evt_2xLc9Rr4Tn6Wb1Qm8Ks3Vf0Hd7a",
  "type": "email.received",
  "object": {
    "id": "em_2xLc8Mm3Pq5Vn0Ra7Jt2Wd9Fb4e",
    "object": "email",
    "from": "ada@example.com",
    "to": "support@inbound.acme.com",
    "subject": "Question about my order",
    "created_at": "2026-10-01T10:02:11.583000+00:00"
  },
  "data": {
    "object": {
      "id": "em_2xLc8Mm3Pq5Vn0Ra7Jt2Wd9Fb4e",
      "object": "email",
      "from": "ada@example.com",
      "to": "support@inbound.acme.com",
      "subject": "Question about my order",
      "created_at": "2026-10-01T10:02:11.583000+00:00"
    }
  }
}
```

## Fields

- `event_id` (string): Event ID (`evt_…`). A retried request carries the same ID, so use it to skip events you already handled. You can also look the event up with [Retrieve an event](/docs/api-reference/events/get/).

- `type` (string): Always `email.received`.

- `object` (object): The received email the event describes. Its fields are listed below.

- `data.object` (object): The same object again, in the shape that the [Events API](/docs/api-reference/events/get/) returns in `data`.

### Email object

- `id` (string): Email ID (`em_…`) of the received email.

- `object` (string): Always `email`.

- `from` (string): Sender address from the `From` header.

- `to` (string): Inbound address that received the email.

- `subject` (string | null): Subject line.

- `created_at` (string): When Emailit received the email, in ISO 8601 with a UTC offset.

---
Source: https://emailit.com/docs/webhooks/events/email/email-received/

## email.loaded

> Sent each time a tracked email is opened and its tracking pixel loads. Includes the email, the contact and the client.

# email.loaded

Sent each time the tracking pixel in an email loads, which usually means the recipient opened it. Open tracking needs a verified [tracking domain](/docs/tracking/) and open tracking turned on for the email. Mail clients that preload or block images make opens approximate.

Webhook requests carry a JSON array of events like this one; see [Webhook requests](/docs/webhooks/webhook-requests/).

```json
{
  "event_id": "evt_2xLc9Rr4Tn6Wb1Qm8Ks3Vf0Hd7a",
  "type": "email.loaded",
  "object": {
    "id": "load_2xLg2Cw7Sr4Xo9Ud1Zn6Ke3Lt8g",
    "object": "load",
    "email_id": "em_2xLc8Mm3Pq5Vn0Ra7Jt2Wd9Fb4e",
    "email": {
      "id": "em_2xLc8Mm3Pq5Vn0Ra7Jt2Wd9Fb4e",
      "rcpt_to": "ada@example.com",
      "mail_from": "Acme <news@acme.com>",
      "subject": "What's new in October",
      "created_at": "2026-10-01T10:02:11.583000+00:00",
      "campaign": {
        "id": "cmp_2xLf3Gd8Wr5Mb0Tq6Yn1Kc4Hs9e",
        "name": "October product update"
      },
      "meta": null
    },
    "contact": {
      "id": "con_2xLf5Jk1Xs7Nc2Ur8Zo3Ld6Pt0a",
      "email": "ada@example.com"
    },
    "ip_address": "203.0.113.42",
    "user_agent": "Mozilla/5.0 (iPhone; CPU iPhone OS 17_5 like Mac OS X) AppleWebKit/605.1.15 (KHTML, like Gecko) Mobile/15E148",
    "created_at": "2026-10-01T10:02:14.307000+00:00"
  },
  "data": {
    "object": {
      "id": "load_2xLg2Cw7Sr4Xo9Ud1Zn6Ke3Lt8g",
      "object": "load",
      "email_id": "em_2xLc8Mm3Pq5Vn0Ra7Jt2Wd9Fb4e",
      "email": {
        "id": "em_2xLc8Mm3Pq5Vn0Ra7Jt2Wd9Fb4e",
        "rcpt_to": "ada@example.com",
        "mail_from": "Acme <news@acme.com>",
        "subject": "What's new in October",
        "created_at": "2026-10-01T10:02:11.583000+00:00",
        "campaign": {
          "id": "cmp_2xLf3Gd8Wr5Mb0Tq6Yn1Kc4Hs9e",
          "name": "October product update"
        },
        "meta": null
      },
      "contact": {
        "id": "con_2xLf5Jk1Xs7Nc2Ur8Zo3Ld6Pt0a",
        "email": "ada@example.com"
      },
      "ip_address": "203.0.113.42",
      "user_agent": "Mozilla/5.0 (iPhone; CPU iPhone OS 17_5 like Mac OS X) AppleWebKit/605.1.15 (KHTML, like Gecko) Mobile/15E148",
      "created_at": "2026-10-01T10:02:14.307000+00:00"
    }
  }
}
```

## Fields

- `event_id` (string): Event ID (`evt_…`). A retried request carries the same ID, so use it to skip events you already handled. You can also look the event up with [Retrieve an event](/docs/api-reference/events/get/).

- `type` (string): Always `email.loaded`.

- `object` (object): The open the event describes. Its fields are listed below.

- `data.object` (object): The same object again, in the shape that the [Events API](/docs/api-reference/events/get/) returns in `data`.

### Load object

- `id` (string): Open ID (`load_…`).

- `object` (string): Always `load`.

- `email_id` (string): ID of the email (`em_…`).

- `email` (object): The email.

- `email.id` (string): Email ID (`em_…`).

- `email.rcpt_to` (string): Recipient address.

- `email.mail_from` (string): Sender as stored on the email. It can include a display name.

- `email.subject` (string | null): Subject line.

- `email.created_at` (string): When Emailit accepted the email.

- `email.campaign` (object | null): `id` and `name` of the campaign that sent the email, or `null` for emails sent through the API or SMTP.

- `email.meta` (object | null): The `meta` object sent with the email, or `null`.

- `contact` (object | null): `id` and `email` of the contact with the recipient's address in this workspace, or `null` if there is none.

- `ip_address` (string): IP address of the request.

- `user_agent` (string | null): User agent of the client that made the request.

- `created_at` (string): When the pixel loaded, in ISO 8601 with a UTC offset.

---
Source: https://emailit.com/docs/webhooks/events/email/email-loaded/

## email.clicked

> Sent each time a recipient clicks a tracked link in an email. Includes the link, the email, the contact and the client.

# email.clicked

Sent each time someone clicks a tracked link in an email. Click tracking needs a verified [tracking domain](/docs/tracking/) and click tracking turned on for the email. Emailit doesn't filter automated clicks, such as link checks by security scanners.

Webhook requests carry a JSON array of events like this one; see [Webhook requests](/docs/webhooks/webhook-requests/).

```json
{
  "event_id": "evt_2xLc9Rr4Tn6Wb1Qm8Ks3Vf0Hd7a",
  "type": "email.clicked",
  "object": {
    "id": "click_2xLg1Bv6Rq3Wn8Tc0Ym5Jd2Ks7f",
    "object": "click",
    "email_id": "em_2xLc8Mm3Pq5Vn0Ra7Jt2Wd9Fb4e",
    "email": {
      "id": "em_2xLc8Mm3Pq5Vn0Ra7Jt2Wd9Fb4e",
      "rcpt_to": "ada@example.com",
      "mail_from": "Acme <news@acme.com>",
      "subject": "What's new in October",
      "created_at": "2026-10-01T10:02:11.583000+00:00",
      "campaign": {
        "id": "cmp_2xLf3Gd8Wr5Mb0Tq6Yn1Kc4Hs9e",
        "name": "October product update"
      },
      "meta": null
    },
    "link": {
      "id": "link_2xLf9Pa4Vt1Qm6Xs3Hc8Nb0Rd5e",
      "url": "https://acme.com/blog/october-update"
    },
    "contact": {
      "id": "con_2xLf5Jk1Xs7Nc2Ur8Zo3Ld6Pt0a",
      "email": "ada@example.com"
    },
    "ip_address": "203.0.113.42",
    "user_agent": "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/605.1.15 (KHTML, like Gecko) Version/17.5 Safari/605.1.15",
    "created_at": "2026-10-01T10:02:14.307000+00:00"
  },
  "data": {
    "object": {
      "id": "click_2xLg1Bv6Rq3Wn8Tc0Ym5Jd2Ks7f",
      "object": "click",
      "email_id": "em_2xLc8Mm3Pq5Vn0Ra7Jt2Wd9Fb4e",
      "email": {
        "id": "em_2xLc8Mm3Pq5Vn0Ra7Jt2Wd9Fb4e",
        "rcpt_to": "ada@example.com",
        "mail_from": "Acme <news@acme.com>",
        "subject": "What's new in October",
        "created_at": "2026-10-01T10:02:11.583000+00:00",
        "campaign": {
          "id": "cmp_2xLf3Gd8Wr5Mb0Tq6Yn1Kc4Hs9e",
          "name": "October product update"
        },
        "meta": null
      },
      "link": {
        "id": "link_2xLf9Pa4Vt1Qm6Xs3Hc8Nb0Rd5e",
        "url": "https://acme.com/blog/october-update"
      },
      "contact": {
        "id": "con_2xLf5Jk1Xs7Nc2Ur8Zo3Ld6Pt0a",
        "email": "ada@example.com"
      },
      "ip_address": "203.0.113.42",
      "user_agent": "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/605.1.15 (KHTML, like Gecko) Version/17.5 Safari/605.1.15",
      "created_at": "2026-10-01T10:02:14.307000+00:00"
    }
  }
}
```

## Fields

- `event_id` (string): Event ID (`evt_…`). A retried request carries the same ID, so use it to skip events you already handled. You can also look the event up with [Retrieve an event](/docs/api-reference/events/get/).

- `type` (string): Always `email.clicked`.

- `object` (object): The click the event describes. Its fields are listed below.

- `data.object` (object): The same object again, in the shape that the [Events API](/docs/api-reference/events/get/) returns in `data`.

### Click object

- `id` (string): Click ID (`click_…`).

- `object` (string): Always `click`.

- `email_id` (string): ID of the email (`em_…`).

- `email` (object): The email.

- `email.id` (string): Email ID (`em_…`).

- `email.rcpt_to` (string): Recipient address.

- `email.mail_from` (string): Sender as stored on the email. It can include a display name.

- `email.subject` (string | null): Subject line.

- `email.created_at` (string): When Emailit accepted the email.

- `email.campaign` (object | null): `id` and `name` of the campaign that sent the email, or `null` for emails sent through the API or SMTP.

- `email.meta` (object | null): The `meta` object sent with the email, or `null`.

- `link` (object): The link that was clicked.

- `link.id` (string): Link ID (`link_…`).

- `link.url` (string): Destination URL.

- `contact` (object | null): `id` and `email` of the contact with the recipient's address in this workspace, or `null` if there is none.

- `ip_address` (string): IP address of the request.

- `user_agent` (string | null): User agent of the client that made the request.

- `created_at` (string): When the click happened, in ISO 8601 with a UTC offset.

---
Source: https://emailit.com/docs/webhooks/events/email/email-clicked/

## email.unsubscribed

> Sent when a contact unsubscribes from your campaigns, for example with the unsubscribe link in a campaign email.

# email.unsubscribed

Sent when a contact unsubscribes from your campaigns, for example with the unsubscribe link in a campaign email. Emailit also sends [`subscriber.updated`](/docs/webhooks/events/subscriber/updated/) for each audience the contact left. See [Unsubscribes](/docs/audiences/unsubscribes/).

Webhook requests carry a JSON array of events like this one; see [Webhook requests](/docs/webhooks/webhook-requests/).

```json
{
  "event_id": "evt_2xLc9Rr4Tn6Wb1Qm8Ks3Vf0Hd7a",
  "type": "email.unsubscribed",
  "object": {
    "id": "em_2xLc8Mm3Pq5Vn0Ra7Jt2Wd9Fb4e",
    "object": "email",
    "from": "news@acme.com",
    "to": "ada@example.com",
    "subject": "What's new in October",
    "campaign": {
      "id": "cmp_2xLf3Gd8Wr5Mb0Tq6Yn1Kc4Hs9e",
      "name": "October product update"
    },
    "contact": {
      "id": "con_2xLf5Jk1Xs7Nc2Ur8Zo3Ld6Pt0a",
      "email": "ada@example.com"
    },
    "unsubscribed_at": "2026-10-01T10:02:14.307000+00:00"
  },
  "data": {
    "object": {
      "id": "em_2xLc8Mm3Pq5Vn0Ra7Jt2Wd9Fb4e",
      "object": "email",
      "from": "news@acme.com",
      "to": "ada@example.com",
      "subject": "What's new in October",
      "campaign": {
        "id": "cmp_2xLf3Gd8Wr5Mb0Tq6Yn1Kc4Hs9e",
        "name": "October product update"
      },
      "contact": {
        "id": "con_2xLf5Jk1Xs7Nc2Ur8Zo3Ld6Pt0a",
        "email": "ada@example.com"
      },
      "unsubscribed_at": "2026-10-01T10:02:14.307000+00:00"
    }
  }
}
```

## Fields

- `event_id` (string): Event ID (`evt_…`). A retried request carries the same ID, so use it to skip events you already handled. You can also look the event up with [Retrieve an event](/docs/api-reference/events/get/).

- `type` (string): Always `email.unsubscribed`.

- `object` (object): The campaign email the event describes. Its fields are listed below.

- `data.object` (object): The same object again, in the shape that the [Events API](/docs/api-reference/events/get/) returns in `data`.

### Email object

- `id` (string | null): ID (`em_…`) of the campaign email the contact acted on, or `null` if Emailit couldn't match one.

- `object` (string): Always `email`.

- `from` (string): Sender of the campaign email.

- `to` (string): The contact's address.

- `subject` (string): Subject of the campaign email.

- `campaign` (object | null): `id` and `name` of the campaign, or `null`.

- `contact` (object | null): `id` and `email` of the contact.

- `unsubscribed_at` (string): When the contact unsubscribed, in ISO 8601 with a UTC offset.

---
Source: https://emailit.com/docs/webhooks/events/email/email-unsubscribed/

## email.resubscribed

> Sent when a contact who unsubscribed from your campaigns subscribes again, for example from the unsubscribe page.

# email.resubscribed

Sent when a contact who unsubscribed from your campaigns is subscribed again, for example with the resubscribe option on the unsubscribe page. Emailit also sends [`subscriber.updated`](/docs/webhooks/events/subscriber/updated/) for each audience the contact rejoined.

Webhook requests carry a JSON array of events like this one; see [Webhook requests](/docs/webhooks/webhook-requests/).

```json
{
  "event_id": "evt_2xLc9Rr4Tn6Wb1Qm8Ks3Vf0Hd7a",
  "type": "email.resubscribed",
  "object": {
    "id": "em_2xLc8Mm3Pq5Vn0Ra7Jt2Wd9Fb4e",
    "object": "email",
    "from": "news@acme.com",
    "to": "ada@example.com",
    "subject": "What's new in October",
    "campaign": {
      "id": "cmp_2xLf3Gd8Wr5Mb0Tq6Yn1Kc4Hs9e",
      "name": "October product update"
    },
    "contact": {
      "id": "con_2xLf5Jk1Xs7Nc2Ur8Zo3Ld6Pt0a",
      "email": "ada@example.com"
    },
    "resubscribed_at": "2026-10-01T10:02:14.307000+00:00"
  },
  "data": {
    "object": {
      "id": "em_2xLc8Mm3Pq5Vn0Ra7Jt2Wd9Fb4e",
      "object": "email",
      "from": "news@acme.com",
      "to": "ada@example.com",
      "subject": "What's new in October",
      "campaign": {
        "id": "cmp_2xLf3Gd8Wr5Mb0Tq6Yn1Kc4Hs9e",
        "name": "October product update"
      },
      "contact": {
        "id": "con_2xLf5Jk1Xs7Nc2Ur8Zo3Ld6Pt0a",
        "email": "ada@example.com"
      },
      "resubscribed_at": "2026-10-01T10:02:14.307000+00:00"
    }
  }
}
```

## Fields

- `event_id` (string): Event ID (`evt_…`). A retried request carries the same ID, so use it to skip events you already handled. You can also look the event up with [Retrieve an event](/docs/api-reference/events/get/).

- `type` (string): Always `email.resubscribed`.

- `object` (object): The campaign email the event describes. Its fields are listed below.

- `data.object` (object): The same object again, in the shape that the [Events API](/docs/api-reference/events/get/) returns in `data`.

### Email object

- `id` (string | null): ID (`em_…`) of the campaign email the contact acted on, or `null` if Emailit couldn't match one.

- `object` (string): Always `email`.

- `from` (string): Sender of the campaign email.

- `to` (string): The contact's address.

- `subject` (string): Subject of the campaign email.

- `campaign` (object | null): `id` and `name` of the campaign, or `null`.

- `contact` (object | null): `id` and `email` of the contact.

- `resubscribed_at` (string): When the contact resubscribed, in ISO 8601 with a UTC offset.

---
Source: https://emailit.com/docs/webhooks/events/email/email-resubscribed/
