Capay Global

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
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"
  }'
201 response (abridged)
{
  "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.

collection.completed webhook
{
  "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.

base url
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
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.

200 response
{
  "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
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
curl "https://api.capayglobal.com/v1/pricing?direction=collection&country=CM&currency=XAF&method=mobile_money&amount=5000" \
  -H "Authorization: Bearer sk_test_XXXXXXXXXXXX"
200 response
{
  "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.