I-1 Introduction

Bienvenue dans l’API d’envoi d’argent. Cette API permet aux développeurs d’intégrer facilement des fonctionnalités de transfert de fonds dans leurs applications web ou mobiles. Elle prend en charge l’envoi d’argent entre utilisateurs, les paiements vers des comptes bancaires ou des portefeuilles mobiles, et fournit un suivi en temps réel des transactions.

L’API est sécurisée, rapide et conçue pour répondre aux besoins des plateformes fintech, des services de paiement et des applications de commerce en ligne. Elle s’intègre facilement à votre infrastructure existante grâce à une architecture RESTful, une authentification basée sur les tokens, et une documentation claire.

I-2 Restriction d’adresses IP dans l’API

Cette fonctionnalité permet de limiter l'accès à l’API uniquement à certaines adresses IP autorisées, renforçant ainsi la sécurité

I-3 Reponse de l erreur
{
  "data": {
    "ip": "127.0.0.1"
  },
  "message": "Access denied. Unauthorized IP address."
}
    

II-1 Webhooks

L’API prend en charge l’envoi automatique de notifications par webhook à chaque mise à jour critique du statut d’une transaction. Cela permet aux systèmes partenaires d’être notifiés en temps réel, sans avoir à interroger en boucle l’API (polling).

II-2 Quand un webhook est-il déclenché ?

Un webhook est déclenché à chaque changement de statut d’une transaction, notamment :

pending → processing
processing → success
processing → failed
success → refunded (le cas échéant)
        

II-3 Format de la requête webhook

En-têtes :

Content-Type: application/json
X-Signature: {HMAC-SHA256 du payload signé avec la clé secrète}

        

Payload JSON envoyé :

{
  "transaction_id": "TXN-123456",
  "status": "success",
  "amount": 250.00,
  "currency": "USD",
  "timestamp": "2025-01-09T01:42:54+00:00"
}

        

II-4 Sécurité

Chaque webhook est signé avec un HMAC SHA256 dans le header X-Signature, généré à l’aide d’une clé secrète partagée. Le destinataire doit vérifier cette signature pour garantir l’intégrité de la notification.

$expectedSignature = hash_hmac('sha256', $payload, $secret);

III-1 Récupération de la clé API (private_key,secret_key) pour l’environnement Sandbox

Pour interagir avec notre API en mode test (sandbox), chaque développeur doit disposer d’une clé API dédiée, générée via son compte développeur. Cette clé permet d’effectuer des appels simulés sans déclencher de transactions réelles.

🧭 Étapes pour obtenir la clé API Sandbox

Créer un compte développeur
Recuperer ses identifiants

Dans le menu "Accounts , copier vos identifiants"

La clé vous sera affichée une seule fois : copiez-la et stockez-la en lieu sûr

Environnement sandbox

III-1 Authentification

L'API utilise un token JWT dans l'en-tête Authorization.

Authorization: Bearer <votre_access_token>

POST /api/login

III-2🎯 Authentifie un utilisateur avec ses identifiants

Ce endpoint permet à un utilisateur de se connecter en envoyant son email et son mot de passe. En cas de succès, un token d’accès est renvoyé pour les appels API futurs..

Corps JSON attendu :

{
"private_key":"wtc_private_sandbox25042557g2tpjdwdkt8swj596r7r987jro",
"secret_key":"wtc_secret_sandbox250425571rp0e31y0eqklo2q0uwkfw5plu"
}
Requête :
POST /api/login
Réponse :
{
  "access_token": "eyJ0eXAiOiJKV1QiLCJhbGciOiJSUzI1NiJ9.eyJpc3MiOiJ3dGNfYXBpIiwic3ViIjoxLCJpYXQiOjE3NDYxODg2NTIsImV4cCI6MTc0NjE5MjI1Mn0.SIrzfmIwcuI4JDQkjzUoWBJ0-WMOaUQKwVVA5ydaVLLk8ZWF42F90ROSSpDf0w5uT7qQLuk6phpcu7XQSFRDz9_3Jpr-qM9ErW9tiuO7l3evpzjxSmlLt8E4s3HRAS9GrGmVIqkEGDQEyLtAFZqX-3AZQJCkl05lYBkD-YjbF0hX1HC84Enx6iF5E2Bzzjq9Em4xcs1638FJt5R5p9IKnsZr2Ww7MY4iTqdDjn99lfOZpo86uvgOnZvSrPpAoPSnDceJ3ZQkwRU4ohqSALkUW4PZsPS9k-0BqJE1BJiqGXj3XVnNnemHGCmUso72jBEX03AaD2CoZS13g-qXQGPk5w",
  "token_type": "bearer",
  "expires_in": 3600
}

GET /api/countries

permet de récupérer la liste des pays disponibles pour l’envoi ou la réception d’argent via la plateforme.

Il est utile pour alimenter des menus déroulants ou valider les destinations autorisées dans votre application

Requête :
GET /api/countries
Réponse :
{
  "message": "senders get successful",
  "status": "success",
  "data": [
    {
      "name": "Cameroun",
      "code_iso": "CM",
      "currency": "XAF"
    },
    {
      "name": "Congo",
      "code_iso": "CG",
      "currency": "XAF"
    },
    {
      "name": "Congo RDC",
      "code_iso": "CD",
      "currency": "XAF"
    },
    {
      "name": "Senegal",
      "code_iso": "SN",
      "currency": "XOF"
    },
     ...           }

GET /api/cities

permet d’obtenir la liste des villes disponibles pour un pays donné, identifié par son code ISO à deux lettres.

Il est généralement utilisé pour filtrer les zones de destination lors de l’envoi d’argent.

Paramètres de requête :

Requête :

Champs :

  • name : Nom de la ville (string)
  • country : Pays auquel appartient la ville (string)
GET /api/cities?codeiso=CM
Réponse :
                {
  "message": "cities get successful",
  "status": "success",
  "data": [
    {
      "name": "Douala",
      "country": "Cameroun"
    },
    {
      "name": "Yaoundé",
      "country": "Cameroun"
    },
    {
      "name": "Bamenda",
      "country": "Cameroun"
    },
    {
      "name": "Bafoussam",
      "country": "Cameroun"
    },
     ... }      

Code de réponse HTTP :

  • 200 OK : Liste des villes retournée avec succès
  • 400 Bad Request : Paramètre codeiso manquant ou invalide
  • 404 Not Found : Aucun pays ou aucune ville trouvée pour ce code ISO

GET /api/origin_fonds

permet d’obtenir la liste des origines des fonds disponibles pour un type de transfert donné, identifié par le type de sender et de beneficiare à deux lettres.

Paramètres de requête :

Requête :

Champs :

  • type_transaction : type de la transaction (string)
GET /api/origin_fonds?type_transaction=B2P
Réponse :
{
  "message": "Request successful",
  "status": "success",
  "data": ["Brother",
    "Mother",
    "Sister",
    "Self",
    "Father",
    "Spouse",
                ]
}      

Code de réponse HTTP :

  • 200 OK : Liste des villes retournée avec succès
  • 400 Bad Request : Paramètre type_transaction manquant ou invalide

GET /api/motifs

permet d’obtenir la liste des motifs disponibles pour un type de transfert donné, identifié par le type de sender et de beneficiare à deux lettres.

Paramètres de requête :

Requête :

Champs :

  • type_transaction : type de la transaction (string)
GET /api/motifs?type_transaction=B2P
Réponse :
{
  "message": "Request successful",
  "status": "success",
  "data": ["Brother",
    "Mother",
    "Sister",
    "Self",
    "Father",
    "Spouse",
                ]
}      

Code de réponse HTTP :

  • 200 OK : Liste des villes retournée avec succès
  • 400 Bad Request : Paramètre type_transaction manquant ou invalide

GET /api/relations

permet d’obtenir la liste des relations entre expediteurs et beneficiares disponibles pour un type de transfert donné, identifié par le type de sender et de beneficiare à deux lettres.

Paramètres de requête :

Requête :

Champs :

  • type_transaction : type de la transaction (string)
GET /api/relations?type_transaction=B2P
Réponse :
{
  "message": "Request successful",
  "status": "success",
  "data": ["Brother",
    "Mother",
    "Sister",
    "Self",
    "Father",
    "Spouse",
                ]
}      

Code de réponse HTTP :

  • 200 OK : Liste des villes retournée avec succès
  • 400 Bad Request : Paramètre type_transaction manquant ou invalide

GET /api/banks

Ce endpoint permet d’obtenir la liste des banques disponibles dans un pays donné, identifié par son code ISO.

Il est essentiel pour que l’utilisateur sélectionne la banque du bénéficiaire lors d’un transfert d’argent vers un compte bancaire.

Requête :
GET /api/banks?codeiso=CM
Réponse :
                {
  "message": "cities get successful",
  "status": "success",
  "data": [
    {
     "name": "BICEC",
      "country": "Cameroun"
    },
    {
      "name": "Société Générale Cameroun",
      "country": "Cameroun"
    },
    {
     "name": "UBA Cameroun",
      "country": "Cameroun"
    },
     ... }      

Codes de réponse HTTP :

  • 200 OK : Liste des banques retournée avec succès
  • 400 Bad Request : Paramètre codeiso manquant ou invalide
  • 404 Not Found : Aucune banque trouvée pour ce pays

GET /api/networks

Ce endpoint permet d’obtenir la liste des operateurs MOMO disponibles dans un pays donné, identifié par son code ISO.

Il est essentiel pour que l’utilisateur sélectionne l'operateur du bénéficiaire lors d’un transfert d’argent vers un compte MOMO.

Requête :
GET /api/networks?codeiso=CM
Réponse :
 {
  "message": "networks get successful",
  "status": "success",
  "data": [
    {
      "name": "MTN",
      "country": "Cameroun"
    },
    {
      "name": "Orange",
      "country": "Cameroun"
    }
  ]
}    

Codes de réponse HTTP :

  • 200 OK : Liste des operateurs retourné avec succès
  • 400 Bad Request : Paramètre codeiso manquant ou invalide
  • 404 Not Found : Aucune operateur trouvée pour ce pays

GET /api/senders

Ce endpoint permet de récupérer la liste des expéditeurs enregistrés sur la plateforme.

Il est utilisé pour afficher les informations des clients initiant des transferts d’argent, ou pour effectuer des opérations liées à la gestion de leurs transactions..

Requête :
GET /api/senders
Réponse :
{
  "message": "senders get successful",
  "status": "success",
  "data": [
    {
      "first_name": "kouamo",
      "last_name": "Dieudonne",
      "email": "info@agensic.com",
      "phone": "237675066919",
      "code": "25042521022068963666512",
      "occupation": "mecanicien",
      "civility": "Maried",
      "gender": "M",
      "document_type": "PP",
      "document_expired": "2025-05-10",
      "document_number": "5879454555"
    },
    {
      "first_name": "reine edith",
      "last_name": "jeanne d arc",
      "email": "contact@agensic.com",
      "phone": "687958",
      "code": "25042816714400768238381",
      "occupation": "mecanicien",
      "civility": "Single",
      "gender": "F",
      "document_type": "CNI",
      "document_expired": "2025-05-11",
      "document_number": "5879454555"
    },
    {
      "first_name": "John most",
      "last_name": "Yves",
      "email": "johm@gmail.com",
      "phone": "675066919",
      "code": "25050209346105716102273",
      "occupation": "Mecanicien",
      "civility": "Single",
      "gender": "M",
      "document_type": "PP",
      "document_expired": "2025-02-18",
      "document_number": "8957452144"
    },]}

Codes HTTP possibles :

  • 200 OK : Liste des expéditeurs retournée avec succès
  • 204 No Content : Aucun expéditeur ne correspond aux critères
  • 400 Bad Request : Paramètre invalide dans la requête
  • 401 Unauthorized : Jeton d’accès manquant ou invalide

POST /api/senders

Ce endpoint permet d’enregistrer un nouvel expéditeur sur la plateforme.

Les informations fournies sont utilisées pour authentifier l'utilisateur, l'associer à des transactions, et garantir la conformité réglementaire (KYC).

Corps JSON attendu :
{
  "account_type": "B",
  "business_name": "TechCorp SAS",
  "business_type": "SARL",
  "business_register_date": "2015-06-01",
  "email": "contact@techcorp.com",
  "date_birth": "1985-07-22",
  "num_document": "B987654321",
  "type_document": "id_card",
  "occupation": "CEO",
  "civility": "M",
  "gender": "M",
  "expired_document": "2031-05-30",
  "address": "45 avenue des Champs-Élysées",
  "country_code": "FR",
  "city": "Paris",
  "phone": "+33698765432"
}
Réponse :
{
  "message": "Sender created successfully",
  "status": "success",
  "data": {
    "account_type": "B",
    "business_name": "TechCorp SAS",
    "business_register_date": null,
    "business_type": "SARL",
    "first_name": null,
    "last_name": null,
    "email": "contact@techcorp.com",
    "phone": "+33698765432",
    "code": "25070908591851673500887",
    "occupation": "CEO",
    "civility": "M",
    "gender": "M",
    "document_type": "id_card",
    "document_expired": "2031-05-30",
    "document_number": "B987654321"
  }
}

Codes de réponse possibles :

  • 201 Created : Expéditeur créé avec succès
  • 400 Bad Request : Données invalides ou manquantes
  • 409 Conflict : Expéditeur avec ce numéro/email déjà existant
  • 500 Internal Server Error : Erreur serveur lors de l’enregistrement

GET /api/beneficiaries

Ce endpoint permet de récupérer la liste des bénéficiaires enregistrés pour un expéditeur spécifique.

Il est couramment utilisé pour préremplir les informations lors d’un envoi d’argent ou gérer les contacts favoris d’un utilisateur.

Requête :
GET /api/beneficiaries
Réponse :
{
  "message": "senders get successful",
  "status": "success",
  "data": [
    {
      "first_name": "emanuel kamao",
      "last_name": "fumba",
      "email": "contact@guens-education.com",
      "phone": "23796854415",
      "code": "25042553551393640666986",
      "occupation": "",
      "civility": "Maried",
      "gender": "M",
      "document_type": "PP",
      "document_expired": "2025-05-11",
      "document_number": "5879454555"
    },..
  ]
}

Codes de réponse HTTP :

  • 200 OK : Liste retournée avec succès
  • 204 No Content : Aucun bénéficiaire trouvé
  • 400 Bad Request : Paramètre manquant ou invalide
  • 404 Not Found : Endpoint non trouvé

POST /api/beneficiaries

Ce endpoint permet d’enregistrer un nouveau bénéficiaire vers lequel un expéditeur pourra envoyer de l’argent.

Le bénéficiaire peut être lié à un compte bancaire, un portefeuille mobile ou un point de retrait..

Corps JSON attendu :
{
  "account_type": "P",
  "first_name": "Alice",
  "last_name": "Kouassi",
  "email": "alice.kouassiu@example.com",
  "date_birth": "1992-08-25",
  "num_document": "CI123456789",
  "type_document": "passport",
  "occupation": "Comptable",
  "civility": "Single",
  "gender": "F",
  "expired_document": "2032-08-25",
  "address": "Boulevard Valéry Giscard d’Estaing",
  "country_code": "CI",
  "city": "Abidjan",
  "phone": "+2250700123456"
}
Réponse :
{
  "message": "Beneficiary created successfully",
  "status": "success",
  "data": {
    "account_type": "P",
    "business_name": null,
    "business_type": null,
    "first_name": "Alice",
    "last_name": "Kouassi",
    "email": "alice.kouassiu@example.com",
    "phone": "+2250700123456",
    "code": "25070932393437450612644",
    "occupation": "Comptable",
    "civility": "F",
    "gender": "F",
    "document_type": "passport",
    "document_expired": "2032-08-25",
    "document_number": "CI123456789"
  }
}
    

Codes de réponse HTTP :

  • 201 Created : Bénéficiaire créé avec succès
  • 400 Bad Request : Données manquantes ou format invalide
  • 404 Not Found : Expéditeur non trouvé
  • 409 Conflict : Bénéficiaire déjà existant pour ce numéro ou ce compte
  • 500 Internal Server Error : Erreur serveur

GET /api/transactions

Ce endpoint permet de récupérer la liste des transactions effectuées par un expéditeur.

Il prend en charge des filtres pour rechercher par statut, type, date ou bénéficiaire, facilitant ainsi le suivi des envois d’argent.

Paramètres de requête (query) :

        | Paramètre        | Type   | Description                                                                    |
        | ---------------- | ------ | ------------------------------------------------------------------------------ |
        | `sender_id`      | string | (obligatoire) Identifiant de l’expéditeur                                      |
        | `status`         | string | (optionnel) Filtrer par statut (`pending`, `completed`, `failed`, `cancelled`) |
        | `type`           | string | (optionnel) Type de transaction (`bank`, `mobile_money`, `cash_pickup`)        |
        | `start_date`     | string | (optionnel) Date de début au format `YYYY-MM-DD`                               |
        | `end_date`       | string | (optionnel) Date de fin au format `YYYY-MM-DD`                                 |
        | `beneficiary_id` | string | (optionnel) Filtrer les transactions envoyées à un bénéficiaire spécifique     |
        
Requête :
GET /api/transactions
Réponse :
{
  "message": "senders get successful",
  "status": "success",
  "data": [
    {
      "first_name": "emanuel kamao",
      "last_name": "fumba",
      "email": "contact@guens-education.com",
      "phone": "23796854415",
      "code": "25042553551393640666986",
      "occupation": "",
      "civility": "Maried",
      "gender": "M",
      "document_type": "PP",
      "document_expired": "2025-05-11",
      "document_number": "5879454555"
    },..
  ]
}

POST /api/transactions/bank

Ce endpoint permet de créer une transaction bancaire en transférant des fonds d’un expéditeur vers un bénéficiaire disposant d’un compte bancaire.

Il vérifie les informations du client, le solde, applique les frais, et génère une référence de transaction.

Corps JSON attendu :
{
  "country_code": "CI",
  "gateway": "BankGatewayCI",
  "bank": "ECOBANK",
  "sender_code": "25070908591851673500887",
  "beneficiary_code": "25070943938506074307835",
  "city": "Abidjan",
  "amount": 100000,
  "raison_transaction": "Advanced Goods Payments",
  "origin_fond": "Salary",
  "relation": "Mother",
  "accountNumber": "CI11001234567890123456",
  "iban": "CI11001234567890123456",
  "callback_url": "https://votre-api.com/retour/transaction"
}

Remplacer iban par :

Réponse :
{
  "message": "Transaction created successfully",
  "status": "success",
  "data": {
    "transaction_status": "Pending",
    "transaction_id": "25070934967500637436125",
    "fees": 12000,
    "amount": 141.8
  }
}

Champs de réponse :

Codes de réponse HTTP :

POST /api/transactions/mobil

Ce endpoint permet de créer une transaction Mobile en transférant des fonds d’un expéditeur vers un bénéficiaire disposant d’un compte mobil money.

Il vérifie les informations du client, le solde, applique les frais, et génère une référence de transaction.

Corps JSON attendu :
{"country_code":"CM",
"gateway":"OM",
"sender_code":"25042521022068963666512",
"beneficiary_code":"25042553551393640666986",
"city":"Paris",
"amount":"80000",
"raison_transaction":"Business Profits to Parents",
"origin_fond":"Donation",
"relation":"Brother",
"accountNumber":"237675066919",
"callback_url":"https://xxxx/webhook"
}
Réponse :
{
  "message": "transaction created successful",
  "status": "success",
  "data": {
    "transaction_id": "25050816264901015287708",
    "fees": 3600,
    "amount": 1000
  }
}

Champs de réponse :

Codes de réponse HTTP :

GET /api/transactions/status/:transaction_id

Ce endpoint permet de récupérer le statut actuel d’une transaction donnée à l’aide de son identifiant unique.

Il est utile pour les utilisateurs finaux ou les agents afin de suivre l’évolution d’un envoi (bancaire, mobile ou en espèces).

Paramètres de requête (query) :

*transaction_id (obligatoire) : L’identifiant unique de la transaction à suivre.
        
Requête :
GET /api/transactions/status/25050816264901015287708
Réponse :
{
  "message": "transaction successful",
  "status": "success",
  "data": {
    "transaction_id": "25050816264901015287708",
    "status": "success",
    "relation": "Brother",
    "origin_fond": "Donation",
    "motif_send": "Business Profits to Parents",
    "amount_send": 1000,
    "country": "FRANCE",
    "currency": "EUR",
    "amount_debit": 83600,
    "bank": "BANQUE POPULAIRE VAL DE FRANCE",
    "accountNumber": "011623852957",
    "sender": {
      "first_name": "kouamo",
      "last_name": "Dieudonne",
      "email": "info@agensic.com",
      "phone": "237675066919",
      "code": "25042521022068963666512",
      "occupation": "mecanicien",
      "civility": "Maried",
      "gender": "M",
      "document_type": "PP",
      "document_expired": "2025-05-10",
      "document_number": "5879454555"
    },
    "beneficiary": {
      "first_name": "emanuel kamao",
      "last_name": "fumba",
      "email": "contact@guens-education.com",
      "phone": "23796854415",
      "code": "25042553551393640666986",
      "occupation": "",
      "civility": "Maried",
      "gender": "M",
      "document_type": "PP",
      "document_expired": "2025-05-11",
      "document_number": "5879454555"
    }
  }
}

Codes de réponse HTTP :

  • 200 OK : Statut retourné avec succès
  • 404 Not Found : Aucune transaction trouvée avec cet identifiant
  • 400 Bad Request : Identifiant mal formé ou invalide
  • 500 Internal Server Error : Erreur inattendue du serveur