Para onde estão indo seus tokens? Como auditar o gasto de uma tarefa no Claude Code e na API

Antes de cortar prompt, meça: o gasto de tokens de uma tarefa aparece em lugares diferentes conforme onde você trabalha. No Claude Code, /usage mostra o uso da sessão, as flags de long context e cache misses (a partir de 10% do uso recente) e a atribuição por skills, subagents, plugins e MCP servers; /context mostra o que enche a janela. Na API, a resposta separa input_tokens, output_tokens, cache_creation_input_tokens e cache_read_input_tokens, e o count_tokens estima antes de rodar. Na organização, usage_report, cost_report e a página Cost and Usage Reporting do Console fecham a foto.
Dica de economia de token sem número na frente é chute com cara de conselho
A conta sobe, alguém sugere "escrever prompts menores", e ninguém sabe dizer de onde veio o consumo: se foi entrada, se foi saída, se foi cache mal aproveitado ou se foi o histórico da conversa sendo arrastado por 40 turnos
A ordem certa é o contrário do que costuma acontecer: primeiro tu descobre para onde o token está indo, depois tu corta o que realmente pesa
Então bora abrir as três camadas onde esse número está visível: o Claude Code no terminal, a resposta crua da API e a visão de organização no Console
O que você precisa antes de começar a auditoria
Cada camada de auditoria pede um acesso diferente, e é comum a pessoa travar no meio porque tentou rodar o passo de organização com a chave errada
Separa assim antes de começar:
- Claude Code instalado e uma sessão rodando: é o que te dá
/usagee/context. Ressalva importante: a atribuição do uso por skills, subagents, plugins e servidores MCP individuais aparece nos planos Pro, Max, Team ou Enterprise - Chave de API padrão: serve pra ler o bloco
usageque volta em cada resposta e pra chamar o endpoint de contagem de tokens - Admin API key: é uma chave diferente da padrão, com prefixo
sk-ant-admin, provisionada no Claude Console só por um membro com papel admin. Sem ela, os endpoints de usage report e cost report não abrem - Atenção ao ambiente: esses endpoints programáticos de Usage e Cost não estão disponíveis no Claude Platform on AWS
Se tu não tem a Admin API key, beleza: os passos que rodam no Claude Code e os que rodam com a chave padrão seguem valendo, só a visão de organização fica de fora
Domine o Claude Code do básico ao avançado
Você vai aprender a criar sistemas completos com Claude Code, sem precisar ser programador. Inscreva-se para ter acesso a um desconto de lançamento e bônus especiais!
Passo a passo: como auditar o gasto de tokens de uma tarefa
A sequência vai do mais barato (um comando no terminal) pro mais trabalhoso (chamada autenticada de organização)
Roda na ordem e para quando a resposta aparecer, não precisa ir até o fim sempre
- Rode
/usagedentro do Claude Code e leia o bloco Session
/usage
O bloco Session mostra o uso de tokens da API e as estatísticas detalhadas de token da sessão atual
Dentro dele tu alterna a janela de análise: d mostra as últimas 24 horas, w mostra os últimos 7 dias
Repara também nas flags de comportamento: long context e cache misses acendem quando um deles responde por 10% ou mais do uso recente
E, nos planos Pro, Max, Team ou Enterprise, tem a parte mais útil de todas: a atribuição do uso recente por skills, subagents, plugins e servidores MCP individuais, cada um como percentual do total
O erro comum deste passo: tratar o valor em dólar do CLI como fatura. Ele é calculado localmente a partir das contagens de token, com preços de tabela padrão. Pra faturamento autoritativo, a referência é a página Usage no Claude Console
- Rode
/contextquando a conversa estiver longa
/context
Esse comando mostra o que está ocupando a janela de contexto
É o raio-x do "contexto arrastado": aquilo que entra de novo em toda requisição sem ninguém pedir
O erro comum deste passo: sair rodando /compact de cara. O /compact resume a conversa pra liberar espaço na janela, e isso é ótimo, mas se tu comprime antes de olhar, tu perde a única chance de saber QUEM estava ocupando o espaço
Olha primeiro, comprime depois
- Leia o bloco
usageda resposta da API
A resposta da API traz o uso separado em quatro campos, e cada um conta uma história diferente:
| Campo | O que é |
|---|---|
input_tokens |
entrada que não veio do cache nem criou cache |
output_tokens |
tokens gerados na resposta |
cache_creation_input_tokens |
tokens escritos no cache |
cache_read_input_tokens |
tokens lidos do cache |
O total de entrada da requisição é a soma dos três campos de entrada:
total de entrada = input_tokens + cache_creation_input_tokens + cache_read_input_tokens
E os dois campos de cache não custam o mesmo que a entrada padrão: criação de cache é cobrada a uma taxa maior, leitura de cache a uma taxa reduzida
O erro comum deste passo: somar só input_tokens e achar que a conta fecha. Não fecha, e o buraco costuma estar exatamente no cache
A saída também merece atenção, porque output_tokens é o que a IA gerou, não o que tu escreveu. Quem acompanhou a discussão sobre o raciocínio estendido do Claude já tem uma intuição de por que resposta longa não é detalhe de estilo, é linha do consumo
- Estime antes de executar com o
count_tokens
Dá pra contar os tokens de uma mensagem ANTES de mandar ela pra inferência, incluindo tools, imagens e documentos:
curl -X POST https://api.anthropic.com/v1/messages/count_tokens \
-H "content-type: application/json" \
-d '{
"model": "<o mesmo model id que você vai usar na inferência>",
"messages": [
{ "role": "user", "content": "sua mensagem aqui" }
]
}'
Os headers de autenticação e de versão da API são os mesmos que tu já manda nas chamadas normais de mensagens, então reaproveita o que já está no teu cliente
O erro comum deste passo: passar um model ID diferente do que vai rodar de verdade. A contagem é específica por modelo, então o número só vale se o model bater
E tem o clássico: tentar contar token de modelo Claude com tiktoken. A recomendação é não fazer isso
- Suba pra visão de organização
Quando a pergunta deixa de ser "essa tarefa" e vira "o time inteiro", existem dois endpoints separados
O de uso:
GET /v1/organizations/usage_report/messages
Ele trabalha com buckets de tempo fixos (1m, 1h ou 1d), quebra os dados por modelo, workspace e service tier, e separa entrada não cacheada, entrada cacheada, criação de cache e saída
O de custo:
GET /v1/organizations/cost_report
Esse devolve custo por serviço em USD, como strings decimais, cobrindo tokens, web search e code execution
Os dois pedem a Admin API key sk-ant-admin, não a chave padrão
O erro comum deste passo: tentar autenticar com a chave de API do projeto e ficar batendo cabeça no 401
Sem código também dá: a página de Cost and Usage Reporting do Claude Console filtra por workspace, modelo, período (mês ou dia) e chave de API, e exporta em CSV
Pra quem só quer levar o número pra reunião, o CSV resolve
Como ler o resultado: três diagnósticos que a auditoria entrega
Número solto não muda nada
O que muda é o diagnóstico que ele permite. E, na prática, quase todo caso cai em um destes três
Diagnóstico 1, contexto arrastado:
Sintoma: o /context mostra a janela lotada e a flag de long context acende no /usage
Isso é histórico inchado sendo reenviado a cada turno
Ação: /compact pra resumir a conversa e liberar espaço, e delegar a saída verbosa a subagents. A própria documentação de custos aponta esse caminho: mandar rodar testes, buscar documentação ou processar logs num subagent mantém a saída barulhenta no contexto DELE e devolve só um resumo pra conversa principal
É a diferença entre despejar 800 linhas de log no seu contexto e receber "3 testes falharam, aqui está o motivo"
Diagnóstico 2, cache mal aproveitado:
Sintoma: cache_creation_input_tokens alto, cache_read_input_tokens baixo, e a flag de cache misses acesa no /usage (lembrando: ela só acende a partir de 10% do uso recente)
Leitura: tu está pagando a taxa maior pra ESCREVER cache e quase não colhe a taxa reduzida de LEITURA
Aqui o alvo do corte não é o tamanho do prompt, é o que está invalidando o cache entre uma chamada e outra
Diagnóstico 3, o culpado nomeado:
Sintoma: nada parece absurdo, mas o total não fecha com a percepção do time
Ação: abre a atribuição do /usage por skills, subagents, plugins e MCP servers
Cada peça aparece como percentual do total, então em vez de "vamos usar menos MCP", tu consegue dizer qual servidor especificamente come a fatia
Muito mais confortável de defender numa call, né? 🙂
Auditoria contínua: telemetria do Claude Code e o Agent SDK
Tudo acima é foto pontual
Se tu quer série histórica (gráfico, alerta, comparação semana a semana), o caminho é telemetria
- Ative a exportação no Claude Code por variáveis de ambiente
export CLAUDE_CODE_ENABLE_TELEMETRY=1
export OTEL_METRICS_EXPORTER=otlp
export OTEL_EXPORTER_OTLP_PROTOCOL=grpc
export OTEL_EXPORTER_OTLP_ENDPOINT=http://seu-coletor:4317
O OTEL_METRICS_EXPORTER aceita otlp, prometheus, console ou none. Se tu só quer ver saindo alguma coisa na tela antes de montar coletor, console já serve
O destino vai em OTEL_EXPORTER_OTLP_PROTOCOL e OTEL_EXPORTER_OTLP_ENDPOINT
- Leia a métrica que interessa
A métrica claude_code.token.usage separa o consumo em input, output, cache read e cache creation, e quebra por modelo
É o mesmo recorte do bloco usage da API, só que virando linha do tempo em vez de resposta única
- Valide que a telemetria está chegando
O erro comum deste passo: configurar tudo, não ver dado nenhum e concluir que "não funciona"
A checagem indicada é procurar no seu backend a métrica emitida no início da sessão:
claude_code.session.count
Se nada chegar, roda o CLI em modo debug pra ver os erros de export do OTel:
claude --debug
Normalmente o problema aparece ali, endpoint errado ou protocolo trocado
- Se você constrói em cima do Agent SDK, colete no fim de cada chamada
O SDK devolve custo e uso quando a chamada termina: o result message traz total_cost_usd e o usage cumulativo
O uso por passo fica em message.message.usage no TypeScript e em message.usage no Python
O custo por modelo fica em modelUsage (TS) e model_usage (Python)
for await (const message of query({ prompt })) {
if (message.type === "result") {
console.log(message.total_cost_usd)
console.log(message.usage)
console.log(message.modelUsage)
}
}
Alerta que evita dor de cabeça: cada query() reporta apenas o custo daquela chamada, não o acumulado da sessão multi-turno
Se o teu agente faz cinco chamadas, tu soma as cinco. Já me ferrei uma vez confiando num número que era só do último passo
Meça primeiro, corte depois
A ordem é essa e não tem atalho: número antes de dica
Vale lembrar que a forma de medição muda conforme o tipo de conta. Em Team e Enterprise, o uso consome a alocação do assento de cada membro. Via Console e provedores de nuvem, o uso é cobrado por token da organização, com cada dev medido pelo método de autenticação que ele usou
E, de novo: o dólar que o CLI mostra é estimativa local calculada a partir das contagens de token. Billing autoritativo é a página Usage do Console
Próximo passo concreto pra hoje: na próxima tarefa que parecer cara, roda /usage e /context antes de mexer em qualquer coisa, e compara com o bloco usage que volta na resposta
Se os três apontarem pro mesmo lugar, tu achou o gasto
Se apontarem pra lugares diferentes, melhor ainda: tu acabou de descobrir que estava cortando a coisa errada 😀
até o próximo post!
Perguntas frequentes
Como saber se o gasto de tokens de uma tarefa veio de entrada ou de saída?
O bloco usage que volta em cada resposta da API separa isso em quatro campos: input_tokens, output_tokens, cache_creation_input_tokens e cache_read_input_tokens. O total de entrada é a soma dos três campos de entrada, e output_tokens conta só o que a IA gerou. Somar apenas input_tokens é o erro mais comum, porque o buraco costuma estar no cache.
Dá pra ver quanto cada skill, subagent ou servidor MCP está consumindo?
Dá, dentro do /usage no Claude Code, no bloco Session. Em planos Pro, Max, Team ou Enterprise ele mostra a atribuição do uso recente por skills, subagents, plugins e servidores MCP individuais, cada um como percentual do total. É a visão mais direta pra achar o que está pesando dentro de uma tarefa.
Por que o cache aparece separado no gasto de tokens em vez de contar como entrada normal?
Porque os dois tipos de token de cache têm preço diferente da entrada padrão: cache_creation_input_tokens é cobrado numa taxa maior, e cache_read_input_tokens numa taxa reduzida. Se esses dois campos ficam de fora da conta, o número final não fecha com o que realmente foi cobrado.
O valor em dólar que aparece no /usage do Claude Code é a fatura oficial?
Não. Esse valor é calculado localmente a partir das contagens de token, usando preços de tabela padrão, então serve como estimativa. Para faturamento autoritativo, a referência é a página Usage no Claude Console.
Preciso de acesso de admin pra auditar o gasto de tokens de toda a organização?
Sim, pros dois endpoints de organização. O usage_report/messages e o cost_report pedem uma Admin API key com prefixo sk-ant-admin, criada no Claude Console por um usuário com papel admin, diferente da chave de API padrão. Sem ela, esses relatórios não abrem.
Como estimar o gasto de tokens antes de rodar uma tarefa cara na API?
Chamando o endpoint count_tokens antes de mandar a mensagem pra inferência, que conta tokens incluindo tools, imagens e documentos. O ponto de atenção é passar o mesmo model ID que vai rodar de verdade, porque a contagem é específica por modelo. E vale lembrar: a recomendação é não usar tiktoken pra contar token de modelo Claude.
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 […]
