Make a Payment

To create a payment, send the POST /api/v1/pay/summary request with a similar body:

{
    "merchantId": "86955f40-8f4e-464c-be2b-583635bf1c62",
    "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"
            }
        ]
    }
}

In the request, you need to specify at least the following parameters:

Parameter

Type

Required

Description

merchantId

string

Yes

Your Merchant ID. You can find it on the Merchant Details page in your account.

To learn how to create a Merchant, refer to theCreate Your First Merchant guide.

reference

string

Yes

Reference relating to the payment that you and your customer will see. You can place any string here.

amount

long

Yes

Amount required to complete the payment. Minimum deposit: €5.

currency

string

Yes

Currency code you want to display the price in for the end-user.

returnUrl

string

No

URL to redirect a user to the merchant's site when they click "back to merchant" in the payment flow.

type

string

Yes

Transaction type.

  • IN for incoming payments.
  • OUT for outgoing payments.

expiryMinutes

integer

No

Time limit granted to end-users for completing incoming payments. If the parameter is left blank in your request, BVNK will default it to 20 minutes.

payInDetails.currency

string

No

Currency for incoming payments.

Set the value if you already know the currency your end-user uses for pay-ins, to skip the cryptocurrency selection screen.

Leave the value blank to allow your customers to specify the desired currency.

payInDetails.protocol

string

No

Protocol is strictly required when supplying payInDetails.currency. For the complete list of supported protocols for each currency, refer to the Currencies document.

You can also include custom metadata in your payment request. This metadata will be associated with the transaction and will be included in webhook events related to it.

To add metadata, include a top-level JSON object with the key metadata. The value of this key is another JSON object containing your desired key-value pairs.

{
    "metadata": {
        "orderId": "PO-2025-001",
        "internalUserId": "user-456",
        "reason": "Customer withdrawal"
    }
}

Upon successfully submitting the request, you receive the following response:

{
    "uuid": "3332388b-43cd-45a1-ad1b-7df5e5f4dc6e",
    "merchantDisplayName": "Euro Company",
    "merchantId": "86955f40-8f4e-464c-be2b-583635bf1c62",
    "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,
        "protocol": "ERC20",
        "uri": "ethereum:0xdac17f958d2ee523a2206206994597c13d831ec7/transfer?address=0x7b686317f8ed2c2bc3bbd060464f1939359a00e3&uint256=10008422",
        "alternatives": [
            {
                "address": "0xab12ec2f0e47c45ac8ff0c3914fb426d5ef9541a",
                "tag": null,
                "protocol": "BEP20",
                "uri": "0xab12ec2f0e47c45ac8ff0c3914fb426d5ef9541a",
                "alternatives": []
            },
            {
                "address": "0x3f2b71f5cbca1e4cda0948208f67706a1a519c8e",
                "tag": null,
                "protocol": "POLYGON",
                "uri": "0x3f2b71f5cbca1e4cda0948208f67706a1a519c8e",
                "alternatives": []
            },
            {
                "address": "TYbVJodUGrkWJSWSVnHjXHU6g8RC7AvPE6",
                "tag": null,
                "protocol": "TRC20",
                "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.


What’s Next

In the following guide, you'll learn how to redirect your customers to a Hosted Payments Page, allowing them to complete a payment. Before that, you can also configure specific cryptocurrencies to be used in payments.