TANITARDevelopers
Webhooks

Replay

Send a settled delivery again, or recover every dead delivery of an endpoint after an outage.

A replay sends a delivery again under the same webhook-id, so your receiver recognises it as a repeat of a delivery it may already have processed, not as a new event. Every replayed request carries the header tanitar-replay: true.

Replays are started from the dashboard's delivery log by an administrator of your organization (org:admin). The dashboard calls the routes below with the administrator's session; they do not accept an API key. See Webhooks in the dashboard.

Replay one delivery

POST /dashboard/v1/webhooks/deliveries/:deliveryId/replay reopens one delivery. It is accepted when:

  • the delivery is settled: delivered or dead. A pending delivery is refused with 409 WEBHOOK_DELIVERY_IN_FLIGHT;
  • the delivery has been replayed fewer than 10 times. The eleventh replay is refused with 409 WEBHOOK_REPLAY_LIMIT;
  • its endpoint is active. Otherwise 409 WEBHOOK_ENDPOINT_INACTIVE.

The response has responseType ACCEPTED and data { deliveryId, cycle, status: "pending" }.

Replay every dead delivery of an endpoint

POST /dashboard/v1/webhooks/endpoints/:endpointId/replay-dead reopens the endpoint's dead deliveries, oldest first, in one request:

{ "limit": 200 }

limit is optional, from 1 to 500, and defaults to 500. At most that many dead deliveries are considered; any that already reached the limit of 10 replays is skipped but still counts toward limit. The endpoint must be active (409 WEBHOOK_ENDPOINT_INACTIVE otherwise). The response has responseType ACCEPTED and data { endpointId, accepted }, where accepted lists the delivery ids that were reopened. Repeat the request until accepted is empty to drain a larger backlog.

What a replay does

  1. The delivery goes back to pending in a new cycle, and its replay count increases by one.
  2. The first attempt of the new cycle is sent immediately, with tanitar-delivery-attempt: 1 and tanitar-replay: true.
  3. If it fails, the new cycle walks the full retry ladder again, and every retry in that cycle also carries tanitar-replay: true.
  4. The body is the original envelope, unchanged. The signature is computed with the endpoint's current secrets, so a delivery that failed before a rotation verifies with the new secret.

Earlier attempts stay in the delivery's history; the log shows each attempt as initial, retry or replay. Every replay is recorded in your organization's audit log with the administrator who started it.

Recovering from an outage

  1. Fix your receiver and confirm it answers 2xx, for example with a test delivery.
  2. If you disabled the endpoint during the outage, enable it again.
  3. Replay the endpoint's dead deliveries in batches until none is accepted.
  4. Deduplicate on webhook-id: some of the replayed deliveries may already have reached you before the outage was noticed.

On this page