List deliveries
Newest first: each delivery's status, attempts (with a short history), the last answer's status, time and first 1 KB, and the error. The body that was sent is kept 7 days (then payload is null); log entries are kept 30 days.
GET
/v1/webhooks/{id}/deliveriesRequest
| Method and path | GET/v1/webhooks/{id}/deliveries |
|---|---|
| Base URL | https://api.boxline.dev |
| Authentication | Your API key in the x-api-key header (or Authorization: Bearer). The examples read it from BOXLINE_API_KEY. |
Path parameters
| Name | Type | Default | Allowed values | Description |
|---|---|---|---|---|
idrequired | string | – | – |
Query parameters
| Name | Type | Default | Allowed values | Description |
|---|---|---|---|---|
after | string | – | – | The next value of the previous page (same filters and sort). Opaque; do not build it yourself. |
limit | integer | 20 | – | From 1 to 100. |
status | string | – | pending, delivered, failed |
curl "https://api.boxline.dev/v1/webhooks/$WEBHOOK_ID/deliveries?status=failed" \ -H "x-api-key: $BOXLINE_API_KEY"import { Boxline } from "@boxline/sdk";const bx = new Boxline(); // reads BOXLINE_API_KEY and BOXLINE_API_URLfor await (const d of bx.webhooks.deliveries("WEBHOOK_ID", { status: "failed" })) { console.log(d.id, d.eventType, d.attempts, d.errorCode, d.responseStatus);}from boxline import Boxlinebx = Boxline() # reads BOXLINE_API_KEY and BOXLINE_API_URLfor d in bx.webhooks.deliveries("WEBHOOK_ID", status="failed"): print(d["id"], d["eventType"], d["attempts"], d["errorCode"], d["responseStatus"])Responses
200 OK
A page of deliveries.
Fields
| Name | Type | Default | Allowed values | Description |
|---|---|---|---|---|
data | object[] | – | – | |
data[].id | string | – | – | |
data[].endpointId | string | – | – | |
data[].eventId | string | – | – | The event's id (the same on every endpoint and every attempt). |
data[].eventType | string | – | – | |
data[].test | boolean | – | – | |
data[].status | string | – | pending, delivered, failed | pending: waiting for its next attempt; failed: no more attempts. |
data[].attempts | integer | – | – | |
data[].nextAttemptAt | string | null | – | – | Format: date-time. |
data[].lastAttemptAt | string | null | – | – | Format: date-time. |
data[].deliveredAt | string | null | – | – | Format: date-time. |
data[].responseStatus | integer | null | – | – | The last answer's HTTP status (null when there was none). |
data[].responseBody | string | null | – | – | The first 1 KB of the last answer (kept 7 days). |
data[].durationMs | integer | null | – | – | |
data[].error | string | null | – | – | Why the last attempt failed. |
data[].errorCode | string | null | – | bad_status, gone, timeout, connection_failed, tls_failed, address_not_allowed, gateway_unavailable, endpoint_disabled, project_suspended, payload_expired, queue_full, signing_failed, null | Why a delivery (or an attempt) failed; null when delivered. The last five are deliveries that were never sent (queue_full: the project already had 10,000 deliveries waiting). |
data[].history | object[] | – | – | The last 20 attempts. |
data[].history[].at | string | – | – | Format: date-time. |
data[].history[].status | integer | null | – | – | |
data[].history[].durationMs | integer | – | – | |
data[].history[].error | string | null | – | – | |
data[].history[].errorCode | string | null | – | bad_status, gone, timeout, connection_failed, tls_failed, address_not_allowed, gateway_unavailable, endpoint_disabled, project_suspended, payload_expired, queue_full, signing_failed, null | Why a delivery (or an attempt) failed; null when delivered. The last five are deliveries that were never sent (queue_full: the project already had 10,000 deliveries waiting). |
data[].payload | any | – | – | The body that was sent (the event); null after 7 days. |
data[].createdAt | string | – | – | Format: date-time. |
next | string | null | – | – | Pass it back as after for the next page; null on the last page. |
{ "data": [ { "id": "dlv_4fJx0aQm2Lk9Pz7N", "endpointId": "…", "eventId": "…", "eventType": "…", "test": false, "status": "pending", "attempts": 0, "nextAttemptAt": "2026-09-29T10:00:00.000Z", "lastAttemptAt": "2026-09-29T10:00:00.000Z", "deliveredAt": "2026-09-29T10:00:00.000Z", "responseStatus": 0, "responseBody": "…", "durationMs": 0, "error": "…", "errorCode": "bad_status", "history": [ { "at": "2026-09-29T10:00:00.000Z", "status": 0, "durationMs": 0, "error": "…", "errorCode": "bad_status" } ], "payload": null, "createdAt": "2026-09-29T10:00:00.000Z" } ], "next": "eyJvIjoiY3JlYXRlZF9kZXNjIiwidCI6IjIwMjYtMDktMjlUMTA6MDA6MDAuMTIzNDU2WiIsImkiOiI2YzFmIn0"}Errors
Errors have a matching HTTP status and the same body. code is stable, so check it in your code; message is for people. See Errors and request ids.
| Status | Codes | When |
|---|---|---|
| 400 Bad Request | invalid_request, invalid_json, invalid_cursor, invalid_idempotency_key, invalid_extension, variables_with_extensions, terms_not_accepted, invalid_reset_token, invalid_confirmation_code, wrong_password, no_password, invalid_next, invalid_oauth_token | The request is not valid. |
| 401 Unauthorized | unauthorized | Missing or invalid API key. |
| 404 Not Found | not_found, invite_not_found, provider_unavailable | No such thing in this project (or organization), or no such route. |
{ "error": { "code": "not_found", "message": "session not found", "requestId": "req_4fJx0aQm2Lk9Pz7N" }}Learn more
These docs describe a beta API. Endpoints, fields and SDK methods may change before general availability; breaking changes will be listed in the changelog.