Bongluy Demo Store
12.50USD
One POST returns a KHQR, a deeplink, and an expiry. We watch the status with you until the payment settles or the QR expires.
POST /payment
Authorization: Bearer sk_live_…
Content-Type: application/json
{
"merchantStoreId": "branch-2",
"amount": "12.50",
"currency": "USD",
"tranId": "INV-1042"
}Bongluy Demo Store
12.50USD
Today the link is the whole integration surface. You send it, the customer types the amount themselves, and your system finds out it was paid when somebody tells it. There is no call to make, no identifier to correlate, and no event to subscribe to.
tranId carried alongside it.The link already works. It just had no API. We gave it one.
Four steps carry the integration from one-time setup to a durable result. The returned expiry keeps the polling loop bounded.
Add a store, paste its existing ABA PayWay link, and create an API key after signing in with Google or GitHub. There is no sandbox key today.
One authenticated request carrying the store and a decimal amount string, plus your own tranId if you have one. It returns a payment id, a KHQR payload, ABA Mobile deeplinks, and an expiry timestamp.
The payload is a plain KHQR string. Draw it on a web checkout, a POS screen, a printed slip, or a chat message — any KHQR-capable banking app can pay it.
Poll the status route every two or three seconds until payment succeeds or the returned expiry passes. Read the detail route when you need the durable record.
POST /payment
Authorization: Bearer sk_live_…
Content-Type: application/json
{
"merchantStoreId": "branch-2",
"amount": "12.50",
"currency": "USD",
"tranId": "INV-1042"
}{
"id": "8435481a-48a-4bb2-91d2-bcd1e604fb17",
"status": "PENDING",
"amount": "12.50",
"currency": "USD",
"tranId": "INV-1042",
"qrString": "00020101021229400015kh.gov.nbc…",
"deeplink": {
"scheme": "…",
"android": "…"
},
"expireAt": "2026-08-14T09:32:11Z"
}Render the qrString and the amount, then show the status you already have. It moves to Success without a refresh because the checkout polls the public status route every two or three seconds.
On a phone, the deeplink in the same payload hands the customer straight to ABA Mobile with the amount already filled in. The QR always stays on screen as the fallback.
Bongluy Demo Store
12.50USD
Demo payment is pending.
Authenticated store and payment routes take a server-side bearer key. Keys are prefixed sk_live_, shown once at creation, rate limited to 600 requests a minute, expire after 90 days, and carry fixed scopes. Public checkout reads use a separate server-side key.
/paymentCreate a payment. Returns the KHQR, the deeplink, and the expiry.
/payment?storeId=…&page=1List and page a store's payments.
/payment/statusPoll a payment by id or by your own tranId.
/payment/detailRead the full durable payment record.
/storesList the stores on the account.
{
"paymentId": "8435481a-48a-4bb2-91d2-bcd1e604fb17",
"status": "SUCCESS",
"expireAt": 1786763662418,
"settledTranId": "1234567890",
"receipt": "https://…",
"at": 1786763501992
}Poll /payment/status every two or three seconds until the state leaves PENDING or the returnedexpireAt passes. A stale pending payment past that deadline is unpaid.
Read /payment/detail for the durable record. Merchant webhooks are not available yet, even though webhook fields can be stored on a store.
A store id and a decimal amount string return a KHQR payload ready to render anywhere. Currency is record metadata only; the actual charge follows the store's PayWay link.
A payment with a QR also carries ABA Mobile deeplinks for checkout without a second device. Android can fall through to the Play Store; iOS may do nothing when the app is absent, so the QR stays visible as the source of truth.
Poll one lightweight endpoint every two or three seconds until the state changes or expireAt passes. A separate detail route returns the durable payment record for reconciliation.
Send a tranId and a repeated request for that store returns the original payment instead of issuing a second QR. Retrying a timed-out create is then safe.
One account holds many stores, each with its own PayWay link, name, and on/off switch. Payments and history are scoped per store; an account's API keys reach every store it owns.
Every payment keeps its amount, currency, status, your tranId, the settled transaction id, receipt link, and timestamps. Lists are paged and filterable by status; detail supports exact tranId lookup.
Public payment and status routes use a separate server-held checkout key. They disclose only the store name, amount, status, and QR, keeping account API keys and account data out of checkout code.
Funds move from the payer straight into the merchant's own ABA account. Bongluy holds no balance, runs no payout schedule, and carries no float.
The service handles QR payments only. There are no card numbers collected, transmitted, or stored anywhere, so there is nothing sensitive to leak.
Authenticated reads report a foreign payment or store exactly like one that does not exist, so another account's key cannot use responses to probe ids.
Account and checkout keys belong on your server. Public checkout responses are payment-scoped and never expose store ids, transaction ids, receipts, or internal errors.
An existing ABA PayWay payment link. Register that link on a Bongluy store, then create payments against the store from your server.
Poll POST /payment/status every two or three seconds until the state leaves PENDING or expireAt passes. Use POST /payment/detail for the durable record. Merchant webhooks are not available yet.
Nothing is charged. The bank sets the window and Bongluy returns the exact expireAt. Treat expiry as an unpaid outcome and use a new tranId when you create the replacement payment.
Keys belong to the account, not to an individual store, so one key reaches every store that account owns. Keys are prefixed sk_live_, shown once at creation, rate limited to 600 requests a minute, and expire after 90 days.
Any KHQR-capable banking app can scan the code. On a phone, the deeplink in the payment payload can hand the customer straight into ABA Mobile with the amount already filled in.
Add the store, paste the PayWay link, create a key, and POST your first amount.