QuataPay
Developer docs

API Reference

Base URL: https://quatapay.com/api/v1 — all responses use the { data: … } envelope.

Browse developer docs
Back to developer docs

API Reference

Base URL: https://quatapay.com/api/v1

All requests must include Content-Type: application/json. All responses follow the envelope format:

{ "data": { … } }

Error responses:

{ "error": "Validation failed", "code": "VALIDATION_ERROR", "details": { … } }

Authentication

API key (merchant gateway)

Pass your secret API key as a Bearer token:

Authorization: Bearer qpay_live_…

User JWT (checkout flows)

After a user logs in, pass their access token:

Authorization: Bearer eyJ…

Gateway payments

Create a payment intent

POST /gateway/payments

Auth: API key

Body:

FieldTypeRequiredDescription
amountintegerAmount in smallest currency unit (XAF)
currencystringISO 4217 currency code. Currently XAF
descriptionstringHuman-readable description shown to customer
return_urlstringRedirect URL on success
cancel_urlstringRedirect URL on cancellation
customer_referencestringYour internal order/customer ID
metadataobjectArbitrary key-value pairs passed through to webhooks
expires_in_minutesintegerIntent TTL, default 60

Response: 201 Created

{
  "data": {
    "payment": { "id": "…", "slug": "…", "status": "requested", … },
    "checkout_url": "https://quatapay.com/checkout/…"
  }
}

Get a payment intent

GET /gateway/payments/{payment_id}

Auth: API key (must be the creating merchant's key)


List payment intents

GET /gateway/payments?status=succeeded&limit=50

Auth: API key

Query paramTypeDefaultDescription
statusstringFilter by status: requested, succeeded, failed, cancelled
limitinteger50Max 200

Hosted checkout — preview

GET /gateway/checkout/{slug}

Auth: None (public)

Returns the intent summary for the checkout UI to display.


Hosted checkout — pay

POST /gateway/checkout/{slug}/pay

Auth: User JWT

Body:

FieldTypeRequiredDescription
pinstringUser's wallet PIN (required if PIN is set)
idempotency_keystringClient-generated unique key (prevent double-pay)

Hosted checkout — cancel

POST /gateway/checkout/{slug}/cancel

Auth: None


Payment intent statuses

StatusMeaning
requestedCreated, awaiting customer action
succeededCustomer paid; funds moved; webhook fired
failedTransfer rejected (insufficient funds, etc.)
cancelledCustomer cancelled or TTL expired

Idempotency

Supply idempotency_key on mutating requests. Replaying the same key within 24 hours returns the cached response instead of creating a duplicate transaction.


Rate limits

TierLimit
API key requests300 req / min
Checkout page loads600 req / min

Exceeding limits returns 429 Too Many Requests.


Errors

HTTP StatusCodeDescription
400VALIDATION_ERRORRequest body failed validation
401UNAUTHORIZEDMissing or invalid credentials
403FORBIDDENValid credentials but insufficient permission
404NOT_FOUNDResource does not exist
409CONFLICTDuplicate idempotency key or state conflict
410GONEIntent expired
422VALIDATION_ERRORSemantic validation failure
429RATE_LIMITEDToo many requests
503SERVICE_UNAVAILABLETemporary downstream issue