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

# Entregas y reintentos

> Qué respuesta espera Pruff, cuándo reintenta y cómo manejar duplicados.

## Respuesta esperada

| Tu respuesta | Qué hace Pruff |
| - | - |
| `2xx` | Da la entrega por recibida. |
| Cualquier otro código, incluidos `3xx` y `4xx` | Reintenta. |
| Timeout o error de red | Reintenta. |

Un `4xx` también se reintenta: si tu endpoint rechaza una entrega por un error que no se corrige solo, recibirás los cuatro intentos.

<Note>
  No respondas con una redirección. Pruff sigue las redirecciones, y si tu endpoint responde `301`, `302` o `303`, la request redirigida llega a la nueva URL como `GET` y sin body.
</Note>

## Reintentos

Cada entrega tiene hasta 4 intentos. Después de cada intento fallido, Pruff espera antes del siguiente:

| Intento | Cuándo se envía |
| - | - |
| 1 | Inmediatamente. |
| 2 | 1 minuto después del intento 1. |
| 3 | 5 minutos después del intento 2. |
| 4 | 15 minutos después del intento 3. |

```mermaid theme={null}
sequenceDiagram
  participant P as Pruff
  participant T as Tu endpoint
  P->>T: POST (X-Webhook-Attempt: 1)
  T-->>P: 500
  Note over P: espera 1 minuto
  P->>T: POST (X-Webhook-Attempt: 2)
  T-->>P: timeout
  Note over P: espera 5 minutos
  P->>T: POST (X-Webhook-Attempt: 3)
  T-->>P: 200
```

Los reintentos reenvían la entrega original: mismo body, mismo timestamp, misma firma y mismo valor del header de idempotencia. Solo cambia `X-Webhook-Attempt`.

Si el cuarto intento también falla, la entrega se descarta y no se vuelve a enviar.

## Garantías

* **Puedes recibir duplicados.** Una misma entrega puede llegar más de una vez aunque hayas respondido `2xx`.
* **No hay orden garantizado.** Los eventos pueden llegar en un orden distinto al que ocurrieron, sobre todo cuando hay reintentos de por medio.
* **Los eventos con listas no tienen un tamaño máximo fijo.** `invoice.newInvoices`, `cession.newCessions` y `creditNote.newCreditNotes` envían en una sola entrega todos los documentos detectados en un mismo procesamiento.

## Idempotencia

Procesa cada entrega una sola vez aunque la recibas varias veces:

1. **Usa el header de idempotencia** de tu suscripción como clave. Su valor es único por entrega y se repite en todos sus reintentos. Si tu suscripción no lo tiene, pídele a Pruff que lo configure.
2. **Si no tienes header de idempotencia**, usa el valor `v1` de `X-Webhook-Signature`: es el mismo en todos los reintentos de una entrega.
3. **No uses `X-Webhook-Id`.** Identifica el tipo de evento y se repite en todas las entregas de ese evento.

Para los eventos de documentos, deduplica además cada documento por RUT del emisor, tipo de documento y folio: un mismo documento puede llegar en más de una entrega.

## Buenas prácticas

* Responde en menos de 5 segundos.
* Responde `2xx` apenas guardes la entrega, y procésala después, fuera del handler.
* Valida la firma antes de procesar (ver [Headers y firma](/webhooks/seguridad)).
* Trata cada entrega como posible duplicado.


This documentation is built and hosted on [Mintlify](https://mintlify.com), a developer documentation platform.