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.
Amount rules
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.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.

