Billing API reports a healthy account while every request 400s with insufficient credits

Aberta
#1,081 2 comentários 0 reações 0 responsáveis Ver no GitHub

Mantenedores costumam responder em até 1 dia

Ninguém assumiu esta issue ainda.

Avaliação

Dificuldade
4/5
Tempo estimado
3-5 dias
Facilidade para iniciantes
42/100
Tipo de issue
Bug
Clareza
Razoavelmente clara
Status de atividade
Ativa
Stack de tecnologia
cli
Domínio
api, backend

Direção de pesquisa

Start by reading the /alpha/billing/credits handler and the request path that returns the insufficient credits error; the payload names no source files or tests. Compare how each path derives credit availability, then check the usage limits documentation and related issue #904. Done when the billing response gives clients a reliable signal that matches whether requests can be served, with the documented behavior aligned.

Escrita pelo modelo de indexação a partir do texto da issue.

Descrição

Summary

/alpha/billing/credits reports a healthy account (belowThreshold=false, both rolling windows at 0% used) while every completion request is rejected with insufficient credits. A client that automates fallback across providers therefore has no way to tell "this account can't serve requests" — it has to send a real request to find out.

Expected Behavior

If requests are refused, one of the documented fields should reflect it:

  • credits.belowThreshold = true, or
  • a new explicit flag (canRequest / insufficientCredits), or
  • windowLimits.exceeded / fiveHour.exceeded set.

Also, https://commandcode.ai/docs/resources/usage-limits ("What happens when I run out of credits?") says requests stop once your included credits reach zero, which suggests monthlyCredits would be 0 at that point. Here they stop at 0.084.

Actual Behavior

GET https://api.commandcode.ai/alpha/billing/credits → 200:

{
  "credits": { "belowThreshold": false, "creditThreshold": 0,
               "monthlyCredits": 0.0840296077, "purchasedCredits": 0, "freeCredits": 0 },
  "windowLimits": { "limited": true, "exceeded": null,
                    "fiveHour": { "used": 0, "cap": 14, "exceeded": false, "resetAt": 0 },
                    "weekly":   { "used": 0, "cap": 35, "exceeded": false, "resetAt": 0 } }
}

GET https://api.commandcode.ai/alpha/billing/subscriptions → 200: status: "active", planId: "individual-goat", currentPeriodEnd: "2026-11-04T14:00:31.000Z".

Any request fails, including a one-token one:

POST /provider/v1/chat/completions
{"model":"deepseek/deepseek-v4.1-flash","messages":[{"role":"user","content":"hi"}],"max_tokens":1}

HTTP 400
{"message":"You have insufficient credits to make this request. Please purchase more credits to continue using the service.",
 "type":"invalid_request_error","code":"BAD_REQUEST"}
x-trace-id: ab67b7089a5a839861c5a497f5d9fe96

So belowThreshold is unusable as a signal: with creditThreshold = 0 it can only trip exactly at zero. windowLimits.limited = true is not a signal either — it is true with both windows at 0% used, and windowLimits.exceeded is null, not false.

Steps to reproduce the issue
  1. Use an account whose included monthly credits are almost gone (0.084 here) with no purchased credits.
  2. curl -s -H "Authorization: Bearer $KEY" https://api.commandcode.ai/alpha/billing/credits → belowThreshold: false, monthlyCredits: 0.084, windows 0/14 and 0/35.
  3. curl -s -X POST https://api.commandcode.ai/provider/v1/chat/completions -H "Authorization: Bearer $KEY" -H "content-type: application/json" -d '{"model":"deepseek/deepseek-v4.1-flash","messages":[{"role":"user","content":"hi"}],"max_tokens":1}' → 400 insufficient credits.
Command Code Version

1.88.1 (provider-API behaviour; reproduced with plain curl, no CLI involved)

Operating System

Windows

Suggested fixes
  1. Add an explicit canRequest / insufficientCredits boolean to /alpha/billing/credits, or make belowThreshold honour a real minimum balance instead of creditThreshold = 0.
  2. Return the required amount / remaining balance in the 400 body, and a documented error code distinct from BAD_REQUEST.
  3. Document windowLimits.limited and windowLimits.exceeded (null vs false) — clients can only guess today.
  4. Align the "requests stop once your included credits reach zero" FAQ sentence with actual behaviour.

Related: #904 (non-interactive quota readout) is also helped by making these fields trustworthy.

Linguagem predominante
Sem dados de linguagem
Estrelas
4.2k
Forks
377
Merge médio
1d 3h
PRs com merge (30d)
6

Preparar o ambiente

Este projeto não oferece contêiner de desenvolvimento, Dockerfile nem guia de contribuição, então a configuração fica por sua conta: comece pelo README e veja nosso guia da primeira contribuição para os passos gerais.

Primeiros passos

  1. Leia a issue inteira e depois o guia de contribuição do projeto.
  2. Comente na issue dizendo que vai assumir — evita que duas pessoas façam o mesmo trabalho.
  3. Faça um fork do repositório e trabalhe em uma branch.
  4. Abra um pull request que referencie o número da issue.

Mais de CommandCodeAI/command-code

Todas as issues de CommandCodeAI/command-code

Issues semelhantes

Mais issues de Backend & API Design

Receba novas issues na sua caixa de entrada

Um resumo curto de issues do GitHub para quem está começando.