Overview
Bifrost records two kinds of information about every request. Metadata covers model, provider, token counts, cost, latency, status, and governance attribution. Content is the actual prompts, completions, and tool traffic. Metadata is what dashboards, budgets, and alerts run on. Content is what makes a log useful for debugging, and what compliance regimes care about. Bifrost lets you keep the first without the second.There is no single switch. Content is stripped independently at each destination, from that destination’s own setting. A log store with content disabled says nothing about what your BigQuery table or Datadog spans contain. This page covers how the layers compose.
What counts as content
Broadly, anything derived from the request or response body:
Attribution identifiers (user ID, team, customer, business unit, virtual key) are metadata, not content. They are never removed by a content setting. If end-user identifiers are sensitive in your deployment, treat that as a separate concern.
Where content can land
The control layers
1. Global: client.disable_content_logging
The default for the Bifrost log store. Set it to true and log rows keep metadata only.
2. Per-request: x-bf-disable-content-logging
Overrides the global setting for a single request, in either direction: true suppresses content for a request that would otherwise be logged, false captures content while the global setting is true.
Per-request overrides are off by default. Enable client.allow_per_request_content_storage_override first. While it is off, the header is ignored and the global setting is authoritative.
See Request Options for headers, context keys, and SDK examples.
3. Per-connector: each connector’s own flag
Every observability connector has an independentdisable_content_logging, defaulting to false. It is not inherited from the client setting.
Captured request headers (
request_headers on a connector, client.logging_headers on the log store) are exported regardless of any content flag. Only capture headers you intend to export.
Retaining content in object storage
Disabling content logging normally drops content permanently.client.retain_content_in_object_storage offers a middle ground: content is kept in the object storage bucket but never served back.
x-bf-disable-content-logging header, Bifrost:
- writes a metadata-only database row, with payload fields and the content preview cleared,
- offloads the complete payload to object storage, marked hidden,
- and never hydrates that payload back on reads. The Logs UI and the Logs API show metadata only.
Requirements and behavior
Interaction with other features
Raw byte storage.x-bf-store-raw-request-response only persists raw provider bodies when content logging is on for that request. With content logging off, raw bytes are dropped from the log row even if the header is set.
Guardrail redaction. When Enterprise redaction is enabled, redaction runs before persistence and before export, so connectors and object storage receive the redacted or placeholderized values. Reveal mappings stay on the Bifrost log row and are never exported. With disable_content_logging enabled, no reveal data is persisted at all. See Guardrail Redaction.
Log exports. Offloaded payloads carry the same fields the log row would have carried. See Log Exports.
Choosing a configuration
Metadata only, everywhere. Setdisable_content_logging: true on the client and on every connector. Confirm no connector is capturing headers you did not intend to export.
Metadata in Bifrost, content retained for security review. Set disable_content_logging: true and retain_content_in_object_storage: true, with object storage configured. Restrict bucket access to the reviewing team.
Content on by default, suppressed for sensitive traffic. Leave disable_content_logging: false, enable allow_per_request_content_storage_override, and send x-bf-disable-content-logging: true on the requests that need it.
Content in Bifrost, not in third-party tools. Leave the client setting off and set disable_content_logging: true on each connector.
