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

# Entrega & Retry

> Política de reenvio automático, requisitos do endpoint e idempotência

## Política de retry

Se seu endpoint retornar status diferente de `2xx`, a Cordialy reenvia automaticamente:

| Tentativa    | Delay      | Total decorrido |
| ------------ | ---------- | --------------- |
| 1ª (inicial) | —          | 0s              |
| 2ª           | 1 minuto   | \~1min          |
| 3ª           | 5 minutos  | \~6min          |
| 4ª           | 30 minutos | \~36min         |
| 5ª           | 2 horas    | \~2h36min       |

Após 5 tentativas sem `2xx`, o evento é descartado.

<Note>
  Erros `4xx` (exceto `429 Too Many Requests`) são tratados como falhas permanentes e **não geram retry**. Retorne `2xx` mesmo que você decida ignorar o evento — use `4xx` apenas se houver um problema real de autenticação ou formato.
</Note>

## Requisitos do endpoint

| Requisito    | Detalhe                                |
| ------------ | -------------------------------------- |
| Protocolo    | HTTPS com certificado válido           |
| Timeout      | Máximo 10 segundos para retornar `2xx` |
| Método       | Sempre `POST`                          |
| Content-Type | `application/json`                     |

<Tip>
  Se o processamento for demorado, responda `200` imediatamente e processe de forma assíncrona (fila, background job).
</Tip>

## Idempotência

Por conta dos retries, seu endpoint pode receber o mesmo evento mais de uma vez. Use o par `event_type + occurred_at + payload.id` como chave de deduplicação para garantir que o mesmo evento não seja processado duas vezes.

```typescript theme={null}
const chave = `${evento.event_type}:${evento.payload.id}`;
if (await cache.exists(chave)) return res.status(200).send('já processado');
await cache.set(chave, true, { ex: 86400 }); // TTL 24h
// processar...
```

## Testar seu endpoint

Use o dashboard em **Integrações → Webhooks → Testar** para enviar um evento de exemplo sem precisar gerar o evento real na plataforma.

<Tip>
  Durante o desenvolvimento, use ferramentas como [ngrok](https://ngrok.com) ou [webhook.site](https://webhook.site) para expor seu servidor local e inspecionar os payloads recebidos.
</Tip>
