Payouts from an escrow account to bank cards
You can make payouts from an escrow account to bank cards in the following ways:
This scenario describes how to make a payout to a bank card. This method requires compliance with the PCI DSS standard. Before initiating a payout, identify the beneficiary.
How to enable a webhook to get notified on your escrow account top-ups >
Step 1. Create a payment session
Create a session using the session/multi/create/nominal method. You will receive the payment session identifier in response. You will need it in the subsequent steps.
Alternatively, you can use the
session/multi/init/payment/nominalmethod to create a session and a payout at the same time. In this case, specify all the payout parameters with open card data and skip the next step. This option is not recommended.
Request example
curl -X POST \
https://demo.bank131.ru/api/v1/session/multi/create/nominal \
-H 'Content-Type: application/json' \
-H 'X-PARTNER-PROJECT: your_project_name' \
-H 'X-PARTNER-SIGN: signature' \
-d '{
"metadata": "good"
}'
Step 2. Send the payout
Send a session/multi/start/payment/nominal request, specifying the session identifier alongside the payout parameters with open data.
Example of a payout with open data
curl -X POST \
https://demo.bank131.ru/api/v1/session/multi/start/payment/nominal \
-H 'Content-Type: application/json' \
-H 'X-PARTNER-PROJECT: your_project_name' \
-H 'X-PARTNER-SIGN: signature' \
-d '{
"session_id": "ps_3230",
"payment_details": {
"type": "internal_transfer",
"internal_transfer": {
"type": "transfer_from_nominal_account",
"transfer_from_nominal_account": {
"description": "Transfer under the offer agreement"
}
}
},
"payment_method": {
"type": "card",
"card": {
"type": "bank_card",
"bank_card": {
"number": "5536********8371"
}
}
},
"participant_details": {
"sender": {
"full_name": "Company name",
"beneficiary_id": "1234567890"
},
"recipient": {
"full_name": "Ivanov Ivan Ivanovich"
}
},
"amount_details": {
"amount": 293400,
"currency": "RUB"
},
"customer": {
"reference": "123456789012"
}
}'
Step 3. Wait for a webhook showing that the Bank is ready to perform the payout
Bank 131 will send you a ready_to_confirm webhook. This means that the payout can be performed and the Bank is waiting for you to confirm or cancel.
The webhook body will contain the confirm_information object. Save it, as you will need this object to confirm the transaction.
Webhook example
curl -X POST \
https://partner.ru \
-H 'content-type: application/json' \
-H 'X-PARTNER-SIGN: signature' \
-d '{
"type": "ready_to_confirm",
"session": {
"id": "ps_3230",
"status": "in_progress",
"created_at": "2025-09-14T09:32:19.891392Z",
"updated_at": "2025-09-14T09:32:20.494410Z",
"payments": [{
"id": "po_7639847",
"status": "pending",
"created_at": "2025-09-14T09:32:20.100149Z",
"customer": {
"reference": "123456789012"
},
"payment_method": {
"type": "card",
"card": {
"brand": "mastercard",
"last4": "8371",
"country_iso3": "RUS"
}
},
"amount_details": {
"amount": 293400,
"currency": "RUB"
},
"participant_details": {
"sender": {
"full_name": "Company name",
"beneficiary_id": "1234567890"
},
"recipient": {
"full_name": "Ivanov Ivan Ivanovich"
}
}
}],
"acquiring_payments": [{
"id": "pm_6933973",
"status": "pending",
"created_at": "2025-09-14T09:32:20.099952Z",
"customer": {
"reference": "123456789012"
},
"payment_details": {
"type": "internal_transfer",
"internal_transfer": {
"type": "transfer_from_nominal_account",
"transfer_from_nominal_account": {
"description": "Transfer under the offer agreement",
"card_mask": "553691******8371"
}
}
},
"amount_details": {
"amount": 293400,
"currency": "RUB"
},
"participant_details": {
"sender": {
"full_name": "Company name",
"beneficiary_id": "1234567890"
},
"recipient": {
"full_name": "Ivanov Ivan Ivanovich"
}
}
}],
"next_action": "confirm"
},
"confirm_information": {
"transfer_details": {
"payment_method": {
"type": "card",
"card": {
"brand": "mastercard",
"last4": "8371",
"country_iso3": "RUS"
}
},
"customer": {
"account_number": "40702810700200000000",
"name": "Company name",
"bank_name": "Bank name",
"bik": "049205131",
"correspondent_account_number": "30101810822000000000"
},
"recipient": {
"account_number": "30233810000000000000",
"name": "Ivanov Ivan Ivanovich",
"bank_name": "Bank name",
"bik": "049205123",
"correspondent_account_number": "30101810822000000974"
},
"purpose": "Transfer under the offer agreement",
"amount": {
"amount": 293400,
"currency": "RUB"
}
}
}
}'
Step 4. Confirm or cancel the payout
Check the payout details and confirm the payout (session/confirm) passing the confirm_information object. Alternatively, cancel (session/cancel) the payout.
Confirming a payout
curl -X POST \
https://demo.bank131.ru/api/v1/session/confirm \
-H 'Content-Type: application/json' \
-H 'X-PARTNER-PROJECT: your_project_name' \
-H 'X-PARTNER-SIGN: signature' \
-d '{
"session_id": "ps_3230",
"confirm_information": {
"transfer_details": {
"payment_method": {
"type": "card",
"card": {
"brand": "mastercard",
"last4": "8371",
"country_iso3": "RUS"
}
},
"customer": {
"account_number": "40702810700200000000",
"name": "Company name",
"bank_name": "Bank name",
"bik": "049205131",
"correspondent_account_number": "30101810822000000000"
},
"recipient": {
"account_number": "30233810000000000000",
"name": "Ivanov Ivan Ivanovich",
"bank_name": "Bank name",
"bik": "049205123",
"correspondent_account_number": "30101810822000000974"
},
"purpose": "Transfer under the offer agreement",
"amount": {
"amount": 293400,
"currency": "RUB"
}
}
}
}'
Canceling a payout
curl -X POST \
https://demo.bank131.ru/api/v1/session/cancel \
-H 'Content-Type: application/json' \
-H 'X-PARTNER-PROJECT: your_project_name' \
-H 'X-PARTNER-SIGN: signature' \
-d '{
"session_id": "ps_3230",
"confirm_information": {
"transfer_details": {
"payment_method": {
"type": "card",
"card": {
"brand": "mastercard",
"last4": "8371",
"country_iso3": "RUS"
}
},
"customer": {
"account_number": "40702810700200000000",
"name": "Company name",
"bank_name": "Bank name",
"bik": "049205131",
"correspondent_account_number": "30101810822000000000"
},
"recipient": {
"account_number": "30233810000000000000",
"name": "Ivanov Ivan Ivanovich",
"bank_name": "Bank name",
"bik": "049205123",
"correspondent_account_number": "30101810822000000974"
},
"purpose": "Transfer under the offer agreement",
"amount": {
"amount": 293400,
"currency": "RUB"
}
}
}
}'
Step 5. Wait for a webhook with the results of the payout
Bank 131 will send you a payment_finished webhook. The result of the payout can be found in the status field of the payments/payout_list array.
The succeeded status means the payout has been successful. The failed status means the payout has not been completed because of an error.
More about the payout statuses >
Handling the webhook using SDK
use Bank131\SDK\Client;
use Bank131\SDK\Config;
use Bank131\SDK\Services\WebHook\Hook\WebHookTypeEnum;
$config = new Config(
'https://demo.bank131.ru',
'your_project_name',
file_get_contents('/path/to/your/private_key.pem'),
file_get_contents('/path/to/bank131/public_key.pem')
);
$client = new Client($config);
$hook = $client->handleWebHook('sign from headers', 'request body');
if ($hook->getType() === WebHookTypeEnum::PAYMENT_FINISHED) {
$session = $hook->getSession();
//do your logic here
}