API-Versionierung für Mobile Apps: Endpunkte sicher weiterentwickeln
API-Versionierung für Mobile Apps, erklärt mit einfachem Rollout-Plan, rückwärtskompatiblen Änderungen und Deprecation-Schritten, damit ältere App-Versionen weiter funktionieren.

Warum API-Änderungen mobile Nutzer brechen
Mobile Apps werden nicht alle gleichzeitig aktualisiert. Selbst wenn Sie heute einen Fix ausrollen, verwenden viele Nutzer noch Tage oder Wochen eine ältere Version. Manche schalten Auto-Updates aus. Manche haben wenig Speicher. Manche öffnen die App einfach selten. App-Store-Prüfzeiten und gestaffelte Releases verzögern das zusätzlich.
Diese Lücke ist wichtig, weil Ihr Backend in der Regel schneller ändert als mobile Clients. Wenn der Server einen Endpunkt ändert und die alte App ihn weiterhin aufruft, kann die App kaputtgehen, obwohl sich auf dem Gerät des Nutzers nichts geändert hat.
Ausfälle zeigen sich selten als klare Fehlermeldung. Meistens sehen sie wie alltägliche Produktprobleme aus:
- Login oder Registrierung schlägt nach einem Backend-Release fehl
- Listen wirken leer, weil ein Feld umbenannt oder verschoben wurde
- Die App stürzt ab, wenn ein erwarteter Wert fehlt
- Zahlungen schlagen fehl, weil die Validierung strenger wurde
- Features verschwinden still, weil sich die Antwortstruktur änderte
Der Zweck der Versionierung ist einfach: Sie wollen Server-Verbesserungen weiter ausrollen, ohne alle Nutzer sofort zum Update zu zwingen. Behandeln Sie Ihre API wie einen langfristigen Vertrag. Neue App-Versionen sollten mit dem neuen Server-Verhalten arbeiten, und ältere Versionen sollten lange genug funktionieren, um reale Update-Zyklen abzudecken.
Bei den meisten Consumer-Apps müssen Sie erwarten, mehrere App-Versionen gleichzeitig zu unterstützen. Interne Apps kommen manchmal schneller voran, aber auch dort ist es selten instant. Für Überlappungen zu planen, sorgt dafür, dass gestufte Rollouts ruhig bleiben, statt jeden Backend-Release in einen Support-Alarm zu verwandeln.
Was „kompatibel“ für einen API-Vertrag bedeutet
Ein API-Vertrag ist das Versprechen zwischen Ihrer mobilen App und Ihrem Server: welche URL aufzurufen ist, welche Eingaben akzeptiert werden, wie die Antwort aussieht und was jedes Feld bedeutet. Wenn die App auf dieses Versprechen angewiesen ist und der Server es ändert, merken das Nutzer als Abstürze, fehlende Daten oder nicht mehr funktionierende Features.
Eine Änderung ist kompatibel, wenn ältere App-Versionen die API weiter ohne Codeänderungen nutzen können. Praktisch bedeutet das: der Server versteht weiterhin, was alte Apps senden, und liefert Antworten, die alte Apps parsen können.
Eine schnelle Unterscheidung zwischen sicheren und riskanten Änderungen:
- Breaking-Änderungen: Entfernen oder Umbenennen eines Feldes, Typänderung (Zahl zu String), ein optionales Feld verpflichtend machen, das Fehlerformat ändern, Validierung so verschärfen, dass alte Apps die Anforderungen nicht mehr erfüllen.
- Meist sichere Änderungen: Ein neues optionales Feld hinzufügen, einen neuen Endpunkt hinzufügen, alte und neue Request-Formate parallel akzeptieren, neue Enum-Werte ergänzen (nur wenn die App unbekannte Werte als „other“ behandelt).
Kompatibilität braucht auch einen End-of-Life-Plan. Altes Verhalten zu entfernen ist in Ordnung, sollte aber terminiert sein (z. B. „behalte v1 für 90 Tage nach v2“) damit Sie sich weiterentwickeln können, ohne Nutzer zu überraschen.
Gängige Versionierungsansätze und ihre Kompromisse
Versionierung bedeutet, älteren Builds einen stabilen Vertrag zu geben, während Sie fortschreiten. Es gibt einige gängige Ansätze, und jeder verlagert Komplexität an einen anderen Ort.
URL-Versionierung
Die Version im Pfad zu platzieren (z. B. /v1/ und /v2/) ist am leichtesten sichtbar und zu debuggen. Es funktioniert auch gut mit Caching, Logging und Routing, weil die Version Teil der URL ist. Der Nachteil: Teams pflegen oft länger parallel laufende Handler als erwartet, selbst wenn der Unterschied klein ist.
Header-basierte Versionierung
Bei Header-Versionierung sendet der Client eine Version im Header (z. B. im Accept-Header oder in einem benutzerdefinierten Header). Die URLs bleiben sauber, und Sie können die API weiterentwickeln, ohne jeden Pfad zu ändern. Nachteilig ist die Sichtbarkeit: Proxies, Logs und Menschen übersehen die Version leichter, und mobile Clients müssen sicherstellen, dass der Header bei jeder Anfrage gesetzt wird.
Query-Parameter-Versionierung
Query-Versionierung (z. B. ?v=2) wirkt einfach, wird aber schnell unordentlich. Parameter landen in Bookmarks, Analytics-Tools und Scripts, und Sie können mehrere „Versionen“ haben, ohne klare Verantwortung.
Kurzvergleich:
- URL-Versionierung: am einfachsten zu prüfen, kann aber lang-lebige parallele APIs erzeugen
- Header-Versionierung: saubere URLs, aber schwerer zu debuggen
- Query-Versionierung: schnell zu starten, leicht zu missbrauchen
Feature-Flags sind ein anderes Werkzeug: Sie lassen Verhalten hinter demselben Vertrag ändern (z. B. einen neuen Ranking-Algorithmus), ohne eine neue API-Version zu erstellen. Sie ersetzen Versionierung nicht, wenn sich Request- oder Response-Formen ändern müssen.
Wählen Sie einen Ansatz und bleiben Sie dabei. Konsistenz ist wichtiger als die „perfekte“ Wahl.
Faustregeln für rückwärtskompatible Änderungen
Die sicherste Denkweise: ältere Clients sollten weiter funktionieren, auch wenn sie nie von Ihrer neuen Funktion erfahren. Das bedeutet meist: Dinge hinzufügen, nicht vorhandene Dinge ändern.
Bevorzugen Sie additive Änderungen: neue Felder, neue Endpunkte, neue optionale Parameter. Wenn Sie etwas hinzufügen, machen Sie es auf Server-Seite wirklich optional. Schickt eine ältere App es nicht, muss sich der Server genau wie vorher verhalten.
Einige Gewohnheiten verhindern die meisten Ausfälle:
- Felder hinzufügen, aber den Typ oder die Bedeutung bestehender Felder nicht ändern.
- Fehlende Eingaben als normal behandeln und sinnvolle Defaults nutzen.
- Unbekannte Request-Felder ignorieren, damit alte und neue Clients koexistieren können.
- Fehlerformate stabil halten. Müssen sie geändert werden, versionieren Sie das Fehler-Payload.
- Muss sich das Verhalten ändern, führen Sie einen neuen Endpunkt oder eine neue Version ein, statt eine stille Anpassung.
Vermeiden Sie es, die Bedeutung eines bestehenden Feldes ohne Version-Bump zu ändern. Wenn z. B. status=1 früher „paid“ bedeutete und Sie es zu „authorized“ umdeuten, treffen alte Apps falsche Entscheidungen und Sie merken es vielleicht erst, wenn Nutzer sich beschweren.
Umbenennungen und Entfernen brauchen einen Plan. Das sicherste Muster ist, das alte Feld zu behalten und das neue parallel hinzuzufügen. Füllen Sie beide Felder in Antworten, akzeptieren Sie beide in Requests und protokollieren Sie, wer noch das alte Feld verwendet. Entfernen Sie das alte Feld erst nach Ablauf des Deprecation-Fensters.
Eine kleine, aber wirkungsvolle Gewohnheit: Wenn Sie eine neue, verpflichtende Geschäftsregel einführen, machen Sie den Client nicht am ersten Tag dafür verantwortlich. Legen Sie die Regel zunächst auf dem Server mit einem Default ab, und verlangen Sie später vom Client den neuen Wert, sobald die meisten Nutzer aktualisiert haben.
Setzen Sie eine einfache Versionierungs- und Deprecation-Policy
Versionierung funktioniert am besten, wenn die Regeln langweilig und niedergeschrieben sind. Halten Sie die Policy kurz genug, damit Produkt-, Mobile- und Backend-Teams sie tatsächlich befolgen.
Beginnen Sie mit Support-Fenstern. Entscheiden Sie, wie lange Sie ältere API-Versionen nach dem Release einer neuen Version laufen lassen (z. B. 6–12 Monate), plus Ausnahmen (Sicherheitsprobleme, rechtliche Änderungen).
Definieren Sie dann, wie Sie Clients vor einem Bruch warnen. Wählen Sie ein Deprecation-Signal und nutzen Sie es überall. Gängige Optionen sind ein Response-Header wie Deprecation: true mit einem Abschaltdatum, oder ein JSON-Feld wie "deprecation": {"will_stop_working_on": "2026-04-01"} in ausgewählten Antworten. Wichtig ist Konsistenz: Clients können es erkennen, Dashboards melden es und Support-Teams können es erklären.
Setzen Sie eine minimal unterstützte App-Version und seien Sie explizit, wie Sie durchsetzen. Vermeiden Sie überraschende Hard-Blocks. Ein praktischer Weg ist:
- Erst eine weiche Warnung zurückgeben (z. B. ein Feld, das ein In-App-Update-Popup auslöst).
- Erzwingen erst nach einem kommunizierten Stichtag.
Wenn Sie Requests blockieren, geben Sie ein klares Fehler-Payload mit einer menschenlesbaren Nachricht und einem maschinenlesbaren Code zurück.
Schließlich entscheiden Sie, wer Breaking-Changes genehmigen kann und welche Dokumentation nötig ist. Halten Sie es einfach:
- Eine verantwortliche Person genehmigt Breaking-Changes.
- Eine kurze Änderungsnotiz erklärt, was sich geändert hat, wer betroffen ist und wie die Migration aussieht.
- Ein Testplan enthält mindestens eine ältere App-Version.
- Ein Rentierungsdatum wird gesetzt, sobald die Deprecation beginnt.
Schritt-für-Schritt-Rollout-Plan, der alte Apps funktionsfähig hält
Mobile Nutzer aktualisieren nicht am ersten Tag. Der sicherste Weg ist, eine neue API auszurollen und die alte unverändert zu lassen, dann den Traffic schrittweise zu verschieben.
Definieren Sie zuerst, was v2 ändert, und sperren Sie das Verhalten von v1. Behandeln Sie v1 wie ein Versprechen: gleiche Felder, gleiche Bedeutungen, gleiche Fehlercodes. Wenn v2 eine andere Antwortform braucht, passen Sie v1 nicht still an, um sie zu matchen.
Betreiben Sie v2 dann parallel. Das kann separate Routen bedeuten (z. B. /v1/... und /v2/...) oder separate Handler hinter demselben Gateway. Halten Sie gemeinsame Logik an einem Ort, aber trennen Sie die Verträge, damit ein v2-Refactor v1 nicht versehentlich ändert.
Aktualisieren Sie anschließend die Mobile-App, sodass sie v2 bevorzugt. Bauen Sie eine einfache Fallback-Strategie ein: falls v2 „not supported“ (oder einen bekannten Fehler) zurückgibt, versuchen Sie v1 erneut. Das hilft bei gestaffelten Releases und in realen Netzen mit Ausreißern.
Nach Release: Adoption und Fehler überwachen. Nützliche Checks sind:
- Anfragevolumen v1 vs v2 nach App-Version
- Fehlerquote und Latenz für v2
- Parsing-Fehler in Antworten
- Abstürze in Networking-Bildschirmen
Ist v2 stabil, fügen Sie klare Deprecation-Warnungen für v1 hinzu und kommunizieren Sie einen Zeitplan. Schalten Sie v1 erst ab, wenn die Nutzung unter eine für Sie akzeptable Schwelle gefallen ist (z. B. unter 1–2% über mehrere Wochen).
Beispiel: Sie ändern GET /orders, um Filtering und neue Status zu unterstützen. v2 fügt status_details hinzu, während v1 gleich bleibt. Die neue App ruft v2 auf, fällt aber bei einem Edge-Case auf v1 zurück und zeigt trotzdem die Bestellliste an.
Umsetzungstipps auf Server-Seite
Die meisten Rollout-Ausfälle passieren, weil die Versionsbehandlung über Controller, Helper und DB-Code verstreut ist. Treffen Sie die Entscheidung „Welche Version ist diese Anfrage?“ an einem Ort und halten Sie den Rest der Logik vorhersehbar.
Version-Routing hinter ein einzelnes Gate legen
Wählen Sie ein Signal (URL-Segment, Header oder App-Build-Nummer) und normalisieren Sie es früh. Routen Sie im Anschluss zum richtigen Handler in einem Modul oder Middleware, damit jede Anfrage denselben Pfad folgt.
Ein praktisches Muster:
- Parsen Sie die Version einmal (und loggen Sie sie).
- Mappen Sie Versionen auf einen Handler (v1, v2, ...) in einem Registry.
- Halten Sie gemeinsame Utilities versionsagnostisch (Datumparsing, Auth-Checks), nicht Logik zur Antwortform.
Seien Sie vorsichtig beim Teilen von Code zwischen Versionen. Ein Bugfix in gemeinsamem Code für v2 kann versehentlich v1-Verhalten ändern. Wenn Logik Ausgabe-Felder oder Validierungsregeln beeinflusst, versionieren Sie sie oder decken Sie sie mit version-spezifischen Tests ab.
Datenänderungen kompatibel während des Rollouts halten
Datenbank-Migrationen müssen für beide Versionen gleichzeitig funktionieren. Spalten zuerst hinzufügen, bei Bedarf backfillen und Constraints erst später entfernen oder verschärfen. Vermeiden Sie Umbenennungen oder Bedeutungsänderungen mitten im Rollout. Bei Formatwechseln schreiben Sie für eine Übergangszeit beide Formate, bis die meisten Clients umgestellt haben.
Machen Sie Fehler vorhersehbar. Ältere Apps behandeln unbekannte Fehler oft als „etwas ist schiefgelaufen“. Verwenden Sie konsistente Statuscodes, stabile Fehler-IDs und kurze Nachrichten, die dem Client helfen zu entscheiden, was zu tun ist (erneut versuchen, neu authentifizieren, Update-Prompt zeigen).
Schützen Sie sich gegen fehlende Felder, die ältere Apps nicht senden. Nutzen Sie sichere Defaults und validieren Sie mit klaren, stabilen Fehlerdetails.
Mobile-App-Überlegungen, die Versionierung beeinflussen
Da Nutzer wochenlang auf alten Builds bleiben können, muss Versionierung davon ausgehen, dass mehrere Client-Versionen gleichzeitig Ihre Server treffen.
Ein großer Gewinn ist Toleranz auf Client-Seite. Wenn die App beim Hinzufügen eines Feldes crasht oder beim Parsen fehlschlägt, merken Sie das als „zufällige“ Rollout-Bugs.
- Ignorieren Sie unbekannte JSON-Felder.
- Behandeln Sie fehlende Felder als normal und nutzen Sie Defaults.
- Gehen Sie sicher mit null-Werten um (Felder können während Migrationen nullable werden).
- Verlassen Sie sich nicht auf die Reihenfolge in Arrays, sofern der Vertrag sie nicht garantiert.
- Halten Sie Fehlerbehandlung nutzerfreundlich (ein Retry-Zustand ist besser als ein leerer Bildschirm).
Netzwerkverhalten zählt ebenfalls. Während eines Rollouts können kurzfristig verschiedene Server-Versionen hinter Load Balancern oder Caches liegen, und mobile Netze verstärken kleine Probleme.
Wählen Sie klare Timeout- und Retry-Regeln: kurze Timeouts für Leseaufrufe, etwas längere für Uploads und begrenzte Retries mit Backoff. Machen Sie Idempotenz zur Norm für Create- oder Zahlungsaufrufe, damit ein Retry nichts doppelt auslöst.
Auth-Änderungen sind der schnellste Weg, ältere Apps auszusperren. Wenn Sie Token-Formate, erforderliche Scopes oder Session-Regeln ändern, halten Sie ein Überlappungsfenster ein, in dem alte und neue Tokens funktionieren. Müssen Keys oder Claims rotiert werden, planen Sie eine gestaffelte Migration, keinen Tageswechsel.
Senden Sie App-Metadaten mit jeder Anfrage (z. B. App-Version und Plattform). So können Sie gezielte Warnungen zurückgeben, ohne die API komplett zu verzweigen.
Monitoring und gestufte Rollouts ohne Überraschungen
Ein gestufter Rollout funktioniert nur, wenn Sie sehen können, was verschiedene App-Versionen tun. Das Ziel ist einfach: wissen, wer noch ältere Endpunkte nutzt, und Probleme erkennen, bevor sie alle erreichen.
Beginnen Sie damit, die Nutzung nach API-Version täglich zu verfolgen. Zählen Sie nicht nur Gesamt-Anfragen. Tracken Sie aktive Geräte und analysieren Sie Schlüsselendpunkte wie Login, Profil und Zahlungen. So sehen Sie, ob eine alte Version noch „lebt“, selbst wenn der Gesamttraffic klein aussieht.
Beobachten Sie dann Fehler nach Version und Typ. Ein Anstieg an 4xx deutet oft auf einen Vertragsmismatch hin (required field geändert, Enum-Werte verschoben, Auth-Regeln verschärft). Ein Anstieg an 5xx deutet meist auf Server-Regressionen hin (schlechtes Deploy, langsame Queries, Ausfälle von Dependencies). Beide nach Version zu sehen hilft, schnell die richtige Lösung zu wählen.
Nutzen Sie gestaffelte Rollouts in App-Stores, um die Blast-Radius zu begrenzen. Erhöhen Sie die Reichweite schrittweise und beobachten Sie nach jedem Schritt dieselben Dashboards (z. B. nach 5 %, 25 %, 50 %). Zeigt die neueste Version Probleme, stoppen Sie den Rollout, bevor es zum Ausfall kommt.
Halten Sie Rollback-Trigger vorher niedergeschrieben, nicht während eines Vorfalls entschieden. Gängige Trigger sind:
- Fehlerquote über einem fixen Schwellenwert für 15–30 Minuten
- Login-Erfolgsrate sinkt (oder Token-Refresh-Fehler steigen)
- Zahlungsausfälle steigen (oder Checkout-Timeouts zunehmen)
- Anstieg an Support-Tickets, die an eine spezifische Version gebunden sind
- Latenzanstieg an einem kritischen Endpunkt
Pflegen Sie ein kurzes Incident-Playbook für version-bezogene Ausfälle: wer wird gerufen, wie deaktiviert man ein riskantes Flag, welche Server-Release wird zurückgerollt und wie verlängert man das Deprecation-Fenster, wenn ältere Clients noch aktiv sind.
Beispiel: Ein Endpunkt während eines Real-Release weiterentwickeln
Checkout ist ein klassischer Real-World-Change. Sie starten mit einem einfachen Flow, fügen später einen neuen Zahlungsschritt (z. B. stärkere Authentifizierung) hinzu und benennen Felder um, damit sie zur Business-Terminologie passen.
Angenommen, Ihre Mobile-App ruft POST /checkout auf.
Was in v1 bleibt vs. was sich in v2 ändert
In v1 behalten Sie die bestehende Request-Form und das Verhalten, damit ältere App-Versionen Zahlungen abschließen können. In v2 führen Sie den neuen Flow und klarere Namen ein.
- v1 behält:
amount,currency,card_tokenund eine einzelne Antwort wiestatus=paid|failed. - v2 fügt hinzu:
payment_method_id(als Ersatz fürcard_token) und ein Feldnext_action, damit die App einen zusätzlichen Schritt handhaben kann (verify, retry, redirect). - v2 benennt um:
amountzutotal_amountundcurrencyzubilling_currency.
Ältere Apps funktionieren weiter, weil der Server sichere Defaults anwendet. Kennt eine v1-Request next_action nicht, schließt der Server die Zahlung, wenn möglich, und liefert ein v1-ähnliches Ergebnis. Ist der neue Schritt erforderlich, bekommt v1 einen klaren, stabilen Fehlercode wie requires_update statt einer verwirrenden generischen Fehlermeldung.
Adoption, Retirement und Rollback
Verfolgen Sie die Adoption nach Version: welcher Anteil der Checkout-Calls trifft v2, wie sind die Fehlerquoten und wie viele Nutzer laufen noch Builds, die nur v1 unterstützen. Ist v2 über mehrere Wochen konstant hoch (z. B. 95%+), wählen Sie ein v1-Rentierungsdatum und kommunizieren es (Release-Notes, In-App-Messages).
Geht nach dem Launch etwas schief, sollte Rollback langweilig sein:
- Route mehr Traffic zurück auf v1-Verhalten.
- Deaktivieren Sie den neuen Zahlungsschritt per Server-Flag.
- Akzeptieren Sie weiterhin beide Feldsets und loggen Sie, was Sie automatisch konvertieren mussten.
Häufige Fehler, die stille Ausfälle verursachen
Die meisten Mobile-API-Fehler sind nicht laut. Der Request gelingt, die App läuft weiter, aber Nutzer sehen fehlende Daten, falsche Summen oder nicht reagierende Buttons. Diese Probleme sind schwer zu bemerken, weil sie oft ältere App-Versionen während eines gestuften Rollouts treffen.
Häufige Ursachen:
- Felder ändern oder entfernen (oder deren Typ ändern) ohne klaren Versionsplan.
- Ein neues Request-Feld sofort verpflichtend machen, sodass ältere Apps abgewiesen werden.
- Eine Datenbank-Migration ausrollen, die davon ausgeht, dass nur die neue App existiert.
- v1 nach Installationen aus dem Store einstellen, statt nach aktiver Nutzung zu messen.
- Hintergrund-Jobs und Webhooks vergessen, die weiterhin alte Payloads senden.
Ein konkretes Beispiel: Ihr Antwortfeld total war ein String ("12.50") und Sie ändern es zu einer Zahl (12.5). Neue Apps sehen kein Problem. Ältere Apps könnten es als Null behandeln, ausblenden oder nur auf bestimmten Bildschirmen abstürzen. Ohne das Monitoring von Client-Errors nach App-Version kann das unbemerkt bleiben.
Kurze Checkliste und nächste Schritte
Versionierung geht weniger um clevere Endpunkt-Namen als um wiederholte Sicherheitschecks bei jedem Release.
Schnelle Checks vor dem Release
- Änderungen additiv halten. Entfernen oder umbenennen Sie keine Felder, die ältere Apps lesen.
- Bieten Sie sichere Defaults, damit fehlende neue Felder dem alten Flow entsprechen.
- Halten Sie Fehlerantworten stabil (Status + Form + Bedeutung).
- Gehen Sie sorgfältig mit Enums um und ändern Sie nicht die Bedeutung existierender Werte.
- Replayen Sie einige echte Requests aus älteren App-Versionen und prüfen Sie, ob Antworten weiterhin parsen.
Schnelle Checks während des Rollouts und vor der Abschaltung
- Tracken Sie Adoption nach App-Version. Sie wollen eine klare Kurve von v1 zu v2, keinen flachen Verlauf.
- Beobachten Sie Fehlerquoten nach Version. Ein Spike bedeutet oft, dass Parsing oder Validierung ältere Clients gebrochen hat.
- Beheben Sie zuerst den am meisten fehlschlagenden Endpunkt, dann weiten Sie den Rollout aus.
- Schalten Sie nur ab, wenn die aktive Nutzung wirklich niedrig ist, und kommunizieren Sie das Datum.
- Entfernen Sie Fallback-Code zuletzt, nach Ablauf des Rentierungsfensters.
Schreiben Sie Ihre Versionierungs- und Deprecation-Policy auf eine Seite, und machen Sie die Checkliste zu einem Release-Gate, dem Ihr Team bei jedem Mal folgt.
Wenn Sie interne Tools oder kundenorientierte Apps mit einer No-Code-Plattform bauen, hilft es ebenfalls, die API als Vertrag mit klarem Deprecation-Fenster zu behandeln. Für Teams, die AppMaster (appmaster.io) nutzen, ist es oft einfacher, v1 und v2 nebeneinander zu betreiben, weil Sie Backend und Client-Apps neu generieren können, während ältere Verträge während des Rollouts weiterlaufen.
FAQ
Mobile Nutzer aktualisieren nicht alle gleichzeitig, daher rufen ältere App-Builds weiterhin Ihr Backend auf, nachdem Sie Änderungen deployed haben. Wenn Sie einen Endpunkt, die Validierung oder die Antwortstruktur ändern, können diese älteren Builds nicht mit der Änderung umgehen und scheitern — oft als leere Bildschirme, Abstürze oder fehlgeschlagene Zahlungen.
„Rückwärtskompatibel“ bedeutet, dass eine ältere App dieselben Anfragen weiter senden kann und Antworten erhält, die sie korrekt parsen und nutzen kann, ohne Codeänderungen. Das einfachste Modell: Ihre API ist ein Vertrag — Sie können neue Fähigkeiten hinzufügen, aber Sie sollten nicht die Bedeutung bestehender Felder und Verhaltensweisen für vorhandene Clients verändern.
Eine Änderung ist breaking, wenn sie etwas verändert, auf das eine bestehende App angewiesen ist — etwa Felder entfernen/umbenennen, den Typ eines Feldes ändern, Validierung so verschärfen, dass alte Requests fehlschlagen, oder das Fehler-Payload-Format ändern. Wenn eine ältere App die Antwort nicht parsen kann oder die Anfrageanforderungen nicht erfüllt, ist das ein Bruch, selbst wenn der Server technisch funktioniert.
URL-Versionierung ist oft die einfachste Default-Wahl, weil die Version in Logs, Debugging-Tools und im Routing sichtbar ist und man sie schwer „vergisst“. Header-basierte Versionierung funktioniert ebenfalls, ist aber leichter zu übersehen beim Troubleshooting und erfordert, dass jeder Client-Request den Header korrekt setzt.
Wählen Sie ein klares Support-Fenster, das zum realen Update-Verhalten passt, und halten Sie sich daran; viele Teams wählen Monate statt Tage. Wichtig ist ein veröffentlichter Rentierungszeitpunkt und die Messung aktiver Nutzung, damit Sie nicht raten, wann es sicher ist, eine ältere Version abzuschalten.
Nutzen Sie ein konsistentes Deprecation-Signal, damit Clients und Dashboards es zuverlässig erkennen können — zum Beispiel einen stabilen Response-Header oder ein kleines JSON-Feld mit einem Rentierungsdatum. Halten Sie es einfach und vorhersehbar, damit Support und Produktteams es ohne tiefes Eintauchen erklären können.
Bevorzugen Sie additive Änderungen: neue optionale Felder oder neue Endpunkte, und lassen Sie alte Felder unverändert weiterarbeiten. Bei Umbenennungen betreiben Sie beide Felder parallel für eine Weile und füllen beide aus, damit ältere Apps nicht plötzlich Daten verlieren, während neue Apps auf das neue Feld umstellen.
Migrationen sollten so gestaltet sein, dass beide API-Versionen gleichzeitig funktionieren: Zuerst Spalten hinzufügen, bei Bedarf backfillen und Constraints erst später verschärfen oder alte Felder entfernen. Vermeiden Sie das Umbenennen oder Bedeutungsändern mitten im Rollout — sonst schreibt eine Version Daten, die die andere nicht lesen kann.
Machen Sie die App tolerant: unbekannte JSON-Felder ignorieren, fehlende Felder mit sinnvollen Defaults behandeln und Null-Werte ohne Absturz verarbeiten. Das reduziert „zufällige“ Rollout-Fehler, wenn der Server Felder hinzufügt oder Antworten während gestufter Deploys kurz variieren.
Verfolgen Sie Nutzung und Fehler nach API- und App-Version, besonders bei Login und Zahlungen, und weiten Sie gestufte Rollouts nur aus, wenn die Daten stabil aussehen. Ein sicherer Rollout sperrt v1-Verhalten ein, betreibt v2 parallel und bewegt Clients schrittweise mit klarer Fallback-Strategie, bis die Adoption hoch genug ist, um v1 abzuschalten.


