Cryptocurrency transactions
WD Integration option
This integration option lets the customer top up their balance in the merchant's system using cryptocurrency as well as withdraw money from their balance to their cryptocurrency wallet.
Info
This integration option supports only BYN currency. The cryptocurrencies accepted by the provider are listed in the table.
Payment
Parameters of the payment widget and the payment token
Widget payment flow with KYC data submission:
- The customer initiates the balance top-up on the merchant's website and specifies the top-up amount in
BYN. - The merchant initiates the widget or creates a payment token specifying the customer's identifier (
customer.external_id). If there hasn't yet been a successful payment transaction in the bePaid system with the specified identifier, it is necessary to send the following additional parameters:- customer data in the
customerobject; - customer ID document data (
additional_data.customer_id_data); - KYC data (
additional_data.kyc_answers). If there has already been a successful payment transaction in the bePaid with the specifiedcustomer.external_idand the customer's personal data and identity document information have not changed, onlycustomer.external_idparameter needs to be sent.
- customer data in the
- bePaid sends a response with the payment token and the link to the payment page.
- The merchant redirects the customer to the received URL or initiates a widget using the received token.
- The widget redirects the customer to the page with the field for choosing the cryptocurrency.
- The customer selects the cryptocurrency and confirms the payment. The customer submits their email if the email hasn't been sent in the payment token request or when initializing the widget.
- bePaid sends the obtained information to the provider
- [ KYC verification ] Depending on the customer country specified in the request, the widget can redirect the customer to the page with the test with the questions about the cryptocurrency.
- [ KYC verification ] The customer submits the responses to the test and clicks Continue.
- [ KYC verification ] The provider verifies the customer data.
- After the successful verification, the widget displays a message to the customer with the wallet ID to which the transfer needs to be made and the top-up amount equivalent in the selected cryptocurrency.
- The customer makes the transfer to the specified wallet.
- bePaid sends a webhook notification with the payment status to the merchant. The merchant may also request the payment status from bePaid with the status query.
Info
Following the successful KYC verification and a successful payment transaction, the merchant must save the customer.external_id. If there has already been a successful payment transaction for the specified customer.external_id, it is not required to submit the parameters in the additional_data object in the subsequent transaction requests. In the customer object it is only required to send the customer.external_id parameter. For the subsequent payment transactions, steps 8–10 are skipped.
Request
In the case of the integration with the payment widget or the payment page, initiate the widget or create a payment token with the additional parameters specified in the table.
|
|||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
Info
Request example with the parameters for KYC verification
{
"checkout": {
"test": true,
"transaction_type": "payment",
"settings": {
"return_url": "http://127.0.0.1:4567/return",
"success_url": "http://127.0.0.1:4567/success",
"notification_url": "http://your_shop.com/notification"
},
"order": {
"tracking_id": "your_uniq_number",
"currency": "BYN",
"amount": 10000,
"expired_at": "2025-11-29T05:33:38Z",
"description": "description"
},
"customer": {
"external_id": "user-12345",
"gender": "male",
"birth_date": "1990-01-01",
"phone": "+375291234567",
"email": "ivan.petrov@example.com",
"address": "h.22 room 45",
"country": "BY",
"state": "Minsk Region",
"city": "Minsk",
"street": "Street",
"zip": "220000"
},
"additional_data": {
"customer_id_data": {
"document_type": "passport",
"document_series": "MP",
"document_number": "12345678",
"document_country": "BY",
"personal_number": "1234134513451451",
"issuer": "MVD RB",
"issue_date": "2016-05-25",
"expiry_date": "2026-05-24"
},
"kyc_answers": {
"source": "fb",
"answers": {
"countries_citizenship": [
"BY"
],
"not_usa_tax_payer": true,
"using_on_behalf": false,
"agreed": true,
"first_name": "Ivan",
"last_name": "Ivanov",
"middle_name": "Ivanovich",
"first_name_ru": "Иван",
"last_name_ru": "Иванов",
"middle_name_ru": "Иванович",
"birth_address": "BY, Minsk, Ylica, 1",
"registration_district": "Smolevichi District"
}
}
}
}
}
Request example for the verified customer
{
"checkout": {
"test": true,
"transaction_type": "payment",
"settings": {
"return_url": "http://127.0.0.1:4567/return",
"success_url": "http://127.0.0.1:4567/success",
"notification_url": "http://your_shop.com/notification"
},
"order": {
"tracking_id": "your_uniq_number",
"currency": "BYN",
"amount": 10000,
"expired_at": "2025-11-29T05:33:38Z",
"description": "description"
},
"customer": {
"external_id": "user-12345"
}
}
}
Response
Info
{
"checkout": {
"token": "cfa8755fff438ff1f16c2e63006a479c89d4827c12a0d93d6743f3c31f6d519e",
"redirect_url": "https://checkout-staging.begateway.com/widget/hpp.html?token=cfa8755fff438ff1f16c2e63006a479c89d4827c12a0d93d6743f3c31f6d519e"
}
}
{
"response": {
"status": "error",
"message": "Access denied"
}
}
{
"errors": {
"checkout": {
"transaction_type": [
"is missing"
]
}
},
"message": "transaction_type is missing, transaction_type must be one of: authorization, payment, tokenization, recipient_tokenization, charge"
}
Payment request parameters
H2H payment flow with KYC data submission:
- The customer initiates the balance top-up on the merchant's website and specifies the top-up amount in
BYN. - The merchant sends payment request specifying
method.currencyandmethod.token_standardthat the customer will use for the balance top-up.customer.external_idmust be specified in the request. If there hasn't yet been a successful payment transaction in the bePaid system with the specified identifier, it is necessary to send the following additional parameters:- customer data in the
customerobject; - customer ID document data (
additional_data.customer_id_data); - KYC data (
additional_data.kyc_answers). If there has already been a successful payment transaction in the bePaid with the specifiedcustomer.external_idand the customer's personal data and identity document information have not changed, onlycustomer.external_idparameter needs to be sent.
- customer data in the
- bePaid sends a response. Depending on the country, the response can contain the link to the test in the
form.actionparameter. - If the link to the test has been sent in the response, the merchant redirects the customer to it.
- The customer submits the responses to the test and clicks Continue.
- The provider verifies the customer data.
- After the successful verification, bePaid sends a webhook notification to the customer with the wallet ID to which the transfer needs to be made and the top-up amount equivalent in the selected currency.
- The merchant displays the transfer information to the customer
- The customer makes the transfer to the specified wallet in the timeframe of 30 minutes.
- bePaid sends a webhook notification with the payment status to the merchant. The merchant may also request the payment status from bePaid with the status query.
The payment request needs to contain the following additional parameters:
Request
|
|||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
Request example
{
"request": {
"amount": 3501,
"currency": "BYN",
"expired_at": "2025-11-29T05:33:38Z",
"description": "Cryptocurrency",
"test": true,
"tracking_id": "9379992",
"ip": "127.0.0.1",
"language": "en",
"return_url": "https://example.com",
"method": {
"type": "crypto_currency",
"token_standard":"Tron",
"currency": "TRX"
},
"customer": {
"external_id": "user-908743",
"gender": "male",
"birth_date": "1990-01-01",
"phone": "+375291234567",
"email": "ivan.petrov@example.com",
"address": "h.22 room 45",
"country": "BY",
"state": "Minsk Region",
"city": "Minsk",
"street": "1st Street",
"zip": "220000"
},
"additional_data": {
"customer_id_data": {
"document_type": "passport",
"document_series": "MP",
"document_number": "12345678",
"document_country": "BY",
"personal_number": "ww3356768",
"issuer": "MVD RB",
"issue_date": "2016-05-25",
"expiry_date": "2026-05-24"
},
"kyc_answers": {
"source": "fb",
"answers": {
"countries_citizenship": [
"BY"
],
"not_usa_tax_payer": true,
"using_on_behalf": false,
"agreed": true,
"first_name": "Ivan",
"last_name": "Petrov",
"middle_name": "Sergeevich",
"first_name_ru": "Иван",
"last_name_ru": "Петров",
"middle_name_ru": "Сергеевичич",
"birth_address": "BY, Minsk, 1st Street, 1",
"registration_district": "Centralny District"
}
}
}
}
}
Response
Redirect your customer to the URL received as a value of the form.action parameter.
Response example
{
"transaction": {
"uid": "b6f14e63-f350-4bfb-9a0e-6f3dba364acf",
"type": "payment",
"status": "pending",
"amount": 3501,
"currency": "BYN",
"description": "Cryptocurrency",
"created_at": "2025-09-23T10:17:54Z",
"updated_at": "2025-09-23T10:17:55Z",
"method_type": "crypto_currency",
"receipt_url": "https://merchant.bepaid.by/customer/transactions/b6f14e63-f350-4bfb-9a0e-6f3dba364acf/fea7dc8e8c07ef759bd35e9756db73fd9c1854ec6697cca835bde43c2e0cdf2d?language=en",
"payment": {
"status": "pending",
"gateway_id": 5740,
"message": "Transaction was initialized. Customer verification pending."
},
"crypto_currency": {
"type": "crypto_currency",
"currency": "TRX",
"token_standard": "Tron"
},
"customer": {
"zip": "220000",
"city": "Minsk",
"phone": "+375291234567",
"state": "Minsk Region",
"gender": "male",
"street": "1st Street",
"address": "h.22 room 45",
"country": "BY",
"birth_date": "1990-01-01",
"external_id": "user-908743",
"email": "ivan.petrov@example.com",
"ip": "127.0.0.1"
},
"manually_corrected_at": null,
"version": 1,
"message": "Transaction was initialized. Customer verification pending.",
"tracking_id": "9379992",
"test": true,
"language": "en",
"billing_address": {
"zip": "220000",
"city": "Minsk",
"phone": "+375291234567",
"state": "Minsk Region",
"gender": "male",
"street": "1st Street",
"address": "h.22 room 45",
"country": "BY",
"birth_date": "1990-01-01"
},
"additional_data": {
"kyc_answers": {
"source": "fb",
"answers": {
"agreed": true,
"first_name": "Ivan",
"last_name": "Petrov",
"middle_name": "Sergeevich",
"last_name_ru": "Петров",
"birth_address": "BY, Minsk, Ylica, 1",
"first_name_ru": "Иван",
"middle_name_ru": "Сергеевич",
"using_on_behalf": false,
"not_usa_tax_payer": true,
"countries_citizenship": [
"BY"
],
"registration_district": "Centralny District"
}
},
"payment_method": {
"type": "alternative"
},
"customer_id_data": {
"issuer": "MVD RB",
"issue_date": "2016-05-25",
"expiry_date": "2026-05-24",
"document_type": "passport",
"document_number": "12345678",
"document_series": "MP",
"personal_number": "ww3356768",
"document_country": "BY"
}
},
"gateway": {
"iframe": true
},
"form": {
"action": "link-to-test",
"fields": [],
"method": "GET"
}
}
}
Webhook notifications
Webhook notifications are sent in the following cases:
- when the transaction status changes to
pending,expired,failedorsuccessful; - when the customer verification status is changed;
- when the transaction is initialized.
| Transaction status | Is it a final status? | Message text, transaction.message |
Status description |
pending |
no | Transaction was initialized. Customer verification pending. | Notification on transaction initialization, possible cases: 1. New customer, verification process has been initiated. 2. Existing customer, verification has not been passed. |
pending |
no | Transaction was initialized. Customer action is required to complete the payment. | Notification when the customer completed the payment. |
pending |
no | Error while sending test answers. | An error occurred when sending the data with the test results. |
successful |
yes | Transaction successfully processed. | The transaction has been successfully processed. |
failed |
yes | depends on the error | Failed to process the transaction. |
expired |
yes | Transaction expired. | The allowed transaction completion time has expired. |
Notification example: customer action is required
{
"transaction": {
"uid": "3209b045-8f40-46a5-b65f-1b9a76e02cea",
"type": "payment",
"status": "pending",
"amount": 3502,
"currency": "BYN",
"description": "description",
"created_at": "2025-10-02T14:09:21Z",
"updated_at": "2025-10-02T14:10:08Z",
"method_type": "crypto_currency",
"receipt_url": "https://merchant.bepaid.by/customer/transactions/3209b045-8f40-46a5-b65f-1b9a76e02cea/e39c14b784468236c619b8a89ed85ea2adc5b6553f3ebb5328965a3c6944be82?language=en",
"payment": {
"status": "pending",
"gateway_id": 5712,
"ref_id": "18206e7e-dd1b-4dd4-ac43-738e64b1dd71",
"message": "Transaction was initialized. Customer action is required to complete the payment."
},
"crypto_currency": {
"type": "crypto_currency",
"amount": "80",
"currency": "TRX",
"token_standard": "Tron",
"recipient_wallet_id": "TZHsaA4bJVvPLkwkeVwo7mtB65QzyumQxu"
},
"customer": {
"zip": "220000",
"city": "Minsk",
"email": "example+193@gmail.com",
"phone": "17777777777",
"state": "Minsk Region",
"gender": "male",
"street": "Ylica 10",
"address": "1st Street",
"country": "BY",
"device_id": "12312312321fff67",
"birth_date": "1990-01-01",
"external_id": "user-12345193",
"taxpayer_id": "010200A9618",
"ip": "127.0.0.1"
},
"manually_corrected_at": null,
"version": 3,
"message": "Transaction was initialized. Customer action is required to complete the payment.",
"tracking_id": "your_uniq_number",
"test": false,
"language": "en",
"expired_at": "2025-07-01T11:03:01Z",
"billing_address": {
"zip": "220000",
"city": "Minsk",
"email": "example+193@gmail.com",
"phone": "17777777777",
"state": "Minsk Region",
"gender": "male",
"street": "Ylica 10",
"address": "1st Street",
"country": "BY",
"device_id": "12312312321fff67",
"birth_date": "1990-01-01",
"taxpayer_id": "010200A9618"
},
"additional_data": {
"kyc_answers": {
"answers": {
"agreed": true,
"source": "fb",
"first_name": "Ivan",
"last_name": "Ivanov",
"middle_name": "Ivanovich",
"last_name_ru": "Иванов",
"birth_address": "RU, Minsk, Ylica, 1",
"first_name_ru": "Иван",
"middle_name_ru": "Иванович",
"using_on_behalf": true,
"not_usa_tax_payer": true,
"countries_citizenship": [
"RU"
],
"registration_district": "Smolevichi Distr"
}
},
"payment_method": {
"type": "alternative"
},
"customer_id_data": {
"issuer": "MVD RB",
"issue_date": "2016-05-25",
"expiry_date": "2026-05-24",
"document_type": "passport",
"document_number": "12345678",
"document_series": "MP",
"personal_number": "Идентификационный номер",
"document_country": "RU"
}
},
"smart_routing_verification": {
"status": "successful"
},
"gateway": {
"iframe": false
}
}
}
Payout
Payout flow:
- The customer initiates a withdrawal from their balance in the merchant's system, specify the withdrawal amount in
BYNand enter the identifier of their wallet for the withdrawal in one of the accepted cryptocurrencies. - The merchant verifies that the customer has already had a successful payment transaction in their system.
- If the customer has already had a successful payout transaction in the merchant's system, the merchant sends a a payout request, specifying
customer.external_id. - bePaid also verifies that the customer has had a successful payment transaction in their system.
- bePaid sends a response with the
pendingstatus. - bePaid sends a webhook notification with the final payout status to the merchant. The merchant may also request the payment status from bePaid with the status query.
Request
Send a payout request with the following parameters:
|
|||||||||||||||||||||||
Example of the payout request
{
"request": {
"amount": 10000,
"currency": "BYN",
"description": "description",
"test": false,
"tracking_id": "your_uniq_number",
"notification_url": "https://your-notification.url",
"return_url": "https://your-success.url",
"method": {
"type": "crypto_currency",
"token_standard": "Tron",
"currency": "TRX",
"recipient_wallet_id": "GHFH123413hJJHHGHF"
},
"customer": {
"external_id": "user-12345"
}
}
}
Response
|
|||||||||||||||||||||||
Response example
{
"transaction": {
"uid": "5a050f2a-a491-479f-b96c-4ca9f3c28bec",
"type": "payout",
"status": "pending",
"amount": 10000,
"currency": "BYN",
"description": "description",
"created_at": "2025-08-01T13:39:13Z",
"updated_at": "2025-08-01T13:39:14Z",
"manually_corrected_at": null,
"method_type": "crypto_currency",
"receipt_url": "https://merchant.bepaid.by/customer/transactions/5a050f2a-a491-479f-b96c-4ca9f3c28bec/9d31abf45028f04cf47f85e39728081e9706f11111111",
"payout": {
"status": "pending",
"gateway_id": 3878,
"message": "Transaction was initialized.",
"bank_code": 422
},
"crypto_currency": {
"type": "crypto_currency"
},
"customer": {
"email": null,
"ip": null
},
"version": 1,
"message": "Transaction was initialized.",
"test": true,
"billing_address": {},
"additional_data": {
"payment_method": {
"type": "alternative"
}
},
"smart_routing_verification": {
"status": "successful"
}
}
}
Example of the response to the status query, successful payout
{
"transaction": {
"uid": "e92ef070-8593-47dc-ae40-111111",
"type": "payout",
"status": "successful",
"message": "Transaction successfully processed.",
"amount": 3500,
"currency": "BYN",
"description": "description",
"created_at": "2025-09-16T15:12:18Z",
"updated_at": "2025-09-16T15:12:47Z",
"manually_corrected_at": null,
"method_type": "crypto_currency",
"receipt_url": "https://merchant.bepaid.by/customer/transactions/e92ef070-8593-47dc-ae40-c884ebd5e6e2/35a126f73e642bba3506c66e863a0ba6c1bb7d93d629c2e248d6d6f6e6cee545?language=en",
"payout": {
"status": "successful",
"gateway_id": 5712,
"ref_id": "e852c660-b0c2-4856-b333-1111111",
"message": "Transaction successfully processed."
},
"crypto_currency": {
"type": "crypto_currency",
"amount": "80",
"currency": "TRX",
"token_standard": "Tron",
"recipient_wallet_id": "TYPAe4v111111111111111111"
}
...
}
}
Webhook notifications
Webhook notifications are sent when the transaction status changes to pending, expired, failed or successful.
| Transaction status | Is it a final status? | Message text, transaction.message |
Status description |
pending |
no | Transaction was initialized. | The transaction request has been received, but the transaction has not been completed. |
successful |
yes | Transaction successfully processed. | The transaction has been successfully processed. |
failed |
yes | depends on the error | Failed to complete the transaction. |
expired |
yes | Transaction expired. | The allowed transaction completion time has expired. |
Notification example: customer didn't pass KYC-verification
{
"transaction": {
"uid": "b91f6618-0b36-4d3a-a940-11111",
"type": "payout",
"status": "failed",
"amount": 3501,
"currency": "BYN",
"description": "description",
"created_at": "2025-09-29T12:16:10Z",
"updated_at": "2025-09-29T12:16:10Z",
"manually_corrected_at": null,
"method_type": "crypto_currency",
"receipt_url": "https://merchant.bepaid.by/customer/transactions/b91f6618-0b36-4d3a-a940-11111/11111?language=en",
"payout": {
"status": "failed",
"gateway_id": 5712,
"message": "Verified customer not found."
},
"crypto_currency": {
"type": "crypto_currency",
"currency": "TRX",
"token_standard": "Tron",
"recipient_wallet_id": "TYPAe4vUYtUAKgrRt7iUc2fLuVhRHfCiJG"
},
"customer": {
"email": null,
"ip": "127.0.0.1"
},
"version": 1,
"message": "Verified customer not found.",
"tracking_id": "your_uniq_number",
"test": false,
"language": "en",
"paid_at": "2025-09-29T12:16:10Z",
"billing_address": {
"zip": "220000",
"city": "Minsk",
"phone": "17777777777",
"state": "Minsk Region",
"gender": "male",
"street": "10-21",
"address": "1st Street",
"country": "RU",
"device_id": "12312312321fff67",
"birth_date": "1990-01-01",
"taxpayer_id": "010200A9618"
},
"additional_data": {
"payment_method": {
"type": "alternative"
}
},
"smart_routing_verification": {
"status": "successful"
}
}
}
The list of available cryptocurrencies
| Cryptocurrency name | Cryptocurrency code | Cryptocurrency network |
| Bitcoin | BTC | Bitcoin |
| Ethereum | ETH | Ethereum |
| USD Coin | USDC | Ethereum |
| Tether | USDT | Ethereum |
| TON | TON | Ton |
| Tether | USDT | TON |
| Tronix | TRX | Tron |
| Tether | USDT_TRC | Tron |
Possible values for the document_type parameter
document_type parameter value |
Description of the document_type parameter value |
passport |
Passport |
international_passport |
International passport |
foreign_passport |
Foreign citizen’s passport |
id_card |
Identity card (ID card) |
driver_license |
Driver's license |
residence_permit |
Residence permist for a foreign citizen (regular) |
residence_permit_refugee |
Refugee residence permit. (regular) |
residence_permit_bio_refugee |
Refugee residence permit (biometric). |
residence_permit_bio_stateless |
Stateless person’s residence permit (biometric) |
temporary_residence_permit |
Temporary residence permit |
temporary_identity_card |
Temporary identity card |
military_identity_card |
Military service ID card |
military_id |
Military ID |
refugee_certificate |
Refugee certificate |
temporary_asylum_certificate |
Temporary asylum certificate |
resettler_certificate |
Resettler certificate or applicant for status |
travel_document_foreign |
Travel document of a foreign citizen |
migration_card |
Migration card |
seafarer_passport |
Seafarer’s passport / seafarer’s identity card |
diplomatic_certificate |
Diplomatic identity card |
return_certificate |
Return certificate |
other |
Other identity document |