Track transactions
To configure Payout webhooks, go to the BVNK Portal and navigate to Integrations > Webhooks. For the full guide, see Create a Webhook Listener.
If you use walletID in the payment request that produces the webhook, note that you will also receive this field in the webhook response. In this case, you can ignore merchantID, since it will be discontinued soon.
In the payout workflow, you should expect to receive the following webhooks:
| Event | Description |
|---|---|
statusChanged | Payout has transitioned to a new state. |
refundInitiated | Refund process has begun for a cryptocurrency payment. |
transactionOnHold | Payment has been sent to a high risk address and is held to be further analyzed. |
Payment status changed
The bvnk:payment:crypto:status-change webhook is triggered when the status of the crypto transaction changes, for example, from Processing to Complete or Expired.
- Status Change: Processing
- Status Change: Complete
- Status Change: Expired
{
"event": "bvnk:payment:crypto:status-change",
"eventId": "019856c0-5fd6-79c4-8065-3fa5ea70aa3e",
"timestamp": "2025-07-29T15:15:04.790711Z",
"data": {
"flow": null,
"type": "OUT",
"uuid": "96491bf1-5af6-4a42-9d35-6e623a9e3426",
"pegged": false,
"refund": null,
"status": "PROCESSING",
"address": {
"tag": null,
"uri": "ethereum:0xa0b86991c6218b36c1d19d4a2e9eb0ce3606eb48/transfer?address=0xa59d9f28537a3A9EE18E76A9fCe8261B0CA33723&uint256=6E+6",
"address": "0xa59d9f28537a3A9EE18E76A9fCe8261B0CA33723",
"protocol": "ERC20",
"alternatives": []
},
"refunds": [],
"subType": "merchantPayOut",
"twoStep": true,
"metadata": {},
"reference": "REF65908",
"returnUrl": "",
"customerId": "839ef707-91bb-44f5-b762-94a91310aaaa",
"expiryDate": 1753888503000,
"merchantId": "e91a7928-7353-4ad4-93eb-32632f01b7b6",
"dateCreated": 1753802103000,
"displayRate": {
"base": "USDC",
"rate": 1,
"counter": "USDC"
},
"feeCurrency": {
"actual": 0,
"amount": 1.729048,
"currency": "USDC"
},
"quoteStatus": "ACCEPTED",
"redirectUrl": "https://pay.bvnk.com/payout/96491bf1-5af6-4a42-9d35-6e623a9e3426",
"exchangeRate": {
"base": "USDC",
"rate": 1,
"counter": "USDC"
},
"paidCurrency": {
"actual": 0,
"amount": 6,
"currency": "USDC"
},
"transactions": [],
"walletCurrency": {
"actual": 6,
"amount": 6,
"currency": "USDC"
},
"currencyOptions": null,
"displayCurrency": {
"actual": 0,
"amount": 6,
"currency": "USDC"
},
"quoteExpiryDate": 1753805701000,
"networkFeeCurrency": {
"actual": 0,
"amount": 0,
"currency": "USDC"
},
"merchantDisplayName": "USDC",
"acceptanceExpiryDate": 1753802131000
}
}
Refund initiated
The bvnk:payment:crypto:refund-initiated webhook notifies when a refund process has begun for a cryptocurrency payment. This can happen if your merchant settings are set to auto-refund under- and overpayments, or if a payment is made to an expired payment link.
- Refund Initiated: Complete
- Refund Initiated: Expired
{
"event": "bvnk:payment:crypto:refund-initiated",
"eventId": "01983bf0-c3eb-77b8-bda2-3a09d9bb1235",
"timestamp": "2025-07-24T10:18:11.307235200Z",
"data": {
"flow": null,
"type": "OUT",
"uuid": "bf651b97-722f-400b-b96f-3e56fe182cfe",
"pegged": false,
"refund": {
"flow": null,
"type": "IN",
"uuid": "ad5c2cfc-6ec3-4e51-96f1-03dfad8efc11",
"pegged": false,
"refund": null,
"status": "COMPLETE",
"address": {
"tag": null,
"uri": "ethereum:0xa0b86991c6218b36c1d19d4a2e9eb0ce3606eb48/transfer?address=0x27f9bfa4e6782671e9224c5debdf4350a28bc728&uint256=2E+6",
"address": "0x27f9bfa4e6782671e9224c5debdf4350a28bc728",
"protocol": "ERC20",
"alternatives": []
},
"refunds": [],
"subType": "merchantPayIn",
"twoStep": false,
"metadata": {},
"reference": "RefundWebhook1",
"returnUrl": "",
"customerId": "234850085",
"expiryDate": 1753352469000,
"merchantId": "a1050da2-b085-4a6c-a68b-8c2b1950615a",
"dateCreated": 1753352169000,
"displayRate": {
"base": "USDC",
"rate": 1,
"counter": "USDC"
},
"feeCurrency": {
"actual": 0.014,
"amount": 0.014,
"currency": "USDC"
},
"quoteStatus": "ACCEPTED",
"redirectUrl": "https://pay.bvnk.com/payin/ad5c2cfc-6ec3-4e51-96f1-03dfad8efc11",
"exchangeRate": {
"base": "USDC",
"rate": 1,
"counter": "USDC"
},
"paidCurrency": {
"actual": 5,
"amount": 2,
"currency": "USDC"
},
"transactions": [
{
"hash": "0x7551bf6f17e2d354f21415bdc46234872d6cc9cce1f504259bb72326b9e53b34",
"amount": 5,
"sources": [
"0xa59d9f28537a3a9ee18e76a9fce8261b0ca33723"
],
"isOnHold": false,
"protocol": "ERC20",
"dateCreated": 1753352226000,
"displayRate": {
"base": "USDC",
"rate": 1,
"counter": "USDC"
},
"exchangeRate": {
"base": "USDC",
"rate": 1,
"counter": "USDC"
},
"dateConfirmed": 1753352291000,
"networkFeeAmount": 0.000148,
"networkFeeCurrency": "USDC"
}
],
"walletCurrency": {
"actual": 2,
"amount": 2,
"currency": "USDC"
},
"currencyOptions": null,
"displayCurrency": {
"actual": 2,
"amount": 2,
"currency": "USDC"
},
"quoteExpiryDate": 1753352469000,
"networkFeeCurrency": {
"actual": 0,
"amount": 0,
"currency": null
},
"merchantDisplayName": "Merch_arch",
"acceptanceExpiryDate": 1753352199000
},
"status": "PENDING",
"address": null,
"refunds": [],
"subType": "merchantRefund",
"twoStep": false,
"metadata": {},
"reference": "REFUND-RefundWebhook1-296593287",
"returnUrl": "",
"customerId": "487548579",
"expiryDate": 1761236291296,
"merchantId": "a1050da2-b085-4a6c-a68b-8c2b1950615a",
"dateCreated": 1753352291000,
"displayRate": null,
"feeCurrency": {
"actual": 5.003059,
"amount": 5.003059,
"currency": "USDC"
},
"quoteStatus": "TEMPLATE",
"redirectUrl": "https://pay.bvnk.com/payout/bf651b97-722f-400b-b96f-3e56fe182cfe",
"exchangeRate": null,
"paidCurrency": {
"actual": 0,
"amount": 0,
"currency": null
},
"transactions": [],
"walletCurrency": {
"actual": 0,
"amount": 3,
"currency": "USDC"
},
"currencyOptions": null,
"displayCurrency": {
"actual": 0,
"amount": 3,
"currency": "USDC"
},
"quoteExpiryDate": null,
"networkFeeCurrency": null,
"merchantDisplayName": "Merch_arch",
"acceptanceExpiryDate": null
}
}
Transaction on hold
bvnk:payment:crypto:transaction-on-hold
{
"event": "bvnk:payment:crypto:transaction-on-hold",
"eventId": "01998078-3e41-7a64-92f2-d3c6f3713e95",
"timestamp": "2025-09-25T10:43:07.969870Z",
"data": {
"flow": null,
"type": "OUT",
"uuid": "01998078-0eda-7794-a3aa-97566f9c04e0",
"pegged": false,
"refund": null,
"status": "PROCESSING",
"address": {
"tag": null,
"uri": "ethereum:0xa0b86991c6218b36c1d19d4a2e9eb0ce3606eb48/transfer?address=0x52a2cf95A494Cc7A39D9Cfa6ceF8fB43D1E3993e&uint256=7107892",
"address": "0x52a2cf95A494Cc7A39D9Cfa6ceF8fB43D1E3993e",
"network": "ETHEREUM",
"protocol": "ERC20",
"alternatives": []
},
"refunds": [],
"subType": "merchantPayOut",
"twoStep": false,
"metadata": {},
"walletId": "a:24072237783989:Unkx9kW:1",
"reference": "dc6d9706-020c-4a83-87db-0fbca9f11afd",
"returnUrl": "",
"customerId": "0e493702-f408-4a56-b842-603ac9058253",
"expiryDate": 1758883376000,
"merchantId": "19eda61c-aabc-4186-8ab1-46a3da181bb6",
"dateCreated": 1758796976000,
"displayRate": {
"base": "USDC",
"rate": 1.001703458634,
"counter": "USD"
},
"feeCurrency": {
"actual": 0,
"amount": 0.07,
"currency": "USD"
},
"quoteStatus": "ACCEPTED",
"redirectUrl": "https://pay.sandbox.bvnk.com/payout/01998078-0eda-7794-a3aa-97566f9c04e0",
"exchangeRate": {
"base": "USD",
"rate": 0.998299489847,
"counter": "USDC"
},
"paidCurrency": {
"actual": 0,
"amount": 7.107892,
"currency": "USDC"
},
"transactions": [
{
"hash": null,
"amount": 7.107892,
"sources": [],
"isOnHold": true,
"protocol": "ERC20",
"dateCreated": 1758796988000,
"displayRate": {
"base": "USDC",
"rate": 1.001703458634,
"counter": "USD"
},
"exchangeRate": {
"base": "USD",
"rate": 0.9982994898469539,
"counter": "USDC"
},
"dateConfirmed": null,
"networkFeeAmount": 0,
"networkFeeCurrency": "USDC"
}
],
"walletCurrency": {
"actual": 7.12,
"amount": 7.12,
"currency": "USD"
},
"currencyOptions": null,
"displayCurrency": {
"actual": 0,
"amount": 7.12,
"currency": "USD"
},
"quoteExpiryDate": 1758800577000,
"networkFeeCurrency": {
"actual": 0,
"amount": 1.76,
"currency": "USD"
},
"merchantDisplayName": "USD Merchant",
"acceptanceExpiryDate": 1758797007000,
"embeddedCustomerDetails": {
"reference": null,
"externalReference": "givanov-airbnb-custom-ref123"
}
}
}
Webhook fields
| Field | Description |
|---|---|
event | Type of the event triggering the webhook. |
eventId | Unique identifier for the event. |
timestamp | Timestamp of when the event occurred. |
data.flow | Flow type of the payment. |
data.type | Type of the payment event. |
data.uuid | Unique identifier for the payout transaction. |
data.pegged | Whether the payment is pegged. |
data.refund | Refund information for the payment. |
data.status | Status of the payout. Possible values: • PENDING• PROCESSING• PENDING_APPROVAL• ON_HOLD• COMPLETED• EXPIRED• CANCELLED• FAILED• RETURNED |
data.address | Payment address information. |
data.address.address | The actual payment address. |
data.address.alternatives | Alternative addresses for the payment. |
data.address.network | Network of the payment address (e.g., ETHEREUM). |
data.address.protocol | Protocol of the payment address (e.g., ERC20). |
data.address.tag | Tag associated with the payment address. |
data.address.uri | URI of the payment address. |
data.refunds | List of refunds associated with the payment. |
data.subType | Subtype of the payment (e.g., merchantPayOut, merchantRefund, merchantPayIn). |
data.twoStep | Whether the payment requires a two-step process. |
data.metadata | Additional metadata associated with the webhook event. |
data.reference | Reference identifier for the payment. |
data.returnUrl | URL to return to after payment completion. |
data.customerId | Unique identifier of the customer. |
data.expiryDate | Expiry date of the payment. |
data.merchantId | Unique identifier of the merchant. |
data.dateCreated | Timestamp when the payment was created. |
data.displayRate | Display rate information for the payment. |
data.feeCurrency | Fee currency information including amount and currency. |
data.quoteStatus | Status of the quote (e.g., ACCEPTED, TEMPLATE). |
data.redirectUrl | URL to redirect to for payment processing. |
data.exchangeRate | Exchange rate information for the payment. |
data.paidCurrency | Paid currency information including amount and currency. |
data.transactions | Array of transaction details. |
data.transactions[].amount | Amount of the transaction. |
data.transactions[].dateConfirmed | Date when the transaction was confirmed. |
data.transactions[].dateCreated | Date when the transaction was created. |
data.transactions[].displayRate | Display rate for the transaction. |
data.transactions[].exchangeRate | Exchange rate for the transaction. |
data.transactions[].hash | Hash of the transaction. |
data.transactions[].isOnHold | Whether the transaction is on hold. |
data.transactions[].networkFeeAmount | Network fee amount for the transaction. |
data.transactions[].networkFeeCurrency | Currency of the network fee. |
data.transactions[].protocol | Protocol of the transaction (e.g., ERC20). |
data.transactions[].sources | Source addresses for the transaction. |
data.walletCurrency | Wallet currency information including amount and currency. |
data.currencyOptions | Available currency options for the payment. |
data.displayCurrency | Display currency information including amount and currency. |
data.quoteExpiryDate | Expiry date of the quote. |
data.networkFeeCurrency | Network fee currency information including amount and currency. |
data.merchantDisplayName | Display name of the merchant. |
data.acceptanceExpiryDate | Expiry date for payment acceptance. |
data.walletId | Unique identifier of the wallet. |
data.embeddedCustomerDetails | Embedded customer details including reference and external reference. |
data.id | Unique identifier for the payout transaction. |
data.fees.customerFee.amount | Amount of the customer fee. |
data.fees.customerFee.currency | Currency code of the customer fee. |
data.fees.processingFee.amount | Amount of the processing fee. |
data.fees.processingFee.currency | Currency code of the processing fee. |
data.method | Payment method used for the payout. Possible values: • CRYPTO (Only for crypto payouts. Not applicable to fiat)• WALLET• CARD (Only for crypto payouts. Not applicable to fiat)• SEPA_CT• SEPA_INST• FASTER_PAYMENT• SWIFT• ACH• ACH_SAME_DAY• FEDWIRE• FEDNOW• RTP• BOOK• UNKNOWN |
data.createdAt | Timestamp when the payout was created. |
data.direction | Direction of the payment: incoming (IN) or outgoing (OUT). |
data.updatedAt | Timestamp when the payout was last updated. |
data.originator.amount | Amount sent by the originator. |
data.originator.customerId | Unique identifier of the customer. |
data.originator.currency | Currency code of the originator amount. |
data.originator.entity.legalName | Legal name of the sender entity. |
data.originator.entity.type | Type of the sender entity. |
data.originator.walletId | Wallet ID of the Originator. |
data.beneficiary.amount | Amount received by the Beneficiary. |
data.beneficiary.currency | Currency code of the beneficiary amount. |
data.beneficiary.entity.address.addressLine1 | First line of the beneficiary's address. |
data.beneficiary.entity.address.addressLine2 | Second line of the Beneficiary's address. |
data.beneficiary.entity.address.city | City of the Beneficiary's address. |
data.beneficiary.entity.address.country | Country code of the Beneficiary's address. |
data.beneficiary.entity.address.postCode | Postal code of the beneficiary's address. |
data.beneficiary.entity.address.region | Region/state of the beneficiary's address. |
data.beneficiary.entity.dateOfBirth | Date of birth of the beneficiary. |
data.beneficiary.entity.firstName | First name of the beneficiary for individuals. |
data.beneficiary.entity.lastName | Last name of the beneficiary for individuals. |
data.beneficiary.entity.relationshipType | Relationship type of the beneficiary. |
data.beneficiary.entity.type | Type of the beneficiary entity. |
data.beneficiary.bankAccount.accountNumber | Account number of the beneficiary. |
data.beneficiary.bankAccount.accountNumberFormat | Format of the account number of the beneficiary. |
data.beneficiary.bankAccount.bank.address.addressLine1 | First line of the bank's address. |
data.beneficiary.bankAccount.bank.address.addressLine2 | Second line of the bank's address. |
data.beneficiary.bankAccount.bank.address.city | City of the bank's address. |
data.beneficiary.bankAccount.bank.address.country | Country code of the bank's address. |
data.beneficiary.bankAccount.bank.address.postCode | Postal code of the bank's address. |
data.beneficiary.bankAccount.bank.address.region | Region/state of the bank's address. |
data.beneficiary.bankAccount.bank.identificationCode | Bank identification code (BIC/SWIFT). |
data.beneficiary.bankAccount.bank.nid | National identifier of the beneficiary's bank. |
data.beneficiary.bankAccount.intermediaryBanks | List of intermediary banks involved in the transaction. |
data.beneficiary.remittanceInformation | Additional information for the payment. |
metadata | Additional metadata associated with the webhook event. |