Skip to main content
The payment is made at once, and the answer says how it ended.
1

Read — POST /payouts/qr/resolve

The scanned QR’s content. You get the merchant, the amount (target.amount, or null for an open-amount QR) and an id. Reference
2

Quote — POST /fx/quotes

USDT → BOB, target_amount the QR’s amount, resolution_id the read’s id. Show source.amount with a countdown to expires_at; the end user accepts, or you drop it. Reference
3

Pay — POST /payouts

type qr with the QR, your transaction_id and the quote_id. Answers completed, or why not. Reference
4

Rarely — payout.completed

If it answered processing: the result arrives by webhook, or poll GET /payouts/{id}.
Open-amount QRs. Some QRs carry no amount. Ask the end user for it first, quote that amount, and send the QR with the quote: it is paid the quote’s target.amount.
Quotes expire. A quote is valid for 3 minutes at most (expires_at) and pays one payment. Paying after that answers 409 QUOTE_EXPIRED and nothing is attempted — get a new quote and show it. A QR for another amount than the quote ends cancelled with QUOTE_AMOUNT_MISMATCH, and the quote can still be used.

Worked example

A Bs 1,000.00 QR at Bs 10.00 per USDT (an example price) is 100 USDT; with our 50 bps markup the rate is 9.9500 — 100.50 USDT — plus a 100 bps fee of 1.00 USDT: 101.50 USDT. Paying debits exactly 101.50 USDT.

Statuses

The error.code values are in Failure codes.