Intégrez les paiements Mobile Money FrikPay dans votre application : créez votre application marchande, testez en sandbox sans aucune démarche préalable, puis passez en production une fois votre KYC approuvé.
Le sandbox fonctionne immédiatement après la création de votre application marchande — pas besoin d'attendre la validation KYC. La production exige en revanche que le KYC de votre compte marchand soit approuvé. Le même code fonctionne dans les deux environnements : seule la paire de clés API change.
Cette API est en tout début de vie. Voici précisément ce qu'elle sait faire aujourd'hui — et ce qu'elle ne sait pas encore faire. Merci d'en tenir compte avant d'intégrer.
Seul le Franc CFA (XOF) est accepté. Toute autre devise est refusée par l'API.
Seul MTN Mobile Money (Bénin) est actif. Moov Money et Kkiapay ne sont pas activés sur cette plateforme.
country_code ne peut être que BJ pour le moment.
Utilisez le polling sur GET /api/v1/payments/{reference} en attendant. Détails plus bas.
Ces limites reflètent l'état réel du système en production aujourd'hui,
pas une restriction arbitraire de cette documentation. Toute tentative
de paiement avec une devise, un réseau ou un pays non supporté sera
refusée par l'API (le plus souvent avec le message
Aucune route de paiement disponible. ou
Réseau introuvable pour le numéro fourni.).
Rendez-vous sur le portail marchand FrikPay et créez votre compte, puis une application (menu Applications). Une application représente un projet / intégration : vous pouvez en avoir plusieurs.
Cette étape ne nécessite aucun document KYC.
Dans votre application, ouvrez Clés API et générez une paire de clés sandbox :
X-FRIKLABEL-PUBLIC-KEY: pk_test_xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
X-FRIKLABEL-SECRET-KEY: sk_test_xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
La secret_key ne s'affiche qu'une seule
fois à la génération — stockez-la immédiatement dans un
endroit sûr (gestionnaire de secrets, variables d'environnement).
Ne la commitez jamais dans votre code.
Contrairement à la production, générer et utiliser des clés sandbox ne nécessite pas que votre compte marchand ait terminé sa vérification KYC. Vous pouvez tester votre intégration dès aujourd'hui.
Appelez POST /api/v1/payments avec vos clés sandbox.
En sandbox, aucun opérateur réel n'est appelé :
le paiement est simulé à partir du numéro de téléphone envoyé
dans customer_phone.
curl -X POST https://api.frikpay.digital/api/v1/payments \
-H "Content-Type: application/json" \
-H "X-FRIKLABEL-PUBLIC-KEY: pk_test_xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx" \
-H "X-FRIKLABEL-SECRET-KEY: sk_test_xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx" \
-d '{
"merchant_reference": "CMD-TEST-0001",
"amount": 1500,
"currency": "XOF",
"customer_phone": "22961000001"
}'
Le résultat d'un paiement sandbox (succès, échec, etc.) dépend
d'un numéro de téléphone de test préconfiguré côté FrikPay pour
country_code = BJ, currency = XOF et
payment_method = mobile_money — un numéro qui
n'est pas préconfiguré renvoie l'erreur
Numéro de test sandbox non configuré. Demandez la
liste à jour des numéros de test (et du scénario associé —
succès, échec, etc.) à l'équipe FrikPay ou consultez la section
correspondante du portail marchand ; elle n'est pas reproduite
ici car elle peut évoluer sans changer cette API.
Réponse typique (simulation réussie) :
{
"success": true,
"message": "Paiement sandbox simulé.",
"data": {
"success": true,
"simulation_status": "success",
"reference_id": "FRIK-20260821143012-A1B2C3D4",
"merchant_reference": "CMD-TEST-0001",
"status": "success",
"network": "mtn",
"amount": 1500,
"fee_bearer": "beneficiary",
"fee_amount": 22.5,
"customer_debited_amount": 1522.5,
"beneficiary_net_amount": 1500,
"currency": "XOF",
"sandbox": true,
"message": "Paiement sandbox simulé."
}
}
Conservez data.reference_id : c'est l'identifiant à
utiliser à l'étape suivante.
curl https://api.frikpay.digital/api/v1/payments/FRIK-20260821143012-A1B2C3D4 \
-H "X-FRIKLABEL-PUBLIC-KEY: pk_test_xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx" \
-H "X-FRIKLABEL-SECRET-KEY: sk_test_xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx"
En production, un paiement passe par
pending (demande envoyée au client) avant d'atteindre
un statut terminal (success ou failed)
une fois que le client a validé — ou non — l'opération sur son
téléphone. Interrogez cet endpoint (toutes les 3 à 5 secondes
pendant 1 à 2 minutes, par exemple) jusqu'à statut terminal ; ne
vous fiez pas au seul appel de création pour connaître l'issue
réelle du paiement.
Une fois le KYC de votre compte marchand approuvé,
générez une paire de clés
production
(pk_live_... / sk_live_...) depuis le
portail marchand, dans la même section Clés API.
Votre intégration n'a rien d'autre à changer :
même URL (https://api.frikpay.digital), même format
de requête/réponse. Seule la paire de clés utilisée détermine
l'environnement réellement exécuté.
Tant que kyc_status de votre compte marchand n'est
pas approved, tout appel authentifié avec une clé
de production échoue avec HTTP 401 et le
message KYC marchand non validé pour la production.
Chaque requête doit inclure deux en-têtes HTTP. Il n'y a pas d'OAuth, pas de jeton porteur (bearer token) : uniquement une paire de clés.
| En-tête | Obligatoire | Description |
|---|---|---|
X-FRIKLABEL-PUBLIC-KEY | Oui | Clé publique de l'application (pk_test_... ou pk_live_...) |
X-FRIKLABEL-SECRET-KEY | Oui | Clé secrète associée (sk_test_... ou sk_live_...) |
X-FRIKLABEL-ENVIRONMENT | Non | sandbox ou production — cas particuliers uniquement ; l'environnement est normalement déjà déterminé par le type de clé utilisée |
Les clés API se génèrent exclusivement depuis le portail marchand (Applications → Clés API) ; il n'existe pas d'endpoint public pour créer des clés par API — cette action nécessite une session authentifiée sur le portail.
L'API répond toujours en JSON avec success: false et un
message en français lisible. Il n'y a
pas de champ code machine-lisible
aujourd'hui — distinguez les cas via le code HTTP, et au besoin le
texte du message. Voici les messages observés dans le code, avec leur
code HTTP réel :
| HTTP | Message | Cause |
|---|---|---|
| 401 | Clés API manquantes. | En-têtes X-FRIKLABEL-PUBLIC-KEY / X-FRIKLABEL-SECRET-KEY absents ou vides |
| 401 | Environnement API invalide. | X-FRIKLABEL-ENVIRONMENT fourni avec une valeur autre que sandbox/production |
| 401 | Clé API invalide. | Clé publique inconnue |
| 401 | Clé API inactive ou révoquée. | Clé désactivée côté portail |
| 401 | Clé API expirée. | Date d'expiration dépassée |
| 401 | Clé API non autorisée pour cet environnement. | X-FRIKLABEL-ENVIRONMENT demandé ne correspond pas à l'environnement réel de la clé |
| 401 | Secret API invalide. | Clé secrète incorrecte pour cette clé publique |
| 401 | Application marchand introuvable. | Application associée à la clé introuvable |
| 401 | Application marchande inactive ou non autorisée. | Application désactivée |
| 401 | Marchand inactif ou non autorisé. | Compte marchand désactivé |
| 401 | KYC marchand non validé pour la production. | Clé de production utilisée alors que kyc_status ≠ approved |
POST /api/v1/payments| HTTP | Message | Cause |
|---|---|---|
| 400 | Payload JSON invalide. | Corps de requête absent ou JSON mal formé |
| 405 | Méthode non autorisée. | Méthode HTTP autre que POST |
| 422 | {champ} est obligatoire. | merchant_reference, amount, currency ou customer_phone manquant/vide |
| 422 | amount doit être supérieur à zéro. | amount ≤ 0 ou non numérique |
| 422 | Wallet marchand bénéficiaire introuvable ou inactif. | Compte marchand mal configuré côté FrikPay (rare — contactez le support) |
| 422 | Numéro de test sandbox non configuré. | Sandbox uniquement : customer_phone ne correspond à aucun scénario de test actif |
| 422 | Réseau introuvable pour le numéro fourni. | Le numéro ne correspond à aucun préfixe MTN Bénin reconnu |
| 422 | Aucune route de paiement disponible. | Combinaison pays/devise/réseau/méthode non supportée (ex. autre chose que XOF + BJ + MTN + mobile_money) |
| 422 | Tarification introuvable pour cette collection. | Aucune règle tarifaire configurée pour ce montant/cette route |
200 (success:false) | Requête déjà traitée. | Rejeu d'une merchant_reference déjà utilisée — la transaction d'origine est renvoyée dans errors, voir la référence API |
| 502 | Tous les prestataires de paiement ont échoué. | Production uniquement : le prestataire (MTN) a rejeté la tentative |
GET /api/v1/payments/{reference}| HTTP | Message | Cause |
|---|---|---|
| 404 | Transaction introuvable. | Référence inexistante, ou appartenant à un autre marchand |
| 405 | Méthode non autorisée. | Méthode HTTP autre que GET |
Les webhooks de notification de paiement ne sont pas encore prêts pour la production. En l'état actuel, les nouvelles clés API générées ne reçoivent pas de secret de signature de webhook correctement configuré côté serveur, ce qui empêche de vérifier de façon fiable l'authenticité des notifications envoyées.
En attendant : utilisez le polling sur
GET /api/v1/payments/{reference}
pour connaître le statut définitif d'un paiement. C'est la méthode
recommandée et fiable aujourd'hui.