Код 409 Conflict: конфликт с состоянием ресурса
Код 409 означает, что запрос составлен правильно, но выполнить его нельзя из-за текущего состояния ресурса: имя уже занято, объект изменил кто-то другой, операция противоречит данным на сервере. Обычно помогает обновить данные и повторить запрос или выбрать другое имя.
Обновлено 23 октября 2026 г.
Что значит код 409
RFC 9110 (раздел 15.5.10): запрос не может быть выполнен из-за конфликта с текущим состоянием целевого ресурса. Стандарт рекомендует отдавать 409 в ситуациях, когда пользователь может разрешить конфликт и отправить запрос заново, и объяснять причину в теле ответа.
HTTP/1.1 409 Conflict
Content-Type: application/json
{"error": "conflict", "message": "Пользователь с таким e-mail уже существует"}Где встречается 409
| Сервис | Как выглядит | Что делать |
|---|---|---|
| Docker | Conflict. The container name "/web" is already in use | удалить старый контейнер (docker rm web) или выбрать другое имя |
| Kubernetes | the object has been modified; please apply your changes to the latest version | получить свежую версию объекта и применить изменения повторно |
| GitHub API | 409 при работе с пустым репозиторием или при слиянии с конфликтом | создать первый коммит или разрешить конфликт в ветке |
| Amazon S3 | BucketAlreadyExists, BucketAlreadyOwnedByYou | выбрать другое глобально уникальное имя бакета |
| Elasticsearch | version_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
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.