import { Aside } from "@astrojs/starlight/components";

## Al menos una entrega, nunca cero

Cada evento se encola en una cola durable (no se pierde si tu endpoint está
caído en el momento). Eso significa **al menos una entrega**: en un
reintento, o si tu servidor confirma la entrega pero la confirmación se
pierde en el camino, puedes recibir el mismo evento más de una vez. Por
eso deduplicar por el `id` del evento no es opcional, es parte del
contrato: ver [Verificar firma](/webhooks/verificar-firma/).

## Reintentos

Si tu endpoint no responde con un `2xx` (incluido un timeout, a los 10
segundos), NovaFE reintenta con esta escalera de espera:

```
10 segundos → 1 minuto → 5 minutos → 30 minutos → 2 horas → 6 horas
```

Después de **7 intentos** sin éxito, la entrega pasa a `dead` y NovaFE deja
de reintentarla sola.

<Aside type="tip" title="Recupera una entrega muerta manualmente">
  `POST /api/v1/webhooks/{id}/deliveries/{deliveryId}/retry` solo funciona sobre
  una entrega en estado `dead` (`404` en cualquier otro caso). La vuelve a poner
  en cola de inmediato, con los intentos y el backoff en cero, útil después de
  corregir lo que estaba fallando en tu endpoint.
</Aside>

## El log de entregas

```
GET /api/v1/webhooks/{id}/deliveries?page=1&pageSize=20
```

```json
{
  "items": [
    {
      "id": "...",
      "eventId": "evt_018f3c2a1e6b7d40a5c8e1d2b3a4f506",
      "eventType": "ecf.accepted",
      "status": "delivered",
      "attempts": 1,
      "lastStatusCode": 200,
      "lastError": null,
      "nextAttemptAt": null,
      "createdAt": "2026-09-07T14:03:11-04:00",
      "updatedAt": "2026-09-07T14:03:12-04:00"
    }
  ],
  "totalCount": 1,
  "page": 1,
  "pageSize": 20
}
```

`status` es `pending`, `delivered` o `dead`. El log conserva cada entrega
30 días.

## Si tu endpoint falla demasiado, se pausa solo

Un endpoint con **20 fallos consecutivos** se deshabilita automáticamente:
NovaFE deja de intentar entregarle nada, para no insistir contra un
endpoint que claramente dejó de funcionar. Verás `enabled: false` y un
`disabledReason` al consultar el endpoint.

<Aside type="caution" title="Reactivarlo es manual">
  NovaFE no vuelve a intentarlo solo. Corrige lo que estaba fallando y
  reactívalo con:

```json
PATCH /api/v1/webhooks/{id}
{ "enabled": true }
```

Esto también reinicia el contador de fallos consecutivos a cero.

</Aside>