Idempotência e requisições assíncronas

Idempotency-Key opcional vs obrigatório, replay e operações assíncronas.

Header Idempotency-Key

Dois comportamentos existem na API:

ModoQuandoSem headerCom header repetido
Opcional (resolveIdempotency)Envio WhatsApp/e-mail, CRM writes, etc.Gera requestId novoReplay se já success
Obrigatório (requireIdempotency)Upload de mídia; mensagem em conversa; send/schedule campanha WA; retry/test/rotate webhook; cancel de execução400 IDEMPOTENCY_KEY_REQUIREDReplay se já success

Operação em andamento (pending / scheduled / processing) → 409 IDEMPOTENCY_IN_PROGRESS.

Shape do replay

200 OK — idempotentReplay
{
  "success": true,
  "data": {
    "requestId": "sua-chave",
    "status": "success",
    "idempotentReplay": true
  }
}

Campos extras do responsePayload original são mesclados em data (exceto secret de rotate — o usage guarda só { rotated: true }).

Requisições assíncronas (202)

Envios enfileiram job e respondem com requestId. Consulte GET /usage/status/{requestId} ou webhooks.

Endpoints tipicamente 202:

  • POST /whatsapp/messages, /whatsapp/templates/send
  • POST /email/send, /email/campaigns/{id}/send
  • POST /flows/{id}/trigger

Endpoints que exigem Idempotency-Key

  • POST /media
  • POST /conversations/{id}/messages
  • POST /whatsapp/campaigns/{id}/send e /schedule
  • POST /webhooks/{id}/test, /rotate-secret, /deliveries/{deliveryId}/retry
  • POST /flows/executions/{id}/cancel