or-otel sends usage from Claude Code (terminal and Claude Desktop) and Codex (terminal and desktop app) to OpenReason, so you can see usage and cost by organization, team, and user. Requests still go directly to Anthropic or OpenAI and are billed to your own subscription.
To bill requests to your org and apply budgets instead, use claude-or.
Prerequisites
Install
1
Run the installer
Open Terminal and run:
- Enter your password for sudo when asked. This installs
or-otelto/usr/local/bin. - Paste your OpenReason API key when asked. Nothing shows while you paste — that’s expected.
- Enter your sudo password again if asked. This writes the Claude Code and Codex config.
Restart your AI tools (required)
- Claude Desktop and Codex app: fully quit with Cmd+Q (closing the window isn’t enough), then reopen.
- Claude Code and Codex CLI: open a new terminal window and start a new session.
3
Check it works
✓, ending with router accepts exports.Then send one prompt from each tool you use, in a new terminal:Install options
Pass options toor-otel setup after bash -s --, or set environment variables before bash:
Usage only, no prompt text
Key up front (CI, MDM, scripted rollout)
A different router
OR_ROUTER_URL only if your admin gives you a router URL. The default is https://api.openreason.app.
What gets sent
Prompt and response text is redacted for secrets and kept up to 256k characters each. Longer text is cut and the row is marked truncated.
To send usage only, without text:
or-otel setup --log-prompts to turn text back on.
Commands
Update
Uninstall
[y/N], then removes the Claude Code and Codex telemetry config, your saved key (~/.openreason/otel), and or-otel itself. Claude Code and Codex stay installed and work as normal. Fully quit and reopen them afterwards.
Troubleshooting
✗ couldn't download or-otel
✗ couldn't download or-otel
Check your network or VPN, and that the install URL is the one your admin gave you.
or-otel: command not found after install
or-otel: command not found after install
Open a new terminal.
/usr/local/bin is on the default macOS PATH. If you’ve changed yours, run the full path:✗ Key rejected (HTTP 401)
✗ Key rejected (HTTP 401)
Setup shows If your admin gave you a different router, add
rejected this key, or or-otel doctor shows router rejects the key. The key is invalid, revoked, or doesn’t match the router — for example, a development key against production.Create a new key at admin.openreason.app/dashboard/api-keys, then re-run setup and paste it:--router https://<router-url>.✗ that doesn't look like an sk-or_ key
✗ that doesn't look like an sk-or_ key
OpenReason API keys start with
sk-or_. Copy the full key from admin.openreason.app/dashboard/api-keys and re-run or-otel setup.✗ router unreachable
✗ router unreachable
Check your network or VPN and retry. If it persists, tell your OpenReason admin — the router may be down.
✗ Claude Code config has no auth header
✗ Claude Code config has no auth header
The config was written by an older
or-otel. Update it:doctor shows all ✓, but a tool isn't in the audit log
doctor shows all ✓, but a tool isn't in the audit log
Fully quit (Cmd+Q) and reopen the tool, then start a new session. Terminals must be opened after setup to pick up the config.
⚠ an MDM profile is installed
⚠ an MDM profile is installed
Your company manages Claude Code or Codex centrally, and those settings take priority over
or-otel. Ask your IT team.or-otel doctor to your OpenReason admin.
For admins
Where the config lives
Where the config lives
or-otel setup writes each tool’s managed (admin) config. Managed config sits above the user’s own ~/.claude and ~/.codex settings, so it covers existing and future installs, and users can’t switch it off from their own settings.The managed config files hold the user’s key and are readable by other local accounts. On shared machines, push the same settings through MDM instead.
Unattended installs
Unattended installs
Pass the key up front to skip every prompt except
sudo:MDM rollout
MDM rollout
Skip the installer and deploy configuration profiles instead:
com.anthropic.claudecode— the same keys as the Claude Code JSON file above.com.openai.codex—config_toml_base64holding the[otel]block, andrequirements_toml_base64holding theStophook for Codex replies.or-otelmust still be installed for the hook to run.
or-otel writes. or-otel setup and or-otel status warn when one is installed.Claude Team and Enterprise orgs
Claude Team and Enterprise orgs
If your org sends any settings from the claude.ai admin console, Claude Code takes managed settings from there first.
or-otel puts the auth header in env for this reason, because env is still merged from the local file.To have the whole local file apply, set "managedSourcesBehavior": "merge" in the claude.ai admin console.Next
Claude Code with OpenReason
Route Claude Code through OpenReason instead, so prompts bill to your org’s key and per-user budgets apply.