JLA Payway API Docs
On this page
Production API v1.0 · Bakong KHQR Integrated

Developer Documentation

JLA Payway API

Developer-first ABA Payway & Bakong KHQR payment gateway. Create real-time transactions, render secure checkout pages, deep-link into ABA Mobile, and receive instant approval webhooks.

Sub-50ms Processing

In-memory token resolution and instant local SVG KHQR rendering.

Universal Bakong KHQR

Scan & pay seamlessly with ABA Mobile and 30+ Cambodian bank apps.

Instant Webhooks

Real-time POST notifications dispatched immediately on payment approval.

Enterprise Reliability

Indexed MySQL persistence, zero disk churn, and PM2 cluster protection.

Base URL
https://payway.jlastore.com
Request format
application/json
AI-readable docs
/llms.txt

Architecture

Payment Flow

Interactive lifecycle from transaction creation to instant Bakong KHQR settlement.

LIVE ARCHITECTURE
ORIGIN

Merchant App

Your Backend

RECEIVING

JLA Gateway

API Core

STANDBY

Checkout Webview

KHQR Screen

STANDBY

Banking Core

ABA & NBC Bakong

01 POST /api/create-tran
→
< 45ms
02 200 OK checkout_url & KHQR
→
< 5ms
03 AUTH Scan KHQR / Deep Link
→
180s Timeout
04 LOOP /api/check-payment-status
↔
5s Sleep
05 WEBHOOK POST [webhook_url]
←
< 300ms
STEP 01

Initiate Payment

Merchant server sends amount, tran_id, and webhook to start a payment session.

Endpoint POST /api/create-tran
Security HTTPS
Speed < 50ms
Action Save tran_id
{
  "amount": "12.50",
  "tran_id": "INV-2026-8891",
  "aba_data": "https://link.payway.com.kh/ABAPAYRB363381q",
  "webhook": "https://yourdomain.com/api/payment-webhook",
  "continue_success_url": "https://yourdomain.com/success",
  "return_param": "{\"order_id\": 8891}"
}

Quick start

Integration flow

Keep the same transaction reference through creation, checkout, status checks, and webhook handling.

  1. Create a transaction

    Send the amount and ABA payment data to POST /api/create-tran.

  2. Open checkout

    Redirect the customer to the absolute checkout_url returned by the API.

  3. Confirm payment

    Handle the approval webhook or check the status with your tran_id.

Live API tester

Create and monitor a transaction

Send a production request, inspect the complete JSON response, open checkout, and monitor the payment status from this page.

Live payment request Sending this form creates a real payable QR. A new transaction reference is generated automatically to prevent accidental reuse.
POST

/api/create-tran

Ready
Redirects and webhook Optional

Request body

application/json

Response

Not sent
Press "Send request" to call the API.

API reference

Endpoints

Public endpoints use JSON request and response bodies unless stated otherwise.

POST

/api/create-tran

Creates a Payway transaction and saves its reference for checkout and status lookup. You may send encrypted ABA data directly or a Payway link URL; link values are resolved once and cached.

Request body

Field Type Requirement Description
amount string Required Payment amount. Minimum value is 0.01.
aba_data string Required Encrypted ABA Payway data or a Payway link URL.
tran_id string Optional Your unique transaction reference.
continue_url URL Optional Customer redirect after payment approval.
cancel_url URL Optional Customer redirect after cancellation or expiry.
webhook URL Optional Your endpoint for approved payment notifications.
POST

/api/check-payment-status

Checks the latest payment status using the transaction reference saved during creation.

Request body

Field Type Requirement Description
tran_id string Required The reference used to create the transaction.
GET

/checkout/:tran_id

Opens the customer checkout with a locally generated SVG QR code, payment expiry countdown, ABA mobile link, and approval redirect.

Path parameter

Parameter Type Requirement Description
tran_id string Required The transaction reference returned during creation.

Examples

Make a request

These examples use the production base URL and a custom transaction reference.

cURL

curl -X POST https://payway.jlastore.com/api/create-tran \
  -H "Content-Type: application/json" \
  -d '{
    "amount": "0.1",
    "tran_id": "jl002",
    "aba_data": "https://link.payway.com.kh/ABAPAYhj455002v",
    "continue_url": "https://your-site.com/payment/success",
    "cancel_url": "https://your-site.com/payment/cancel",
    "webhook": "https://your-site.com/api/payway-webhook"
  }'

JavaScript

const baseUrl = "https://payway.jlastore.com";

const response = await fetch(baseUrl + "/api/create-tran", {
  method: "POST",
  headers: { "Content-Type": "application/json" },
  body: JSON.stringify({
    amount: "0.1",
    tran_id: "jl002",
    aba_data: "https://link.payway.com.kh/ABAPAYhj455002v",
    continue_url: "https://your-site.com/payment/success",
    cancel_url: "https://your-site.com/payment/cancel",
    webhook: "https://your-site.com/api/payway-webhook"
  })
});

const result = await response.json();

if (result.checkout_url) {
  window.location.href = result.checkout_url;
}

Check payment status

curl -X POST https://payway.jlastore.com/api/check-payment-status \
  -H "Content-Type: application/json" \
  -d '{
    "tran_id": "jl002"
  }'

Responses

Response format

Successful transaction creation returns your reference, the Payway reference, an absolute checkout URL, and an ABA mobile deep link generated from qr_string.

Success

200
{
  "success": true,
  "message": "Transaction created",
  "tran_id": "jl002",
  "payway_tran_id": "178392699651531",
  "checkout_url": "https://payway.jlastore.com/checkout/jl002",
  "deeplink": "abamobilebank://ababank.com?type=payway&qrcode=000201...",
  "reference_saved": true,
  "reused": false,
  "aba_data_url": "https://link.payway.com.kh/ABAPAYhj455002v",
  "aba_data_cached": false,
  "data": {
    "status": {
      "code": "00",
      "tran_id": "123456789"
    },
    "client_id": "CLIENT_ID",
    "qr_string": "..."
  },
  "webhook_registered": true
}

Validation error

400
{
  "error": "Amount >= 0.01 required"
}

The API returns 400 for invalid request data and 500 when the upstream Payway request fails.

Webhook

Approved payment payload

When webhook is included during creation, the server sends this payload to your URL after payment approval.

application/json

{
  "status": "approved",
  "tran_id": "jl002",
  "payway_tran_id": "178392699651531",
  "real_tran_id": "PAYWAY_TRANSACTION_ID",
  "download_receipt": "https://...",
  "amount": "1.00",
  "date": "20260713083022",
  "full_response": {}
}

Frequently asked questions

Merchant & Developer FAQ

Common questions about ABA Payway, Bakong KHQR, webhooks, and gateway integration.

How do I get an ABA Payway Payment Link?

Download the free ABA Merchant App. If you have an ABA Bank account, activate as a merchant for free. Generate a Payment Link in your merchant dashboard and supply that link as aba_data when calling POST /api/create-tran.

Does JLA Payway support other Cambodian banking apps?

Yes! All payment QR codes generated comply with the National Bank of Cambodia's Bakong KHQR standard. Customers can scan and complete payments using ABA Mobile, ACLEDA mobile, Wing, Canadia, TrueMoney, and 30+ other local banking apps.

How does webhook notification delivery work?

When you provide a webhook URL during transaction creation, our background polling worker monitors payment status with smart progressive backoff. As soon as the customer authorizes the transaction, an automated HTTP POST webhook is sent to your endpoint with the complete payment receipt and approval details.

Can AI tools or coding agents read this documentation?

Yes. A structured, machine-readable version of the entire API specification is available at https://payway.jlastore.com/llms.txt, optimized for Claude, ChatGPT, Cursor, and AI coding assistants.

AI documentation

Machine-readable API reference

Use /llms.txt with AI tools and coding agents. It contains the public endpoints, payloads, responses, checkout flow, and webhook contract in plain text.

Open llms.txt
Telegram @sothea_bioc