Skip to main content

Event Reference

Each webhook request is a JSON list of events. Every event has the same shape; data.details holds what's specific to the event type.

Event types​

TypeSent when
deliveredThe recipient's mail server accepted the email. This doesn't mean it reached the inbox; the server may still file it as spam.
deferredThe recipient's server temporarily refused the email. SendMero keeps trying, so a delivered, bounced or expired event usually follows.
bouncedThe recipient's server permanently refused the email.
expiredSendMero stopped trying after the email was deferred for too long.
complainedThe recipient marked the email as spam, where their mailbox provider reports this.
rejectedSendMero accepted the request but couldn't send the email, for example because the API key was revoked or the sending domain isn't ready. details.reason says why.
suppressedComing soon. The email wasn't sent because the recipient is on your suppression list.
unsubscribedThe recipient unsubscribed through an unsubscribe link. details.unsubscribe.scope is group (one of your unsubscribe groups, or the sending domain's own group) or workspace (all your mail), and details.unsubscribe.group names the group.
resubscribedAn unsubscribe was removed, because the recipient switched a group back on or resubscribed, or because you removed the entry in the dashboard. details.resubscribe.scope and details.resubscribe.group say which unsubscribe it was.

When you choose All events, new types are included automatically, so ignore types your code doesn't know.

Fields​

FieldTypeMeaning
idstringUnique event ID (evt_…). Use it to ignore duplicates.
typestringOne of the types above.
created_atstringWhen SendMero recorded the event (ISO 8601, UTC).
testbooleanOnly present, as true, on events from the Test button.
data.message_idstringThe id returned when you sent the email (msg_…).
data.recipientstring or nullThe recipient this event is about.
data.domainstring or nullYour sending domain.
data.occurred_atstringWhen it happened (ISO 8601, UTC). Use this to order events.
data.attemptnumberThe delivery attempt this event came from.
data.metadataobjectThe metadata you sent with the email, or {}.
data.detailsobjectDetails for this event type, described below. May be {}.

details​

details.smtp​

Included when the recipient's mail server replied.

FieldTypeMeaning
codenumber or nullSMTP status code, for example 250 or 550.
enhanced_codestring or nullEnhanced status code, for example 5.7.1.
responsestring or nullThe server's reply text.
remote_ipstring or nullThe address of the server that replied.

details.bounce​

Included on bounced and expired events (expired is always soft).

FieldTypeMeaning
typestringhard (the address won't work, stop sending to it), soft (a temporary problem that lasted too long), block (refused because of the sender or content, for example reputation) or admin (refused by a policy).
classificationstring or nullA more specific reason, when known.

details.reason​

A short machine-readable reason, on events that have one but no bounce, such as rejected (for example domain_not_ready:…).

Example: delivered​

[
{
"id": "evt_8d2f0c1e5b7a4f6d9e3c2b1a0f9e8d7c",
"type": "delivered",
"created_at": "2026-09-25T10:00:04.512Z",
"data": {
"message_id": "msg_fb8076ffc18c225d4fa617f8b00ed038",
"recipient": "someone@example.com",
"domain": "mail.yourdomain.com",
"occurred_at": "2026-09-25T10:00:03.981Z",
"attempt": 1,
"metadata": { "order_id": "88231" },
"details": {
"smtp": { "code": 250, "enhanced_code": "2.0.0", "response": "OK", "remote_ip": "142.250.27.26" }
}
}
}
]

See Webhooks for setting up endpoints, retries and securing your endpoint.