Introduction à AfrikMoney Pay
AfrikMoney est une infrastructure de paiement unifiée conçue pour simplifier l'intégration des services Mobile Money au Bénin. Notre API robuste permet aux entreprises de gérer les encaissements (Payins) et les décaissements (Payouts) via une interface unique, sécurisée et ultra-rapide.
Sécurité Bancaire
Authentification par clés sécurisées et chiffrement TLS 1.3 de toutes les données de transaction.
Haute Disponibilité
Connectivité redondante avec les passerelles opérateurs locaux (MTN, Moov, Celtiis) pour un taux de succès maximal.
Authentification
Toutes les requêtes API doivent inclure votre clé secrète dans l'en-tête HTTP.
L'absence d'en-tête ou une clé invalide retourne 401 Unauthorized.
Authorization: Bearer pk_xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
Formats de référence
Encaissements v1 (Payins)
Collectez des fonds auprès de vos clients via Push USSD ou page de paiement hébergée.
Séparation des fonds — Encaissements vs Wallet
Les fonds perçus via les encaissements (Payins) sont conservés sur votre compte de collecte, distinct de votre wallet marchand.
- → Pour reverser les fonds collectés vers votre compte bancaire ou Mobile Money, connectez-vous à votre tableau de bord et soumettez une demande de reversement.
- → Le wallet marchand est un solde séparé, rechargeable via l'API, utilisé exclusivement pour déclencher des payouts (décaissements) depuis vos applications.
POST /api/v1/direct
Déclenche un Push USSD directement sur le téléphone du client. Le client reçoit une invite de confirmation sur son mobile et valide le paiement sans être redirigé vers une page externe.
{
"amount": 5000,
"provider": "MTN_BJ",
"customer_phone": "2290167030967",
"customer_email": "jean@gmail.com",
"customer_name": "Jean Durand",
"description": "Facture internet"
}
{
"success": true,
"data": {
"transaction_id": "420b41ce-faac-403d-8431-3fbad7da740f",
"reference": "TXN_IYGNKBFNSHUQTWOO",
"merchant_reference": "ORD-20260609133102-YEUM1R",
"amount": 5000,
"fees": 100,
"total": 5100,
"status": "processing",
"metadata": {
"amount": 5000,
"provider": "MTN_BJ",
"method": "api",
"customer": {
"name": "Jean Durand",
"email": "jean@gmail.com",
"phone": "2290167030967"
},
"description": "Facture internet",
"timestamp": "2025-12-09 13:31:02"
}
}
}
POST /api/v1/request
Génère un lien de paiement hébergé (pay_req_…) valable 10 minutes
que vous partagez à votre client. Frais de 2 % automatiquement ajoutés au montant.
{
"amount": 10000,
"customer_phone": "2290167000003",
"customer_email": "client@mail.com",
"customer_name": "Paul Dubois",
"description": "Paiement facture #2024"
}
{
"success": true,
"message": "Payment link generated successfully.",
"data": {
"reference": "pay_req_c5SNT5ftoyyj",
"amount": 10000,
"fees": 200,
"total": 10200,
"currency": "XOF",
"status": "pending",
"customer_phone": "2290167030967",
"customer_email": "client@mail.com",
"customer_name": "Paul Dubois",
"description": "Paiement facture #2024",
"payment_url": "https://pay.afrikmoney.com/pay_req_c5SNT5ftoyyj"
}
}
GET /api/v1/{reference}
{reference} :
TXN_XXXXXXXXXXXXXXXX
ou votre
merchant_reference
Récupère le statut et les détails d'un encaissement depuis la base de données locale.
{
"success": true,
"data": {
"transaction_id": "550e8400-e29b-41d4-a716-446655440000",
"reference": "TXN_A1B2C3D4E5F6G7H8",
"merchant_reference": "CMD-2024-001",
"amount": 2500,
"fees": 87.50,
"total": 2587.50,
"net_amount": 2500,
"status": "success",
"customer_phone": "2290167000001",
"failure_reason": null,
"created_at": "2025-12-01T10:00:00.000000Z",
"completed_at": "2025-12-01T10:02:14.000000Z"
}
}
GET /api/v1/{reference}/verify
{reference} :
TXN_XXXXXXXXXXXXXXXX
ou votre
merchant_reference
Interroge en temps réel MTN / Moov / Celtiis pour confirmer le statut définitif, puis synchronise la base de données locale. À utiliser en cas de doute sur l'état d'une transaction.
{
"success": true,
"message": "Transaction status verified with provider.",
"data": {
"transaction_id": "550e8400-e29b-41d4-a716-446655440000",
"reference": "TXN_A1B2C3D4E5F6G7H8",
"merchant_reference": "CMD-2024-001",
"status": "success",
"provider_reference": "660ba8c2-93aa-4165-b905-e0ff4c5e0d08",
"failure_reason": null,
"updated_at": "2025-12-01T10:02:14.000000Z"
}
}
Wallet & Décaissements v1
Consultez le solde de votre wallet marchand, rechargez-le via Mobile Money et déclenchez des payouts vers vos bénéficiaires.
GET /api/v1/balance
Récupère le solde net disponible du wallet marchand avec détail par opérateur.
{
"success": true,
"balance": 150000,
"currency": "XOF",
"breakdown": [
{ "operator": "MTN_BJ", "balance": 100000 },
{ "operator": "MOOV_BJ", "balance": 50000 },
{ "operator": "CELTIIS_BJ", "balance": 0 }
]
}
POST /api/v1/wallet/recharge
Génère un lien de paiement hébergé (pay_req_…) pour recharger le wallet marchand via Mobile Money.
La personne ouvre l'URL, confirme, puis valide sur son téléphone.
Frais de plateforme : 3 % ajoutés automatiquement. Lien valable 10 minutes.
{
"amount": 20000,
"phone_number": "2290167030967",
"operator": "MTN_BJ"
}
{
"success": true,
"message": "Lien de recharge généré avec succès.",
"data": {
"reference": "pay_req_aB3xK9mZqR2s",
"checkout_url": "https://pay.afrikmoney.com/pay_req_aB3xK9mZqR2s",
"amount": 20000,
"fees": 600,
"total": 20600,
"currency": "XOF",
"operator": "MTN_BJ",
"phone_number": "2290167030967",
"expires_at": "2025-12-01T10:10:00.000000Z",
"status": "pending"
}
}
| Champ | Type | Description |
|---|---|---|
| amount | number | Montant net à créditer dans le wallet (min 100 XOF). Les 3 % sont ajoutés automatiquement. |
| phone_number | string | Numéro Mobile Money (8 à 13 chiffres, ex : 2290167030967). |
| operator | string | MTN_BJ, MOOV_BJ ou CELTIIS_BJ. |
Webhook envoyé après confirmation : wallet_recharge.success ou wallet_recharge.failed.
POST /api/v1/payout/verify-recipient
Vérifie le titulaire réel d'un numéro Mobile Money avant d'envoyer un payout — utile pour confirmer que vous envoyez bien à la bonne personne avant que l'argent ne parte. Disponible uniquement pour MTN_BJ pour le moment.
Deux garde-fous
Le solde de votre wallet doit être positif, et vous êtes limité à 20 vérifications par jour. Ces règles évitent que cet endpoint ne serve de simple outil de recherche d'identité par numéro de téléphone.
{
"phone": "2290167000004",
"payment_method": "MTN_BJ"
}
{
"success": true,
"verified": true,
"name": "Koffi Mensah",
"phone": "2290167000004"
}
{
"success": false,
"message": "Solde insuffisant pour vérifier ce bénéficiaire. Solde disponible : 0 XOF."
}
{
"success": false,
"message": "Nombre maximal de vérifications atteint pour aujourd'hui (20/jour)."
}
⚠️ "verified": false (avec "name": null) signifie que l'opérateur n'a pas pu identifier le titulaire — numéro non enregistré en Mobile Money ou informations non disponibles. Ce n'est pas une erreur : vous pouvez tout de même tenter le payout.
POST /api/v1/payout
Initie un versement de fonds depuis votre wallet marchand vers un bénéficiaire Mobile Money.
{
"amount": 5000,
"phone": "2290167000004",
"payment_method": "MTN_BJ",
"client_fullname": "Abel Sossou",
"objet": "Règlement prestation"
}
{
"message": "Transfert réussi instantanément",
"status": "SUCCESSFUL",
"payout_id": "550e8400-e29b-41d4-a716-446655440001",
"payout_intern_reference": "PYO_A1B2C3D4E5F6G7H8",
"client_fullname": "Abel Sossou",
"payment_method": "mtn_bj",
"balance": 145000,
"amount_will_be_deducted": true
}
{
"success": false,
"message": "Échec du retrait: Solde insuffisant. Solde disponible: 0 XOF"
}
⚠️ Cette erreur survient lorsque le solde de votre wallet marchand est insuffisant pour couvrir le montant demandé. Rechargez votre wallet avant de relancer le payout.
Suivi des Payouts
Consultez l'état d'un payout en base locale ou vérifiez-le directement auprès de l'opérateur.
GET /api/payouts/{reference}
{reference} :
PYO_XXXXXXXXXXXXXXXX
Récupère le statut et les détails d'un payout direct depuis la base de données locale.
{
"success": true,
"data": {
"id": "550e8400-e29b-41d4-a716-446655440002",
"reference": "PYO_X9Y8Z7W6V5U4T3S2",
"amount": 10000,
"fees": 0,
"currency": "XOF",
"status": "success",
"recipient_phone": "2290167000005",
"recipient_name": "Koffi Mensah",
"provider_reference": "660ba8c2-93aa-4165-b905-e0ff4c5e0d08",
"failure_reason": null,
"created_at": "2025-12-01T10:00:00.000000Z"
}
}
GET /api/payouts/{reference}/verify
{reference} :
PYO_XXXXXXXXXXXXXXXX
Vérifie l'état réel du payout directement auprès de l'opérateur (MTN, Moov, Celtiis) et synchronise la base locale.
{
"success": true,
"message": "Payout status verified with provider.",
"data": {
"payout_id": "550e8400-e29b-41d4-a716-446655440002",
"reference": "PYO_X9Y8Z7W6V5U4T3S2",
"status": "success",
"provider_reference": "660ba8c2-93aa-4165-b905-e0ff4c5e0d08",
"updated_at": "2025-12-01T10:02:14.000000Z"
}
}
Webhooks
Nos serveurs envoient un POST signé à votre URL de webhook à chaque changement de statut.
Répondez 200 OK pour accuser réception (5 tentatives avec backoff en cas d'échec).
Idempotence requise
Vérifiez toujours le champ reference en base avant de traiter l'événement — un même webhook peut être retransmis en cas d'erreur réseau.
Signature dans le header : X-Webhook-Signature: HMAC-SHA256(payload, webhook_secret)
{
"event": "transaction.success",
"transaction": {
"id": "550e8400-e29b-41d4-a716-446655440000",
"reference": "TXN_YNPY1E5GAXZ7I6QK",
"merchant_reference": "CMD-2024-001",
"checkout_reference": null,
"amount": "100.00",
"fees": "0.80",
"net_amount": "100.00",
"currency": "XOF",
"status": "success",
"customer_phone": "2290167000001",
"customer_email": "client@exemple.bj",
"failure_reason": null,
"created_at": "2025-12-09T11:34:46.000000Z",
"completed_at": "2025-12-09T11:34:56.000000Z"
},
"timestamp": "2025-12-09T12:34:56+01:00"
}
{
"event": "transaction.failed",
"transaction": {
"id": "550e8400-e29b-41d4-a716-446655440001",
"reference": "TXN_HFWXD1JAMPYZUKX1",
"merchant_reference": "CMD-2024-002",
"checkout_reference": "CMD-2024-002",
"amount": "2550.00",
"fees": "20.40",
"net_amount": "2550.00",
"currency": "XOF",
"status": "failed",
"customer_phone": "2290167000002",
"customer_email": "client@exemple.bj",
"failure_reason": "COULD_NOT_PERFORM_TRANSACTION",
"created_at": "2025-12-04T16:30:36.000000Z",
"completed_at": "2025-12-04T16:35:29.000000Z"
},
"timestamp": "2025-12-04T17:35:31+01:00"
}
{
"event": "payout.success",
"payout": {
"id": "550e8400-e29b-41d4-a716-446655440002",
"reference": "PAYOUT-B3FAEJE6FRIN",
"amount": "18.00",
"fees": 0,
"currency": "XOF",
"status": "success",
"recipient_phone": "2290167000005",
"recipient_name": "John DOE",
"failure_reason": null,
"created_at": "2025-12-03T12:35:11.000000Z",
"completed_at": "2025-12-03T12:36:11.000000Z"
},
"timestamp": "2025-12-03T13:36:11+01:00"
}
{
"event": "wallet_recharge.success",
"wallet_recharge": {
"id": "550e8400-e29b-41d4-a716-446655440003",
"reference": "e38a4544-219d-42fb-990d-f5233c4ffd0d",
"checkout_reference": "pay_req_dyUiSwaKjph5",
"amount": "10.00",
"amount_charged": "11.00",
"fee_amount": "1.00",
"currency": "XOF",
"status": "success",
"phone_number": "2290167000001",
"operator": "MTN_BJ",
"failure_reason": null,
"created_at": "2025-12-03T12:08:12.000000Z",
"updated_at": "2025-12-03T12:08:25.000000Z"
},
"timestamp": "2025-12-03T13:08:28+01:00"
}
{
"event": "wallet_recharge.failed",
"wallet_recharge": {
"id": "550e8400-e29b-41d4-a716-446655440004",
"reference": "1d16adba-1b1b-4307-80dc-a433b65d0c02",
"checkout_reference": "pay_req_3VvPJNBNCGhB",
"amount": "20000.00",
"amount_charged": "20600.00",
"fee_amount": "600.00",
"currency": "XOF",
"status": "failed",
"phone_number": "2290167000002",
"operator": "MTN_BJ",
"failure_reason": "Solde insuffisant ou limite de réception du bénéficiaire atteinte.",
"created_at": "2025-12-04T12:44:02.000000Z",
"updated_at": "2025-12-04T12:44:05.000000Z"
},
"timestamp": "2025-12-04T13:44:05+01:00"
}
Notifications Telegram
Recevez en temps réel les alertes de paiements, payouts et recharges directement dans Telegram, sans avoir à surveiller votre tableau de bord.
1 Connecter votre compte
Depuis votre tableau de bord, rendez-vous dans Paramètres › Canaux de notification et cliquez sur Connecter Telegram.
Un lien unique est généré (valable 10 minutes). Il ouvre directement notre bot Telegram @afrikmoney_bot avec un token de liaison. Le bot confirme instantanément la connexion.
2 Activer les notifications
Une fois le bot connecté, activez le canal Telegram dans vos préférences de notification. Vous pouvez désactiver à tout moment, ou déconnecter le bot en envoyant /unlink dans la conversation.
Notifications reçues automatiquement
| Événement | Déclencheur |
|---|---|
| transaction.success | Paiement Mobile Money reçu |
| transaction.failed | Tentative de paiement échouée |
| wallet_recharge.success | Recharge du wallet confirmée |
| wallet_recharge.failed | Recharge du wallet échouée |
| payout.success | Payout envoyé avec succès |
| payout.failed | Payout échoué |
Format des messages
Exemple de notification pour un paiement reçu :
Paiement reçu
Montant : 5 000 XOF
Numero : 22967000000 (MTN_BJ)
Ref : pay_XXXXXXXXXXXX
10/06/2025 14:32
Commandes disponibles dans le bot
| Commande | Action |
|---|---|
| /start | Message de bienvenue et instructions |
| /unlink | Déconnecter votre compte du bot |