Cross-border transfer¶
The payer in Russia pays in rubles from their own bank, and the requisite is a phone or a card in another country, for example Tajikistan or Uzbekistan. The recipient gets the local currency (somoni, sum); the payment side does the conversion. For you it is a ruble payment: the amount, rate, fee and USDT credit work exactly as for SBP and card transfer.
You do not choose the recipient country: the payment side chooses it and returns it in the response. Show it to the payer so they know where the transfer goes.
- Your server → API
POST /api/v1/paymentswithpayment_method=cross_border_cardandbank_code=Т-Банк(the payer's bank) - APIPicks requisites for a transfer from this bank
- API ⇢ Your server
201:status=processing,requisite— a phone or a card,requisite_bank,cross_border_country - Your server → PayerThe requisite, recipient, the recipient's bank and country, the amount in rubles and the deadline
- PayerSends rubles from their bank app
- API → Your serverCallback:
completedorcanceled
Methods¶
payment_method |
Requisite | How the client pays |
|---|---|---|
cross_border_sbp |
phone number | a cross-border transfer by phone number |
cross_border_card |
card number | a transfer to a card in another country (c2c) |
The method must be in your project's contract, like sbp and card_transfer: check the
contract limits — they list entries with these methods.
Payer's bank and fee¶
bank_code is the bank the client pays from, as for sbp and card_transfer: a name from the
directory for geo_code (Т-Банк, Сбер, Альфа). The fee and the choice of the
payment side depend on the method and the bank: for example, cross_border_card + T-Bank and
cross_border_sbp + Sber are separate contract entries with their own fees. Without bank_code —
any bank, under the "any bank" entry.
The recipient country does not affect the fee: one contract entry covers transfers to both Tajikistan and Uzbekistan.
Create a payment¶
POST /api/v1/payments — a signed request, as for other methods.
From a specific bank — with bank_code of the payer's bank:
{"merchant_payment_id": "order-47", "amount": 25000, "currency": "RUB", "geo_code": "RU",
"payment_method": "cross_border_card", "bank_code": "Т-Банк"}
From any bank — without bank_code:
{"merchant_payment_id": "order-46", "amount": 10000, "currency": "RUB", "geo_code": "RU",
"payment_method": "cross_border_sbp"}
Fields¶
| Field | Req. | Rules |
|---|---|---|
payment_method |
yes | cross_border_sbp or cross_border_card |
geo_code |
no | The payer's country, default RU |
currency |
no | The payer's currency, default RUB: the payment amount is in it |
bank_code |
no | The payer's bank — a name from the directory for geo_code, for example Т-Банк. Without it — any bank |
amount, merchant_payment_id, callback_url, client_id, client_username, client_ip |
— | As for SBP |
The request has no recipient country: cross_border_country in the request is a 400 error.
Response and callback¶
The response and callback are the same as for SBP, plus cross_border_country:
{
"id": "3f1c2b9e-6a8d-4c4b-9a71-2c7f5d1e0a42",
"merchant_payment_id": "order-47",
"status": "processing",
"amount": 25000,
"currency": "RUB",
"geo_code": "RU",
"payment_method": "cross_border_card",
"bank_code": "Т-Банк",
"cross_border_country": "TJ",
"requisite": "4444888815426816",
"requisite_bank": "Банк Эсхата",
"holder_name": "Фаридун Р.",
"merchant_information": {"course": 82.50, "rate": 9.00, "amount_usdt": "303.0303",
"amount_rate": "22750.0000", "amount_usdt_rate": "275.7575"}
}
requisite— a phone forcross_border_sbp, a card number forcross_border_card. Show it to the payer withholder_name,requisite_bankand the country: the payer picks the recipient's country and bank in their app.cross_border_country— the recipient country (TJ— Tajikistan,UZ— Uzbekistan) chosen by the payment side. It is absent until requisites are issued or when the country is unknown.bank_code— the payer's bank from the request;requisite_bank— the recipient's bank that issued the requisite.- Payments of other methods do not have
cross_border_country.
Settlement¶
The payment is in rubles: merchant_information is the same settlement
at the USDT/RUB rate and your contract fee for the cross-border method and bank. The recipient
country's currency is not part of it.
Errors¶
| HTTP | error |
When |
|---|---|---|
| 400 | bad_request |
The request has cross_border_country or another unknown field |
| 422 | cross_border_invalid |
bank_code is a bank of another country, not the payer's bank of geo_code (for example a bank of Tajikistan) |
| 422 | bank_not_found |
bank_code is not in the directory |
| 422 | payment_not_covered |
The cross-border method and bank are not in your contract or the amount is out of range |
| 422 | payment_not_routable |
A transfer from this bank cannot be accepted right now |
A bank of another country is an error
bank_code of any method is the payer's bank. A bank of Tajikistan or Uzbekistan in
bank_code is rejected (422 cross_border_invalid): the payment side chooses the recipient's
bank.
See also¶
- Bank directory — bank names by country.
- SBP payments — fields, statuses and edge cases shared by all methods.
- API reference — the field schema.