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.

Product

Used for

Endpoint

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"
      }
    ]

Parameter

Type

Required

Description

customerId

String

Yes

Uniquely identifying the party requesting the payment. If multiple payments for same party are requested, the ID should remain consistent.

complianceDetails

Object

Yes

Will contain information about the party requesting the deposit.

complianceDetails.
requesterIpAddress

String

Yes

The IP-address of the party requesting the deposit.

Required only if countryCode is not provided.

complianceDetails.
partyDetails

Array of Objects

Yes

Will contain additional information about the party requesting the payment.

complianceDetails.partyDetails.
type

String

Yes

Specifies who the party information belongs to. Possible values:

  • BENEFICIARY = Party receiving the pay-out
  • ORIGINATOR = Party sending the deposit

complianceDetails.partyDetails.
entityType

String

Yes

Specifies the entity type. Possible values:

  • INDIVIDUAL = details about an individual.
  • COMPANY= details about a business.

complianceDetails.partyDetails.
firstName

String

Yes

The first name of the party requesting the deposit.

Required only if entityType = INDIVIDUAL.

complianceDetails.partyDetails.
lastName

String

Yes

The last name of the party requesting the deposit.

Required only if entityType = INDIVIDUAL.

complianceDetails.partyDetails.
dateOfBirth

String

Yes

The 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

String

Yes

The 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

String

Yes

The legal entity name of the company.

Required only if entityType = COMPANY.

complianceDetails.partyDetails.
registrationNumber

String

Yes

The company registration number.

Required only if entityType = COMPANY.

complianceDetails.partyDetails.
relationshipType

String

Yes

This 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

Required

Description

uuid

String

Yes

The UUID associated to this payment channel. This would have been provided in the response when you originally created the payment channel.

merchantId

String

Yes

The merchantId associated to this payment channel.

reference

String

Yes

The reference associated to this payment channel.

customerId

String

Yes

Uniquely identifying the party requesting the payment. If multiple payment channels for same party are created, the ID should remain consistent.

complianceDetails

Object

Yes

Will contain information about the party requesting the deposit.

complianceDetails.
requesterIpAddress

String

Yes

The IP-address of the party requesting the deposit.

Required only if countryCode is not provided.

complianceDetails.
partyDetails

Object

Yes

Will contain additional information about the party requesting the payment.

complianceDetails.partyDetails.
type

String

Yes

Specifies who the party information belongs to. Possible values:

  • BENEFICIARY = Party receiving the pay-out
  • ORIGINATOR = Party sending the deposit

complianceDetails.partyDetails.
entityType

String

Yes

Specifies the entity type. Possible values:

  • INDIVIDUAL = details about an individual.
  • COMPANY= details about a business.

complianceDetails.partyDetails.
firstName

String

Yes

The first name of the party requesting the deposit.

Required only if entityType = INDIVIDUAL.