DocsZero-code captureBrowse
Zero-code capture
Two paths put a record under agents you cannot or would rather not touch: a pipeline you already run, and a gateway you already run. Both are stated with their limits, because a capture path sold as complete is the one thing a compliance record must not be.
An OpenTelemetry pipeline you already run
Add one exporter to your Collector. POST /v1/traces is the standard OTLP path, so the generic endpoint is enough; the body may be protobuf or JSON, gzip or plain; and the mapper is the same one the SDKs apply in-process, held to parity by test. The file below is in the repository at deploy/otel-collector/config.yaml, verified under otelcol-contrib.
receivers:
otlp:
protocols:
grpc: { endpoint: 0.0.0.0:4317 }
http: { endpoint: 0.0.0.0:4318 }
processors:
batch: {}
exporters:
otlphttp/auditant:
endpoint: ${env:AUDITANT_ENDPOINT} # https://api.auditant.co
headers:
authorization: "Bearer ${env:AUDITANT_API_KEY}" # or x-auditant-webhook-secret
x-auditant-log: ${env:AUDITANT_LOG_ID}
compression: gzip
encoding: proto
service:
pipelines:
traces:
receivers: [otlp]
processors: [batch]
exporters: [otlphttp/auditant]No Collector? Any OTel SDK reaches the same endpoint with two environment variables and nothing installed:
OTEL_EXPORTER_OTLP_ENDPOINT=https://api.auditant.co OTEL_EXPORTER_OTLP_HEADERS=authorization=Bearer%20ak_…,x-auditant-log=tenant_acme/prod
A Collector config file is the least protected place a credential lives, so the write-only webhook secret is accepted here as well as the API key: leaking it costs spam, never disclosure. The agent on the record is the resource attribute auditant.agent_id, then the x-auditant-agent header, then OTel's own service.name.
A gateway you already run
One callback line on a LiteLLM gateway captures every model call from every agent behind it — including agents whose source you don't control — with MCP tool calls promoted to first-class tool_call events. The gateway can also enforce: its pre-call hook asks decide() and refuses or holds the request when armed (AUDITANT_ENFORCE=1); it starts in record-only mode, because a compliance product that blocks production traffic on install does not get a second call.
callbacks: auditant.gateway.handler # AUDITANT_API_KEY, AUDITANT_LOG_ID, AUDITANT_ENDPOINT in the gateway's env
What zero-code cannot do
blocking nothing arriving over OTLP can be stopped — spans describe what already
happened. The gateway can refuse a model call; only the SDK's guard()
can stop a tool before it runs.
custody hashes only over OTLP. There is no customer-side sink on a server that
received a span. Mode B custody is an SDK feature.
completeness only what your spans say. A tool call your framework emits no span for
is not on the record, and the coverage report says so.
TLS we do not intercept your HTTPS traffic, and will not. Capture is what
your process chooses to export or route — never a proxy in your path.Each of these is a deliberate line. The alternative on offer elsewhere — a proxy that terminates your TLS to read prompts — would put every payload through a third party to produce a record whose whole argument is that payloads never travel.