Skip to main content

Payouts to a self-employed person with a fiscal receipt

To avoid accounting issues for you and problems with the Federal Tax Service for the self-employed person, payouts must be fiscalized. To do this, you will need: the payer's INN, the self-employed person's INN, and receipt details (description and cost of services).

Before making a payout, verify the following:

  • the recipient has an active self-employed status
  • the recipient is connected to Bank 131
  • the recipient's annual income, including the current payout, does not exceed 2.4 million rubles (otherwise, the recipient will lose their self-employed status)

To do this, use the check and request/status methods. If at least one condition is not met, the payout will not go through.

How to make a payout

info

When working with bank cards, you must comply with the PCI DSS requirements depending on the selected payout option.

The steps depend on whether or not you use our widget.

Step 1. Get a public token

A public token is required to initialize the widget. Send a token creation request (token) specifying tokenize_widget as the widget type. In the response you will get a token.

Step 2. Initialize the widget

Initialize the widget on your website using the public token you received at the previous step.

After that, the payee can enter their bank card or account details into the widget form.

How to initialize our card tokenization widget >

How to initialize our account tokenization widget >

Step 3. Create a payment session

Send a session/create request. You will receive the payment session identifier in response. You will need it in the subsequent steps.

Alternatively, you can use the (session/init/payout/fiscalization) method to create a session and a payout at the same time. In this case, specify all the data for fiscalization, parameters for a payout to a card or account along with the hash from the widget right away and skip the next step. This option is not recommended.

Request example
curl -X POST \
https://demo.bank131.ru/api/v1/session/create \
-H 'Content-Type: application/json' \
-H 'X-PARTNER-PROJECT: your_project_name' \
-H 'X-PARTNER-SIGN: signature' \
-d '{
"metadata": "good"
}'

Step 4. Start the payout

Send a session/start/payout/fiscalization request specifying the session identifier, data for fiscalization, and parameters for a payout to a card or account along with the hash from the widget.

Request example for a payout to a card
curl -X POST \
https://demo.bank131.ru/api/v1/session/start/payout/fiscalization \
-H 'Content-Type: application/json' \
-H 'X-PARTNER-PROJECT: your_project_name' \
-H 'X-PARTNER-SIGN: signature' \
-d '{
"session_id":"ps_3230",
"fiscalization_details": {
"professional_income_taxpayer": {
"tax_reference": "590613976192",
"payer_type": "legal",
"payer_tax_number": "3316004710",
"payer_name": "OOO Vector",
"services": [{
"name": "Goods delivery",
"amount_details": {
"amount": 10000,
"currency": "rub"
}
}]
}
},
"payment_method": {
"type": "card",
"card": {
"type": "encrypted_card",
"encrypted_card": {
"number_hash": "3589c9cad4c0e939f6e01a91710b1bef2db5a7a0a9dca274981511120268d420"
}
}
},
"amount_details": {
"amount": 10000,
"currency": "rub"
},
"metadata": "good",
"participant_details": {
"recipient": {
"full_name": "Ivanov Ivan Ivanovich"
}
}
}'
Response examples
{
"status": "ok",
"session": {
"id": "ps_3230",
"status": "created",
"created_at": "2025-05-27T02:03:00.000000Z",
"updated_at": "2025-05-27T02:03:00.000000Z",
"payments": [{
"id": "po_2909",
"status": "in_progress",
"created_at": "2025-05-27T02:03:00.000000Z",
"payment_method": {
"type": "card",
"card": {
"brand": "mir",
"last4": "4940",
"country_iso3": "RUS"
}
},
"amount_details": {
"amount": 10000,
"currency": "rub"
},
"fiscalization_details": {
"professional_income_taxpayer": {
"tax_reference": "590613976192",
"payer_type": "legal",
"payer_tax_number": "3316004710",
"payer_name": "OOO Vector",
"services": [{
"name": "Goods delivery",
"amount_details": {
"amount": 10000,
"currency": "rub"
}
}]
}
},
"metadata": "good",
"participant_details": {
"recipient": {
"full_name": "Ivanov Ivan Ivanovich"
}
}
}]
}
}

Step 5. Wait for a webhook saying the payout is ready

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) it.

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-05-27T02:03:00.000000Z",
"updated_at": "2025-05-27T02:03:00.000000Z",
"next_action": "confirm",
"payments": [{
"id": "po_2909",
"status": "pending",
"created_at": "2025-05-27T02:03:00.000000Z",
"payment_method": {
"type": "card",
"card": {
"brand": "mir",
"last4": "4940",
"country_iso3": "RUS"
}
},
"amount_details": {
"amount": 10000,
"currency": "rub"
},
"fiscalization_details": {
"professional_income_taxpayer": {
"tax_reference": "590613976192",
"payer_type": "legal",
"payer_tax_number": "3316004710",
"payer_name": "OOO Vector",
"services": [{
"name": "Goods delivery",
"amount_details": {
"amount": 10000,
"currency": "rub"
}
}]
}
},
"metadata": "good",
"participant_details": {
"recipient": {
"full_name": "Ivanov Ivan Ivanovich"
}
}
}]
}
}'
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::READY_TO_CONFIRM) {
$session = $hook->getSession();
//do your logic here
}

Step 6. Confirm or cancel the payout

Check the payout details and confirm that you are ready to perform the payout (session/confirm) or cancel it (session/cancel).

Confirming the session
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"
}'
Canceling the session
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"
}'

Step 7. Wait for a webhook with the payout results

Bank 131 will send you a payment_finished webhook. The result of the payout can be found in the status parameter of the payments/payout_list object.

If the status is succeeded, then the payout was successful. If the status is failed, then an error occurred during the payout.

More about the payout statuses >

How to fix an error >

Also, the webhook will return the receipt object containing the FTS receipt identifier and a link to it. Follow the link to download the receipt.

Receipt example
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
}




Ask AI