List deliveries
GET/api/v1/webhooks/{id}/deliveries
scope
webhooks:managePaginatedThe endpoint’s delivery ledger, newest first, with cursor pagination. One row per event per endpoint — retries and manual redeliveries update the row rather than adding one. Filter by status. Retained for 30 days.
Path parameters
| Name | Type | Description |
|---|---|---|
idrequired | string (uuid) | Webhook endpoint id |
Query parameters
| Name | Type | Description |
|---|---|---|
limitoptional | integer | Page size, 1–100Default: 20 |
cursoroptional | string | The `next_cursor` from the previous page |
statusoptional | string (enum) | Only deliveries in this statependingclaimedsucceededfailedexhausted |
Request
curl "https://your-crm.example.com/api/v1/webhooks/3a4b5c6d-7e8f-4a9b-8c0d-1e2f3a4b5c6d/deliveries?status=succeeded&limit=20" \
-H "Authorization: Bearer $RAABTA_API_KEY"Response · 200 OK
{
"data": [
{
"id": "7c8d9e0f-1a2b-4c3d-8e4f-5a6b7c8d9e0f",
"event_id": "evt_5f1c2a9e8b7d4c3f9a2b1c0d9e8f7a6b",
"event_type": "contact.created",
"status": "succeeded",
"attempts": 1,
"next_attempt_at": null,
"last_status_code": 200,
"last_error": null,
"response_snippet": "{\"ok\":true}",
"duration_ms": 182,
"delivered_at": "2026-09-02T10:06:00.000Z",
"created_at": "2026-09-02T10:05:59.000Z"
}
],
"meta": {
"next_cursor": null,
"has_more": false,
"limit": 20
}
}Response
Wrapped in { data: [...], meta }| Name | Type | Description |
|---|---|---|
idrequired | string (uuid) | UUID |
event_idrequired | string | The `evt_…` id in the envelope this delivery carries |
event_typerequired | string | An event type from the catalogue, e.g. contact.created |
statusrequired | string (enum) | pending = waiting for its next attempt; claimed = in flight; succeeded; failed = permanent; exhausted = out of attemptspendingclaimedsucceededfailedexhausted |
attemptsrequired | integer | |
next_attempt_atrequired | string (date-time) | null | When a pending delivery is next due |
last_status_coderequired | integer | null | HTTP status of the last attempt |
last_errorrequired | string | null | |
response_snippetrequired | string | null | First 1 KB of the last response body |
duration_msrequired | integer | null | |
delivered_atrequired | string (date-time) | null | |
created_atrequired | string (date-time) | ISO 8601 timestamp |
Errors
| Status | Code | When |
|---|---|---|
| 400 | bad_request | The request could not be parsed: malformed JSON, an invalid cursor, or a query parameter of the wrong shape. |
| 400 | validation_error | The body or query failed validation. `details` lists each failing field with a `path` and a `message`. |
| 401 | unauthorized | No usable API key: the Authorization header is missing or malformed, or the key is unknown, revoked or expired. The three are deliberately indistinguishable. |
| 403 | forbidden | The key is valid but lacks the scope this endpoint requires, or the request came from an address outside the key’s IP allowlist. The message says which. |
| 403 | account_suspended | The account this key belongs to is suspended. Rotating the key will not help; contact support. |
| 404 | not_found | No such resource in this account. A resource that exists in another account also returns this. |
| 429 | rate_limited | The per-key budget, or the per-IP budget for failed authentication, is exhausted. Honour `Retry-After` before retrying. |
| 500 | internal | Something failed on our side. Safe to retry with the same Idempotency-Key; quote `request_id` if it persists. |