Inscrever
secret é o único lugar onde o segredo de assinatura aparece):
secret imediatamente — a Caratuva o criptografa em repouso e não consegue retorná-lo de novo. Se perder, gire-o.
Tipos de evento
Dois namespaces paralelos:payment_intent.*— disparam apenas para faturas criadas viaPOST /v1/payment-intents. Inscreva-se nestes se você é integrador B2B. Não verá ruído de nenhuma atividade do painel.invoice.*— disparam para toda fatura (tanto criada via API quanto via painel). Inscreva-se nestes apenas se você também opera o painel.
payment_intent.*:
| Evento | Quando |
|---|---|
payment_intent.created | Intent criado via API; comprador ainda não engajado. |
payment_intent.buyer_kyc_approved | A submissão de KYC do comprador passou na verificação de identidade. |
payment_intent.buyer_kyc_rejected | KYC rejeitado. O intent termina em failed. |
payment_intent.on_chain_confirmed | Transferência internacional confirmada na camada de liquidação da Caratuva. |
payment_intent.settled | Repasse PIX concluído; fundos na conta BRL do vendedor. Estado final feliz. |
payment_intent.failed | Falha terminal (qualquer fase). data carrega o motivo. |
payment_intent.cancelled | Cancelado via POST /v1/payment-intents/:id/cancel ou pela operação. |
payment_intent.expired | expiresAt atingido sem pagamento. |
Formato de entrega
Verificação de assinatura
O header de assinatura ét=<unix_ts>,v1=<sha256_hex>. O payload assinado é ${t}.${rawBody} (os bytes brutos do body HTTP, não um objeto JSON re-serializado). Sempre verifique contra os bytes brutos — re-serializar muda whitespace e ordem de chaves e quebra o MAC.
Passos
- Faça parse de
tev1do headerX-Caratuva-Signature. - Rejeite a requisição se
|now - t| > 300(janela de replay de 5 minutos). - Compute
expected = HMAC-SHA256(secret, "${t}.${rawBody}")e compare em hex contrav1com comparador de tempo constante. - Use
X-Caratuva-Delivery-Idcomo chave de idempotência do seu lado — replays com o mesmo id devem ser no-op.
Exemplo Node.js
Exemplo Python
Retentativas e backoff
A Caratuva tenta entrega imediata, depois reentrega em qualquer não-2xx ou erro de transporte com backoff exponencial:| Tentativa | Atraso desde a anterior |
|---|---|
| 1 | (imediato) |
| 2 | 30s |
| 3 | 2m |
| 4 | 10m |
| 5 | 1h |
| 6 | 6h |
| 7 | 24h |
dead_letter e a Caratuva para de tentar. Use GET /v1/webhook-subscriptions/:id/deliveries para inspecionar entregas falhas e reenviá-las manualmente se preciso.
Listar inscrições
Inspecionar entregas
attempt, status (pending | delivered | failed | dead_letter), o responseStatus upstream e o próximo nextAttemptAt. Na prática, os valores que você verá hoje são pending, delivered e dead_letter — uma linha permanece pending entre retentativas e vira dead_letter após a tentativa final; failed está reservado.
Girar o segredo
secret exatamente uma vez. A rotação é imediata e atômica — a API armazena apenas um segredo por inscrição, então o segredo antigo para de verificar já na próxima entrega e não há janela de sobreposição com segredo duplo. Implante o novo segredo no seu verificador primeiro (ou atomicamente junto com a chamada de rotação); quaisquer entregas em andamento ou reentregues são re-assinadas com o novo segredo quando enviadas. Não configure seu verificador para aceitar “qualquer um” dos segredos esperando uma sobreposição — ela não existe.
Deletar (desativar)
active=false). Nenhuma entrega futura dispara; as linhas históricas em deliveries continuam consultáveis.