# Retries and Replay

> How Edesy retries failed webhook deliveries (30 s, 1 m, 2 m, 4 m, 8 m; 6 attempts), how to read the delivery log, and how to replay one or many deliveries.

Source: https://edesy.in/docs/voice-api/webhooks/retries-and-replay

A subscription delivery succeeds when your endpoint returns any `2xx` within 5 seconds. Anything else is retried with exponential backoff, 30 seconds, then 1, 2, 4 and 8 minutes, for 6 attempts in all. Every attempt is recorded in the subscription's delivery log, and you can replay a single delivery or every failed one in a time range once your endpoint is fixed.

## Retry schedule

| Attempt | Sent after the previous one fails by |
|---|---|
| 1 | Immediately |
| 2 | 30 seconds |
| 3 | 1 minute |
| 4 | 2 minutes |
| 5 | 4 minutes |
| 6 | 8 minutes |

After the sixth failure the delivery is marked `failed` and stays in the log for replay. The target URL is re-validated on every attempt, so an endpoint that now resolves to a private address is refused.

Status callbacks are also retried with backoff, a smaller number of times, and are never allowed to delay the call itself.

## Delivery log

`GET https://voice-api.edesy.in/v1/webhooks/subscriptions/{id}/deliveries?limit=50`

```json
{
  "data": [
    {
      "id": "7c2a9e10-0000-4000-8000-000000000000",
      "subscription_id": "0b9f5d2c-0000-4000-8000-000000000000",
      "event_type": "call.completed",
      "call_sid": "CA_6f1c2d3e-0000-4000-8000-000000000000",
      "external_id": "crm-lead-77812",
      "status": "pending",
      "attempts": 2,
      "max_attempts": 6,
      "response_code": 503,
      "error": "webhook returned status 503",
      "next_retry_at": "2026-10-28T11:21:02Z",
      "created_at": "2026-10-28T11:19:02Z"
    }
  ]
}
```

| `status` | Meaning |
|---|---|
| `pending` | Waiting for its next attempt |
| `delivered` | Your endpoint returned `2xx` |
| `failed` | All attempts used |

## Replay one delivery

```bash
curl -X POST https://voice-api.edesy.in/v1/webhooks/subscriptions/{id}/deliveries/{delivery_id}/replay \
  -H "Authorization: Bearer $EDESY_KEY"
```

## Replay many

```bash
curl -X POST https://voice-api.edesy.in/v1/webhooks/subscriptions/{id}/deliveries/replay \
  -H "Authorization: Bearer $EDESY_KEY" \
  -H "Content-Type: application/json" \
  -d '{ "status": "failed", "since": "2026-10-28T00:00:00Z", "until": "2026-10-28T12:00:00Z" }'
```

| Field | Description |
|---|---|
| `status` | Which deliveries to replay, for example `failed` |
| `since`, `until` | RFC 3339 time range |

One bulk replay re-queues up to 10,000 deliveries. Replayed events are identical to the originals, so make your handler idempotent: key on `event` plus `data.call_sid`.

## Checklist when deliveries fail

1. Press **Test** on the subscription (or `POST /v1/webhooks/subscriptions/{id}/test`) and read the status code.
2. Make sure the URL is public HTTPS with a valid certificate.
3. Return `2xx` before doing slow work.
4. Check `response_code` and `error` in the delivery log.
5. Replay the failed range once fixed.
