Nonimo Gateway, on your server
Nonimo Gateway masks personal data on your own servers before every AI call and restores it in the reply. It runs as a container in front of the OpenAI API, and your services keep their code: only the base_url changes.
Summarise the case file for Sarah Chen and email her at sarah.chen@example.com.
Summarise the case file for [PERSON_1] and email her at [EMAIL_1].
Hello [PERSON_1], we have reviewed your case file and it is complete.
Hello Sarah Chen, we have reviewed your case file and it is complete.
How it works
No changes to your services’ code: one container on your server and a new base_url.
A container in your data centre or your cloud.
It installs on your servers or in your cloud account, alongside your services, and you can run several instances side by side.
Your code still speaks the OpenAI API. Only the address changes.
The Gateway speaks the OpenAI API. Your services point at it and keep calling /v1/chat/completions or /v1/responses, function calling included. The upstream can be OpenAI or any compatible API.
Personal data leaves as placeholders and comes back real in the reply.
Every request is checked in full before it goes to your provider: personal data is swapped for placeholders and, in the reply, each placeholder gets its value back. Your services’ AI requests pass through it before they leave your network.
The official OpenAI SDK works unchanged; just point the client at the Gateway:
from openai import OpenAI
# Same client, same key: only base_url changes
client = OpenAI(base_url="http://your-server:8080/v1")
resp = client.chat.completions.create(
model="gpt-4o",
messages=[{"role": "user", "content": "Summarise the case file for Sarah Chen."}],
) import OpenAI from "openai";
// Same client, same key: only baseURL changes
const client = new OpenAI({ baseURL: "http://your-server:8080/v1" });
const resp = await client.chat.completions.create({
model: "gpt-4o",
messages: [{ role: "user", content: "Summarise the case file for Sarah Chen." }],
}); # The same request as always, sent to your server
curl http://your-server:8080/v1/chat/completions \
-H "Authorization: Bearer $OPENAI_API_KEY" \
-H "Content-Type: application/json" \
-d '{
"model": "gpt-4o",
"messages": [{"role": "user", "content": "Summarise the case file for Sarah Chen."}]
}' Real data back
Your provider only sees placeholders; your service gets the reply with the real data, each value back in its place.
Internal chatbot
Summarise the ticket Priya Sharma[PERSON_1] opened from priya.sharma@example.com[EMAIL_1].
The ticket from Priya Sharma[PERSON_1] is a VPN sign-in failure since Monday. I am emailing priya.sharma@example.com[EMAIL_1] the steps to reconnect.
Customer service
Draft an email to David Okafor[PERSON_1] (david.okafor@example.com[EMAIL_1]) confirming that we have received his documents.
Hello David Okafor[PERSON_1], this is to confirm that we have received your documents. We will write to david.okafor@example.com[EMAIL_1] as soon as everything is ready.
Agent with tools
Check the order status for Anna Kowalski[PERSON_1], phone +44 7700 900123[PHONE_1].
find_order({ "customer": "Anna Kowalski[PERSON_1]", "phone": "+44 7700 900123[PHONE_1]" })
Your tool gets the real value; the provider only saw the placeholder.
HR
Write the welcome letter for Lukas Becker[PERSON_1]; his salary will be paid into DE00 0000 0000 0000 0000 00[IBAN_1].
Dear Lukas Becker[PERSON_1], welcome to the team. Your salary will be paid into the account DE00 0000 0000 0000 0000 00[IBAN_1].
For your DPO: this is pseudonymisation as the GDPR defines it (Article 4(5)), and the mapping back to the real data stays in your infrastructure. More in the questions below.
For the difference between anonymised, de-identified and pseudonymised data, see what to redact before you paste a document into an AI.
Detection runs inside your network, so your data stays there while it is checked. It does not rewrite or summarise, it only marks what is personal data, and within a conversation each value keeps the same placeholder from start to finish. In tool calls, the provider sees placeholders and your tool receives the real values.
What goes out to OpenAI
Draft an email to [PERSON_1] ([EMAIL_1]) confirming that we have received his documents. What your service receives
Hello David Okafor, this is to confirm that we have received your documents. We will write to david.okafor@example.com as soon as everything is ready. National documents
Every document, in its own format. Pick a country and see what reaches the AI.
United States: also covered
[PERSON_1][PHONE_1][BANK_ACCOUNT_US_1][ADDRESS_1][EMAIL_1]United Kingdom: also covered
[PERSON_1][PHONE_1][BANK_ACCOUNT_GB_1][POSTCODE_1][EMAIL_1]Ireland: also covered
[PERSON_1][PHONE_1][IBAN_1][EIRCODE_1][EMAIL_1]Australia: also covered
[PERSON_1][PHONE_1][BSB_1][BANK_ACCOUNT_AU_1][EMAIL_1]Germany: also covered
[PERSON_1][PHONE_1][IBAN_1][ADDRESS_1][EMAIL_1]France: also covered
[PERSON_1][PHONE_1][IBAN_1][ADDRESS_1][EMAIL_1]Spain: also covered
[PERSON_1][PHONE_1][IBAN_1][ADDRESS_1][EMAIL_1]Italy: also covered
[PERSON_1][PHONE_1][IBAN_1][ADDRESS_1][EMAIL_1]Portugal: also covered
[PERSON_1][PHONE_1][IBAN_1][POSTCODE_PT_1][EMAIL_1]Brazil: also covered
[PERSON_1][PHONE_1][ADDRESS_1][EMAIL_1]And in every country
[API_KEY_1][CARD_1][PASSPORT_1][SSN_1]Your service sends
Review the application from John Miller, SSN 987-65-4321.
The AI receives
Review the application from [PERSON_1], SSN [SSN_1].
[NINO_1][NHS_NUMBER_1]Your service sends
Update the record for Oliver Smith, National Insurance QQ 12 34 56 C.
The AI receives
Update the record for [PERSON_1], National Insurance [NINO_1].
[PPS_NUMBER_1]Your service sends
Send the summary to Aoife Murphy, PPS 1234567A.
The AI receives
Send the summary to [PERSON_1], PPS [PPS_NUMBER_1].
[TFN_1][MEDICARE_1]Your service sends
Prepare the payslip for Jack Wilson, TFN 123 456 789.
The AI receives
Prepare the payslip for [PERSON_1], TFN [TFN_1].
[TAX_ID_DE_1][SOCIAL_SECURITY_DE_1]Your service sends
Prepare the letter for Jonas Weber, Steuer-ID 12345678901.
The AI receives
Prepare the letter for [PERSON_1], Steuer-ID [TAX_ID_DE_1].
[NIR_1][SIREN_1][SIRET_1]Your service sends
Check the record for Camille Martin, NIR 1 85 05 78 006 084 00.
The AI receives
Check the record for [PERSON_1], NIR [NIR_1].
[DNI_1][NIE_1][NIF_1][NUSS_1]Your service sends
Summarise the file for María López, DNI 12345678A.
The AI receives
Summarise the file for [PERSON_1], DNI [DNI_1].
[TAX_CODE_IT_1][VAT_NUMBER_IT_1][ID_CARD_IT_1][HEALTH_CARD_IT_1]Your service sends
Reply to Mario Rossi, codice fiscale RSSMRA80A01H501X.
The AI receives
Reply to [PERSON_1], codice fiscale [TAX_CODE_IT_1].
[NIF_PT_1][NISS_1]Your service sends
Check the registration for João Silva, NIF 123456780.
The AI receives
Check the registration for [PERSON_1], NIF [NIF_PT_1].
[CPF_1][CNPJ_1][DRIVING_LICENCE_BR_1]Your service sends
Write to Ana Souza about her order, CPF 123.456.789-00.
The AI receives
Write to [PERSON_1] about her order, CPF [CPF_1].
Fictional data; the sample numbers are deliberately invalid.
The Gateway recognises the usual personal data (names, email addresses, phone numbers, postal addresses, API keys) and, on top of that, each country’s document numbers in their own format. It also covers IBANs, payment cards and passports (their machine-readable zone).
| Country | Documents |
|---|---|
| United States | Social Security number |
| United Kingdom | National Insurance number, NHS number |
| Ireland | PPS number |
| Australia | TFN, Medicare |
| Germany | Steuer-ID, Sozialversicherungsnummer |
| France | NIR (numéro de sécurité sociale), SIREN, SIRET |
| Spain | DNI, NIE, NIF, Social Security number |
| Italy | codice fiscale, partita IVA, carta d’identità elettronica (CIE), tessera sanitaria |
| Portugal | NIF, NISS |
| Brazil | CPF, CNPJ, CNH (driving licence) |
| Every country | IBAN, passports (machine-readable zone), payment cards |
Compared with Presidio
Presidio detects personal data in text. The OpenAI-compatible proxy that puts it in front of the API is yours to build; Nonimo Gateway includes it.
| Task | Build it with Presidio | With Nonimo Gateway |
|---|---|---|
| Detect personal data in text | Presidio does it | Included |
| OpenAI-compatible proxy | You build it | Built in |
| Put it in front of your AI provider | You wire it up | Change base_url |
| Restore the real data in the reply | You build it | Built in |
| National ID numbers by country | Some built in; you pick and tune the rest | Those in the table above |
| Text in languages other than English | You set it up | Built in |
| Keep it up to date | Your team | New versions come from us |
| Where it runs | On your infrastructure | A container on your server |
The full comparison, row by row: Microsoft Presidio alternative →
Presidio detects personal data in text, but it does not include an OpenAI-compatible proxy: to put it in front of the API, your team has to build that proxy, connect it and maintain it.
Nonimo Gateway gives you that part ready-made: a container on your own server, an OpenAI-compatible API, the real data restored in the reply and the national ID numbers in the table above.
If you are comparing options, our guide to PII redaction software sets out the approaches side by side.
On your server
You stay with your AI provider, and the Gateway is one more component inside your perimeter.
It installs on your servers or in your cloud, alongside your services.
Only the licence and usage figures. Your content does not pass through Nonimo.
Your API key is not stored in the Gateway.
LiteLLM
If your platform already routes its calls through LiteLLM, Nonimo fits in two ways. Pick the one you need.
Out Summarise the case file for [PERSON_1]
Back The reply comes back with placeholders: [PERSON_1]
Out Summarise the case file for [PERSON_1]
Back The reply comes back with the real values: Sarah Chen
Already on LiteLLM? Nonimo plugs in as a guardrail, or as a proxy in front of your provider if you want the real data back in the reply.
Plans
Every plan starts with a 30-day trial, and if you go over your limit the Gateway warns you and the service keeps running.
Your fit Nonimo Gateway Business, US$539/month
For one server and your first internal services
Nonimo Gateway Practice US$319/month Nonimo Gateway Practice or US$3,190 a year
For several instances and higher volumes
Nonimo Gateway Business US$539/month Nonimo Gateway Business or US$5,390 a year
For large organisations with their own terms
Custom pricing
By our estimate, the Practice plan includes 25 million words a month, enough for teams of up to around 200 people; the Business plan includes 150 million, for teams of up to around 1,000; and the Enterprise plan has no cap and is designed for more than 1,000 people or multiple sites. If you ever go over your limit, we will let you know and the Gateway keeps running.
Access
Tell us a little about your stack and we will get in touch so you can try it in your environment.
Questions
What IT, security and the DPO ask before deploying the Gateway.
OpenAI sees the request with placeholders such as [PERSON_1] or [EMAIL_1] where the personal data was. Yes, this is pseudonymisation (also spelt pseudonymization) rather than anonymisation: the mapping back to real values stays in your infrastructure, and the provider does not hold it. Under the GDPR (Article 4(5)) pseudonymised data is still personal data, so it complements your contract with the provider and your risk assessment rather than replacing them.
No. Detection runs locally, inside your network.
The OpenAI API and any API that mirrors it: Chat Completions and Responses, with function calling.
By our estimate, the Practice plan includes 25 million words a month, enough for teams of up to around 200 people; the Business plan includes 150 million, for teams of up to around 1,000; and the Enterprise plan has no cap and is designed for more than 1,000 people or multiple sites. If you ever go over your limit, we will let you know and the Gateway keeps running.
The masked request, to your AI provider, and the licence and usage figures, to Nonimo. Your content does not pass through Nonimo. If your network cannot reach Nonimo, offline mode is available on request on the Business and Enterprise plans.
Only for the licence and usage figures, not your content. If your network cannot reach Nonimo, the Business and Enterprise plans offer an offline mode on request. Write to us at hello@nonimo.ai and we will agree the terms.
By default, the request is not sent and your application gets a clear error.
Your API key is not stored in the Gateway: it passes your services’ Authorization header through without keeping it, or reads the key from a secret or an environment variable. An optional access token restricts the Gateway to your own services.
On a server or a cluster that runs containers, in your data centre or your cloud. It installs alongside your services, and you can run several instances.
With a signed licence per server or instance, which renews automatically on the connected plans. If you exceed your plan’s usage, the Gateway warns you and the service keeps running.
Your IT team applies updates whenever it chooses. The Gateway does not update itself. It lets you know when a new version is available.
Guides
Guides on AI gateways, privacy proxies and keeping personal data out of your LLM API calls.
Get started
Keep building on the OpenAI API and let Nonimo Gateway handle the personal data, inside your own perimeter. For the AI tools your staff use in the browser, see Nonimo for organisations.
Remove personal information from a file or text before AI reads it. Or cover the details on a copy of your ID and add a watermark before you send it.