maesn
Für Entwickler

Odoo anbinden: Zwei Protokolle mit Frist, eine Tabelle für jeden Kontakt

Odoo hat keine REST-Schnittstelle. Die zwei Remote-Procedure-Protokolle, die an ihrer Stelle stehen, haben jetzt einen Abkündigungstermin, und gehostete Instanzen erreichen ihn zuerst. Das zieht drei Fragen an den Anfang eines Projekts: was Ihr Kunde übergibt, wie lange es gültig bleibt und warum jeder Kontakt in einer einzigen Tabelle ankommt.

Lennart Svensson, CTO und Mitgründer bei Maesn
Lennart Svensson
CTO und Mitgründer · · Aktualisiert
Illustration zu Odoo anbinden: Bauen, was die Abkündigung überdauert
Das Problem

Zwei Remote-Procedure-Protokolle, beide mit einem Abkündigungstermin

Odoo antwortet auf Remote Procedure Calls statt auf REST, und bis vor Kurzem war die einzige Frage, welches der beiden Sie wählten. Seine eigene Referenz hat beiden inzwischen einen Abkündigungstermin gegeben, und sie nennt zwei verschiedene Termine.

Der Hinweis steht in einem mit Danger markierten Kasten oben in der RPC-Referenz: „Sowohl die XML-RPC- als auch die JSON-RPC-API an den Endpunkten /xmlrpc, /xmlrpc/2 und /jsonrpc sind zur Entfernung in Odoo 22 (Herbst 2028) und Online 21.1 (Winter 2027) vorgesehen.“ Der External-JSON-2-Endpunkt wird als Ersatz genannt.

Die Schnittstellen, und wie jede den Aufrufer identifiziert
SchnittstelleWie Sie sich authentifizierenStatus
/xmlrpcDatenbank, Benutzer-ID und Passwort bei jedem AufrufZur Entfernung vorgesehen
/jsonrpcDatenbank, Benutzer-ID und Passwort bei jedem AufrufZur Entfernung vorgesehen
/json/2Ein Bearer-Schlüssel im Authorization-HeaderAls Ersatz genannt

Endpunkte, Termine und den Nachfolger nennt Odoo in der externen RPC-Referenz und in der JSON-2-Referenz, beide geprüft am 14. August 2026. Zum Hinweis gehört eine Ausnahme: Controller, die mit dem Routentyp jsonrpc deklariert sind, fallen nicht darunter.

Was Ihren Code erreicht, ist REST, auf derselben Schnittstelle wie jedes andere System im Katalog, beschrieben auf der Seite zur Odoo-Schnittstelle. Welcher der zwei Termine für einen bestimmten Kunden gilt, folgt aus seinem Hosting und seiner Version.

Zur Entfernung vorgesehenZwei Termine, nicht einer
/xmlrpc/xmlrpc/2/jsonrpc
Als Ersatz genannt
/json/2/<model>/<method>
Winter 2027
Online 21.1
Odoo Online
Herbst 2028
Odoo 22
Selbst gehostet und Odoo.sh

Was Ihren Code heute erreicht, ist REST. Welcher der zwei Termine für einen Kunden gilt, folgt aus seinem Hosting, ein gemischter Bestand überquert die Linie also zweimal, rund ein Jahr auseinander.

Die drei Endpunkte, ihr Ersatz und die zwei Termine, die Odoo dafür nennt.
Warum es schwierig ist

Eine Hauptversion pro Jahr, und jede ist ihr eigenes System

Odoo liefert seit elf Jahren eine Hauptversion pro Jahr und betreibt jede davon isoliert, mit eigener Codebasis und eigenem Datenbankschema. Niemand wird automatisch aktualisiert, ein Versionswechsel ist also ein Projekt, das jemand einplant.

Das ist gewöhnliches Release-Management, bis zu dem Moment, in dem Sie es neben die zwei Termine legen. Welche Schnittstelle ein Mandant aufrufen kann, ist eine Eigenschaft seiner Version, und inzwischen gilt das auch dafür, wie lange er sie noch aufrufen kann.

Die Release-Liste erklärt die Asymmetrie. Online 21.1 ist eine Nebenversion, und Nebenversionen kommen seit Januar 2026 alle paar Monate, während Hauptversion 22 dem Jahresrhythmus folgt. Einen gehosteten Mandanten verschiebt Odoo, nach Odoos Zeitplan; einen selbst gehosteten verschiebt sein Betreiber, wenn er sich dafür entscheidet, was den späteren Termin nur dem Anschein nach zum weicheren macht.

Elf Hauptversionen von Version 9 im Oktober 2015 bis Version 19 im September 2025, dazu vier Nebenversionen zwischen Januar und Juli 2026, gezählt auf Odoos Release-Notes-Seite, geprüft am 14. August 2026. Odoo gibt außerdem an, dass neue Hauptversionen Datenmodelle, Geschäftslogik und gelegentlich das Verhalten der Aufrufe ändern, eine gegen eine Version geprüfte Anbindung ist damit nicht automatisch auf der nächsten gültig.

Wie es funktioniert

Was Ihr Kunde übergibt und wie lange es gültig bleibt

Vier Werte, einmalig: die Basis-URL der Instanz ohne jeden Pfad, der Datenbankname dahinter, eine Login-E-Mail-Adresse und entweder ein Passwort oder ein Schlüssel. Auf den RPC-Endpunkten reisen alle vier bei jedem Aufruf mit, und genau dort suchen Anbindungen gern nach einer Sitzung.

Es gibt keine. „Beide Funktionen sind zustandslos. Das bedeutet, dass Datenbank, Benutzer-ID und Benutzerpasswort bei jedem Aufruf mitgegeben werden müssen.“ Nichts wird ausgetauscht, nichts wird erneuert, nichts läuft mitten im Lauf ab.

Der Nachfolger arbeitet andersherum. Eine JSON-2-Anfrage trägt Authorization: bearer und, wo ein Server mehrere Datenbanken beherbergt, einen Header X-Odoo-Database. Weder die Benutzer-ID noch das Passwort taucht darin auf.

Ein JSON-2-Lesezugriff, in der dokumentierten FormHTTP
POST /json/2/res.partner/search_read HTTP/1.1
Host: mycompany.example.com
X-Odoo-Database: mycompany
Authorization: bearer <api-key>
Content-Type: application/json; charset=utf-8
 
{
"domain": [["is_company", "=", true]],
"fields": ["name"]
}

Modell und Methode stehen im Pfad, und die Argumente sind alle benannt. Der Schlüssel ist mit Absicht ein Platzhalter: die Formate der Kennungen unterscheiden sich je System.

Wie lange ein Schlüssel leben darf

Ein Schlüssel wird mit einer Laufzeit angelegt, und Odoo deckelt diese Wahl: „Es ist nicht möglich, Schlüssel anzulegen, die länger als drei Monate gelten. Das bedeutet, dass langlebige Schlüssel mindestens alle drei Monate gewechselt werden müssen.“ Der Wert wird einmal angezeigt und lässt sich nicht zurücklesen.

Es geht auch ohne manuellen Schritt: res.users.apikeys.generate() und revoke(), standardmäßig beschränkt auf Benutzer mit Administrationsrechten für die Einstellungen und auf zehn Schlüssel, oberhalb derer der Aufruf 422 zurückgibt. Odoos eigener Rat ist, sich beim Widerrufen des alten mit dem neuen Schlüssel zu authentifizieren.

Eine Voraussetzung gilt nur für gehostete Instanzen: Odoo Online legt Benutzer ohne lokales Passwort an, ein Administrator setzt also eines, bevor der RPC-Zugriff überhaupt funktioniert. Diese Art von Vielfalt von Ihrer Seite fernzuhalten, ist das Thema von Unified Authentication.

Zustandslosigkeit, das Bearer-Verfahren, die Obergrenze von drei Monaten und die programmatischen Methoden stehen in Odoos JSON-2-Referenz, geprüft am 14. August 2026. Der Passwortschritt für Odoo Online steht in der RPC-Referenz.

Warum es schwierig ist

Firmen und Personen teilen sich eine Tabelle namens res.partner

Zwei Felder trennen eine Firma von einer Person: is_company, ein Boolean, und parent_id, das eine Person auf die Firma verweist, zu der sie gehört. Ein Listenaufruf gibt beide Arten zusammen zurück, in keiner brauchbaren Reihenfolge.

Ein Fehler folgt daraus, und zwar aus der Struktur selbst. Behandeln Sie jeden Datensatz als eigenständig, und eine Firma mit vier Kontakten kommt als vier Firmen an, weil jede Person ihre Mutter als Attribut trägt statt als Verweis. Die Beziehung geht nicht unterwegs verloren, sie wurde nie gelesen.

Ein Modellres.partner
Eine Firma
  • is_companytrue
  • parent_idmeist leer
Eine Person
  • is_companyfalse
  • parent_iddie Firma, oder leer
Was ein Listenaufruf zurückgibt

Beide Arten, gemischt, und nichts in der Antwort trennt sie.

Kontakte sind der Weg hinein, nicht einer von mehreren. Customers und Suppliers sind auf Odoo in jeder Spalte unserer Abdeckung als nicht verfügbar markiert.

Ein Modell, zwei Arten von Datensatz und die zwei Felder, die als Einzige zwischen ihnen stehen.

Hier ist das der einzige Weg hinein. Unsere Abdeckung markiert Customers und Suppliers in jeder Spalte als nicht verfügbar, und der Filter in der Anfrage oben ist der, den Odoo in seinem eigenen Beispiel verwendet.

Was Sie bekommen

Sechs Objekte sind heute lesbar, drei davon schreibbar

Für Ändern und Löschen ist nichts freigeschaltet, Korrekturen werden also als neue Belege gebucht, und genau so erwartet es die Buchhaltungspraxis ohnehin.

Heute freigeschaltet, in unseren eigenen Abdeckungsdaten gezählt
ObjektLesenSchreiben
KontenJaJa
KontakteJaJa
BuchungssätzeJaJa
RechnungenJaNein
JournaleJaNein
ZahlungenJaNein

Weitere 133 der 185 Kombinationen aus Objekt und Operation sind als auf Anfrage verfügbar markiert. Das ist die ERP-Fläche und keine Roadmap: die Objekte existieren, sie sind nicht standardmäßig freigeschaltet, und welche davon wir freischalten, ist ein Gespräch über Ihren Use Case.

Zwei Grenzen liegen außerhalb dieses Gesprächs. Odoo stellt nur bereit, was die angebundene Instanz installiert hat, bei einem Kunden ohne die Accounting-App gibt es also keine Rechnungen zu lesen, was auch immer die Tabelle sagt. Und der Zugang zur externen Schnittstelle ist „nur in den Custom-Preisplänen von Odoo verfügbar“, was in die Qualifizierung gehört und nicht in einen Sprint.

Was statt eines Abonnements läuft

Unsere Webhook-Dokumentation listet die Systeme auf, die Sie über uns abonnieren können. Was eine Kopie hier aktuell hält, ist ein geplanter Lesezugriff, die Frische ist also eine Frage des Intervalls, und das Intervall gehört Ihnen.

Objektzahlen am 14. August 2026 aus unseren eigenen Abdeckungsdaten gelesen und gegen die gerenderte Odoo-Integrationsdoku geprüft. Die Planbeschränkung ist Odoos Wortlaut und steht auf beiden Referenzseiten. Auf unserer Seite ist jede Anbindung enthalten, zu einer Pauschale je angebundenem Kunden statt je Aufruf.

Wo unser Teil endet

Was maesn übernimmt, und was bei Ihnen bleibt

Was wir von der Liste nehmen:

  • Das Protokoll. Der Aufruf, seine Form und die Modellnamen bleiben hinter unserer Schnittstelle, kein RPC-Konstrukt erreicht also Ihren Code.
  • Die vier Werte, je Kunde. Basis-URL, Datenbank, Login und Zugangsdaten werden einmal erhoben und an jede Anfrage gehängt, ob gehostet oder selbst gehostet.
  • Die Trennung in res.partner. Firmen und Personen werden getrennt und verknüpft, bevor sie bei Ihnen ankommen, und das ist der Unterschied zwischen einer Kontaktliste und einem Dublettengenerator.

Drei Dinge bleiben bei Ihnen, und zwei davon sind Entscheidungen, bevor sie Arbeit sind:

  • Der Plan und die Version, auf der Ihr Kunde ist. Die Hürde des Custom-Plans liegt zwischen ihm und Odoo, und keine Integrationsschicht verschiebt sie. Dasselbe gilt für die Version, die er betreibt, und sie entscheidet, wann die zwei Termine oben ihn erreichen.
  • Wie frisch Ihr Produkt sein muss. Ein geplanter Lesezugriff hat ein Intervall, und es zu wählen ist eine Produktentscheidung. Paginieren und Filtern lesen sich hier wie überall sonst, und das ist das Thema von Unified Pagination & Filtering.
  • Welche Objekte Sie freigeschaltet brauchen. Sechs sind es heute, und diese Menge ist der Anfang des Gesprächs und nicht sein Ende.
FAQ

Häufige Fragen

Ist XML-RPC in Odoo abgekündigt?

Ja, und JSON-RPC ebenso. Odoos Referenz zu 19.0 sieht beide Protokolle zur Entfernung vor und nennt dafür Odoo 22 im Herbst 2028 und Online 21.1 im Winter 2027, mit dem External-JSON-2-Endpunkt als Ersatz. Eine Ausnahme zeigt auf etwas anderes: Odoo schreibt außerdem, dass Controller, die innerhalb eines Addons mit @route(type='jsonrpc') geschrieben sind, nicht unter den Hinweis fallen. Das ist ein Routen-Dekorator in Odoos eigenem Framework und nicht der öffentliche Endpunkt /jsonrpc, den eine Anbindung aufruft, es verschont den Endpunkt also nicht und ändert für eine externe Anbindung nichts.

Hat Odoo eine REST-API?

Nicht in dem Sinn, den die meisten Anbindungen erwarten. Odoo stellt Remote Procedure Calls bereit, historisch XML-RPC und JSON-RPC über einen Endpunkt, der einen Modellnamen und eine Methode im Rumpf der Anfrage entgegennimmt. Version 19 hat einen schlichteren HTTP-Endpunkt unter /json/2 ergänzt, näher an REST, ohne es zu sein.

Ist Odoos externe Schnittstelle kostenlos nutzbar?

Zwei Antworten, denn es gibt zwei Seiten. Auf Odoos Seite steht eine Hürde statt eines Preises: die Dokumentation gibt an, dass der Zugang über die externe Schnittstelle nur in Custom-Plänen verfügbar ist, nicht in One App Free und nicht in Standard. Auf unserer ist jede Anbindung enthalten, zu einer Pauschale je angebundenem Kunden.

Muss ich Sitzungen verwalten, wenn ich Odoo aufrufe?

Nein, und Odoos Referenz ist darin eindeutig. Die zwei Objektdienst-Funktionen sind zustandslos, Datenbank, Benutzer-ID und Passwort reisen also bei jedem Aufruf mit. Der Nachfolger lässt selbst das weg und liest einen Bearer-Schlüssel aus dem Header.

Wie lange bleibt ein Odoo-Schlüssel gültig?

Sie setzen beim Anlegen eine Laufzeit, und Odoo deckelt die Wahl: die Dokumentation gibt an, dass sich Schlüssel mit mehr als drei Monaten Laufzeit nicht anlegen lassen, eine dauerhaft laufende Anbindung wechselt also mindestens vierteljährlich. Der Wert wird einmal angezeigt und lässt sich später nicht mehr abrufen.

Warum kommen Odoo-Kontakte als Mischung aus Firmen und Personen an?

Weil beide in einem Modell namens res.partner liegen. Ein Boolean namens is_company sagt, welche Art ein Datensatz ist, und parent_id verknüpft eine Person mit ihrer Firma. Ein Listenaufruf gibt beide Arten zusammen zurück, die Trennung passiert also nach dem Lesen.

Welche Objekte kann ich heute über maesn in Odoo lesen und schreiben?

Sechs sind lesbar: Konten, Kontakte, Rechnungen, Journale, Buchungssätze und Zahlungen. Drei davon sind schreibbar, nämlich Konten, Kontakte und Buchungssätze, und für Ändern und Löschen ist nichts freigeschaltet. Weitere 133 von 185 Kombinationen sind auf Anfrage verfügbar.

Einmal bauen, auf der Unified API.

Odoo zieht die zwei Protokolle zurück, auf denen die Anbindungen an Odoo aufgebaut sind, und jeder Kunde überquert diese Linie nach seinem eigenen Zeitplan. Bauen Sie gegen eine Schnittstelle, und der Abstand zwischen einem System und dem nächsten hört auf, Ihre Architektur zu sein.