🇷🇺 RU: SBP Disbursement

📘

"paymentMethodName": "SBP"


Payment Method Features

FeatureSBP
CountryRussia
"paymentMethodName" in APISBP
Processing CurrenciesRUB
PaymentsNo
DisbursementsYes
-- Min per transaction amount1 RUB
-- Max per transaction amountVary, depends on your contract
RefundsNo
ChargebacksNo

📘

PAM - is a Personal Authentication Message provided by the Faster Payments System (SBP) in response to a lookup request using the recipient’s identifier (typically a phone number)

Possible Disbursement Scenarios:

Our API will provide you with all the necessary information to execute one of the following scenario:

Step

Mandatory

Description

1

Yes

  1. The client requests the list of available Banks.
  2. The system returns the Bank list.

2

Optional

  1. The client verifies the disbursement possibility.
  2. The system returns whether the disbursement is possible and provides the PAM.
  3. The client shows the PAM to the payer. The payer must review and confirm the PAM before proceeding to the next step.

You can skip this step if you are confident in the request data.

3

Yes

  1. The client initiates the disbursement.
  2. The system returns the disbursement status and additional information.
    The latest disbursement status is returned via a callback.

Workflow: SBP Disbursements

Download in high resolution


[Step 1.1] You need to requests the list of available Banks.

Before checking or creating an intent to make a disbursement, you need to know which bank code to use.

To retrieve the bank code, send a List of Available Banks request using: GET /processing/api/v1/disbursements/banks/{paymentMethod}


[Step 2.1] You verify the possibility of disbursement.

You can skip this step if you are confident in the request data.

  • Use the following API method to check disbursement possibility: POST /processing/api/v1/disbursements/check.
  • Most fields are common across all payment methods and are thoroughly described in the API Reference section.
  • Method-specific parameters ( please make sure you provided them correctly):
    • payee.phone
    • payeePaymentInstrument.incomingDetails.bankCode
  • Ensure these all the required fields are completed accurately so that we can process your request correctly.

Request Example

{
	"payeePaymentInstrument": {
		"paymentMethodName": "SBP",
		 "incomingDetails": {
                    "accountNumber": "+71234567890",
                    "bankCode": "100000000001"
                }
	},
	"submittedAmount": {
		"currency": "RUB"
	},
	"authAmount": {
		"value": 200.00,
		"currency": "RUB"
	}
}

Request fields description:

payeePaymentInstrument

FieldRequiredTypeDescriptionExample
paymentMethodNameYesStringPayment method nameSBP
incomingDetailsYesObjectAdditional data related to payment methodn/a

payeePaymentInstrument.incomingDetails for SBP Disbursement

FieldRequiredTypeDescriptionExample
bankCodeYesStringThe code of the bank participating in SBP transfers100000000001
accountNumberYesStringRecipient's phone number+71234567890

disbursements[].submittedAmount and disbursements[].authAmount

Having two objects that looks similar might be confusing, however we need both objects to process your request correctly when the FX is involved.

Please follow the instruction on the dedicated page Amount Fields: submittedAmount and authAmount


[Step 2.4] Return the PAM in response

You will receive information on whether the disbursement is possible, along with the additionalData.pam.

The response may take up to 30 seconds due to the acquirer’s processing logic.

❗️

For verify the possibility of disbursement please show the pam(recipient’s identifier) to the payer. In this case the payer need to review and confirm the pam before proceeding to the next step.

{
    "isDisbursementAllowed": true,
    "paymentAmount": {
        "value": 200,
        "currency": "RUB"
    },
    "receivedAmountCurrencyCode": "RUB",
    "clientOriginalRequest": {
        "payeePaymentInstrument": {
            "paymentMethodName": "SBP",
            "incomingDetails": {
                    "accountNumber": "+71234567890",
                    "bankCode": "100000000001"
            }
        },
        "submittedAmount": {
            "currency": "RUB"
        },
        "authAmount": {
            "value": 200,
            "currency": "RUB"
        }
    },
    "additionalData": {
        "pam": "Петр Петрович П"
    },
    "errorCode": "CODE_CP0000",
    "errorMessage": "string"
}

[Step 3.1] You need to create a new intent

  • Use the following API method to create an intent: POST /processing/api/v1/intents.
  • When creating the intent, complete the Disbursement object.
  • Method-specific parameters ( please make sure you provided them correctly):
    • payeePaymentInstrument.incomingDetails.accountNumber
    • payeePaymentInstrument.incomingDetails.bankCode
  • Most fields are common across all payment methods and are thoroughly described in the API Reference section.
  • Ensure these all the required fields are completed accurately so that we can process your request correctly.
  • You can skip directly to this step if you are confident in the request data.

Request Example

{
    "clientReferenceId": "202510202",
    "disbursements": [
        {
            "payeePaymentInstrument": {
                "paymentMethodName": "SBP",
                "incomingDetails": {
                    "accountNumber": "+71234567890",
                    "bankCode": "100000000001"
                }
            },
            "submittedAmount": {
                "currency": "RUB"
            },
            "authAmount": {
                "value": 200,
                "currency": "RUB"
            }
        }
    ]
}

Request fields description:

payeePaymentInstrument

FieldRequiredTypeDescriptionExample
paymentMethodNameYesStringPayment method nameSBP
incomingDetailsYesObjectAdditional data related to payment methodn/a

payeePaymentInstrument.incomingDetails for SBP Disbursement

FieldRequiredTypeDescriptionExample
bankCodeYesStringThe code of the bank participating in SBP transfers100000000001
accountNumberYesStringRecipient's phone number+71234567890

[Step 3.5] Return the status in response

  • In the response, you will receive an disbursement id and status

Response Example

{
    "intentId": "24148546870213835",
    "payments": [],
    "disbursements": [
        {
            "id": "241485668832161722",
            "submittedAmount": {
                "currency": "RUB"
            },
            "authAmount": {
                "value": 200,
                "currency": "RUB"
            },
            "payeePaymentInstrument": {
                "id": "3525967789943272833",
                "storedDetails": {
                    "accountNumber": "+71234567890",
                    "bankCode": "100000000001"
                }
            },
            "createdAt": 1761558494.4515812,
            "status": "ACCEPTED"
        }
    ],
    "clientReferenceIntentId": "202510202",
    "intentStatus": "CREATED"
}

[3.9] Receive the callback with the transaction status

🔗

More about Disbursement Callbacks on the dedicated page

  • After the transaction was processed and reached its final status (PAID_OUT or DECLINED)
  • The Platform will notify you about the latest status change via the callback

SIMPLE CALLBACK WITH TRANSACTION STATUS

{
    "transactionType": "DISBURSEMENT",
    "transactionId": "111122223333444455",
    "status": "ACCEPTED"
}

Test Data

Our system allows you to simulate different disbursement statuses in the sandbox environment. To simulate specific scenarios and receive different results, use in POST /processing/api/v1/disbursements/check the additionalData parameter and in POST /processing/api/v1/intents the intent.description parameter.


SBP Check Disbursement Possibility Test flow

High-resolution image is available here

CaseadditionalDataresponse contain
Disbursement is possible--isDisbursementAllowed = true and additionalData.pam
Disbursement is NOT possibleErrorisDisbursementAllowed = false

Test scenarios

Case

Steps

Disbursement is possible

  1. The client creates check disbursement possibility: POST /processing/api/v1/disbursements/check.
  2. A synchronous response is returned with isDisbursementAllowed = true and additionalData.pam.

Disbursement is NOT possible

  1. The client creates check disbursement possibility:  POST /processing/api/v1/disbursements/check using the additionalData parameter with the value "Error".
  2. A synchronous response is returned with isDisbursementAllowed = false.

Request Example for Case "Disbursement is NOT possible"

{
	 "payeePaymentInstrument": {
                "paymentMethodName": "SBP",
                "incomingDetails": {
                    "accountNumber": "+71234567890",
                    "bankCode": "100000000001"
                }
            },
	"submittedAmount": {
		"currency": "RUB"
	},
	"authAmount": {
		"value": 200.00,
		"currency": "RUB"
  },
  "additionalData":"Error"
}

SBP Disbursement Test flow

High-resolution image is available here

Caseintent.descriptionFinal disbursement status
Successful disbursement--PAID_OUT
Disbursement declinedDeclinedDisbursementDECLINED
Disbursement error occurredCreationErrorERROR

Test scenarios

Case

Steps

Successful disbursement

  1. The client creates an intent via  POST /processing/api/v1/intents .
  2. A synchronous response is returned with status = DISBURSEMENT_REQUESTED.
  3. A callback is received with status = PAID_OUT.

Disbursement declined

  1. The client creates an intent via POST /processing/api/v1/intents using the intent.description parameter with the value "DeclinedDisbursement".
  2. A synchronous response is returned with status = DISBURSEMENT_REQUESTED .
  3. A callback is received with status = DECLINED.

Disbursement error occurred

  1. The client creates an intent via  POST /processing/api/v1/intents using the intent.description parameter with the value "CreationError".
  2. A synchronous response is returned with status = ERROR.