Webhooks de depósito
Notificações de um payin, do momento em que a transferência aparece na rede até o valor ficar disponível no seu saldo.
Pagamentos parciais
Um depósito é marcado como completed, e payment_detected / payment_confirmed são enviados, quando received_amount atinge minimum_payment por cento de crypto_amount. O minimum_payment é definido por conta; abaixo de 100, o cliente pode ter pago menos que a fatura. Antes de entregar, compare data.received_amount com data.crypto_amount (ambos em data.crypto_currency) e decida o que fazer com a diferença.
payment_detectedPagamento detectado
A transação apareceu na rede e o payin está concluído, mas este não é o status final. funds_available é false e finality_status é pending_finality enquanto o bloco ainda pode ser reorganizado. Se precisar de agilidade, você pode liberar o produto neste aviso. O valor fica retido e não faz parte do saldo disponível até a rede atingir as confirmações exigidas.
Liberar o produto nesta etapa é uma decisão sua. Um saque desse valor é recusado até o payment_confirmed.
{
"data": {
"status": "success",
"wallet": "0xDeaD0000000000000000000000000000000000a1",
"network": "BinanceSmartChain",
"paid_with": [
{
"amount": "25.000000000000000000",
"currency": "USDT"
}
],
"created_at": "2026-03-01 12:00:00",
"cross_token": false,
"fiat_amount": "25.00",
"network_fee": "0.00000500",
"confirmed_at": null,
"percent_rate": "0.50",
"reference_id": "11111111-1111-4111-8111-111111111111",
"transactions": "[\"0xabc0000000000000000000000000000000000000000000000000000000000def\"]",
"confirmations": null,
"crypto_amount": "25.00000000",
"customer_info": "customer@example.com",
"fiat_currency": "USD",
"is_duplicated": false,
"crypto_currency": "USDT",
"finality_status": "pending_finality",
"funds_available": false,
"is_wallet_fixed": false,
"received_amount": "25.00000000",
"reversal_reason": null,
"internal_reference": "22222222-2222-4222-8222-222222222222",
"received_amount_fiat": "25.00",
"estimated_release_seconds": null,
"received_amount_fiat_current": "25.00"
},
"event": "payment_detected",
"timestamp": "2026-03-01 12:02:00"
}payment_confirmedPagamento confirmado
O bloco é final. funds_available é true e o valor está disponível no seu saldo. Credite o cliente de forma definitiva neste evento.
{
"data": {
"status": "success",
"wallet": "0xDeaD0000000000000000000000000000000000a1",
"network": "BinanceSmartChain",
"paid_with": [
{
"amount": "25.000000000000000000",
"currency": "USDT"
}
],
"created_at": "2026-03-01 12:00:00",
"cross_token": false,
"fiat_amount": "25.00",
"network_fee": "0.00000500",
"confirmed_at": null,
"percent_rate": "0.50",
"reference_id": "11111111-1111-4111-8111-111111111111",
"transactions": "[\"0xabc0000000000000000000000000000000000000000000000000000000000def\"]",
"confirmations": null,
"crypto_amount": "25.00000000",
"customer_info": "customer@example.com",
"fiat_currency": "USD",
"is_duplicated": false,
"crypto_currency": "USDT",
"finality_status": "final",
"funds_available": true,
"is_wallet_fixed": false,
"received_amount": "25.00000000",
"reversal_reason": null,
"internal_reference": "22222222-2222-4222-8222-222222222222",
"received_amount_fiat": "25.00",
"estimated_release_seconds": null,
"received_amount_fiat_current": "25.00"
},
"event": "payment_confirmed",
"timestamp": "2026-03-01 12:03:00"
}payment_reversedPagamento revertido
Uma reorganização desfez o depósito e o crédito foi retirado. data.status é reversed e reversal_reason indica o motivo. A partir daqui check-payin e list-payin também devolvem status reversed, então quem consulta por polling também vê. Se o produto já tinha sido liberado no payment_detected, concilie essa entrega com este aviso.
{
"data": {
"status": "reversed",
"wallet": "0xDeaD0000000000000000000000000000000000a1",
"network": "BinanceSmartChain",
"paid_with": [
{
"amount": "25.000000000000000000",
"currency": "USDT"
}
],
"created_at": "2026-03-01 12:00:00",
"cross_token": false,
"fiat_amount": "25.00",
"network_fee": "0.00000500",
"confirmed_at": null,
"percent_rate": "0.50",
"reference_id": "11111111-1111-4111-8111-111111111111",
"transactions": "[\"0xabc0000000000000000000000000000000000000000000000000000000000def\"]",
"confirmations": null,
"crypto_amount": "25.00000000",
"customer_info": "customer@example.com",
"fiat_currency": "USD",
"is_duplicated": false,
"crypto_currency": "USDT",
"finality_status": "reorged",
"funds_available": false,
"is_wallet_fixed": false,
"received_amount": "25.00000000",
"reversal_reason": "reorg",
"internal_reference": "22222222-2222-4222-8222-222222222222",
"received_amount_fiat": "25.00",
"estimated_release_seconds": null,
"received_amount_fiat_current": "25.00"
},
"event": "payment_reversed",
"timestamp": "2026-03-01 12:04:00"
}Quando a detecção já é final
Em algumas redes o pagamento é final assim que é detectado. O payment_confirmed é enviado logo depois do payment_detected; o payment_detected já traz finality_status final, e o payment_confirmed pode trazer finality_status null. Decida pelo event e pelo funds_available: nem todo payment_detected retém o valor.
Campos do depósito
| Campo | Tipo | Descrição |
|---|---|---|
| funds_available | boolean | false enquanto o valor está retido. true quando pode ser sacado. |
| finality_status | string | null | pending_finality enquanto as confirmações correm, final quando o bloco está consolidado, reorged quando o depósito foi desfeito. Pode ser null num payment_confirmed de pagamento que já era final na detecção. |
| confirmations | number | null | Reservado para a contagem de confirmações. Hoje vem sempre null; não dependa dele. |
| estimated_release_seconds | number | null | Reservado para a estimativa de espera até a liberação. Hoje vem sempre null; não dependa dele. |
| reversal_reason | string | null | Por que o crédito foi retirado. Null em payment_detected e payment_confirmed. |
| received_amount | string | Valor em cripto creditado no recibo. |
| received_amount_fiat | string | Valor fiat do montante recebido na cotação da invoice. |
| received_amount_fiat_current | string | Valor fiat na cotação do momento em que o webhook foi montado. Cai para a cotação da invoice se o preço ao vivo não estiver disponível. |
| cross_token | boolean | true quando o cliente pagou em um token diferente do token da invoice. |
| paid_with | array | Tokens de fato recebidos on-chain. Cada item tem currency e amount. |
| is_wallet_fixed | boolean | true quando o depósito caiu em um endereço fixo. |
is_duplicatedApenas Payintrue quando a própria Bifrost criou este payin, para um pagamento que não correspondia a um payin em aberto: um pagamento extra para um endereço cujo payin já estava concluído, ou um pagamento em rede diferente da fatura. É um payin novo, com internal_reference próprio e reference_id gerado pela Bifrost. O valor é creditado no seu saldo e o aviso vai para o webhook_url do payin original.
Quando is_duplicated é true, o reference_id não é seu. Vincule o pagamento ao seu pedido por customer_info ou wallet. O payin também aparece em List Payins e Check Specific Payin.
customer_infoSeu próprio identificador do cliente, como ID de usuário, e-mail ou número do pedido. Ele volta nos webhooks e nas listagens, então você sabe de quem é cada transação, inclusive os payins que a Bifrost cria por conta própria (pagamentos adicionais e depósitos em endereço fixo), cujo reference_id é gerado pela Bifrost.