Skip to main content

Create Payment

Creates a new payment and returns the requisites for payment.

Endpoint

POST /v1/payments

Request Parameters

ParameterTypeRequiredDescription
ext_idstringYesUnique order ID in your system (max 255 chars)
amountnumberYesPayment amount in RUB (100 – 300,000)
methodstringNoPayment method: SBP, CARD, SBP_QR, CROSS_BORDER, CROSS_BORDER_CARD, SIM, VIET_QR (see Payment Methods). Default CARD
bankstringNoBank code (filter)
countrystringNoCountry code for CROSS_BORDER: TJ, KZ, UZ, KG
client_idstringNoClient/payer ID in your system
notify_urlstringNoURL for webhook notifications
notification_tokenstringNoToken for webhook validation (see Webhooks)
Notification Token

The notification_token parameter lets you pass an arbitrary token that will be returned in the X-Notification-Token header when sending a webhook. Use it to validate incoming notifications.

Request Example (SBP)

curl -X POST https://api.bopay.io/v1/payments \
-H "Content-Type: application/json" \
-H "X-Identity: your-api-key" \
-H "X-Signature: calculated-signature" \
-d '{
"ext_id": "order_12345",
"amount": 5000,
"method": "SBP",
"client_id": "user_789",
"notify_url": "https://your-site.com/webhook",
"notification_token": "your-secret-token"
}'
Client ID

The client_id parameter lets you track payments of a specific client. Use the user ID from your system (email, phone number, internal ID).

Response (SBP/Card)

{
"id": "550e8400-e29b-41d4-a716-446655440000",
"ext_id": "order_12345",
"amount": 5000,
"currency": "RUB",
"rate": 80.95,
"payin_rate": 11,
"terminal_id": "6f15ad5b-325f-44ca-8f36-233379dcaf4c",
"terminal_name": "Sber Deep RUB",
"status": "PENDING",
"method": "SBP",
"requisites": {
"type": "sbp",
"value": "+79001234567",
"bank": "Сбербанк",
"bank_code": "sberbank",
"holder": "Ivan I."
},
"payment_url": "https://pay.bopay.io/invoice?id=550e8400-e29b-41d4-a716-446655440000",
"valid_until": "2026-01-30T12:30:00Z",
"created_at": "2026-01-30T12:15:00Z"
}
Payment URL

The payment_url field contains a link to the payment page. You can redirect the client to this page, where they will see the requisites and can confirm the transfer.

Response (Cross-Border)

{
"id": "660e8400-e29b-41d4-a716-446655440001",
"ext_id": "order_67890",
"amount": 10000,
"currency": "RUB",
"rate": 80.95,
"payin_rate": 11,
"terminal_id": "6f15ad5b-325f-44ca-8f36-233379dcaf4c",
"terminal_name": "Sber Deep RUB",
"status": "PENDING",
"method": "CROSS_BORDER",
"requisites": {
"type": "phone",
"value": "+992901234567",
"bank": "vasl_bank",
"bank_name": "Vasl Bank",
"holder": "Ivan I.",
"country": "TJ",
"currency": "TJS",
"amount_local": 1237.39
},
"payment_url": "https://pay.bopay.io/invoice?id=660e8400-e29b-41d4-a716-446655440001",
"valid_until": "2026-01-30T12:30:00Z",
"created_at": "2026-01-30T12:15:00Z"
}

Response Fields

FieldTypeDescription
idstringUnique payment ID (UUID)
ext_idstringYour order ID
amountnumberPayment amount in RUB
currencystringCurrency (RUB)
ratenumberRUB/USDT rate fixed for this deal
payin_ratenumberYour pay-in rate for this deal, %
terminal_idstringID of the terminal the payment went through (UUID)
terminal_namestringTerminal name
statusstringPayment status
methodstringPayment method
requisitesobjectRequisites for payment
requisites.typestringType: sbp, card, phone, or qr (for VIET_QR — value = EMV string)
requisites.valuestringPhone number or card number
requisites.bankstringBank name
requisites.bank_codestringBank code (e.g.: sberbank, tinkoff, alfabank)
requisites.bank_namestringBank name (for CROSS_BORDER)
requisites.holderstringRecipient name
requisites.countrystringCountry code (for CROSS_BORDER)
requisites.currencystringRequisites currency (for CROSS_BORDER)
requisites.amount_localnumberAmount in local currency (for CROSS_BORDER)
payment_urlstring | nullPayment page URL (if any)
valid_untilstringPayment expiration time (ISO 8601)
created_atstringCreation time (ISO 8601)

Payment Methods

MethodDescription
CARDBank card
SBPFaster Payments System (transfer by phone number)
SBP_QRSBP via QR code
SIMPayment to a phone number (mobile operator)
CROSS_BORDERCross-border transfer by requisites (TJ, KZ, UZ, KG)
CROSS_BORDER_CARDCross-border transfer to a card

Payment Statuses

StatusDescription
PENDINGAwaiting payment
PROCESSINGClient confirmed the transfer, awaiting verification
COMPLETEDSuccessfully completed
COMPLETED_APPEALSuccessfully completed via appeal (including for an amount different from the order amount)
CANCELLEDCancelled (timeout or manual)
CANCELLED_APPEALCancelled via appeal
DISPUTEDispute opened

Errors

CodeHTTPDescription
PAY_001500Internal error
PAY_002400Invalid parameters (ext_id, amount, method)
PAY_003409Order with this ext_id already exists
PAY_004503No available requisites
PAY_005429Too many payments with the same amount

Error Response Example

{
"error": "PAY_003",
"message": "Payment order already exists",
"data": {
"ext_id": "order_12345"
}
}