Events
Read the event stream behind webhooks: deliveries, bounces, opens and more.
List events
Returns the events in your workspace, newest first. Every webhook delivery is built from one of these events, so you can use this endpoint to backfill events your endpoint missed. Requires an API key with full scope.
/eventsQuery parameters
pageintegerPage number, starting at 1. Default 1. Pages deeper than 2,500 events ((page - 1) × limit > 2500) return 422.
limitintegerEvents per page, from 1 to 100. Default 100.
typestringEvent type, or a comma-separated list of types, for example email.delivered,email.bounced. See Event types.
include_databooleanSet to true to include each event’s data payload. Default false, which returns only object, id, type and created_at.
matchstringall (default) requires every filter. or matches any filter. See Filtering.
orderstringSort key for this list. See the sort keys below.
directionstringasc or desc.
Filters and sort
List filters are one layer of key.condition=value query parameters. See Filtering for match, order, direction and the condition list per type.
Filter keys
| Key | Type | Conditions | Notes |
|---|---|---|---|
type | string | exact, not_exact, contains, not_contains, starts_with, ends_with, empty, not_empty | |
created_at | date | exact, before, after, empty, not_empty |
Sort keys
Pass order as one of these keys and direction as asc or desc: type, created_at
Without a created_at filter, the list only covers the last 2 days. To look further back, add one, for example created_at.after=2026-09-01T00:00:00Z. Older events are available for as long as your plan’s data retention keeps them.
Returns
Returns 200 OK with the events in data, plus next_page_url and previous_page_url (null at either end). The page URLs keep type, limit and include_data.
Returns 422 with code: "events_offset_too_large" when the page is too deep. Narrow the date range or the types instead of paging further.
{
"data": [
{
"object": "event",
"id": "evt_2xLc9Rr4Tn6Wb1Qm8Ks3Vf0Hd7a",
"type": "email.delivered",
"created_at": "2026-10-01T10:02:15.912000+00:00"
}
],
"next_page_url": "/v2/events?page=2&limit=100&type=email.delivered",
"previous_page_url": null
}{
"data": [
{
"object": "event",
"id": "evt_2xLc9Rr4Tn6Wb1Qm8Ks3Vf0Hd7a",
"type": "email.delivered",
"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:14.307000+00:00",
"created_at": "2026-10-01T10:02:11.583000+00:00"
}
},
"created_at": "2026-10-01T10:02:15.912000+00:00"
}
],
"next_page_url": "/v2/events?page=2&limit=100&type=email.delivered&include_data=true",
"previous_page_url": null
}{
"error": "Page is too deep. Narrow the type or date filter, or open an earlier page.",
"code": "events_offset_too_large"
}Retrieve an event
Returns one event with its full data payload. The id is the same value webhooks send as event_id, so you can look up any event you received. Requires an API key with full scope.
/events/:idPath parameters
idstringRequiredEvent ID, for example evt_2xLc9Rr4Tn6Wb1Qm8Ks3Vf0Hd7a.
Returns
Returns 200 OK with the event: object (event), id, type, data and created_at. data.object has the same shape as in the webhook payload for that type; see the webhook event reference.
Returns 404 with error: "Event not found" if the ID doesn’t exist in your workspace.
{
"object": "event",
"id": "evt_2xLc9Rr4Tn6Wb1Qm8Ks3Vf0Hd7a",
"type": "email.delivered",
"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:14.307000+00:00",
"created_at": "2026-10-01T10:02:11.583000+00:00"
}
},
"created_at": "2026-10-01T10:02:15.912000+00:00"
}{
"error": "Event not found"
}