In Enterprise-Systemen entsteht mit der Zeit häufig die Situation, dass mehrere API-Versionen über lange Zeit parallel weiterbetrieben werden. Eine neue Version wird eingeführt, bestehende Konsumenten bleiben zunächst auf der alten Version, und ein verbindlicher Zeitpunkt für die Abschaltung fehlt.

API-Versionierung ist deshalb nicht nur eine technische Frage. Sie betrifft Release-Prozesse, Kommunikation, Konsumenten-Migration und den laufenden Betrieb. Eine API-Versionierungs-Strategie schafft dafür einen verbindlichen Rahmen. Sie beschreibt, wie Versionen entstehen, wie sie kommuniziert werden, wann sie deprecated werden und wann sie tatsächlich abgeschaltet werden. Fehlen diese Regeln, wird Versionierung im Bestand schnell zur dauerhaften Wartungslast.

Hinweis

Eine API-Versionierungs-Strategie definiert, wie API-Versionen entstehen, wie sie für Konsumenten sichtbar werden und wann sie abgeschaltet werden. Drei Bausteine sind dafür zentral. Dazu gehören ein klares Versionierungs-Pattern wie URL, Header oder Accept-Header, SemVer-konforme Versionsnummern für die Einordnung von Breaking Changes sowie ein Deprecation-Lifecycle mit verbindlichen Fristen. Ohne diese Bausteine wird API-Versionierung im Bestand schnell zur dauerhaften Wartungslast.

Warum API-Versionierung in der Praxis schwierig ist

API-Versionierung wirkt zunächst überschaubar. Eine neue Version wird veröffentlicht, Konsumenten migrieren, alte Versionen werden abgeschaltet. In der Praxis verläuft dieser Übergang zwischen API-Versionen deutlich schwieriger. Konsumenten haben unterschiedliche Release-Zyklen, interne Abhängigkeiten und Prioritäten. Dadurch wird Versionierung schnell zu einem organisatorischen Thema, nicht nur zu einer technischen Umsetzung.

In der Praxis tauchen vor allem vier Schwierigkeiten regelmäßig auf:

SemVer als Grundlage für API-Versionierung

Semantic Versioning, kurz SemVer, hat sich als Standard für Software-Versionierung etabliert. Für APIs ist SemVer ebenfalls sinnvoll, muss aber mit Blick auf API-Konsumenten angewendet werden. Diese erwarten einen stabilen Vertrag zwischen Systemen und bewerten Änderungen oft strenger als Nutzer einer Library.

Die Grundlogik bleibt unverändert. Eine Versionsnummer folgt dem Muster MAJOR.MINOR.PATCH. Eine Major-Erhöhung steht für Breaking Changes. Eine Minor-Erhöhung beschreibt neue Funktionen ohne Breaking Change. Eine Patch-Erhöhung steht für reine Bug-Fixes ohne fachliche oder technische Vertragsänderung.

Für APIs bedeutet das konkret, ein neuer optionaler Parameter ist in der Regel ein Minor-Change. Eine zusätzliche Response-Property ebenfalls. Auch ein neuer Endpoint kann als Minor-Version veröffentlicht werden, solange bestehende Konsumenten unverändert weiterarbeiten. Das Umbenennen eines Felds oder das Entfernen eines Endpoints ist dagegen ein Major-Change. Das Verschärfen einer Validierungs-Regel muss im Kontext bewertet werden, weil bestehende Requests dadurch in der Pipeline abgelehnt werden können.

Besonders anspruchsvoll ist die Klassifizierung subtiler Änderungen. Eine Performance-Verbesserung, die die Antwort-Latenz halbiert, ist kein Breaking Change. Eine Performance-Verschlechterung, die die Latenz verdoppelt, ist weniger eindeutig. Für Konsumenten kann sie jedoch ähnlich kritisch sein wie eine Schema-Änderung, insbesondere wenn Timeouts, SLAs oder Prozessketten betroffen sind. SemVer deckt solche Fälle nicht ausdrücklich ab. In der Praxis sollten sie trotzdem wie potenzielle Breaking Changes behandelt und früh kommuniziert werden.

Für GraphQL gilt SemVer mit einer wichtigen Besonderheit. GraphQL-Konsumenten fragen nur die Felder ab, die sie tatsächlich benötigen. Das Hinzufügen neuer Felder ist deshalb grundsätzlich nicht-breaking. Das Entfernen oder Umbenennen bestehender Felder bleibt dagegen ein Breaking Change. GraphQL-Versionierung ist dadurch oft weniger versions-getrieben und stärker deprecation-getrieben. Einzelne Felder können über die Schema-Direktive @deprecated markiert und später kontrolliert entfernt werden.

Versionierungs-Patterns: URL, Header, Accept

Eine API-Versionierungs-Strategie muss außerdem festlegen, wie Konsumenten eine konkrete Version anfordern. Dafür haben sich drei Versionierungs-Patterns etabliert.

PatternBeispielWann sinnvoll
URL-Versionierung/v1/customers, /v2/customersWenn Versionen klar sichtbar, einfach testbar und gut im Betrieb auswertbar sein sollen
Header-VersionierungX-API-Version: 2Wenn die URL stabil bleiben soll und Konsumenten Header zuverlässig setzen können
Accept-Header-VersionierungAccept: application/vnd.api.v2+jsonWenn HTTP-Standards und Media Types konsequent genutzt werden sollen

URL-Versionierung ist in der Praxis die verbreitetste Variante. Ihr Vorteil liegt in der Klarheit. Konsumenten sehen direkt in der URL, welche API-Version sie verwenden. Caching, Logging und Browser-basiertes Testen funktionieren ohne zusätzliche Sonderlogik. Der häufigste Kritikpunkt betrifft die REST-Idee einer eindeutigen Ressourcen-URL. In vielen Organisationen ist die operative Verständlichkeit jedoch wichtiger als diese theoretische Einschränkung.

Header-Versionierung hält die URL frei von Versionsinformationen, bringt im Betrieb aber zusätzlichen Aufwand mit sich. Konsumenten müssen bei jedem Request den richtigen Header setzen. Einfache Tests im Browser oder per curl sind dadurch weniger bequem. Auch Logging und Monitoring müssen die Version aus dem Header auslesen, damit Auswertungen pro API-Version möglich sind.

Accept-Header-Versionierung orientiert sich stark am HTTP-Standard und nutzt Media Types zur Unterscheidung von Versionen. Das passt gut zu API-Landschaften, in denen HTTP-Konzepte konsequent angewendet werden. Für Konsumenten ist dieses Pattern jedoch anspruchsvoller. Viele Frameworks interpretieren den Accept-Header nicht automatisch als Versionsinformation, und auch Tests oder Fehlersuchen sind weniger intuitiv.

Seltener ist die Versionierung über Subdomains, zum Beispiel v1.api.example.com. Sie kann sinnvoll sein, wenn unterschiedliche API-Versionen technisch vollständig getrennt betrieben werden sollen, etwa auf separaten Backend-Clustern. Diese Trennung schafft klare Betriebsgrenzen, erhöht aber den Pflege-Aufwand deutlich. Für die meisten API-Bestände ist dieses Modell zu schwergewichtig.

Breaking Changes erkennen und kommunizieren

Eine API-Versionierungs-Strategie funktioniert nur, wenn Breaking Changes zuverlässig erkannt werden. Manuelle Einschätzungen allein reichen dafür selten aus. Änderungen an Schemas, Validierungen oder Antwortverhalten müssen automatisch geprüft und bewusst klassifiziert werden. Sonst werden Major-Änderungen erst im Betrieb sichtbar, wenn Konsumenten betroffen sind.

Für die Erkennung von Breaking Changes haben sich drei Mechanismen bewährt:

Ergänzend setzt sich im DACH-Markt zunehmend eine verpflichtende Klassifizierung direkt im Pull Request durch. Jeder PR mit einer Spec-Änderung muss angeben, ob es sich um einen Major-, Minor- oder Patch-Change handelt. Eine kurze Begründung macht die Entscheidung nachvollziehbar. So wird die Versionsfrage früh geklärt und nicht erst kurz vor dem Release oder nach einer Konsumenten-Beschwerde diskutiert.

Praxiserfahrung

In einer Banking-Plattform wurde Spec-Diff in der CI eingeführt. Zuvor wurden Major-Versionen vor allem durch Backend-Teams ad hoc bewertet. Bereits in den ersten drei Monaten verhinderten Konsumenten elf Mal, dass eine Änderung als Minor veröffentlicht wurde, obwohl sie für bestehende Integrationen faktisch ein Breaking Change gewesen wäre. Nach sechs Monaten waren die Major-Klassifizierungen deutlich verlässlicher. Gleichzeitig stieg das Vertrauen der Konsumenten, weil Änderungen früher sichtbar und nachvollziehbarer wurden.

Deprecation-Lifecycle in vier Phasen

Ein Deprecation-Lifecycle beschreibt, wie eine API-Version kontrolliert aus dem Betrieb genommen wird. Er macht für Provider und Konsumenten transparent, in welchem Status sich eine Version befindet, welche Unterstützung noch erfolgt und wann die Abschaltung geplant ist. Vier Phasen haben sich in der Praxis bewährt.

  1. Active. Die Version wird aktiv betrieben und ist die empfohlene Version für neue Konsumenten. Bug-Fixes und kompatible Erweiterungen fließen regulär ein. Dieser Zustand ist der Normalfall für eine aktuelle API-Version.
  2. Deprecated. Die Version ist offiziell als veraltet markiert. Bestehende Konsumenten können sie weiterhin nutzen, neue Konsumenten werden jedoch auf die aktuelle Version gelenkt. Bug-Fixes werden meist noch bereitgestellt. Gleichzeitig wird eine Sunset-Frist kommuniziert, häufig zwischen sechs und zwölf Monaten.
  3. Sunset Approaching. Das Abschaltdatum rückt näher. Konsumenten, die die alte API-Version noch nutzen, werden gezielt kontaktiert. Gleichzeitig wird der Aufruf-Anteil pro Version eng überwacht. Verbleibende Konsumenten erhalten Migrationsunterstützung, etwa technische Hinweise, Beispiele oder direkte Ansprechpartner.
  4. Retired. Die Version ist abgeschaltet. Requests auf diese Version werden nicht mehr regulär verarbeitet, sondern liefern zum Beispiel 410 Gone oder eine vergleichbare Antwort. Die Fehlermeldung sollte auf die aktuelle API-Version und die passende Migrationsdokumentation verweisen.

Für den Übergang zwischen den Phasen braucht es klare Verantwortlichkeiten. In manchen Organisationen entscheidet ein Architektur-Board, in anderen das Produkt-Team der API. Teilweise werden Phasenwechsel auch automatisiert auf Basis von Konsumenten-Anteilen vorbereitet. Ohne klare Zuständigkeit entstehen zwei Risiken. Versionen werden zu früh deprecated und belasten Konsumenten unnötig, oder sie bleiben zu lange aktiv und erhöhen dauerhaft die Pflege-Last.

Tipp

Eine pragmatische Faustregel für Sunset-Fristen lautet: interne APIs mindestens sechs Monate, Partner-APIs etwa zwölf Monate und öffentliche APIs achtzehn bis vierundzwanzig Monate. Kürzere Fristen sind möglich, müssen aber gut begründet und aktiv kommuniziert werden. Längere Fristen können sinnvoll sein, erhöhen jedoch die Pflege-Last im Bestand.

Multi-Version-Betrieb in der Praxis

Solange mehrere API-Versionen aktiv sind, müssen sie parallel betrieben, überwacht und unterstützt werden. Dafür gibt es unterschiedliche technische Strategien. Drei Ansätze sind besonders verbreitet.

Code-Branching. Jede API-Version erhält einen eigenen Backend-Code-Zweig, häufig als separaten Service. Das schafft eine klare technische Trennung und reduziert Abhängigkeiten zwischen Versionen. Gleichzeitig ist dieser Ansatz teuer in der Pflege, weil Bug-Fixes und Sicherheitsupdates über mehrere Code-Stände hinweg nachgezogen werden müssen.

Adapter-Pattern. Es gibt nur eine zentrale Backend-Implementierung. Ältere API-Versionen werden über Adapter unterstützt, die Requests transformieren und Responses an das alte Schema anpassen. Das reduziert die Pflege-Last deutlich. Der Ansatz stößt jedoch an Grenzen, sobald sich Versionen fachlich oder semantisch zu weit voneinander entfernen.

Feature-Flags. Das Verhalten der API wird im Code über Flags gesteuert. Abhängig von der angeforderten Version werden bestimmte Logiken aktiviert oder deaktiviert. Das ist flexibel und kann Rollouts erleichtern. Gleichzeitig steigt die Komplexität schnell, wenn drei oder mehr API-Versionen parallel über Flags gesteuert werden.

Welche Strategie passt, hängt vom bestehenden System, der fachlichen Distanz zwischen den Versionen und der Anzahl aktiver API-Versionen ab. Bei zwei aktiven Versionen reicht das Adapter-Pattern oft aus. Ab drei parallelen Versionen werden Code-Branching oder Feature-Flag-basiertes Routing häufiger notwendig, weil reine Adapter-Logik schnell unübersichtlich wird.

Multi-Version-Betrieb sollte immer als Übergangsphase verstanden werden. Wenn mehr als zwei API-Versionen länger als sechs Monate aktiv bleiben, sollte nicht zuerst der Wartungsapparat ausgebaut werden. Sinnvoller ist es, den Deprecation-Lifecycle zu beschleunigen und die Migration gezielt voranzutreiben.

Im Multi-Version-Betrieb werden operative Themen sichtbar, die bei einer einzelnen API-Version kaum auffallen. Logging muss pro Version auswertbar sein, damit Fehler sauber zugeordnet werden können. Monitoring-Dashboards brauchen Versions-Splits, weil eine Latenz-Verschlechterung auf einer alten Version anders bewertet wird als auf der aktuellen. Auch Support, Dokumentation und Konsumenten-Kommunikation müssen versionsspezifisch funktionieren. Diese operativen Aspekte machen Multi-Version-Betrieb oft teurer, als es die reine Code-Komplexität vermuten lässt.

Achtung

Multi-Version-Betrieb ohne klares Sunset-Datum erzeugt dauerhaft Pflege-Aufwand. Je mehr API-Versionen parallel aktiv sind, desto stärker steigen Komplexität, Abstimmungsbedarf und Support-Aufwand. Bei drei aktiven Versionen sollte feststehen, welche Version als nächste abgeschaltet wird und wann die Abschaltung erfolgt. Sunset-Daten gehören deshalb direkt in die Spec und nicht nur in ein Wiki.

Wie api-portal.io API-Versionierung umsetzt

In api-portal.io werden API-Versionen nachvollziehbar geführt und über eine vollständige Diff-Funktion miteinander verglichen. Änderungen an der OpenAPI-Spec können bereits im Pull Request automatisch als Major, Minor oder Patch klassifiziert werden. So wird früh sichtbar, ob eine Änderung kompatibel ist oder als Breaking Change behandelt werden muss.

Deprecation-Marker, Sunset-Daten und Konsumenten-Tracking pro Version gehören ebenfalls zum Standard. Ergänzend informieren Notification-Mechanismen betroffene Konsumenten aktiv über Lifecycle-Übergänge, etwa wenn eine Version deprecated wird oder sich das Sunset-Datum nähert.

Die Versionierung macht API-Versionen sichtbar und steuerbar.