Documentation de l'API

Bac à sable · Dernière mise à jour : 2 novembre 2026

Le bac à sable est branché sur le serveur de test e-MECeF de la DGI. Les factures qu'il produit sont des factures de test : elles n'ont aucune valeur fiscale.

Avant de commencer

Il vous faut deux choses :

Adresse et clé

Adresse du bac à sablehttps://sandbox.otampa.com
AuthentificationEn-tête Authorization: Bearer tk_… sur chaque appel
FormatJSON en UTF-8. Montants en FCFA, entiers, TTC.
Référence interactivesandbox.otampa.com/docs (schémas complets, essai depuis le navigateur)

Dans les exemples, la clé est lue dans la variable d'environnement TAMPA_API_KEY : définissez-la dans votre terminal plutôt que de coller la clé dans vos commandes.

Un compte Tampa peut gérer plusieurs entreprises, chacune avec son IFU et son jeton. Une entreprise n'est visible que par le compte qui l'a ajoutée.

1. Ajouter une entreprise

Enregistrez une fois chaque entreprise qui facture. Tampa vérifie le jeton auprès de la DGI et contrôle qu'il correspond bien à l'IFU.

curl -X POST https://sandbox.otampa.com/taxpayers \
  -H "Authorization: Bearer $TAMPA_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{
    "ifu": "0000000000000",
    "name": "Boutique Exemple",
    "emecef_token": "JETON_E_MECEF_DE_TEST",
    "address": "Rue 123, Cotonou",
    "city": "Cotonou",
    "phone": "+229 01 00 00 00 00",
    "email": "contact@boutique-exemple.bj"
  }'

Réponse 201 : notez l'id, il sert à facturer pour cette entreprise.

{
  "id": "3f1c2a8e-…",
  "ifu": "0000000000000",
  "name": "Boutique Exemple",
  "nim": "TS01…",
  "token_valid_until": "2027-…",
  …
}

Seuls ifu (13 chiffres), name et emecef_token sont obligatoires. Les coordonnées apparaissent sur le PDF.

2. Certifier une facture

Tampa transmet la facture à la DGI, vérifie le total calculé par la DGI, puis confirme. La réponse arrive quand la facture est certifiée (quelques secondes).

curl -X POST https://sandbox.otampa.com/invoices \
  -H "Authorization: Bearer $TAMPA_API_KEY" \
  -H "Idempotency-Key: commande-0001" \
  -H "Content-Type: application/json" \
  -d '{
    "taxpayer_id": "3f1c2a8e-…",
    "invoice": {
      "type": "FV",
      "operator": { "name": "Caisse 1" },
      "client": { "name": "Client Exemple", "contact": "+229 01 00 00 00 01" },
      "items": [
        { "name": "Sac de riz 25 kg", "price": 11800, "quantity": 2, "taxGroup": "B" },
        { "name": "Livraison", "price": 1000, "quantity": 1, "taxGroup": "B" }
      ],
      "payment": [ { "name": "MOBILEMONEY", "amount": 24600 } ]
    }
  }'

Réponse 201 (extrait) :

{
  "id": "9b0d…",
  "status": "certified",
  "totals": { "uid": "…", "total": 24600, … },
  "security": {
    "code_mecef_dgi": "TEST-XXXX-XXXX-XXXX-XXXX-XXXX",
    "counters": "…",
    "nim": "TS01…",
    "date_time": "…",
    "qr_code": "F;TS01…"
  },
  "pdf_url": "/invoices/9b0d…/pdf"
}

La clé d'idempotence

L'en-tête Idempotency-Key est obligatoire : une valeur unique par facture, par exemple votre numéro de commande. Si la connexion coupe, renvoyez la même requête avec la même clé : Tampa renvoie la facture déjà certifiée (code 200) au lieu d'en créer une deuxième.

Les champs de la facture

ChampObligatoireContenu
typeouiFV, EV, FA ou EA (voir plus bas)
itemsouiAu moins une ligne : name, price (prix unitaire TTC), quantity, taxGroup. Facultatifs : code, taxSpecific, originalPrice, priceModification.
operatorouiname du vendeur ou de la caisse, id facultatif
clientnonifu, name, contact, address
paymentnonListe de { "name": "…", "amount": … }
aibnonA (1 %) ou B (5 %)
referencepour un avoirCode MECeF/DGI (24 caractères) de la facture d'origine

L'IFU du vendeur n'est pas à envoyer : Tampa le prend dans l'entreprise désignée par taxpayer_id.

3. Récupérer le PDF

curl https://sandbox.otampa.com/invoices/9b0d…/pdf \
  -H "Authorization: Bearer $TAMPA_API_KEY" \
  -o facture.pdf

Le PDF reprend les lignes, les totaux par groupe de taxe, le code MECeF/DGI, les compteurs et le QR code. Il est généré à la demande pour une facture certifiée.

Toutes les routes

Méthode et cheminRôle
POST /taxpayersAjouter une entreprise (jeton vérifié auprès de la DGI)
GET /taxpayersLister vos entreprises
GET /taxpayers/{id}Lire une entreprise
PATCH /taxpayers/{id}Modifier ses coordonnées
PUT /taxpayers/{id}/tokenRemplacer son jeton e-MECeF (expiré ou renouvelé)
DELETE /taxpayers/{id}Supprimer une entreprise sans facture
POST /invoicesCertifier une facture
GET /invoicesLister vos factures (taxpayer_id, limit jusqu'à 100, offset)
GET /invoices/{id}Lire une facture
GET /invoices/{id}/pdfTélécharger le PDF
GET /healthÉtat du service (sans clé)

Codes DGI

Types de facture

FVFacture de vente
EVFacture de vente à l'exportation
FAFacture d'avoir (avec reference)
EAFacture d'avoir à l'exportation (avec reference)

Groupes de taxe (taxGroup)

AExonéré
BTaxable (TVA 18 %)
CExportation de produits taxables
DTVA régime d'exception
ERégime fiscal TPS
FRéservé

Le choix du groupe dépend de la situation fiscale du vendeur et du produit : en cas de doute, demandez à son comptable.

Moyens de paiement (payment[].name)

ESPECES, VIREMENT, CARTEBANCAIRE, MOBILEMONEY, CHEQUES, CREDIT, AUTRE.

Erreurs

Chaque erreur renvoie un detail en français et un request_id. Citez ce request_id si vous écrivez au support.

{ "detail": "Clé API invalide ou révoquée.", "request_id": "…" }
CodeSignificationQue faire
400En-tête Idempotency-Key absentL'ajouter (1 à 255 caractères)
401Clé API absente, invalide ou révoquéeVérifier l'en-tête Authorization
404Entreprise ou facture introuvable pour votre compteVérifier l'identifiant
409Entreprise déjà enregistrée, certification en cours, ou facture non certifiée (PDF)Lire le detail ; pour « en cours », réessayer avec la même clé
422Données invalides, facture refusée par la DGI (detail.code et detail.description), jeton refusé, totaux divergents, ou clé d'idempotence déjà utilisée pour une autre factureCorriger la demande ; pour un jeton refusé, utiliser PUT /taxpayers/{id}/token
502Confirmation incertaine : la DGI a peut-être enregistré la factureVérifier sur le portail e-MECeF avant de refaire la facture avec une nouvelle clé
503DGI injoignableRéessayer plus tard avec la même clé d'idempotence

Besoin d'aide ?

Question technique, clé API ou démonstration : contact@otampa.com. L'utilisation du bac à sable est soumise aux conditions d'utilisation.