Receive stablecoins via Payment Links
Use this method to add crypto payments to your checkout flow and collect payments from your customers. You have the option to build your own UI using the API response or redirect your user to a pre-built Hosted Payments Page.
Example use case: this flow is useful for platforms that collect payments from their customers. For example, a trading platform wants to implement a deposit feature, allowing its customers to top up their accounts for futures trading. Customers would go to the cashier, select cryptocurrency as the payment method, and enter the amount they want to deposit. Then, they would be redirected to the Hosted Payments Page to select the cryptocurrency they want to use for the deposit. Here BVNK acts as the provider for cryptocurrency payments.
BVNK generates a wallet address for your customer to send funds to. BVNK monitors the blockchain to detect incoming transactions to the wallet address. Once funds are received, BVNK converts the stablecoins and settles you in fiat, a different stablecoin or the same stablecoin depending on your preference.
Collect payments
To accept stablecoin payments from your customers, do the following:
-
Send the
POST /api/v1/pay/summaryrequest with a similar body. Remember to set thetypeparameter toINto collect payments from your customers:{"walletId": "a:25022613287255:zmHs0pg:1","type": "IN","amount": 10,"currency": "USD","expiryMinutes": 30,"reference": "test_reference_in_Qa4wy9","returnUrl": "https://your-url-here.com/status","payInDetails": {"currency": "USDT"},"customerId": "ba388054-4512-441e-a9c4-cbe9b0fe0332","complianceDetails": {"requesterIpAddress": "77.71.188.87","partyDetails": [{"type": "ORIGINATOR","entityType": "INDIVIDUAL","firstName": "John","lastName": "Doe","dateOfBirth": "1984-06-30","relationshipType": "THIRD_PARTY","countryCode": "DE"}]}}
Instead of passing partyDetails inline with every payment, you can create a reusable contact and reference it by contactId. See Manage contacts for details. You cannot pass both partyDetails and contactId in the same request; doing so will return an error.
You can specify the currencies that are available for your customers while making the payment with the currencyOptions parameter. This object is not mandatory; however, if provided, it restricts the currencies that can be used for the transaction. If currencyOptions is not specified, the customers can deposit funds in any of the 16 available currencies supported by the BVNK platform. For the complete list of supported currencies and protocols, refer to the Supported Currencies API.
The following example limits the list of available currencies to ETH and USDT.
{
"walletId": "a:25022613287255:zmHs0pg:1",
"amount": 2.0,
"currency": "ETH",
...
"currencyOptions": [
{
"code": "ETH"
},
{
"code": "USDT"
}
]
}
Upon successfully submitting the request, you receive the following response:
Response
{
"uuid": "3332388b-43cd-45a1-ad1b-7df5e5f4dc6e",
"merchantDisplayName": "Euro Company",
"walletId": "a:25022613287255:zmHs0pg:1",
"dateCreated": 1728647621633,
"expiryDate": 1728649421633,
"quoteExpiryDate": 1728649422000,
"acceptanceExpiryDate": 1728647652000,
"quoteStatus": "ACCEPTED",
"reference": "test_reference_in_Qa4wy9",
"type": "IN",
"subType": "merchantPayIn",
"status": "PENDING",
"displayCurrency": {
"currency": "USD",
"amount": 10,
"actual": 0
},
"walletCurrency": {
"currency": "EUR",
"amount": 9.15,
"actual": 0
},
"paidCurrency": {
"currency": "USDT",
"amount": 10.008422,
"actual": 0
},
"feeCurrency": {
"currency": "EUR",
"amount": 0.09,
"actual": 0
},
"networkFeeCurrency": null,
"displayRate": {
"base": "USDT",
"counter": "USD",
"rate": 0.999158508704
},
"exchangeRate": {
"base": "USDT",
"counter": "EUR",
"rate": 0.91423
},
"address": {
"address": "0x7b686317f8ed2c2bc3bbd060464f1939359a00e3",
"tag": null,
"network": "ETHEREUM",
"uri": "ethereum:0xdac17f958d2ee523a2206206994597c13d831ec7/transfer?address=0x7b686317f8ed2c2bc3bbd060464f1939359a00e3&uint256=10008422",
"alternatives": [
{
"address": "0xab12ec2f0e47c45ac8ff0c3914fb426d5ef9541a",
"tag": null,
"network": "BINANCE",
"uri": "0xab12ec2f0e47c45ac8ff0c3914fb426d5ef9541a",
"alternatives": []
},
{
"address": "0x3f2b71f5cbca1e4cda0948208f67706a1a519c8e",
"tag": null,
"network": "POLYGON",
"uri": "0x3f2b71f5cbca1e4cda0948208f67706a1a519c8e",
"alternatives": []
},
{
"address": "TYbVJodUGrkWJSWSVnHjXHU6g8RC7AvPE6",
"tag": null,
"network": "TRON",
"uri": "TYbVJodUGrkWJSWSVnHjXHU6g8RC7AvPE6",
"alternatives": []
}
]
},
"returnUrl": "https://your-url-here.com/status",
"redirectUrl": "https://pay.sandbox.bvnk.com/payin?uuid=3332388b-43cd-45a1-ad1b-7df5e5f4dc6e",
"transactions": [],
"refund": null,
"refunds": [],
"currencyOptions": [],
"flow": "DEFAULT",
"twoStep": false,
"metadata": {
"deviceType": "desktop",
"sessionId": "abcdef123456",
"userSegment": "premium",
"campaignId": "promo-spring-2025"
},
"customerId": "ba388054-4512-441e-a9c4-cbe9b0fe0332"
}
Here, take note of the redirectURL variable, which is used to direct customers to the Hosted Payments Page for digital asset selection.
Provide additional party information
You may also need to provide additional party information to comply with the Travel Rule. See the Provide additional party information guide for more details.
Handle errors
If a customer uses an incorrect currency, BVNK can still process the payment. However, you have to show them a disclaimer forcing to use the correct currency, or the payment can be declined, or your funds could be lost.