Event Types
List of all events you can subscribe to via webhooks.
Reloop supports the following active event types. Each delivery uses a consistent top-level envelope; event-specific fields live under data and use snake_case.
Email lifecycle
| Event | Description |
|---|---|
email.sent | Email accepted for delivery (immediate send) |
email.scheduled | Email accepted with a future scheduled_at (replaces email.sent for that message) |
email.delivered | Delivered to the recipient MTA |
email.bounced | Permanent delivery failure |
email.delivery_delayed | Transient failure / delay |
email.complained | Recipient marked as spam (feedback loop) |
email.failed | Permanent send failure before delivery (or message expired) |
email.opened | Recipient opened the email |
email.clicked | Recipient clicked a link in the email |
email.received | Inbound email successfully received |
Email data shape (outbound)
{
"email_id": "em_…",
"from": "Acme <onboarding@example.com>",
"to": ["user@example.com"],
"subject": "Hello",
"status": "delivered",
"error": {
"code": 550,
"message": "User unknown"
},
"url": "https://example.com/path"
}
erroris present on bounce, delay, complaint, and failure events.urlis present onemail.clicked.scheduled_atis present onemail.scheduled.
Inbound email.received data shape
{
"email_id": "in_…",
"mailbox_id": "mb_…",
"from": "sender@example.com",
"from_name": "Sender",
"to": ["inbox@yourdomain.com"],
"cc": [],
"subject": "Inbound Message",
"thread_id": "thr_…",
"has_attachments": false,
"is_spam": false,
"status": "received",
"message_id": "<rfc822@id>"
}
Domain lifecycle
| Event | Description |
|---|---|
domain.create | Domain created |
domain.update | Domain updated |
domain.delete | Domain deleted |
domain.undelete | Domain restored |
domain.verify | Domain DNS verified |
Domain data shape
{
"id": "dom_…",
"name": "example.com",
"status": "active"
}
API key lifecycle
| Event | Description |
|---|---|
api-key.create | API key created |
api-key.update | API key updated / enabled / rotated |
api-key.delete | API key deleted |
api-key.revoke | API key revoked (disabled) |
API key data shape
{
"api_key_id": "key_…",
"status": "disabled",
"action": "revoked"
}
status and action are optional and only set for some transitions.
Contact lifecycle
| Event | Description |
|---|---|
contact.create | Contact created |
contact.update | Contact updated |
contact.delete | Contact deleted |
contact.subscribed | Contact status set to subscribed |
contact.unsubscribed | Contact status set to unsubscribed |
contact.blocked | Contact status set to blocked |
contact.group.create | Contact group created |
contact.group.update | Contact group updated |
contact.group.delete | Contact group deleted |
Contact data shape
{
"id": "con_…",
"email": "contact@example.com",
"first_name": "Ada",
"last_name": "Lovelace",
"status": "subscribed"
}
Contact group data shape
{
"id": "grp_…",
"name": "VIP"
}
Envelope
{
"id": "whev_…",
"type": "email.delivered",
"created_at": "2026-07-22T12:00:00.000Z",
"data": { }
}
Coming soon (not subscribable yet)
These event IDs exist in the catalog but are inactive until the pipeline emits them:
| Event | Notes |
|---|---|
email.suppressed | Pre-send suppression event not wired yet |
api-key.rate_limited | Rate-limit publisher not wired yet |
Learn More
Was this page helpful?
- Need help? Contact Support.
- Chat with Reloop developers on Discord.
- Check out our changelog.
- Questions? Contact Sales.
- LLM? Read llms.txt.