# Retrieve a webhook delivery

Source: https://kirora.io/docs/api/reference/getWebhookDelivery

`GET /v1/webhooks/deliveries/{id}`

Requires an API key with the `webhooks:read` scope. [About keys and scopes](https://kirora.io/docs/api/reference/authentication)

Works with integration, agent and partner keys.

Returns one delivery: the one a test or a redelivery queued, to watch it move from `pending` to `delivered` or `failed`.

## Path parameters

- `id` (string, required, uuid) — The delivery's id.

## Header parameters

- `Kirora-Workspace` (string, optional, pattern `^[A-Za-z0-9._:-]{1,128}$`) — Partner keys only: the child workspace to act in, by the external id the partner gave it. Without it, a partner key acts in its own workspace. Any other key that sends it is refused with 403, and an unknown workspace is 404.

## Returns

Returns `200 OK` with a `WebhookDelivery` in `data`. Otherwise returns an error; [Errors](https://kirora.io/docs/api/reference/errors) lists every code and which to retry.

- `id` (string, required, uuid)
- `webhookId` (string, required, uuid) — The webhook (endpoint) it was sent to.
- `eventId` (string, required, uuid) — The event; the same across retries.
- `eventType` (string, required, one of `contact.created`, `contact.unsubscribed`, `contact.consent_changed`, `form.submitted`, `campaign.sent`, `journey.enrolled`, `message.delivered`, `message.bounced`, `message.complained`, `message.opened`, `message.clicked`, `message.failed`, `message.skipped`, `message.sent`, `journey.action_reached`, `webhook.test`) — The event type, such as `message.delivered`.
- `attempt` (integer, required) — Which attempt this was, starting at 1.
- `status` (string, required, one of `pending`, `delivered`, `failed`)
- `nextAttemptAt` (string | null, required, date-time) — When a pending delivery is tried next. Null once delivered or failed, and while its webhook is paused or disabled: it then waits until the webhook is active.
- `responseStatus` (integer | null, required) — The HTTP status your endpoint returned; null if it did not respond.
- `failureReason` (string | null, required) — Why the attempt failed: `HTTP 500` for an error reply; with no reply, the network error, such as `fetch failed: ECONNREFUSED`, `fetch failed: ENOTFOUND`, `fetch failed: CERT_HAS_EXPIRED` or `No reply within 5 seconds`.
- `requestBody` (string | null, required) — The exact body sent, while the delivery is pending or failed; null once delivered, when it is dropped.
- `responseBody` (string | null, required) — The first 1 KB of the endpoint's last reply.
- `createdAt` (string, required, date-time)
- `deliveredAt` (string | null, required, date-time) — When your endpoint accepted it.

## Example

```bash
curl https://api.kirora.io/v1/webhooks/deliveries/018f2a4e-6b1c-7d3e-9f40-37386ae05a6b \
  -H "Authorization: Bearer $KIRORA_API_KEY"
```

Response `200`:

```json
{
  "data": {
    "id": "0192f3f2-3c4d-7e5f-8a61-7c8d9e0f1a2b",
    "webhookId": "0192f3f1-2b3c-7d4e-9f50-6b7c8d9e0f1a",
    "eventId": "0192f3f3-4d5e-7f60-9b72-8d9e0f1a2b3c",
    "eventType": "contact.created",
    "attempt": 1,
    "status": "delivered",
    "nextAttemptAt": null,
    "responseStatus": 200,
    "failureReason": null,
    "requestBody": null,
    "responseBody": "ok",
    "createdAt": "2026-10-02T14:05:00.000Z",
    "deliveredAt": "2026-10-02T14:05:01.000Z"
  }
}
```
