Skip to content

SBP Payments

SBP — Faster Payments System (Система Быстрых Платежей) — is a bank-to-bank instant transfer scheme. The payer receives the recipient credentials (phone number, bank and recipient name) and completes the transfer in their own banking application.

Use this page to create payments via SBP using the common Payment API endpoint. Authentication and base URL follow the Payment API docs.

  • Base URL: https://api.wirekassa.com/api/v1/payment/
  • Endpoint: POST /v1/payment/

The payment method identifier transmitted in the API is fps. SBP is the public name of the same method.

You can receive the mispaid status in this method! Please, pay your attention to the Mispaid instruction.

Supported Currencies

  • RUB

Integration Models

SBP payments support two integration models:

  • Redirect flow: The customer is redirected to our secure hosted page. Redirect the user using redirect_url.
  • Server-to-Server: You will receive the recipient credentials in payment_method and display them yourself.

The model applied to a transaction depends on your channel configuration. If your channel is configured to collect payer personal data, the payer provides it on our hosted page and the recipient credentials are issued only afterwards. Please specify the configuration of your channel.

Flow

Common fields (see Payment API):

  • channel (UUID, required)
  • amount (object, required)
    • currency (ISO 4217, required)
    • value (string, required)
  • external_id (string, optional)
  • return_url (string, recommended)
  • payment_method (object, required)

payment_method (type: fps)

Required:

  • type"fps"

SBP takes no additional fields in the request. Any extra field sent inside payment_method is ignored.

Example Request

json
{
  "channel": "550e8400-e29b-41d4-a716-446655440000",
  "amount": { 
    "currency": "RUB", 
    "value": "1000.00" 
  },
  "external_id": "ORDER-10002",
  "payment_method": {
    "type": "fps"
  },
  "return_url": "https://your-company.com/return",
  "callback_url": "https://your-company.com/callback"
}

Example Response (Server to Server)

json
{
  "status": "processing",
  "transaction_id": "7d1c94b2-6f3a-4e58-9a21-15c0be7742d9",
  "amount": {
    "currency": "RUB",
    "value": "1000.00"
  },
  "redirect_url": "https://pay.wirekassa.com/7d1c94b2-6f3a-4e58-9a21-15c0be7742d9/",
  "channel": "550e8400-e29b-41d4-a716-446655440000",
  "payment_method": {
    "type": "fps",
    "phone": "+79997775544",
    "amount": "1000.00",
    "bank_name": "SBER",
    "recipient": "IVAN I."
  },
  "create_date": "2025-10-15T23:54:13.008007+00:00"
}

Recipient Credentials

When the recipient credentials are issued, payment_method contains:

  • phone → Phone number of the recipient the payer must transfer to
  • amount → Exact amount the payer must transfer, as returned by the provider
  • bank_name → Bank of the recipient
  • recipient → Name of the recipient

All four fields are issued together. Show all of them to the payer: an SBP transfer is matched by the recipient phone, bank and the exact amount, so a transfer of a different amount is settled as mispaid.

Example Response (Hosted)

If your channel collects payer personal data on our hosted page, the create response contains no recipient credentials yet. Redirect the payer using redirect_url.

json
{
  "status": "processing",
  "transaction_id": "7d1c94b2-6f3a-4e58-9a21-15c0be7742d9",
  "amount": {
    "currency": "RUB",
    "value": "1000.00"
  },
  "redirect_url": "https://pay.wirekassa.com/7d1c94b2-6f3a-4e58-9a21-15c0be7742d9/",
  "channel": "550e8400-e29b-41d4-a716-446655440000",
  "payment_method": {
    "type": "fps"
  },
  "create_date": "2025-10-15T23:54:13.008007+00:00"
}

Completing the Payment

The payer performs the transfer in their banking application. There is no confirmation call for SBP — the provider reports the result and the transaction is settled on our side.

Poll GET /v1/payment/ or wait for the callback until the transaction reaches a final status:

  • completed → the transfer was received in full
  • mispaid → the transfer was received, but the amount differs from the requested one. Use amount.received instead of amount.value
  • failed → the transfer was not received before the payment expired, or the provider declined the payment

Example Response (Completed)

json
{
  "status": "completed",
  "transaction_id": "7d1c94b2-6f3a-4e58-9a21-15c0be7742d9",
  "amount": {
    "currency": "RUB",
    "value": "1000.00"
  },
  "redirect_url": "https://pay.wirekassa.com/7d1c94b2-6f3a-4e58-9a21-15c0be7742d9/",
  "channel": "550e8400-e29b-41d4-a716-446655440000",
  "create_date": "2025-10-15T23:54:13.008007+00:00",
  "update_date": "2025-10-15T23:58:41.114902+00:00"
}

Notes:

  • The recipient credentials are issued per transaction. Do not cache them and do not reuse them for another payment.
  • If the provider returns incomplete recipient credentials, the payment is declined. Create a new payment in that case.