O caso: uma empresa liga a nova exportação OpenTelemetry da API do Claude e monta um painel de custo por requisição. O chatbot dela usa o Sonnet 5.5 com 30.000 tokens de instruções em cache. Uma requisição típica traz gen_ai.usage.input_tokens = 32.000 e output_tokens = 800. O painel mostra US$ 0,0720 por requisição. Está certo?
Resposta curta: não. O campo de entrada já inclui os tokens lidos do cache, que custam bem menos. A conta certa dá US$ 0,0150 por requisição. Num mês de 60.000 requisições (exemplo), o painel errado mostraria US$ 4.320,00 contra US$ 1.332,00 de custo de verdade, cerca de R$ 6.672,79.
O que mudou
Em 14 de outubro de 2026, a Anthropic lançou em beta a exportação OpenTelemetry da plataforma Claude, segundo as notas de versão oficiais. Com ela, você acompanha as requisições da Messages API e as sessões do Claude Managed Agents na ferramenta de observabilidade que já usa.
Há dois caminhos, e dá para usar os dois juntos:
| Caminho | Como liga | Quem pode | O que cobre |
|---|---|---|---|
| Rastreamento pelo SDK | Código: registra um tracer provider no app | Qualquer desenvolvedor | Clientes que usam o SDK oficial, em Python, TypeScript, C#, Go, Java, PHP e Ruby |
| Rastreamento pela API | Console: adiciona um destino OTLP | Papel de admin na organização | Qualquer cliente, na Claude Platform e na Claude Platform on AWS |
O modo padrão é só metadados: identificadores, tempo, status e contagem de tokens. O modo conteúdo completo também manda prompts e respostas. Para a conta de custo, os metadados bastam.
A documentação avisa que os nomes de spans e atributos podem mudar durante o beta. Confira antes de travar o seu painel.
Os campos que entram na conta
Os spans trazem a contagem de tokens nos atributos abaixo, segundo a referência oficial de spans:
| Atributo | O que conta |
|---|---|
gen_ai.usage.input_tokens |
Toda a entrada, já com leituras e gravações de cache |
gen_ai.usage.output_tokens |
A saída, incluindo os tokens de raciocínio |
gen_ai.usage.cache_read.input_tokens |
Tokens lidos do cache |
gen_ai.usage.cache_write.input_tokens |
Tokens gravados no cache |
anthropic.usage.cache_creation.ephemeral_5m_input_tokens |
Gravados no cache de 5 minutos (só Messages API) |
anthropic.usage.cache_creation.ephemeral_1h_input_tokens |
Gravados no cache de 1 hora (só Messages API) |
O ponto central está na primeira linha. Na resposta comum da API, o campo input_tokens traz só a entrada sem cache. No span, gen_ai.usage.input_tokens traz tudo somado. Quem copia a fórmula antiga erra a conta.
Nas requisições da Messages API, os spans trazem tokens, não preço. O valor você calcula com a tabela de preços.
A conta certa, passo a passo
Primeiro separe a entrada em três partes:
- Entrada sem cache =
input_tokens−cache_read−cache_write. - Leitura de cache =
cache_read. - Gravação de cache =
ephemeral_5meephemeral_1h, cada uma com seu preço.
Depois multiplique cada parte pelo seu preço e some a saída. No Sonnet 5.5, pela tabela do site atualizada em outubro de 2026:
| Parte | Tokens | Preço por milhão | Custo |
|---|---|---|---|
| Entrada sem cache | 2.000 | US$ 2,00 | US$ 0,00400 |
| Leitura de cache | 30.000 | US$ 0,10 | US$ 0,00300 |
| Saída | 800 | US$ 10,00 | US$ 0,00800 |
| Total | US$ 0,01500 |
Na requisição que grava o cache, os mesmos 30.000 tokens entram pelo preço de gravação de 5 minutos, US$ 2,50 por milhão. Essa requisição custa US$ 0,0870.
Os três erros que inflam o painel
| Como o painel calcula | Custo por requisição | Mês com 60.000 requisições | Diferença para o certo |
|---|---|---|---|
| Certo (partes separadas, 90% de acerto no cache) | US$ 0,0150 | US$ 1.332,00 | — |
input_tokens inteiro pelo preço cheio |
US$ 0,0720 | US$ 4.320,00 | 3,2 vezes |
input_tokens + cache_read, pelo preço cheio |
US$ 0,1320 | US$ 7.920,00 | 5,9 vezes |
| Certo, mas somando spans do SDK e da API | US$ 0,0300 | US$ 2.664,00 | 2 vezes |
O volume de 60.000 requisições e a taxa de 90% de acerto no cache são exemplo. O tamanho do erro cresce com o cache: quanto mais você economiza com ele, mais o painel errado exagera.
Erro 1: tratar tudo como entrada cheia. É o caso da abertura. O painel ignora que 30.000 dos 32.000 tokens saíram do cache.
Erro 2: somar o cache em cima da entrada. A documentação diz com todas as letras: input_tokens já inclui leituras e gravações. Não some de novo.
Erro 3: contar a mesma requisição duas vezes. Quando você liga o SDK e a API, cada requisição gera um span anthropic.messages.create do tipo CLIENT (SDK) e outro do tipo SERVER (API). A orientação oficial é somar só os spans da API. Dentro dos spans da API, some os anthropic.messages.create ou os anthropic.model_request, nunca os dois.
Outros detalhes que mudam o total
- Spans repetidos. A entrega é "pelo menos uma vez": o mesmo span pode chegar duas vezes. Se a sua plataforma não remove duplicados, conte cada span uma vez pelo ID do trace e do span.
- Compactação. No span do SDK, os tokens de compactação ficam fora de
gen_ai.usage.*, emanthropic.usage.compaction.input_tokenseoutput_tokens. Some à parte. Nos spans da API, some os spansanthropic.compaction. - Residência de dados. Se você usa
inference_geo: "us", a tabela oficial aplica um multiplicador de 1,1 em todas as categorias de token. No caso, a requisição certa iria de US$ 0,0150 para US$ 0,0165. - Modelo que respondeu. O atributo
gen_ai.response.modelmostra o modelo que de fato atendeu, que pode ser diferente do pedido quando há modelo de reserva. Use esse campo para escolher o preço. - Agentes gerenciados. Para sessões do Managed Agents, some os spans
anthropic.model_requesteanthropic.session.outcome_evaluation.
O mesmo erro em outros modelos
A mesma requisição de exemplo, com 30.000 tokens lidos do cache, em três modelos:
| Modelo | Conta certa | Painel com entrada cheia | Exagero |
|---|---|---|---|
| Haiku 5.5 | US$ 0,00090 | US$ 0,00360 | 4,0 vezes |
| Sonnet 5.5 | US$ 0,01500 | US$ 0,07200 | 4,8 vezes |
| Opus 5.5 | US$ 0,03000 | US$ 0,14400 | 4,8 vezes |
O exagero muda de um modelo para outro porque a relação entre o preço da leitura de cache e o da entrada não é a mesma em todos. Confira a tabela de cada modelo antes de montar a fórmula.
Span não é fatura
A própria documentação avisa: os spans exportados não são um registro completo do uso. A entrega é de melhor esforço, então um span pode se perder e não volta. Um cliente também pode desligar o rastreamento de uma requisição pelo cabeçalho traceparent. E a API não gera spans para o endpoint compatível com o SDK da OpenAI.
Use os spans para ver custo por funcionalidade, por cliente ou por agente. Para conferir a conta do mês e acompanhar cada chave de API, a orientação oficial é usar a Usage API.
Checklist antes de confiar no painel
- Separe entrada sem cache, leitura e gravação antes de multiplicar.
- Some só uma fonte por requisição (spans da API, se tiver os dois).
- Remova spans duplicados pelo ID do trace e do span.
- Some a compactação à parte quando ela aparece.
- Aplique 1,1 se a requisição usa
inference_geo: "us". - Compare o total do mês com a Usage API.
Perguntas frequentes
O input_tokens do span é igual ao da resposta da API?
Não. No span, gen_ai.usage.input_tokens já inclui leituras e gravações de cache. No caso, ele mostra 32.000, dos quais só 2.000 pagam o preço cheio de entrada.
Quanto o erro mais comum exagera a conta?
No caso de exemplo no Sonnet 5.5, o painel com entrada cheia mostra US$ 4.320,00 por mês, contra US$ 1.332,00 do custo certo: 3,2 vezes mais.
Posso usar os spans no lugar da fatura?
Não. A entrega é de melhor esforço e alguns pedidos não geram span. Use os spans para dividir o custo por funcionalidade e a Usage API para fechar o mês.
Preciso ser admin para ligar?
Para o destino na API, sim: só o papel de admin adiciona ou muda destinos no Console. O rastreamento pelo SDK não pede permissão especial.
E com residência de dados nos EUA?
A requisição do caso sai por US$ 0,0165 em vez de US$ 0,0150, pelo multiplicador oficial de 1,1. No mês de exemplo, US$ 1.465,20.
Quer ver quanto o cache economiza no seu caso? Use a calculadora de cache de prompt com o tamanho do seu prefixo e a taxa de acerto.