ZeroEval supports opt-in source-side PII redaction in the Python and TypeScript SDKs. When enabled, sensitive values in ingested payload fields (Documentation Index
Fetch the complete documentation index at: https://docs.zeroeval.com/llms.txt
Use this file to discover all available pages before exploring further.
input_data
and output_data) are redacted before spans are sent by the SDK.
This is an SDK-side feature. ZeroEval does not rely on backend-side redaction
for this behavior.
Enable redaction
- Python
- TypeScript
redact_inputs, sensitive_keys,
and custom_patterns. TypeScript uses the camelCase equivalents redactInputs,
sensitiveKeys, and customPatterns.
What gets redacted
Redaction applies to ingested payload fields only:input_data(the value passed tosetIO/set_io)output_data(the value passed tosetIO/set_io)
- email addresses
- phone numbers
- SSN-style identifiers
- PAN / credit card numbers
- bearer tokens, JWTs, and common API key formats
- cookie and authorization header values
- IP addresses
email, phone, password, token, authorization, cookie, and
api_key / apiKey when they appear inside ingested IO payloads.
What stays intact
All span metadata outside ofinput_data and output_data is preserved
unchanged:
- span names
- trace IDs and span IDs
- timing and status fields
- attributes
- tags, trace tags, and session tags
- session identifiers and session names
- error messages and stacks
- token counts, model/provider metadata, and cost metadata
Placeholder behavior
Sensitive values are replaced with stable placeholders inside a single trace:- the same normalized sensitive value in one trace gets the same placeholder
- different values in the same trace get different placeholders
- placeholder assignment resets per trace
- matching is exact after normalization only
- this is not fuzzy identity resolution
Normalization and limitations
| Type | Normalization used for placeholder reuse |
|---|---|
| Trim + lowercase | |
| Phone | Digits only |
| SSN / PAN | Digits only |
| IP | Canonical or lowercase string as implemented by each SDK |
| Secrets | Exact trimmed string |
- there is no reversible backend token vault
- there is no de-anonymization support
- there is no fuzzy entity resolution across semantically related strings
- bypassing SDK capture paths bypasses this protection
Examples
The SDK repositories include runnable examples. In both examples, only the values passed toset_io / setIO are redacted. Session metadata, tags,
attributes, and error messages are sent unchanged.
- Python
- TypeScript
From In the resulting span:
zeroeval-sdk/examples/pii_redaction.py:input_data.emailbecomes[REDACTED_EMAIL_A]input_data.phonebecomes[REDACTED_PHONE_A]output_data.resultcontains[REDACTED_EMAIL_A]session_id,session_name, andtags.customer_emailstay as-is