---
title: "Retrieve a webhook delivery"
method: GET
path: "/webhook-deliveries/{id}"
tags: ["Webhooks"]
---

# Retrieve a webhook delivery

`GET /webhook-deliveries/{id}`

## Request

- Base URL: `https://api.cavuno.com/v1`
- URL: `https://api.cavuno.com/v1/webhook-deliveries/{id}`
- Auth: HTTP bearer

Returns a delivery including its most recent attempt history (≤500 attempts, ascending by attempt_number). `attempt_count` is authoritative: when it exceeds `attempts.length`, older attempts were truncated. Never exposes lease fields or serialized event bodies.

## Path parameters

- `id` string, required: The webhook delivery ID.

## Response `200`

Successful response. `attempts` holds the most recent ≤500 attempts in ascending order; `attempt_count > attempts.length` implies truncation.

- WebhookDeliveryDetail
  - `id` string, required
  - `object` 'webhook_delivery', required
  - `event_id` string, required: Stable public event id (e.g. evt_…). Unchanged across retries and replay.
  - `event_type` string, required
  - `endpoint_id` string, required
  - `status` 'pending' | 'retrying' | 'delivered' | 'terminal' | 'exhausted', required
  - `terminal_reason` 'http_410' | 'permanent_response' | 'invalid_reference' | 'endpoint_paused' | 'retry_attempt_limit' | 'delivery_window_expired' | 'retention_expired' | 'endpoint_retired', nullable, required
  - `replayable` boolean, required
  - `replay_expires_at` string, required
  - `payload_purged_at` string, nullable, required
  - `attempt_count` integer, required
  - `next_attempt_at` string, nullable, required
  - `first_attempt_at` string, nullable, required
  - `last_attempt_at` string, nullable, required
  - `completed_at` string, nullable, required
  - `created_at` string, required
  - `attempts` WebhookDeliveryAttempt[], required
    - `attempt_number` integer, required
    - `started_at` string, required
    - `duration_ms` integer, required
    - `outcome` 'delivered' | 'retryable' | 'terminal', required
    - `status_code` integer, nullable, required
    - `status_class` string, required
    - `diagnostic` string, required: Sanitized diagnostic recorded at attempt time. Never a response body or secret.

## Other responses

- `402`: The board's plan does not include webhooks (`plan_upgrade_required`). Webhooks require a paid plan, Starter and above.
- `403`: Missing webhooks.read or a family read scope.
- `404`: Delivery not found.

## Changes

- **2026-10-19** `c34152c38176`: 3 info
  - added the optional property `error/upgrade` to the response with the `402` status
  - added the optional property `error/upgrade` to the response with the `403` status
  - added the optional property `error/upgrade` to the response with the `404` status

[Operation history](https://skmtc.dev/cavuno/apis/cavuno-v1-rest-api/changes/webhook-deliveries/:id/get.md)

---

[API](https://skmtc.dev/cavuno/apis/cavuno-v1-rest-api.md) · [All operations](https://skmtc.dev/cavuno/apis/cavuno-v1-rest-api/llms.txt) · [OpenAPI document](https://skmtc.dev/cavuno/apis/cavuno-v1-rest-api/revisions/d5974dabff14?raw)
