---
title: Agent Analytics privacy modes
description: "Compare the three Agent Analytics privacy modes (full, metadata_only, customer_enriched), what each one sends to Amplitude, and how to choose one before rollout."
product: general
lang: en
token_estimate: 1381
---
# Agent Analytics privacy modes

> For AI agents: a documentation index is available at [/docs/llms.txt](/docs/llms.txt). Append `.md` to any page URL for markdown, or send `Accept: text/markdown`.

An Agent Analytics privacy mode controls whether prompt and response text leaves your infrastructure. There are three modes: `full` sends message content, `metadata_only` sends none, and `customer_enriched` sends none but uses quality labels you compute yourself. Every mode still sends tokens, cost, latency, model names, and session grouping.

Choose the mode before wide rollout, because it determines what your legal review needs to cover. Amplitude recommends `full` with the AI SDK's default PII redaction. Built-in signals, topics, and LLM evaluators read message text, so the other two modes turn them off.

## What each mode sends

|  | `full` (default) | `metadata_only` | `customer_enriched` |
| --- | --- | --- | --- |
| Message content (`$llm_message.text`) | Sent | Not sent | Not sent |
| System prompt | Sent | Not sent | Not sent |
| Tool inputs and outputs | Sent | Not sent | Not sent |
| Score comments | Sent | Not sent | Not sent |
| Tokens, cost, latency, models, session grouping | Sent | Sent | Sent |
| Built-in signals and evaluators that read message text | Run | Not run | Not run |
| Data Quality Issues and code evaluators | Run | Run | Run |
| Your own enrichment through `trackSessionEnrichment()` | Available | Available | Available |

Most built-in signals, topics, and prompt-based evaluators read message text. When a session carries no text, Amplitude leaves their results off the `[Agent] Session Record` rather than guessing. The Data Quality Issues signal and any code evaluators you add still run. Cost, latency, token, error, and model metrics work in every mode. For what each signal reads, refer to [Agent Analytics built-in signals](https://amplitude.com/docs/amplitude-ai/agent-analytics/signals).

### `full`

Message content, system prompts, tool inputs and outputs, and score comments all reach Amplitude. Amplitude's built-in enrichment runs and produces the fullest signal set.

- The system prompt is optional, so you can omit it.
- The AI SDK redacts PII by default. It scrubs emails, phone numbers, SSNs, credit card numbers, and IP addresses before events leave your process. Built-in phone and SSN detection targets US formats. For international locales or domain-specific identifiers, add custom regex patterns or plug in your own redaction, such as Presidio.

### `metadata_only`

No message content, system prompts, tool payloads, or score comments leave your process. You still get tokens, cost, latency, model names, and session grouping, so analyses that don't need content still work.

### `customer_enriched`

No content leaves your process, the same as `metadata_only`. You run your own evaluation on your infrastructure and send the results through `trackSessionEnrichment()` (Node) or `track_session_enrichment()` (Python). Amplitude stores those labels on an `[Agent] Session Enrichment` event as you sent them.

You can send Session Enrichment events in any mode. `customer_enriched` is the mode where your labels are the main source of session-level quality data, because Amplitude's content-based signals have no text to read. Refer to [Provide your own session enrichments](https://amplitude.com/docs/sdks/agent-analytics/sdk#provide-your-own-session-enrichments).

## Apply the mode

How you apply the mode depends on your instrumentation path:

- **AI SDK (Node, Python)**: Set `contentMode` (Node) or `content_mode` (Python) once on `AIConfig`. The SDK routes every content-bearing channel through one gate. Refer to [Choose a privacy mode](https://amplitude.com/docs/sdks/agent-analytics/sdk#choose-a-privacy-mode) in the SDK reference.
- **OpenTelemetry**: Turn content capture on or off in your OpenTelemetry instrumentation. Refer to [Apply your privacy mode](https://amplitude.com/docs/amplitude-ai/agent-analytics/instrument-opentelemetry#apply-your-privacy-mode).
- **HTTP API or a standard Amplitude SDK**: You redact or omit four content-bearing properties yourself, before you call `track()`. Refer to [Redact content before tracking](https://amplitude.com/docs/amplitude-ai/agent-analytics/instrument-http-api#redact-content-before-tracking).

## Data residency

Agent Analytics runs in Amplitude's US and EU data centers. Send events to the data center that hosts your project. Your privacy mode applies the same way in both.

| Path | US | EU |
| --- | --- | --- |
| AI SDK | Default | Pass an Amplitude client configured for the EU. |
| OpenTelemetry | `https://api.amplitude.com/otlp/v1/traces` | `https://api.eu.amplitude.com/otlp/v1/traces` |
| HTTP API | `https://api2.amplitude.com/2/httpapi` | `https://api.eu.amplitude.com/2/httpapi` |
| `amplitude-ai-register-catalog` | Default | Add `--eu` |

The AI SDK sends events through a standard Amplitude client. For an EU project, configure that client for the EU and pass it in instead of an API key:

#### Node

```typescript
import * as amplitude from "@amplitude/analytics-node";
import { AmplitudeAI } from "@amplitude/ai";

amplitude.init(process.env.AMPLITUDE_AI_API_KEY!, { serverZone: "EU" });
const ai = new AmplitudeAI({ amplitude });
```

#### Python

```python
import os

from amplitude import Amplitude, Config
from amplitude_ai import AmplitudeAI

client = Amplitude(os.environ["AMPLITUDE_AI_API_KEY"], Config(server_zone="EU"))
ai = AmplitudeAI(amplitude=client)
```

