Créditos da Claude API: por que sua aplicação para sem aviso?

créditos da Claude API esgotados travando aplicação sem aviso
Resposta rápida

Os créditos da Claude API são um saldo pré-pago: sem crédito comprado, nenhuma chamada passa. O problema é que a falha não chega como aviso de cobrança, chega como HTTP 400 com type invalid_request_error e a mensagem de saldo baixo, que parece erro de payload. Pior: esse 400 não é falha transitória, então os 2 retries automáticos dos SDKs oficiais e o fallback da sua camada de roteamento não cobrem ele. O saldo só aparece no Console (Settings > Billing), não há endpoint público de balance. Dá pra prevenir com auto-reload, limites de gasto e monitoramento de custo diário

Fala aí, beleza? A aplicação rodava lisa ontem, hoje toda chamada volta erro, e nenhum alerta apareceu antes disso

O consumo da Claude API roda em cima de um saldo pré-pago de créditos: você compra antes, e vai queimando conforme usa. Uso da API e do Workbench é cobrado assim, então sem saldo simplesmente não existe chamada

O detalhe cruel é que a conta acabando não chega como aviso de cobrança. Chega como erro de requisição no meio do teu código, parecendo bug de integração

Neste post a gente vai pelo caminho prático: diagnóstico (qual erro é qual), tratamento no código pra o usuário não comer a exceção crua, e prevenção pra você não descobrir o problema pelo relato de quem usa

Sintoma: erro 400 com "credit balance is too low"

Toda requisição volta HTTP 400 Bad Request. Não é uma rota, não é um prompt específico, é tudo

E aí começa a caça ao fantasma: você revisa o JSON, confere o nome do modelo, testa outro payload… e nada muda 🙃

Por que o 400 engana tanto?

Porque o corpo da resposta vem assim:

Formação Claude Code
Formação Recomendada

Formação Claude Code

Domine Claude Code do absoluto zero até o avançado

  • 120 aulas
  • 4 projetos
  • 9h 45min
{
  "type": "error",
  "error": {
    "type": "invalid_request_error",
    "message": "Your credit balance is too low to access the Anthropic API. Please go to Plans & Billing to upgrade or purchase credits."
  }
}

Repare no invalid_request_error

Esse é o mesmo tipo de erro que aparece quando a requisição está malformada. Ou seja, a falta de saldo não ganha um código de cobrança dedicado nesse caso, ela se disfarça de erro de payload

Se você não ler a message, vai passar a tarde debugando código que está certo

Solução: conferir o saldo e comprar crédito

  1. Abra o Console e vá em Settings > Billing, na página platform.claude.com/settings/billing. É ali que o saldo de créditos da organização aparece
  2. Se o saldo estiver zerado, clique no botão Buy credits e informe o valor que quer comprar
  3. Confirme a compra. Os créditos ficam disponíveis imediatamente depois dela

Um aviso honesto antes de você fechar o diagnóstico: ver saldo na tela ajuda, mas não encerra o caso sozinho. Existe relato de conta com saldo de créditos visível no Console recebendo credit_balance_too_low em toda requisição, e eu volto nesse ponto mais pra frente

O erro comum deste passo: olhar a assinatura do Claude.ai e achar que ela cobre a API. Não cobre, e daqui a pouco eu volto nesse ponto também

Como prevenir: auto-reload ligado

Na própria página de Billing existe a recarga automática (auto-reload), que você liga ou desliga

Você define um saldo mínimo da conta e o valor de recarga que entra quando esse mínimo é atingido. É o jeito mais barato de nunca mais viver isso

Tome cuidado com um detalhe: créditos de API comprados expiram um ano após a data da compra, e essa validade não pode ser estendida. Comprar um caminhão de crédito "pra nunca mais pensar nisso" tem prazo de validade

Sintoma: o retry automático e o fallback não resolvem esse erro

"Mas eu tenho retry configurado, tenho fallback pra outro provider, minha app não deveria cair"

Deveria, né? Só que não é assim que funciona aqui

Causa: erro de cobrança não é falha transitória

Os SDKs oficiais fazem retry automático apenas de falhas transitórias: erros de conexão, rate limit e 5xx. Isso com backoff exponencial, duas vezes por padrão, respeitando o header retry-after

Saldo insuficiente não entra nessa classe. E faz sentido: repetir a chamada não vai fazer crédito aparecer do nada 😅

Tem também o caso reportado no LiteLLM, em que o 400 de saldo baixo não aciona o fallback routing. A camada que você montou justamente pra segurar queda de provider deixa passar esse erro, porque ele não parece uma falha de infraestrutura

Solução e prevenção

Trate a falta de saldo como um caso explícito da sua aplicação, com caminho próprio

E não delegue esse cenário pra camada de roteamento. Ela cobre instabilidade, não cobre conta sem saldo

Sintoma: o usuário final recebe o erro cru da API

Aquela cena clássica: a mensagem em inglês sobre "credit balance" estampada na interface de quem só queria usar o teu produto

Além de feio, entrega pro usuário um problema que é teu

Causa: comparação de string em vez de tipo

Muito código trata erro de API assim: pega a exceção, procura um pedaço de texto na mensagem, decide o que fazer

Mensagem muda. Tipo não muda

A recomendação oficial é capturar as classes tipadas do SDK, do mais específico para o mais genérico. No SDK, 400 vira BadRequestError, 429 vira RateLimitError e 5xx vira InternalServerError. Todas estendem APIError / APIStatusError, e essa classe base expõe a propriedade de status

Solução: captura por classe, do específico ao genérico

import anthropic

client = anthropic.Anthropic()

try:
    resposta = client.messages.create(...)
except anthropic.BadRequestError:
    # 400: aqui mora o caso de saldo insuficiente
    # avisa o time e devolve mensagem amigavel pro usuario
    notificar_time("possivel falta de credito na Claude API")
    return mensagem_de_indisponibilidade()
except anthropic.RateLimitError:
    # 429: esse sim vale esperar e tentar de novo
    return enfileirar_novamente()
except anthropic.APIStatusError as erro:
    # qualquer outro status devolvido pela API
    registrar_log(erro)
    return mensagem_de_indisponibilidade()

Os nomes das classes mudam por linguagem, então não copie de cabeça de um SDK pro outro

O 404, por exemplo, é anthropic.NotFoundError em Python e Anthropic::Errors::NotFoundError em Ruby. Em Go a coisa é diferente: existe um único valor de erro, e você checa o StatusCode dele

O erro comum deste passo: inverter a ordem dos except e capturar a classe genérica primeiro, o que engole o caso específico e te deixa sem tratamento nenhum

Como prevenir

Duas saídas no mesmo lugar: mensagem de fallback pro usuário ("o serviço está indisponível agora") e alerta pro time quando o status indicar cobrança

O usuário não precisa saber do teu billing, mas alguém do time precisa saber AGORA

Sintoma: 402 billing_error e a confusão com a assinatura do Claude.ai

Existe um erro de cobrança que não é aquele 400 do saldo zerado

É o 402 billing_error, que indica problema de cobrança ou de dados de pagamento. A orientação oficial nesse caso é conferir os dados de pagamento no Console

A lista oficial de erros, pra você saber o que está olhando

Status Tipo O que costuma significar
400 invalid_request_error Requisição inválida (e é aqui que cai o saldo insuficiente)
401 authentication_error Problema de autenticação
402 billing_error Problema de cobrança ou de dados de pagamento
403 permission_error Sem permissão pro recurso
404 not_found_error Recurso não encontrado
413 request_too_large Requisição grande demais
429 rate_limit_error Limite de taxa atingido
500 api_error Erro interno da API
504 timeout_error Tempo esgotado
529 overloaded_error API sobrecarregada

A lista oficial de erros da Claude API tem esses dez códigos. Vale deixar essa tabela colada no teu handler, porque metade do diagnóstico é só saber em qual linha você caiu

Como prevenir: são dois sistemas de cobrança, não um

Aqui mora uma das confusões mais comuns

A cobrança da API no Console e a assinatura do Claude.ai são sistemas de cobrança separados, com mecânicas e limites diferentes. Crédito de um não banca o outro

Então "eu pago assinatura, minha API não deveria parar" não se sustenta. São contas diferentes, saldos diferentes, e o "credit balance" que aparece no erro é o da API

Sintoma: tem crédito, mas o uso pausou no meio do mês

Saldo na conta, tudo pago, e mesmo assim as chamadas param. Que raiva, né?

Duas causas prováveis aqui

Causa 1: o teto mensal do teu tier

Existem três tiers de uso: Start, Build e Scale, cada um com um teto mensal de gasto (há ainda um tier Custom, sem teto mensal, negociado com o time de contas)

Ao atingir o teto do tier, o uso da API pausa até o mês seguinte, a menos que você peça um limite maior

E se liga nisso: os tiers são atribuídos automaticamente pelo histórico de uso e pela situação da conta. Não existe depósito ou compra que promova a organização de tier, então despejar crédito na conta não resolve esse caso

Causa 2: um limite que você mesmo definiu

Dá pra definir um teto mensal de gasto e alertas de aproximação do limite no Console, em Settings > Billing, pelo botão Adjust limit (ou Set limit, se ainda não existir limite). Esse limite não pode ultrapassar o teto do tier

E cada workspace tem uma aba Spend limits, onde você limita o gasto mensal e configura notificação por e-mail ao atingir um valor. Sem configuração própria, o workspace herda o limite da organização

Ou seja: aquele limite conservador que alguém definiu há seis meses pode ser exatamente o que derrubou a aplicação hoje

E lembra do alerta lá do começo? Existe caso reportado de conta com saldo de créditos visível no Console recebendo credit_balance_too_low em toda requisição. Saldo visível nem sempre é garantia de requisição aceita, então não descarte a hipótese de cobrança só porque o número na tela está bonito

Solução e prevenção

Pedido de limite maior sai pelo Console, e fica disponível a partir de 50% de uso dos limites atuais. Ou seja, dá pra pedir antes de bater a parede

E configure a notificação por e-mail na aba de spend limits do workspace. É configuração de cinco minutos que compra sono tranquilo

Sintoma: você só descobre o problema pelo relato do usuário

Esse é o pior de todos: a app parou às 3 da manhã, e a primeira notificação foi um print no WhatsApp às 9

Causa: não existe endpoint público de saldo

Essa é a parte que costuma surpreender quem quer montar um painel: não existe endpoint público da API pra ler o saldo de créditos restante

A consulta a GET /v1/organizations/balance retorna 404, e a exposição do saldo segue como pedido de recurso em aberto. O saldo, hoje, mora no Console

Solução: monitorar consumo pela Usage and Cost Admin API

Saldo você não lê por API, mas consumo você lê

A Usage and Cost Admin API dá acesso programático a uso e custo históricos da organização, equivalente às páginas de Usage e Cost do Console. Os endpoints são:

  • GET /v1/organizations/cost_report
  • GET /v1/organizations/usage_report/messages

A chamada usa uma Admin API key, que é diferente da chave de API comum. Ela tem o formato sk-ant-admin... e é provisionada no Console apenas por membros com papel de admin

GET /v1/organizations/cost_report
x-api-key: sk-ant-admin...
anthropic-version: 2023-06-01

O erro comum deste passo: tentar autenticar com a chave comum da aplicação. Não vai rolar, é outra credencial

Dois detalhes operacionais que economizam teu tempo: o relatório de custo aceita apenas buckets diários (1d), então esqueça granularidade por hora ali. E os endpoints da Spend Limits API compartilham um limite único por organização de 60 requisições por minuto, com 429 no excedente. Se o teu job de monitoramento for guloso, ele mesmo vira o problema 😅

Já que a conversa é gasto: boa parte do custo que some do radar vem de chamada mal aproveitada, e aí vale revisar como aproveitar melhor o Claude Opus antes de simplesmente comprar mais crédito

Como prevenir: três camadas

  • auto-reload ligado, com saldo mínimo e valor de recarga definidos
  • alertas de aproximação do limite de gasto, no Console e no workspace
  • monitoramento de custo diário pela Admin API, com o número indo pro mesmo painel onde teu time já olha

O que aprendi construindo aplicação que depende de API externa

Esse tipo de dor eu conheço de perto, e não é de hoje

No vídeo abaixo eu mostro um projeto de aplicação de clima em HTML, CSS e JavaScript consumindo a OpenWeather API. Fiquei no plano gratuito de propósito, porque os dados básicos já bastavam pro que eu queria construir

E a lição número um apareceu antes da primeira linha de integração: cadastro e geração da chave são etapas obrigatórias, e é justamente aí que boa parte de quem tenta o projeto desanima

Eu testei a chave isolada, direto na URL da API, antes de escrever o código do projeto. Resultado: 401

Se eu tivesse pulado esse teste, eu ia acusar o meu fetch de estar errado, quando o problema era a credencial recém-criada que ainda não respondia. Contornei usando outra chave que já tinha, e a resposta esperada apareceu na tela numa boa

Percebe o paralelo? O status estava dizendo tudo. Só que quem lê rápido demais culpa o código

Outra coisa que esse projeto deixa escancarada: a aplicação depende de vários serviços de terceiros ao mesmo tempo (clima, imagem de fundo, ícones, bandeiras). Se um deles não responde, a tela quebra na cara do usuário

Por isso eu já deixei previsto ali um estado de carregamento com ícone, pra dar retorno visual quando a resposta demora em conexão lenta, e um tratamento de erro pra cidade inexistente, exibindo mensagem de falha em vez de tela morta

É exatamente o mesmo raciocínio da Claude API sem saldo: a diferença entre "o serviço está indisponível agora, tente em instantes" e uma exceção crua vazando pro usuário é um bloco de tratamento de erro que você escreve uma vez

Conclusão

Falta de crédito não é bug, é falha operacional previsível. E ela tem três características que fazem toda a diferença no teu diagnóstico

Ela chega como 400 com invalid_request_error, disfarçada de erro de payload

Ela não é falha transitória, então retry automático e fallback routing não cobrem ela

E o saldo só existe no Console, porque não há endpoint público de balance pra você consultar

Próximo passo, hoje mesmo: abre platform.claude.com/settings/billing, confere o saldo, liga o auto-reload com saldo mínimo e valor de recarga, e depois volta no teu código pra revisar o bloco de tratamento de erro por classe tipada

São vinte minutos de trabalho que evitam aquela madrugada de debug atrás de um problema que nunca esteve no código 🙂

até o próximo post!

Perguntas frequentes

Como saber quanto de crédito ainda resta na minha conta da Claude API?

Não existe endpoint público pra isso: a chamada a GET /v1/organizations/balance retorna 404, e expor esse saldo pela API segue como pedido de recurso em aberto. O jeito confiável é abrir o Console em Settings > Billing (platform.claude.com/settings/billing), onde o saldo disponível da organização aparece na tela.

Dá para consultar uso e custo da Claude API por código, sem abrir o Console toda hora?

Dá, pela Usage and Cost Admin API, com os endpoints GET /v1/organizations/cost_report e GET /v1/organizations/usage_report/messages. Isso exige uma Admin API key (formato sk-ant-admin…), provisionada só por quem tem papel de admin no Console, enviada no header x-api-key junto com anthropic-version: 2023-06-01. O relatório de custo só aceita bucket diário (1d).

Os créditos da Claude API vencem?

Vencem, sim: créditos comprados expiram um ano depois da data da compra, e essa validade não pode ser estendida. Por isso não adianta comprar um valor gigante achando que resolve o problema pra sempre.

A assinatura do Claude.ai cobre os créditos da Claude API?

Não. São dois sistemas de cobrança separados, com mecânicas e limites diferentes, e essa mistura é uma fonte clássica de confusão. O saldo da assinatura do Claude.ai não abastece o credit balance da API, que é pré-pago e comprado à parte no Console.

Por que recebo saldo insuficiente mesmo vendo saldo disponível no Console?

Já existe relato de organização com saldo visível no Console recebendo credit_balance_too_low em toda requisição feita à API. Isso mostra que ver saldo na tela de Billing não é garantia absoluta de que a chamada vai ser aceita, então vale conferir a mensagem completa do erro 400 antes de assumir que é só falta de crédito.

O que acontece quando minha organização atinge o teto mensal do tier (Start, Build ou Scale)?

O uso da API pausa até o mês seguinte, a menos que você peça um limite maior no Console. A promoção de tier é automática, baseada em histórico de uso e situação da conta (não existe compra que promova direto), e o pedido de limite maior fica liberado a partir de 50% de uso dos limites atuais. Também dá pra definir um teto próprio e alertas de aproximação em Settings > Billing, no botão ‘Adjust limit’ ou ‘Set limit’.




Escrito por | Matheus Battisti

Matheus Battisti
Fundador da Hora de Codar

Programador apaixonado pelo mundo das tecnologias, sempre buscando em aprender e se aprofundar em linguagens, frameworks e o que mais for necessário para executar um bom trabalho. Agora tem uma nova missão que é de passar seu conhecimento adiante para formar novos programadores e especializar mais os que já são.

Subscribe
Notify of
guest

0 Comentários
Oldest
Newest Most Voted

Formações

Formação Vibe Coding

Formação Vibe Coding

Do Prompt ao Produto: Crie Software Real com IA

  • 474 aulas
  • 20 projetos
  • 39h 27min

Blog | Mais populares