---
title: "Replay a webhook delivery"
method: POST
path: "/webhook-deliveries/{id}/replay"
tags: ["Webhooks"]
---

# Replay a webhook delivery

`POST /webhook-deliveries/{id}/replay`

## Request

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

Resets a completed delivery (delivered, terminal, or exhausted) so the worker will attempt it again. Reuses the frozen event bytes and the occurrence-time endpoint configuration version; each attempt is signed with a fresh timestamp. Never creates a new domain event. Open deliveries (pending or retrying), deliveries outside the fixed 30-day retention window, and deliveries whose endpoint or frozen config version has been deleted return 409. A replayed exhausted delivery retains its attempt history, so if the replay attempt fails retryably it may exhaust again immediately: replay grants a fresh attempt, not a fresh retry budget.

## Path parameters

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

## Response `200`

Delivery reset to pending for a fresh attempt.

- WebhookDelivery
  - `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

## 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.manage or a family read scope.
- `404`: Delivery not found.
- `409`: Cannot replay: delivery is still open, its 30-day replay window expired, or its destination no longer exists.

## Changes

- **2026-10-19** `c34152c38176`: 4 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
  - added the optional property `error/upgrade` to the response with the `409` status

[Operation history](https://skmtc.dev/cavuno/apis/cavuno-v1-rest-api/changes/webhook-deliveries/:id/replay/post.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)
