Nonimo Gateway, built for Irish IT
Nonimo Gateway masks personal data on your own servers before each call to the AI and restores it in the reply. It runs in a container in front of the OpenAI API, so your services keep their code: all that changes is the base_url.
Summarise the file for Ciara Walsh and email her at ciara.walsh@example.com.
Summarise the file for [PERSON_1] and email her at [EMAIL_1].
Hi [PERSON_1], we’ve gone through your file and it’s complete.
Hi Ciara Walsh, we’ve gone through your file and it’s complete.
Getting started
Your services’ code stays as it is: a container on your server and a new base_url.
A container, on-premises or in your cloud tenancy.
It installs on your servers or in your cloud tenancy (an EU region, if your policy requires it), beside your services, and you can run several instances in parallel.
Your code still talks to the OpenAI API. Only the address is new.
The Gateway speaks the OpenAI API. Your services point at it and keep calling /v1/chat/completions or /v1/responses, with function calling. Upstream, it can be OpenAI or any compatible API.
Personal data goes out as placeholders and comes back as the real details.
Each request is checked in full before it goes to your provider: personal data is replaced by placeholders and, in the reply, every placeholder gets its real value back. Your services’ requests to the AI pass through it before they leave your network.
The official OpenAI SDK works without changes; you only point the client at the Gateway:
from openai import OpenAI
# Same client, same key: only base_url is different
client = OpenAI(base_url="http://your-server:8080/v1")
resp = client.chat.completions.create(
model="gpt-4o",
messages=[{"role": "user", "content": "Summarise the file for Ciara Walsh."}],
) import OpenAI from "openai";
// Same client, same key: only baseURL is different
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 file for Ciara Walsh." }],
}); # The request you already send, now to your own 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 file for Ciara Walsh."}]
}' Details restored
Your provider sees only placeholders; your service gets the reply with the real details, each one back in its place.
Internal chatbot
Summarise the ticket Eoin Byrne[PERSON_1] logged from eoin.byrne@example.com[EMAIL_1].
The ticket from Eoin Byrne[PERSON_1] is about a VPN sign-in problem that started on Monday. I’m sending eoin.byrne@example.com[EMAIL_1] the steps to reconnect.
Customer service
Draft an email to Conor Kelly[PERSON_1] (conor.kelly@example.com[EMAIL_1]) to confirm we’ve received his documents.
Hi Conor Kelly[PERSON_1], just to confirm we’ve received your documents. We’ll be in touch at conor.kelly@example.com[EMAIL_1] as soon as everything is ready.
Agent with tools
Check the application status for Niamh O’Connor[PERSON_1], PPS number 7654321X[PPS_NUMBER_1].
get_application({ "applicant": "Niamh O’Connor[PERSON_1]", "pps": "7654321X[PPS_NUMBER_1]" })
Your tool gets the real value; the provider only saw the placeholder.
HR
Prepare the welcome letter for Darragh Ryan[PERSON_1]; his salary will be paid to IE00 AAAA 0000 0000 0000 00[IBAN_1].
Hi Darragh Ryan[PERSON_1], you’re very welcome to the team. Your salary will be paid to the account IE00 AAAA 0000 0000 0000 00[IBAN_1].
For your DPO: this is pseudonymisation (Article 4(5) GDPR) and the mapping back to the real details stays in your infrastructure. What the GDPR, the Data Protection Act 2018 and the DPC say, in the questions below.
Is pseudonymised data still personal data? We answer that in is pseudonymised data personal data.
Detection runs on your network: your data doesn’t leave it to be checked. It doesn’t rewrite or summarise, it only marks what is personal data, and within a conversation each detail keeps its 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]) to confirm we’ve received his documents. What your service receives
Hi Conor Kelly, just to confirm we’ve received your documents. We’ll be in touch at conor.kelly@example.com as soon as everything is ready. Irish and international IDs
Every document, in its own format. Pick a country and see what the AI gets.
Ireland: also covered
[PERSON_1][PHONE_1][IBAN_1][EIRCODE_1][EMAIL_1]United Kingdom: also covered
[PERSON_1][PHONE_1][BANK_ACCOUNT_GB_1][POSTCODE_1][EMAIL_1]United States: also covered
[PERSON_1][PHONE_1][BANK_ACCOUNT_US_1][ADDRESS_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][PPS_NUMBER_1][TAX_REFERENCE_IE_1][IHI_IE_1]Your service sends
Send the claim summary to Aoife Murphy, PPS number 1234567A.
The AI gets
Send the claim summary to [PERSON_1], PPS number [PPS_NUMBER_1].
[NINO_1][NHS_NUMBER_1]Your service sends
Update the record for Oliver Smith, National Insurance QQ 12 34 56 C.
The AI gets
Update the record for [PERSON_1], National Insurance [NINO_1].
[SSN_1]Your service sends
Go through the application from John Miller, SSN 987-65-4321.
The AI gets
Go through the application from [PERSON_1], SSN [SSN_1].
[TFN_1][MEDICARE_1]Your service sends
Prepare the payslip for Jack Wilson, TFN 123 456 789.
The AI gets
Prepare the payslip for [PERSON_1], TFN [TFN_1].
[TAX_ID_DE_1][SOCIAL_SECURITY_DE_1]Your service sends
Draft the letter for Jonas Weber, Steuer-ID 12345678901.
The AI gets
Draft the letter for [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
Summarise the file for María López, DNI 12345678A.
The AI gets
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 gets
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 gets
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 gets
Write to [PERSON_1] about her order, CPF [CPF_1].
Invented details; the sample numbers are deliberately invalid.
The Gateway recognises the usual personal data (names, email addresses, phone numbers, addresses, API keys) and, beyond that, each country’s ID numbers in their own format. For Ireland, that means PPS numbers, tax reference numbers, Individual Health Identifiers and Eircodes. It also covers IBANs, payment cards and passports (their machine-readable zone).
| Country | ID numbers |
|---|---|
| Ireland | PPS number, tax reference number, Individual Health Identifier (IHI) |
| United Kingdom | National Insurance number, NHS number |
| United States | Social Security 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 |
Presidio or Gateway
Presidio detects personal data in text. To put it in front of the API you need an OpenAI-compatible proxy, which your team has to build; Nonimo Gateway comes with one.
| Task | Set it up with Presidio | With Nonimo Gateway |
|---|---|---|
| Detect personal data in text | Presidio does this | Included |
| OpenAI-compatible proxy | You build it | Already there |
| Place it in front of your AI provider | You connect it | Change base_url |
| Return the real details in the reply | You build it | Already there |
| ID numbers for each country | Some built in; you choose and adjust the rest | The ones in the table above |
| Text in languages other than English | You configure it | Already there |
| Keep it current | Your team | We supply each new version |
| 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 doesn’t come with an OpenAI-compatible proxy: to place it in front of the API, your team has to build that proxy, connect it and maintain it.
Nonimo Gateway has that part already in place: a container on your own server, an OpenAI-compatible API, the real details restored in the reply and the ID numbers for each country in the table above.
Your infrastructure
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, beside your services.
Only the licence and usage figures. Your content doesn’t pass through Nonimo.
Your API key isn’t stored in the Gateway.
LiteLLM
If your platform already routes its calls through LiteLLM, Nonimo fits in two ways. Choose the one you need.
Out Summarise the file for [PERSON_1]
Back The reply comes in with placeholders: [PERSON_1]
Out Summarise the file for [PERSON_1]
Back The reply comes in with the real details: Ciara Walsh
Running LiteLLM already? Nonimo switches on as a guardrail, or as a proxy in front of your provider if you want the real details back in the reply.
Plans and pricing
Every plan comes with a 30-day trial, and if you go over your limit the Gateway lets you know and the service keeps running.
A good fit Nonimo Gateway Business, €490/month
For a single team or practice getting started
Nonimo Gateway Practice €290/month Nonimo Gateway Practice or €2,900 a year
For organisations running AI across several departments
Nonimo Gateway Business €490/month Nonimo Gateway Business or €4,900 a year
For large organisations with their own terms
Price on request
The Practice plan includes 25 million words a month, which we estimate is enough for teams of up to around 200 people; the Business plan, with 150 million, suits teams of up to around 1,000; and the Enterprise plan has no cap, designed for organisations with more than 1,000 people or several sites. If you ever go over, we’ll let you know and the service keeps running.
Access
Give us a quick picture of your set-up and we will be in touch about trying it on your own server.
Questions
What IT managers, security leads and DPOs ask before they put the Gateway into production.
The prompt with every detected detail replaced by a placeholder such as [PERSON_1] or [PPS_NUMBER_1], including inside tool-call arguments. The real values stay on your server. A category you set to block doesn’t go out.
No. Detection runs locally, on your network.
The OpenAI API and any API compatible with it: Chat Completions and Responses, with function calling.
The Practice plan includes 25 million words a month, which we estimate is enough for teams of up to around 200 people; the Business plan, with 150 million, suits teams of up to around 1,000; and the Enterprise plan has no cap, designed for organisations with more than 1,000 people or several sites. If you ever go over, we’ll let you know and the service keeps running.
The masked request, to your AI provider, and the licence and usage figures, to Nonimo, not your content. If your network can’t reach Nonimo, the Business and Enterprise plans offer an offline mode on request.
By default, the request doesn’t go out and your application gets a clear error.
Only for the licence and usage figures, not your content. If your network can’t reach Nonimo, the Business and Enterprise plans offer an offline mode on request. Write to us at hello@nonimo.ai and we’ll agree the terms.
It applies pseudonymisation, a measure both laws name. The GDPR defines it in Article 4(5) and lists it under data protection by design and security of processing (Articles 25 and 32), and section 36 of the Data Protection Act 2018 includes it among the suitable and specific measures a controller can adopt when processing special categories of personal data. Pseudonymised data is still personal data (Recital 26 GDPR, and the Data Protection Commission’s guidance agrees), so the Gateway sits alongside your contract with the AI provider and your DPIA rather than replacing them.
A server or a cluster that runs containers, on-premises or in your own cloud tenancy. It installs beside your services, and you can run several instances.
A signed licence per server or instance, renewed automatically on the connected plans. If you go past your plan’s usage, the Gateway lets you know and the service keeps running.
Your IT team applies updates whenever it suits them, because the Gateway doesn’t update itself. It lets you know when there’s a new version.
Guides
Guides on AI gateways, privacy proxies and keeping personal data out of your LLM API calls.
Get started
Request access, change one base_url and your services reach OpenAI with personal data masked from day one. For the AI tools your staff open in a browser, have a look at Nonimo for organisations.
Take personal data out of a file or text before it goes to AI. Or cover the details on a copy of your ID and add a watermark before you send it.