API Lifecycle

API Versioning

APIs ändern sich. Versionierung ist der Weg, Verbesserungen auszuliefern, ohne die Clients zu beeinträchtigen, die bereits von Ihnen abhängen – und wie man alte Versionen gezielt ausphasen kann.

intermediate13 min readUpdated 15. Sept. 2026
versioning.js
js
// versioning.js
app.get("/v1/posts", listPostsV1);
app.get("/v2/posts", listPostsV2);

// signal that v1 is going away
app.use("/v1", (req, res, next) => {
  res.set("Deprecation", "true");
  res.set("Sunset", "Wed, 31 Dec 2026 23:59:59 GMT");
  res.set("Link", '</v2/posts>; rel="successor-version"');
  next();
});
Breaking
Entfernt oder ändert Verhalten
Additive
Meistens sicher
Gängig
URI Versioning
Flexibel
Header Versioning
Ausphasung
Deprecation und Sunset
Regel
Niemals stillschweigend brechen

Warum es wichtig ist

Warum Versionierung wichtig ist

Evolution ohne Brüche

Versionierung ermöglicht es, die API zu verbessern, während Clients weiterhin mit dem alten Vertrag arbeiten, bis sie migrieren.

Vorhersehbare Änderungen

Eine klare Richtlinie darüber, was als 'breaking' gilt, bedeutet, dass Clients wissen, wann sie handeln müssen.

Gezielte Ausphasung

Deprecation- und Sunset-Header machen das Entfernen einer alten Version zu einem kommunizierten Plan statt zu einer Überraschung.

Das Gesamtbild

Die drei Kernkonzepte der Versionierung

Wissen, was Clients beeinträchtigt, eine praktikable Strategie wählen und Versionen nach einem Zeitplan ausphasen.

Kompatibilität

Klassifizieren

Entscheiden Sie, ob eine Änderung additiv und sicher oder breaking und versionswürdig ist.

Strategie

Exponieren

Wählen Sie, wie Clients eine Version auswählen: in der URL, über einen Header oder den Media-Type.

Lifecycle

Ausphasen

Kündigen Sie die Deprecation an, legen Sie ein Sunset-Datum fest und überwachen Sie die Nutzung, bevor Sie etwas entfernen.

Versionierung auf einen Blick

Die Kernideen

URI Versioning

/v1/posts, die sichtbarste und am einfachsten zu testende Methode.

Header Versioning

Ein benutzerdefinierter Header oder ein Accept-Parameter wählt die Version aus.

Query-Parameter

?version=2, einfach, aber leicht zu vergessen.

Additive Änderungen

Neue optionale Felder und Endpunkte beeinträchtigen Clients selten.

Deprecation

Der Deprecation-Header signalisiert eine bevorstehende Entfernung.

Sunset

Der Sunset-Header gibt das Datum an, an dem eine Version nicht mehr funktioniert.

Eine kurze Geschichte

Von statischen APIs zur kontinuierlichen Evolution

  1. 2000er

    Versionierte URLs

    Öffentliche APIs übernehmen Pfade im /v1-Stil als Standard.

    2000er
  2. 2012

    Header-Aushandlung

    Einige APIs verschieben die Versionierung in Header, um URLs stabil zu halten.

    12
  3. 2017

    Deprecation-Header

    Standard-Header für Deprecation und Sunset gewinnen an Bedeutung.

    17
  4. 2020er

    Kontinuierliche Evolution

    Additive, abwärtskompatible Änderungen reduzieren die Notwendigkeit von Versionssprüngen.

    2020er
  5. Heute

    Explizite Richtlinien

    Reife APIs dokumentieren genau, was als breaking gilt und wie lange Versionen unterstützt werden.

    Heute

Der vollständige Leitfaden

API Versioning: Alles was Sie wissen müssen

Warum Versionierung wichtig ist

Eine API ist ein Versprechen. Sobald Clients von ihr abhängig sind, führt eine leichtfertige Änderung dazu, dass deren Apps nicht mehr funktionieren – und defekte Clients sind für alle Beteiligten kostspielig. Versioning ist die Methode, mit der Sie Verbesserungen ausliefern und gleichzeitig den Clients einen stabilen Vertrag sowie einen klaren Migrationspfad bieten.

Das Ziel ist nicht, Änderungen zu vermeiden. Es geht darum, Änderungen vorhersehbar zu machen: Wissen, welche Änderungen sicher sind, Versionen konsistent bereitstellen und alte Versionen nach einem kommunizierten Zeitplan ausphasen, anstatt die Nutzer zu überraschen.

Breaking Changes vs. additive Changes

Der Großteil des Ärgers bei der Versionierung entsteht dadurch, dass Änderungen nicht richtig klassifiziert werden. Beginnen Sie mit einer klaren Regel.

Normalerweise sicher (additive):

  • Hinzufügen eines neuen optionalen Feldes zu einer Response.
  • Hinzufügen eines neuen Endpoints.
  • Hinzufügen eines neuen optionalen Request-Parameters.
  • Hinzufügen eines neuen Enum-Werts, sofern Clients unbekannte Werte tolerieren.

Breaking (erfordert eine neue Version):

  • Entfernen oder Umbenennen eines Feldes.
  • Ändern des Typs oder Formats eines Feldes.
  • Umwandlung eines optionalen Parameters in einen Pflichtparameter.
  • Änderung der Bedeutung oder des Standardverhaltens bestehender Funktionen.
  • Änderung von Status-Codes oder Error-Shapes, auf die sich Clients verlassen.

Clients so zu konzipieren, dass sie unbekannte Felder ignorieren, ist der effektivste Weg, um additive Changes sicher zu gestalten. Dokumentieren Sie diese Regel, damit niemand raten muss.

Versionierungsstrategien

Es gibt vier gängige Möglichkeiten, wie Clients eine Version auswählen können.

URI-Versionierung — die Version ist Teil des Pfads.

GET /v1/posts
GET /v2/posts

Sie ist sichtbar, einfach zu routen, leicht zu cachen und unkompliziert im Browser zu testen. Dies ist die häufigste Wahl für öffentliche APIs, auch wenn Puristen argumentieren, dass sich die URL nicht ändern sollte.

Header-Versionierung — ein benutzerdefinierter Header wählt die Version aus.

GET /posts
X-API-Version: 2

Die URLs bleiben stabil, was für das Caching nach Ressourcen vorteilhaft ist, aber die Version ist in Logs, Links und Browser-Tests unsichtbar.

Media-type-Versionierung — die Inhaltsverhandlung (Content Negotiation) wählt die Version aus.

GET /posts
Accept: application/vnd.example.v2+json

Dies ist der am stärksten an REST ausgerichtete Ansatz und lässt sich gut mit Content Negotiation kombinieren, ist jedoch am schwierigsten zu entdecken und zu debuggen.

Query-Parameter?version=2. Einfach, aber leicht zu vergessen und ungünstig für das Caching.

Egal, für welche Variante Sie sich entscheiden: Wenden Sie diese konsistent an und dokumentieren Sie sie. Das Mischen von Strategien ist schlimmer, als eine weniger modische Methode zu wählen.

Deprecation und Sunset

Das Entfernen einer Version sollte ein Prozess sein, kein einmaliges Ereignis.

Deprecation: true
Sunset: Wed, 31 Dec 2026 23:59:59 GMT
Link: </v2/posts>; rel="successor-version"
  • Deprecation kündigt an, dass eine Version oder ein Endpoint entfernt wird.
  • Sunset gibt das genaue Datum an, an dem die Funktion nicht mehr zur Verfügung steht.
  • Link verweist auf den Ersatz.

Kombinieren Sie die Header mit einem Migrationsleitfaden, Einträgen im Changelog und einer direkten Kommunikation an Intensivnutzer. Überwachen Sie anschließend die Nutzung: Wenn kurz vor dem Sunset-Datum immer noch ein signifikanter Anteil des Traffics die alte Version nutzt, verlängern Sie die Frist, anstatt diese Clients funktionsunfähig zu machen.

Versionen parallel betreiben

Die Unterstützung von zwei Versionen bedeutet, dass der Code beide bedienen muss. Gängige Ansätze sind:

  • Versionierte Handler, die auf gemeinsame Services verweisen, sodass die Business-Logik an einem zentralen Ort verbleibt.
  • Adapter, die zwischen der alten und der neuen Repräsentation übersetzen.
  • Feature Flags für den schrittweisen Rollout neuen Verhaltens.
  • Separate Specs pro Version, die zusammen mit der API generiert und veröffentlicht werden.

Halten Sie die Unterschiede zwischen den Versionen gering. Große Forks in der Logik sind schwer zu warten und neigen dazu, mit der Zeit zu stark voneinander abzuweichen.

Änderungen kommunizieren

Versionierung funktioniert nur, wenn die Clients wissen, was passiert.

  • Veröffentlichen Sie ein Changelog und kennzeichnen Sie Breaking Changes deutlich.
  • Pflegen Sie pro Version eine aktuelle OpenAPI spec.
  • Versenden Sie Deprecation Notices in den Headern und, sofern möglich, per E-Mail.
  • Stellen Sie einen Migrationsleitfaden mit Vorher-Nachher-Beispielen bereit.
  • Gewähren Sie ein Support-Zeitfenster, das auf die Release-Zyklen Ihrer Nutzer abgestimmt ist.

Best Practices

  • Klassifizieren Sie jede Änderung vor dem Release als additive oder breaking change.
  • Bevorzugen Sie additive Änderungen; erhöhen Sie die Version nur, wenn es unbedingt notwendig ist.
  • Entscheiden Sie sich für eine Versionierungsstrategie und wenden Sie diese konsistent überall an.
  • Entfernen Sie niemals ein Feld oder einen Endpoint ohne eine entsprechende Deprecation-Phase.
  • Kündigen Sie die Deprecation über Header und ein Sunset-Datum an.
  • Überwachen Sie den Traffic pro Version, bevor Sie eine Version einstellen.
  • Kapseln Sie gemeinsam genutzte Logik hinter versionsspezifischen Adaptern.

Häufige Fehler

  • Clients stillschweigend durch die Änderung der Response-Struktur zu beeinträchtigen.
  • Jede kleinste Änderung zu versionieren und so einen enormen Wartungsaufwand zu schaffen.
  • Unterschiedliche Versionierungsstrategien innerhalb derselben API zu vermischen.
  • Eine Version ohne Vorwarnung oder Migrationspfad zu entfernen.
  • Alte Versionen ohne konkreten Plan ewig weiterlaufen zu lassen.
  • Zu vergessen, die Dokumentation und Spezifikationen für jede Version zu aktualisieren.

Wie geht es weiter?

Versionierung ist entscheidend dafür, wie eine API den Kontakt mit echten Clients übersteht. Setzen Sie auf ein sauberes REST-Design, beschreiben Sie jede Version mit OpenAPI und nutzen Sie HTTP-Header, um die Veralterung (Deprecation) zu kommunizieren. Erstellen Sie anschließend eine kurze Richtlinie für Ihre eigene API: Legen Sie fest, was als Breaking Change gilt und wie lange einzelne Versionen unterstützt werden.

Eine Änderung vornehmen

Das Hinzufügen eines optionalen Feldes ist meist sicher. Das Umbenennen oder Entfernen eines Feldes oder die Änderung eines Typs bricht Clients und erfordert eine neue Version.

Additiv
{
  "id": "42",
  "title": "Hello",
  "tags": []
}
// new optional field,
// existing clients unaffected
Breaking
{
  "id": "42",
  "headline": "Hello"
}
// "title" removed;
// every client breaks

Version auswählen

URI Versioning ist explizit, cachebar und einfach zu testen. Header Versioning hält URLs stabil, ist aber schwerer zu erkennen und zu teilen.

URI
GET /v2/posts
Accept: application/json
Header
GET /posts
Accept: application/vnd.example.v2+json

Abwägungen

Sollte man überhaupt versionieren?

Versionierung ist ein Sicherheitsnetz, kein Ziel. Entwirf zuerst auf Kompatibilität hin und greife nur dann zu einer neuen Version, wenn eine Änderung Clients wirklich bricht.

Strengths

  • Schützt bestehende Clients

    Eine neue Version lässt dich brechende Verbesserungen ausliefern, während alte Clients weiterlaufen, bis sie nach ihrem eigenen Zeitplan migrieren.

  • Erzwingt eine klare Richtlinie

    Die Entscheidung, was als brechend gilt, macht den Vertrag explizit und hält Teams bei der Kompatibilität ehrlich.

  • Ermöglicht geplantes Auslaufen

    Deprecation- und Sunset-Header machen das Entfernen einer alten Version zu einem kommunizierten, überwachten Plan.

Trade-offs

  • Jede Version kostet

    Jede unterstützte Version vervielfacht Tests, Dokumentation und Wartung, daher müssen alte nach Plan auslaufen.

  • Zersplittert das Ökosystem

    Clients, Dokumentation und SDKs verteilen sich über Versionen, und Supportfragen werden schwerer zu beantworten.

  • Oft vermeidbar

    Additive, abwärtskompatible Änderungen decken die meisten Bedürfnisse, sodass Versionierung zur Gewohnheit werden kann, die echter Brüche vorauseilt.

Häufig gestellte Fragen

Häufig gestellte Fragen

Keep learning

Related topics from the roadmap.

$ Lernen Sie jetzt

Bereit, API Versioning zu lernen?

Unser interaktives Tutorial führt Sie Schritt für Schritt durch API Versioning — mit Quizzen und echtem Code, den Sie im Browser ausführen können.