Verification of beneficiaries before payouts
For security purposes, Bank 131 is required to identify the beneficiaries associated with an escrow account. The API only supports verification for individual beneficiaries who are resident recipients. To verify other beneficiaries, submit the data to the Bank in an Excel file by any convenient means.
Verification via the API
Server address
For testing: https://kyc-stage.bank131.ru/
For live transactions: https://kyc.bank131.ru/
Learn more about the request format >
Request signature
First set up your EECDS:
- Get the enhanced encrypted and certified digital signature (EECDS) from any verification center. Non-resident individuals can sign their requests using RSA Keys.
For testing, you can create a certificate in the CryptoPro Test Verification Center.
- Install CryptoPro CSP and add your certificate to the vault (for example, check this guide for Windows).
- Provide Bank 131 with the list of IP addresses you will use to send requests from.
- Send the public signature key to your Bank 131 manager so we can identify your requests.
You can now sign your requests as follows:
- Take the
payloadcontent, sort by key alphabetically, and write to the file using the UTF-8 encoding.
Example of writing payload content to a file
import json
payload = {...}
payload_bytes = bytes(json.dumps(payload, sort_keys=True) + '\r\n', encoding='utf-8')
with open('payload_bytes.jsonb', 'wb') as f:
f.write(payload_bytes)
- Sign the file with CryptoPro. You can use the cryptcp utility.
Example of file signing
cryptcp -sign -display -thumbprint <signature key fingerprint> -detached payload_json.json payload_json.sig
- Pass the signature from payload_json.sig in the
signaturefield of the request.
Sending data for verification
Send a check request with the individual's data. You will get a request ID in the response. Use it to see the verification result.
- API v2
- API v1
Request parameters
| Name | Mandatory | Type | Description |
|---|---|---|---|
type | + | string | Recipient type: FL_RESIDENT |
last_name | + | string | Last name |
first_name | + | string | First Name |
patronymic | - | string | Patronymic |
birthday | + | string | Date of birth in the following format: DD.MM.YYYY. Should be 18 years old or older |
birthplace | + | string | Place of birth |
citizenship | + | string | Citizenship in ISO 3166-1 alpha-2 format |
inn | + | string | INN: 12 digits |
phone_number | + | string | Phone number (any format) |
email | + | string | Valid email address |
documents | + | array | Russian passport: PASSPORT_RF |
type | + | string | Document type: PASSPORT_RF for Russian passport |
number | + | string | Passport series and number in the following format: 1234567890 |
issuer | + | string | Issuing division |
issuer_date | + | string | Date of issue in the following format: DD.MM.YYYY |
issuer_code | + | string | Subdivision code |
address | + | string | Address of registration |
postcode | - | string | ZIP code |
agent_contract_number | + | string | Number of the agency agreement with the recipient |
agent_contract_date | + | string | Date of the agency agreement with the recipient in the following format: DD.MM.YYYY. Must be less than or equal to the current date |
beneficial_owners | + | string | Information on beneficiary owners. Always: No BO |
public_officials | + | string | Status as a public official. Always: No |
Request example
curl -X POST \
https://kyc.bank131.ru/api/v2/check \
-H 'Content-Type: application/json' \
-H 'X-PARTNER-PROJECT: your_project_name' \
-H 'X-PARTNER-SIGN: signature' \
-d '{
"type": "FL_RESIDENT",
"last_name": "Dmitriev",
"first_name": "Ivan",
"patronymic": "Ivanovich",
"birthday": "01.01.1970",
"birthplace": "Novgorod",
"citizenship": "RU",
"inn": "065553161159",
"phone_number": "+79000000000",
"email": "name@email.com",
"documents": [{
"type": "PASSPORT_RF ",
"number": "0234567890",
"issuer": "UFMS Russia",
"issuer_date": "01.01.2010",
"issuer_code": "123-000"
}],
"address": "Novgorod, Pribrezhnaya str., 53",
"postcode": "365826",
"agent_contract_number": "123456789-0",
"agent_contract_date": "01.01.2020",
"beneficial_owners": "No BO",
"public_officials": "No"
}'
Response parameters
| Name | Mandatory | Type | Description |
|---|---|---|---|
status | + | string | Identification status. Possible options: ok, error |
data | - | Data | Response details |
id | - | number | check request ID |
description | - | string | Request status description |
error | - | Error | Error details |
code | + | string | Error code |
description | + | string | Error description |
Response examples
- Successful response
- Response with an error
{
"status": "ok",
"data": {
"id": "7",
"description": "request added to queue"
}
}
{
"status": "error",
"error": {
"code": "partner_project_not_found",
"description": "partner project not found"
}
}
Response example for a test request
For testing, the value of the status field sent in the response strictly depends on the last digit in ID number of the passport_number field sent in the request.
Last digit in passport_number | status value |
|---|---|
| Even, including 0 | ok |
| Odd | error |
Request parameters
| Name | Mandatory | Type | Description |
|---|---|---|---|
last_name | + | string | Last name |
first_name | + | string | First Name |
patronymic | - | string | Patronymic |
birthday | + | string | Date of birth in the following format: DD.MM.YYYY. Should be 18 years old or older |
birthplace | + | string | Place of birth |
inn | + | string | INN: 12 digits |
phone_number | + | string | Phone number (any format) |
email | + | string | Valid email address |
identity_document | + | string | Document type: Паспорт гражданина РФ |
passport_number | + | string | Passport series and number in the following format: 1234567890 |
issuer | + | string | Issuing division |
issuer_date | + | string | Date of issue in the following format: DD.MM.YYYY |
issuer_code | + | string | Subdivision code |
citizenship | + | string | Citizenship: РФ |
address | + | string | Address of registration |
postcode | - | string | ZIP code |
agent_contract_number | + | string | Number of the agency agreement with the recipient |
agent_contract_date | + | string | Date of the agency agreement with the recipient in the following format: DD.MM.YYYY |
beneficial_owners | + | string | Information on beneficiary owners. Always: No BO |
public_officials | + | string | Status as a public official. Always: No |
migration_card | + | string | Always: - |
right_to_stay_in_rf | + | string | Always: - |
Request example
curl -X POST \
https://kyc.bank131.ru/api/v1/check \
-H 'x-partner-project: test-partner-project' \
-H 'Content-Type: application/json' \
-H 'accept: application/json' \
-d '{
"payload": {
"inn": "065553161159",
"email": "name@email.com",
"issuer": "UFMS Russia",
"address": "53, Pribrezhnaya Alley, Bldg. 9, Bobruisk, 365826",
"birthday": "01.01.1970",
"postcode": "365826",
"birthplace": "Bobruisk",
"last_name": "Ivanov",
"first_name": "Ivan",
"patronymic": "Ivanovich",
"citizenship": "РФ",
"issuer_code": "123-000",
"issuer_date": "01.01.2010",
"phone_number": "+79000000000",
"migration_card": "-",
"passport_number": "0234567890",
"public_officials": "No",
"beneficial_owners": "No BO",
"identity_document": "Паспорт гражданина РФ",
"agent_contract_date": "01.01.2020",
"right_to_stay_in_rf": "-",
"agent_contract_number": "123456789-0"
},
"signature": "dkQzYwTExRc0RFWk1CY0dBMVVFQnd3UTBMTXVJTkNjMEw3Ug0NCmd..."
}'
Response parameters
| Name | Mandatory | Type | Description |
|---|---|---|---|
status | + | string | Identification status. Possible options: ok, error |
data | - | Data | Response details |
id | - | number | check request ID |
description | - | string | Request status description |
error | - | Error | Error details |
code | + | string | Error code |
description | + | string | Error description |
Response examples
- Successful response
- Response with an error
{
"status": "ok",
"data": {
"id": "7",
"description": "request added to queue"
}
}
{
"status": "error",
"error": {
"code": "partner_project_not_found",
"description": "partner project not found"
}
}
Response example for a test request
For testing, the value of the status field sent in the response strictly depends on the last digit in ID number of the passport_number field sent in the request.
Last digit in passport_number | status value |
|---|---|
| Even, including 0 | ok |
| Odd | error |
Verification results
To get the verification result, use the check/{id} method. In the request, specify the ID you received in the response to the check request. Result processing may take anywhere from 10 minutes to 2 days.
- API v2
- API v1
Request parameters
The request body is empty.
Request example
curl -X GET \
https://kyc.bank131.ru/api/v2/check/7 \
-H 'Content-Type: application/json' \
-H 'X-PARTNER-PROJECT: your_project_name' \
Response parameters
| Name | Mandatory | Type | Description |
|---|---|---|---|
status | + | string | Identification status. Possible options: ok, pending, error |
data | - | Data | Response details |
id | - | number | check request ID |
description | - | string | Request status description |
error | - | Error | Error details |
code | + | string | Error code |
description | + | string | Error description |
Response examples
- Successful response
- Processing request
- Response with an error
{
"status": "ok",
"data": {
"id": "7", // check request ID
"description": "valid"
}
}
{
"status": "pending",
"data": {
"id": "7",
"description": "Check in progress"
}
}
Data already verified.
{
"status": "error",
"error": {
"code": "already_exists",
"description": "Request with the same data already exists"
},
"data": {
"id": "7"
}
}
Request parameters
The request body is empty.
Request example
curl -X GET \
https://kyc.bank131.ru/api/v1/check/7 \
-H 'Content-Type: application/json' \
-H 'X-PARTNER-PROJECT: your_project_name' \
Response parameters
| Name | Mandatory | Type | Description |
|---|---|---|---|
status | + | string | Identification status. Possible options: ok, pending, error |
data | - | Data | Response details |
id | - | number | check request ID |
description | - | string | Request status description |
error | - | Error | Error details |
code | + | string | Error code |
description | + | string | Error description |
Response examples
- Successful response
- Processing request
- Response with an error
{
"status": "ok",
"data": {
"id": "7", // check request ID
"description": "valid"
}
}
Send another check/{id} request with the same data later.
{
"status": "pending",
"data": {
"id": "7",
"description": "Check in progress"
}
}
Data already verified.
{
"status": "error",
"error": {
"code": "already_exists",
"description": "Request with the same data already exists"
},
"data": {
"id": "7"
}
}
Error codes and statuses
HTTP response codes
| Code | Description | What you can do |
|---|---|---|
200 | Correct request | Check status |
422 | Request error | See error.description for details:- request_body_validation_error — error in the request body- request_header_validation_error — x-partner-project header missing |
500 | Error on Bank 131's side | Try again later |
Response statuses
Response statuses are passed in the status field.
| Status | Description | Решение |
|---|---|---|
ok | Request processed successfully | Check data |
pending | Request is being processed | To find out the result, retry the request later |
error | Request processing error | Check error |
Error codes
Errors are passed in the error object:
code— error codedescription— error description
| Code | Description | What you can do |
|---|---|---|
invalid_sign | Запрос с указанным идентификатором подписан некорректно | Verify the request signature is properly generated |
passport_validation_failure | По данным МДВ предоставленный паспорт признан недействительным | The passport is invalid. Check the passport data |
passport_validation_failure | В базе данных МВД отсутствуют сведения о предоставленном паспорте | No information about the passport was found. Check the passport data |
inn_validation_failure | По данным ФНС предоставленный паспорт не соответствует предоставленному ИНН | The INN value is not linked to the passport specified. Check the INN |
already_exists | Запрос на проверку с теми же данными был направлен ранее | You have already submitted these data for identification. To see the result, send a check{id} request with the previous verification's ID that you received in the data.id field |
request_not_found | Не найден запрос с указанным идентификатором | The request with the given ID was not found. Check the ID |
partner_project_not_found | Не найден проект с указанным в заголовке идентификатором | The project ID sent in the X-PARTNER-PROJECT header does not exist. Check the ID |
birthday_validation_failure | Возраст проверяемого лица ниже допустимого порога | The verified subject must be an adult. If you receive this error when working with a nominal account, contact your manager |
validation_error | Request validation error. Example: 1 validation error for Request.body → payload → documents → 2 → expire_date. Document MIGRATION_CARD is expired (type=value_error) | Invalid formats and/or controls in values. For detailed information see the description field |
Response examples
- Invalid passport
- No passport data
- INN and passport failed verification
{
"status": "error",
"error": {
"code": "passport_validation_failure",
"description": "По данным МДВ предоставленный паспорт признан недействительным"
}
}
{
"status": "error",
"error": {
"code": "passport_validation_failure",
"description": "В базе данных МВД отсутствуют сведения о предоставленном паспорте"
}
}
{
"status": "error",
"error": {
"code": "inn_validation_failure",
"description": "По данным ФНС предоставленный паспорт не соответствует предоставленному ИНН"
}
}