UZ: Bank Cards - Payments
This payment method is supported in two integration scenarios: Host-to-Host and Hosted Checkout.
- For Hosted Checkout, please refer to the dedicated page.
- For Host-to-Host integration, please follow the guide below.
Please use the following
paymentMethodNamevalue when creating theIntentand when completing thepaymentobject."paymentMethodName": "BankCardUZ"
About the Method
BankCardUZ accepts cards of HUMO and UZCARD — the two national payment schemes of Uzbekistan. Virtually every card issued by Uzbek banks belongs to one of these schemes, which makes this method the primary way to accept card payments from customers in Uzbekistan.
Key characteristics of the local schemes to keep in mind:
- All payments are processed in Uzbek soum (
UZS). - Instead of the classic 3-D Secure flow, the payer confirms the payment with an SMS code sent by their bank. The confirmation step is requested for virtually every payment — do not design your flow around a "no confirmation" scenario.
- A security code (
CVV/CVC) may be absent on HUMO/UZCARD cards — it is optional for this method. - Payments are processed in a single step: authorisation and funds withdrawal happen together. There is no authorisation hold stage.
The payment follows the standard card flow of our platform: after the Intent is created, you redirect the payer to the URL returned in the response. The payer briefly lands on our hosted page where the required payer metadata is collected, and is then routed automatically — either straight back to your store (frictionless) or to the SMS confirmation form first (challenge).
Single-step processing onlyThis method has no
AUTHORIZEDstatus and no Capture / Cancellation operations. After creation the payment is inAUTHORIZATION_REQUESTEDand moves directly to the final status:CAPTUREDorDECLINED.A payment cannot be cancelled before the funds are withdrawn. To return funds to the payer, create a Refund after the payment reaches
CAPTURED.
Payment Method Features
| Payment Method | BankCardUZ |
|---|---|
| Country | Uzbekistan |
| Card Schemes | HUMO, UZCARD |
| Processing Currencies | UZS |
| Processing Model | Single-step (no Capture/Cancel) |
| Payments | Yes |
| -- Min per transaction amount | 500 UZS |
| -- Max per transaction amount | 999,999,999 UZS |
| Refunds | Full & Partial |
| -- Full Refund | Yes |
| -- Partial Refund | Yes |
| -- Multiple Partial Refunds | Yes |
| Chargebacks | No |
Possible Payment Scenarios:
| Name | Steps |
|---|---|
| Payment with SMS confirmation (Challenge) | 1. You send an Intent creation request via the API, including a Payment transaction. 2. Our platform validates the incoming data, initiates the payment and returns the redirect URL in payments[].additionalData.details.url.3. You redirect the payer to this URL. Our hosted page collects the required payer metadata. 4. [Confirmation is required] The payer is presented with the confirmation form and enters the SMS code sent by their bank. 5. Our platform receives the confirmation result and completes the payment: the funds are withdrawn in a single step. 6. The payer is redirected back to your redirectUrl.7. Our platform sends a webhook with the final payment status: CAPTURED or DECLINED. |
| Payment without confirmation (Frictionless) | For this method the confirmation step (challenge) is requested for virtually every payment — frictionless scenario can be applied only for cobranded cards (with Visa or Mastercard) where the network considers the transaction safe. 1. You send an Intent creation request via the API, including a Payment transaction. 2. Our platform validates the incoming data, initiates the payment and returns the redirect URL in payments[].additionalData.details.url.3. You redirect the payer to this URL. Our hosted page collects the required payer metadata. 4. [Confirmation is not required] The payer is redirected back to your redirectUrl without any additional steps.5. Our platform completes the payment and sends a webhook with the final status: CAPTURED or DECLINED. |
| Name | Steps |
|---|---|
| Refund | 1. You send a Refund creation request via the dedicated request, specifying the payment identifier and the refund amount (full or partial). 2. Our platform validates the request and returns a synchronous acceptance response (accepted or rejected). A separate refund transaction is created, while the original payment remains in CAPTURED status. 3. Upon acceptance, our platform initiates the refund operation with the local processor. 4. Our platform updates the refund status to: REFUNDED or DECLINED. 5. Our platform sends a callback / webhook notification with the latest refund status. |
List of used API Requests:
| Request | Endpoint | Description |
|---|---|---|
| Intent Creation | POST /processing/api/v1/intents | • Creates a new Intent with one or more Payment transactions. • The platform validates the request, creates internal payment records, and initiates the payment with the processor. |
| Refund Creation | POST /api/v1/refunds | • Creates a refund request (full or partial) for a previously captured payment. • A separate refund transaction is created and processed independently from the original payment. |
Intent Creation Request/Response
Request specifics
- Endpoint:
POST /processing/api/v1/intents- Purpose: Creates an
Intentand aPaymentfor the selected payment method.- Structure: A unified request structure is used for all supported payment methods, but some fields are method-specific.
- For this method:
paymentMethodNamemust be set toBankCardUZincomingDetailsmust include:number,holderName,expiryMonth,expiryYear, andredirectUrlcvvis optional — the security code may be absent on HUMO/UZCARD cardsauthCurrencyCodemust be set toUZS
Intent Request: Example
{
"clientReferenceId": "1234",
"payments": [
{
"paymentInstrument": {
"paymentMethodName": "BankCardUZ",
"incomingDetails": {
"number": "9860XXXXXXXXXXXX",
"expiryMonth": "10",
"expiryYear": "2028",
"holderName": "JOHN DOE",
"redirectUrl": "https://merchant.example.com/payment/return"
}
},
"submittedAmount": {
"value": 100000.00,
"currency": "UZS"
},
"authCurrencyCode": "UZS",
"description": "Vertex - INTENT 1234",
"webhookUrl": "https://merchant.example.com/webhooks"
}
],
"description": "Vertex - INTENT 1234"
}Intent Request: Fields Description
Top-Level Request Parameters
| Parameter | Type | Required | Description |
|---|---|---|---|
clientReferenceId | String | Required | Order number in the merchant system. |
payments | Array of Objects | Required | List of payment objects to be created within the Intent. |
description | String | Optional | Intent description. |
merchant | Object | Optional | Merchant information to be associated with the request. |
payment
| Parameter | Type | Required | Description |
|---|---|---|---|
payer | Object | Optional | Payer details. |
paymentInstrument | Object | Required | Payment method and payment instrument details used to process the payment. |
submittedAmount | Object | Required | Amount and currency submitted for the payment. |
authCurrencyCode | String | Required | Authorisation currency code to be used for the payment. For this method, must be set to UZS.It may differ from the submitted currency if FX conversion is applied. |
description | String | Optional | Payment description. |
webhookUrl | String | Required | URL to which payment status change webhooks will be sent. |
payer
| Parameter | Type | Required | Description |
|---|---|---|---|
firstname | String | Optional | Payer's first name. |
lastname | String | Optional | Payer's last name. |
phone | String | Optional | Payer's phone number in international format: +998XXXXXXXXX. |
email | String | Optional | Payer's email address. |
countryIsoCode | String | Optional | Payer's country of residence in ISO 3166-1 alpha-2 format. |
locale | String | Optional | Payer's preferred language locale. |
merchantPayerReference | String | Optional | Merchant-provided payer reference. Recommended: a stable customer identifier in your system improves processing on the local scheme side. |
paymentInstrument
| Parameter | Type | Required | Description |
|---|---|---|---|
paymentMethodName | String | Required | Payment method name. For this scenario, use BankCardUZ. |
incomingDetails | Object | Required | Payment method-specific data required to initiate the payment. |
incomingDetails
| Parameter | Type | Required | Description |
|---|---|---|---|
number | String | Required | Card number (HUMO or UZCARD). |
expiryMonth | String | Required | Card expiry month in MM format. |
expiryYear | String | Required | Card expiry year in YYYY format. |
cvv | String | Optional | Card security code (CVV/CVC).May be absent on HUMO/UZCARD cards — omit the field if the payer's card has no security code. |
holderName | String | Required | Cardholder name as printed on the card. |
redirectUrl | String | Required | URL to which the payer is redirected after completing (or abandoning) the confirmation step. The redirect may include technical query parameters appended by the processor. |
submittedAmount
| Parameter | Type | Required | Description |
|---|---|---|---|
value | Number | Required | Submitted order amount. May differ from the authorised amount if FX conversion is applied. |
currency | String | Required | Submitted order currency. May differ from the authorised currency if FX conversion is applied. |
merchant
| Parameter | Type | Required | Description |
|---|---|---|---|
name | String | Optional | The name of the store that may be displayed on the payment page, if configured |
website | String | Optional | The website of the store |
Response specifics
- The Intent creation response is generally consistent across all supported payment methods.
- Common fields describe the
Intent, thePayment, and the current transaction status.- Method-specific data is returned in
payments[].additionalData.details.- For this payment method, the
urlfield contains the redirect URL that must be opened so that the payer can provide the required metadata and, if applicable, confirm the payment with the SMS code sent by their bank.
Intent Response: Example
{
"intentId": "232510340021612544",
"payments": [
{
"id": "232510340646563840",
"submittedAmount": {
"value": 100000.00,
"currency": "UZS"
},
"authAmount": {
"value": 100000.00,
"currency": "UZS"
},
"paymentInstrument": {
"id": "PI204264628196626432",
"paymentMethodId": "PM199507277233246209",
"paymentMethodName": "BankCardUZ",
"storedDetails": {
"number": "9860XXXXXXXXXXXX",
"expiryMonth": "10",
"expiryYear": "2028",
"holderName": "JOHN DOE",
"redirectUrl": "https://merchant.example.com/payment/return"
}
},
"processingStatusCode": "CODE_PT0000",
"statusMessage": "string",
"status": "AUTHORIZATION_REQUESTED",
"additionalData": {
"details": {
"url": "https://redirect.url.example/..."
}
}
}
],
"disbursements": [],
"clientReferenceIntentId": "1234",
"paymentCreationErrors": [],
"disbursementCreationErrors": [],
"intentStatus": "IN_PROGRESS"
}Response Description
Top-Level Response Parameters
| Parameter | Type | Required | Description |
|---|---|---|---|
intentId | String | Required | Unique identifier of the Intent in our platform. |
payments | Array of Objects | Required | List of Payment objects created within the Intent. |
disbursements | Array | Required | List of disbursement objects created within the Intent.Empty if no disbursements were created. |
clientReferenceIntentId | String | Required | Order number in the merchant system. Returned from the request. |
paymentCreationErrors | Array | Required | List of payment creation errors, if any. Empty if no errors occurred. |
disbursementCreationErrors | Array | Required | List of disbursement creation errors, if any. Empty if no errors occurred. |
intentStatus | String | Required | Current Intent status.See the dedicated section of this API guide for possible values and the status model. |
payment
| Parameter | Type | Required | Description |
|---|---|---|---|
id | String | Required | Unique identifier of the Payment in our platform. |
payer | Object | Optional | Payer details. Returned when provided in the request. |
submittedAmount | Object | Required | Submitted payment amount and currency. Returned from the request. |
authAmount | Object | Required | Authorised amount and currency used for the payment. |
paymentInstrument | Object | Required | Payment method information associated with the payment. |
processingStatusCode | String | Required | Processing status code. May indicate success or an error. |
statusMessage | String | Optional | Status message. Returned when an error occurs. |
status | String | Required | Current payment status. See the dedicated section of this API guide for possible values and the status model. |
additionalData | Object | Required | Method-specific data required to continue or complete the payment flow. Always returned for this method — contains the redirect URL. |
additionalData
| Parameter | Type | Required | Description |
|---|---|---|---|
details | Object | Required | Method-specific details required to continue or complete the payment flow. |
details
| Parameter | Type | Required | Description |
|---|---|---|---|
url | String | Required | Redirect URL. Open it for the payer to collect the required metadata and, if applicable, complete the SMS confirmation. Open the link for the payer exactly once and do not pre-fetch it — a repeated visit returns the payer to redirectUrl without showing the confirmation form. |
Payment Confirmation
- Always redirect the payer to the URL returned in
payments[].additionalData.details.url. Our hosted page collects the required payer metadata and routes the payer automatically: back to your store (frictionless) or to the confirmation form first (challenge). - On the confirmation form the payer enters the SMS code sent to the phone number linked to their card.
- After the payer completes (or abandons) the flow, they are redirected back to your
redirectUrl. - The redirect to
redirectUrldoes not carry the payment result. The final status (CAPTUREDorDECLINED) is delivered via webhook — always rely on the webhook, not on the payer's return.
Refunds
Refunds are available only for payments in the
CAPTUREDstatus.
To initiate the refund (full or partial) to the payer's original payment instrument, you must send a separate Refund request.
Use the following endpoint: Create Refund and specify the following parameters:
{
"paymentId": 232510340646563840,
"partial": false,
"reason": "Customer requested a refund",
"webhookUrl": "https://merchant.example.com/webhooks"
}{
"paymentId": 232510340646563840,
"partial": true,
"paymentAuthAmount": {
"value": 30000.00,
"currency": "UZS"
},
"reason": "Customer requested a refund",
"webhookUrl": "https://merchant.example.com/webhooks"
}Refund amount rules
| Rule | Description |
|---|---|
| Full refund | Send paymentId and set partial to false, or omit partial entirely. The full refundable amount will be refunded. |
| Partial refund | Set partial to true and provide exactly one of the following objects: paymentSubmittedAmount or paymentAuthAmount. |
| Multiple partial refunds | Several partial refunds can be created for one payment until the refunded total reaches the original payment amount. |
| Mutually exclusive amount objects | Do not send paymentSubmittedAmount and paymentAuthAmount in the same request. |
| FX payments | If the original payment involved FX conversion, the refund is calculated using the same exchange rate as the original payment. |
| Currency choice | Use paymentSubmittedAmount if you want to define the refund in the original submitted currency.Use paymentAuthAmount if you want to define the refund in the authorised or settlement currency. |
Top-Level Refund Request Parameters
| Parameter | Type | Required | Description |
|---|---|---|---|
paymentId | int64 | Required | Identifier of the original payment transaction to which this refund applies. Use the value of payments[].id returned in the Intent creation response. |
partial | Boolean | Optional | Indicates whether the refund is partial or full.true - partial refund.false - full refund.If omitted, the platform treats the request as a full refund. |
paymentSubmittedAmount | Object | Conditional | Refund amount in the original submitted currency. Required when partial = true and the refund amount is defined in the submitted currency.Do not send together with paymentAuthAmount. |
paymentAuthAmount | Object | Conditional | Refund amount in the authorised or settlement currency. Required when partial = true and the refund amount is defined in the authorised currency.Do not send together with paymentSubmittedAmount. |
reason | String | Optional | Free-form refund reason. Used for informational and audit purposes. |
webhookUrl | String | Optional | URL to which refund status change webhooks will be sent. |
paymentSubmittedAmount
| Parameter | Type | Required | Description |
|---|---|---|---|
value | Number | Required | Refund amount value in the original submitted currency. |
currency | String | Required | Refund currency in ISO 4217 alpha-3 format. Must match the original submitted currency. |
paymentAuthAmount
| Parameter | Type | Required | Description |
|---|---|---|---|
value | Number | Required | Refund amount value in the authorised or settlement currency. |
currency | String | Required | Refund currency in ISO 4217 alpha-3 format. Must match the original authorised or settlement currency — for this method, UZS. |
After the creation of the refund request you must wait for the webhook that will provide the latest refund status.
Webhooks
More about Payment Webhooks on the dedicated page
You will receive the webhooks on each status change of any transaction you created.
Testing in Sandbox
The bank card emulator simulates the full H2H payment lifecycle in the sandbox environment. Use the test cards below to reproduce specific payment outcomes.
Shared bank card emulator
The sandbox emulator is shared across all bank card payment methods on our platform — there is no dedicated emulator per method. The test cards, confirmation codes, and flows described below are common to everyBankCard*method.Keep in mind that the emulator reproduces the platform flow, not the specifics of the live card scheme: method-specific behaviour (supported card ranges, currency, confirmation type) applies in the live environment only. In the sandbox you may also observe a transient
AUTHORIZEDstatus between the confirmation and the final status — this is an emulator artifact; in the live environment the payment moves directly toCAPTUREDorDECLINED.
Use the listed test cards only. Any card not on this list will be accepted at the Intent creation step, but authorisation will fail. Cards from the list are the only ones guaranteed to drive the emulator through a complete flow.
What the H2H emulator covers
- Available in the sandbox environment only.
- The flow (Frictionless or Challenge) and the outcome at each stage are determined by the PAN only. Expiry date, CVV, and cardholder name do not affect emulator logic — any values that pass validation are accepted.
- Amount and currency do not affect emulator behaviour.
- For this method the payment completes automatically after a successful confirmation — no additional client action is required at any stage.
Payment flows
Regardless of the flow, the payer must briefly land on our hosted page so we can collect the required payer metadata. The client redirects the payer to the URL returned in the Intent creation response. After metadata collection, the payer is routed according to the flow determined by the PAN:
- Frictionless — the payer is redirected back to the merchant storefront via
redirectUrl, and the payment result is delivered via webhook. - Challenge — the payer is presented with the SMS confirmation form before being redirected back to the merchant. In the live environment, virtually every payment of this method follows the Challenge flow.
Challenge flow (SMS confirmation)
After metadata collection, the payer is presented with the confirmation form. The code value entered by the payer determines the outcome.

Test cards and confirmation codes
| Name | PAN | Code | Final payment status |
|---|---|---|---|
| CF_Card_1 | 5120069996100821 | 1000 | CAPTURED |
| CF_Card_2 | 5120069996491832 | 1000 | DECLINED — confirmation succeeds, but the funds withdrawal fails |
| Either of the above | — | 1001 | DECLINED — confirmation fails |
Any code value other than those listed above is not recognised by the emulator. The payment will not progress and will remain in the
AUTHORIZATION_REQUESTEDstate.
Frictionless flow
No confirmation form is shown. After metadata collection, the payer returns to the merchant storefront and the payment result arrives via webhook.

Test cards
| Name | PAN | Final payment status |
|---|---|---|
| FF_Card_1 | 4462603043025620 | CAPTURED |
| FF_Card_2 | 4462603040971339 | DECLINED — authorisation succeeds, but the funds withdrawal fails |
| FF_Card_3 | 4462603042343024 | DECLINED — authorisation fails |
Updated about 15 hours ago
