FactureCare.ma

API et sandbox ACAPI

API de facturation électronique au Maroc : contrôler vos flux avec ACAPI

Cette architecture s’adresse aux éditeurs logiciels, intégrateurs, équipes ERP, grands comptes et responsables SI qui souhaitent détecter les écarts avant une transformation ou un échange avec un système cible.

Rôle de l’API

Une couche de contrôle entre la donnée et le flux cible

Une API de conformité reçoit une facture structurée, vérifie ses champs et applique des règles cohérentes. Elle retourne ensuite un résultat structuré que le logiciel peut afficher, journaliser ou utiliser dans un circuit de correction.

Le rapport doit distinguer les erreurs bloquantes des avertissements. Une erreur empêche la suite du flux ; un avertissement signale un point à revoir sans forcément bloquer. Les recommandations expliquent l’action attendue afin que les équipes métier et techniques partagent le même diagnostic.

Cette étape intervient avant une transformation ou transmission. Elle réduit les allers-retours, mais ne remplace ni le mapping métier, ni les validations comptables, ni la confirmation des modalités officielles applicables.

Fonctionnement ACAPI

ACAPI applique le profil ma-2026-draft pour une validation préparatoire. Il retourne des erreurs structurées, avertissements et recommandations, puis indique si le document est prêt pour un exemple de transformation UBL. La transformation n’est demandée qu’en l’absence d’erreur bloquante.

Le profil ma-2026-draft est préparatoire et ne constitue pas une validation ou une acceptation officielle de la DGI.

Exemples JSON simplifiés

L’entrée illustre quelques champs de facture. La réponse montre une erreur de total et bloque la préparation UBL. Ces exemples sont pédagogiques et ne constituent pas la documentation contractuelle définitive de l’API.

Exemple d’entrée

{
  "documentType": "INVOICE",
  "invoiceNumber": "FAC-2026-001",
  "currency": "MAD",
  "seller": { "ice": "001525255000083" },
  "buyer": { "ice": "002345678000041" },
  "totalsProvided": {
    "taxExclusiveAmount": 1000,
    "taxAmount": 200,
    "taxInclusiveAmount": 1200
  }
}

Exemple de réponse

{
  "status": "FAIL",
  "ruleset": "ma-2026-draft",
  "errors": [
    {
      "code": "MA_INVALID_TOTAL_TTC",
      "message": "Le total TTC ne correspond pas aux montants calculés."
    }
  ],
  "warnings": [],
  "canGenerateUbl": false
}

Cycle recommandé d’intégration d’un flux ACAPI

L’application cliente conserve son propre identifiant métier de facture et son mécanisme de traçabilité. Le contrôle ACAPI s’insère sans remplacer l’historique du système source.

  1. Étape 1Extraire depuis l’ERP ou le logiciel
  2. Étape 2Mapper vers le contrat interne
  3. Étape 3Valider les champs obligatoires
  4. Étape 4Appeler ACAPI depuis le serveur
  5. Étape 5Recevoir le rapport
  6. Étape 6Classer erreurs et avertissements
  7. Étape 7Corriger la donnée métier
  8. Étape 8Valider à nouveau
  9. Étape 9Préparer l’UBL sans erreur bloquante
  10. Étape 10Journaliser le résultat

Le mapping est souvent plus important que l’appel API

Les systèmes nomment différemment les colonnes, stockent parfois les montants comme texte et mélangent les formats de date. Un taux peut apparaître comme 20, 0.20 ou 20 %, la devise rester implicite, les parties être inversées ou une formule Excel ne pas être exportée. Le contrat interne doit lever ces ambiguïtés avant l’appel.

Exemples pédagogiques de mapping de données facture
Donnée sourceRisqueNormalisation recommandée
ICE ClientEspaces ou longueur incorrecteChaîne normalisée et contrôlée
TVATaux ou montant ambiguSéparer taux et montant
Total TTCFormule Excel non exportéeExporter la valeur calculée
Date factureFormats locaux différentsFormat ISO dans le contrat interne
DeviseValeur vide ou impliciteValeur explicite contrôlée

Ces exemples sont pédagogiques ; le mapping réel dépend du contrat de données et des outils du projet.

Comment exploiter les erreurs structurées

Un intégrateur ne doit pas se limiter à « facture invalide ». Un retour utile associe code, sévérité, champ, message utilisateur, valeur reçue, recommandation, version du ruleset et, si le système en dispose, identifiant de corrélation.

Le nom exact des champs et des codes peut évoluer selon le contrat réel de l’API. L’exemple ci-contre est uniquement pédagogique.

{
  "code": "MA_BUYER_SELLER_ICE_MATCH",
  "severity": "ERROR",
  "field": "buyer.ice",
  "message": "L’ICE acheteur ne doit pas être identique à l’ICE vendeur.",
  "recommendation": "Vérifier le mapping des parties vendeur et acheteur."
}

Idempotence et traçabilité côté intégrateur

Générez un identifiant métier stable, conservez la version envoyée et journalisez chaque résultat avec le ruleset utilisé. Une correction doit produire une nouvelle tentative reliée à la précédente, sans écraser silencieusement l’ancien rapport ni doubler un traitement accidentel.

Cette recommandation d’architecture ne suppose pas qu’ACAPI expose actuellement une clé d’idempotence native.

Préparer le passage du test unitaire au traitement en volume

Démarrez avec quelques factures, mesurez temps de réponse et taux d’erreur, limitez la concurrence et gérez les timeouts. Prévoyez les reprises, séparez erreurs techniques et métier, et ne relancez pas indéfiniment une facture invalide.

Surveillez quotas et rate limits selon le contrat de sandbox, puis augmentez progressivement le volume sans supposer une performance non mesurée.

Cas d’usage à qualifier

Validation d’un export ERP

Contrôler un échantillon avant de connecter le flux complet.

Contrôle d’un fichier issu de Sage

Mapper les colonnes disponibles vers une structure de facture cohérente.

Intégration éditeur

Afficher des retours structurés dans le parcours utilisateur du logiciel.

Tests sandbox

Exécuter des scénarios valides, invalides et limites sans exposer de clé.

Factures en préparation

Détecter les écarts avant leur génération ou leur échange.

Retours métier

Transformer les codes techniques en actions compréhensibles et traçables.

Sécurité

La clé reste côté serveur

  • Aucune clé ACAPI dans une variable NEXT_PUBLIC_*.
  • Le navigateur appelle les routes serveur Next.js.
  • La route serveur ajoute l’authentification vers ACAPI.
  • La facture est revalidée avant une transformation UBL.
  • Une valeur canGenerateUbl envoyée par le navigateur n’est jamais digne de confiance.

Limites

Ce que le projet doit encore cadrer

  • Profil préparatoire et non-validation DGI.
  • Mapping métier adapté aux systèmes sources.
  • Qualification de la sandbox et des scénarios.
  • Paramètres réels confirmés pour chaque projet.
  • Supervision, reprise et capacité évaluées avant production.

Checklist d’intégration API

Contrat de données défini
Mapping documenté
Clé conservée côté serveur
Timeout configuré
Erreurs HTTP et métier gérées séparément
Logs sans données sensibles inutiles
Règles de rejeu définies
Version du ruleset conservée
Factures conformes et non conformes testées
Transformation UBL bloquée en présence d’erreurs
Sandbox séparée de la production

Passer du cadrage au test

FAQ technique

Questions d’intégration

Le navigateur peut-il appeler ACAPI directement ?

Non. La clé ACAPI reste côté serveur. Le navigateur appelle une route serveur Next.js, qui authentifie ensuite la demande vers ACAPI sans exposer le secret.

Le profil ma-2026-draft est-il officiel ?

Non. Il s’agit d’un profil préparatoire destiné à tester les données et les flux. Il ne constitue pas une validation ou une acceptation officielle de la DGI.

Quand une transformation UBL peut-elle être demandée ?

Le serveur revalide la facture et ne demande une transformation que si aucune erreur bloquante ne subsiste. La valeur canGenerateUbl du navigateur n’est jamais considérée comme une autorisation.

ACAPI accepte-t-il un traitement batch public ?

Cette page ne promet pas de fonction batch publique. Les besoins de volume, de supervision et d’orchestration doivent être qualifiés pour chaque projet.

Les exemples JSON sont-ils contractuels ?

Non. Ils sont volontairement simplifiés et pédagogiques. Le contrat de données, l’authentification, les champs et les réponses définitives sont à cadrer dans la documentation du projet.

Une sandbox garantit-elle une intégration en production ?

Non. Elle sert à qualifier les données et scénarios. Le mapping métier, la sécurité, la charge, les reprises et les paramètres réels doivent encore être validés.