Chave de API
- A chave está num cofre de segredos ou variável de ambiente do servidor, nunca no código, no front-end ou num app.
- Só os escopos que o sistema usa. Chave que só cria cobrança não precisa de
withdrawals:write; quem só cobra no Pix não precisa decard:writenem decrypto:write. - IPs liberados preenchidos (obrigatório para sacar e enviar Pix; recomendado para todas).
- Uma chave por sistema, para revogar uma sem parar as outras.
Cobranças
-
Idempotency-Keycom o número do seu pedido (ou um UUID guardado junto dele). Repetir a chamada depois de um timeout não pode criar outra cobrança. - Valores em centavos inteiros. Nunca
float. - O
copyPasteé mostrado como QR Code e como texto com botão “Copiar”. - A tela de “aguardando pagamento” consulta
GET /v1/payments/{id}a cada 2 segundos ou mais, ou espera o webhook. - Cobrança paga depois de expirar é tratada como paga (
payment.paiddepois depayment.expired).
Webhooks
- O servidor lê o corpo cru e valida o
X-Bukio-Signatureantes de qualquer coisa. - Guarda o
iddo evento (evt_...) e ignora repetidos (o mesmo evento vai para todas as URLs e volta em todo reenvio). - Responde
2xxem menos de 10 segundos e faz o trabalho pesado depois. - Trata pelo
typee pelodata.id, nunca pela ordem de chegada. - O relógio do servidor está sincronizado (NTP): a assinatura recusa diferença maior que 5 minutos.
- A URL é
https://num domínio público; o segredo da conta está no servidor. - O envio de teste pelo painel chegou e foi validado.
Erros e limites
- O código trata pelo
error.code, não pelo texto damessage. -
429 RATE_LIMITEDe5xxtêm nova tentativa com espera crescente;4xxnão repete sem mudar algo. - O
requestIdda resposta fica no seu log, para citar ao suporte.
Saques
- O 2FA da conta está ligado e o sistema manda a chave de destino em
destination(confira a chave antes: o Pix não volta). - Com subcontas, o seu sistema sabe que o saldo delas não sai no seu saque (
freeemGET /v1/balance). - O sistema espera
withdrawal.completed(oupix.sent) antes de considerar o dinheiro entregue: a resposta da criação éprocessing. - O valor mínimo do saque está previsto (
withdrawal.minPerTransactionemGET /v1/balance).
Primeiro teste real
Uma cobrança de valor pequeno paga com o seu próprio banco, o webhookpayment.paid recebido e validado, a cobrança consultada em GET /v1/payments/{id} e, se for usar, um saque pequeno concluído. Só depois abra para os clientes.