Juk Gateway turns a sale into a scannable QR and tells your server when the money arrived. You keep your own ABA PayWay link, so funds settle straight into your bank account — we never hold them.
ទទួលការទូទាត់តាម ABA PayWay និង Bakong KHQR ដោយបង្កើត QR ហើយទទួលដំណឹងនៅពេលលុយចូល។ លុយចូលគណនីធនាគាររបស់អ្នកផ្ទាល់។
No install, no SDK. Four steps and you have a working payment.
Open the dashboard and sign in. A free account is created on first login and includes 100 transactions a day.
Paste your ABA PayWay link. If you also collect riel or use Bakong, add those rails on the same store.
One POST with an amount and your own tranId. You get back a qrString and a hosted checkoutUrl.
Receive a signed webhook, or poll /payment/status. Release the goods only on a terminal SUCCESS.
A store is one destination with its own rails. Most merchants need exactly one.
Go to Stores & keys → New store, give it a name and paste your ABA PayWay link. The link must be an https://link.payway.com.kh/... URL — anything else is rejected for your protection.
curl -X POST https://aba-api.annoymous.com/stores \
-H 'authorization: Bearer sk_live_…' \
-H 'content-type: application/json' \
-d '{"name":"Tykea Coffee","merchantStoreId":"branch-2",
"paywayLink":"https://link.payway.com.kh/aba?id=usd…",
"khrPaywayLink":"https://link.payway.com.kh/aba?id=khr…",
"bakongAccountId":"your_name@aclb"}'
paywayLink is required. Add khrPaywayLink to accept riel, and
bakongAccountId to accept Bakong KHQR. merchantStoreId is
your identifier for the store, so you never have to store our internal ids.
One payment per sale. You decide the provider and the currency.
curl -X POST https://aba-api.annoymous.com/payment \
-H 'authorization: Bearer sk_live_…' \
-H 'content-type: application/json' \
-d '{"merchantStoreId":"branch-2","amount":"12.50",
"currency":"USD","provider":"ABA","tranId":"INV-1042"}'
{
"id": "8435481a-48a8-4bb2-91d2-bcd1e604fb17",
"status": "PENDING",
"amount": "12.50",
"currency": "USD",
"tranId": "INV-1042",
"qrString": "00020101021230…",
"checkoutUrl": "https://aba-api.annoymous.com/payment/8435481a-…",
"expireAt": "2026-08-14T03:14:22.418Z"
}
| Field | What it is |
|---|---|
tranId | Your id for the sale. Unique per store. Reusing it returns the original payment instead of charging twice — always safe to retry. |
qrString | The KHQR payload. Render it anywhere: web checkout, POS screen, receipt. |
checkoutUrl | A ready-made hosted page that shows the QR and updates itself. |
expireAt | When the QR stops being payable. |
status | PENDING until the bank confirms. Then SUCCESS, EXPIRED or FAILED. |
tranId again — the original payment comes back, and the customer is never charged twice.
Two ways to learn the outcome. Use a webhook as the primary signal and polling as the safety net.
Set webhookUrl and webhookSecret on the store and we POST to you once, when the payment reaches a terminal state.
curl -X POST https://aba-api.annoymous.com/stores/update \
-H 'authorization: Bearer sk_live_…' \
-H 'content-type: application/json' \
-d '{"merchantStoreId":"branch-2","changes":{
"webhookUrl":"https://yourshop.com/hooks/payments",
"webhookSecret":"whsec_…"}}'
Verify X-Signature: it is sha256= plus the HMAC-SHA256 of the
raw request body, keyed by your secret. Answer any 2xx within 10 seconds;
deliveries that fail are retried 10 times over about 17 minutes.
curl -X POST https://aba-api.annoymous.com/payment/status \
-H 'authorization: Bearer sk_live_…' \
-H 'content-type: application/json' \
-d '{"merchantStoreId":"branch-2","tranId":"INV-1042"}'
{ "paymentId":"8435481a-…", "status":"SUCCESS", "settledTranId":"1234567890", "at":1786763501992 }
Poll every two or three seconds until the status leaves PENDING. Prefer your tranId over our payment id — it keeps your integration readable.
If you would rather not build a checkout screen, send the payer to the
checkoutUrl. The page renders the QR, shows a countdown, and refreshes its own
status. It is safe to share, needs no key, and works on phones.
Read the payer-safe state of any payment without a key:
curl https://aba-api.annoymous.com/public/payment/8435481a-…
sk_live_, belong to your account (not one store) and expire after 90 days. Revoke any key instantly from the dashboard.Every plan sets a daily transaction limit and a store limit. Paid plans are bought inside the dashboard — no email, no invoice, no waiting for approval.
Dashboard → Plans. Your current plan is marked on the card.
Press Upgrade / renew. A QR appears in a popup — scan it with any ABA Mobile or Bakong app.
The page watches the payment. As soon as it is confirmed, the new limit applies and you are returned to your plan with a receipt in the invoice list.
| Tab | What you do there |
|---|---|
| Overview | Today's volume, completed and pending counts, your plan and remaining quota, recent payments. |
| Stores & keys | Add, rename or delete stores; reveal, copy and rotate API keys. |
| Payments | Latest 100 payments with status and a link to each hosted page. |
| Plans | Buy or upgrade a plan by QR, and download your invoice history. |
| Docs | This guide and the full API contract. |
| Provider | Currency | Store needs | Minimum |
|---|---|---|---|
| ABA PayWay | USD | paywayLink | 0.01 |
| ABA PayWay | KHR | khrPaywayLink | 100 |
| Bakong KHQR | USD | bakongAccountId | 0.01 |
| Bakong KHQR | KHR | bakongAccountId | 100, whole riel |
| Authenticated API | 600 requests per minute per key |
|---|---|
| Store writes | 20 per minute per account |
| Daily transactions | Set by your plan (100 free, then 500 / 2,000 / 20,000) |
| Stores per account | Set by your plan (3 free, then 5 / 15 / unlimited) |
| Payment records | Kept for reconciliation; export what you need for accounting |
Check the store's PayWay link is the exact https://link.payway.com.kh/... URL from ABA and is configured for the currency you are charging. A 502 or 503 usually means the provider was unreachable — retry with the same tranId.
The plan's daily transaction limit is used up. It resets at midnight (Asia/Phnom_Penh) or you can upgrade from the Plans tab and the new limit applies the moment the payment is confirmed.
PENDING foreverThe server re-checks a fresh payment against PayWay every 3 seconds for the first 15 minutes, then every 20 seconds for 24 hours, even after the QR popup is closed. A real payment normally shows SUCCESS within 2–3 seconds. Read the status again to see the latest result; only a terminal EXPIRED or FAILED means the payment is over. Never fulfil on a local timeout alone.
PayWay keeps an approval available for a few minutes, so the check has to happen quickly; if a payment stays pending for more than a minute, send the payment id to the platform owner. Older payments created before the status checks existed may need a manual confirmation from the ABA receipt.
The key is missing, revoked, expired or lacks the scope. Mint a new one under Stores & keys.
That merchantStoreId is already in use. Pick another, or update the existing store.
/v1 APIIt still works and is documented at /docs/v1. New integrations should use the contract in the API reference.
Contact support from the email address on the account and include the tranId or payment id — that is all we need to trace it.