API de données
Vos données, depuis votre code
Chaque espace <espace>.madata.app expose son
API de données : tout ce que vous voyez à l’écran se lit
et s’écrit depuis un programme, avec vos identifiants et vos droits.
Un seul moteur, deux façades. Le serveur MCP parle aux assistants IA en outils métier prêts à l’emploi. L’API de données, elle, parle à votre code : elle expose les modèles bruts de l’espace, leurs champs et leurs méthodes. Un client, un devis, une écriture comptable, un mouvement de stock : tout est lisible et modifiable.
01Laquelle des deux choisir
| Vous voulez | Prenez |
|---|---|
| Brancher Claude, ChatGPT, Gemini ou Mistral sur l’espace | Serveur MCP : ≈150 outils métier, aucune connaissance du modèle de données requise. |
| Synchroniser un site marchand, une caisse, un annuaire | API de données : contrôle complet, champ par champ. |
| Sortir un export sur mesure, alimenter un tableau de bord | API de données : search_read et read_group font le travail. |
| Faire agir un assistant sans écrire de code | Connecter un assistant. |
Les deux partagent la même clé d’API et les mêmes droits. Rien n’interdit de les utiliser ensemble.
02Adresse & base
Deux informations suffisent pour appeler un espace.
- Adresse
https://<espace>.madata.app: celle par laquelle vous vous connectez tous les jours.- Base
prod_<espace>. Pourkouassi.madata.app, la base estprod_kouassi.- Utilisateur
- Un
uidnumérique, renvoyé à la connexion. Ce n’est pas votre adresse email : c’est son identifiant interne. - Mot de passe
- Une clé d’API. Jamais votre mot de passe de connexion.
Chaque espace a sa base, isolée des autres. Une clé ne donne accès qu’à l’espace qui l’a émise. Il n’y a rien à « sélectionner » : le nom de la base est déterminé par le sous-domaine, et une base qui n’est pas la vôtre reste invisible.
03Trois protocoles, un seul moteur
| Point d’entrée | Protocole | Pour qui |
|---|---|---|
/xmlrpc/2/common/xmlrpc/2/object | XML-RPC | Le plus répandu. Python, PHP, Ruby, Java ont un client XML-RPC dans leur bibliothèque standard. |
/jsonrpc | JSON-RPC 2.0 | JavaScript, Node, Go, et tout ce qui préfère du JSON. Mêmes services, même sémantique. |
/web/dataset/call_kw | JSON sur session | Le canal du navigateur. Utile pour rejouer exactement ce que fait l’interface. Demande un cookie de session. |
Les trois attaquent le même moteur et respectent les mêmes droits. XML-RPC et JSON-RPC sont sans état : chaque appel porte ses identifiants, il n’y a pas de session à entretenir.
04Le premier appel
Trois étapes : vérifier la version, se connecter, compter des enregistrements.
import xmlrpc.client URL = "https://<espace>.madata.app" DB = "prod_<espace>" CLE = "votre-cle-d-api" LOGIN = "[email protected]" common = xmlrpc.client.ServerProxy(f"{URL}/xmlrpc/2/common") print(common.version()) # {'server_version': '17.0', 'server_serie': '17.0', 'protocol_version': 1} uid = common.authenticate(DB, LOGIN, CLE, {}) print("uid =", uid) # 7 (False si la cle est refusee) models = xmlrpc.client.ServerProxy(f"{URL}/xmlrpc/2/object") nb = models.execute_kw(DB, uid, CLE, 'res.partner', 'search_count', [[]]) print(nb, "contacts")
curl -s https://<espace>.madata.app/jsonrpc \
-H "Content-Type: application/json" \
-d '{"jsonrpc":"2.0","method":"call","params":{
"service":"object","method":"execute_kw",
"args":["prod_<espace>", 7, "votre-cle-d-api",
"res.partner","search_count",[[]]]}}'
# {"jsonrpc": "2.0", "id": null, "result": 143}
authenticate coûte un aller-retour et
un contrôle de mot de passe. Appelez-le une fois au démarrage de votre
programme, gardez le uid en mémoire, et n’y revenez que si un
appel échoue en AccessDenied.
05La forme d’un appel
Tout passe par execute_kw, sur le service
object. Sept arguments, toujours les mêmes.
models.execute_kw(
db, # nom de la base de l'espace
uid, # identifiant numerique de l'utilisateur
cle, # cle d'API
'res.partner', # modele
'search_read', # methode
[[['customer_rank', '>', 0]]], # arguments positionnels
{'fields': ['name', 'email'], 'limit': 10}, # arguments nommes
)
Les deux derniers sont la clé de lecture : une liste
d’arguments positionnels, puis un dictionnaire d’arguments
nommés. Une méthode sans argument nommé reçoit {}, ou rien du
tout.
06Conventions de types
| Type de champ | Ce que vous recevez | Ce que vous envoyez |
|---|---|---|
char, text, html | Une chaîne. Un champ vide vaut false, pas "". | Une chaîne. |
integer, float, monetary | Un nombre. Un monetary est un flottant : la devise est portée par currency_id. | Un nombre. |
boolean | true / false. | Idem. |
date | "2026-09-17". | Même forme. |
datetime | "2026-09-17 14:32:08", toujours en UTC, sans suffixe de fuseau. | En UTC. La conversion vers Abidjan est votre affaire. |
selection | La valeur technique ("posted"), pas son libellé. | La valeur technique. |
many2one | Une paire [id, "libellé"], ou false. | L’id seul. |
one2many, many2many | Une liste d’id. | Des commandes relationnelles. |
binary | Le contenu encodé en base64. | En base64. |
Un champ non renseigné revient à
false, quel que soit son type : chaîne vide, date absente,
many2one vide. C’est le piège le plus fréquent des premiers
jours. if contact["email"]: est le bon réflexe ;
contact["email"].lower() plante sur un contact sans email.
07Ce qui reste fermé
- La gestion des bases (
/web/database/*, création, duplication, restauration, liste) répond403depuis l’extérieur. Aucune clé ne l’ouvre. - La liste des bases du serveur n’est pas publiée :
db.listrépond « accès refusé ». Vous connaissez déjà la vôtre, c’est la seule qui vous concerne. - Utilisateurs, sociétés, abonnement, applications : ce sont des ressources facturées, pilotées par le portail (madata.africa/portail). Les créer par l’API désaligne l’espace et la facturation. Le serveur MCP les refuse d’ailleurs explicitement.
08Limites & bonnes manières
- Durée d’un appel
- Environ 300 secondes. Un appel qui dépasse est coupé : découpez plutôt que d’insister.
- Volume
- Pas de plafond de lignes, mais un
search_readsanslimitsur un gros modèle ramène tout. Paginez. - Cadence
- Pas de quota publié sur l’API de données. Une boucle serrée qui sature l’espace pénalise d’abord vos propres utilisateurs : groupez vos appels.
- Groupez
create,writeetreadacceptent des listes. Cent contacts en un appel valent mieux que cent appels.- Maintenance
- Pendant une mise à jour de l’espace, l’API répond
503avec un en-têteRetry-After. Respectez-le et reprenez : rien n’est perdu.
S’authentifier
Créer une clé, obtenir un uid, comprendre ce que la
double authentification change.
Le modèle de données
Modèles, champs, identifiants externes, multi-société, et comment les découvrir sans les deviner.
Modèles & champs ›Écrire
Créer, modifier, relier, et déclencher les actions métier : un devis confirmé, une facture comptabilisée.
Écrire des données ›