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
| Parameter | Type | Description |
|---|---|---|
id | string | Payment 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.
| Field | Type | Description |
|---|---|---|
receipt | file | Transfer receipt. The names attachment, file, proof are also accepted |
data | string (JSON) | JSON part of the request, e.g. {"receipt_url":"..."} |
receipt_url | string | Link 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:
| Status | Description |
|---|---|
COMPLETED | Payment successfully confirmed by the system |
CANCELLED | Payment cancelled (transfer not found) |
Errors
| Code | HTTP | Description |
|---|---|---|
PAY_001 | 500 | Internal error |
PAY_006 | 404 | Payment not found |
PAY_008 | 400 | Payment 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