In short: Claude Code can export its usage with OpenTelemetry. Set five environment variables and every model call arrives in FiscaLLM with the developer, the model, the tokens and the cost. You get spend per developer and per team, a budget alert when someone passes an amount, and a warning when a session runs away. Nothing is installed on top of Claude Code and no traffic is proxied.
It suits a small team on the Team plan, or on Pro and Max seats, that wants one page and an alert without running a collector and Grafana. Some teams already have this from Anthropic; see what Anthropic already gives you before you sign up.
Create an app for your team's Claude Code usage and copy its key. Its Setup page shows the settings below with the key filled in. Use a separate app, not the one for a product. Then set these wherever Claude Code runs:
export CLAUDE_CODE_ENABLE_TELEMETRY=1
export OTEL_LOGS_EXPORTER=otlp
export OTEL_EXPORTER_OTLP_LOGS_PROTOCOL=http/json
export OTEL_EXPORTER_OTLP_LOGS_ENDPOINT=https://fiscallm.com/api/v1/otel/v1/logs
export OTEL_EXPORTER_OTLP_LOGS_HEADERS="Authorization=Bearer <FISCALLM_KEY>"For a whole team, put the same values in Claude Code's settings file instead (the managed settings your admin distributes, or each developer's ~/.claude/settings.json):
{
"env": {
"CLAUDE_CODE_ENABLE_TELEMETRY": "1",
"OTEL_LOGS_EXPORTER": "otlp",
"OTEL_EXPORTER_OTLP_LOGS_PROTOCOL": "http/json",
"OTEL_EXPORTER_OTLP_LOGS_ENDPOINT": "https://fiscallm.com/api/v1/otel/v1/logs",
"OTEL_EXPORTER_OTLP_LOGS_HEADERS": "Authorization=Bearer <FISCALLM_KEY>"
}
}http/protobuf works too. These variables are Claude Code's own; see its monitoring documentation for the full list.
A developer who is signed in to Claude Code is recorded under their email. Without a sign-in (an API key only), the account ID or Claude Code's anonymous install ID is used. To name people yourself, or to group by team, add resource attributes:
export OTEL_RESOURCE_ATTRIBUTES="team.id=platform,fiscallm.user_id=alice"| Value | Read from, in this order |
|---|---|
| Developer | fiscallm.user_id, user.email, user.account_uuid, user.account_id, user.id |
| Team | fiscallm.feature, team.id, team.name, team, department, cost_center. With none set, the team is claude-code |
| Model and tokens | model, input_tokens, output_tokens, cache_read_tokens, cache_creation_tokens |
| Cost | cost_usd (Claude Code's own figure, which knows about fast mode and cache lifetimes). If it is missing, the call is priced from the price table |
Only the claude_code.api_request event is read. Each call is stored once, by its request ID, even if Claude Code sends it again.
You may not need FiscaLLM. It depends on how your team pays for Claude Code.
| You use | Without FiscaLLM | Our advice |
|---|---|---|
| API keys, in the Claude Console | The Console has a Claude Code page with estimated spend per user | Start there. FiscaLLM adds alerts per developer and your own team grouping |
| Enterprise plan | An admin dashboard with usage and cost by group and by user, with spend limits | You probably don't need FiscaLLM |
| Team plan | The analytics dashboard shows usage and contribution, not cost per developer. Cost comes from the OpenTelemetry export or a CSV spend report | This is where FiscaLLM helps: a place to send that export, with no collector or Grafana to run |
| Pro or Max seats, one per developer | Each seat is its own account, so there is no shared view | FiscaLLM puts the team on one page |
| Only you | The /cost command, or a local tool such as ccusage | Use those. They are free and need no account |
| Amazon Bedrock or Google Vertex AI | The same OpenTelemetry export | Not tested with FiscaLLM yet. If you try it, tell us what you see |
As of November 2026. Plans change, so check Anthropic's analytics documentation. FiscaLLM is not affiliated with Anthropic.
Claude Code has one logs endpoint. To keep your current backend, put an OpenTelemetry Collector in between:
exporters:
otlphttp/fiscallm:
endpoint: https://fiscallm.com/api/v1/otel
headers:
Authorization: Bearer ${env:FISCALLM_KEY}
service:
pipelines:
logs:
receivers: [otlp]
exporters: [otlphttp/fiscallm, your-existing-exporter]fiscallm.user_id if you want a different name there.Run one prompt in Claude Code. Events are sent every few seconds, and the app's Setup page shows the first one when it arrives. To test the endpoint by hand, a 200 with an empty body means every model call was stored, a 200 with partialSuccess says what was skipped and why, and a 401 means the key is missing or wrong.
Partly. The Claude Console shows estimated spend per user for teams on API keys, and the Enterprise plan has cost by user and group. On the Team plan, and with Pro or Max seats, cost per developer comes from Claude Code's OpenTelemetry export, which needs somewhere to go. FiscaLLM is that place, with budget alerts.
No. It reads one kind of event, the model call (api_request): the model, the token counts, Claude Code's cost figure and who made the call. Every other event Claude Code sends is discarded on arrival. Claude Code also redacts prompt text in its telemetry unless you turn that on yourself.
It is Claude Code's own estimate of what each call costs at API prices. On a subscription you pay per seat, so read it as what the usage would have cost on the API: good for comparing developers and teams and for deciding who needs a bigger plan, not a copy of your invoice. With API keys it is close to the bill, but the provider's invoice is still the record.
Not yet. Only Claude Code is read today. If you need another agent, open an issue on GitHub and say which.
Yes. Send Claude Code to an OpenTelemetry Collector and give the logs pipeline two exporters, your backend and FiscaLLM. The Collector config is on this page.
It accepts 100,000 events per app per month, and one model call is one event. An agent makes many model calls per task, so the hosted service suits a small team or a trial. A larger team should self-host, which is free and has no limit.