Transfer between bank accounts (A2A)
A2A, or account-to-account payments, are direct electronic transfers of funds from the buyer's bank account to the recipient's account. A2A payments bypass traditional payment systems and are instantly credited to the recipient's account.
Currently, this method is only available with direct integration.
Direct integration
Interaction format:
info
Please note that with direct integration, the entire interaction interface must be implemented on your side.
List of improvements:
- display the a2a payment method button on your site (1 in the diagram)
- display page with received QR code to the payer or send it directly to received link (6 in the diagram)
- it is recommended to display some kind of pending page for desktop payments while the user is making the payment in their application.
For example, "Confirm/complete the transaction in your bank's mobile application" (7-8 in the diagram) - display the final payment status (10 in the diagram)
When creating a payment, send a request with the following parameters:
| Parameter | Type | Required | Description |
pos_id | UUID | ✅ | Merchant's identifier (POS_ID) |
mode | MODE | ✅ | direct |
method | METHOD | ✅ | Payment method ( purchase) |
amount | Number | ✅ | Transaction amount. Must be a positive number. The number of decimal digits must be less than or equal to 2 (e.g., 100.00, 250, 50.50) |
currency | CURRENCY | ✅ | Transaction currency (ISO_4217) |
description | String | ✅ | Payment description |
order_id | String | ✅ | Unique identifier of order |
order_3ds_bypass | String | ✅ | 3-D Secure flow option |
payway | String | ✅ | Optional payway. Use "bank_pay" for processing a2a payments |
products | Array[Product] | Array of products to be paid | |
customer_id | String | ✅ | Customer identifier in merchant's system. Is not mandatory in case of using customer_tax_id |
customer_tax_id | String | ✅ | Customer’s tax identification number. The parameter is mandatory for a2a payments |
customer_fname | String | Customer first name | |
customer_lname | String | Customer last name | |
customer_email | String | Customer email | |
customer_phone | String | Customer phone | |
customer_ip | String | Customer IP address | |
customer_country | String | Customer country (ISO 3166-1 (alpha-2)). For instance, UA for Ukraine | |
server_url | URL | Webhook notification will be sent to this URL | |
result_url | URL | Customer will be redirected to this URL after payment. | |
merchant_mcc | MCC | MCC for this transaction | |
payload | String | Field for merchant custom data. Max 4000 symbols. | |
validation_url | String | Preflight request will be sent to this URL |
Request example:
curl --location 'https://cpay.tranzzo.com/api/v1/payment' \
--header 'Content-Type: application/json' \
--header 'X-API-AUTH: CPAY-HMAC-SHA1 $API_KEY:$SIGNATURE' \
--header 'X-API-KEY: $ENDPOINTS_KEY' \
--data '{
"pos_id": "${POS_ID}",
"mode": "direct",
"method": "purchase",
"amount": 1,
"currency": "UAH",
"description": "Order description",
"order_id": "123",
"order_3ds_bypass": "always",
"payway": "bank_pay",
"server_url": "http://callback-stub:9000/consume",
"result_url": "https://example.com/result",
"payload": "sale=true"
}'
Example response after payment initialization (returns user_action_url):
{
"amount": 1,
"billing_order_id": 11231231231,
"cc_mask": "411111******1111",
"cc_token": "ODJkZjBhNmY2OTMyNDJlN2wjMjFjfTQzOXU3ZDFhYzI6cWJmWHFmMHlzM3hYaXJMWEZv",
"cc_token_expiration": "2028-10-10T10:10:22",
"created_at": "2026-02-09T16:06:34.456",
"currency": "UAH",
"customer_country": "UA",
"customer_email": "[email protected]",
"customer_fname": "Tom",
"customer_lname": "Hanks",
"customer_phone": "+380999999999",
"description": "Order description",
"eci": "07",
"gateway_order_id": "2bf5044c-1daa-47b8-a6c0-b9173675ca5c",
"mcc": "4900",
"method": "purchase",
"mode": "direct",
"options_3ds": "always",
"order_id": "2769312212",
"payload": "sale=true",
"payment_id": "bee8e3b9-46ee-4db8-8275-95d8be202aeb",
"payway": "bank_pay",
"pos_id": "ab4c4e99-0154-449a-abae-e42cafdfce54",
"processed_at": "2026-02-09T16:06:35.456",
"receipt_url": "https://cpay.tranzzo.com/public/receipt/12491284012940129402424124124124124ffef3re3rf32f2vf",
"result_url": "https://example.com/result",
"status": "pending",
"status_code": "2124",
"status_description": "Waiting for redirect to continue payment",
"user_action_required": true,
"user_action_url": "https://int.secure3d.net/BNzZkf/action/bee8e3b9-46ee-4db8-8275-95d8be202aeb/start"
}
Additional Webhook parameters provided by a2a payments:
| Parameter | Type | Required | Description |
bank_pay.sender_mfo | String | ✅ | Sender's Bank Identifier Code (BIC) |
bank_pay.sender_iban | String | ✅ | Sender's IBAN |
bank_pay.sender_bank | String | ✅ | Sender's bank name |
bank_pay.sender_name | String | ✅ | Sender's full name |
bank_pay.sender_tax_id | String | ✅ | Sender's tax ID |
bank_pay.receiver_iban | String | ✅ | Receiver's IBAN |
bank_pay.description | String | ✅ | Description of a2a payment |
Example:
"bank_pay": {
"sender_mfo": "test_mfo_456",
"sender_bank": "Pumb",
"sender_iban": "UA558771690896444199621297483",
"sender_name": "John Doe",
"sender_tax_id": "1234567890",
"receiver_iban": "UA573220000000026007233566001",
"description": "Test operation"
}