Provide party information for crypto payments

Learn what details you must provide within your payments to comply with the travel rule.

Why should I supply additional information?

In established payment systems like credit card and bank transfers, collecting and sharing information about the parties involved in a transaction (such as names) is already standard practice. This same requirement is now being applied to crypto and stablecoin payments through the Travel Rule as part of the EU's MiCA regulation for crypto assets.

The Travel Rule brings greater regulatory clarity and data transparency to crypto, allowing businesses that use stablecoins and other cryptocurrencies to grow in a more secure environment. As crypto becomes a more trusted payment option, we expect more businesses, consumers, and financial institutions to embrace this rapidly expanding market.

More background on this can be found on https://www.bvnk.com/blog/the-travel-rule-crypto-eu

What should I do to comply?

📘

If you have an API integration

to initiate payments in and out, then you will need to update your integration to start including the additional data. Below is a list of the affected endpoints that will require the additional data.


If you are initiating payments solely from within the BVNK Merchant Portal, you will be prompted to include the additional data where applicable within the UI.

By when must the changes be implemented?

👍

The changes must be implemented by December 30, 2024.

Affected API endpoints

If you are using these endpoints, please make sure to update the integration as per the examples below.

ProductUsed forEndpoint
Crypto payments
via Payment Links
Deposits
Payouts
- PROD: https://api.bvnk.com/api/v1/pay/summary
- Sandbox: https://api.sandbox.bvnk.com/api/v1/pay/summary
Crypto payments
via Payment Channels
Deposits- PROD: https://api.bvnk.com/api/v2/channel
- SANDBOX: https://api.sandbox.bvnk.com/api/v2/channel

Supplying the additional data

"customerId": "d063635e-0f83-4e47-a1f3-fc9484df1509",
  "complianceDetails": {
    "requesterIpAddress": "77.71.188.87",
    "partyDetails": [
      {
        "type": "ORIGINATOR",
        "entityType": "INDIVIDUAL",
        "firstName": "John",
        "lastName": "Doe",
        "dateOfBirth": "1984-06-30",
        "relationshipType": "THIRD_PARTY",
        "countryCode": "DE"
      }
    ]
"customerId": "b061943d-e29f-481e-abcb-5c937ee8234e",
  "complianceDetails": {
    "requesterIpAddress": "77.71.188.87",
    "partyDetails": [
      {
        "type": "ORIGINATOR",
        "entityType": "COMPANY",
        "legalName": "Fast Cars LTD",
        "registrationNumber": "ABC123",
        "relationshipType": "THIRD_PARTY",
        "countryCode": "DE"
      }
    ]
ParameterTypeRequiredDescription
customerIdStringYesUniquely identifying the party requesting the payment. If multiple payments for same party are requested, the ID should remain consistent.
complianceDetailsObjectYesWill contain information about the party requesting the deposit.
complianceDetails.
requesterIpAddress
StringYesThe IP-address of the party requesting the deposit.

Required only if countryCode is not provided.
complianceDetails.
partyDetails
Array of ObjectsYesWill contain additional information about the party requesting the payment.
complianceDetails.partyDetails.
type
StringYesSpecifies who the party information belongs to. Possible values:

- BENEFICIARY = Party receiving the pay-out
- ORIGINATOR = Party sending the deposit
complianceDetails.partyDetails.
entityType
StringYesSpecifies the entity type. Possible values:

- INDIVIDUAL = details about an individual.
- COMPANY= details about a business.
complianceDetails.partyDetails.
firstName
StringYesThe first name of the party requesting the deposit.

Required only if entityType = INDIVIDUAL.
complianceDetails.partyDetails.
lastName
StringYesThe last name of the party requesting the deposit.

Required only if entityType = INDIVIDUAL.
complianceDetails.partyDetails.
dateOfBirth
StringYesThe date of birth of the party requesting the deposit. Format: YYYY-MM-DD. Example: 1984-06-30.

Required only if entityType = INDIVIDUAL.
complianceDetails.partyDetails.
countryCode
StringYesThe ISO 3166-1-alpha-2 code of the country that the party resides in. Example: DE.

Required only if requesterIpAddress is not provided.
complianceDetails.partyDetails.
legalName
StringYesThe legal entity name of the company.

Required only if entityType = COMPANY.
complianceDetails.partyDetails.
registrationNumber
StringYesThe company registration number.

Required only if entityType = COMPANY.
complianceDetails.partyDetails.
relationshipType
StringYesThis field specifies the relationship type between the sender and the recipient of the transaction. Possible values:

- SELF_OWNED = The wallet within BVNK is registered under the same entity for both accounts involved in the transaction. This indicates that funds are being moved between accounts owned by the same entity. For example, if the BVNK wallet is registered to Fast Cars LTD and funds are being transferred to another account owned by Fast Cars LTD.

- THIRD_PARTY = The transaction involves accounts belonging to different entities. For example, Fast Cars LTD receives a payment from James Smith, or Fast Cars LTD pays their supplier Tires Supplies Inc.

Code examples on how to include the additional data

{
    "merchantId": "86955f40-8f4e-464c-be2b-583635bf1c62",
    "type": "IN",
    "amount": 5,
    "currency": "USDT",
    "expiryMinutes": 1440,
    "reference": "test_reference_in_1xCbGZ",
    "returnUrl": "https://your-url-here.com/status",
    "customerId": "d063635e-0f83-4e47-a1f3-fc9484df1509",
    "complianceDetails": {
        "requesterIpAddress": "77.71.188.87",
        "partyDetails": [
            {
                "type": "ORIGINATOR",
                "entityType": "INDIVIDUAL",
                "firstName": "John",
                "lastName": "Doe",
                "dateOfBirth": "1984-06-30",
                "relationshipType": "THIRD_PARTY",
              	"countryCode": "DE"
            }
        ]
    }
}
{
    "merchantId": "7fa95319-b854-402c-bbfb-5d9dfe9122b4",
    "payCurrency": "USDT",
    "displayCurrency": "USD",
    "reference": "PayRef-USDT-d063635e",
    "customerId": "d063635e-0f83-4e47-a1f3-fc9484df1509",
    "complianceDetails": {
        "requesterIpAddress": "77.71.188.87",
        "partyDetails": [
            {
                "type": "ORIGINATOR",
                "entityType": "INDIVIDUAL",
                "firstName": "John",
                "lastName": "Doe",
                "dateOfBirth": "1984-06-30",
                "relationshipType": "THIRD_PARTY"
            }
        ]
    }
}
{
    "merchantId": "86955f40-8f4e-464c-be2b-583635bf1c62",
    "type": "OUT",
    "amount": 3,
    "currency": "EUR",
    "expiryMinutes": 30,
    "reference": "test_reference_out_xpO23C",
    "returnUrl": "https://www.your-url-here.com/status",
    "payOutDetails": {
        "code": "crypto",
        "currency": "ETH",
        "protocol": "ETH",
        "address": "0x02ae6765C6991813a3EAa86fe63ebBCA1c9EC156",
        "tag": ""
    },
    "customerId": "d063635e-0f83-4e47-a1f3-fc9484df1509",
    "complianceDetails": {
        "requesterIpAddress": "77.71.188.87",
        "partyDetails": [
            {
                "type": "BENEFICIARY",
                "entityType": "INDIVIDUAL",
                "firstName": "John",
                "lastName": "Doe",
                "dateOfBirth": "1984-06-30",
                "relationshipType": "THIRD_PARTY",
                "countryCode": "DE"
            }
        ]
    }
}

Updating old payment channels with the additional data

If you have payment channels that were previously created without the additional data, you will be able to supply this information by sending a PUT request to the payment channel endpoint (/api/v2/channel). Example below:

Supplying the additional data for old payment channels

{
    "uuid": "7e5e126b-0217-45d4-b38f-5d6f30388257",
    "merchantId": "86955f40-8f4e-464c-be2b-583635bf1c62",
    "reference": "b5af590b-6033-4b15-874b-289f269b15f9",
    "customerId": "d063635e-0f83-4e47-a1f3-fc9484df1509",
    "complianceDetails": {
        "requesterIpAddress": "77.71.188.87",
        "partyDetails": [
            {
                "entityType": "INDIVIDUAL",
                "type": "ORIGINATOR",
                "firstName": "John",
                "lastName": "Doe",
                "dateOfBirth": "1984-06-30",
                "relationshipType": "THIRD_PARTY",
                "countryCode": "DE"
            }
        ]
    }
}
Parameter Type RequiredDescription
uuidStringYesThe UUID associated to this payment channel. This would have been provided in the response when you originally created the payment channel.
merchantIdStringYesThe merchantId associated to this payment channel.
referenceStringYesThe reference associated to this payment channel.
customerIdStringYesUniquely identifying the party requesting the payment. If multiple payment channels for same party are created, the ID should remain consistent.
complianceDetailsObjectYesWill contain information about the party requesting the deposit.
complianceDetails.
requesterIpAddress
StringYesThe IP-address of the party requesting the deposit.

Required only if countryCode is not provided.
complianceDetails.
partyDetails
ObjectYesWill contain additional information about the party requesting the payment.
complianceDetails.partyDetails.
type
StringYesSpecifies who the party information belongs to. Possible values:

- BENEFICIARY = Party receiving the pay-out
- ORIGINATOR = Party sending the deposit
complianceDetails.partyDetails.
entityType
StringYesSpecifies the entity type. Possible values:

- INDIVIDUAL = details about an individual.
- COMPANY= details about a business.
complianceDetails.partyDetails.
firstName
StringYesThe first name of the party requesting the deposit.

Required only if entityType = INDIVIDUAL.