Email events
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_idstringEvent 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.
typestringAlways email.accepted.
objectobjectThe email the event describes. Its fields are listed below.
data.objectobjectThe same object again, in the shape that the Events API returns in data.
Email object
idstringEmail ID (em_…).
objectstringAlways email.
fromstringSender as given in the request. It can include a display name, for example Acme <hello@acme.com>.
tostringRecipient address. Emailit creates a separate email, with its own ID, for every recipient.
subjectstringSubject line.
metaobject | nullThe meta object you sent with the email, or null.
timestampstringWhen the email was accepted, in ISO 8601 with a UTC offset.
{
"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_idstringEvent 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.
typestringAlways email.scheduled.
objectobjectThe email the event describes. Its fields are listed below.
data.objectobjectThe same object again, in the shape that the Events API returns in data.
Email object
idstringEmail ID (em_…).
objectstringAlways email.
fromstringSender as given in the request. It can include a display name, for example Acme <hello@acme.com>.
tostringRecipient address. Emailit creates a separate email, with its own ID, for every recipient.
subjectstringSubject line.
metaobject | nullThe meta object you sent with the email, or null.
scheduled_atstringWhen Emailit will send the email.
timestampstringWhen the email was accepted, in ISO 8601 with a UTC offset.
{
"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_idstringEvent 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.
typestringAlways email.delivered.
objectobjectThe email the event describes. Its fields are listed below.
data.objectobjectThe same object again, in the shape that the Events API returns in data.
Email object
idstringEmail ID (em_…).
objectstringAlways email.
fromstringSender address, without the display name.
tostringRecipient address. Emailit creates a separate email for every recipient.
subjectstring | nullSubject line.
statusstringAlways delivered.
metaobject | nullThe meta object sent with the email, or null.
updated_atstringWhen 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_atstringWhen Emailit accepted the email.
{
"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_idstringEvent 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.
typestringAlways email.attempted.
objectobjectThe email the event describes. Its fields are listed below.
data.objectobjectThe same object again, in the shape that the Events API returns in data.
Email object
idstringEmail ID (em_…).
objectstringAlways email.
fromstringSender address, without the display name.
tostringRecipient address. Emailit creates a separate email for every recipient.
subjectstring | nullSubject line.
statusstringAlways attempted.
metaobject | nullThe meta object sent with the email, or null.
updated_atstringWhen 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_atstringWhen Emailit accepted the email.
smtp_codeinteger | nullSMTP 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 | nullEnhanced status code from the reply, for example 4.7.0. See Enhanced status codes.
smtp_responsestring | nullFull reply from the receiving server.
{
"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_idstringEvent 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.
typestringAlways email.bounced.
objectobjectThe email the event describes. Its fields are listed below.
data.objectobjectThe same object again, in the shape that the Events API returns in data.
Email object
idstringEmail ID (em_…).
objectstringAlways email.
fromstringSender address, without the display name.
tostringRecipient address. Emailit creates a separate email for every recipient.
subjectstring | nullSubject line.
statusstringAlways bounced.
metaobject | nullThe meta object sent with the email, or null.
updated_atstringWhen 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_atstringWhen Emailit accepted the email.
{
"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_idstringEvent 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.
typestringAlways email.failed.
objectobjectThe bounce message the event describes. Its fields are listed below.
data.objectobjectThe same object again, in the shape that the Events API returns in data.
Email object
idstringEmail ID (em_…) of the bounce message.
objectstringAlways email.
fromstringSender of the bounce message, usually the receiving server’s mailer daemon.
tostringYour workspace’s return-path address on the emailit. subdomain of your sending domain.
subjectstring | nullSubject of the bounce message.
statusstringAlways failed.
metaobject | nullAlways null for bounce messages.
updated_atstringWhen the bounce message was last updated before this event, in ISO 8601 with a UTC offset.
created_atstringWhen Emailit received the bounce message.
{
"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_idstringEvent 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.
typestringAlways email.rejected.
objectobjectThe email the event describes. Its fields are listed below.
data.objectobjectThe same object again, in the shape that the Events API returns in data.
Email object
idstringEmail ID (em_…).
objectstringAlways email.
fromstringSender address, without the display name.
tostringRecipient address. Emailit creates a separate email for every recipient.
subjectstring | nullSubject line.
statusstringAlways rejected.
metaobject | nullThe meta object sent with the email, or null.
updated_atstringWhen 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_atstringWhen Emailit accepted the email.
{
"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_idstringEvent 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.
typestringAlways email.suppressed.
objectobjectThe email the event describes. Its fields are listed below.
data.objectobjectThe same object again, in the shape that the Events API returns in data.
Email object
idstringEmail ID (em_…).
objectstringAlways email.
fromstringSender address, without the display name.
tostringRecipient address. Emailit creates a separate email for every recipient.
subjectstring | nullSubject line.
statusstringAlways suppressed.
metaobject | nullThe meta object sent with the email, or null.
updated_atstringWhen 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_atstringWhen Emailit accepted the email.
{
"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_idstringEvent 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.
typestringAlways email.held.
objectobjectThe email the event describes. Its fields are listed below.
data.objectobjectThe same object again, in the shape that the Events API returns in data.
Email object
idstringEmail ID (em_…).
objectstringAlways email.
fromstringSender address, without the display name.
tostringRecipient address. Emailit creates a separate email for every recipient.
subjectstring | nullSubject line.
statusstringAlways held.
metaobject | nullThe meta object sent with the email, or null.
updated_atstringWhen 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_atstringWhen Emailit accepted the email.
{
"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_idstringEvent 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.
typestringAlways email.canceled.
objectobjectThe email the event describes. Its fields are listed below.
data.objectobjectThe same object again, in the shape that the Events API returns in data.
Email object
idstringEmail ID (em_…).
objectstringAlways email.
fromstringSender as stored on the email. It can include a display name.
tostringRecipient address.
subjectstringSubject line.
statusstringAlways canceled.
previous_statusstringStatus before the cancellation: scheduled, accepted or attempted.
metaobject | nullThe meta object sent with the email, or null.
timestampstringWhen the email was canceled, in ISO 8601 with a UTC offset.
{
"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_idstringEvent 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.
typestringAlways email.complained.
objectobjectThe email the event describes. Its fields are listed below.
data.objectobjectThe same object again, in the shape that the Events API returns in data.
Email object
idstringEmail ID (em_…).
objectstringAlways email.
fromstringSender address, without the display name.
tostringRecipient address. Emailit creates a separate email for every recipient.
subjectstring | nullSubject line.
statusstringAlways complained.
metaobject | nullThe meta object sent with the email, or null.
updated_atstringWhen 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_atstringWhen Emailit accepted the email.
{
"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_idstringEvent 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.
typestringAlways email.received.
objectobjectThe received email the event describes. Its fields are listed below.
data.objectobjectThe same object again, in the shape that the Events API returns in data.
Email object
idstringEmail ID (em_…) of the received email.
objectstringAlways email.
fromstringSender address from the From header.
tostringInbound address that received the email.
subjectstring | nullSubject line.
created_atstringWhen Emailit received the email, in ISO 8601 with a UTC offset.
{
"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_idstringEvent 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.
typestringAlways email.loaded.
objectobjectThe open the event describes. Its fields are listed below.
data.objectobjectThe same object again, in the shape that the Events API returns in data.
Load object
idstringOpen ID (load_…).
objectstringAlways load.
email_idstringID of the email (em_…).
emailobjectThe email.
email.idstringEmail ID (em_…).
email.rcpt_tostringRecipient address.
email.mail_fromstringSender as stored on the email. It can include a display name.
email.subjectstring | nullSubject line.
email.created_atstringWhen Emailit accepted the email.
email.campaignobject | nullid and name of the campaign that sent the email, or null for emails sent through the API or SMTP.
email.metaobject | nullThe meta object sent with the email, or null.
contactobject | nullid and email of the contact with the recipient’s address in this workspace, or null if there is none.
ip_addressstringIP address of the request.
user_agentstring | nullUser agent of the client that made the request.
created_atstringWhen the pixel loaded, in ISO 8601 with a UTC offset.
{
"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_idstringEvent 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.
typestringAlways email.clicked.
objectobjectThe click the event describes. Its fields are listed below.
data.objectobjectThe same object again, in the shape that the Events API returns in data.
Click object
idstringClick ID (click_…).
objectstringAlways click.
email_idstringID of the email (em_…).
emailobjectThe email.
email.idstringEmail ID (em_…).
email.rcpt_tostringRecipient address.
email.mail_fromstringSender as stored on the email. It can include a display name.
email.subjectstring | nullSubject line.
email.created_atstringWhen Emailit accepted the email.
email.campaignobject | nullid and name of the campaign that sent the email, or null for emails sent through the API or SMTP.
email.metaobject | nullThe meta object sent with the email, or null.
linkobjectThe link that was clicked.
link.idstringLink ID (link_…).
link.urlstringDestination URL.
contactobject | nullid and email of the contact with the recipient’s address in this workspace, or null if there is none.
ip_addressstringIP address of the request.
user_agentstring | nullUser agent of the client that made the request.
created_atstringWhen the click happened, in ISO 8601 with a UTC offset.
{
"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_idstringEvent 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.
typestringAlways email.unsubscribed.
objectobjectThe campaign email the event describes. Its fields are listed below.
data.objectobjectThe same object again, in the shape that the Events API returns in data.
Email object
idstring | nullID (em_…) of the campaign email the contact acted on, or null if Emailit couldn’t match one.
objectstringAlways email.
fromstringSender of the campaign email.
tostringThe contact’s address.
subjectstringSubject of the campaign email.
campaignobject | nullid and name of the campaign, or null.
contactobject | nullid and email of the contact.
unsubscribed_atstringWhen the contact unsubscribed, in ISO 8601 with a UTC offset.
{
"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_idstringEvent 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.
typestringAlways email.resubscribed.
objectobjectThe campaign email the event describes. Its fields are listed below.
data.objectobjectThe same object again, in the shape that the Events API returns in data.
Email object
idstring | nullID (em_…) of the campaign email the contact acted on, or null if Emailit couldn’t match one.
objectstringAlways email.
fromstringSender of the campaign email.
tostringThe contact’s address.
subjectstringSubject of the campaign email.
campaignobject | nullid and name of the campaign, or null.
contactobject | nullid and email of the contact.
resubscribed_atstringWhen the contact resubscribed, in ISO 8601 with a UTC offset.
{
"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"
}
}
}