LLM observability for GDPR: masking personal data in traces

Prompts and outputs in traces are personal data stores under the GDPR, so masking, retention and erasure must be designed before tracing goes live. This page explains how to do that with self-hosted Langfuse or Phoenix.

On this page

Why LLM traces become personal data stores under GDPR

An LLM application that records full prompts and outputs is writing personal data into a new store every time a user types a name, an email address or a case detail. Masking in the application or in an OpenTelemetry Collector before export, combined with retention limits and a tested erasure procedure, is what keeps self-hosted traces manageable under the GDPR. Without those controls, the trace store becomes a large, loosely governed copy of personal data that is difficult to search, shrink or explain to a supervisory authority.

The GDPR requires no certificate, audit report or attestation, so there is no single document that makes a trace store compliant. Article 32 on security of processing applies to the trace store as it does to any other system holding personal data, covering access control to the UI, the API keys used by the SDK, and the PostgreSQL, ClickHouse, Redis or Valkey and S3-compatible storage behind a self-hosted Langfuse deployment. Article 17 on erasure applies as well, so the team must be able to find and remove a specific individual's data from traces, not only from the source application. Article 42 certification is voluntary and does not reduce the controller's responsibility, so the organization that operates the application remains accountable for what its traces contain.

The practical decisions sit with the controller and its implementation partner. Confirm which fields of each trace (prompt, completion, metadata, tool arguments) may contain personal data, decide where masking runs, and document the retention period for each storage tier. Then confirm with the vendor and in your own environment which masking and retention controls your chosen Langfuse edition provides, since some of them, including server-side masking and data retention policies, need an Enterprise license key. Before go-live, run an erasure test against a known identifier and record the result as evidence.

Which GDPR duties apply to trace data

Once prompts and outputs are recorded, the trace store becomes a set of records the GDPR governs in the same way as any other personal data store. The cards below set out the duties that shape how traces are collected, protected, kept, erased and moved, and the control on this page that answers each one.

Data minimization at capture

Collect only the fields an evaluation or cost review needs. A full prompt often carries names, account numbers or health details that no dashboard requires. Masking in the application or the OpenTelemetry Collector removes these values before they reach Langfuse, so the store never holds them. Check which span attributes carry raw user input, tool arguments and retrieved documents, since these are the usual sources of unexpected personal data.

Storage limitation and retention

Traces should not be kept longer than the purpose that justifies them. The retention period is a decision the organization must document, and it must be set against any longer duty to keep AI system logs. Self-hosted retention controls in Langfuse sit in the enterprise tier, so confirm whether the enterprise license covers the retention rules you need or whether a scheduled deletion job must run outside the platform.

Security of processing under Article 32

Article 32 asks the controller and processor to apply technical and organizational measures suited to the risk. For traces, this means encrypting storage and backups, restricting who can open trace views, and logging access to them. The trace store holds the same sensitive content as the source application, so its access model should match that application. Confirm which access controls are available in your Langfuse tier before you design around them.

Erasure requests under Article 17(1)

Article 17(1) lists six grounds on which a data subject can ask for erasure without undue delay, including withdrawn consent, a successful objection and unlawful processing. A trace store must be able to find every trace tied to one person across prompts, outputs, tool calls and evaluation datasets. Masking reduces this work but does not remove it, so define how a request is matched to traces and how deletion is recorded.

Transfers under Chapter V

Chapter V restricts personal data leaving the EU or EEA unless an adequate safeguard applies. A tracing service hosted outside your control can move prompts and outputs across that boundary without anyone deciding it should. Self-hosted storage in an EU or EEA region keeps traces where your transfer assessment expects them. Check where backups, support access and any evaluation model calls actually run.

Accountability without a certificate

The GDPR requires no audit report or certificate, and Article 42 certification is voluntary and does not reduce the controller's responsibility. What the organization must hold is evidence: a record of which fields are masked, the retention setting, access reviews and erasure logs. Treat these as operating records that show the controls work, and confirm with counsel or your data protection officer what evidence your supervisory authority would expect.

Mapping GDPR requirements to tracing controls

This table maps the GDPR obligations that bite on LLM traces to the controls an observability function needs and where to configure them in Langfuse or an OpenTelemetry Collector. Read each row as a question to put to your team: which control applies, where it runs, and what evidence you can show. The main takeaway is that masking before export and storage location decide most of your exposure, and some controls depend on the Langfuse enterprise license.

GDPR requirementWhat the observability function must doHow to configure it
Article 5 principles, including storage limitation (Article 5(1)(e), illustrative anchor)Keep prompts and outputs containing personal data only as long as the stated purpose requires, and delete them on a defined scheduleSet data retention policies in Langfuse (enterprise key); if unlicensed, run scheduled deletion jobs on ClickHouse and blob storage and document them
Article 25 data protection by design and by defaultStrip or pseudonymize personal data before it leaves the application, so traces hold as little personal data as possibleUse the Python SDK mask_otel_spans hook, the JS/TS LangfuseSpanProcessor mask function, or masking in the application or OpenTelemetry Collector
Article 32 security of processingRestrict who can view traces, encrypt data in transit and at rest, and log administrative accessProject-level RBAC and audit logs (enterprise key); TLS on Collector receivers and exporters; authenticator extensions such as OIDC on receivers
Article 17 right to erasure (grounds in Article 17(1))Find every trace tied to a data subject by trace ID or user ID, and delete it from all stores, including backups and evaluation datasetsTag traces with user or session IDs only as hashed pseudonyms; use Langfuse trace deletion through the API, then purge matching rows from ClickHouse and blob storage
Article 19 notification of erasure to recipientsPass erasure instructions to any downstream copies, such as exported datasets or evaluation sets, and record that this was doneKeep a register of exports and dataset IDs; confirm with your Langfuse vendor how deletions propagate to dependent objects
Article 30 records of processing and Article 32 access evidenceShow which systems hold trace data, who can access it and when access was granted or changedExport RBAC role assignments and audit logs (enterprise key) to your SIEM; keep the Collector and Langfuse configuration in version control
Chapter V transfers to third countries (Articles 44 to 50)Keep PostgreSQL, ClickHouse and blob storage in the approved region, with no replication or support access outside itPin PostgreSQL, ClickHouse and S3-compatible storage to EU-controlled accounts or data centers; confirm the location of any backup and log stream
Article 33 breach notification (Articles 33 and 34)Detect unauthorized access to trace stores quickly enough to meet the 72-hour window in Article 33Alert on audit log events and unusual export volume; test the alert path during rollout and document who is notified

Where to mask: SDK, OpenTelemetry Collector or Langfuse server

The Langfuse Python SDK exposes a mask_otel_spans hook that patches span attributes at export time. Your application keeps the full prompt and output in memory, the hook rewrites sensitive attributes, and only the masked version is sent to the Langfuse endpoint. Redaction therefore happens inside your own process, before any data crosses the network to the Langfuse server.

  • What is redacted: Attribute values your masking function matches, such as input and output fields that contain names, account numbers or identifiers, before the span is exported.
  • Tradeoff: Masking logic lives in each application. Every service that uses the SDK needs the same rules, and a new service without the hook sends raw data.
  • Testing: You can unit test the function against sample prompts with known personal data, which makes the rules auditable as code.
  • Scope: The hook covers spans created through the SDK. Data written by other instrumentation needs its own control.
  • Enterprise note: Server-side data masking is a separate Langfuse feature that requires an Enterprise license key.

Confirm with your engineering team which code paths emit spans and whether all of them pass through the same export pipeline before relying on this control.

Self-hosted platforms that fit this requirement

Masking personal data in LLM traces usually involves two layers: the instrumentation that redacts data before it leaves the application, and the tracing backend that stores what remains. The platforms below cover those layers, and each one carries a licensing condition that changes what you can run, and for whom, on your own infrastructure.

Self-hosted Langfuse

Langfuse is the backend most teams evaluate first for LLM traces. Its core repository is MIT licensed, and the code under the ee directories falls under a separate enterprise license. Client-side masking works in the open source version through the Python SDK's mask_otel_spans hook, the JS/TS SDK's mask function, or a masking step in an OpenTelemetry Collector. Server-side masking and data retention policies need an enterprise license key. Confirm which controls you need before you commit to a design.

Arize Phoenix

Phoenix is an LLM tracing and evaluation tool licensed under the Elastic License 2.0. You can run it inside your own infrastructure for internal teams, but the license prohibits providing it to third parties as a hosted or managed service. That matters if you build a customer-facing product or offer a shared tracing service to other business units or partners. Confirm your masking approach in the application, because Phoenix does not inherit the controls you configure in other backends.

OpenTelemetry Collector

The OpenTelemetry Collector is Apache-2.0 licensed and sits between your applications and any tracing backend. Its processors can redact or hash attributes that carry names, email addresses or identifiers before export, and its gateway mode gives you one place to enforce that rule across services. Authenticator extensions can also limit who may send telemetry. Masking rules are only as good as the processor configuration, so test them against real trace samples and confirm which components are stable in the version you deploy.

LiteLLM gateway

LiteLLM sits between applications and model providers and can log requests, enforce guardrails and apply budgets. It is MIT licensed, but its enterprise directory is covered by a separate license, so confirm which logging, guardrail and access features you plan to use are outside that directory. Redacting personal data at the gateway can catch input before it reaches a model provider and before it reaches a trace. Verify that the gateway's own logs are masked too, since they can hold the same prompts as your tracing backend.

What Langfuse keeps behind its enterprise license

The core of Langfuse, including tracing, evaluations and the APIs for those features, is available in the MIT-licensed open source version without limits, and self-hosted deployments run the same codebase as Langfuse Cloud. The exceptions sit in the ee directories, which fall under a separate enterprise license. For a GDPR design, the practical question is which privacy controls you need that are not in the open source tier. Langfuse's license key documentation lists the self-hosted features that require an Enterprise license key: server-side data masking, data retention policies, audit logs, project-level RBAC roles, protected prompt labels, UI customization, organization creators, the org management API with SCIM, and the instance management API.

Two of these matter most for personal data in traces. Without a license, server-side data masking and data retention policies are not available, so any redaction must happen in your application or OpenTelemetry Collector before data is exported, and you must manage deletion of old traces with your own storage and database procedures. Client-side masking works without the license, as described in the masking section above. Audit logs and project-level RBAC roles are also enterprise features, which affects who can view traces containing personal data and how you evidence those access decisions. The SCIM and instance management APIs mainly affect identity provisioning and administration at scale.

Confirm current licensing with Langfuse before design sign-off, because the feature list and the boundary between the open source and enterprise tiers can change between releases. Ask Langfuse in writing which features are included in each tier for the version you plan to deploy, how the license key is issued and renewed, and whether any terms restrict how you may process data under the license. Then ask your implementation partner to map each GDPR control you rely on to either a free feature or an enterprise feature, so that the cost of the license is weighed against a specific requirement rather than assumed.

How to handle an erasure request against trace data

This sequence turns an erasure request into a documented, verifiable deletion across the trace store, its backups and any derived datasets. It shows the controller where personal data sits in Langfuse and what to record at each stage.

  1. Verify the request and its ground

    The privacy office confirms the requester's identity and checks whether the request falls under one of the six grounds in Article 17(1), such as consent withdrawn, a successful objection or unlawful processing. The controller records the ground and the decision in the request file. Done means a written decision exists before anyone touches the trace store.

  2. Locate affected traces by identifier

    The platform team searches Langfuse for traces linked to the user or session identifier the application attached to each trace, using the Langfuse interface or API. Where masking replaced the identifier with a token or hash, the team uses the mapping kept in the organization's own systems. Done means a list of trace IDs, projects and time ranges is saved with the request file, including any identifiers that could not be matched.

  3. Delete or overwrite stored records

    Engineers delete the matching traces in Langfuse, which removes the rows in ClickHouse, and remove the related objects in S3-compatible blob storage for uploaded media or large payloads. Each deletion is logged with the trace IDs and the operator. Done means a repeat search for the identifier returns no results and the blob listing confirms the objects are gone.

  4. Check backups and derived datasets

    The team checks whether snapshots of PostgreSQL, ClickHouse and object storage hold the data, and whether copies of traces were exported into evaluation datasets, prompt test sets or data warehouses. The EDPB noted in February 2026 that retention and backups complicate full erasure, so the controller must decide and document how backups expire or are restored without the erased data. Done means a written note lists each copy, its location and the agreed handling.

  5. Confirm erasure in downstream systems

    The team asks any processor or integrator that received the data, such as an evaluation service or support tool, to erase its copies and confirm in writing. Confirm which systems sit inside the organization's infrastructure and which, if any, are external. Done means each recipient has returned a written confirmation linked to the request.

  6. Record the action and its evidence

    The controller records the request, the ground, the trace IDs removed, the backup and dataset decisions and the confirmations in a register that is kept separately from the trace data. Audit logs of the deletions, where Langfuse enterprise audit logs are licensed, support this record. Done means the file can be produced to a supervisory authority or auditor without exposing the erased content.

  7. Respond to the data subject on time

    The privacy office sends the response within the timeframe set in the controller's own erasure procedure, and states what was erased, what was retained under a stated exception and how the person can complain. Confirm the applicable response period with your data protection officer and procedure, as this page does not set one. Done means the response is sent and filed with the request.

Evidence auditors and supervisors ask for

This table lists the records a controller can produce to show how personal data in LLM traces is masked, kept, accessed and erased. The GDPR requires no audit or certificate, so these items serve the controller's own accountability duty and inquiries from a supervisory authority. Read each row as a question to answer with a file, export or configuration snapshot that exists in your environment.

Evidence itemWhat it showsComponent that produces it
Masking configuration in codeWhich span attributes, prompt fields and outputs are redacted before export, and the version of that codeApplication SDK masking hook or OpenTelemetry Collector processor configuration in version control
Masking test resultsThat masking was tested on sample traces containing names, email addresses and identifiers, with results keptTest scripts and saved trace samples from a pre-release check
Retention settingsHow long traces, observations and blobs are kept per project and where deletion is enforcedLangfuse data retention policy (Enterprise license key) or documented ClickHouse and blob storage lifecycle rules
RBAC role assignmentsWho may view traces that may still contain personal data, by project and roleLangfuse project-level RBAC roles (Enterprise license key) and the identity provider group mapping
Audit log exportsWho accessed, changed or exported trace data and whenLangfuse audit logs (Enterprise license key) forwarded to the organization's log store
Erasure request logEach deletion request received, its legal basis for erasure, the traces and blobs affected and the completion dateTicketing record linked to trace IDs, user IDs and deletion job output
Data processing recordsThe purposes, categories of data and recipients for the LLM observability processing activityRecords of processing kept by the controller, updated when the tracing scope changes
Storage location documentationWhere PostgreSQL, ClickHouse, Redis or Valkey and S3-compatible storage run, and that no trace data leaves the agreed regionInfrastructure inventory and deployment manifests for the self-hosted Langfuse stack

What masking tooling does not solve on its own

Masking in the SDK or Collector reduces what reaches storage, but it does not make a trace store free of personal data. The cards below cover the gaps that remain after masking is switched on, and what the organization must add around the tooling.

Regex misses context-based identifiers

Pattern rules catch email addresses, phone numbers and card-like strings, but they miss a name, a rare job title, a case reference or a street described in free text. A person can be identified from a combination of details that no single pattern flags. Test masking rules against a sample of real prompts from your own application, record what slips through, and decide whether those fields need a classifier, a field-level allowlist or a restriction on what users may type.

Model outputs can reveal new personal data

Masking inspects what the application sends, but the model can generate personal data that never appeared in the prompt, for example by completing a name from training data or by combining details retrieved from documents. Output masking has to run on the response path too, and reviewers should sample traces to find generated identifiers. Confirm with your AI and privacy owners whether generated personal data falls under the same retention and erasure rules as input data.

Backups and datasets keep copies

Masking applies at export time, so any copy made before the change still holds the original text. Database backups, ClickHouse snapshots in object storage, exported CSV files and evaluation datasets built from production traces can each keep personal data after the live trace is deleted. Ask the implementation partner how backup retention and dataset exports are set up, and write down who may create an export and where it is stored.

Server-side enforcement needs enterprise features

Client-side masking depends on every application and every SDK version being configured correctly, which is hard to guarantee across many teams. Server-side data masking, data retention policies and audit logs are listed by Langfuse as Enterprise license key features for self-hosted deployments. Check the license key documentation before design, and confirm with Langfuse whether your use needs them, since a gap in any one application can otherwise reach storage unmasked.

Access rules and policy remain your duty

Masking does not decide who may open a trace that still contains personal data, how long traces are kept, or what lawful basis covers the processing. Those decisions need a written logging policy, a documented legal basis review for each application, and role-based access limited to staff who need it. Assign an owner for these records before the first trace is stored, and review them when a new application or model is added.

Pending amendments do not change duties now

The Omnibus IV and Digital Omnibus proposals are moving through the EU legislative process, but the GDPR text has not been amended as of October 2026. Current duties under Articles 17 and 32 apply to your traces today, so a planned change in the law is not a reason to skip masking or erasure procedures. Ask your legal team to track both procedures and to schedule a review of this design when a text is adopted.

Questions buyers ask about GDPR masking in LLM traces

How much does masking and erasure work for LLM traces cost?

Cost comes from four parts: the masking design in the SDK or OpenTelemetry Collector, the erasure procedure, the infrastructure that runs Langfuse or Phoenix, and any enterprise license. Masking design and erasure procedures are largely one-time work, while storage, backups and license fees recur. Costs rise with the number of applications instrumented, the number of distinct personal data types in prompts and outputs, and how many erasure requests you expect to process. DeployOpen does not publish a price list. Ask any partner for a quote that separates one-time implementation from recurring infrastructure, and state which Langfuse enterprise features, such as server-side masking or retention policies, are inside or outside the scope.

How long does GDPR masking implementation take?

Duration depends on your environment more than on the masking tool itself. The main variables are how many services emit traces, whether they use the Langfuse Python or JS/TS SDK or plain OpenTelemetry, whether you already run a Collector, and how quickly your legal and data protection teams can confirm which fields count as personal data. Self-hosted Langfuse also has its own deployment sequence covering PostgreSQL, ClickHouse, Redis or Valkey and S3-compatible storage. Ask for a written timeline tied to a defined scope and a list of client dependencies, including access to test data and a named approver for the masking rules.

Can our team implement GDPR masking in traces without a partner?

Yes, if your engineers already run the stack and have the legal input they need. Client-side masking uses documented hooks: the Python SDK's mask_otel_spans hook, a mask function on LangfuseSpanProcessor in the JS/TS SDK, or masking in the application or an OpenTelemetry Collector. The harder work is not the code. It is building a complete inventory of where personal data appears in prompts, tool outputs, metadata and file attachments, testing that masking catches it, and running erasure requests across ClickHouse and blob storage. A partner adds most value on the inventory, the testing and the erasure runbook.

Is the free open source version of Langfuse enough for GDPR?

The MIT-licensed open source version includes all core features and APIs, including client-side masking, so GDPR controls that run in your application or Collector do not require a license key. Several controls do need an Enterprise license key: server-side data masking, data retention policies, audit logs, and project-level RBAC roles. If your assessment requires centrally enforced retention or access records on trace data, plan for the enterprise license or build equivalent controls around the platform. Confirm the exact feature list and terms against Langfuse's license key documentation and its self-hosted pricing page before you decide.

Does the Phoenix license limit how we can use it?

Arize Phoenix is licensed under the Elastic License 2.0, which prohibits providing the software to third parties as a hosted or managed service. Running Phoenix for your own staff and applications inside your infrastructure is the common case, but if you plan to offer LLM tracing to customers as a service, the license would need legal review before you proceed. Confirm the license terms with your counsel for your specific use, since this page does not provide legal advice. The GDPR questions, such as masking and erasure, are the same regardless of which platform you choose.

What do we need to give a partner before work starts?

A partner needs three inputs from you. First, a data inventory listing the applications, model providers, and the kinds of personal data their prompts, outputs and tool calls contain. Second, the legal basis and purpose for processing that data, confirmed by your legal or data protection team, since the GDPR requires controllers to define them. Third, a retention decision: how long traces are kept, and the rules for erasure requests under Article 17, which lists six grounds for erasure without undue delay. Without these, masking rules are guesses. Ask the partner to confirm in writing which of these inputs are assumed and which are provided by you.

Will the GDPR masking work make us compliant?

No. The GDPR requires no audit, attestation or certificate, and certification under Article 42 is voluntary and does not reduce the controller's or processor's responsibility. Masking and erasure procedures are technical and organizational measures that support your obligations, including security of processing under Article 32, but compliance is determined by your overall program and, where relevant, by your supervisory authority. DeployOpen prepares systems, controls and evidence for compliance assessments, and independent auditors and certification bodies issue any reports or certifications.

How the masking and erasure work is scoped

A scope is agreed in writing before any masking or erasure work begins. The scope starts with a data inventory: which applications send prompts and outputs to Langfuse, which fields in those traces can contain personal data (free-text prompts, retrieved documents, tool arguments, user identifiers in metadata), and where each trace is stored, including the PostgreSQL, ClickHouse and S3-compatible blob storage that a self-hosted deployment uses. Masking rules follow from that inventory. They name the patterns or fields to redact, state whether masking happens in the Python SDK's mask_otel_spans hook, the JavaScript SDK's mask function on LangfuseSpanProcessor, or in an OpenTelemetry Collector, and define how the team tests that a masked value never reaches storage. The deployment and erasure runbook covers the environment, the upgrade path and the step-by-step procedure for locating and deleting a data subject's traces across every store, with a record of each request.

The client's legal and privacy team must make several decisions before engineering starts. They need to decide which lawful basis and retention period apply to each trace category, whether a retention policy is set in the platform or by a documented manual process, and who may view unmasked data. They must also decide whether server-side masking, retention policies and audit logs, which Langfuse lists as enterprise license features, are required, or whether client-side masking and a documented procedure are enough for their risk position. DeployOpen prepares the controls, configuration, runbooks and evidence that support these decisions, and it does not issue audit reports, attestations or certifications. Independent auditors and certification bodies provide those, and the scope should name who the client will engage for any assessment.

How DeployOpen delivers GDPR-ready LLM tracing

DeployOpen approaches GDPR-ready LLM tracing as a scoped implementation: we map where personal data enters prompts, outputs and metadata, then build masking, storage and access controls into a self-hosted Langfuse or Phoenix deployment in your own infrastructure. We document the decisions and hand over the configuration so your teams can run and audit it.

How we scope

  • We map which applications, prompts and outputs can carry personal data before any tracing is switched on.
  • The written scope names the masking points, whether in the SDK or an OpenTelemetry Collector, and the fields to redact.
  • We agree which Langfuse features need an enterprise license key, such as server-side masking and retention policies, before work starts.
  • Engagements are fixed-scope, with deliverables and timelines agreed in writing before work begins.

How we build

  • We deploy self-hosted Langfuse with PostgreSQL, ClickHouse, Redis or Valkey and S3-compatible storage in your own accounts or data centers.
  • We configure client-side masking in the Python or JS/TS SDK, or in the OpenTelemetry Collector, and test that redacted values never reach storage.
  • We set project roles, SSO and access rules so only authorized staff can view traces that still contain sensitive context.
  • We test masking with representative prompts and document which personal data categories remain visible and why.

How we hand over

  • You receive the architecture, data flow diagrams and a record of every masking rule and where it runs.
  • We document the erasure procedure for traces, including how requests are located, deleted and confirmed in each store.
  • Runbooks cover retention settings, backup, restore, and upgrade steps, including the Langfuse v3 to v4 migration requirements.
  • Evidence packs list configuration, test results and access settings for your assessors. We prepare evidence but do not issue audit reports or certifications.

How we support

  • Ongoing support, upgrades and continuous testing are available as a retainer after handover.
  • We re-test masking rules when prompts, models, SDK versions or Langfuse releases change.
  • We help your legal and privacy teams review changes to retention or masking scope before they reach production.
  • Support scope and response commitments are set in the retainer agreement, which you should review against your own needs.

Talk to our team.

Tell us what you're working on, whether it's a deployment, an audit, a security test or a cyber range. You'll speak with an engineer who can help you scope it.

  • 30-minute call: free, with no obligation.
  • NDA on request: we can sign before you share details.
  • Clear next steps: a scope and plan after the call.