Erro 429: como diagnosticar rate limit sem piorar a fila
Resposta rápida
Um 429 significa que a requisição não foi aceita porque um limite de requisições, tokens ou cota foi atingido. Ele não prova que a chave é inválida, que o modelo não existe ou que o servidor caiu. Leia primeiro a mensagem do erro, o cabeçalho Retry-After — quando existir — e o identificador da requisição.
Em um gateway, o 429 pode nascer em dois pontos: no próprio gateway ou no provedor upstream. Por isso, o diagnóstico correto precisa registrar onde a chamada parou antes de aumentar concorrência ou repetir a requisição em loop.
O que o corpo e os headers entregam
Procure estes sinais na resposta:
- HTTP 429 — a requisição foi rejeitada antes de produzir a resposta normal.
Retry-After— quando presente, indica uma espera mínima antes de tentar novamente.- Mensagem do erro — pode citar requisições por minuto, tokens por minuto, cadência da conta ou outra restrição.
x-request-idou equivalente — permite correlacionar o incidente com o log do gateway.- Modelo e endpoint usados — um mesmo cliente pode passar em um modelo e falhar em outro com limite mais restrito.
Não existe um único “limite da MandAPI” que possa ser copiado de um artigo e aplicado a toda conta. Limites podem variar por chave, modelo, provedor, plano e janela de tempo. A resposta atual é a fonte mais confiável para o comportamento observado.
Fluxo de diagnóstico em cinco minutos
- Reproduza com uma única requisição. Isso separa um problema de rajada de um problema de conta.
- Guarde status, headers, corpo, modelo, horário UTC e request ID.
- Compare a concorrência atual com a taxa que funcionava antes.
- Verifique se o volume de tokens de entrada ou saída cresceu, mesmo sem aumentar o número de chamadas.
- Faça retry apenas após uma espera calculada. Não coloque todos os workers para tentar ao mesmo tempo.
Se o erro aparecer apenas em produção, execute o mesmo teste com o mesmo modelo e a mesma rota. Diferenças de proxy, timeout e pool de conexões também mudam a cadência vista pelo gateway.
Exemplo de retry responsável
O exemplo abaixo respeita Retry-After, adiciona jitter e limita o número de tentativas. Ele é um ponto de partida, não uma política universal de produção.
import os
import random
import time
import requests
API_KEY = os.environ["MANDAPI_API_KEY"]
URL = "https://api.mandapi.com/v1/chat/completions"
MODEL = os.environ["MANDAPI_MODEL"]
payload = {
"model": MODEL,
"messages": [{"role": "user", "content": "Responda apenas: ok"}],
}
for attempt in range(5):
response = requests.post(
URL,
headers={
"Authorization": f"Bearer {API_KEY}",
"Content-Type": "application/json",
},
json=payload,
timeout=30,
)
if response.status_code != 429:
response.raise_for_status()
break
retry_after = response.headers.get("retry-after")
if retry_after and retry_after.isdigit():
wait_seconds = float(retry_after)
else:
wait_seconds = min(30.0, (2 ** attempt) + random.uniform(0, 1))
print(
"429; tentativa", attempt + 1,
"aguardando", round(wait_seconds, 2),
"request_id", response.headers.get("x-request-id", ""),
)
time.sleep(wait_seconds)
else:
raise RuntimeError("Limite persistente após cinco tentativas")
O que não fazer
- Repetir imediatamente em um
while true: isso aumenta a rajada e pode prolongar o bloqueio. - Abrir mais conexões para “vencer” o limite: concorrência maior costuma piorar o
429. - Tratar
429como401: credencial inválida exige correção de chave; rate limit exige cadência ou cota. - Ignorar o request ID ao abrir suporte: sem ele, o diagnóstico fica genérico.
- Assumir que todo
429é cobrança: cota e rate limit são verificações relacionadas, mas não idênticas.
Como confirmar que a correção funcionou
Uma correção saudável deve produzir três evidências:
- O mesmo teste passa com uma única requisição.
- A produção não gera novas rajadas quando o retry é acionado.
- O log mostra redução de
429sem aumento de timeout ou erro5xx.
Se o volume continuar alto, reduza a concorrência, distribua o tráfego ao longo da janela e revise o consumo de tokens. Em fluxos com muitas chamadas curtas, limitar concorrência costuma ser mais eficaz do que apenas aumentar o intervalo entre tentativas.
Próximos passos
- Revise os códigos e o envelope de erro em Erros da API.
- Confirme a chave e o formato Bearer em Como usar sua API Key.
- Veja o caminho completo de cadastro, chave e primeira chamada em Início rápido.
- Consulte Preços quando a origem do erro envolver volume de uso ou necessidade de aumento de capacidade.
Fontes
- OpenAI — Rate limits: https://platform.openai.com/docs/guides/rate-limits
- Anthropic — Rate limits: https://platform.claude.com/docs/en/api/rate-limits
- RFC 9110 —
Retry-After: https://www.rfc-editor.org/rfc/rfc9110#section-10.2.3 - MandAPI — Erros da API: https://mandapi.com/docs/errors
Última verificação editorial: 20 de setembro de 2026. Os limites efetivos podem mudar; confirme a resposta atual da API e o painel da sua conta.
