# Track Claude Code costs per developer and project

A team's coding-agent bill becomes useful when you can connect it to a project. Veqen records Claude Code's completed request events with developer and project identifiers. The resulting cost is labeled **reported**: it is an estimate from the coding tool, not proof of what your provider or subscription charged.

## Configure request logs

Create an **ingest** key in [API keys](https://veqen-app.com/app/settings/keys). Put it in your local shell or approved secret manager. Do not commit it to project settings.

```bash
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://veqen-app.com/v1/otlp/v1/logs
export OTEL_EXPORTER_OTLP_LOGS_HEADERS="Authorization=Bearer $VEQEN_API_KEY"
export OTEL_RESOURCE_ATTRIBUTES="veqen.project=checkout,veqen.user=developer-17,veqen.environment=development"
export OTEL_LOG_USER_PROMPTS=0
export OTEL_LOG_ASSISTANT_RESPONSES=0
export OTEL_LOG_TOOL_DETAILS=0
export OTEL_LOG_TOOL_CONTENT=0
claude
```

Use pseudonymous developer identifiers. Start a new Claude Code process after setting the variables. These are signal-specific exporter settings, so they do not redirect another backend's metrics. Veqen consumes per-request log records, not cumulative cost counters; sending a cumulative counter repeatedly would overcount spend.

Claude Code documents request logs with usage, cost and request identifiers. Its input-token field excludes cache reads and writes, which Veqen preserves separately. See [Anthropic's telemetry reference](https://code.claude.com/docs/en/monitoring-usage) for supported client versions and telemetry controls.

## What is recorded

Veqen accepts only `api_request` records, reads model, tokens, request time, duration and approved allocation fields, and ignores other event classes. It prefers integer `cost_usd_micros` over `cost_usd` when both are present. The same request identifier and timestamp sent again is deduplicated within your organization.

Prompts, responses, commands, tool arguments and email addresses have no mapping into this adapter. They are discarded on receipt. This does not prevent the sender from transmitting them: existing telemetry settings can still include private attributes. Use a local OpenTelemetry Collector to remove unwanted fields before export if your policy prohibits transmission. Keep detailed content capture disabled.

## Verify your first session

Make one short request in a project with a distinct identifier, wait for the log exporter to flush, then open [Veqen's dashboard](https://veqen-app.com/app). Filter by that project and inspect its model usage. The daily usage CSV aggregates these amounts; it does not expose the per-event reported-cost marker. If nothing arrives, check the endpoint, JSON protocol and key scope. A `401` means authentication failed; `415` means the exporter sent an unsupported encoding. A partial-success response identifies rejected records, while valid records in the same batch remain stored.

Do not instrument the same requests through a second SDK or trace exporter into Veqen. Request logs and independently generated SDK events do not share identifiers.

## Interpret cost carefully

Reported usage estimates can differ from subscription charges, negotiated rates, credits or provider invoices. Keep these figures separate from reconciled API spend when reviewing [AI COGS and R&D](/guides/accounting-for-ai-costs). An agent's activity can help allocate engineering expense without turning each estimate into a payable invoice line.

After-the-fact telemetry cannot stop a request already sent. Use [budget checks](/docs/budgets) in applications where you control the call boundary. For a team review, group by project first, then developer, and compare similar workloads before drawing conclusions about individual productivity.
