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#
{
"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#
curl -X POST https://voice-api.edesy.in/v1/webhooks/subscriptions/{id}/deliveries/{delivery_id}/replay \
-H "Authorization: Bearer $EDESY_KEY"
Replay many#
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#
- Press Test on the subscription (or POST
/v1/webhooks/subscriptions/{id}/test) and read the status code. - Make sure the URL is public HTTPS with a valid certificate.
- Return
2xxbefore doing slow work. - Check
response_codeanderrorin the delivery log. - Replay the failed range once fixed.