Erro 429: limite de requisições, cota ou tentativas?

O 429 costuma ser tratado como uma coisa só — "passei do limite, espero e tento de novo" —, e essa leitura acerta um caso em três. Na API de assinatura, três situações distintas produzem esse código: o limite de requisições por tempo, o limite de tentativas de uma etapa de verificação, e o esgotamento da cota do plano. Esperar e repetir resolve a primeira, não resolve a segunda e é inútil na terceira. Este guia mostra como distinguir as três pela resposta e o que fazer em cada uma.

Três causas, três condutas: limite de requisições pede espera; tentativas esgotadas pedem outro caminho; cota esgotada pede plano. Aplicar recuo exponencial nos três resolve um e desperdiça requisições nos outros dois.

Como distinguir, em uma olhada

Causa Como aparece Esperar resolve?
Limite de requisições Fala em rate limit, traz Retry-After Sim
Tentativas da etapa Cita o máximo de tentativas daquela etapa Não — a etapa acabou
Cota do plano Fala em cota Só na virada do período

Daí uma recomendação de instrumentação: registre a resposta inteira, não só o código. Um log com "429" e nada mais torna impossível saber, depois, qual dos três aconteceu — e os três exigem ações diferentes de times diferentes.

Caso 1: limite de requisições

É o 429 clássico, uma proteção de tráfego. A resposta traz o intervalo a respeitar:

HTTP/1.1 429 Too Many Requests Retry-After: 60 { "type": "https://api.signdocs.com.br/errors/too-many-requests", "title": "Too Many Requests", "status": 429, "detail": "Rate limit exceeded" }

Duas regras práticas. Obedeça ao Retry-After em vez de inventar o intervalo — ele é a informação que o servidor tem e você não. E, quando ele não vier, use recuo exponencial com teto, nunca repetição em intervalo fixo.

Melhor ainda é não chegar lá. As respostas trazem RateLimit-Limit, RateLimit-Remaining e RateLimit-Reset; alarmar quando o remaining fica baixo avisa antes do primeiro 429. Um alarme que dispara depois chega junto com o incidente, não antes dele. O desenho completo de backoff está em rate limits, paginação e idempotência.

Caso 2: as tentativas da etapa acabaram

Este é o 429 que o recuo exponencial não resolve, porque não há nada a esperar:

HTTP/1.1 429 Maximum attempts (N) exceeded for this step

Cada etapa de verificação tem um orçamento de tentativas. Quando ele acaba, a etapa é encerrada — e repetir só produz o mesmo 429.

Você foi avisado antes. A resposta da última tentativa disponível já indicava a situação: a etapa passa a falhada e o campo que informa se ainda cabe nova tentativa vem negativo. É esse campo que a sua integração deveria observar, não o 429 seguinte. Quem reage só ao 429 desperdiça a informação e ainda gera uma chamada inútil por signatário travado.

Os orçamentos são por tipo de etapa, e isso tem um efeito útil: etapas biométricas usam o limite biométrico da conta, a checagem de identidade governamental tem o seu próprio, o aviso de finalidade tem exatamente uma tentativa, e as demais usam um teto genérico. Como os orçamentos são separados, esgotar um caminho não esgota o alternativo — é o que faz o plano B ser viável quando ele é acionado.

A conduta correta aqui não é técnica: é de produto. Alguém ficou sem saída, e precisa de um caminho alternativo previsto ou de encaminhamento para atendimento humano. Decidir isso durante o incidente é a pior hora.

Caso 3: a cota do plano acabou

Cota e limite de requisições são controles independentes, e a confusão entre eles é frequente:

Limite de requisições Cota
Mede Requisições por tempo Consumo por dia e por mês
Serve para Proteger o serviço Delimitar o plano
Resolve com Esperar segundos Virada do período, ou plano maior
É por método? Não Sim — clique, OTP, biometria, checagem governamental

A última linha explica um caso que parece contraditório: é possível estar sem cota biométrica e com cota de documento sobrando. As cotas são por método, e esgotar uma não afeta as outras.

Este é o 429 que nunca deveria surpreender, porque existe aviso antes. O evento de aviso de cota é disparado ao cruzar o percentual de alerta da conta, e é literalmente a última chance de reagir antes das recusas — trate-o como alarme, não como log. E o painel traz uma previsão de uso que projeta o fechamento do mês pelo ritmo atual: é o único lugar onde você descobre que vai estourar antes de estourar. Ver o painel de API.

Note também que não existe endpoint público de consulta de cota: o acompanhamento é pelo painel ou pelo evento.

Repetições consomem cota

Um detalhe que liga os casos 2 e 3, e que costuma explicar consumo inesperado: a primeira tentativa de uma etapa já está paga pela criação da transação. Da segunda em diante, cada repetição é debitada, porque cada uma dispara de novo o provedor de verificação.

Um mecanismo de nova tentativa mal calibrado consome cota em silêncio. Vale medir a razão entre documentos enviados e cota consumida: se ela subir sem explicação, normalmente há repetição escondida.

O que implementar

  1. Ramifique o 429 pelas três causas antes de decidir a ação — a mensagem e a presença do Retry-After bastam para separar.
  2. Obedeça ao Retry-After, e use recuo exponencial com teto quando ele não vier.
  3. Observe o campo de nova tentativa nas respostas de etapa, em vez de esperar o 429.
  4. Alarme em RateLimit-Remaining baixo e em qualquer aviso de cota.
  5. Nunca repita cota esgotada. Isso não é transitório dentro do período.

Para o conjunto de sinais que uma integração deveria observar, veja o que monitorar numa integração. Para o catálogo de códigos, códigos de erro e tratamento de falhas. E a visão geral da API de assinatura eletrônica descreve os métodos que consomem cada cota.

Perguntas Frequentes

Como sei qual dos três casos é o meu?

Pela mensagem e pelo cabeçalho. Limite de requisições traz Retry-After e fala em rate limit; tentativas esgotadas trazem uma mensagem citando o máximo de tentativas daquela etapa; cota esgotada fala em cota. Registrar a resposta inteira, e não só o código, é o que torna essa distinção possível depois.

O que faço no limite de requisições?

Obedeça ao Retry-After em vez de inventar o intervalo, e use recuo exponencial se ele não vier. Vale também monitorar RateLimit-Remaining, que permite alarmar antes do primeiro 429 — um alarme que dispara depois chega junto com o incidente.

E quando as tentativas de uma etapa acabam?

Aí repetir não adianta: a etapa foi encerrada. Antes de chegar ao 429, a última resposta já avisou — a etapa passa a falhada e o campo que indica nova tentativa vem negativo. Esse é o sinal para acionar um caminho alternativo ou encaminhar para atendimento humano.

Cada tipo de etapa tem seu próprio limite de tentativas?

Sim, e isso importa. Etapas biométricas usam o limite biométrico da conta; a checagem de identidade governamental tem o seu; o aviso de finalidade tem exatamente uma; as demais usam um teto genérico. Como os orçamentos são separados, esgotar um não esgota os outros.

Cota e limite de requisições são a mesma coisa?

Não. O limite de requisições é proteção de tráfego, medido por tempo, e se resolve esperando. A cota é do plano, medida por dia e por mês, e esperar só resolve na virada do período. São controles independentes: dá para estar dentro do limite de requisições e sem cota alguma.

Como evito o 429 de cota?

Assinando o evento de aviso de cota e tratando-o como alarme — ele é o último aviso antes das recusas. Vale olhar também a previsão de uso no painel, que projeta o fechamento do mês e avisa quando a projeção passa do contratado. É o único lugar que avisa antes de estourar.

Repetições consomem cota?

A primeira tentativa de uma etapa está incluída na cota que a transação consumiu na criação. A partir da segunda, cada repetição é debitada, porque cada uma dispara de novo o provedor. Um mecanismo de nova tentativa mal calibrado pode, portanto, consumir cota sem que ninguém perceba.

Trate os três 429 de forma diferente

Backoff resolve um caso, escalada humana resolve outro, e o terceiro precisa de aviso antes de acontecer. Teste os três em homologação, onde é gratuito.

Criar credenciais de homologação Fale com o time comercial