Nonimo Gateway, self-hosted
Nonimo Gateway strips PII out of every AI request on your own servers and puts it back in the response. It runs as a container in front of the OpenAI API, so your services need no code changes: you only change the base_url.
Summarize the claim for Jessica Turner and email her at jessica.turner@example.com.
Summarize the claim for [PERSON_1] and email her at [EMAIL_1].
Hi [PERSON_1], we’ve reviewed your claim and it’s complete.
Hi Jessica Turner, we’ve reviewed your claim and it’s complete.
Setup
Your services’ code stays as it is: one container on your server and a new base_url.
A container, on-prem or in your cloud.
It installs on your servers or in your cloud account, right next to your services, and you can run multiple instances side by side.
Your code keeps speaking the OpenAI API. Only the endpoint changes.
The Gateway speaks the OpenAI API. Point your services at it and they keep calling /v1/chat/completions or /v1/responses, with function calling. Upstream, it can talk to OpenAI or any compatible API.
PII leaves as placeholders and comes back as real values in the response.
Each request is scanned in full before it goes to your provider: PII is replaced with placeholders and, in the response, every placeholder gets its original value back. Your services’ AI traffic passes through it before it leaves your network.
The official OpenAI SDK works as is; just point the client at the Gateway:
from openai import OpenAI
# Same client, same API 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": "Summarize the claim for Jessica Turner."}],
) import OpenAI from "openai";
// Same client, same API 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: "Summarize the claim for Jessica Turner." }],
}); # The same request you send today, pointed at 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": "Summarize the claim for Jessica Turner."}]
}' Restoration
Your provider only ever sees placeholders; your service gets a response with the real values, each one back where it belongs.
Internal chatbot
Summarize the ticket Kevin Brooks[PERSON_1] opened from kevin.brooks@example.com[EMAIL_1].
The ticket from Kevin Brooks[PERSON_1] is about VPN login failures since Monday. I’m sending kevin.brooks@example.com[EMAIL_1] the steps to reconnect.
Customer support
Write an email to Michael Reyes[PERSON_1] (michael.reyes@example.com[EMAIL_1]) confirming we received his paperwork.
Hi Michael Reyes[PERSON_1], just confirming that we’ve received your paperwork. We’ll email michael.reyes@example.com[EMAIL_1] as soon as everything is ready.
Agent with tools
Look up the claim status for Ashley Rivera[PERSON_1], SSN 987-65-4320[SSN_1].
lookup_claim({ "member": "Ashley Rivera[PERSON_1]", "ssn": "987-65-4320[SSN_1]" })
Your tool receives the real value; the provider only ever saw the placeholder.
HR
Draft the offer letter for Tyler Bennett[PERSON_1]; direct deposit goes to account 000000000000[BANK_ACCOUNT_US_1].
Hi Tyler Bennett[PERSON_1], welcome aboard. Your paycheck will be deposited directly into account 000000000000[BANK_ACCOUNT_US_1].
For your privacy or compliance officer: this is pseudonymization, not HIPAA de-identification, and the mapping back to the real values stays in your infrastructure. HIPAA, the CCPA and state privacy laws are covered in the FAQ.
Anonymization, de-identification and masking aren’t the same thing; we break it down in data anonymization before AI.
Detection runs on your network, so your data stays there while it’s scanned. It doesn’t rewrite or summarize, it only flags what counts as PII, and within a conversation each value keeps its placeholder from start to finish. In tool calls, the provider sees placeholders and your tool gets the real values.
What’s sent to OpenAI
Write an email to [PERSON_1] ([EMAIL_1]) confirming we received his paperwork. What your service receives
Hi Michael Reyes, just confirming that we’ve received your paperwork. We’ll email michael.reyes@example.com as soon as everything is ready. ID numbers by country
Every document, in its own format. Pick a country and see what the AI actually gets.
United States: also detected
[PERSON_1][PHONE_1][BANK_ACCOUNT_US_1][ADDRESS_1][EMAIL_1]United Kingdom: also detected
[PERSON_1][PHONE_1][BANK_ACCOUNT_GB_1][POSTCODE_1][EMAIL_1]Germany: also detected
[PERSON_1][PHONE_1][IBAN_1][ADDRESS_1][EMAIL_1]France: also detected
[PERSON_1][PHONE_1][IBAN_1][ADDRESS_1][EMAIL_1]Spain: also detected
[PERSON_1][PHONE_1][IBAN_1][ADDRESS_1][EMAIL_1]Italy: also detected
[PERSON_1][PHONE_1][IBAN_1][ADDRESS_1][EMAIL_1]Portugal: also detected
[PERSON_1][PHONE_1][IBAN_1][POSTCODE_PT_1][EMAIL_1]Brazil: also detected
[PERSON_1][PHONE_1][ADDRESS_1][EMAIL_1]Ireland: also detected
[PERSON_1][PHONE_1][IBAN_1][EIRCODE_1][EMAIL_1]Australia: also detected
[PERSON_1][PHONE_1][BSB_1][BANK_ACCOUNT_AU_1][EMAIL_1]And for every country
[API_KEY_1][CARD_1][PASSPORT_1][SSN_1][ITIN_1][EIN_1][MBI_1]Your service sends
Pull up the benefits application for Robert Garcia, SSN 987-65-4320.
The AI gets
Pull up the benefits application for [PERSON_1], SSN [SSN_1].
[NINO_1][NHS_NUMBER_1]Your service sends
Update the employee record for Oliver Smith, National Insurance QQ 12 34 56 C.
The AI gets
Update the employee record for [PERSON_1], National Insurance [NINO_1].
[TAX_ID_DE_1][SOCIAL_SECURITY_DE_1]Your service sends
Draft the letter to Jonas Weber, Steuer-ID 12345678901.
The AI gets
Draft the letter to [PERSON_1], Steuer-ID [TAX_ID_DE_1].
[NIR_1][SIREN_1][SIRET_1]Your service sends
Review the file for Camille Martin, NIR 1 85 05 78 006 084 00.
The AI gets
Review the file for [PERSON_1], NIR [NIR_1].
[DNI_1][NIE_1][NIF_1][NUSS_1]Your service sends
Summarize the file for María López, DNI 12345678A.
The AI gets
Summarize 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
Answer Mario Rossi, codice fiscale RSSMRA80A01H501X.
The AI gets
Answer [PERSON_1], codice fiscale [TAX_CODE_IT_1].
[NIF_PT_1][NISS_1]Your service sends
Verify the sign-up for João Silva, NIF 123456780.
The AI gets
Verify the sign-up for [PERSON_1], NIF [NIF_PT_1].
[CPF_1][CNPJ_1][DRIVING_LICENCE_BR_1]Your service sends
Email Ana Souza about her order, CPF 123.456.789-00.
The AI gets
Email [PERSON_1] about her order, CPF [CPF_1].
[PPS_NUMBER_1]Your service sends
Send the summary to Aoife Murphy, PPS 1234567A.
The AI gets
Send the summary to [PERSON_1], PPS [PPS_NUMBER_1].
[TFN_1][MEDICARE_1]Your service sends
Run payroll for Jack Wilson, TFN 123 456 789.
The AI gets
Run payroll for [PERSON_1], TFN [TFN_1].
Fictional data and sample numbers that aren’t valid.
The Gateway picks up the usual PII (names, email addresses, phone numbers, street addresses, API keys) plus each country’s ID numbers in their native format. In the US that means Social Security numbers, ITINs, EINs and Medicare Beneficiary Identifiers. It also covers IBANs, credit cards and passports (the machine-readable zone).
| Country | ID documents |
|---|---|
| United States | Social Security number (SSN), ITIN, EIN, Medicare Beneficiary Identifier (MBI) |
| United Kingdom | National Insurance number, NHS number |
| Germany | Steuer-ID, Sozialversicherungsnummer |
| France | NIR (French social security number), 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 (driver’s license) |
| Ireland | PPS number |
| Australia | TFN, Medicare |
| All countries | IBAN, passports (machine-readable zone), credit cards |
Presidio comparison
Presidio finds PII in text. The OpenAI-compatible proxy that puts it in front of the API is something your team builds; Nonimo Gateway ships with it.
| Task | DIY with Presidio | With Nonimo Gateway |
|---|---|---|
| Detect PII in text | Presidio handles it | Included |
| OpenAI-compatible proxy | You build it | Ready to go |
| Put it in front of your AI provider | You integrate it | Swap base_url |
| Restore real values in the response | You build it | Ready to go |
| National ID numbers by country | Some built in (incl. SSN, ITIN); you choose and tune the rest | Everything in the table above |
| Spanish and other languages | You configure it | Ready to go |
| Keep it current | Your team | We ship every new version |
| Where it runs | On your infrastructure | A container on your server |
Side-by-side comparison, row by row: Microsoft Presidio alternative →
Presidio detects PII in text, but it doesn’t include an OpenAI-compatible proxy: to put it in front of the API, your team has to build that layer, integrate it and maintain it.
Nonimo Gateway ships with that layer: a container on your own server, an OpenAI-compatible API, real values restored in the response and the national ID numbers listed in the table above.
Self-hosted
You stay with your AI provider, and the Gateway is just one more piece of your perimeter.
It installs on your servers or in your cloud, right next to your services.
Only the license and usage figures go out. Your content doesn’t pass through Nonimo.
Your API key isn’t stored in the Gateway.
LiteLLM
If your platform already routes calls through LiteLLM, there are two ways to plug Nonimo in. Pick the one that fits.
Out Summarize the claim for [PERSON_1]
In The response comes back with placeholders: [PERSON_1]
Out Summarize the claim for [PERSON_1]
In The response comes back with the real values: Jessica Turner
Already running LiteLLM? Turn on Nonimo as a guardrail, or as a proxy in front of your provider if you want the real values back in the response.
Plans
Every plan starts with a 30-day trial, and if you go over your monthly limit, the Gateway lets you know and the service keeps running.
Your match Nonimo Gateway Business, $539/month
For a practice or team putting AI into production on one server
Nonimo Gateway Practice $319/month Nonimo Gateway Practice or $3,190 a year
For companies running AI across several services or sites
Nonimo Gateway Business $539/month Nonimo Gateway Business or $5,390 a year
For organizations with their own requirements and contract terms
Custom pricing
By our estimate, the Practice plan includes 25 million words a month, enough for teams of up to about 200 people; the Business plan includes 150 million, for teams of up to about 1,000; and the Enterprise plan has no cap, built for more than 1,000 people or multiple locations. If you ever go over, we’ll let you know and the service keeps running.
Access
Tell us what your stack looks like today, and we’ll reach out to set you up with a trial on your own server.
FAQ
What IT, security and compliance teams ask before deploying the Gateway.
Your prompt with placeholders such as [PERSON_1] or [SSN_1] where PII was found, and the same in tool-call arguments. If a policy is set to block, the request doesn’t reach the provider.
No. Detection runs locally, on 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 about 200 people; the Business plan includes 150 million, for teams of up to about 1,000; and the Enterprise plan has no cap, built for more than 1,000 people or multiple locations. If you ever go over, we’ll let you know and the service keeps running.
The redacted request to your AI provider, and the license and usage figures to Nonimo, not your content. If your network can’t reach Nonimo, offline mode is available on request on the Business and Enterprise plans.
By default, the request isn’t sent and your application gets a clear error.
Only for the license and usage figures, not your content. If your network can’t reach Nonimo, offline mode is available on request on the Business and Enterprise plans. Email us at hello@nonimo.ai and we’ll agree on the terms.
It helps. Names and Social Security numbers are replaced before the request reaches your AI provider, so less PHI, and less of what the CCPA and other state privacy laws call sensitive personal information, leaves your network. It’s pseudonymization, not de-identification under HIPAA, and HHS doesn’t certify any software as HIPAA compliant, so the Gateway works alongside your business associate agreement with the provider, not in place of one. Our guide to US state privacy and AI laws covers the detail state by state.
A server or a cluster that runs containers, on-prem or in your cloud. It installs right next to your services, and you can run multiple instances.
A signed license per server or instance, renewed automatically when the Gateway runs in online mode. If you go over your plan’s usage, the Gateway warns you and the service keeps running.
The Gateway doesn’t update itself. It lets you know when a new version is available, and your IT team applies it on its own schedule.
Guides
Guides on AI gateways, privacy proxies and keeping personal data out of your LLM API calls.
Get started
Request access, install the container right next to your services and confirm with your own traffic that PII reaches the AI as placeholders. For the AI tools your staff use in the browser, see Nonimo for organizations.
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.