Erro 429 (rate limit) na API da OpenAI: por que acontece e como resolver
O erro 429 API OpenAI esconde dois problemas diferentes no mesmo código: rate_limit_exceeded (tráfego alto, você estourou RPM, TPM, RPD ou TPD) e insufficient_quota (saldo ou cota de faturamento no fim). A solução muda conforme a causa: no primeiro, backoff exponencial com jitter e respeitar o header Retry-After; no segundo, recarregar saldo, porque retry nenhum resolve billing. O primeiro passo é sempre ler a mensagem e os headers x-ratelimit antes de mexer no código. Bora entender cada caso e resolver de vez.
Fala programador(a), beleza? Você monta a integração, testa local, tá tudo lindo… aí a produção sobe e vem o 429 Too Many Requests bem no meio da chamada.
O detalhe cruel é que o mesmo código 429 esconde dois problemas completamente diferentes. Um é tráfego demais (você mandou requisição ou token acima do limite por minuto). O outro é billing (seu saldo ou sua cota de faturamento acabou). E aqui tá a pegadinha: a solução de um NÃO resolve o outro. Se você tratar tudo como "vou retentar depois", pode ficar batendo a cabeça num problema que é de cartão de crédito, não de código. Então bora separar as duas causas primeiro, depois resolver cada uma.
Causa 1: rate_limit_exceeded (tráfego alto, RPM/TPM/RPD/TPD)
Esse é o 429 clássico de pressão de tráfego.
O sintoma: a resposta vem com código rate_limit_exceeded e traz os headers de rate limit junto. Se liga neles: x-ratelimit-remaining-requests e x-ratelimit-remaining-tokens mostram o que ainda sobra do seu limite, e o Retry-After diz em quantos segundos você pode tentar de novo.
A causa: a OpenAI mede seu uso em quatro dimensões ao mesmo tempo: requisições por minuto (RPM), tokens por minuto (TPM), requisições por dia (RPD) e tokens por dia (TPD). E aqui vai o ponto que muita gente não sacou: basta estourar UMA dessas quatro pra levar 429. Ou seja, você pode estar tranquilo no RPM e mesmo assim tomar bloqueio porque encheu o TPM com respostas gigantes.
A solução: backoff exponencial com jitter. A ideia é simples: quando toma 429, você espera um intervalo curto antes de retentar, e aumenta esse tempo a cada nova falha, até um número máximo de tentativas. O jitter é uma variação aleatória nessa espera pra suas requisições não baterem todas no mesmo instante.
E o erro que quase todo mundo comete: reenviar na hora. Não funciona. A requisição que falhou ainda conta pro seu limite por minuto, então retentar imediatamente só afunda mais o buraco. Sempre respeite o Retry-After: ele te dá o tempo exato de espera, não precisa chutar.
Como prevenir: faz throttle no seu lado (segura o ritmo de disparo pra não encostar no teto) e reduz o consumo por requisição. Ajustar o max_tokens (e o best_of) pro menor valor que atende seu caso corta o gasto de tokens por minuto, que é justo o que enche o TPM.
Causa 2: insufficient_quota (saldo ou cota de faturamento esgotado)
Esse aqui é traiçoeiro porque vem com o MESMO 429, só que a raiz não tem nada a ver com tráfego.
O sintoma: a mensagem diz insufficient_quota, e o mais revelador: acontece mesmo quando você tá mandando pouquíssima requisição. Uma chamada solta, sem volume nenhum, e mesmo assim 429? Aí acende a luz.
A causa: é billing. Seu saldo acabou, a cota de faturamento chegou no fim, ou o plano tá sem crédito disponível. Não é o servidor da OpenAI dizendo "calma que tá muito rápido", é o financeiro dizendo "não tem crédito aqui".
A solução: recarregar saldo e conferir seu plano de faturamento na conta. Ponto. E deixa eu ser bem direto sobre uma coisa: backoff exponencial NÃO resolve este caso. Você pode botar 50 tentativas com espera crescente que não adianta nada, porque o problema não é tempo, é crédito. Retentar aqui é só perder tempo.
Como prevenir: configura alertas de uso na sua conta pra ser avisado antes do saldo secar. Assim você recarrega antes do 429 estourar em produção, e não depois.
Como resolver o 429 de rate limit na prática
Beleza, identificou que o seu caso é o de tráfego (Causa 1)? Então vamos ao passo a passo. Se o seu for insufficient_quota, pula direto pro billing, porque nada abaixo vai te ajudar.
- Identifique a causa pela mensagem e pelos headers. Antes de tocar em qualquer linha de código, leia a resposta do erro. Olha o campo da mensagem (
rate_limit_exceededouinsufficient_quota) e os headersRetry-Afterex-ratelimit-remaining-requests/x-ratelimit-remaining-tokens.
O erro comum deste passo: sair mexendo no código sem ler a mensagem. Se for insufficient_quota, você vai construir um retry lindo que nunca vai funcionar.
- Ative e ajuste o retry do SDK. O SDK oficial de Python já retenta o 429 sozinho por padrão, 2 vezes. Se seu caso pede mais fôlego, dá pra subir esse teto:
from openai import OpenAI
client = OpenAI(max_retries=5)O erro comum deste passo: achar que o SDK não retenta e sair reinventando a roda. Ele já retenta; muitas vezes é só ajustar o max_retries.
- Implemente backoff exponencial com jitter no seu código próprio. Se você não usa o SDK ou quer controle fino, faça na mão: espera curta que cresce a cada falha, com uma pitada de aleatoriedade.
import time, random
def chamar_com_backoff(fn, max_tentativas=5):
for tentativa in range(max_tentativas):
try:
return fn()
except Exception:
if tentativa == max_tentativas - 1:
raise
espera = (2 ** tentativa) + random.uniform(0, 1)
time.sleep(espera)O erro comum deste passo: esquecer o jitter (aquele random.uniform). Sem ele, várias requisições retentam no mesmo segundo exato e batem no limite de novo, todas juntas.
- Reduza o consumo por requisição. Define o
max_tokensno mínimo necessário pro tamanho de resposta que você espera. Menos tokens por chamada = menos pressão no TPM = menos 429.
resposta = client.chat.completions.create(
model="gpt-4o",
messages=mensagens,
max_tokens=300, # o suficiente pra resposta esperada, nem mais
)O erro comum deste passo: deixar o max_tokens alto "por segurança". Isso reserva orçamento de token que você nem vai usar e te aproxima do limite por minuto à toa.
Tiers de uso: por que seu limite é o que é (e como aumentá-lo)
Uma pergunta que vem logo: "beleza, mas por que MEU limite é tão baixo?". A resposta é o tier da sua conta.
Os limites de taxa dependem do tier de uso, e ele sobe automaticamente conforme duas coisas: o gasto acumulado e a idade da conta. Funciona mais ou menos assim: o Tier 1 é liberado quando você faz o primeiro pagamento de pelo menos US$5. O Tier 2 já exige duas condições ao mesmo tempo: US$50 em pagamentos acumulados E pelo menos 7 dias desde o primeiro pagamento. As duas juntas, não uma ou outra.
E tem um detalhe importante que confunde muita gente: o que conta é o gasto acumulado de todos os tempos (all-time), não o saldo que você tem agora. Ou seja, se você já pagou US$50 no total ao longo do uso, sua conta vai pro Tier 2 mesmo que o saldo atual esteja zerado. É histórico, não é o que sobra na conta hoje.
Quer conferir em que tier você está e quais são seus limites de verdade? Dá pra ver tudo na área de configurações da plataforma, na seção Limits. A página oficial de referência é a platform.openai.com/docs/guides/rate-limits. Vale abrir e olhar os números da SUA conta antes de assumir qualquer coisa.
Conclusão
Recapitulando o que importa: o erro 429 API OpenAI é sempre um diagnóstico de duas frentes. Ou é rate_limit_exceeded (tráfego alto, você estourou uma das dimensões RPM/TPM/RPD/TPD, e a saída é backoff com jitter respeitando o Retry-After), ou é insufficient_quota (billing no fim, e a saída é recarregar saldo). Tratar um com a solução do outro é perder tempo.
Seu próximo passo concreto é sempre o mesmo: antes de mexer no código, leia a mensagem do erro e os headers x-ratelimit. Eles te dizem em segundos qual dos dois problemas você tem. E pra saber o teto real da sua conta, é só conferir a seção Limits nas configurações da plataforma.
E por hoje é isso, até o próximo post! 🙂
Perguntas frequentes
Como faço para subir de tier e ter limites maiores de requisição na API da OpenAI?
O tier sobe automático conforme o seu gasto acumulado, não o saldo atual. Pra chegar ao Tier 1, basta um primeiro pagamento de pelo menos US$5. Tier 2 exige as duas condições juntas ao mesmo tempo: US$50 em pagamentos acumulados de todos os tempos E pelo menos 7 dias desde o primeiro pagamento.
O erro 429 da OpenAI some sozinho depois de um tempo ou precisa de intervenção?
Depende da causa. Se for rate_limit_exceeded, o bloqueio é temporário: o limite reseta no próximo intervalo e o header Retry-After já diz exatamente quanto tempo esperar. Se for insufficient_quota, não some sozinho, porque o problema é financeiro: precisar recarregar saldo ou ajustar o plano de faturamento.
Onde vejo meus limites atuais de RPM e TPM na conta da OpenAI?
Na seção Limits das configurações da conta, diretamente em platform.openai.com. A documentação oficial com os limites por tier também fica em platform.openai.com/docs/guides/rate-limits. Lá você vê em qual tier sua conta está e quanto de RPM, TPM, RPD e TPD ela suporta.
O SDK oficial de Python da OpenAI já retenta o 429 automaticamente ou preciso escrever o backoff na mão?
Já retenta por padrão, sem precisar de nenhuma linha extra de código. O teto padrão é 2 tentativas automáticas, mas dá pra subir com client = OpenAI(max_retries=5). Implementar o backoff na mão só faz sentido se você não usa o SDK ou quer controle fino sobre a lógica de espera.
Por que retentar o 429 imediatamente piora a situação em vez de resolver?
Porque a requisição que falhou ainda conta pro seu limite por minuto. Mandar de novo na hora é jogar mais uma chamada num balde que já transbordou. O jeito certo é respeitar o Retry-After da resposta, que traz o tempo exato de espera antes de tentar de novo.
Posso tomar erro 429 na API da OpenAI mesmo fazendo poucas chamadas?
Sim, e esse é o caso mais confuso. Se a mensagem vier com insufficient_quota, você toma 429 mesmo com uma única chamada, porque o problema é saldo ou cota de faturamento esgotada, não volume de tráfego. Backoff e throttling não ajudam nada aqui: o caminho é recarregar crédito.
Formações
Formação Vibe Coding
Do Prompt ao Produto: Crie Software Real com IA
- 474 aulas
- 20 projetos
- 39h 27min
Blog | Mais populares

As diferenças de var, let e const

Como fazer redirecionamento com PHP
Neste artigo você vai aprender a como fazer redirecionamento com PHP, utilizaremos abordagens fáceis de entender e de aplicar Fala programador(a), beleza? Bora aprender mais […]

Checklist de segurança n8n VPS pública: guia essencial para proteger sua instalação
Checklist de segurança n8n VPS pública: guia essencial para proteger sua instalação A popularidade da automação de processos com o n8n está em alta, principalmente […]
