# Russian rubble (RUB) ## Create Payment ### Available payment methods and integration options | Method | Redirect | Iframe | H2H | |----------------- |-----------|-----------|---------| | `card` | `True` | `True` | `True` | | `card_transfer` | `True` | `True` | `True` | | `phone_transfer` | `True` | `True` | `True` | | `mobile_topup` | `True` | `True` | `True` | | `sbp` | `True` | `False` | `False` | To enable Iframe, if available, please contact support. ### Card The POST request endpoint is `/rest/paymentgate/simple/` > Request example: ```http POST /rest/paymentgate/simple/ HTTP/1.1 Api-sign: ***** Content-Type: application/json { "shop_key": "00112233-4455-6677-8899-aabbccddeeff", "amount": 29900, "order_currency": "RUB", "payment_currency": "RUB", "payment_method": "card", "order_number": "order-12345", "payment_details": "Payment via order 12345", "success_url": "https://example.com/success", "fail_url": "https://example.com/fail", "lang": "en" } ``` > Response example: ```shell HTTP/1.1 200 OK Content-Type: application/json { "redirect_url": "https://example.com/redirect", "order_token": "7b0906f6-7c14-45ba-a186-86cc49d701fd", "status": "progress", "status_description": "None" } ``` ### Card transfer The POST request endpoint is `/rest/paymentgate/simple/` | Field | Type | Mandatory | Description | |------------------------|---------------|-----------|------------------------------------------| | `user_id` | `string` | `Y` | Unique user ID in the merchant system | > Request example: > ```http POST /rest/paymentgate/simple/ HTTP/1.1 Api-sign: ***** Content-Type: application/json { "shop_key": "00112233-4455-6677-8899-aabbccddeeff", "amount": 29900, "order_currency": "RUB", "payment_currency": "RUB", "payment_method": "card_transfer", "order_number": "order-12345", "payment_details": "Payment via order 12345", "success_url": "https://example.com/success", "fail_url": "https://example.com/fail", "lang": "en", "user_id": "12345" } ``` > Response example: ```shell HTTP/1.1 200 OK Content-Type: application/json { "redirect_url": "https://example.com/redirect", "order_token": "7b0906f6-7c14-45ba-a186-86cc49d701fd", "status": "progress", "status_description": "None" } ``` #### Card transfer H2H For this payment method, you need to send an additional field `payment_method_details` with the selected bank code field. > You can get the list of available banks from the request [Get Avaible Banks](https://hackmd.io/6aGUyzRlSuuLATeb6QIUvw?view#Available-Banks) > If you do not receive available banks, adjust the amount. It is advisable to adjust by a random number within 100-2000 minor units to the account amount. > > You can also skip requesting the list of available banks by specifying the code `any` when creating a transaction — in this case, the transaction will be created with one of the available banks. To ensure successful transaction creation, use a random, non-round payment amount. The POST request endpoint is `/rest/paymentgate/simple/` | Field | Type | Mandatory | Description | |------------------------|---------------|-----------|------------------------------------------| | `user_id` | `string` | `Y` | Unique user ID in the merchant system | > Request example: > ```http POST /rest/paymentgate/simple/ HTTP/1.1 Api-sign: ***** Content-Type: application/json { "shop_key": "00112233-4455-6677-8899-aabbccddeeff", "amount": 29900, "order_currency": "RUB", "payment_currency": "RUB", "payment_method": "card_transfer", "order_number": "order-12345", "payment_details": "Payment via order 12345", "payment_method_details": { "code": "Available bank" }, "success_url": "https://example.com/success", "fail_url": "https://example.com/fail", "lang": "en", "user_id": "12345" } ``` > Response example: ```shell HTTP/1.1 200 OK Content-Type: application/json { "redirect_url": "https://example.com/redirect", "order_token": "7b0906f6-7c14-45ba-a186-86cc49d701fd", "billing_details": { "type": "card", "bank_name": "Example Bank", "cardholder": "John Doe", "card_number": "1234567890123456" } } ``` In the `Card transfer` method, the `type` field will have the value `card` in it When a cross-border transfer type is used, the response to the creation request will be returned as follows. For cross border type method response example: ```shell HTTP/1.1 200 OK Content-Type: application/json { "redirect_url": "https://example.com/redirect", "order_token": "7b0906f6-7c14-45ba-a186-86cc49d701fd", "billing_details": { "type": "card", "country": "Таджикистан", "user_id": "12345_user", "bank_name": "Спитамен банк", "cardholder": "Spitamen P.", "card_number": "1234567890123456", } } ``` ### Phone transfer The POST request endpoint is `/rest/paymentgate/simple/` > Request example: > ```http POST /rest/paymentgate/simple/ HTTP/1.1 Api-sign: ***** Content-Type: application/json { "shop_key": "00112233-4455-6677-8899-aabbccddeeff", "amount": 29900, "order_currency": "RUB", "payment_currency": "RUB", "payment_method": "phone_transfer", "order_number": "order-12345", "payment_details": "Payment via order 12345", "success_url": "https://example.com/success", "fail_url": "https://example.com/fail", "lang": "en", "user_id": "12345" } ``` > Response example: ```shell HTTP/1.1 200 OK Content-Type: application/json { "redirect_url": "https://example.com/redirect", "order_token": "7b0906f6-7c14-45ba-a186-86cc49d701fd", "status": "progress", "status_description": "None" } ``` #### Phone transfer H2H For this payment method, you need to send an additional field `payment_method_details` with the selected bank `code` field. > You can get the list of available banks from the request [Get Avaible Banks](https://hackmd.io/6aGUyzRlSuuLATeb6QIUvw?view#Available-Banks) > If you do not receive available banks, adjust the amount. It is advisable to adjust by a random number within 100-2000 minor units to the account amount. > > You can also skip requesting the list of available banks by specifying the code `any` when creating a transaction — in this case, the transaction will be created with one of the available banks. To ensure successful transaction creation, use a random, non-round payment amount. The POST request endpoint is `/rest/paymentgate/simple/` > Request example: > ```http POST /rest/paymentgate/simple/ HTTP/1.1 Api-sign: ***** Content-Type: application/json { "shop_key": "00112233-4455-6677-8899-aabbccddeeff", "amount": 29900, "order_currency": "RUB", "payment_currency": "RUB", "payment_method": "phone_transfer", "order_number": "order-12345", "payment_details": "Payment via order 12345", "payment_method_details": { "code": "Available bank" }, "success_url": "https://example.com/success", "fail_url": "https://example.com/fail", "lang": "en", "user_id": "12345" } ``` > Response example: ```shell HTTP/1.1 200 OK Content-Type: application/json { "redirect_url": "https://example.com/redirect", "order_token": "7b0906f6-7c14-45ba-a186-86cc49d701fd", "billing_details": { "type": "sbp", "bank_name": "Example Bank", "cardholder": "John Doe", "phone_number": "89991234987" }, "status": "progress", "status_description": "None" } ``` When a cross-border transfer type is used, the response to the creation request will be returned as follows. For cross border type method response example: ```shell HTTP/1.1 200 OK Content-Type: application/json { "redirect_url": "https://example.com/redirect", "order_token": "7b0906f6-7c14-45ba-a186-86cc49d701fd", "billing_details": { "type": "sbp_spec", "country": "Таджикистан", "user_id": "12345_user", "bank_name": "Спитамен банк", "cardholder": "Spitamen P.", "phone_number": "89991234987" } } ``` In the `Phone transfer` method, the `type` field will have the value `sbp` in it ### Deeplinks (Deep Link Payments) #### Overview Deeplinks are supported **only for `card_transfer` and `phone_transfer` payment methods** and **only if available for the selected bank and channel**. A payment with deeplinks is created **exactly the same way as a regular transaction** — no additional request parameters are required. If deeplinks are available, they are returned in the response inside `billing_details.deep_link`. > If deeplinks are not available for the transaction, the `deep_link` field will be absent in the response. --- #### Automatic redirect on mobile devices When the payment `redirect_url` is opened **from a mobile device**, the system will **automatically redirect the user to the corresponding bank application** using the available deeplink. If automatic redirection is not possible (for example, the bank app is not installed), the standard payment page will be shown. --- #### Supported payment methods | Payment method | Deeplinks | |------------------|-----------| | `card_transfer` | Yes (if available) | | `phone_transfer` | Yes (if available) | | Other methods | No | --- #### Request The request format **does not differ** from a standard `card_transfer` or `phone_transfer` payment. Example (`card_transfer`): ```http POST /rest/paymentgate/simple/ HTTP/1.1 Api-sign: ***** Content-Type: application/json { "shop_key": "00112233-4455-6677-8899-aabbccddeeff", "amount": 510400, "order_currency": "RUB", "payment_currency": "RUB", "payment_method": "card_transfer", "order_number": "order-12345", "payment_details": "Payment via order 12345", "success_url": "https://example.com/success", "fail_url": "https://example.com/fail", "lang": "en", "user_id": "12345" } ``` #### Response (with deeplinks) If deeplinks are available for the selected bank and payment method (`card_transfer` or `phone_transfer`), they are returned in the response inside `billing_details.deep_link`. When the `redirect_url` is opened **from a mobile device**, the system will **automatically attempt to redirect the user to the corresponding bank application** using one of the available deeplinks. If automatic redirection is not possible (for example, the bank application is not installed), the user will remain on the standard payment page. #### Example response ```json { "redirect_url": "https://decard.me/frontage/payment/9976p24f-5aca-4a3a-9e68-2502c864862c/", "order_token": "9976c24f-5aca-4a3a-9e68-2502c864852c", "status": "pending", "status_description": "None", "billing_details": { "type": "card", "country": "", "user_id": "", "bank_name": "Some bank", "deep_link": { "ios": { "vtb": [], "sber": [], "tbank": [ "tbank://qr.nspk.ru?invoiceId=f6e57957-f255-40fa-8403-11c93c6bf5e0&invoiceHash=c56p533f5e24e35aa59edebf288722d41f0d1c93d485949aaf1833595a153afb8eb68581226264fa2338339cbaf9990a4878685c9d2ed1bd6025c7079aede35db" ] }, "android": { "vtb": [], "sber": [], "tbank": [ "tbank://qr.nspk.ru?invoiceId=f6e57957-f255-40fa-8403-11c93c6bf5e0&invoiceHash=c56c63f5e24e3535aa59edebf288722d41f0d1c93d485949aaf1833595a153adb8eb68581226264fa2338339cbaf9990a4878685c9d2ed1bd6025c7079aede35db" ] } }, "cardholder": "James Dean", "card_number": "1234567890987654", } } ``` `deep_link` object: | Field | Type | Description | | ------------- | --------------- | ------------------------------------------- | | `ios` | `object` | Deeplinks for iOS banking applications | | `android` | `object` | Deeplinks for Android banking applications | | `<bank_code>` | `array[string]` | List of deeplink URLs for the specific bank | ### Mobiletopup The POST request endpoint is `/rest/paymentgate/simple/` > Request example: > ```http POST /rest/paymentgate/simple/ HTTP/1.1 Api-sign: ***** Content-Type: application/json { "shop_key": "00112233-4455-6677-8899-aabbccddeeff", "amount": 29900, "order_currency": "RUB", "payment_currency": "RUB", "payment_method": "mobile_topup", "order_number": "order-12345", "payment_details": "Payment via order 12345", "success_url": "https://example.com/success", "fail_url": "https://example.com/fail", "lang": "en", "user_id": "12345" } ``` > Response example: ```shell HTTP/1.1 200 OK Content-Type: application/json { "redirect_url": "https://example.com/redirect", "order_token": "7b0906f6-7c14-45ba-a186-86cc49d701fd", "billing_details": { "type": "mobile_topup", "bank_name": "Example Bank", "cardholder": "John Doe", "phone_number": "89991234987" }, "status": "progress", "status_description": "None" } ``` ### SBP The POST request endpoint is `/rest/paymentgate/simple/` > Request example: > ```http POST /rest/paymentgate/simple/ HTTP/1.1 Api-sign: ***** Content-Type: application/json { "shop_key": "00112233-4455-6677-8899-aabbccddeeff", "amount": 29900, "order_currency": "RUB", "payment_currency": "RUB", "payment_method": "sbp", "order_number": "order-12345", "payment_details": "Payment via order 12345", "success_url": "https://example.com/success", "fail_url": "https://example.com/fail", "lang": "en" } ``` > Response example: ```shell HTTP/1.1 200 OK Content-Type: application/json { "redirect_url": "https://example.com/redirect", "order_token": "7b0906f6-7c14-45ba-a186-86cc49d701fd", "status": "progress", "status_description": "None" } ``` ### P2P: The actual payment does not match the declared amount If the payer transferred more or less money to the P2P order, the order goes to the status - **AMOUNT_MISMATCH**. This requires coordination with the merchant's system. To agree with the paid amount (field **approved_amount**), you need to send a confirmation request. The POST Request endpoint is `/rest/paymentgate/order/amount-agree/` > Alternatively, if the merchant is ready to automatically accept any paid amounts (without manual confirmation), they can contact support to enable automatic approval of mismatched payments. > Once enabled, orders with mismatched amounts will be confirmed automatically without the need to send a /amount-agree/ request. \ **POST QUERY Request parameters** | Field | Type | Mandatory | Description | |----------------|------------------|-----------|---------------------------------| | `shop_key` | `string(uuid)` | `Y` | Shop Key | | `order_token` | `string(uuid)` | `Y` | Order token in system | | `order_number` | `string` | `N` | Order number in merchant system | > Request examples: ```http POST /rest/paymentgate/order/amount-agree/ HTTP/1.1 Api-sign: 66207dcc1a1d8596bedbe93728e128c110931c9e12be372aec48f557ba15e787 Content-Type: application/json { "shop_key": "00112233-4455-6677-8899-aabbccddeeff", "order_token": "7b0906f6-7c14-45ba-a186-86cc49d701fd" } ``` ```python import requests import json params = { "shop_key": "00112233-4455-6677-8899-aabbccddeeff", "order_token": "7b0906f6-7c14-45ba-a186-86cc49d701fd" } response = requests.request( "POST", url=f"{base_url}/rest/paymentgate/order/amount-agree/", data=json.dumps(params), headers={ "Content-Type": "application/json", "Api-sign": get_api_sign(params) } ) ``` > Response example: > ```shell HTTP/1.1 200 OK Content-Type: application/json { "payment_currency":"INR", "amount":110000, "approved_amount":110000, "shop":"Shop_title", "card_token":"", "card_brand":"", "pan_bin":"", "pan_mask_short":"", "wallet":"", "token":"7b0906f6-7c14-45ba-a186-86cc49d701fd", "number":"order-12345", "status":"success", "created_date":"06.04.2023 08:16", "expires_at":"06.04.2023 18:16", "pan_mask":"", "payment_type":"upi", "payment_account":null, "payment_account_detail":{}, "billing_details":{ "link":"upi://upi", "name":"beneficiary_name", "account":"account_info", "ifsc_code":"ifsc_code" }, "error_code":"", "error_message":"" } ``` ## Payment Information The GET request endpoint is `/rest/paymentgate/order/info/` > Request example: > ```http GET /rest/paymentgate/order/info/ HTTP/1.1 Api-sign: ***** Content-Type: application/json { "shop_key": "00112233-4455-6677-8899-aabbccddeeff", "order_token": "7b0906f6-7c14-45ba-a186-86cc49d701fd" } ``` > Response example: ```shell HTTP/1.1 200 OK Content-Type: application/json { "payment_currency": "RUB", "amount": 1000000, "approved_amount": 0, "shop": "System-Fl-RUB-12345", "card_token": "", "card_brand": "", "pan_bin": "", "pan_mask_short": "", "wallet": "", "token": "123542-9876-49dg-bacc-1234098765", "number": "13143adsa-d1443-413a-829s-a123444f8766d", "status": "pending", "created_date": "01.04.2025 17:12", "expires_at": "01.04.2025 17:27", "pan_mask": "", "payment_type": "card_transfer", "payment_account": null, "payment_account_detail": {}, "billing_details": { "type": "card", "bank_name": "Example Bank", "cardholder": "John Doe", "card_number": "1234567890123456" }, "error_code": "", "error_message": "", "settlement": { "currency": "RUB", "fee": 0, "fee_rate": "0.0% + 0.0 fix (min. 0.0, max. 0.0)" }, "status_description": null } ``` `billing_details` contains information for H2H ## Available Banks The GET request endpoint is `/rest/paymentgate/methods/` > Request example: ```http GET /rest/paymentgate/methods/ HTTP/1.1 Api-sign: ***** GET query params: { "shop_key": "00112233-4455-6677-8899-aabbccddeeff", "amount": 29900, "currency": "RUB" } ``` > Response example: ```shell HTTP/1.1 200 OK Content-Type: application/json { "currency": "RUB", "methods": [ { "method": "card_transfer", "detail": { "banks": [ { "name": "Example Bank 1", "code": "eb1" }, { "name": "Example Bank 2", "code": "eb2" } ], "min_payment": 0, "max_payment": 9223372036854775807, "prove_methods": [ "-" ], "required_prove_methods": [ "-" ], "mock_default_page": false } }, { "method": "phone_transfer", "detail": { "banks": [ { "name": "Example Bank 3", "code": "eb3" } ], "min_payment": 0, "max_payment": 9223372036854775807, "prove_methods": [ "-" ], "required_prove_methods": [ "-" ], "mock_default_page": false } } ] } ``` ## Create Payout ### Available payout methods | Method | |-------------------------| | `card` | | `phone-transfer` | ### Card The POST request endpoint is `/rest/payoutgate/card/` After the creation (initialization) of the payout, for its execution it is necessary send a request to payout confirmation > Request example: ```http POST /rest/payoutgate/card/ HTTP/1.1 Api-sign: ***** Content-Type: application/json { "shop_key": "00112233-4455-6677-8899-aabbccddeeff", "amount": 9900, "currency": "RUB", "card_pan": "4000000000000002", "card_holder": "Jason Statham" } ``` > Response example: ```shell HTTP/1.1 200 OK Content-Type: application/json { "order_token": "b844d36e-af79-4fd5-81c1-ec186d999a81", } ``` ### Phone transfer <!-- #### Available payout types: --> <!-- - SBP - Sberbank --> ### 1 step - get a list of banks to where we can do payout transactions * The GET request endpoint is `/rest/payoutgate/methods/` #### * Check with support to see if this step is necessary for your channel. **Request format** | Field | Type | Mandatory | Description | |--------------------------|------------------|-----------|----------------------| | `shop_key` | `string(uuid)` | `Y` | Shop Key | | `currency` | `string(3)` | `Y` | Currency of payout | | `amount` | `integer` | `Y` | Amount in minor units| > Request example: ```http GET /rest/payoutgate/methods/?shop_key=00112233-4455-6677-8899-aabbccddeeff&currency=RUB&amount=500000 HTTP/1.1 Api-sign: ***** Content-Type: application/json ``` > Respons example: ```shell HTTP/1.1 200 OK Content-Type: application/json [ { "method": "phone_transfer", "detail": { "banks": [ { "code": "b_8610", "name": "Другой банк РФ'" }, { "code": "b_8607", "name": "Sberbank" }, { "code": "b_10867", "name": "Raiffeisen" }, { "code": "b_11190", "name": "Tinkoff Bank'" } ... ], "min_payout": 0, "max_payout": 10000000 } } ] ``` ### 2 step - payout initialization The POST request endpoint is `/rest/payoutgate/phone-transfer/` **Request format** | Field | Type | Mandatory | Description | |------------------------|---------------|-----------|------------------------------------------| | `bank_code` | `string` | `N` * | Bank code from previus step | | `bank_name` | `string` | `N` * | Human readable bank name | | `recipient_phone` | `string` | `Y` | Recipient phone | | `recipient_full_name` | `string` | `Y` | Recipient full name | #### * One of the fields is required: bank_code or bank_name **bank_code** - if it was received in the first step **bank_name** - if the first step is not needed for this channel After the creation (initialization) of the payout, for its execution it is necessary send a request to payout confirmation > Request example: ```http POST /rest/payoutgate/phone-transfer/ HTTP/1.1 Api-sign: ***** Content-Type: application/json { "shop_key": "00112233-4455-6677-8899-aabbccddeeff", "amount": 500000, "currency": "RUB", "recipient_phone": "+79621308251", "recipient_full_name": "Иванов Иван Иванович", "bank_name": "Сбер" } ``` > Response example: ```shell HTTP/1.1 200 OK Content-Type: application/json { "order_token": "b844d36e-af79-4fd5-81c1-ec186d999a81", } ```