Any plan or license works. We support them all. Ingestion is pure OpenTelemetry, independent of how you pay for the tool. There’s nothing to buy or upgrade to be measured.
You control what leaves the workstation. Navigara collects usage metadata: session and user IDs, model, cost, token counts, durations, tool names and details (shell commands, file paths), repository, and commit SHAs. The settings below also send prompt text, which names work items; turn off Collect prompt text in Settings → General and drop the prompt flag if you don’t want it. Assistant responses, tool output, and raw API bodies stay off. Prompts and tool inputs (for example, a file edit) can contain source code; set
OTEL_LOG_USER_PROMPTS and OTEL_LOG_TOOL_DETAILS to 0 if that must not leave the workstation.How it works
- You mint an ingest token: a write-only API token scoped to your organization.
- You configure the tool to export OTLP metrics (and logs, for identity) to Navigara’s endpoint with that token as a bearer header.
- Navigara attributes usage to contributors by email and materializes it into cost and token metrics. Usage shows up in Tool Spend within a few minutes.
Set up a connection (recommended)
The fastest path is the built-in wizard: it mints the token and generates the exact config for you:1
Open the AI tools group
Go to Settings → Connections. Alongside Source control and Task tracking, there is an AI tools group, “Usage telemetry from AI coding assistants”.
2
Pick a tool and name the connection
Choose Claude Code, GitHub Copilot, OpenAI Codex, or LiteLLM, then give the connection a name (e.g. by team, region, or backend). You can add more than one connection per tool.
3
Generate the token and config
Click Generate token & config. Navigara mints a write-only ingest token and drops it into a ready-to-copy config block. The token is shown once, so copy it now. (Use Preview config to see the snippet with a
<YOUR_INGEST_TOKEN> placeholder without minting anything.)4
Roll the config out
Apply the config to your workstations, fleet, or proxy using the per-tool instructions below. Usage appears in Tool Spend within a few minutes.
The ingest endpoint and token
If you’d rather wire it up by hand, everything the wizard produces comes down to two values. Endpoint: Navigara serves OTLP/HTTP at/api/otlp. OTLP clients append the signal path (/v1/metrics, /v1/logs) themselves.
Ingest token: create one at Settings → API Tokens → Create API Token. Any token works, but a dedicated Ingest only token (write-only, cannot read your data) is recommended; the AI-tools wizard mints exactly this. Pass it on every request as:
Identity is matched by email. Navigara joins usage to a contributor using the email the tool reports. Where a tool can’t emit an email natively, the snippets below set
enduser.id (usually from the developer’s git email); make sure it matches the email Navigara already knows the contributor by. Usage that can’t be matched still counts toward org totals; it just shows as unattributed until an email resolves.Claude Code
Claude Code has native OpenTelemetry support. It emits cost and token metrics, and, on Claude.ai (Team / Enterprise) sign-in, the developer’s email, account, and organization IDs on logs, which is how usage is attributed. Requires Claude Code v2.1.269 or later. These are the settings Navigara needs. They match what the Navigara CLI (curl -fsSL https://navigara.com/cli | sh) writes:
Where to put the settings
- Claude.ai organization (recommended)
- MDM file
- Shell snippet (per developer)
If your developers sign in to Claude Code with a Claude for Teams or Claude for Enterprise account, manage the settings once in Claude.ai. Claude Code loads them for every member of the organization, and developers can’t override them.Claude.ai sign-in emits each developer’s email natively, so no per-developer
1
Open the Claude Code admin settings
Sign in to Claude.ai as an organization Owner or Primary Owner. Go to Organization settings → Claude Code → Managed settings (claude.ai/admin-settings/claude-code).
2
Add the settings
Paste the JSON above, with your ingest token in
OTEL_EXPORTER_OTLP_HEADERS. If you already have managed settings, merge the env keys into your existing env object.3
Save
Developers get the settings the next time they start Claude Code. Usage appears in Tool Spend within a few minutes.
enduser.id is needed.Attribution by auth model
- Claude.ai sign-in (Team / Enterprise): Claude Code emits the user’s email and account IDs natively. Nothing else to add.
-
API key / Bedrock / Vertex: only an anonymous installation ID is emitted, so set
enduser.idto the developer’s email. Shared settings (Claude.ai or MDM) are identical for every developer, so set it per developer in the shell profile. Theenvof~/.claude/settings.jsonalso works, but JSON does not run commands, so write the email literally there ("OTEL_RESOURCE_ATTRIBUTES": "enduser.id=dev@example.com"). In the shell profile:
GitHub Copilot
Copilot CLI telemetry is off by default. Copilot configures OTLP through environment variables only (its~/.copilot/config.json has no telemetry settings), so for a fleet-wide rollout drop these into a shared profile (e.g. /etc/profile.d/) or a copilot launcher wrapper.
Copilot CLI does not ship protobuf export yet, so the protocol is pinned to
http/json, the encoding Navigara accepts for Copilot.OpenAI Codex
Codex configures OTLP through~/.codex/config.toml, not environment variables. Telemetry is off by default; this turns on its OTLP exporters and points them at Navigara. Usage rides metrics; identity rides logs. Add these tables at the end of the file, after any top-level keys: a key below a table header belongs to that table. TOML does not allow the same table twice, so if the file already has an [otel] table, add log_user_prompt = true to that table instead, and replace any exporter table it already has. The log_user_prompt line sends prompt text; drop it to keep prompts on the workstation.
enduser.id per workstation. It’s a per-developer value, so it belongs in the shell profile, not the shared config file:
Codex sets
service.name per surface (codex_exec, codex_tui); Navigara collapses these to one codex source automatically.LiteLLM
Run one LiteLLM proxy in front of your providers and Navigara captures proxy-wide token and cost usage for every tool that routes through it. Requires LiteLLM 1.89 or newer; earlier proxies readOTEL_ENDPOINT instead and don’t append the /v1/metrics path, so usage won’t arrive.
1
Enable the OTel callback in config.yaml
2
Set these on the proxy deployment
3
Attribute usage to developers
Pick whichever matches how developers authenticate to the proxy. All three land the email in
metadata.user_api_key_*, which Navigara resolves to a contributor.- Per-user virtual keys
- JWT / OIDC SSO
- User request parameter
Mint a virtual key per developer (
/key/generate or /user/new) and set that user’s user_email to their git/commit email. LiteLLM exports it as metadata.user_api_key_user_email.Troubleshooting
- Nothing in Tool Spend after a few minutes: confirm the endpoint ends in
/api/otlp(no/v1/...suffix except where a tool takes a full per-signal path, like Codex), and that theAuthorizationheader carries a valid ingest token. Restart the tool/proxy so it re-reads its config. - Usage shows up as unattributed: the tool isn’t emitting a resolvable email. For Copilot and Codex, set
OTEL_RESOURCE_ATTRIBUTES="enduser.id=..."; for Claude Code under API-key auth, add theenduser.idlauncher; for LiteLLM, wire one of the three identity models. The email must match the contributor’s known email. - Attribution resolves a day or two late: Navigara re-attributes a trailing window automatically, so late-arriving emails backfill without action.
- LiteLLM sends traces but no cost/tokens: set
LITELLM_OTEL_INTEGRATION_ENABLE_METRICS=trueand upgrade to LiteLLM ≥ 1.89. - Copilot export fails on protobuf: keep
OTEL_EXPORTER_OTLP_PROTOCOL=http/json; the CLI doesn’t ship protobuf export yet.

