KHQR Payment Gateway API

Accept payments in Cambodia with one API call.

Tola Saint lets merchants create KHQR payments and payment links, then track every transaction from one dashboard. Built for developers — clean REST, signed webhooks, and predictable responses.

No setup fees · KHQR · USD & KHR

# Create a KHQR payment
curl -X POST https://api.tolasaint.com/v1/payment \
  -H "x-api-key: sk_live_..." \
  -H "content-type: application/json" \
  -d '{"amount":"1.00","currency":"USD"}'

# → 201 Created
{
  "id": "AbC123xyz789",
  "status": "pending",
  "amount": "1.00",
  "currency": "USD",
  "qr_link": "https://api.tolasaint.com/qr/uQH8...",
  "expires_at": "2026-01-01T00:03:00Z"
}
~

Everything you need

One platform for payments, links, and tracking

From your first test payment to production scale — a clean API and a dashboard that keeps up.

Payment Links

Generate a shareable payment link in one API call — no checkout code required.

KHQR Payments

Accept KHQR payments in USD or KHR, verified against the EMVCo/CRC standard.

Transaction Tracking

Real-time status: pending, scanned, processing, approved, failed, expired.

API Keys

Issue and rotate scoped keys per environment. Every request is authenticated.

Signed Webhooks

HMAC-signed, auto-retried webhooks notify your backend the moment a payment settles.

Developer API

Predictable REST, clear errors, and copy-paste examples in the docs.

How it works

Live in four steps

1

Create account

Sign up and open your dashboard in seconds.

2

Generate API key

Create a key and add it to the x-api-key header.

3

Create a payment

POST an amount and currency to get a QR and link.

4

Track the status

Poll the status endpoint or receive a webhook.

Developer-first

Verify a webhook in a few lines

Every event carries an HMAC-SHA256 signature and a timestamp. No SDK required — verify with the standard library and you're done.

verify-webhook.ts
import { createHmac } from "node:crypto";

export function verify(headers, rawBody, secret) {
  const ts = headers["x-webhook-timestamp"];
  const sig = headers["x-webhook-signature"];
  const mac = createHmac("sha256", secret)
    .update(ts + "." + rawBody)
    .digest("hex");
  return sig === "sha256=" + mac;
}

Dashboard

See every payment at a glance

dashboard — overview

Volume (30d)

$12,480

8.2%

Transactions

1,204

3.1%

Success rate

98.6%

0.4%

Pending

7

live

Start accepting payments today

Create your account, grab an API key, and send your first KHQR payment in minutes.