Intégrez Mobile Money en 30 minutes
Une API REST simple avec authentification HMAC-SHA256, webhooks temps réel et SDKs pour Node.js, Python, PHP et plus. Sandbox inclus.
REST
Architecture API
HMAC
Signature SHA-256
< 3s
Latence médiane
99.97%
Uptime garanti
AUTHENTIFICATION
API v1 — X-API-Token + X-Signature
Token + HMACPour les routes /v1/* (collections, distributions). Chaque POST doit inclure X-API-Token et X-Signature = HMAC-SHA256(body, api_token).
Portail Marchand — Bearer Token
Bearer TokenPour les routes /merchant/* (dashboard, analytics, webhooks). Utilisez le token obtenu via POST /auth/login.
const crypto = require('crypto');
const fetch = require('node-fetch'); // ou fetch natif Node 18+
// api_token authentifie l'appelant, api_secret signe le corps.
const API_TOKEN = process.env.TAMO_API_TOKEN; // Depuis votre dashboard
const API_SECRET = process.env.TAMO_API_SECRET; // Ne quitte jamais votre serveur
const BASE_URL = 'https://tamoapi.tasa.pro/api';
async function initierCollecte(payload) {
const body = JSON.stringify(payload);
// Signature obligatoire sur chaque écriture :
// HMAC-SHA256("timestamp\nnonce\ncorps", api_secret)
const timestamp = Math.floor(Date.now() / 1000).toString();
const nonce = crypto.randomBytes(16).toString('hex');
const signature = crypto
.createHmac('sha256', API_SECRET)
.update(`${timestamp}\n${nonce}\n${body}`)
.digest('hex');
const res = await fetch(`${BASE_URL}/v1/collections`, {
method: 'POST',
headers: {
'Content-Type': 'application/json',
'Accept': 'application/json',
'X-API-Token': API_TOKEN,
'X-Signature': signature,
'X-Timestamp': timestamp,
'X-Nonce': nonce,
// Rejouez la même clé pour retenter sans doubler le paiement
'Idempotency-Key': payload.merchant_reference,
},
body,
});
if (!res.ok) {
const err = await res.json();
throw new Error(err.message);
}
return res.json();
}
// Exemple d'appel
const result = await initierCollecte({
product_id: 'uuid-de-votre-produit',
operator_code: 'MTN_CG', // MTN_CG | ORANGE_SN
amount: 10000, // En unités monétaires
phone_number: '+242068409872', // Format international
merchant_reference: 'CMD-2026-001234', // Votre référence interne
description: 'Paiement commande #1234',
metadata: { order_id: '1234', customer: 'Jean Dupont' },
});
console.log(result.data.reference); // "TAMO-CG-20260608-XXXXXX"
console.log(result.data.status); // "pending"
// → Le client reçoit une notification Mobile Money sur son téléphoneTokens d'accès
/v1/tokenToken unifié (portée : collecte + distribution)
Basic/v1/collection/tokenToken restreint à la collecte
Basic/v1/distribution/tokenToken restreint à la distribution
Basic/v1/credentials/tokenRenouveler api_token seul
Basic/v1/credentials/secretRenouveler api_secret seul
BasicCash In (Collecte)
/v1/collectionsInitier un paiement entrant
Token+HMAC/v1/collections/:uuidStatut par UUID
Token/v1/collections/status/:refStatut par référence marchand
TokenCash Out (Distribution)
/v1/distributionsInitier un versement sortant
Token+HMAC/v1/distributions/:uuidStatut par UUID
Token/v1/distributions/status/:refStatut par référence marchand
TokenTransverses (toutes portées)
/v1/balancesSoldes virtuels par opérateur
Token/v1/transactionsListe paginée des transactions
Token/v1/smsEnvoyer un SMS transactionnel
Token+HMACAPI v2 — Product Token
/v2/collectionsCollecte limitée à un produit
X-Product-Token/v2/distributionsDistribution limitée à un produit
X-Product-Token/v2/transactionsTransactions du produit
X-Product-Token/v2/balancesSoldes du produit
X-Product-Token/v2/smsEnvoyer un SMS
X-Product-TokenPortail Marchand
/merchant/transactionsListe paginée + filtres
Bearer/merchant/balancesSoldes par opérateur
Bearer/merchant/dashboardStats aujourd'hui & ce mois
Bearer/merchant/analyticsAnalytics par période
Bearer/merchant/operatorsOpérateurs disponibles
Bearer/merchant/credentialsGénérer api_token + api_secret (seule route qui renvoie les deux)
Bearer/merchant/products/:uuid/public-tokenRégénérer le product token (API v2)
Bearer/merchant/webhooksCréer un webhook
Bearer/merchant/sms/sendEnvoyer un SMS depuis le portail
Bearer/merchant/sms/sender-idsDemander un Sender ID (soumis à approbation)
BearerPublic
/public_operatorsOpérateurs actifs (sans auth)
Aucune/v3/product/:uuidInfos produit — seule route acceptant ?api_token= en query
api_tokenStatuts d'une transaction
En attente de confirmation du client sur son téléphone
Confirmation reçue, virement en cours
Fonds reçus — votre solde est crédité
Échouée (refus client, timeout, solde insuffisant)
Délai dépassé sans confirmation
Cash In & Cash Out
Cash In — Collecte
Le client paie depuis son Mobile Money
POST /v1/collectionsproduct_idUUID de votre produit (obligatoire)operator_codeMTN_CG | ORANGE_SNamountMontant en unités monétairesphone_numberNuméro du payeur (format international)merchant_referenceVotre référence interne (idempotence)payer_nameNom du payeur (optionnel)descriptionDescription pour le relevémetadataDonnées libres JSON (max 255 chars)Cash Out — Distribution
Vous versez sur le Mobile Money du bénéficiaire
POST /v1/distributionsproduct_idUUID de votre produit (obligatoire)operator_codeMTN_CG | ORANGE_SNamountMontant à verserphone_numberNuméro du bénéficiairemerchant_referenceVotre référence internerecipient_nameNom du bénéficiaire (optionnel)descriptionMotif du versementmetadataDonnées libres JSONNotifications temps réel
Plutôt que de poller le statut, configurez un webhook : TamoAPI appellera votre endpoint dès qu'une transaction change de statut.
collection.successcollection.failedcollection.expireddistribution.successdistribution.failedbalance.low1. Créez le webhook
Dashboard → Paramètres → Webhooks → Ajouter. Copiez le webhook_secret (affiché une seule fois).
2. Recevez l'événement
TamoAPI POST votre endpoint avec le payload JSON signé (X-Tamo-Signature).
3. Vérifiez la signature
HMAC-SHA256(body, webhook_secret) doit correspondre à X-Tamo-Signature.
4. Traitez & répondez
Répondez HTTP 200 rapidement. TamoAPI retente 3× en cas d'échec.
Portail de paiement en 2 lignes
Intégrez un popup de paiement Tamo branded dans n'importe quel site. Vos clients choisissent leur opérateur et paient sans quitter votre page.
<!-- 1. Charger le SDK (1 ligne) -->
<script src="https://pay.tamoapi.tasa.pro/sdk/tamo.js">
</script>
<!-- 2. Votre bouton de paiement -->
<button onclick="payer()">Payer 5 000 FCFA</button>
<script>
function payer() {
TamoCheckout.open({
publicKey: 'votre_api_token', // Clés API → api_token
productId: 'uuid-produit-actif', // Dashboard → Produits → UUID
amount: 5000,
currency: 'XAF',
merchant: 'Boutique Awa',
reference: 'CMD-2026-001',
description: 'Commande #1234',
onSuccess: function(data) {
// Paiement confirmé côté Mobile Money
console.log('Référence :', data.reference);
window.location.href = '/merci';
},
onClose: function() {
console.log('Client a fermé le popup');
},
});
}
</script>Popup Tamo s'ouvre
Le client voit un formulaire Tamo branded avec la liste des opérateurs disponibles et saisit son numéro.
Confirmation Mobile Money
L'opérateur envoie une notification push sur le téléphone du client. Il confirme avec son code PIN.
onSuccess() appelé
Le popup se ferme automatiquement et votre callback reçoit la référence de transaction. Vous redirigez ou mettez à jour votre UI.
Ou utilisez un Payment Link
Pas de site ? Générez un lien depuis votre dashboard et partagez-le par WhatsApp ou SMS.
Prêt en 30 minutes
01
Créez un compte
Inscription en ligne, soumission KYC, validation par l'équipe TASA sous 24h.
02
Générez vos clés
Dashboard → Clés API → Générer. Copiez api_token + api_secret (affiché une seule fois).
03
Signez vos requêtes
HMAC-SHA256(body_json, api_token) → header X-Signature sur chaque POST.
04
Go Live
Créez un produit, associez un opérateur, initiez vos transactions en production.