# Viet QR

The payer in Vietnam pays by a VietQR code from their Vietnamese bank app: scans the code, and
the app opens a transfer with the amount and account already filled in. The payment works like
an [SBP payment](sbp.md): the same API method, statuses, callbacks and retry rules. What differs
is `payment_method` and what is issued instead of a phone number.

| | SBP | Viet QR |
| --- | --- | --- |
| `payment_method` | `sbp` | `viet_qr` |
| Payment country and currency | `RU`, `RUB` | `RU`, `RUB` |
| What the payer gets | a phone number in `requisite` | a QR code: the VietQR string in `requisite` and an image at `qrcode_link` |
| How the payer pays | "SBP transfer" by phone number | scans the QR in a Vietnamese bank app and pays in dong |

## Create a payment { #create }

`POST /api/v1/payments` with `payment_method: "viet_qr"`. `amount` is in **rubles**, as in
other Russian payments; `geo_code` and `currency` may be omitted (default `RU`, `RUB`). The
request is [signed](signing.md) the same way as for SBP.

```json
{
  "merchant_payment_id": "order-1004",
  "amount": "5919.00",
  "payment_method": "viet_qr"
}
```

All fields and rules are in [SBP payment → Request fields](sbp.md#request-fields), allowed
methods and amounts — in [Contract limits](sbp.md#contract-limits). The method must be in your
project's contract.

## Response { #response }

Instead of a phone number the response carries a QR code:

- `requisite` — the VietQR string (`000201…`): you can render the QR code from it yourself. The
  amount in dong is already inside the string;
- `qrcode_link` — an `https` link to a ready image of this QR code;
- `requisite_bank` — the recipient's Vietnamese bank, `holder_name` — the recipient.

```json
{
  "id": "7c1f2e3d-4a5b-4c6d-8e7f-9a0b1c2d3e4f",
  "merchant_payment_id": "order-1004",
  "status": "processing",
  "amount": 5919,
  "initial_amount": 5919,
  "currency": "RUB",
  "geo_code": "RU",
  "payment_method": "viet_qr",
  "requisite": "00020101021238600010A000000727013000069704360116QRS1072662728020208QRIBFTTA5303704540718467285802VN6304F15D",
  "qrcode_link": "https://api.qrserver.com/v1/create-qr-code/?size=450x450&margin=15&format=svg&data=00020101021238600010A000000727013000069704360116QRS1072662728020208QRIBFTTA5303704540718467285802VN6304F15D",
  "requisite_bank": "Vietcombank",
  "holder_name": "NGUYEN VAN A",
  "created_at": "2026-10-26T10:28:37Z",
  "updated_at": "2026-10-26T10:28:38Z"
}
```

Other response fields and the `merchant_information` settlement are as for SBP:
[Response](sbp.md#response) and [`merchant_information` settlement](sbp.md#merchant-information).

## What to show the payer { #payer-screen }

- **QR code** — the image at `qrcode_link` or a code rendered from the `requisite` string. The
  payer scans it with their bank app.
- **Amount** — the payer pays in dong: the amount is already in the QR code, and the bank app
  shows it. The payment's `amount` is in rubles and need not be shown to the payer.
- **Recipient** — `requisite_bank` and `holder_name`, so the payer can check them in the app.
- **Deadline** — a countdown from `created_at` for your project's payment lifetime.

!!! warning "The QR code is for this payment only"
    Do not store or show the QR again. Create a new payment for a new pay-in.

## Statuses and result { #result }

Statuses, callbacks and polling are the same as for SBP:
[Statuses](sbp.md#statuses) and [How to get the result](sbp.md#result).

## Edge cases { #edge-cases }

Everything in [SBP payment → Edge cases](sbp.md#edge-cases) applies to Viet QR as well. In
particular: if the response has neither a VietQR string in `requisite` nor `qrcode_link`, no
requisites were issued — the payment closes with an error, as an SBP payment without a phone
number.