Une API que votre équipe va vraiment apprécier
REST prévisible, clés d'idempotence, webhooks signés et une sandbox avec rails simulés pour intégrer de bout en bout avant de déplacer le moindre franc.
Votre premier encaissement en une requête
Du REST propre, une enveloppe JSON prévisible et un identifiant de requête sur chaque réponse. La sandbox reflète la production : même API, mêmes statuts, mêmes webhooks.
- Clés sandbox et production, limitées par application
- Webhooks signés HMAC avec protection anti-rejeu
- Clés d'idempotence sur chaque appel qui déplace de l'argent
- Des erreurs typées qui disent exactement quoi corriger
- Specification OpenAPI, collection Postman et llms.txt, tous publies
- Sessions de checkout hébergées et callbacks à plat pour les connecteurs CRM, ERP et boutiques
curl https://api.capayglobal.com/v1/collections \
-H "Authorization: Bearer sk_test_..." \
-H "Idempotency-Key: 9f1c-collect-01" \
-H "Content-Type: application/json" \
-d '{
"amount": "2500",
"currency": "XAF",
"country": "CM",
"method": "mobile_money",
"msisdn": "2376XXXXXXXX",
"merchant_reference": "order-1042"
}'{
"status": "success",
"data": {
"id": "col_9xKQ2mD41Vb8",
"object": "collection",
"status": "pending",
"amount": "2500",
"currency": "XAF",
"country": "CM",
"method": "mobile_money",
"merchant_reference": "order-1042",
"fees": {
"platform_fee": "50",
"provider_fee": "0",
"total_fee": "50",
"bearer": "merchant"
},
"net_amount": null,
"livemode": false,
"created_at": "2026-08-30T12:04:11Z"
},
"request_id": "req_b0f3d2c1"
}Votre premier encaissement
Une requete cree une intention de paiement, renvoie un identifiant de requete et, pour le mobile money, envoie l'invite sur le telephone du payeur. Le bac a sable se comporte exactement comme la production.
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"
}SDK serveur
Des enveloppes fines et typees autour de la meme API REST, avec l'idempotence et la verification de signature integrees.
import { Capay } from '@capay/sdk';Pas encore sur npm. La ligne d'import ci-dessus est définitive : votre intégration ne changera pas lors de la publication.
Lire le guidefrom capay import CapayPas encore sur PyPI. La ligne d'import ci-dessus est définitive : votre intégration ne changera pas lors de la publication.
Lire le guideuse Capay\CapayClient;Pas encore sur Packagist. La ligne d'import ci-dessus est définitive : votre intégration ne changera pas lors de la publication.
Lire le guideVerifiez chaque webhook
Les signatures sont calculees sur le corps brut et comparees en temps constant, et un horodatage plus vieux que 300 secondes est rejete. Ne faites jamais confiance a un webhook que vous n'avez pas verifie.
# T is the t= value from X-Capay-Signature; delivery.json is the raw body as received.
T=1767225600
SECRET=whsec_XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
{ printf '%s.' "$T"; cat delivery.json; } \
| openssl dgst -sha256 -hmac "$SECRET" -r | cut -d' ' -f1
# Compare the printed hex with each v1= value in the header (either may match
# during a secret rotation), and reject the delivery if |now - T| > 300 s.X-Capay-Signature: t=1767225600,v1=6f8b4c2d9e0a1b3c5d7e9f0a2b4c6d8e0f1a3b5c7d9e1f0a2b4c6d8e0f1a3b5c
X-Capay-Event-Id: evt_2n4Kq8Zr41Xa
X-Capay-Event-Type: collection.completedUne livraison echouee est reessayee selon un calendrier fixe : 1m, 5m, 30m, 2h, 6h, 12h, 24h, 24h. Un point de terminaison qui echoue 8 fois de suite est desactive et vous en etes informe : un point mort n'avale jamais des evenements en silence.
Deux secrets de signature peuvent etre actifs en meme temps : vous pouvez donc tourner vos cles sans perdre un evenement. Rejetez tout ce qui sort de la fenetre de 300 secondes et stockez l'identifiant d'evenement pour rendre les rejeux inoffensifs.
Le reste de la boite a outils
Des specifications lisibles par machine, une collection a importer, et les outils qui les lisent.
Explorer la plateforme
Commencez à encaisser en Afrique dès aujourd'hui
Créez un compte gratuit, développez sur la sandbox et passez en production après vérification.
Parlez-nous de vos corridors et de vos volumes à tout moment.