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 . |
Updated 23 days ago