Skip to content
Docs

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

email.accepted

Sent when Send an email or Forward an email 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 don’t send this event.

Webhook requests carry a JSON array of events like this one; see Webhook requests.

Fields

event_idstring

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.

typestring

Always email.accepted.

objectobject

The email the event describes. Its fields are listed below.

data.objectobject

The same object again, in the shape that the Events API returns in data.

Email object

idstring

Email ID (em_…).

objectstring

Always email.

fromstring

Sender as given in the request. It can include a display name, for example Acme <hello@acme.com>.

tostring

Recipient address. Emailit creates a separate email, with its own ID, for every recipient.

subjectstring

Subject line.

metaobject | null

The meta object you sent with the email, or null.

timestampstring

When the email was accepted, in ISO 8601 with a UTC offset.

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"
    }
  }
}

email.scheduled

Sent when Send an email 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.

Webhook requests carry a JSON array of events like this one; see Webhook requests.

Fields

event_idstring

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.

typestring

Always email.scheduled.

objectobject

The email the event describes. Its fields are listed below.

data.objectobject

The same object again, in the shape that the Events API returns in data.

Email object

idstring

Email ID (em_…).

objectstring

Always email.

fromstring

Sender as given in the request. It can include a display name, for example Acme <hello@acme.com>.

tostring

Recipient address. Emailit creates a separate email, with its own ID, for every recipient.

subjectstring

Subject line.

metaobject | null

The meta object you sent with the email, or null.

scheduled_atstring

When Emailit will send the email.

timestampstring

When the email was accepted, in ISO 8601 with a UTC offset.

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"
    }
  }
}

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 explains every status.

Webhook requests carry a JSON array of events like this one; see Webhook requests.

Fields

event_idstring

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.

typestring

Always email.delivered.

objectobject

The email the event describes. Its fields are listed below.

data.objectobject

The same object again, in the shape that the Events API returns in data.

Email object

idstring

Email ID (em_…).

objectstring

Always email.

fromstring

Sender address, without the display name.

tostring

Recipient address. Emailit creates a separate email for every recipient.

subjectstring | null

Subject line.

statusstring

Always delivered.

metaobject | null

The meta object sent with the email, or null.

updated_atstring

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_atstring

When Emailit accepted the email.

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"
    }
  }
}

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.

Webhook requests carry a JSON array of events like this one; see Webhook requests.

Fields

event_idstring

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.

typestring

Always email.attempted.

objectobject

The email the event describes. Its fields are listed below.

data.objectobject

The same object again, in the shape that the Events API returns in data.

Email object

idstring

Email ID (em_…).

objectstring

Always email.

fromstring

Sender address, without the display name.

tostring

Recipient address. Emailit creates a separate email for every recipient.

subjectstring | null

Subject line.

statusstring

Always attempted.

metaobject | null

The meta object sent with the email, or null.

updated_atstring

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_atstring

When Emailit accepted the email.

smtp_codeinteger | 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_codestring | null

Enhanced status code from the reply, for example 4.7.0. See Enhanced status codes.

smtp_responsestring | null

Full reply from the receiving server.

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."
    }
  }
}

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.

Webhook requests carry a JSON array of events like this one; see Webhook requests.

Fields

event_idstring

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.

typestring

Always email.bounced.

objectobject

The email the event describes. Its fields are listed below.

data.objectobject

The same object again, in the shape that the Events API returns in data.

Email object

idstring

Email ID (em_…).

objectstring

Always email.

fromstring

Sender address, without the display name.

tostring

Recipient address. Emailit creates a separate email for every recipient.

subjectstring | null

Subject line.

statusstring

Always bounced.

metaobject | null

The meta object sent with the email, or null.

updated_atstring

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_atstring

When Emailit accepted the email.

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"
    }
  }
}

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 or email.attempted.

Webhook requests carry a JSON array of events like this one; see Webhook requests.

Fields

event_idstring

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.

typestring

Always email.failed.

objectobject

The bounce message the event describes. Its fields are listed below.

data.objectobject

The same object again, in the shape that the Events API returns in data.

Email object

idstring

Email ID (em_…) of the bounce message.

objectstring

Always email.

fromstring

Sender of the bounce message, usually the receiving server’s mailer daemon.

tostring

Your workspace’s return-path address on the emailit. subdomain of your sending domain.

subjectstring | null

Subject of the bounce message.

statusstring

Always failed.

metaobject | null

Always null for bounce messages.

updated_atstring

When the bounce message was last updated before this event, in ISO 8601 with a UTC offset.

created_atstring

When Emailit received the bounce message.

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"
    }
  }
}

email.rejected

Sent when Emailit refuses to send an email because your workspace doesn’t have 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.

Fields

event_idstring

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.

typestring

Always email.rejected.

objectobject

The email the event describes. Its fields are listed below.

data.objectobject

The same object again, in the shape that the Events API returns in data.

Email object

idstring

Email ID (em_…).

objectstring

Always email.

fromstring

Sender address, without the display name.

tostring

Recipient address. Emailit creates a separate email for every recipient.

subjectstring | null

Subject line.

statusstring

Always rejected.

metaobject | null

The meta object sent with the email, or null.

updated_atstring

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_atstring

When Emailit accepted the email.

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"
    }
  }
}

email.suppressed

Sent when Emailit doesn’t send an email because the recipient has a recipient suppression on your suppression list. To email the address again, remove it with Delete a suppression.

Webhook requests carry a JSON array of events like this one; see Webhook requests.

Fields

event_idstring

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.

typestring

Always email.suppressed.

objectobject

The email the event describes. Its fields are listed below.

data.objectobject

The same object again, in the shape that the Events API returns in data.

Email object

idstring

Email ID (em_…).

objectstring

Always email.

fromstring

Sender address, without the display name.

tostring

Recipient address. Emailit creates a separate email for every recipient.

subjectstring | null

Subject line.

statusstring

Always suppressed.

metaobject | null

The meta object sent with the email, or null.

updated_atstring

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_atstring

When Emailit accepted the email.

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"
    }
  }
}

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 score is at or above the threshold (7 by default). After you fix the cause, send the email again with Retry an email.

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.

Webhook requests carry a JSON array of events like this one; see Webhook requests.

Fields

event_idstring

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.

typestring

Always email.held.

objectobject

The email the event describes. Its fields are listed below.

data.objectobject

The same object again, in the shape that the Events API returns in data.

Email object

idstring

Email ID (em_…).

objectstring

Always email.

fromstring

Sender address, without the display name.

tostring

Recipient address. Emailit creates a separate email for every recipient.

subjectstring | null

Subject line.

statusstring

Always held.

metaobject | null

The meta object sent with the email, or null.

updated_atstring

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_atstring

When Emailit accepted the email.

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"
    }
  }
}

email.canceled

Sent when you cancel an email with Cancel an email. 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.

Fields

event_idstring

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.

typestring

Always email.canceled.

objectobject

The email the event describes. Its fields are listed below.

data.objectobject

The same object again, in the shape that the Events API returns in data.

Email object

idstring

Email ID (em_…).

objectstring

Always email.

fromstring

Sender as stored on the email. It can include a display name.

tostring

Recipient address.

subjectstring

Subject line.

statusstring

Always canceled.

previous_statusstring

Status before the cancellation: scheduled, accepted or attempted.

metaobject | null

The meta object sent with the email, or null.

timestampstring

When the email was canceled, in ISO 8601 with a UTC offset.

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"
    }
  }
}

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.

Webhook requests carry a JSON array of events like this one; see Webhook requests.

Fields

event_idstring

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.

typestring

Always email.complained.

objectobject

The email the event describes. Its fields are listed below.

data.objectobject

The same object again, in the shape that the Events API returns in data.

Email object

idstring

Email ID (em_…).

objectstring

Always email.

fromstring

Sender address, without the display name.

tostring

Recipient address. Emailit creates a separate email for every recipient.

subjectstring | null

Subject line.

statusstring

Always complained.

metaobject | null

The meta object sent with the email, or null.

updated_atstring

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_atstring

When Emailit accepted the email.

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"
    }
  }
}

email.received

Sent when Emailit receives an email at one of your inbound addresses. The payload has the envelope only: fetch the body and attachments with Retrieve an email using the id.

Webhook requests carry a JSON array of events like this one; see Webhook requests.

Fields

event_idstring

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.

typestring

Always email.received.

objectobject

The received email the event describes. Its fields are listed below.

data.objectobject

The same object again, in the shape that the Events API returns in data.

Email object

idstring

Email ID (em_…) of the received email.

objectstring

Always email.

fromstring

Sender address from the From header.

tostring

Inbound address that received the email.

subjectstring | null

Subject line.

created_atstring

When Emailit received the email, in ISO 8601 with a UTC offset.

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"
    }
  }
}

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

Fields

event_idstring

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.

typestring

Always email.loaded.

objectobject

The open the event describes. Its fields are listed below.

data.objectobject

The same object again, in the shape that the Events API returns in data.

Load object

idstring

Open ID (load_…).

objectstring

Always load.

email_idstring

ID of the email (em_…).

emailobject

The email.

email.idstring

Email ID (em_…).

email.rcpt_tostring

Recipient address.

email.mail_fromstring

Sender as stored on the email. It can include a display name.

email.subjectstring | null

Subject line.

email.created_atstring

When Emailit accepted the email.

email.campaignobject | null

id and name of the campaign that sent the email, or null for emails sent through the API or SMTP.

email.metaobject | null

The meta object sent with the email, or null.

contactobject | null

id and email of the contact with the recipient’s address in this workspace, or null if there is none.

ip_addressstring

IP address of the request.

user_agentstring | null

User agent of the client that made the request.

created_atstring

When the pixel loaded, in ISO 8601 with a UTC offset.

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"
    }
  }
}

email.clicked

Sent each time someone clicks a tracked link in an email. Click tracking needs a verified tracking domain 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.

Fields

event_idstring

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.

typestring

Always email.clicked.

objectobject

The click the event describes. Its fields are listed below.

data.objectobject

The same object again, in the shape that the Events API returns in data.

Click object

idstring

Click ID (click_…).

objectstring

Always click.

email_idstring

ID of the email (em_…).

emailobject

The email.

email.idstring

Email ID (em_…).

email.rcpt_tostring

Recipient address.

email.mail_fromstring

Sender as stored on the email. It can include a display name.

email.subjectstring | null

Subject line.

email.created_atstring

When Emailit accepted the email.

email.campaignobject | null

id and name of the campaign that sent the email, or null for emails sent through the API or SMTP.

email.metaobject | null

The meta object sent with the email, or null.

linkobject

The link that was clicked.

link.idstring

Link ID (link_…).

link.urlstring

Destination URL.

contactobject | null

id and email of the contact with the recipient’s address in this workspace, or null if there is none.

ip_addressstring

IP address of the request.

user_agentstring | null

User agent of the client that made the request.

created_atstring

When the click happened, in ISO 8601 with a UTC offset.

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"
    }
  }
}

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 for each audience the contact left. See Unsubscribes.

Webhook requests carry a JSON array of events like this one; see Webhook requests.

Fields

event_idstring

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.

typestring

Always email.unsubscribed.

objectobject

The campaign email the event describes. Its fields are listed below.

data.objectobject

The same object again, in the shape that the Events API returns in data.

Email object

idstring | null

ID (em_…) of the campaign email the contact acted on, or null if Emailit couldn’t match one.

objectstring

Always email.

fromstring

Sender of the campaign email.

tostring

The contact’s address.

subjectstring

Subject of the campaign email.

campaignobject | null

id and name of the campaign, or null.

contactobject | null

id and email of the contact.

unsubscribed_atstring

When the contact unsubscribed, in ISO 8601 with a UTC offset.

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"
    }
  }
}

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 for each audience the contact rejoined.

Webhook requests carry a JSON array of events like this one; see Webhook requests.

Fields

event_idstring

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.

typestring

Always email.resubscribed.

objectobject

The campaign email the event describes. Its fields are listed below.

data.objectobject

The same object again, in the shape that the Events API returns in data.

Email object

idstring | null

ID (em_…) of the campaign email the contact acted on, or null if Emailit couldn’t match one.

objectstring

Always email.

fromstring

Sender of the campaign email.

tostring

The contact’s address.

subjectstring

Subject of the campaign email.

campaignobject | null

id and name of the campaign, or null.

contactobject | null

id and email of the contact.

resubscribed_atstring

When the contact resubscribed, in ISO 8601 with a UTC offset.

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"
    }
  }
}

Was this page helpful?

Thanks for the feedback.

Thanks, we read every message.