Pagination & filtering
List endpoints return newest items first and use cursor pagination:
GET /v1/messages?limit=50&status=FAILED&createdAfter=2026-10-01T00:00:00Z
{
"data": [ { "id": "msg_...", "...": "..." } ],
"pagination": { "nextCursor": "MjAyNi0xMC0wOVQxMDo...", "hasMore": true }
}
Fetch the next page with ?cursor=<nextCursor> and the same filters. Stop when hasMore is false
(nextCursor is then null). limit is 1–100 (default 25). Cursors are opaque; do not build or modify them.
Cursor pagination is stable while new items arrive: items created after you started paging do not shift pages.
| Endpoint | Filters |
|---|---|
GET /v1/instances | externalReference (exact), status |
GET /v1/messages | instanceId, direction (outbound/inbound), status, clientReference, createdAfter, createdBefore (ISO 8601 with offset) |
GET /v1/events | type, instanceId |
GET /v1/webhooks/{id}/deliveries | status (pending, succeeded, failed, dead), eventType |
GET /v1/webhooks and GET /v1/keys return all items ({ "data": [...] }) without pagination.
SDK helpers iterate all pages for you: client.messages.listAll(...) (TypeScript) and
client.Messages.ListAllAsync(...) (.NET).