# Reintentos y fallos

> Cómo reintenta Emailit las peticiones de webhook fallidas, cuándo te avisa por email y desactiva un endpoint, y cómo revisar y volver a enviar las peticiones fallidas.

Cuando tu endpoint no acepta una petición de webhook, Emailit conserva los eventos y vuelve a intentarlo según un calendario que dura algo más de tres días. En esta página encontrarás ese calendario, los emails que envía Emailit, cuándo desactiva un endpoint y cómo revisar y volver a enviar las peticiones fallidas.

## Qué se considera un fallo

Una petición falla cuando tu endpoint:

- Devuelve cualquier estado fuera del rango `200`–`299`, incluidas las redirecciones (`3xx`).
- No responde en 30 segundos.
- No es accesible: errores de DNS, conexiones rechazadas, errores de TLS o una URL que se resuelve en una dirección IP privada.

Un fallo afecta a todo el lote: todos los eventos de la petición se reintentan juntos.

## Calendario de reintentos

Después de cada intento fallido, Emailit espera antes de volver a intentarlo:

| Intento | Espera desde el intento anterior | Tiempo desde el primer intento |
| --- | --- | --- |
| 1 | Se envía a los pocos segundos del evento | 0 |
| 2 | 5 minutos | 5 minutos |
| 3 | 30 minutos | 35 minutos |
| 4 | 2 horas | 2 horas y 35 minutos |
| 5 | 5 horas | 7 horas y 35 minutos |
| 6 | 12 horas | 19 horas y 35 minutos |
| 7 | 12 horas | 1 día y 7 horas |
| 8 | 12 horas | 1 día y 19 horas |
| 9 | 12 horas | 2 días y 7 horas |
| 10 | 12 horas | 2 días y 19 horas |
| 11 | 12 horas | 3 días y 7 horas |

Si el intento 11 falla, la petición se marca como **Failed** y no se reintenta automáticamente. Aún puedes [volver a enviarla](#resend-failed-requests) durante 7 días.

Cada intento se vuelve a firmar con una marca de tiempo nueva. Los eventos que llegan mientras hay peticiones anteriores a la espera de un reintento se envían en sus propios lotes, así que un evento problemático no bloquea los más recientes.

## Emails de notificación

Emailit envía un email al propietario del espacio de trabajo en dos momentos:

| Cuándo | Email |
| --- | --- |
| Una petición falla por tercera vez (unos 35 minutos después del primer fallo) | El webhook está fallando. Se envía una vez por incidencia. Solo recibes otro después de una entrega correcta seguida de nuevos fallos, o pasados 4 días. |
| El webhook se desactiva automáticamente | El webhook se ha desactivado, con el último código de estado. |

## Desactivación automática

Si un webhook lleva 3 días sin ninguna entrega correcta desde su petición fallida más antigua, Emailit lo desactiva en el siguiente intento fallido. En la práctica, esto ocurre hacia el 11.º intento de la primera petición fallida, o antes si los eventos nuevos siguen fallando.

Mientras un webhook está desactivado:

- No se ponen en cola eventos nuevos para él. Se siguen registrando en el [flujo de eventos](/es/docs/logs/events/).
- Las peticiones que esperaban un reintento siguen pendientes y se reanudan cuando lo activas.
- La página del webhook muestra el estado **Disabled**.

Para volver a activarlo, selecciona **Enable webhook** en el menú de acciones del webhook o llama a [Actualizar un webhook](/es/docs/api-reference/webhooks/update/) con `{"enabled": true}`. **Retry failed** y el reintento de una sola petición también activan el webhook.

## La pestaña Requests

Abre un webhook en **Email API → Webhooks** para ver su pestaña **Requests**, con las peticiones de la más reciente a la más antigua:

| Columna | Descripción |
| --- | --- |
| **Event type** | El evento de la petición. |
| **Event ID** | El ID `evt_`, el mismo valor que tu endpoint recibe como `event_id`. |
| **Created** | Cuándo se puso en cola la petición. |
| **Attempts** | Cuántos intentos de entrega han fallado hasta ahora. |
| **Status** | **Pending** (aún no se ha intentado), **Attempting** (ha fallado al menos una vez y se reintentará), **Delivered** o **Failed** (se agotaron los reintentos). |

Filtra por **Status code**, **Event** o **Created**. Los eventos de prueba de **Send test** no aparecen aquí.

En una petición **Failed**, selecciona **View** para abrir **Failure reason**: el código de estado que devolvió tu endpoint (`0` si no hubo respuesta HTTP), cuándo se creó la petición y cuándo falló, y los primeros 2000 caracteres del cuerpo de la respuesta.

## Volver a enviar las peticiones fallidas

Puedes volver a enviar las peticiones marcadas como **Failed** cuyo último fallo se produjo en los últimos 7 días. Las peticiones que vuelves a enviar pasan de nuevo a **Pending** y empiezan un nuevo ciclo de reintentos desde el intento 1. La entrega no es instantánea: la siguiente ronda de entregas las recoge en cuestión de segundos.

### Reintentar una petición

En la pestaña **Requests**, selecciona **Retry** en una fila fallida. El botón solo aparece en las peticiones fallidas de los últimos 7 días.

El endpoint de la API es [Reintentar una petición](/es/docs/api-reference/webhooks/retry-request/), `POST /v2/webhooks/{id}/requests/{request_id}/retry`, que devuelve `{"retried": 1, "id": "whr_…"}`. Solo acepta peticiones marcadas como **Failed** y devuelve `400` para las demás. Ningún endpoint público lista los ID de petición (`whr_…`), así que, para automatizar con la API, usa **Retry failed**.

### Reintentar las peticiones fallidas

Abre el menú de acciones del webhook y selecciona **Retry failed**. Todas las peticiones que fallaron en los últimos 7 días se vuelven a poner en cola, y el panel muestra «Queued 3 failed request(s) for retry» con el número real, o «No failed requests in the last 7 days».

Con la API, llama a [Reintentar las peticiones fallidas](/es/docs/api-reference/webhooks/retry-failed/):

```bash
curl -X POST https://api.emailit.com/v2/webhooks/wh_2xGk8Hd3RvN6qT1mWsB9cL4pZ7e/retry-failed \
  -H "Authorization: Bearer $EMAILIT_API_KEY"
```

```json
{ "retried": 42 }
```

## Recuperarse de una caída

1. **Arregla el endpoint.** Usa **View** en una petición fallida para ver qué devolvió tu endpoint.

2. **Confirma que funciona.** Usa **Send test** desde el menú de acciones, o [Enviar un evento de prueba](/es/docs/api-reference/webhooks/test/) con la API, y comprueba que obtienes un `2xx`.

3. **Activa el webhook** si Emailit lo desactivó.

4. **Vuelve a enviar los fallos.** Selecciona **Retry failed** para poner en cola todas las peticiones que fallaron en los últimos 7 días. Las peticiones que siguen marcadas como **Attempting** se reintentan según su propio calendario.

5. **Recupera lo que falte.** Los eventos que ocurrieron mientras el webhook estaba desactivado nunca se pusieron en cola, y los fallos de hace más de 7 días no se pueden volver a enviar. Léelos con la [API de eventos](/es/docs/logs/events/#reconcile-missed-webhook-events) para el periodo afectado y procesa los que te falten.

Como los reintentos vuelven a enviar lotes completos, haz que tu controlador sea idempotente: guarda cada `event_id` y omite los que ya hayas procesado. Consulta [Peticiones de webhook](/es/docs/webhooks/webhook-requests/#duplicates).

## Retención

Las peticiones de webhook siguen el periodo de retención de **Logs**, así que las filas más antiguas desaparecen de la pestaña **Requests** con el tiempo.

| | Pay as you go | Pro | Business | Custom |
| --- | --- | --- | --- | --- |
| Retención de los registros de peticiones | 7 días | 30 días | 30 días | Flexible |

## Ver también

  - [Peticiones de webhook](/es/docs/webhooks/webhook-requests/)
  - [Eventos](/es/docs/logs/events/)

---
Fuente: https://emailit.com/es/docs/webhooks/retries-and-failures/
