Voltar para o blog
APIIntegraçãoConfiabilidade

429: como repetir sem piorar

Equipe AltiviaCloud · 2 de setembro de 2026 · 3 min de leitura

Retentativa ingênua transforma uma requisição em três e mantém o limite estourado. Espera crescente, valor aleatório e o que nunca deve ser repetido.

Sua integração funciona há três meses. Numa terça-feira, começa a receber 429. Você adiciona uma retentativa. No dia seguinte, o 429 virou constante.

Isso não é azar: é o comportamento esperado de retentativa mal feita.

O que 429 quer dizer

Você passou do número de requisições permitido numa janela de tempo. Não é erro do seu código nem falha do servidor — é um pedido para diminuir o ritmo.

Duas coisas seguem dele. A primeira: repetir imediatamente não ajuda, porque a janela não passou. A segunda: repetir imediatamente atrapalha, porque consome mais da cota e empurra a recuperação para longe.

Por que a retentativa ingênua piora

for (let i = 0; i < 3; i++) {
  const r = await chamar();
  if (r.ok) return r;
}

Uma requisição que falhou virou três. Sob carga, quando muitos clientes recebem 429 ao mesmo tempo, todos repetem juntos — e voltam a bater juntos no mesmo instante. O sistema entra num ciclo em que a própria retentativa mantém o limite estourado.

Como fazer certo

Espere mais a cada tentativa. Dobrar o intervalo dá tempo de a janela virar: um segundo, dois, quatro, oito.

Some um valor aleatório. Sem isso, todos os clientes repetem no mesmo milissegundo e a coordenação acidental recria o pico. Um sorteio pequeno espalha as tentativas.

const espera = base * 2 ** tentativa + Math.random() * 1000;

Obedeça o Retry-After. Quando o servidor manda esse cabeçalho, ele está dizendo exatamente quanto esperar. Respeitar é sempre melhor que adivinhar.

Tenha um teto. Cinco tentativas bastam. Depois disso, falhe e registre. Repetir para sempre transforma uma indisponibilidade curta numa fila que nunca drena.

O que nunca deve ser repetido

Aqui mora o bug caro.

Repetir uma leitura é inofensivo. Repetir uma criação pode gerar duas — e no caso de um pedido, dois débitos no saldo.

A regra: só repita automaticamente o que é seguro repetir. Leitura, sim. Criação, só com proteção.

A proteção é uma chave de idempotência: um identificador que você gera antes da primeira tentativa e reenvia em todas. O servidor reconhece a repetição e devolve o mesmo resultado em vez de criar outro.

Sem esse recurso, a alternativa é conferir antes de recriar: consulte se o pedido daquele seu identificador interno já existe.

Erros que também não devem ser repetidos

Nem toda falha melhora com insistência:

CódigoRepetir?
400, 422Não. O corpo está errado; repetir manda o mesmo erro.
401, 403Não. Credencial inválida não melhora sozinha.
404Não.
409Não sem pensar. Costuma indicar duplicidade.
429Sim, com espera crescente.
500, 502, 503, 504Sim, com espera crescente.
Tempo esgotado de conexãoSim para leitura. Para criação, só com idempotência.

O caso perigoso é o tempo esgotado numa criação: você não sabe se o servidor recebeu. Talvez o pedido exista e a resposta é que se perdeu.

Evitar o limite é melhor que reagir a ele

Antes de aperfeiçoar a retentativa, veja se dá para fazer menos requisições:

  • Guarde o que muda devagar. Lista de países e serviços não precisa ser buscada a cada pedido.
  • Troque consulta por aviso. A maior fonte de requisição inútil costuma ser laço de espera. Webhook zera isso.
  • Enfileire picos. Se o seu processo cria trezentos pedidos de uma vez, uma fila com concorrência limitada espalha no tempo e nunca encosta no limite.

Registre o suficiente para investigar

Quando o 429 aparecer, você vai querer saber: qual rota, quantas tentativas, qual espera, e se havia Retry-After. Registro que só diz "falhou ao criar pedido" não permite concluir nada.

E não repita em silêncio. Três tentativas invisíveis viram três segundos de latência que ninguém consegue explicar depois.

Na API de números virtuais, o teto é de 120 requisições por minuto por chave e 20 pedidos por minuto por conta, e o 429 vem com Retry-After.