# Delivery

## Delivery Behavior

* Requests are sent as HTTP POST with `Content-Type: application/json`
* Your endpoint must respond with `2xx` within 30 seconds
* Non-2xx responses or timeouts trigger retries

## Retry Policy

Failed deliveries are retried with exponential backoff:

| Attempt | Delay      |
| ------- | ---------- |
| 1       | Immediate  |
| 2       | 1 minute   |
| 3       | 5 minutes  |
| 4       | 30 minutes |
| 5       | 2 hours    |
| 6       | 12 hours   |

After 6 failed attempts, the delivery is moved to the dead letter queue (DLQ).

## Dead Letter Queue

Failed deliveries are stored in the DLQ for manual inspection and replay.

### DLQ Endpoints

| Method | Path                                       | Description        |
| ------ | ------------------------------------------ | ------------------ |
| GET    | `/webhooks/:id/dead-letters`               | List dead letters  |
| GET    | `/webhooks/:id/dead-letters/:dlqId`        | Get dead letter    |
| POST   | `/webhooks/:id/dead-letters/:dlqId/replay` | Replay delivery    |
| DELETE | `/webhooks/:id/dead-letters/:dlqId`        | Delete dead letter |
| GET    | `/webhooks/:id/dead-letters/stats`         | DLQ stats          |

### Replay a Failed Delivery

```bash
curl -X POST https://rest-api.tokenbot.com/v1/webhooks/wh_123/dead-letters/dlq_456/replay \
  -H "X-API-Key: tb_live_your_key"
```

## Idempotency

Each event includes a unique `event_id`. Use this to deduplicate events in case of retries or replays.

## Disabling Webhooks

If your endpoint fails consistently (10+ consecutive failures), the webhook may be automatically deactivated. You'll receive an email notification.
