Every meaningful action appends an event. It is the same stream that drives webhooks, and it is queryable after the fact.
| Event | Fires when |
|---|---|
message.received |
Inbound mail stored |
message.received.spam |
…and it was classified spam |
message.received.unauthenticated |
…and it failed authentication |
message.sent |
Accepted for delivery |
message.delivered |
Confirmed delivered |
message.bounced |
Rejected by the recipient's server |
message.complained |
Marked as spam by the recipient |
message.rejected |
Refused before sending |
domain.verified |
A custom domain finished verifying |
Inbox events — label.added, label.removed — are on a separate stream.
curl "https://api.carlyemail.com/v0/inboxes/$INBOX_ID/events?limit=50" \
-H "Authorization: Bearer $CARLYEMAIL_API_KEY"
Events are written before any delivery is attempted, so a webhook that never arrived is still recoverable from here. If an endpoint was down for an hour, this is how you find out what you missed.
Metrics
GET /v0/metrics/events aggregates the same stream into counts over time, per
organization and per pod.
Note
Metrics buckets are per minute. A period shorter than 60 seconds is refused
rather than silently rounded.