Documentation
VerifiedTrail reads standard OpenTelemetry. There is nothing to install in your agent: point its exporter at the endpoint with an API key from Settings, and sessions appear within a minute.
Connect Claude Code
Set these in the shell that starts Claude Code, then use it as usual.
export CLAUDE_CODE_ENABLE_TELEMETRY=1 export OTEL_LOGS_EXPORTER=otlp export OTEL_EXPORTER_OTLP_PROTOCOL=http/protobuf # http/json works too export OTEL_EXPORTER_OTLP_LOGS_ENDPOINT=https://verifiedtrail.com/api/v1/otel/logs export OTEL_EXPORTER_OTLP_HEADERS="Authorization=Bearer $VERIFIEDTRAIL_API_KEY" export OTEL_LOG_TOOL_DETAILS=1 # optional, see below
The last variable makes Claude Code send tool arguments so they can be hashed. They are dropped before anything is stored. Leave it out and tool calls are still recorded, without an argument hash.
Connect through the OpenTelemetry Collector
The standard otlphttp exporter works with its defaults, protobuf and gzip included.
exporters:
otlphttp/verifiedtrail:
traces_endpoint: https://verifiedtrail.com/api/v1/otel/traces
logs_endpoint: https://verifiedtrail.com/api/v1/otel/logs
headers:
Authorization: "Bearer ${env:VERIFIEDTRAIL_API_KEY}"
service:
pipelines:
traces:
receivers: [otlp]
processors: [batch]
exporters: [otlphttp/verifiedtrail]Connect any OTLP exporter
Send OTLP over HTTP, as protobuf or JSON, to the traces endpoint with the header Authorization: Bearer and your key. gRPC is not supported. These attributes decide what an entry says:
| Attribute | What it becomes |
|---|---|
| gen_ai.agent.id, gen_ai.agent.name, service.name | Which agent this is. The first one present names the agent; an agent appears in the dashboard with its first event. |
| enduser.id, user.id | Who the agent was acting for. Shown as the principal on every entry and counted for AU-3 and AU-12. |
| gen_ai.operation.name, mcp.method.name | What kind of event it is: a model call, a tool call, an agent invocation, an MCP call. |
| gen_ai.tool.name, mcp.tool.name | The tool that was called. The daily review compares it with the authorization record. |
| gen_ai.request.model, gen_ai.usage.* | Model and token counts. |
| span status | Outcome: success, failure or unknown. |
Then confirm a session arrived and its chain recomputes:
curl -s -H "Authorization: Bearer $VERIFIEDTRAIL_API_KEY" \ https://verifiedtrail.com/api/v1/sessions/$SESSION_ID/verify
What is stored, and what never is
Stored per event: its type, time, tool, model, token counts, the principal, the outcome, trace and span ids, and non-content attributes up to 8 KB.
Never stored: prompts, model output, file contents, tool arguments and tool results. Arguments are hashed with SHA-256 so two calls can be shown to be the same without keeping what they said.
Each entry is hashed over every stored field plus the hash before it. The database rejects updates and deletes on audit rows. Once a day the head of each idle session is written to Sigstore Rekor and timestamped by DigiCert. How to check it yourself
API
| Route | Authentication | Purpose |
|---|---|---|
| POST /api/v1/otel/logs | API key | Claude Code log events. Other log records are ignored. |
| POST /api/v1/otel/traces | API key | Spans from any OTLP exporter. Up to 500 spans per request. |
| GET /api/v1/sessions/{id}/verify | API key or signed in | Recomputes the hash chain from the stored rows. |
| GET /api/v1/sessions/{id}/anchors | API key or signed in | The Rekor entry and RFC 3161 timestamp token for the chain head. |
| GET /api/v1/sessions/{id}/evidence.pdf | API key or signed in | Evidence package for one session. |
| GET /api/v1/orgs/{id}/evidence.pdf?from=&to= | API key or signed in | Evidence package for a period; the last 30 days if no dates are given. |
Re-sending the same spans is safe: entries already recorded are skipped.
| Status | Meaning |
|---|---|
| 401 | The API key is missing, wrong or revoked. |
| 400 | The body is not valid OTLP JSON, protobuf or gzip. |
| 413 | More than 500 spans in one request, or a body larger than about 4 MB as sent. Split the export. |
| 415 | A Content-Encoding other than gzip. |