Skip to main content

Confirm Transfer

Notifies the system that the client has made the transfer and passes a receipt.

Confirmation is a signal, not a state change: the payment status stays as it is, and the payment is still closed by a notification from the executor's banking app or by a provider callback. The signal is visible in the deal card, and the attached receipt is available to whoever reviews a dispute.

Endpoint

POST /v1/payments/{id}/confirm

Path Parameters

ParameterTypeDescription
idstringPayment ID (UUID)

Request Parameters

The request is accepted as multipart/form-data (with a receipt file) or as application/json. Every field is optional — a request with no body is valid.

FieldTypeDescription
receiptfileTransfer receipt. The names attachment, file, proof are also accepted
datastring (JSON)JSON part of the request, e.g. {"receipt_url":"..."}
receipt_urlstringLink to the receipt on your side (in the JSON body or JSON part)

File limits: up to 10 MB, formats png, jpg, jpeg, webp, heic, pdf. A receipt can also be attached later via POST /payments/{id}/receipt.

Request Example

curl -X POST https://api.bopay.io/v1/payments/550e8400-e29b-41d4-a716-446655440000/confirm \
-H "X-Identity: your-api-key" \
-H "X-Signature: calculated-signature" \
-F "[email protected]"

Without a file:

curl -X POST https://api.bopay.io/v1/payments/550e8400-e29b-41d4-a716-446655440000/confirm \
-H "X-Identity: your-api-key" \
-H "X-Signature: calculated-signature"

Response

{
"id": "550e8400-e29b-41d4-a716-446655440000",
"ext_id": "order_12345",
"amount": 5000,
"currency": "RUB",
"status": "PENDING",
"method": "SBP",
"requisites": {
"type": "sbp",
"value": "+79001234567",
"bank": "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",
"message": "Transfer confirmation received, waiting for verification"
}

Statuses After Confirmation

The payment status stays as it is (PENDING). The following statuses are then possible:

StatusDescription
COMPLETEDPayment successfully confirmed by the system
CANCELLEDPayment cancelled (transfer not found)

Errors

CodeHTTPDescription
PAY_001500Internal error
PAY_006404Payment not found
PAY_008400Payment cannot be confirmed (not in PENDING status)

Error Example

{
"error": "PAY_008",
"message": "Payment cannot be confirmed",
"data": {
"status": "COMPLETED"
}
}

1. Direct API Call

The merchant displays requisites to the client and calls /confirm when the client confirms payment:

Merchant → POST /payments → Receives requisites
Merchant → Shows requisites to the client
Client → Makes the transfer
Client → Clicks "I have paid" on the merchant's site
Merchant → POST /payments/{id}/confirm

2. Payment Page (optional)

You can redirect the client to our payment page payment_url:

Merchant → POST /payments → Receives payment_url
Merchant → Redirects the client to payment_url
Client → Sees the requisites on the page
Client → Makes the transfer
Client → Clicks "I have paid" on the page
System → Automatically calls /confirm