A single endpoint creates a hosted-checkout intent. Redirect the customer, listen for the webhook, ship. No card form, no PCI scope, no terminal.
curl -X POST https://api.quatapay.com/api/v1/gateway/payments \
-H "Authorization: Bearer qpay_test_…" \
-H "Idempotency-Key: $(uuidgen)" \
-H "Content-Type: application/json" \
-d '{
"amount": 5000,
"currency": "XAF",
"reference": "order_12345",
"success_url": "https://shop.example.com/pay/ok"
}'
# → 201
{
"data": {
"id": "pay_01HZ9X...",
"status": "pending",
"checkout_url": "https://quatapay.com/pay/abcd1234",
"expires_at": "2026-05-11T13:42:00Z"
}
}<10 min
Quickstart
First payment live
490+
API endpoints
Per-role + per-event
<24h
Sandbox approval
Test keys immediately
v1
API version
Stable since 2026
Why us
Every choice here was made because the alternative wasted somebody's afternoon.
One JSON envelope on every response: `{ data, error, code }`. No bespoke field names per endpoint.
Send a UUID in `Idempotency-Key` on every POST. Replays return the cached response — never double-charge.
HMAC-SHA256 with your endpoint secret. Reject anything that doesn't match. We retry with exponential backoff.
`qpay_test_…` and `qpay_live_…` — impossible to ship sandbox keys to prod by accident.
Pre-funded, deterministic. Simulate success, failure, timeout, refund — all without touching real money.
We host the checkout. Your servers never see card numbers. Card-network compliance is on us.
How it works
POST /api/v1/gateway/payments with amount + currency + your order reference. We return a checkout URL.
Send them to the checkout URL. They confirm in the QuataPay app or pay via mobile money. We bring them back to your success / cancel URL.
We POST to your endpoint on payment.succeeded / .failed / .refunded. You verify the signature and fulfil the order.
Webhooks are signed with HMAC-SHA256. If your endpoint returns anything other than 2xx, we retry with exponential backoff for up to 24 hours — and surface the failures in the admin panel so they don't get lost.
POST /webhooks/qpay HTTP/1.1
Host: shop.example.com
X-QuataPay-Signature: sha256=a3f1c0…
Content-Type: application/json
{
"id": "evt_01HZ9X...",
"type": "payment.succeeded",
"created_at": "2026-05-11T12:34:56Z",
"data": {
"payment": {
"id": "pay_01HZ9X...",
"amount": 5000,
"currency": "XAF",
"reference": "order_12345",
"succeeded_at": "2026-05-11T12:34:50Z"
}
}
}The toolkit
Every endpoint, every field, with examples in cURL, JS, Python, PHP.
ReadTest keys + simulated wallets. Fund / drain / reset from the merchant panel.
ReadDrop-in snippets for Node, Python, PHP. Includes webhook verification + idempotency loops.
ReadEvent types, signature verification, retry policy, debugging tips.
ReadSandbox vs production endpoints, IP allow-listing, TLS requirements.
ReadAPI keys, Bearer tokens, JWT access tokens for user-side calls, rotation.
Read“The sandbox simulator alone saved us a week. We wired the whole checkout in an afternoon and shipped to production the next day.”
Build today
Create a merchant account, grab a test key, charge a simulated payment. No KYC required for sandbox.