Getting started
One API. Africa's Payment Infrastructure. The Capay Global Payment Gateway API lets you collect mobile money, bank and card payments, send payouts and issue refunds across Africa, from a single integration.
Get your test keys
Create a free account, then open Developers > API keys in the dashboard. Sandbox keys start with sk_test_ and are shown once, so store the key the moment it appears. Sandbox keys never touch a real provider and never move real money.
Two calls to get paid
The whole integration for accepting a payment is one POST and one webhook. Everything else in these docs is optional depth you can add when you need it.
1. Create a collection. The payer gets a prompt on their phone (or a redirect for bank and card rails). Routing to the right operator happens on our side, so this same request works in every market we cover.
curl -X POST https://api.capayglobal.com/v1/collections \
-H "Authorization: Bearer sk_test_XXXXXXXXXXXX" \
-H "Idempotency-Key: col-order-10482-a1b2c3" \
-H "Content-Type: application/json" \
-d '{
"amount": "5000",
"currency": "XAF",
"country": "CM",
"method": "mobile_money",
"msisdn": "+237650000001",
"merchant_reference": "order-10482"
}'{
"status": "success",
"data": {
"id": "col_7Qm3k1Xa9Zr4",
"object": "collection",
"status": "pending",
"amount": "5000",
"currency": "XAF",
"auth_model": "STK_PROMPT",
"livemode": false
},
"request_id": "3fa85f64-5717-4562-b3fc-2c963f66afa6"
}2. Get told when the money lands. Register a webhook endpoint once, in the dashboard or via the API, and act on collection.completed. Prefer no inbound calls? Poll GET /v1/collections/{id} instead.
{
"id": "evt_2n4Kq8Zr41Xa",
"object": "event",
"type": "collection.completed",
"created_at": "2026-08-29T12:00:04Z",
"livemode": false,
"data": {
"id": "col_8fK2q0Zr41Xa",
"object": "collection",
"status": "completed",
"amount": "5000",
"currency": "XAF",
"country": "CM",
"method": "mobile_money",
"reason_code": null,
"merchant_reference": "order-10482",
"livemode": false
}
}Prefer zero code? Payment links and the hosted checkout collect without any integration at all: create a link in the dashboard and share it. See Payment links & checkout
Platform integrations
Run a CRM, an ERP, a shop or a billing system? Open a hosted checkout session for each deposit, send the customer to pay.capayglobal.com, and get the result as a signed return link plus a flat or standard callback; pay withdrawals by your own reference and reconcile with one report. Built for any platform that can call a REST API, including forex broker CRMs such as FXBO. Read the platform integrations guide
Base URL
All requests go to the versioned base URL below over HTTPS. Every response is JSON.
https://api.capayglobal.com/v1
Your first request
Create a sandbox secret key in the dashboard under Developers, then verify it against /v1/whoami. The response tells you which merchant, app and environment the key belongs to.
curl https://api.capayglobal.com/v1/whoami \ -H "Authorization: Bearer sk_test_XXXXXXXXXXXX"
The response envelope
Every response, success or error, is wrapped in an envelope that carries a request_id (also sent as the X-Request-Id header). Quote that id to support and we can find the exact invocation. Money amounts are decimal strings with an explicit currency: never floats, never bare integers.
{
"status": "success",
"data": {
"merchant": {
"id": "0f9a2c34-6b1d-4e8a-9c21-7d2f5a1b3c4d",
"public_id": "mch_8fK2q0Zr41Xa",
"trading_name": "Sunrise Electronics"
},
"app": {
"id": "b7e1d2c3-4f5a-6789-abcd-ef0123456789",
"name": "Default app",
"environment": "SANDBOX"
},
"key": { "prefix": "sk_test_8fK2", "scopes": ["read", "write"] },
"livemode": false
},
"request_id": "3fa85f64-5717-4562-b3fc-2c963f66afa6"
}Discover providers
GET /v1/providers lists every operator your keys can reach: countries, currencies, methods, per-corridor amount limits and live health status. Use it to build your own payment method selector.
curl https://api.capayglobal.com/v1/providers \ -H "Authorization: Bearer sk_test_XXXXXXXXXXXX"
Price a payment before creating it
GET /v1/pricing returns the exact fee breakdown, provider fee, platform fee and who bears them, before you create anything. No fee surprises.
curl "https://api.capayglobal.com/v1/pricing?direction=collection&country=CM¤cy=XAF&method=mobile_money&amount=5000" \ -H "Authorization: Bearer sk_test_XXXXXXXXXXXX"
{
"status": "success",
"data": {
"direction": "collection",
"country": "CM",
"currency": "XAF",
"method": "mobile_money",
"amount": "5000",
"fees": {
"provider_fee": "0",
"platform_fee": "100",
"total_fee": "100",
"bearer": "merchant"
}
},
"request_id": "5c7d9e10-2b34-4a56-9f78-e01a2b3c4d5e"
}Where next
The guides cover the rest of the journey: accept payments with no backend code through payment links and the hosted checkout, see exactly which countries and methods are live today, understand fees and how settlement works, and take your integration to production.
Machine-readable
The same API, in formats a tool can read. Import the Postman collection to send your first request without writing any code.