Monitor404

Код 409 Conflict: конфликт с состоянием ресурса

Код 409 означает, что запрос составлен правильно, но выполнить его нельзя из-за текущего состояния ресурса: имя уже занято, объект изменил кто-то другой, операция противоречит данным на сервере. Обычно помогает обновить данные и повторить запрос или выбрать другое имя.

Обновлено 23 октября 2026 г.

Что значит код 409

RFC 9110 (раздел 15.5.10): запрос не может быть выполнен из-за конфликта с текущим состоянием целевого ресурса. Стандарт рекомендует отдавать 409 в ситуациях, когда пользователь может разрешить конфликт и отправить запрос заново, и объяснять причину в теле ответа.

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

{"error": "conflict", "message": "Пользователь с таким e-mail уже существует"}

Где встречается 409

СервисКак выглядитЧто делать
DockerConflict. The container name "/web" is already in useудалить старый контейнер (docker rm web) или выбрать другое имя
Kubernetesthe object has been modified; please apply your changes to the latest versionполучить свежую версию объекта и применить изменения повторно
GitHub API409 при работе с пустым репозиторием или при слиянии с конфликтомсоздать первый коммит или разрешить конфликт в ветке
Amazon S3BucketAlreadyExists, BucketAlreadyOwnedByYouвыбрать другое глобально уникальное имя бакета
Elasticsearchversion_conflict_engine_exceptionперечитать документ и повторить запрос с актуальной версией

Типичные причины

  • Дубликат. Создаётся объект с уже занятым уникальным полем: e-mail, логин, имя контейнера или бакета.
  • Одновременное редактирование. Два клиента изменили один объект, и второй пытается записать устаревшую версию.
  • Недопустимый переход состояния. Например, отменить уже отправленный заказ или удалить папку, в которой есть файлы.
  • Блокировка. Ресурс занят другой операцией (в WebDAV — заблокирован другим пользователем).

409, 412, 422 и 400: что выбрать в API

КодКогда отдавать
400 Bad Requestзапрос синтаксически неверен: битый JSON, неизвестные параметры
422 Unprocessable Contentзапрос корректен, но данные не проходят валидацию: пустое поле, неверный формат e-mail
409 Conflictданные корректны, но противоречат состоянию на сервере: e-mail уже занят, объект изменился
412 Precondition Failedклиент прислал условие (If-Match, If-Unmodified-Since), и оно не выполнилось

Для защиты от одновременного редактирования удобнее условные запросы: сервер отдаёт ETag, клиент присылает его в If-Match, и при несовпадении сервер отвечает 412. Если API не использует условные заголовки, а версию передают в теле запроса, при несовпадении обычно отдают 409.

Как отдавать 409 в своём API

Express
app.post("/users", async (req, res) => {
  const exists = await db.user.findUnique({ where: { email: req.body.email } });
  if (exists) {
    return res.status(409).json({
      error: "email_taken",
      message: "Пользователь с таким e-mail уже существует",
    });
  }
  // ...создание пользователя
});

Не полагайтесь только на проверку перед вставкой: два одновременных запроса могут пройти её оба. Держите уникальный индекс в базе данных и превращайте ошибку нарушения уникальности в ответ 409 с понятным сообщением.

409 на страницах сайта

На обычных страницах, которые открывают посетители и поисковые роботы, 409 не встречается: это код для API и форм. Если робот получает 409 на публичной странице, это ошибка конфигурации (например, защитный модуль или CDN ошибочно отвечает этим кодом). Такие страницы не попадут в индекс. Проверить ответ можно проверкой кода ответа.

Частые вопросы

Что значит ошибка 409 Conflict?

Запрос противоречит текущему состоянию ресурса на сервере: объект уже существует, был изменён кем-то другим или находится в состоянии, не допускающем операцию.

Как исправить 409 в Docker?

Обычно это занятое имя контейнера. Удалите старый контейнер командой docker rm <имя> (или docker rm -f, если он запущен) либо запустите новый с другим --name.

Чем 409 отличается от 422?

422 — данные не прошли валидацию сами по себе. 409 — данные корректны, но конфликтуют с тем, что уже есть на сервере, например e-mail занят.

Можно ли повторить запрос после 409?

Да, но не тот же самый: сначала получите актуальное состояние ресурса или измените конфликтующие данные, иначе ответ будет снова 409.

Читайте также