MADATA / DEV documentation développeur English madata.africa

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 voulezPrenez
Brancher Claude, ChatGPT, Gemini ou Mistral sur l’espaceServeur MCP : ≈150 outils métier, aucune connaissance du modèle de données requise.
Synchroniser un site marchand, une caisse, un annuaireAPI de données : contrôle complet, champ par champ.
Sortir un export sur mesure, alimenter un tableau de bordAPI de données : search_read et read_group font le travail.
Faire agir un assistant sans écrire de codeConnecter 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>. Pour kouassi.madata.app, la base est prod_kouassi.
Utilisateur
Un uid numé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.
Un espace, une base

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éeProtocolePour qui
/xmlrpc/2/common
/xmlrpc/2/object
XML-RPCLe plus répandu. Python, PHP, Ruby, Java ont un client XML-RPC dans leur bibliothèque standard.
/jsonrpcJSON-RPC 2.0JavaScript, Node, Go, et tout ce qui préfère du JSON. Mêmes services, même sémantique.
/web/dataset/call_kwJSON sur sessionLe 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.

pythonpython 3, bibliothèque standard uniquement
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")
bashla meme chose en JSON-RPC, sans bibliotheque
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}
Gardez le uid

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.

pythonexecute_kw, argument par argument
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 champCe que vous recevezCe que vous envoyez
char, text, htmlUne chaîne. Un champ vide vaut false, pas "".Une chaîne.
integer, float, monetaryUn nombre. Un monetary est un flottant : la devise est portée par currency_id.Un nombre.
booleantrue / 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.
selectionLa valeur technique ("posted"), pas son libellé.La valeur technique.
many2oneUne paire [id, "libellé"], ou false.L’id seul.
one2many, many2manyUne liste d’id.Des commandes relationnelles.
binaryLe contenu encodé en base64.En base64.
false est partout

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épond 403 depuis l’extérieur. Aucune clé ne l’ouvre.
  • La liste des bases du serveur n’est pas publiée : db.list ré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_read sans limit sur 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, write et read acceptent des listes. Cent contacts en un appel valent mieux que cent appels.
Maintenance
Pendant une mise à jour de l’espace, l’API répond 503 avec un en-tête Retry-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.

Authentification ›

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 ›

Lire

search_read, les domaines, les regroupements, la pagination, le contexte.

Lire des données ›

Écrire

Créer, modifier, relier, et déclencher les actions métier : un devis confirmé, une facture comptabilisée.

Écrire des données ›