Your payment links.
Ready for your
next build.

Connect merchant-owned KHR and USD links to a clear checkout flow. Keep your currency, your code, and your payment status in sync.

Development preview · self-service access is not enabled yet.

API → QR → payment

Explore both walkthroughs ↗
Merchant-owned linksKHR & USD, separatelyEvidence-aware statusIndependent software

Your stack. Your way in.

One payment request, four interfaces. Explore the integration contract.

Integration preview

CLI example

# Private local workspace · run npm run build:all first
# Set KHPAYMENT_BASE_URL and KHPAYMENT_API_KEY privately.
node packages/cli/dist/index.js payments create \
  --amount '12.50' --currency 'USD' \
  --idempotency-key example-order-001 --json
Preview only · no bank request is madeRead CLI guide

MCP example

# Private local stdio: node packages/mcp/dist/index.js
# Set KHPAYMENT_BASE_URL and KHPAYMENT_API_KEY in the host environment.
# Send this tool call through a host with human confirmation.
# Live creation is disabled by default; test payments are simulated.
{
  "name": "create_payment",
  "arguments": {
    "amount": "12.50",
    "currency": "USD",
    "idempotencyKey": "example-order-001"
  }
}
Preview only · no bank request is madeRead MCP guide

SDK example

// Private local Node workspace · run npm run build:all first
// Server-side only; set both environment variables privately.
import { createClient } from 'khpayment-sdk';
const client = createClient({
  baseUrl: process.env.KHPAYMENT_BASE_URL,
  apiKey: process.env.KHPAYMENT_API_KEY,
});
const payment = await client.createPayment({
  "amount": "12.50",
  "currency": "USD"
}, {
  idempotencyKey: 'example-order-001',
});
console.log(JSON.stringify(payment));
Preview only · no bank request is madeRead SDK guide

API example

# Local development API · public access remains gated
# Set KHPAYMENT_API_KEY privately; use a test key for simulations.
curl --fail-with-body --silent --show-error 'https://khpayment-dev.161-118-223-128.sslip.io/api/v1/payments' \
  -H "Authorization: Bearer $KHPAYMENT_API_KEY" \
  -H 'Idempotency-Key: example-order-001' \
  -H 'Content-Type: application/json' \
  --data '{"amount":"12.50","currency":"USD"}'
Preview only · no bank request is madeRead API guide

Two currencies.
No guesswork.

Your customer chooses a currency. The matching merchant link does the rest. No silent currency switch, no fallback to somebody else’s account.

Explore the payment flow
Example paymentNot payable

12.50USD

Merchant linkUSD link selected
CheckoutAmount included
Payment statusAwaiting confirmation

Switch currency to see the request change.
Illustration only. No payment will be created.

Know what happens
behind the checkout.

Test mode is a simulation. Live payments use a separate provider flow, with their own setup and verification requirements.

A scan is progress, not proof of payment. A return page is not a receipt. The integration keeps those differences visible.

Understand payment evidence

A few things worth knowing.

Is KH Payment a bank or payment network?

No. It is independent integration software. Payment processing remains with the configured provider. It is not an ABA Bank website, official PayWay plugin or KHQR operator.

Do KHR and USD use the same merchant link?

No. Each currency uses its own merchant-owned link. Configure either currency or both. A missing USD link never falls back to a KHR link.

Does scanning a QR confirm payment?

No. Scanning and returning to a page are not proof of payment. Status evidence must come from the transaction-bound provider flow, and public-link evidence is not official settlement verification.

Can I test without making a payment?

The self-service release is designed around a clearly labeled simulator. It is separate from the existing operator’s real provider testing. This public example never contacts a bank or creates a payment.

Build the connection.
Keep the context.

Explore account setup Start with the docs