409 Conflict: what it means and what to do

A 409 means your request was fine in form but clashes with the current state of the thing you aimed it at. The official definition in RFC 9110 is that the request could not be completed due to a conflict with the current state of the target resource. The everyday versions are editing a document someone else just changed, creating an account with a username that was taken in the meantime, or uploading a file whose version no longer matches the server's copy.

If you are just visiting a site or using an app

  1. Reload to get the current version first. Most conflicts happen because you were working from a stale copy. Refresh, see what the resource looks like now, then redo your change on top of it.
  2. Copy your work somewhere safe before reloading. If you typed something long into a form or editor, save the text aside first. Reloading can discard it.
  3. Check for duplicates. If the 409 appeared while creating something, an account, a listing, a filename, check whether it already exists. Creating it a second time will keep conflicting.
  4. In cloud storage and sync tools, expect a conflict copy. When two devices change the same file, services often keep both versions rather than overwrite. Look for a file marked as a conflicted copy.

If it is your site or your API

  1. Use it for genuine state conflicts only. Version mismatches, unique-constraint collisions, and edit races are 409 territory. Plain validation failures belong in 400 or 422.
  2. Say what conflicted. The response body should name the field or the version expectation that failed, so the client can resolve it instead of just retrying blindly.
  3. Offer optimistic locking deliberately. If clients send a version or an If-Match header, a 409 (or 412) on a stale version is the correct, honest answer, and far better than a silent overwrite.
  4. Make retries idempotent where you can. Some 409 storms are just clients retrying a create that already succeeded.
Visitors: a 409 protects your data from being silently overwritten, it is the system working as designed. Owners: a 409 without an explanation in the body is a support ticket generator.

Common questions

Is a 409 error dangerous? No. It means the server refused to apply a change because it conflicted with the current state of the resource. Nothing was overwritten or deleted. Reloading to see the current state, then reapplying your change, is the intended path.

What is the difference between 409 and 412? Both report a state mismatch. A 412 Precondition Failed means a conditional header the client sent, such as If-Match, evaluated to false. A 409 is the general state conflict, used when the clash is detected by the application rather than by a header condition.

Related errors

412 Precondition Failed · 422 Unprocessable Content · 400 Bad Request