J Juk Gateway User guide
API reference Dashboard

Get paid with Juk Gateway

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 ហើយទទួលដំណឹងនៅពេលលុយចូល។ លុយចូលគណនីធនាគាររបស់អ្នកផ្ទាល់។

Quick start

No install, no SDK. Four steps and you have a working payment.

Sign in with Google

Open the dashboard and sign in. A free account is created on first login and includes 100 transactions a day.

Create a store

Paste your ABA PayWay link. If you also collect riel or use Bakong, add those rails on the same store.

Create a payment

One POST with an amount and your own tranId. You get back a qrString and a hosted checkoutUrl.

Fulfil on SUCCESS

Receive a signed webhook, or poll /payment/status. Release the goods only on a terminal SUCCESS.

Tip Every request needs your API key. Find it under Stores & keys → Reveal in the dashboard. Treat it like a password — server-side only, never in browser code.

Connect a store

A store is one destination with its own rails. Most merchants need exactly one.

In the dashboard

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.

Or with the API

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.

Take a payment

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"
}
FieldWhat it is
tranIdYour id for the sale. Unique per store. Reusing it returns the original payment instead of charging twice — always safe to retry.
qrStringThe KHQR payload. Render it anywhere: web checkout, POS screen, receipt.
checkoutUrlA ready-made hosted page that shows the QR and updates itself.
expireAtWhen the QR stops being payable.
statusPENDING until the bank confirms. Then SUCCESS, EXPIRED or FAILED.
Retry safely A network timeout is not a failure. POST the same tranId again — the original payment comes back, and the customer is never charged twice.

Get the result

Two ways to learn the outcome. Use a webhook as the primary signal and polling as the safety net.

Webhook (recommended)

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.

Polling (fallback)

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.

Hosted checkout

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-…

Keys & security

Plans & billing

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.

Open Plans

Dashboard → Plans. Your current plan is marked on the card.

Choose and scan

Press Upgrade / renew. A QR appears in a popup — scan it with any ABA Mobile or Bakong app.

It activates itself

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.

Note Plan payments are verified from the bank's own response for the QR we generated. The status is checked by our server every few seconds, so a payment still activates if you close the popup — the QR itself is valid for one hour.

Dashboard tour

TabWhat you do there
OverviewToday's volume, completed and pending counts, your plan and remaining quota, recent payments.
Stores & keysAdd, rename or delete stores; reveal, copy and rotate API keys.
PaymentsLatest 100 payments with status and a link to each hosted page.
PlansBuy or upgrade a plan by QR, and download your invoice history.
DocsThis guide and the full API contract.

Limits & currencies

ProviderCurrencyStore needsMinimum
ABA PayWayUSDpaywayLink0.01
ABA PayWayKHRkhrPaywayLink100
Bakong KHQRUSDbakongAccountId0.01
Bakong KHQRKHRbakongAccountId100, whole riel
Authenticated API600 requests per minute per key
Store writes20 per minute per account
Daily transactionsSet by your plan (100 free, then 500 / 2,000 / 20,000)
Stores per accountSet by your plan (3 free, then 5 / 15 / unlimited)
Payment recordsKept for reconciliation; export what you need for accounting

Troubleshooting

The QR does not appear

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.

“Daily quota exceeded”

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.

A payment stays PENDING forever

The 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.

401 Unauthorized

The key is missing, revoked, expired or lacks the scope. Mint a new one under Stores & keys.

409 Conflict

That merchantStoreId is already in use. Pick another, or update the existing store.

I need the legacy /v1 API

It still works and is documented at /docs/v1. New integrations should use the contract in the API reference.

Something is wrong with my account

Contact support from the email address on the account and include the tranId or payment id — that is all we need to trace it.

Next Ready for the details? The API reference covers every route, field, error code and header.