KaironPay API
Documentação completa da API de pagamentos PIX. Integre cobranças, saques, webhooks e muito mais em minutos.
Cobranças PIX
QR Code dinâmico, confirmação em segundos
Saques PIX
Transferências para qualquer chave PIX
Webhooks
Notificações em tempo real por evento
Saldo
Disponível, pendente e reservado
Extrato
Histórico completo de transações
Multi-Provedor
XPayTech, FluxPay, Woovi e mais
value) são em centavos (integer). Ex: R$ 10,00 = 1000. R$ 1,50 = 150.POST /payouts, GET /payouts/:reference_code e POST /transfers/internal retornam amount/net_amount/fee em reais (decimal). Confira a unidade em cada endpoint.Authorization: Bearer sk_suachave. Veja a seção Autenticação para detalhes.Códigos de Status HTTP
| Código | Significado |
|---|---|
| 200 | Sucesso |
| 201 | Recurso criado com sucesso |
| 400 | Dados inválidos, campos obrigatórios ausentes, saldo insuficiente ou chave PIX inválida |
| 401 | Não autenticado — API Key inválida ou ausente |
| 403 | Sem permissão — conta bloqueada ou saques desabilitados |
| 404 | Recurso não encontrado |
| 409 | Conflito — correlationID já utilizado em outra operação |
| 500 | Erro interno — contate o suporte |
Status de cobranças
| Status | Descrição |
|---|---|
| ACTIVE | Cobrança criada, aguardando pagamento |
| COMPLETED | Pagamento PIX confirmado e processado |
| EXPIRED | Cobrança expirou sem pagamento |
| REFUNDED | Pagamento foi estornado ao pagador |
| CANCELLED | Cobrança cancelada manualmente |
Início Rápido
Do zero à primeira cobrança paga em menos de 10 minutos. Siga os passos abaixo.
Guia passo a passo
-
Obtenha sua API Key
Acesse app.kaironpay.com/dashboard → Configurações → API Key. Copie a chave no formato
sk_*. Guarde-a em uma variável de ambiente — nunca hardcode no código. -
Crie uma cobrança PIX
Faça um
POST /chargescom o valor em centavos. A API retorna umbrCode(copia-e-cola) e um QR Code em base64 pronto para exibir. -
Exiba o QR Code ao usuário
Use o
qrCodeImage(base64 PNG) direto em uma tag<img>, ou obrCodenum input copiável. Opcionalmente redirecione para opaymentLinkUrl. -
Configure um webhook
Cadastre sua URL no painel (Configurações → Webhooks). Quando o pagamento for confirmado, o KaironPay envia
TRANSACTION_COMPLETEDpara a sua URL via POST. -
Receba o webhook e libere o produto
No seu handler, verifique o
X-Webhook-Token, leia o evento e, se forPayInCompleted, libere o produto/serviço ao cliente.
Fluxo completo — criação de cobrança
Código completo mostrando criação de cobrança, polling de status e liberação de produto via webhook. Escolha sua linguagem:
Handler de Webhook — liberar produto
Quando o pagamento é confirmado, o KaironPay envia TRANSACTION_COMPLETED. Valide o token, identifique o pedido pelo correlationID e libere o produto:
Autenticação
Todas as requisições devem incluir sua API Key no header Authorization usando o esquema Bearer.
Como obter sua API Key
- Acesse o Painel KaironPay → app.kaironpay.com/dashboard
- Navegue até Configurações → API Key
- Clique em "Gerar nova chave" (ou copie a existente)
- Copie a chave no formato
sk_* - Salve como variável de ambiente:
KAIRONPAY_API_KEY=sk_suachave
Exemplos de uso
sk_. O header deve ser exatamente Authorization: Bearer <sua_chave>./v1/client. Ainda assim, implemente retry com backoff exponencial para erros 5xx e use correlationID estável para segurança em retentativas.Idempotência
Use correlationID para garantir que operações não sejam duplicadas em caso de falhas de rede ou retentativas.
correlationID duas vezes, a API retorna a operação existente (status 200) ao invés de criar uma nova. Isso é seguro para retentativas.Regras do correlationID
| Regra | Detalhe |
|---|---|
| Formato | String livre (alfanumérico, hífens e underscores). Recomendamos derivar do ID do pedido na sua aplicação. Não há tamanho mínimo obrigatório. |
| Escopo | Por tipo de operação (cobranças e saques têm escopos separados) |
| Geração automática | Se omitido, a API gera um correlationID — cobranças no formato KAI<timestamp><id> e boletos BOL<timestamp><id> |
| 409 Conflict | Retornado em saques/transferências se o mesmo correlationID for reutilizado. A resposta inclui existing_reference_code. Em cobranças, reenviar o mesmo correlationID retorna a cobrança existente (200, deduplicated: true) |
Gerando correlationIDs únicos
correlationID estável e derivado do ID do pedido na sua aplicação. Assim, se a requisição falhar e você retentá-la, o servidor reconhece como idempotente e não cria uma cobrança duplicada.Erros & Retry
Como identificar erros, quando retentativas são seguras e como implementar backoff exponencial.
Quando retentativas são seguras
| Código | Retentativa segura? | Estratégia |
|---|---|---|
| 2xx | N/A | Sucesso — não retente |
| 400 | Não | Corrija os dados antes de retentativas |
| 401 | Não | Verifique/renove a API Key |
| 403 | Não | Problema de permissão — contate suporte |
| 404 | Não | Recurso não existe |
| 409 | Verificar | correlationID duplicado — pode buscar o recurso existente |
| 500 | Sim | Backoff exponencial com jitter |
| Timeout | Sim* | *Use correlationID estável para idempotência |
Implementação de retry com backoff exponencial
Cobranças PIX
Crie, liste, consulte, cancele e estorne cobranças PIX com QR Code dinâmico.
Cria uma cobrança PIX e retorna o QR Code e o código copia-e-cola (brCode). A cobrança fica com status ACTIVE até ser paga ou expirar. Idempotente via correlationID.
Parâmetros do body (JSON)
| Parâmetro | Tipo | Descrição | |
|---|---|---|---|
| value | integer | obrigatório | Valor em centavos. Ex: 1500 = R$ 15,00 |
| comment | string | Descrição da cobrança exibida ao pagador | |
| correlationID | string | ID único na sua aplicação. Gerado automaticamente (KAI…) se omitido. | |
| customer | object | obrigatório* | Dados do pagador (ver abaixo). *Obrigatório para a maioria dos provedores |
| customer.name | string | Nome completo do pagador | |
| customer.taxID | string | obrigatório* | CPF (11 dígitos) ou CNPJ (14 dígitos), apenas números. *Obrigatório junto com customer |
| customer.email | string | Email válido do pagador | |
| customer.phone | string | Telefone com DDD. Ex: +5511999887766 | |
| expiresDate | string | Data de expiração ISO 8601. Ex: 2026-12-31T23:59:59Z |
{ success, ... }. Os campos confiáveis no topo são correlationID, brCode e qrCodeImage. O objeto data reflete a resposta bruta do provedor (formato varia). Para obter a cobrança normalizada (com value, status, paymentLinkUrl, expiresAt) use GET /charges/:correlationID.correlationID retorna 200 com deduplicated: true e um data normalizado { correlationID, value, status, brCode, qrCodeImage, paymentLinkUrl, expiresAt, createdAt }.Campos da resposta (topo)
| Campo | Tipo | Descrição |
|---|---|---|
| success | boolean | Sempre true em caso de sucesso |
| correlationID | string | ID único da cobrança (o seu, ou gerado KAI…) |
| brCode | string | Código PIX copia-e-cola (EMV) |
| qrCodeImage | string | QR Code em base64 PNG — use direto em <img src="..."> |
| usedProvider | string | Provedor PIX efetivamente utilizado |
| fallbackUsed | boolean | true se um provedor de fallback foi usado |
| data | object | Resposta bruta do provedor (na resposta idempotente 200, é o objeto normalizado) |
Lista todas as cobranças da conta com filtros e paginação. Resultados ordenados por data de criação decrescente.
Query parameters
| Parâmetro | Tipo | Default | Descrição |
|---|---|---|---|
| skip | integer | 0 | Offset para paginação |
| limit | integer | 100 | Máximo de resultados (max: 500) |
| status | string | ACTIVE | COMPLETED | EXPIRED | REFUNDED | CANCELLED | |
| start_date | string | Data inicial ISO 8601 | |
| end_date | string | Data final ISO 8601 |
value, feeAmount, netAmount, refundedAmount) em centavos. Itens em data[], paginação em pageInfo (totalCount, hasNextPage…).Consulta uma cobrança específica pelo correlationID. Retorna todos os campos incluindo brCode, qrCodeImage e dados do pagador.
GET /api/v1/client/charges/e2e/:endToEndId — mesma resposta, buscando pelo endToEndId.Cancela/exclui uma cobrança. Disponível apenas para o provedor Woovi — para os demais provedores retorna 400 Not supported.
POST /api/v1/client/refunds — veja a seção Reembolsos.ACTIVE (aguardando pgto), COMPLETED (pago), EXPIRED (expirado), REFUNDED (reembolsado), CANCELLED (cancelado).Saldo
Consulte o saldo disponível, pendente e reservado da sua conta.
Retorna o saldo detalhado da conta. Cada valor vem em centavos (campos numéricos) e também já formatado em BRL (campos *Formatted).
Campos da resposta (dentro de data)
| Campo | Descrição |
|---|---|
| availableBalance | Saldo disponível para saque (centavos). availableBalanceFormatted traz a versão em BRL. |
| manualBalanceAdjustment | Ajuste manual aplicado ao saldo (centavos) |
| totalReceived | Total bruto recebido em cobranças (centavos) |
| totalFees | Total de taxas cobradas (centavos) |
| totalPayouts | Total de saques concluídos (centavos) |
| totalPendingPayouts | Saques pendentes/em processamento (centavos) |
| totalBlocked | Valor bloqueado por disputas/MED (centavos) |
| heldBoletoBalance | Saldo de boletos ainda retido (centavos) |
| withdrawalsBlocked | boolean — se os saques estão bloqueados na conta |
| withdrawalsBlockedReason | Motivo do bloqueio (ou null) |
<campo>Formatted com a string em BRL (ex: "R$ 2.500,00"). Não existem os campos pending, reserved, total ou currency.Transações
Consulte o extrato completo de movimentações da conta — PIX IN, PIX OUT, estornos e ajustes.
Lista todas as movimentações da conta com filtros e paginação. Resultados ordenados por data decrescente.
Query parameters
| Parâmetro | Tipo | Default | Descrição |
|---|---|---|---|
| type | string | CREDIT (entradas/PIX IN) | DEBIT (saídas/PIX OUT) | |
| status | string | Filtra pelo status (ex: COMPLETED, PENDING) | |
| skip | integer | 0 | Offset de paginação |
| limit | integer | 100 | Máximo de resultados (max: 500) |
| start_date | string | Data inicial ISO 8601 | |
| end_date | string | Data final ISO 8601 |
data[] (unifica cobranças e saques), paginação em pagination. Campos monetários (value, netValue, fee) em centavos. Linhas DEBIT (saques) trazem também pixKey e recipientName.Saques e Transferências
Envie PIX para qualquer chave — saques automáticos ou com aprovação manual.
auto (padrão) — processado imediatamente se saldo disponível. manual — fica pendente até aprovação de um admin no painel.Cria um saque PIX. O valor é debitado do saldo disponível imediatamente. Idempotente via correlationID.
Parâmetros do body (JSON)
| Parâmetro | Tipo | Descrição | |
|---|---|---|---|
| value | integer | obrigatório | Valor em centavos. Mínimo: 100 (R$ 1,00) |
| pixKey | string | obrigatório | Chave PIX de destino |
| pixKeyType | string | obrigatório | cpf | cnpj | email | phone | evp |
| description | string | Descrição do saque (aparece no extrato) | |
| correlationID | string | ID único para evitar duplicatas (idempotência) | |
| recipientDocument | string | CPF/CNPJ do destinatário (também aceito como payeeTaxId ou destinationDocument) |
Tipos de chave PIX (pixKeyType)
| pixKeyType | Formato | Exemplo |
|---|---|---|
| cpf | 11 dígitos numéricos | 12345678900 |
| cnpj | 14 dígitos numéricos | 12345678000190 |
| Email válido | joao@email.com | |
| phone | +55 + DDD + número | +5511999887766 |
| evp | Chave aleatória (UUID) | a1b2c3d4-e5f6-7890-abcd-ef1234567890 |
amount, net_amount e fee vêm em reais (decimal). A taxa é cobrada além do valor (o total debitado do saldo é value + fee), por isso net_amount é igual a amount. Status inicial: processing (modo auto) ou pending_approval (modo manual).400 saldo insuficiente (error: "Insufficient balance"), 400 chave PIX inválida (error: "Invalid PIX key"), 400 limite de saque excedido, 403 saques bloqueados na conta, 409 correlationID duplicado (retorna existing_reference_code).Lista todos os saques da conta com filtros e paginação.
| Parâmetro | Tipo | Default | Descrição |
|---|---|---|---|
| skip | integer | 0 | Offset para paginação |
| limit | integer | 100 | Máximo de resultados (max: 500) |
| status | string | COMPLETED | PENDING | FAILED | REJECTED | processing | |
| start_date | string | Data inicial ISO 8601 | |
| end_date | string | Data final ISO 8601 |
value vem em centavos (ex: 5000 = R$ 50,00) — diferente do POST /payouts e do GET /payouts/:reference_code, que retornam amount em reais. O recipientDocument vem mascarado.Consulta o status de um saque específico pelo reference_code.
Aceita tanto o reference_code quanto o correlationID que você enviou no saque.
amount, net_amount e fee em reais. status em minúsculas.pending_approval (modo manual) → processing → completed | failedReembolsos
Estorne total ou parcialmente cobranças já pagas. O valor é devolvido ao pagador via PIX em instantes.
POST /api/v1/client/refunds. Atualmente suportado apenas para cobranças criadas nos provedores Woovi e Venit — para os demais retorna 400 Not supported.Cria um reembolso para uma cobrança já paga (COMPLETED). Suporta reembolso total ou parcial.
Parâmetros do body (JSON)
| Parâmetro | Tipo | Descrição | |
|---|---|---|---|
| correlationID | string | obrigatório | correlationID da cobrança original a ser reembolsada |
| value | integer | obrigatório | Valor do reembolso em centavos. Para reembolso total, use o valor original da cobrança. |
| comment | string | Motivo do reembolso |
value em centavos. O objeto data é embrulhado em { success, data }. Para cobranças Woovi, data reflete a resposta do provedor.Regras de reembolso
| Regra | Descrição |
|---|---|
| Status obrigatório | Apenas cobranças com status COMPLETED podem ser reembolsadas |
| Valor máximo | O valor do reembolso não pode exceder o valor original da cobrança |
| Reembolso parcial | Suportado — envie um valor menor que o original |
| Limite por cobrança | Apenas 1 reembolso por cobrança |
| Saldo | O valor é debitado do saldo disponível da sua conta |
| Webhook | Evento TRANSACTION_REFUNDED (PayInRefunded) é enviado após processamento |
Webhooks
Receba notificações em tempo real quando eventos ocorrem na sua conta. O KaironPay envia um POST HTTP para a URL cadastrada.
Como funciona
Cadastre sua URL
Acesse o painel → Configurações → Webhooks → Nova URL. Informe sua URL HTTPS acessível publicamente.
Copie o token
Cada webhook tem um token único gerado automaticamente. Salve como variável de ambiente (
KAIRONPAY_WEBHOOK_TOKEN). Este token é enviado no headerX-Webhook-Tokende cada requisição.Escolha os eventos
Selecione quais eventos deseja receber: cobranças, saques, reembolsos, etc.
Implemente o handler
Valide o token, responda HTTP
2xxem até 5 segundos e processe de forma assíncrona.
Headers enviados pelo KaironPay
| Header | Descrição | Exemplo |
|---|---|---|
| Content-Type | Tipo do conteúdo | application/json |
| X-Webhook-Token | Token único do webhook (do painel). É também a chave usada no HMAC. | seu_token_secreto |
| X-KaironPay-Event | Nome interno do evento (snake_case) — veja a coluna X-KaironPay-Event em "Todos os Eventos" | TRANSACTION_COMPLETED |
| X-KaironPay-Signature | Assinatura HMAC-SHA256 do payload (hex) | 3a5f...e91 |
| X-KaironPay-Timestamp | Timestamp Unix (segundos) usado na assinatura | 1749297600 |
| X-KaironPay-Algorithm | Algoritmo da assinatura | HMAC-SHA256 |
| User-Agent | Identifica o entregador | KaironPay-Webhook/1.0 |
X-KaironPay-Event usa o nome interno em SNAKE_CASE (ex: TRANSACTION_COMPLETED, PAYOUT_COMPLETED), enquanto o campo event do corpo usa o nome em PascalCase (ex: PayInCompleted, PayOutCompleted). São diferentes — trate cada um pelo seu valor.X-Command-Signature, X-Command-Timestamp, X-Command-Algorithm e X-Command-Event. Prefira os headers X-KaironPay-*.Validação da assinatura (HMAC-SHA256)
A assinatura é calculada sobre o corpo bruto da requisição, com o token do webhook como chave:
timestamp usado na assinatura é o do header X-KaironPay-Timestamp, não o campo timestamp do corpo (que nem sempre existe).Validação do token
Sempre valide o header X-Webhook-Token antes de processar qualquer evento. Use comparação de tempo constante para evitar timing attacks.
- Os eventos
PayInCompleted,PayInRefunded,PayOut*eDisputeCanceledaninham os dados emdata.data(dois níveis). Usepayload.data.data. PayInCreatedeDisputeCreatedusamdataem um nível só.- Os eventos
PayIn*não incluem um campotimestampno corpo (use o headerX-KaironPay-Timestamp). OsPayOut*incluem. - O identificador da cobrança é
correlationID(nãoid).
Payload — TRANSACTION_COMPLETED (PayInCompleted)
Enviado quando um pagamento PIX é confirmado. Este é o evento mais importante — use-o para liberar o produto/serviço. Todos os valores em centavos. Para boletos, event é BoletoCompleted e type é BOLETO.
Payload — PAYOUT_COMPLETED (PayOutCompleted)
Enviado quando um saque é concluído. PayOutFailed e PayOutRefunded têm a mesma estrutura (o PayOutFailed inclui errorMessage).
value vem em centavos, mas amount, netAmount e feeAmount vêm em reais. (Diferente do PayInCompleted, onde tudo é centavos.) O status vem em MAIÚSCULAS e o event é repetido dentro de data.Retentativas e configurações
| Configuração | Valor |
|---|---|
| Timeout por tentativa | 5 segundos |
| Retentativas em falha | Até 3 vezes com backoff exponencial |
| Resposta esperada | HTTP 2xx (200, 201, 204) |
| Reenvio manual | Disponível no painel (Webhooks → Histórico → Reenviar) |
| Limite de URLs | Múltiplas URLs por conta, cada uma com token independente |
data.data.correlationID (cobranças) ou data.data.referenceCode (saques) como chave de idempotência no seu banco de dados.Todos os Eventos
Referência completa de todos os eventos que podem ser recebidos via webhook, com payloads de exemplo.
Eventos de Cobrança / Disputa (PIX In)
| Evento (X-KaironPay-Event) | payload.event | Quando é disparado |
|---|---|---|
| TRANSACTION_CREATED | PayInCreated | Cobrança PIX criada |
| TRANSACTION_COMPLETED | PayInCompleted / BoletoCompleted | Pagamento PIX ou boleto confirmado ✅ |
| TRANSACTION_REFUNDED | PayInRefunded | Pagamento estornado ao pagador |
| DISPUTE_CREATED | DisputeCreated | Disputa/MED aberta — cobrança fica bloqueada (assine TRANSACTION_CHARGEBACK) |
| DISPUTE_CANCELED | DisputeCanceled | Disputa resolvida/cancelada — cobrança desbloqueada (assine TRANSACTION_CHARGEBACK) |
PayInExpired) nem de cancelamento (PayInCancelled) de cobrança. Uma cobrança expirada/cancelada apenas muda de status internamente — consulte via GET /charges/:correlationID se precisar.Eventos de Saque (PIX Out)
| Evento (X-KaironPay-Event) | payload.event | Quando é disparado |
|---|---|---|
| PAYOUT_COMPLETED | PayOutCompleted | Saque concluído e PIX enviado ✅ |
| PAYOUT_FAILED | PayOutFailed | Saque falhou (chave inválida, devolvido etc.) — inclui errorMessage |
| PAYOUT_REFUNDED | PayOutRefunded | Saque devolvido pelo destinatário |
PayOutCreated), aprovação (PayOutApproved) nem rejeição (PayOutRejected) de saque. Acompanhe o status via GET /payouts/:reference_code.Payloads completos por evento
PayInCreated
Nível único de data. amount em reais, status = "pending".
PayInRefunded
Aninhado em data.data. Valores em centavos, status = "refunded".
PayOutFailed
Mesma estrutura do PayOutCompleted (aninhado em data.data, unidades mistas), com status: "FAILED" e errorMessage.
DisputeCreated
Nível único de data (não data.data). Header X-KaironPay-Event: DISPUTE_CREATED — assine TRANSACTION_CHARGEBACK. Valores em centavos.
Códigos de Erro
A API usa códigos HTTP padrão. O body de erro contém success: false, um error (mensagem curta legível — não é um slug) e, quando aplicável, message e details.
Formato do erro
error: "Validation error") trazem details com a lista de campos inválidos. Nos erros de saque, os valores em details vêm em reais.Tabela de erros
| Status | error (valor real) | Descrição e ação sugerida |
|---|---|---|
| 400 | Validation error | Campos obrigatórios ausentes ou com formato inválido. details lista os campos. |
| 400 | Insufficient balance | Saldo insuficiente para o saque. details: available_balance vs requested_amount (reais). |
| 400 | Invalid PIX key | Chave PIX em formato inválido para o pixKeyType informado. |
| 400 | Withdrawal limit exceeded | Saque acima do limite. details: requested_amount, withdrawal_limit. |
| 400 | Ticket limit exceeded | Valor da cobrança fora dos limites mín./máx. da conta. |
| 400 | Not supported | Operação não suportada pelo provedor da conta (ex: delete/refund). |
| 401 | Missing Authorization header / Invalid API key | Autenticação. Envie Authorization: Bearer sk_... com chave válida. |
| 403 | Withdrawals blocked / Account blocked | Saques desabilitados ou conta bloqueada. Contate o suporte. |
| 404 | Charge not found / Payout not found | Recurso não encontrado. Verifique o correlationID ou reference_code. |
| 409 | Duplicate request | correlationID reutilizado em saque/transferência. Resposta traz existing_reference_code. |
| 500 | Failed to … / Internal server error | Erro interno. Retente após alguns segundos. Se persistir, abra um ticket. |
error é uma mensagem legível, não um código estável. Para lógica de negócio, prefira ramificar pelo status HTTP (e por details quando presente).Tratamento de erros em código
Limites & Boas Práticas
Rate limits, timeouts e recomendações para integração robusta e de alta disponibilidade.
Rate Limits
/api/v1/client, e a API não retorna 429 nem headers X-RateLimit-*. Ainda assim, use as operações de forma responsável — envie correlationID estável para idempotência e implemente backoff em erros 5xx. Limites podem ser introduzidos no futuro; projete seu cliente para tolerar 429 com Retry-After caso venham a existir.Timeouts recomendados
| Operação | Timeout sugerido | Observação |
|---|---|---|
| POST /charges (criar cobrança) | 30s | Criação pode envolver chamadas ao provedor PIX |
| GET /charges (listar) | 10s | Consultas rápidas |
| POST /payouts (criar saque) | 30s | Processamento pode levar alguns segundos |
| GET /balance | 5s | Consulta simples |
| Webhook (seu handler) | 5s | KaironPay aguarda até 5s pela resposta 2xx |
Boas práticas de integração
| Prática | Por quê? |
|---|---|
| Use correlationID estável | Baseie no ID do pedido da sua aplicação para que retentativas sejam idempotentes |
| Nunca exponha a API Key | Mantenha em variáveis de ambiente no servidor. Nunca no código-fonte ou em client-side JS |
| Prefira webhooks a polling | Webhooks são mais eficientes, baratos em rate limit e mais rápidos |
| Processe webhooks async | Responda HTTP 200 imediatamente e processe em background/fila |
| Implemente idempotência | Armazene o ID do evento processado para evitar processar o mesmo evento duas vezes |
| Monitore PAYOUT_FAILED | Configure alertas quando saques falharem para não deixar usuários sem pagamento |
| Use HTTPS na URL do webhook | O KaironPay rejeita URLs HTTP |
| Teste com o reenvio manual | Use Webhooks → Histórico → Reenviar no painel para reproduzir eventos |
| Exponha o /healthz do webhook | Facilita diagnóstico quando o KaironPay não consegue entregar |
| Log tudo | Registre evento, correlationID, timestamp e resposta de cada webhook recebido |
Checklist de produção
| Item | |
|---|---|
| ✓ | KAIRONPAY_API_KEY em variável de ambiente, nunca hardcoded |
| ✓ | KAIRONPAY_WEBHOOK_TOKEN armazenado com segurança |
| ✓ | URL do webhook em HTTPS |
| ✓ | Handler responde em menos de 5 segundos |
| ✓ | Idempotência implementada no handler de webhook |
| ✓ | Retry com backoff exponencial nas chamadas à API |
| ✓ | correlationID baseado no ID do pedido (estável) |
| ✓ | Alertas configurados para PayOutFailed e erros 5xx |
| ✓ | Logs estruturados com correlationID para rastreabilidade |