HTTP 409 Conflict
Uma colisão de estado: a requisição é válida, mas o recurso mudou de uma forma que torna impossível aplicá-la agora.
O que significa HTTP 409
HTTP 409 Conflict significa que o servidor entendeu a requisição, mas não pode aplicá-la porque ela contradiz o estado atual do recurso de destino. O exemplo clássico é uma colisão de edição: dois clientes carregaram o mesmo documento, ambos salvam, e o segundo salvamento sobrescreveria silenciosamente o primeiro.
Diferente do 400, a requisição em si está bem formada — reenviá-la sem alterações pode até ter sucesso mais tarde. O corpo da resposta deve explicar o que está em conflito para que o cliente (ou usuário) possa resolvê-lo e tentar novamente.
Causas comuns dos erros 409
- Uma colisão de edição: o recurso foi modificado por outra pessoa desde a última vez que o cliente o buscou (frequentemente evidenciado via ETag / If-Match).
- Criar um recurso que já existe — nome de usuário, e-mail, slug ou nome de arquivo duplicado.
- Uma incompatibilidade de versão no optimistic locking: o número de versão enviado está desatualizado.
- Excluir ou mover um recurso que tem dependentes que o servidor se recusa a deixar órfãos.
- Etapas de um fluxo de trabalho concorrente aplicadas fora de ordem (por exemplo, aprovar um pedido já cancelado).
Como corrigir como desenvolvedor
- Leia o corpo da resposta — uma boa API indica o campo em conflito ou a versão atual esperada.
- Busque o recurso novamente, reaplique sua alteração sobre o estado atualizado e reenvie a requisição.
- Use requisições condicionais (If-Match com ETags) para que os conflitos sejam detectados de forma confiável em vez de sobrescrever dados.
- Para conflitos de criação duplicada, decida a idempotência com antecedência: retorne o recurso existente, ou 409 com uma referência a ele.
Exemplo de resposta
HTTP/1.1 409 Conflict
Content-Type: application/json
{"error":"conflict","message":"document was modified by another user","current_version":42}Perguntas frequentes
Qual é a diferença entre 409 e 400?
400 significa que a própria requisição está malformada ou inválida. 409 significa que a requisição está correta, mas entra em conflito com o estado atual do recurso — tentar novamente após resolver o conflito pode ter sucesso.
Quando uma API deve retornar 409 em vez de 422?
Use 422 para falhas de validação dentro do payload e 409 para colisões com o estado existente no servidor, como duplicatas ou versões desatualizadas.
Como os ETags ajudam a evitar erros 409?
O cliente envia If-Match com o ETag visto pela última vez; o servidor aplica a alteração somente se o recurso não tiver mudado, caso contrário retorna 409 (ou 412) em vez de sobrescrever.