HTTP 409 Conflict

Eine Zustandskollision: Die Anfrage ist gültig, aber die Ressource hat sich so verändert, dass sie gerade nicht angewendet werden kann.

Was HTTP 409 bedeutet

HTTP 409 Conflict bedeutet, dass der Server die Anfrage verstanden hat, sie aber nicht anwenden kann, weil sie dem aktuellen Zustand der Zielressource widerspricht. Das klassische Beispiel ist ein Bearbeitungskonflikt: Zwei Clients haben dasselbe Dokument geladen, beide speichern, und das zweite Speichern würde das erste stillschweigend überschreiben.

Anders als bei 400 ist die Anfrage selbst wohlgeformt — sendest du sie später unverändert erneut, kann sie sogar erfolgreich sein. Der Response-Body sollte erklären, was genau kollidiert, damit der Client (oder Nutzer) das Problem lösen und es erneut versuchen kann.

Häufige Ursachen von 409-Fehlern

  • Ein Bearbeitungskonflikt: Die Ressource wurde von jemand anderem verändert, seit der Client sie zuletzt abgerufen hat (oft sichtbar über ETag / If-Match).
  • Das Erstellen einer bereits existierenden Ressource — doppelter Benutzername, doppelte E-Mail, Slug oder Dateiname.
  • Ein Versionskonflikt beim optimistic locking: Die übermittelte Versionsnummer ist veraltet.
  • Das Löschen oder Verschieben einer Ressource, die abhängige Objekte hat, die der Server nicht verwaisen lassen will.
  • Gleichzeitige Workflow-Schritte, die in falscher Reihenfolge angewendet werden (z. B. das Genehmigen einer bereits stornierten Bestellung).

So behebst du es als Entwickler

  • Lies den Response-Body — eine gute API nennt das konfliktverursachende Feld oder die erwartete aktuelle Version.
  • Rufe die Ressource erneut ab, wende deine Änderung auf dem aktuellen Stand erneut an und sende sie erneut.
  • Verwende bedingte Anfragen (If-Match mit ETags), damit Konflikte zuverlässig erkannt werden, statt Daten zu überschreiben.
  • Lege bei Konflikten durch doppelte Erstellung im Voraus die Idempotenz fest: Gib die vorhandene Ressource zurück oder liefere 409 mit einem Verweis darauf.

Beispielantwort

HTTP/1.1 409 Conflict
Content-Type: application/json

{"error":"conflict","message":"document was modified by another user","current_version":42}

FAQ

Was ist der Unterschied zwischen 409 und 400?

400 bedeutet, dass die Anfrage selbst fehlerhaft oder ungültig ist. 409 bedeutet, dass die Anfrage in Ordnung ist, aber mit dem aktuellen Zustand der Ressource kollidiert — ein erneuter Versuch nach Lösung des Konflikts kann erfolgreich sein.

Wann sollte eine API 409 statt 422 zurückgeben?

Verwende 422 für Validierungsfehler innerhalb des Payloads und 409 für Kollisionen mit bestehendem serverseitigem Zustand, etwa Duplikate oder veraltete Versionen.

Wie helfen ETags, 409-Fehler zu vermeiden?

Der Client sendet If-Match mit dem zuletzt gesehenen ETag; der Server wendet die Änderung nur an, wenn die Ressource unverändert ist, andernfalls liefert er 409 (oder 412) statt zu überschreiben.