DÉVELOPPEURS

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 + HMAC

Pour 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 Token

Pour les routes /merchant/* (dashboard, analytics, webhooks). Utilisez le token obtenu via POST /auth/login.

Cash In — Initier une collecte
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éphone
POST /api/v1/collections → HTTP 201

Tokens d'accès

POST
/v1/token

Token unifié (portée : collecte + distribution)

Basic
POST
/v1/collection/token

Token restreint à la collecte

Basic
POST
/v1/distribution/token

Token restreint à la distribution

Basic
POST
/v1/credentials/token

Renouveler api_token seul

Basic
POST
/v1/credentials/secret

Renouveler api_secret seul

Basic

Cash In (Collecte)

POST
/v1/collections

Initier un paiement entrant

Token+HMAC
GET
/v1/collections/:uuid

Statut par UUID

Token
GET
/v1/collections/status/:ref

Statut par référence marchand

Token

Cash Out (Distribution)

POST
/v1/distributions

Initier un versement sortant

Token+HMAC
GET
/v1/distributions/:uuid

Statut par UUID

Token
GET
/v1/distributions/status/:ref

Statut par référence marchand

Token

Transverses (toutes portées)

GET
/v1/balances

Soldes virtuels par opérateur

Token
GET
/v1/transactions

Liste paginée des transactions

Token
POST
/v1/sms

Envoyer un SMS transactionnel

Token+HMAC

API v2 — Product Token

POST
/v2/collections

Collecte limitée à un produit

X-Product-Token
POST
/v2/distributions

Distribution limitée à un produit

X-Product-Token
GET
/v2/transactions

Transactions du produit

X-Product-Token
GET
/v2/balances

Soldes du produit

X-Product-Token
POST
/v2/sms

Envoyer un SMS

X-Product-Token

Portail Marchand

GET
/merchant/transactions

Liste paginée + filtres

Bearer
GET
/merchant/balances

Soldes par opérateur

Bearer
GET
/merchant/dashboard

Stats aujourd'hui & ce mois

Bearer
GET
/merchant/analytics

Analytics par période

Bearer
GET
/merchant/operators

Opérateurs disponibles

Bearer
POST
/merchant/credentials

Générer api_token + api_secret (seule route qui renvoie les deux)

Bearer
POST
/merchant/products/:uuid/public-token

Régénérer le product token (API v2)

Bearer
POST
/merchant/webhooks

Créer un webhook

Bearer
POST
/merchant/sms/send

Envoyer un SMS depuis le portail

Bearer
POST
/merchant/sms/sender-ids

Demander un Sender ID (soumis à approbation)

Bearer

Public

GET
/public_operators

Opérateurs actifs (sans auth)

Aucune
GET
/v3/product/:uuid

Infos produit — seule route acceptant ?api_token= en query

api_token
CYCLE DE VIE

Statuts d'une transaction

pending

En attente de confirmation du client sur son téléphone

processing

Confirmation reçue, virement en cours

success

Fonds reçus — votre solde est crédité

failed

Échouée (refus client, timeout, solde insuffisant)

expired

Délai dépassé sans confirmation

Polling : GET /v1/collections/:uuid toutes les 3–5s · ou utilisez les webhooks
FLUX DE PAIEMENT

Cash In & Cash Out

Cash In — Collecte

Le client paie depuis son Mobile Money

POST /v1/collections
product_idUUID de votre produit (obligatoire)
operator_codeMTN_CG | ORANGE_SN
amountMontant en unités monétaires
phone_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/distributions
product_idUUID de votre produit (obligatoire)
operator_codeMTN_CG | ORANGE_SN
amountMontant à verser
phone_numberNuméro du bénéficiaire
merchant_referenceVotre référence interne
recipient_nameNom du bénéficiaire (optionnel)
descriptionMotif du versement
metadataDonnées libres JSON
WEBHOOKS

Notifications 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.success
collection.failed
collection.expired
distribution.success
distribution.failed
balance.low

1. 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.

SDK CHECKOUT

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.

index.html
<!-- 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>
Aucune dépendance · Vanilla JS

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.

DÉMARRAGE RAPIDE

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.