| errors |
| Failed to load YAML frontmatter: Tried to load unspecified class: Date |
|
Référence API Odoo — Documentation Complète
Base URL : https://sarl-le-relais-de-louest.odoo.com/jsonrpc
Protocole : JSON-RPC 2.0
Auth : common.login + API Key
Modèles documentés : ~250 modèles standards Odoo 19
1. Authentification (inchangée)
1.1 Obtenir un UID
POST /jsonrpc
Content-Type: application/json
{
"jsonrpc": "2.0",
"method": "call",
"params": {
"service": "common",
"method": "login",
"args": ["<db_name>", "<email>", "<api_key>"]
},
"id": 1
}
Réponse : {"jsonrpc": "2.0", "id": 1, "result": 2}
1.2 Helper Python
import requests
DB, UID, PWD = "sarl-le-relais-de-louest", None, None
URL = f"https://{DB}.odoo.com/jsonrpc"
def odoo_call(model, method, *args):
payload = {
"jsonrpc": "2.0", "method": "call",
"params": {
"service": "object", "method": "execute_kw",
"args": [DB, UID, PWD, model, method] + list(args)
}, "id": 1
}
r = requests.post(URL, json=payload, timeout=30).json()
if "error" in r:
raise Exception(r["error"]["data"]["message"])
return r.get("result")
2. Méthodes génériques
Tous les modèles supportent : search, search_read, search_count, read, create, write, unlink, fields_get.
Syntaxe des domaines
["field", "=", value] # égalité
["field", "!=", value] # différent
["field", ">=", value] # supérieur ou égal
["field", "=like", "xxx%"] # LIKE
["field", "in", [v1, v2]] # IN
[["f1", "=", v1], ["f2", "=", v2]] # AND
[["f1", "=", v1], "|", ["f1", "=", v2]] # OR
Commandes relationnelles
# Many2one → int
"partner_id": 42
# Many2many
"taxes_id": [(6, 0, [id1, id2])] # remplacer
"taxes_id": [(4, id3)] # ajouter
"taxes_id": [(3, id3)] # supprimer
"taxes_id": [(5, 0, 0)] # vider
# One2many
"order_line": [(0, 0, {vals})] # créer + lier
"order_line": [(1, id, {vals})] # modifier
"order_line": [(2, id)] # supprimer
3. Catalogue complet des modèles Odoo 19
Organisé par module. Chaque modèle est accessible via odoo_call("nom.modele", ...).
⚠️ = piège connu | 📖 = détaillé plus bas
3.0 Technique / Base (ir.*)
| Modèle |
Description |
ir.model |
Registre de tous les modèles |
ir.model.fields |
Champs de chaque modèle |
ir.module.module |
Modules installés/à installer |
ir.ui.view |
Vues XML (form, tree, kanban…) |
ir.ui.menu |
Menus |
ir.actions.act_window |
Actions fenêtre |
ir.actions.server |
Actions serveur / automations |
ir.actions.report |
Rapports PDF |
ir.actions.url |
Actions URL |
ir.cron |
Tâches planifiées |
ir.mail_server |
Serveurs SMTP sortants |
ir.config_parameter |
Paramètres système (clé/valeur) |
ir.sequence |
Séquences de numérotation |
ir.translation |
Traductions |
ir.attachment |
Pièces jointes / documents |
ir.qweb |
Templates QWeb |
ir.filters |
Filtres sauvegardés utilisateur |
ir.default |
Valeurs par défaut utilisateur |
ir.logging |
Logs applicatifs |
ir.property |
Propriétés champ |
3.1 Contacts (res.* — resources)
| Modèle |
Description |
res.partner |
📖 Contacts, clients, fournisseurs |
res.partner.category |
Étiquettes / tags |
res.partner.bank |
Comptes bancaires |
res.partner.title |
Titres (M., Mme, Dr…) |
res.partner.industry |
Secteurs d'activité |
res.company |
Sociétés |
res.users |
Utilisateurs |
res.groups |
Groupes de sécurité |
res.lang |
Langues |
res.country |
Pays |
res.country.state |
Régions/États |
res.currency |
Devises |
res.currency.rate |
Taux de change |
res.bank |
Banques |
res.config.settings |
Configuration générale |
3.2 Ventes (sale.*)
| Modèle |
Description |
sale.order |
📖 Commandes / devis |
sale.order.line |
📖 Lignes de commande |
sale.order.template |
Modèles de devis |
sale.order.template.line |
Lignes de modèle de devis |
sale.order.template.option |
Options de modèles |
sale.advance.payment.inv |
Assistant facture d'acompte |
sale.order.cancel |
Assistant annulation |
sale.payment.provider.onboarding.wizard |
Assistant onboarding paiement |
sale.order.line.margin |
Marge par ligne (lecture) |
3.3 PDV / Point de Vente (pos.*)
| Modèle |
Description |
pos.order |
📖 Commandes PDV |
pos.order.line |
📖 Lignes PDV |
pos.session |
📖 Sessions de caisse |
pos.config |
📖 Configuration PDV |
pos.payment |
Paiements PDV |
pos.payment.method |
Modes de paiement |
pos.category |
Catégories de produits PDV |
pos.bill |
Tickets/reçus |
pos.session.statement |
Relevés de session |
pos.cash.box.in |
Entrée caisse |
pos.cash.box.out |
Sortie caisse |
pos.order.return |
Remboursement PDV |
pos.discount |
Remises PDV |
pos.combo |
Combos (menus) |
pos.combo.line |
Lignes de combo |
pos.close.session.wizard |
Assistant fermeture session |
pos.printer |
Imprimantes IoT |
pos.pack.operation.lot |
N° de lot/série |
3.4 Produits (product.*)
| Modèle |
Description |
product.template |
Modèles de produits |
product.product |
📖 Variantes produits |
product.category |
📖 Catégories |
product.attribute |
Attributs (taille, couleur…) |
product.attribute.value |
Valeurs d'attribut |
product.template.attribute.line |
Ligne attribut-modèle |
product.template.attribute.value |
Valeur attribut-modèle |
product.packaging |
Colisage |
product.supplierinfo |
Infos fournisseur par produit |
product.pricelist |
Listes de prix |
product.pricelist.item |
Règles de prix |
product.uom |
Unités de mesure |
product.uom.categ |
Catégories d'unités |
product.image |
Images (obsolète, utiliser ir.attachment) |
product.label.layout |
Mise en page étiquettes |
product.replenish |
Assistant réapprovisionnement |
3.5 Inventaire / Stock (stock.*)
| Modèle |
Description |
stock.picking |
Transferts / bons de livraison |
stock.move |
Mouvements de stock |
stock.move.line |
Lignes de mouvement |
stock.quant |
📖 Quantités en stock |
stock.location |
Emplacements |
stock.warehouse |
Entrepôts |
stock.inventory.adjustment.name |
Ajustement d'inventaire |
stock.rule |
Règles de réapprovisionnement |
stock.picking.type |
Types d'opération |
stock.package.type |
Types de colis |
stock.package.destination |
Destination colis |
stock.package.level |
Niveau colis |
stock.lot |
Lots / numéros de série |
stock.storage.category |
Catégories de stockage |
stock.putaway.rule |
Règles de rangement |
stock.scrap |
Mise au rebut |
stock.warn.insufficient.qty |
Assistant stock insuffisant |
stock.quantity.history |
Historique quantités |
stock.track.confirmation |
Traçabilité |
stock.track.line |
Ligne de traçabilité |
stock.assign.serial |
Assignation n° série |
stock.scheduler.compute |
Calcul du scheduler MTS/MTO |
stock.change.product.qty |
Modification quantité |
stock.return.picking |
Retour de transfert |
3.6 Facturation / Comptabilité (account.*)
| Modèle |
Description |
account.move |
📖 Écritures comptables / Factures |
account.move.line |
Lignes d'écriture |
account.journal |
Journaux (ventes, banque, caisse…) |
account.tax |
📖 Taxes |
account.tax.group |
📖 Groupes de taxes |
account.fiscal.position |
Positions fiscales |
account.fiscal.position.tax |
Mapping taxes position fiscale |
account.fiscal.position.account |
Mapping comptes position fiscale |
account.payment |
📖 Paiements |
account.payment.register |
Assistant enregistrement paiement |
account.payment.term |
Conditions de paiement |
account.payment.term.line |
Lignes conditions de paiement |
account.chart.template |
Modèle plan comptable ⚠️ SaaS restreint |
account.account |
Comptes comptables |
account.account.type |
Types de comptes |
account.account.tag |
Étiquettes comptes |
account.group |
Groupes de comptes |
account.bank.statement |
Relevés bancaires |
account.bank.statement.line |
Lignes relevé |
account.reconcile.model |
Modèles de lettrage |
account.reconcile.model.line |
Lignes modèle |
account.analytic.account |
Comptes analytiques |
account.analytic.line |
Lignes analytiques |
account.analytic.plan |
Plans analytiques |
account.analytic.tag |
Étiquettes analytiques |
account.asset |
Immobilisations |
account.asset.category |
Catégories d'immobilisation |
account.budget.post |
Postes budgétaires |
account.cash.rounding |
Arrondi espèces |
account.financial.year.op |
Ouverture exercice |
account.aged.trial.balance |
Balance âgée |
account.general.ledger |
Grand livre |
account.trial.balance |
Balance |
account.tax.report |
Rapport de taxes |
account.report |
Rapports comptables |
account.report.line |
Lignes de rapport |
account.accrued.orders.wizard |
Assistant OD |
account.automatic.entry.wizard |
Assistant écritures auto |
wizard.multi.charts.accounts |
Assistant plan comptable ⚠️ SaaS restreint |
3.7 Événements (event.*)
| Modèle |
Description |
event.event |
📖 Événements |
event.event.ticket |
📖 Types de billets |
event.registration |
📖 Participants / inscriptions |
event.type |
Catégories d'événements |
event.tag |
Étiquettes événements |
event.mail |
Emails événement planifiés |
event.mail.registration |
Emails inscription |
event.track |
Programme / sessions |
event.track.location |
Lieux de session |
event.track.tag |
Étiquettes session |
event.sponsor |
Sponsors |
event.sponsor.type |
Types de sponsor |
event.registration.cancel |
Assistant annulation inscription |
3.8 CRM (crm.*)
| Modèle |
Description |
crm.lead |
Pistes / Leads |
crm.team |
Équipes commerciales |
crm.stage |
Étapes du pipeline |
crm.tag |
Étiquettes CRM |
crm.lead.lost |
Assistant perte de piste |
crm.lead.to.opportunity |
Conversion lead → opportunité |
crm.merge.opportunity |
Fusion opportunités |
crm.iap.lead.mining.request |
Lead Mining IAP |
crm.iap.lead.role |
Rôles IAP |
crm.iap.lead.seniority |
Séniorité IAP |
crm.quotation.partner |
Partenaire de devis |
3.9 Ressources Humaines (hr.*)
| Modèle |
Description |
hr.employee |
Employés |
hr.employee.category |
Catégories employés |
hr.department |
Départements |
hr.job |
Postes |
hr.contract |
Contrats |
hr.leave |
Congés |
hr.leave.type |
Types de congés |
hr.leave.allocation |
Allocations de congés |
hr.expense |
Notes de frais |
hr.expense.sheet |
Feuilles de frais |
hr.expense.category |
Catégories de frais |
hr.attendance |
Présences/pointages |
hr.applicant |
Candidats |
hr.recruitment.stage |
Étapes recrutement |
hr.plan |
Plans RH |
hr.plan.activity.type |
Types d'activité plan RH |
hr.work.entry.type |
Types d'entrée de travail |
3.10 Projets (project.*)
| Modèle |
Description |
project.project |
Projets |
project.task |
Tâches |
project.task.type |
Étapes de tâche |
project.tags |
Étiquettes projet |
project.milestone |
Jalons |
project.task.recurrence |
Tâches récurrentes |
project.update |
Mises à jour projet |
project.share.wizard |
Assistant partage projet |
project.delete.wizard |
Assistant suppression projet |
3.11 Facturation / Temps (account.analytic.*)
| Modèle |
Description |
account.analytic.account |
Comptes analytiques |
account.analytic.line |
Lignes analytiques (timesheet) |
account.analytic.plan |
Plans analytiques |
account.analytic.tag |
Étiquettes analytiques |
account.analytic.distribution.model |
Modèles de distribution |
3.12 Timesheet (hr_timesheet.*)
| Modèle |
Description |
account.analytic.line |
Feuilles de temps (même modèle que 3.11) |
project.task.create.timesheet |
Assistant création timesheet |
timesheet.analysis.report |
Rapport d'analyse |
3.13 Achats (purchase.*)
| Modèle |
Description |
purchase.order |
Commandes fournisseur |
purchase.order.line |
Lignes commande fournisseur |
purchase.requisition |
Appels d'offres |
purchase.requisition.line |
Lignes appel d'offres |
purchase.bill.union |
Regroupement factures |
purchase.bill.line.union |
Lignes regroupement |
3.14 Abonnements (sale.subscription.*)
| Modèle |
Description |
sale.subscription |
Abonnements |
sale.subscription.line |
Lignes d'abonnement |
sale.subscription.template |
Modèles d'abonnement |
sale.subscription.alert |
Alertes abonnement |
sale.subscription.close.reason |
Raisons clôture |
sale.subscription.recurrence.period |
Périodes récurrentes |
3.15 E-commerce (website.* + product.public.*)
| Modèle |
Description |
website |
Sites web |
website.page |
Pages |
website.menu |
Menus du site |
website.rewrite |
Redirections |
website.visitor |
Visiteurs |
website.track |
Tracking |
product.public.category |
Catégories e-commerce |
product.ribbon |
Rubans produit |
website.sale.extra.field |
Champs supplémentaires checkout |
website.sale.extra.line |
Lignes frais supplémentaires |
payment.provider |
Fournisseurs de paiement |
payment.token |
Tokens de paiement sauvegardés |
payment.transaction |
Transactions de paiement |
payment.link.wizard |
Assistant lien de paiement |
3.16 Messagerie / Emails (mail.*)
| Modèle |
Description |
mail.message |
Messages (fil de discussion) |
mail.activity |
Activités planifiées |
mail.activity.type |
Types d'activité |
mail.template |
Modèles d'email |
mail.mail |
📖 Emails en file d'attente |
mail.compose.message |
Assistant composition |
mail.channel |
Canaux de discussion |
mail.channel.member |
Membres du canal |
mail.followers |
Abonnés |
mail.notification |
Notifications |
mail.tracking.value |
Valeurs de suivi |
mail.alias |
Alias email |
mail.alias.domain |
Domaines alias |
mail.shortcode |
Codes courts |
mail.link.preview |
Aperçus de lien |
fetchmail.server |
Serveur entrant (IMAP/POP) |
3.17 Marketing / Email (mass_mailing.* + link.tracker.*)
| Modèle |
Description |
mailing.mailing |
Campagnes email |
mailing.list |
Listes de diffusion |
mailing.contact |
Contacts liste |
mailing.trace |
Traces (ouvertures, clics) |
link.tracker |
Traqueurs de lien |
link.tracker.click |
Clics sur liens |
link.tracker.code |
Codes de lien |
3.18 Sondages (survey.*)
| Modèle |
Description |
survey.survey |
Sondages |
survey.question |
Questions |
survey.question.answer |
Réponses possibles |
survey.user_input |
Réponses utilisateur |
survey.user_input.line |
Lignes de réponse |
survey.invite |
Invitations |
3.19 Événements Live / Forum
| Modèle |
Description |
event.booth |
Stands salon |
event.booth.category |
Catégories stand |
forum.forum |
Forums |
forum.post |
Messages forum |
forum.tag |
Étiquettes forum |
3.20 Base de connaissances (knowledge.*)
| Modèle |
Description |
knowledge.article |
Articles base de connaissance |
knowledge.article.favorite |
Favoris article |
knowledge.article.member |
Membres article |
knowledge.cover |
Couverture |
3.21 Planning (planning.*)
| Modèle |
Description |
planning.slot |
Créneaux planning |
planning.slot.template |
Modèles de créneau |
planning.role |
Rôles planning |
planning.calendar |
Calendriers |
3.22 Documents (documents.*)
| Modèle |
Description |
documents.document |
Documents |
documents.folder |
Dossiers |
documents.tag |
Étiquettes document |
documents.share |
Partage de documents |
3.23 Approbations (approvals.*)
| Modèle |
Description |
approval.request |
Demandes d'approbation |
approval.category |
Catégories d'approbation |
approval.approver |
Approbateurs |
4. Modèles détaillés (les plus utilisés)
4.1 sale.order — Commande
| Champ |
Type |
Obligatoire |
Description |
name |
char |
✅ |
Référence commande |
partner_id |
m2o → res.partner |
✅ |
Client |
partner_invoice_id |
m2o |
✅ |
Adresse facturation |
partner_shipping_id |
m2o |
✅ |
Adresse livraison |
company_id |
m2o |
✅ |
Société (1) |
date_order |
datetime |
✅ |
Date |
picking_policy |
selection |
✅ |
direct ou one
|
state |
selection |
|
draft/sent/sale/done/cancel
|
client_order_ref |
char |
|
Réf externe |
team_id |
m2o → crm.team |
|
Équipe |
user_id |
m2o |
|
Vendeur |
note |
text |
|
Notes |
4.2 product.product — Produit
| Champ |
Type |
Description |
name |
char ✅ |
Nom |
type |
selection |
consu/service/product ⚠️ pas detailed_type
|
list_price |
float |
Prix vente TTC |
barcode |
char |
Code-barres |
categ_id |
m2o |
Catégorie |
sale_ok |
bool |
Vente |
available_in_pos |
bool |
Visible en PDV |
taxes_id |
m2m |
Taxes |
active |
bool |
Actif |
4.3 event.registration — Inscription
| Champ |
Type |
Description |
event_id |
m2o |
Événement |
name |
char |
Nom participant |
email |
char |
Email |
barcode |
char |
QR/Barcode BilletWeb |
state |
selection |
draft/open/done/cancel
|
event_ticket_id |
m2o |
Type billet |
sale_order_id |
m2o |
Commande liée |
sale_order_line_id |
m2o |
Ligne liée |
⚠️ description n'existe pas → utiliser barcode.
5. Flux BilletWeb → Odoo
Ordre : res.partner → product.product → event.event.ticket → sale.order → sale.order.line → event.registration → lien registration_ids.
Anti-doublon
existing = odoo_call("event.registration", "search_read", [[]], {"fields": ["barcode"]})
done = {r["barcode"] for r in existing if r.get("barcode")}
if barcode in done: continue
Désactiver les emails (6 étapes)
# 1. mail.mail → unlink stuck
# 2. ir.mail_server → active=False
# 3. fetchmail.server → active=False
# 4. mail.template → auto_delete=True
# 5. ir.cron → active=False (jobs mail/email/send)
# 6. event.event → auto_confirm=False
6. TVA Réunion (DOM)
| Taux |
Vente ID |
Achat ID |
| 8,5% |
79 |
32 |
| 2,1% |
80 |
35 |
| 0% |
61-70 |
50 |
grp = odoo_call("account.tax.group", "create", [{"name": "TVA 8.5%"}]) # sans country_id !
odoo_call("account.tax", "create", [{"name": "8.5% S", "amount": 8.5, "type_tax_use": "sale", ...}])
7. Pièges
| N° |
Erreur |
Solution |
| 1 |
AccessDenied |
common.login pas /web/session/authenticate
|
| 2 |
create retourne None |
champs obligatoires manquants → fields_get
|
| 3 |
create prend UN dict |
[{...}] pas [[{...}]]
|
| 4 |
detailed_type |
Ne pas utiliser → type
|
| 5 |
Taxe country_id mismatch |
Groupe sans country_id
|
| 6 |
auto_confirm envoie emails |
Désactiver avant import |
| 7 |
unlink échoue |
{"active": False} |
| 8 |
search_read limit=80 |
limit=0 pour tout |
| 9 |
BilletWeb 403 |
User-Agent: Mozilla/5.0 |
| 10 |
sale.order 7 champs requis |
name, partner_id ×3, company_id, date_order, picking_policy |
8. Limites SaaS
| ✅ |
❌ |
| API JSON-RPC |
SSH |
| CRUD tous modèles standards |
Modules Python customs |
| Modules Studio |
Accès PostgreSQL |
| Webhooks sortants |
Core mods |
| Extensions Chrome |
Packages Python |
9. Exemples
Créer un client
pid = odoo_call("res.partner", "create", [{"name": "Jean", "email": "j@mail.com", "customer_rank": 1}])
Créer une commande + ligne + inscription
so = odoo_call("sale.order", "create", [{"name": "CMD-001", "partner_id": pid, "partner_invoice_id": pid, "partner_shipping_id": pid, "company_id": 1, "date_order": "2026-05-29 10:00:00", "picking_policy": "direct"}])
line = odoo_call("sale.order.line", "create", [{"order_id": so, "product_id": 13, "product_uom_qty": 1, "price_unit": 11.00}])
reg = odoo_call("event.registration", "create", [{"event_id": 1, "name": "Jean", "email": "j@mail.com", "barcode": "1234567890", "state": "open"}])
odoo_call("sale.order.line", "write", [[line], {"registration_ids": [(6, 0, [reg])]}])