# Dalo > Dalo turns a merchant's public ABA Payment Link into a payment API for Cambodia. Create an ABA KHQR payment from your server, send the customer to a hosted checkout (or show the QR yourself), and receive a signed webhook when the money arrives. Essentials for an integration: - Base URL https://dalodesk.com, JSON in and out, amounts as two-decimal strings, currency USD. - Auth: `Authorization: Bearer dk_live_...` (store API key from the dashboard). Server side only; never in browser or mobile code. - Test mode: a `dk_test_...` key uses the same endpoints but creates simulated payments (`livemode: false`, no money, not counted). Drive them with `POST /v1/payments/{id}/simulate` `{"status":"paid"}` or the Simulate buttons on the checkout page; webhooks fire with `livemode: false` and `X-KHQR-Livemode: false`. - Endpoints: `POST /v1/payments` (send `Idempotency-Key`), `GET /v1/payments/{id}`, `GET /v1/payments?status=&branch=&limit=`, `POST /v1/payments/{id}/cancel`, `POST /v1/payments/{id}/simulate` (test keys only). - Branches: a store (one shop) may have branches, each sharing the store's ABA link or carrying its own. Send `"branch": "br_..."` when creating a payment (or bind the API key to a branch in the dashboard); every payment and webhook carries `branch` (`{id, name}` or `null`). Errors `404 branch_not_found`, `409 branch_not_active`. - Quota: `GET /v1/usage` returns plan, limit, used, remaining for the calendar month (pooled across stores). - Outcome: webhook `POST` with `X-KHQR-Signature: t=,v1=.">`, 300 s tolerance. Only `payment.completed` (status `paid`) with `livemode: true` means money arrived; `webhook.test` is a dashboard sample. - Open-amount QR (beta): `POST /v1/payments {"open_amount": true}` creates a QR with no amount; the customer types it. The payment has `amount: null` until paid, then `amount` and `amount_status` (`receipt`, or `unverified` when the receipt could not be read: check the ABA app). Always compare the paid amount with what you expect. - Hosted checkout redirects to the success or failure URL with `?status=&payment_id=&reference_id=`; confirm with the webhook or a GET before fulfilling. - A QR stays open 5 minutes by default (store setting, 1-30 minutes); `expires_in` (seconds, 60 to 1800) sets it per payment. Up to 3 days is a private beta enabled per store. `expiresAt` is exact. Payments carry `qr_string` (KHQR payload) and `deeplink` (`ios`/`android` links that open ABA Mobile with the QR) for your own checkout. ## Docs - [Full API reference, plain text](https://dalodesk.com/llms-full.txt): every endpoint, field, status, error code, webhook rule and redirect rule in one file. Read this one to implement. - [OpenAPI 3.1 specification](https://dalodesk.com/openapi.json): schemas for requests, responses, errors and the webhook event. - [API documentation](https://dalodesk.com/docs): the human-readable version, with a "Copy prompt for AI" control that bundles the reference with framework-specific instructions (Laravel, Node/Express, Next.js, WooCommerce, Django, plain HTML). ## Optional - [Dashboard](https://dalodesk.com/app): create API keys, webhook endpoints and redirect URLs. - [Terms of Service](https://dalodesk.com/terms) - [Privacy Policy](https://dalodesk.com/privacy)