Skip to main content

The request

string
required
The scanned code, byte for byte. See The QR code.
integer
required
Whole tugrik. ₮12,500 is 12500.
string
Optional but strongly recommended. Up to 255 characters. See Idempotency.
That is the entire request. There is no merchant field, no terminal field, and no currency field — merchant and terminal come from your credentials, and the currency is always MNT.

Amount rules

An amount above the per-charge maximum is currently rejected as 400 amount must be positive. The message is misleading — it means positive and within the cap. If you see it on a plainly positive number, check the amount against the ceiling.

The request body is strict

Unknown fields are rejected, not ignored:
Rejected with 400 invalid request body
amountMnt is not amountMNT. Other Vibepay surfaces spell it in lowercase, and this one deliberately refuses to guess: silently ignoring the field would leave amountMNT at zero and charge the customer nothing while telling you the sale succeeded. Failing loudly is the safer answer. The body is also capped at 1 MiB and must be valid JSON. All three failures return the same 400 invalid request body.

The response

201 Created
string
required
The transaction identifier. Store this. It is the only way to refund the payment later.
integer
required
What was charged. Always positive, even after a reversal — status carries that instead.
string
required
COMPLETED on a fresh charge, REVERSED once refunded.
string
required
Always CHARGE for anything you create.
string
required
The VAT receipt number (ДДТД). Always empty here — the receipt is issued afterwards.
string
Always pending on a fresh charge. See VAT receipts.
string
The terminal that took the payment.
string
RFC 3339 UTC timestamp of the commit.
The response carries no wallet, card, employer or customer identifier, and it never will. A till handled by cashiers should not hold data it has no use for. If you need a customer reference for your own records, use id.

Reading the outcome

Branch on the HTTP status. Do not pattern-match the message text.
Never treat a timeout or a 5xx as a decline. The charge may have committed before the connection dropped. Retry with the same Idempotency-Key or check GET /v1/transactions — anything else risks charging the customer twice.

A worked integration

Every decline code

What each one means and what to tell the customer.

Safe retries

How the same key collapses a retry into one payment.