Référence
Tout ce que l'API accepte et renvoie. Schémas détaillés dans la référence interactive.
Toutes les routes
| Méthode et chemin | Rôle |
|---|---|
POST/taxpayers | Ajouter une entreprise (jeton vérifié auprès de la DGI) |
GET/taxpayers | Lister vos entreprises |
GET/taxpayers/{id} | Lire une entreprise |
PATCH/taxpayers/{id} | Modifier ses coordonnées |
PUT/taxpayers/{id}/token | Remplacer son jeton e-MECeF (expiré ou renouvelé) |
DELETE/taxpayers/{id} | Supprimer une entreprise sans facture |
POST/invoices | Certifier une facture |
GET/invoices | Lister vos factures (taxpayer_id, limit jusqu'à 100, offset) |
GET/invoices/{id} | Lire une facture |
GET/invoices/{id}/pdf | Télécharger le PDF |
GET/health | État du service (sans clé) |
Lister les factures d'une entreprise, les plus récentes d'abord :
curl "https://sandbox.otampa.com/invoices?taxpayer_id=3f1c2a8e-5b7d-4c1e-9a2f-6d8e0b4c7a19&limit=20" \
-H "Authorization: Bearer $TAMPA_API_KEY"
import os
import requests
response = requests.get(
"https://sandbox.otampa.com/invoices",
headers={
"Authorization": f"Bearer {os.environ['TAMPA_API_KEY']}",
},
params={"taxpayer_id": "3f1c2a8e-5b7d-4c1e-9a2f-6d8e0b4c7a19", "limit": "20"},
timeout=120,
)
print(response.status_code, response.json())
const response = await fetch("https://sandbox.otampa.com/invoices?taxpayer_id=3f1c2a8e-5b7d-4c1e-9a2f-6d8e0b4c7a19&limit=20", {
headers: {
Authorization: `Bearer ${process.env.TAMPA_API_KEY}`,
},
});
console.log(response.status, await response.json());
<?php
$ch = curl_init("https://sandbox.otampa.com/invoices?taxpayer_id=3f1c2a8e-5b7d-4c1e-9a2f-6d8e0b4c7a19&limit=20");
curl_setopt_array($ch, [
CURLOPT_CUSTOMREQUEST => "GET",
CURLOPT_HTTPHEADER => [
"Authorization: Bearer " . getenv("TAMPA_API_KEY"),
],
CURLOPT_RETURNTRANSFER => true,
CURLOPT_TIMEOUT => 120,
]);
$body = curl_exec($ch);
$status = curl_getinfo($ch, CURLINFO_HTTP_CODE);
curl_close($ch);
echo $status, "\n", $body, "\n";
Le détail de chaque champ est dans la référence interactive.
Champs d'une facture
| Champ | Obligatoire | Contenu |
|---|---|---|
type | oui | FV, EV, FA ou EA (voir Codes DGI) |
items | oui | Au moins une ligne : name, price (prix unitaire TTC), quantity, taxGroup. Facultatifs : code, taxSpecific, originalPrice, priceModification. |
operator | oui | name du vendeur ou de la caisse, id facultatif |
client | non | ifu, name, contact, address |
payment | non | Liste de { "name": "…", "amount": … } |
aib | non | A (1 %) ou B (5 %), voir Facture avec AIB |
reference | pour un avoir | Code MECeF/DGI de la facture d'origine, sans tirets (24 caractères) |
L'IFU du vendeur n'est pas à envoyer : Tampa le prend dans l'entreprise désignée par taxpayer_id.
Codes DGI
Types de facture
FV | Facture de vente |
EV | Facture de vente à l'exportation |
FA | Facture d'avoir (avec reference) |
EA | Facture d'avoir à l'exportation (avec reference) |
Groupes de taxe (taxGroup)
A | Exonéré |
B | Taxable (TVA 18 %) |
C | Exportation de produits taxables |
D | TVA régime d'exception |
E | Régime fiscal TPS |
F | Ré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": "5c2e9f0a7b1d4e38"
}Quand la DGI refuse une facture, detail donne son code et son message :
{
"detail": {
"code": "11",
"description": "(texte de la DGI, en français)"
},
"request_id": "8a1f3c5e7d9b2046"
}| Code | Signification | Que faire |
|---|---|---|
400 | En-tête Idempotency-Key absent | L'ajouter (1 à 255 caractères) |
401 | Clé API absente, invalide ou révoquée | Vérifier l'en-tête Authorization |
404 | Entreprise ou facture introuvable pour votre compte | Vérifier l'identifiant |
409 | Entreprise déjà enregistrée, certification en cours, confirmation incertaine, ou facture non certifiée (PDF) | Lire le detail ; pour « en cours », réessayer avec la même clé |
422 | Donné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 facture | Corriger la demande ; pour un jeton refusé, utiliser PUT /taxpayers/{id}/token |
502 | Confirmation incertaine : la DGI a peut-être enregistré la facture | Vérifier sur le portail e-MECeF avant de refaire la facture avec une nouvelle clé |
503 | DGI injoignable | Réessayer plus tard avec la même clé d'idempotence |
Avant la production
La production Tampa ouvrira après la validation de la DGI. Pour être prêt le jour venu :
- La clé API est stockée côté serveur (variable d'environnement, coffre de secrets), jamais dans une application mobile, une page web ou un dépôt Git.
- Chaque facture a sa propre clé d'idempotence, stable : votre numéro de commande ou de ticket.
- Les réponses
409et503sont réessayées avec la même clé ; la réponse502arrête l'automate et prévient quelqu'un. - Le délai d'attente de
POST /invoicesest d'au moins 120 secondes. - Votre logiciel garde l'
idTampa, le code MECeF/DGI et les compteurs de chaque facture. - Le client reçoit le PDF, ou au minimum le code MECeF/DGI et le QR code.
- Un avoir a été testé de bout en bout sur le bac à sable.
- Les groupes de taxe de chaque produit ont été validés par le comptable de l'entreprise.
Changements
| 3 nov. 2026 | Exemples en Python, JavaScript et PHP, collection Postman, fichier OpenAPI, guides avoir, export, AIB et reprises. |
| 2 nov. 2026 | Documentation publique et inscription en libre-service au bac à sable. |
| 30 oct. 2026 | Ouverture du bac à sable sur le serveur de test de la DGI. |
Une question ? contact@otampa.com