Reference guide · http-status · Published 2026-08-16 · 3 min read

HTTP 409 conflict

HTTP 409 conflict meaning for concurrent writes and versioned APIs, with conditional request patterns and the right client response.

Flat editorial illustration showing a lantern-style status readout with a neat row of stacked directory rails, each rail marked with an abstract tally.
Illustration: this article at a glance.

What 409 means

409 Conflict tells the client: I understood your request, but it cannot apply to the current state of the resource, because that state has changed underneath you, or your request changes it in a conflicting way. The clear case: your PUT /topics/123 references a version that someone else already modified. The server deliberately refuses on the spot rather than overwrite silently.

Editorial close-up illustration showing a lantern-style status readout with a neat row of stacked directory rails, each rail marked with an abstract tally.
Illustration: a closer look at the technique described above.

Distinguish: 400 is a malformed request; 404 is a missing resource; 412 is a preconditions failure of a conditional-request header. A 409 is the "your data and mine disagree about the current state" answer, and it is the standard signal from a concurrency guard.

Where it appears in practice

The server side: what to return with it

If you control the API, return the conflict with:

A helper pattern is to make the client send its version up front:

PUT /topics/42
If-Match: "v8"

The server compares the tag with its current v9, returns 409 Conflict when they differ, and the client knows it must re-fetch. This is the standard optimistic concurrency flow.

The client side: respond, do not retry-hammer

When you receive 409:

  1. Do not blindly retry the same request. The data is stale by definition; the same payload re-submits the same conflict.
  2. Re-fetch the current state (GET the resource), diff with what you meant to write, merge, and resubmit.
  3. Show the human a merge surface where two versions differ (which tabs, which fields) before overwriting. Autosave + 409 is the classic "someone else changed this, refresh to see it" path.
  4. Once the sync clears, resubmit with the fresh version and the conditional header.

Rules of thumb

The status list puts 409 next to the other 4xx codes, and the retry-after article covers the header only where a timed retry truly applies.

Need a website built, fixed, optimised, migrated or replaced?

This technical resource is written by CSMBAC, a small design and development studio. If you would rather hand the problem to a professional, the website service page explains how we build enquiry-ready websites.

Explore website services