L’API REST que Dolibarr devrait fournir de série
EasyAPI réimplémente les 32 domaines du core de Dolibarr (ventes, achats, stock, comptabilité, projets, RH, associations…) sur un contrat unique : le même envelope de réponse, la même taxonomie d’erreurs, l’idempotence sur toute écriture et un serveur MCP pour les agents IA. Vos permissions et votre ACL Dolibarr restent maîtresses.
|
32
domaines du core réimplémentés
|
98
ressources EAPI auto-découvertes
|
MCP
serveur natif pour les agents IA
|
V15–V24
Dolibarr compatible · PHP 7.4–8.3
|
Le problème qu’il résout
L’API fournie de série avec Dolibarr couvre le cas basique. Les problèmes arrivent quand l’intégration doit tenir en production : réessais après une coupure réseau, permissions réellement contrôlées, plusieurs sociétés dans la même installation et documents qui doivent bien totaliser. Ce sont cinq défauts concrets, et aucun ne prévient quand il se produit.
| Ce que vous rencontrez |
Ce que ça vous coûte |
| Un POST renvoie l’id brut et le GET l’objet : chaque domaine répond à sa façon |
Une couche de normalisation dans votre code, différente pour chaque ressource, à maintenir pour toujours |
| Un réessai après un timeout recrée le document : l’en-tête Idempotency-Key n’existe pas |
Des factures et des encaissements en double que quelqu’un doit annuler et rapprocher à la main |
| Supprimer un paiement par API renvoie 500 sur Dolibarr 20 ou plus : la signature de Paiement::delete() a changé avec la 20 |
La seule voie documentée pour défaire un encaissement ne fonctionne plus au moment où vous en avez besoin |
| En multi-société, une DOLAPIKEY valide d’une autre entité renvoie 503 « module inactif » |
L’API ne parle qu’à l’entité 1 : chaque société finit par avoir besoin de sa propre installation |
| Une ligne de facture avec recargo de equivalencia ou IRPF est enregistrée avec la taxe à 0 |
Le document totalise mal : vous encaissez moins ou vous retenez moins, et aucune erreur ne se déclenche |
| L’erreur dit seulement « socid field missing », sans le champ exact ni un request_id |
Support à l’aveugle : il faut reproduire à la main ce qui a déjà échoué en production |
Le même envelope, les mêmes codes et les mêmes filtres sur les 32 domaines. On l’apprend une fois et ça sert pour tout : il n’y a pas une façon différente de paginer, de filtrer ou de lire l’erreur selon la ressource que vous touchez.
NOUVEAUTÉ 2.28
Ce que demande l’agent d’IA attend votre confirmation
Avec la confirmation humaine activée, une écriture demandée par un agent via MCP ne s’exécute pas. Elle attend dans Outils › Actions en attente (IA) avec ses données et un aperçu, et elle n’a lieu que lorsque la personne qui a connecté l’agent clique sur Confirmer.
- Vous choisissez ce qui attend. Toutes les écritures, ou seulement l’envoi d’e-mails et les suppressions. L’option est désactivée par défaut : la mise à jour ne change rien.
- L’agent ne peut pas se confirmer lui-même. La confirmation n’existe pas pour le MCP : elle se fait dans Dolibarr ou via l’API REST (POST /mcp/pending/{token}/confirm), et seule la personne qui a demandé l’action peut la donner.
- Une seule fois, avec expiration. Chaque action se confirme une fois et expire au bout de 10 minutes ; le délai va jusqu’à 24 heures.
- E-mails marqués. Un e-mail envoyé après confirmation porte X-AI-Generated et X-AI-Reviewed.
DANS LA 2.25
Qui vous doit quoi et depuis quand, et le prix que l’ERP appliquerait à chaque client
La version 2.25 a apporté des indicateurs métier qu’il fallait jusqu’ici reconstituer en additionnant les factures à la main. Le MCP, lui, indique à l’agent ce que fait chaque opération avant qu’il ne l’appelle.
- Ancienneté des créances. GET /invoices/kpis/aging et GET /supplier-invoices/kpis/aging répartissent le reste dû entre non échu, 1-30, 31-60, 61-90 et plus de 90 jours. Les tranches se règlent avec ?buckets=0,15,45 et ?group=thirdparty donne le détail par tiers. Ils suivent l’ACL des listes : le commercial qui ne voit que ses clients ne voit que la dette de ces clients.
- Délais moyens et vrai reste dû. /invoices/kpis ajoute dso et /supplier-invoices/kpis ajoute dpo, les délais moyens d’encaissement et de paiement sur les 90 derniers jours. Les KPI outstanding et overdue additionnent ce qui reste vraiment dû : ils déduisent les paiements partiels, les avoirs et les acomptes avec le même calcul que getRemainToPay() du cœur.
- Prix effectif par client. GET /products/{id}/price?socid=&qty= renvoie le prix que l’ERP mettrait sur la ligne pour ce client et cette quantité, avec TVA, surtaxe et retenue à la source, les totaux et l’origine du prix : base, price_level, customer_price ou quantity.
- Des erreurs sans SQL. Le message du moteur de base de données reste dans le syslog avec le request_id, et la réponse porte un code exploitable : un doublon donne un 409 avec reason: duplicate_record, et un verrou un 503 avec Retry-After: 2 pour réessayer.
- Chaque opération déclare son effet. x-effect indique si elle lit (read), écrit dans l’ERP (internal), sort vers l’extérieur (external) ou n’a pas de retour arrière (irreversible), et le MCP le traduit en readOnlyHint et destructiveHint. Les suppressions par MCP peuvent être interdites dans la configuration (EASYAPI_MCP_ALLOW_DELETE) ou utilisateur par utilisateur, et c’est le réglage le plus strict qui s’applique.
- IBAN masqué. Par MCP, l’IBAN, le numéro de compte et la référence du mandat des comptes bancaires des tiers ne montrent que les 4 derniers caractères. Par REST, rien ne change.
Un aperçu du résultat
La spécification OpenAPI se génère toute seule depuis les ressources et se sert à l’intérieur du module, filtrée selon les permissions de l’utilisateur qui la consulte.
Les 32 domaines navigables, avec sélecteur de serveur et authentification par DOLAPIKEY. Chaque opération apporte son schéma et un exemple prêt à lancer.
Comparaison avec l’API native
| Dimension |
API native de Dolibarr |
EasyAPI |
| Couverture |
Plus de 50 classes API réparties dans les modules du core, avec une couverture inégale : en comptabilité, par exemple, le seul endpoint est le dump des données |
32 domaines du core complets, avec leurs sous-ressources : lignes, contacts, paiements, remises… |
| Forme de réponse |
Hétérogène : un POST renvoie un entier brut, un autre l’objet |
Envelope uniforme {success, data, meta} : le POST répond 201 avec l’enregistrement créé |
| Erreurs |
Des codes et des messages disparates, sans taxonomie et sans rien que vous puissiez citer dans un ticket |
Taxonomie de 16 types, le champ exact dans error.fields, et request_id + doc_url dans toutes |
| Idempotence |
N’existe pas |
Réservation atomique par Idempotency-Key sur toute écriture, y compris les transitions d’état |
| Opérations en masse |
N’existent pas |
207 Multi-Status en création, modification et suppression, jusqu’à 100 éléments par lot et avec le résultat de chacun |
| Requêtes |
Des filtres SQL bruts à écrire à la main, sans tri ni choix des champs |
Filtres et tri en JSON, recherche, sélection de champs, ressources imbriquées, pagination par page et par curseur |
| Résilience |
N’existe pas |
Limite de requêtes, réessai des verrous de base de données, concurrence optimiste et mode maintenance |
| Sécurité |
Des droits natifs, avec de vrais défauts : la requête des commerciaux renvoie 401 là où un 403 s’impose |
Les mêmes droits natifs, avec l’ACL par enregistrement corrigée et uniforme : 403 correct et sans fuites entre tiers ni entre entités |
| Documentation |
Explorateur Swagger basique |
OpenAPI généré depuis le code, avec Scalar, Swagger UI et Redoc embarqués et filtré par permissions |
| Extensibilité |
Il faut toucher le core pour ajouter des endpoints |
Auto-découverte : vous créez un dossier dans votre propre module et vos endpoints apparaissent documentés |
Comment ça s’utilise
Authentification avec la DOLAPIKEY de votre utilisateur dans l’en-tête. La même clé vaut comme Authorization: Bearer si votre serveur avale les en-têtes personnalisés. Une facture avec sa ligne en un seul appel :
FACTURE AVEC SA LIGNE, EN UNE SEULE REQUÊTE
curl -X POST "https://tu-dolibarr.com/custom/easyapi/api/invoices" \
-H "DOLAPIKEY: tu_clave" \
-H "Idempotency-Key: pedido-4417" \
-H "Content-Type: application/json" \
-d '{"socid": 128, "lines": [{"fk_product": 55, "qty": 2, "subprice": 49.90}]}'
201 · LA FACTURE NAÎT EN BROUILLON AVEC SA REF PROVISOIRE
{
"success": true,
"data": {
"id": 902,
"ref": "(PROV902)",
"socid": 128,
"statut": 0,
"total_ttc": 119.76,
"lines": [ { "id": 3311, "qty": 2, "subprice": 49.90 } ]
}
}
422 · L’ERREUR VOUS DIT LE CHAMP, PAS SEULEMENT QUE QUELQUE CHOSE A ÉCHOUÉ
{
"success": false,
"error": {
"type": "validation_error",
"code": 422,
"message": "Validation failed",
"fields": { "socid": "does not exist" },
"request_id": "req_7f3a91c2",
"doc_url": "https://easysoft.es/docs/api#validation_error"
}
}
La ref définitive est attribuée par la validation, c’est ainsi que fonctionne Dolibarr : POST /invoices/902/validate remplace le (PROV902) par le numéro de la série et recalcule les totaux. Renvoyez la même requête avec la même Idempotency-Key et vous recevrez la facture d’avant, pas une seconde, avec l’en-tête Idempotent-Replayed: true qui signale qu’elle n’a pas été réexécutée.
Ce qui est inclus
Des écritures qui ne se dupliquent pas
Idempotency-Key avec réservation atomique et replay annoncé sur toute écriture, y compris les transitions d’état (valider, payer, clôturer).
Des erreurs qui s’expliquent d’elles-mêmes
Une taxonomie unique de 16 types, le détail par champ et deux données pour le ticket : l’identifiant de la requête et le lien vers le document de l’erreur.
Des requêtes sans SQL à la main
Filtres, tri, recherche et sélection de champs en JSON ; pagination par page et par curseur pour parcourir de grandes tables sans perdre de lignes.
Vos permissions, telles quelles
Les droits natifs de Dolibarr plus l’ACL par enregistrement corrigée : un commercial ne voit pas ce qui n’est pas à lui, et le 403 apparaît là où il faut.
Serveur MCP pour les agents
Endpoint POST /mcp pour Claude, Cursor ou tout client MCP, authentifié avec votre clé et limitable aux domaines que vous voulez.
Résilience configurable
Limite de requêtes, réessai des verrous de base de données, concurrence optimiste avec ETag, mode maintenance et une limite de taille de corps. Le tout par constantes.
À quoi ça sert
- Synchroniser une boutique en ligne ou une marketplace : commandes, stock et prix contre votre base de données, sans écrire de SQL
- Une appli mobile pour les commerciaux avec session par cookie HttpOnly, où la clé de l’ERP n’arrive jamais au navigateur
- Des tableaux de bord et de la BI qui lisent les 32 domaines avec filtres et pagination par curseur
- Des automatisations et des agents IA connectés par MCP à votre propre ERP, avec les règles d’écriture que vous décidez
- Plusieurs sociétés servies depuis une seule API, chaque utilisateur dans son entité
- Un ERP externe qui doit créer des factures et des encaissements en sachant qu’un réessai ne duplique rien
Mise en route
1
Décompressez le ZIP dans custom/easyapi et lancez composer install --no-dev --optimize-autoloader.
2
Activez EasyAPI dans Configuration → Modules et ouvrez son écran de configuration : CORS, session, limites et MCP se règlent depuis là.
3
Copiez la clé de votre utilisateur (Utilisateur → onglet API) et vérifiez qu’elle répond : GET /me vous renvoie qui vous êtes.
4
Ouvrez /docs et naviguez dans les 32 domaines. Si votre serveur est nginx, appliquez le bloc du guide inclus avant de valider quoi que ce soit.
Prérequis
| Dolibarr |
V15 à V24 (testé sur la 18 et la 24 ; les signatures du core sont vérifiées de la 10 à la 24) |
| PHP |
7.4 à 8.3, avec curl, json et mbstring |
| Base de données |
MySQL 5.7+ · MariaDB 10.2+ · PostgreSQL 10+ |
| Mises à jour |
365 jours d’accès aux mises à jour |
Avant d’acheter
Puis-je l’adapter à mon cas ?
Oui. Vous recevez tout le code source et vous pouvez le lire, le modifier et l’adapter sans demander la permission. En plus, les ressources se découvrent toutes seules, donc le plus courant est que vous ajoutiez vos propres endpoints depuis votre module au lieu de toucher au nôtre.
Comment le tester sans risquer mes données ?
Installez-le sur une copie de votre Dolibarr et appelez GET /status : il répond sans toucher un seul enregistrement. Toutes les lectures sont inoffensives. Les écritures, elles, créent de vraies données, donc testez-les sur cette copie : ce que garantit Idempotency-Key, c’est qu’un réessai après une coupure réseau ne vous duplique pas l’enregistrement, pas que l’opération soit réversible.
Et si quelque chose ne colle pas avec mon installation ?
Écrivez-nous à
info@easysoft.es avant d’acheter et on regarde ça avec vous : version de Dolibarr, PHP, hébergement et ce que vous devez intégrer. On préfère vous dire que ça ne colle pas plutôt que de vous vendre quelque chose qui ne vous sert pas.
Mon intégration va-t-elle casser lors d’une mise à jour ?
Le contrat est une API v1 stable et chaque réponse le déclare dans l’en-tête X-EasyAPI-Version. Dans v1 n’entrent que des changements compatibles : nouveaux champs optionnels, nouveaux endpoints, nouveaux en-têtes. Un changement qui casse le contrat sortirait en v2, et votre intégration resterait en v1 pendant que vous migrez quand ça vous arrange.
Que se passe-t-il quand les 365 jours expirent ?
Le module que vous avez déjà continue de fonctionner : rien ne se désactive ni ne se bloque. Ce qui se termine, c’est l’accès aux mises à jour et aux nouveaux téléchargements, ainsi que le support par e-mail. Si plus tard vous voulez reprendre, ça se renouvelle.
Maintenance active
EasyAPI n’est pas un module publié et oublié : la version actuelle est la 2.28.0 et chaque livraison ajoute des tests qui tiennent ce qu’elle corrige. La 2.28 apporte un test pour chaque règle de la confirmation humaine, vérifié en cassant la règle exprès, un test navigateur de la page des actions en attente et une vérification HTTP sur Dolibarr 15, 18 et 24. En plus des tests, chaque release passe une QA sur des instances réelles de Dolibarr avant publication.
|
31
modules publiés sur Dolistore
|
100 %
code source complet
|
8
langues dans l’interface
|
365
jours de mises à jour
|
Ça colle à ce que vous devez intégrer ?
Racontez-nous votre cas et on vous dit si EasyAPI vous sert — et sinon, on vous le dit aussi.
info@easysoft.es www.easysoft.es