> ## Documentation Index
> Fetch the complete documentation index at: https://docs.getnexor.ai/llms.txt
> Use this file to discover all available pages before exploring further.

# Reintentos y Manejo de Errores

## Confirmacion de entregas

Tu endpoint debe responder con un codigo de estado `2xx` dentro de **30 segundos** para confirmar la recepcion. Cualquier otro codigo de estado (o un timeout) se trata como un fallo.

## Politica de reintentos

Cuando una entrega falla, Nexor reintenta con backoff exponencial:

| Intento       | Retraso despues del fallo |
| ------------- | ------------------------- |
| 1er reintento | 1 minuto                  |
| 2do reintento | 5 minutos                 |
| 3er reintento | 30 minutos                |

Despues de 3 reintentos fallidos, la entrega se marca como `failed` y no se realizan mas intentos.

Los reintentos solo se activan para:

* Errores de servidor **5xx**
* Respuestas de limite de tasa **429**
* **Timeouts** (sin respuesta en 30s)
* **Errores de red** (conexion rechazada, fallo de DNS)

Los errores **4xx** (excepto 429) **no se reintentan**, ya que indican un problema permanente del lado del cliente (URL incorrecta, fallo de autenticacion, etc.).

## Desactivacion automatica

Si un webhook acumula demasiados fallos consecutivos, Nexor lo desactiva automaticamente para evitar desperdiciar recursos. Puedes reactivarlo desde el panel, el contador de fallos se reinicia al reactivar.

## Registros de entrega

Cada entrega (exitosa o fallida) se registra y es visible en el panel bajo la pestana **Entregas** de tu webhook. Cada entrada del registro incluye:

* URL de la solicitud, headers y cuerpo
* Estado de la respuesta, headers y cuerpo
* Duracion en milisegundos
* Numero de intento
* Mensaje de error (si fallo)

## Idempotencia

Tu endpoint puede recibir el mismo evento mas de una vez (ej. si tu servidor responde lentamente y Nexor reintenta). Usa el `delivery_id` o `event_id` para deduplicar en tu lado:

```javascript theme={null}
const processedEvents = new Set();

app.post('/nexor-webhook', (req, res) => {
  const { event_id } = req.body;

  if (processedEvents.has(event_id)) {
    return res.status(200).send('Already processed');
  }

  processedEvents.add(event_id);

  // Process the event...
  res.status(200).send('OK');
});
```

**Tip:** Para uso en produccion, almacena los valores de `event_id` procesados en una base de datos o cache (ej. Redis con TTL) en lugar de un Set en memoria.

## Pruebas

Usa el boton **Test** en el panel de webhooks para enviar un payload de prueba a tu endpoint. Los payloads de prueba tienen `"test": true` en el cuerpo para que puedas distinguirlos de los eventos reales.
