HTTP 409 Conflict

The request is valid but clashes with the current state — a duplicate, a seat already taken, a state transition that is not allowed from here.

Defined in RFC 9110 §15.5.10 — 409 Conflict · MDN reference

Where you meet HTTP 409 in production

Double-booked seats, duplicate usernames, deleting a record that something else still points at, cancelling an order that already shipped, and any state machine asked to make a transition it does not have.

Why you would test it

A 409 is a state problem, not a transport problem, so blind retries make it worse. Test that your retry policy distinguishes it from a 503.

What your client should do about a 409

A 409 is about state, so a blind retry usually fails identically — the seat is still taken. Re-read the current state, decide whether the operation still makes sense, and only then try again. This is the status where an automatic retry policy does the most damage for the least benefit.

409 versus the codes it gets confused with

Endpoints that return 409

46 endpoints in this playground answer with 409. Every one is free, needs no signup, and can be called from the browser or with curl.

…and 21 more endpoints across the catalog.

Questions about HTTP 409

Should a 409 body say what conflicted?
Yes, and specifically enough for the client to resolve it — "seat 14A is taken" beats "conflict".
Is a duplicate POST a 409?
409 if the duplicate is genuinely unacceptable. If the caller sent an Idempotency-Key, replaying the original response is friendlier.

Other client error codes

All HTTP status codes · All 39 mock REST APIs · Getting started guide

Last updated