Skip to main content

O problema

A rede cai depois que o servidor processou, mas antes da resposta chegar. Você não sabe se o contato foi criado ou não. Repetir a requisição arrisca duplicar; não repetir arrisca perder. A Idempotency-Key resolve isso: a segunda chamada com a mesma chave devolve a resposta original em cache, sem executar nada de novo.

Onde funciona

A idempotência vale em quatro rotas, não em todo POST. Nas demais, o header é aceito e ignorado em silêncio — a requisição é processada normalmente e uma retentativa cria um segundo recurso.

Como usar

Gere um UUID v4 por operação lógica e envie no header Idempotency-Key:
Na repetição, a resposta vem idêntica à original — mesmo status, mesmo corpo — acrescida de um header:
Use Idempotency-Replayed para distinguir “criei agora” de “já existia”. Sem ele, um 201 de replay é indistinguível de um 201 de criação real.

Comportamento exato

Só respostas 2xx entram no cache. Se a primeira tentativa falhou com 500, repetir com a mesma chave executa de verdade — que é o comportamento desejado numa retentativa.Não há verificação do corpo. Reutilizar uma chave com um payload diferente não gera erro: devolve silenciosamente o resultado da primeira operação. Uma chave por operação lógica, sempre.

Escopo e validade

A idempotência depende do cache distribuído. Se ele estiver indisponível, a requisição é processada normalmente sem proteção contra duplicata — não há erro nem aviso na resposta. Para operações críticas, mantenha também a sua própria checagem no destino.

Exemplo — criação segura com retentativa

Boas práticas

  • Gere a chave antes de enviar, não depois de falhar — uma chave criada na retentativa não protege nada.
  • Persista a chave junto com a operação, para reusá-la se o processo reiniciar no meio.
  • Uma chave por operação lógica. Nunca reaproveite entre operações diferentes: como o corpo não é verificado, o resultado seria a resposta errada, sem erro nenhum.
  • UUID v4. Evite chaves sequenciais ou previsíveis.
  • Para as rotas não idempotentes, use uma checagem própria antes de repetir — por exemplo, buscar pelo identificador externo antes de criar de novo.