Engineering5 minute read

Zero data retention, verified

When a client asks whether the AI systems we build retain their data, a model provider's zero data retention (ZDR) commitment forms part of our answer, weighed alongside what the client can inspect directly.

Hand-drawn whiteboard sketch: a retention guarantee the client can test; classify the data flow; choose the architecture; hand over the evidence; re-test every release

We answer retention questions with evidence the client can check.

When a client asks whether the AI systems we build retain their data, a model provider's zero data retention (ZDR) commitment forms part of our answer, weighed alongside what the client can inspect directly.

Most ZDR reviews close on a data processing agreement, a SOC 2 report and a contract clause stating that prompts and outputs are not stored. Those documents describe the provider's infrastructure, which the client cannot inspect. They do not reach the client's own logging pipeline, tracing agents or observability tools, all of which commonly store prompts.

For each system we build, we decide which parts of the retention guarantee rest on architecture the client can verify and which can rest on contract. The split depends on how sensitive the data is, which models the task needs and what the client is prepared to operate.

Prompts get stored in more places than the model provider's servers.

A prompt passes through several systems on its way to a model and back, and most of them can store a copy by default.

Under ZDR terms, providers often still reserve the right to hold some data for abuse monitoring or legal obligations, and those terms vary by provider, product and contract. Application performance tools such as Datadog, New Relic and Sentry can attach request bodies to traces and error reports. LLM observability tools such as Langfuse and LangSmith store prompts and completions by design, since engineers use them to debug model behavior. Reverse proxies, API gateways and load balancers keep access logs, and a crashed inference process can write a core dump holding whatever was in memory.

Engineers leave most of these settings on because they help with debugging. A client can therefore hold ZDR terms with its provider while its own log index keeps every prompt for as long as that index's retention policy allows. A retention guarantee has to cover both ends of the API call.

We build zero retention four ways, depending on how much the client needs to verify.

We use four architectures, listed by how much of the guarantee the client can verify directly. Most systems combine two or more.

1. Run the model inside the client's network

An open-weights model runs on an inference server such as vLLM, Text Generation Inference or TensorRT-LLM, in the client's cloud account or data center. Outbound internet access is blocked at the network layer and requests arrive over private endpoints, so no third party receives the data.

The client's own stack still needs configuring. Request logging stays off in the inference server (recent vLLM releases leave it off unless --enable-log-requests is set; older releases needed --disable-log-requests). Proxies and gateways log status codes and latency and drop request bodies. Core dumps are disabled on inference hosts.

The client can audit all of this by reading the infrastructure code and network rules. The costs are GPU capacity, the engineering time to operate it and a quality ceiling set by the best open-weights model for the task.

2. Run the model in a confidential computing environment

Confidential computing lets a client use public cloud capacity while keeping data unreadable to the cloud operator during processing. The hardware encrypts memory and isolates the workload from the host: AMD SEV-SNP and Intel TDX on CPUs, and NVIDIA's confidential computing mode on Hopper and later GPUs.

Before sending data, the client's application requests a hardware-signed attestation report identifying the code running in the protected environment. If that measurement matches a build the client has reviewed, the application encrypts its data to that environment. The data is decrypted only in protected memory and the results are encrypted before they leave, so host administrators and host software cannot read it while it is processed.

Researchers have published side-channel and fault attacks against several generations of these technologies. Attestation identifies the running code but cannot show that the code is free of bugs that write data elsewhere. The tooling is also less mature than for standard deployments, which adds engineering time.

3. Mask sensitive data before it leaves

When a task needs a closed frontier model, a privacy proxy inside the client's network detects names, account numbers, client and project identifiers and similar values, using Microsoft Presidio, custom entity recognition and pattern rules. It replaces each with a consistent placeholder, so "Acme Corp lost $4.2M through a flaw in auth_v2.py" is sent as "Client_A lost Amount_1 through a flaw in Component_3." The mapping is held in short-lived encrypted memory inside the client's network, and the proxy restores the original values in the response.

Masking handles structured identifiers reliably. Free text is harder. A missed entity goes out unmasked, and context can identify a subject with every name removed, as a description of a regional hospital chain that switched EHR vendors last spring would. We measure detection rates on the client's own data and report masking as reduced exposure.

4. Use a provider's ZDR terms and lock down the client side

For lower-sensitivity workloads, we rely on a provider's ZDR or limited-retention terms, directly or through a cloud platform such as Amazon Bedrock or Azure, and configure the client's side so it keeps nothing:

  • APM and tracing tools drop request and response bodies, including on errors, when they are most likely to capture them.
  • LLM observability tools record token counts, latency, model version and cost, with prompt and completion fields left out.
  • Storage options such as OpenAI's store parameter are set explicitly on every request.
  • Application egress is limited to the provider's endpoints, and network monitoring flags any other outbound connection.

The provider's side of this arrangement rests on contract. The client can verify that its own side stores nothing and sends data to one destination.

We pick the architecture for each data flow based on how sensitive its data is.

We classify each data flow before any discussion of models, since sensitivity usually rules some architectures out.

ApproachWhat the client can verifyModels availableEngineering effortCost shape
Model in client networkFull path, from infrastructure code and network rulesOpen-weights onlyHighMostly fixed GPU capacity
Confidential computingRunning code, by hardware attestationOpen-weights, in supported environmentsHighGPU capacity at a premium
Masking proxyWhat leaves the network, by sampling outbound trafficAny, including closed frontier modelsModerate, mostly tuning detectionPer token, plus proxy hosting
Provider ZDR with clean perimeterClient side only; provider side by contractAny covered by the termsLow to moderatePer token

A behavioral health operator's clinical documentation workflow could keep patient notes on a self-hosted model and send masked text to a frontier model for summarization. A sales operations tool working with pipeline data could rely on provider ZDR terms and the client-side controls in approach four. We record the decision for each data flow so the client's security team can review it.

Every system ships with evidence a security team can test.

A client's security and legal teams receive the following at handover, and can check each item without relying on us.

  1. A data flow record. Each path a prompt or response can take, which architecture covers it and where any retention, ours or a provider's, is permitted and for how long.
  2. The infrastructure code. Terraform or equivalent showing network rules, egress limits and logging configuration, including the settings that drop request bodies from cloud logs, gateways and monitoring tools.
  3. A software inventory. Exact versions of the inference server, proxy and monitoring agents, with the logging and telemetry settings each runs with.
  4. Test results. Egress tests showing the inference hosts can reach nothing beyond their permitted endpoints, and a search of the client's log stores after a test run with marked synthetic data, showing that the marked values do not appear.
  5. Provider terms, where they apply. The specific ZDR or retention terms the client holds with each model provider, attached to the flows that depend on them.

The seeded-data test in item four is the most direct check, because it measures what the system stored during a real run.

Some retention risks sit outside the inference path.

ZDR in the inference path does not govern data the client chooses to keep, such as conversation history, documents indexed for retrieval or audit logs a regulator requires. Those need their own access controls and deletion policies. It also does not stop a compromised endpoint or an authorized user from copying output.

The evidence describes the system at delivery. A new monitoring integration or a changed logging setting can reintroduce retention, so we build the egress and seeded-data tests into the client's release checks.

Sources

All blogs

Find out what your workarounds actually cost.

Tell us what is holding your operations together. thinkbridge will show you what it looks like built right.