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
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.
- With our widget
- Without 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
- PHP
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"
}'
use Bank131\SDK\API\Request\Builder\RequestBuilderFactory;
use Bank131\SDK\Client;
use Bank131\SDK\Config;
$config = new Config(
'https://demo.bank131.ru',
'your_project_name',
file_get_contents('/path/to/your/private_key.pem')
);
$client = new Client($config);
$request = RequestBuilderFactory::create()
->createPayoutSession()
->setMetadata('good')
->build();
$response = $client->session()->create($request);
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
- Successful response example
- Unsuccessful response example
{
"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"
}
}
}]
}
}
{
"error": {
"code": "invalid_request",
"description": "participant_details.recipient.full_name.not_blank"
},
"status": "error"
}
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
- PHP
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"
}'
use Bank131\SDK\Client;
use Bank131\SDK\Config;
$config = new Config(
'https://demo.bank131.ru',
'your_project_name',
file_get_contents('/path/to/your/private_key.pem')
);
$client = new Client($config);
$response = $client->session()->confirm('session_id');
Canceling the session
- cURL
- PHP
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"
}'
use Bank131\SDK\Client;
use Bank131\SDK\Config;
$config = new Config(
'https://demo.bank131.ru',
'your_project_name',
file_get_contents('/path/to/your/private_key.pem')
);
$client = new Client($config);
$response = $client->session()->cancel('session_id');
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 >
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
}
You can pass card/account details in plain text or using a token/hash, YooMoney wallet details—in plain text only.
If you have a token or a hashed number of the required card or account, you can use it. Otherwise, you can create a token for a card using the tokenize/elements method or for an account using the tokenize method. Alternatively, you can get a hashed number for a card using our card tokenization widget or for an account using our account tokenization widget.
Step 1. 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, account or YooMoney wallet along with the token/hash if you use it right away and skip the next step. This option is not recommended.
Request example
- cURL
- PHP
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"
}'
use Bank131\SDK\API\Request\Builder\RequestBuilderFactory;
use Bank131\SDK\Client;
use Bank131\SDK\Config;
$config = new Config(
'https://demo.bank131.ru',
'your_project_name',
file_get_contents('/path/to/your/private_key.pem')
);
$client = new Client($config);
$request = RequestBuilderFactory::create()
->createPayoutSession()
->setMetadata('good')
->build();
$response = $client->session()->create($request);
Step 2. 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, account or YooMoney wallet along with the token/hash if you use it.
Request example
- To a card
- To a card with a token
- To a wallet
- cURL
- PHP
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": "bank_card",
"bank_card": {
"number": "2200********4940"
}
}
},
"amount_details": {
"amount": 10000,
"currency": "rub"
},
"metadata": "good",
"participant_details": {
"recipient": {
"full_name": "Ivanov Ivan Ivanovich"
}
}
}'
use Bank131\SDK\API\Request\Builder\RequestBuilderFactory;
use Bank131\SDK\Client;
use Bank131\SDK\Config;
use Bank131\SDK\DTO\Card\BankCard;
use Bank131\SDK\DTO\Collection\FiscalizationServiceCollection;
use Bank131\SDK\DTO\FiscalizationService;
use Bank131\SDK\DTO\Participant;
use Bank131\SDK\DTO\ProfessionalIncomeTaxpayer;
$config = new Config(
'https://demo.bank131.ru',
'your_project_name',
file_get_contents('/path/to/your/private_key.pem')
);
$client = new Client($config);
$services = new FiscalizationServiceCollection();
$services[] = new FiscalizationService(
'Goods delivery',
new Amount(10000, 'rub'),
1
);
$incomeInformation = new ProfessionalIncomeTaxpayer(
$services,
'590613976192'
);
$incomeInformation->setPayerName('OOO Vector');
$incomeInformation->setPayerType('legal');
$incomeInformation->setPayerTaxNumber('3316004710');
$recipient = new Participant();
$recipient->setFullName('Ivanov Ivan Ivanovich');
$request = RequestBuilderFactory::create()
->startPayoutSessionWithFiscalization('3230')
->setIncomeInformation($incomeInformation)
->setCard(new BankCard('2200********4940'))
->setAmount(10000, 'rub')
->setRecipient($recipient)
->setMetadata('good')
->build();
$response = $client->session()->create($request);
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": "tokenized_card",
"tokenized_card": {
"token": "759c9852dde2211d7531b3d905c1d513fbfb914bee87fb567d99c7b2f2c2ad44"
}
}
},
"amount_details": {
"amount": 10000,
"currency": "rub"
},
"metadata": "good",
"participant_details": {
"recipient": {
"full_name": "Ivanov Ivan Ivanovich"
}
}
}'
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": "wallet",
"wallet": {
"type": "yoomoney",
"yoomoney": {
"account": "410012411727100"
}
}
},
"amount_details": {
"amount": 10000,
"currency": "rub"
},
"metadata": "good",
"participant_details": {
"recipient": {
"full_name": "Ivanov Ivan Ivanovich"
}
}
}'
Response examples
- Successful response example
- Unsuccessful response example
{
"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"
}
}
}]
}
}
{
"error": {
"code": "invalid_request",
"description": "participant_details.recipient.full_name.not_blank"
},
"status": "error"
}
Step 3. 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": {
"last4": "4940",
"brand": "mir",
"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 4. 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
- PHP
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"
}'
use Bank131\SDK\Client;
use Bank131\SDK\Config;
$config = new Config(
'https://demo.bank131.ru',
'your_project_name',
file_get_contents('/path/to/your/private_key.pem')
);
$client = new Client($config);
$response = $client->session()->confirm('session_id');
Canceling the session
- cURL
- PHP
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"
}'
use Bank131\SDK\Client;
use Bank131\SDK\Config;
$config = new Config(
'https://demo.bank131.ru',
'your_project_name',
file_get_contents('/path/to/your/private_key.pem')
);
$client = new Client($config);
$response = $client->session()->cancel('session_id');
Step 5. 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 >
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
}