privacy gateway for llm traffic
Personal data stays with you. The question goes to the model.
OBVELO sits between your application and your model provider: it replaces every personal value with a token, passes the request on, and puts the real values back into the answer. You change one field — the API address.
from openai import OpenAI
client = OpenAI(
base_url="https://api.obvelo.com/v1",
api_key=os.environ["OPENAI_API_KEY"],
default_headers={"x-api-key": os.environ["OBVELO_KEY"]},
)
client.chat.completions.create(
model="gpt-4o",
messages=[{"role": "user",
"content": "Summarise the claim by Anna Kowalska."}],
)
import OpenAI from "openai";
const client = new OpenAI({
baseURL: "https://api.obvelo.com/v1",
apiKey: process.env.OPENAI_API_KEY,
defaultHeaders: { "x-api-key": process.env.OBVELO_KEY },
});
await client.chat.completions.create({
model: "gpt-4o",
messages: [{ role: "user",
content: "Summarise the claim by Anna Kowalska." }],
});
curl https://api.obvelo.com/v1/chat/completions \
-H "x-api-key: $OBVELO_KEY" \
-H "Authorization: Bearer $OPENAI_API_KEY" \
-H "Content-Type: application/json" \
-d '{
"model": "gpt-4o",
"messages": [
{ "role": "user",
"content": "Summarise the claim by Anna Kowalska." }
]
}'
one address changed · your provider key passes through · the model sees a token, never the name
475
detection rules, 18 categories
4
API surfaces, one result
0
request content stored
EU
hosting and sub-processors
See the substitution
text only · runs left today: 3
The claim was filed by [Person 1] (PESEL [PESEL 1]) on behalf of [Company 1].
3 values replaced · one person, one token
The claim was filed by Anna Kowalska (PESEL 44051401359) on behalf of Acme Ltd.
Restored from the mapping you keep — pseudonymisation, not redaction.
A browser preview of the substitution, built from a handful of patterns — nothing leaves this page. The product itself runs 475 detection rules, a name model and your own lists. Please use invented data.
why teams switch
Use any model. Expose no one.
01
One field to deploy
Change the API address. Your SDK, your provider and your prompts stay exactly as they are.
02
The model never meets your customers
Names, IDs, emails and account numbers leave as tokens and come back as themselves — the answer reads naturally.
03
Your data stays in the EU
Hosting and every sub-processor in the EU or EEA. Nothing from request content is ever stored.
how it works
One request, three states
OBVELO swaps every personal value for a token on the way out and puts it back on the way in. The mapping travels with the request and stays with you — there is no vault on our side to leak from.
beyond chat
Agents, files and your own data — covered
agents
Tool calls, protected both ways
Arguments leave masked and are put back before they reach your systems. The MCP bridge applies your tool allowlist before any call goes out.
attachments
Files come back masked — and still open
docx, xlsx, pptx, csv and txt, including authors, comments, chart labels and hidden metadata.
your lists
Names from your CRM, recognised
Send up to 20 000 people, companies or words never to mask with a request. Used for that request, stored nowhere.
profiles
A rule profile for every system
Each key carries its own jurisdictions and selection of rules — support bot and legal team, each set up right.
measured on every engine change
A single leaked value fails the build.
54/54
personal values in files masked
31/31
structural values kept
0
files destroyed
200/0
random files / corrupted
attachment corpus · 21 file containers · rule layer · the floor for every figure is the one shown
integration
Works with the API you already call
OpenAI chat and responses, Anthropic messages, Gemini contents — Mistral and compatibility gateways speak the chat shape. SDKs for TypeScript and Python, streaming included.
security
Private by design
Isolated detection
The name model runs in a container that holds no network permission — not “does not use the network”, but cannot. A test checks it on every change.
Nothing from content stored
The data plane stores nothing from request content; the control plane stores the account, the plan and usage in numbers, and never sees content. Your provider stays on your own credentials.
An audit trail without the data
Which account, which key, which tool, allowed or refused — never the content itself. It answers who sent this; it does not answer who caused a leak.
Pricing
EUR, net, per month · billed per character
paid plans
starter
49EUR / mo
standard
119EUR / mo
pro
349EUR / mo
No user limit on any plan. A plan limits the number of keys — systems — and the volume of characters, never the number of people.
The hard cap is on by default. Traffic stops rather than producing an invoice you did not expect; you switch overage on deliberately.
Detection quality is identical on every plan. A cheaper plan is less volume, never weaker protection. The free plan needs no card.
Enterprise
tailored to your organisation
Volume, rule profiles and paperwork, agreed in writing. The same engine as every plan — the contract changes the scale, never the protection.
Self-hosting
Run the whole gateway inside your own perimeter.
Your provider, your credentials
Choose your own model provider and keep billing on your contract. Switch vendors without touching OBVELO.
A profile per system
Unlimited keys, each with its own jurisdictions and rules.
Paperwork in the contract
The data processing agreement and our EU/EEA sub-processor register are part of the contract, agreed before you go live.
what is agreed
Questions engineers ask first
Do you train on our data?
No. Nothing from request content is stored, and transcripts are never written.
Where does the traffic go?
To your own model provider, on your own credentials. We do not call a model on our contract.
Where are you hosted?
In the EU. Every sub-processor is in the EU or EEA and is entered in our register of processing activities before it is used.
Is this anonymisation?
No — pseudonymisation. You keep the mapping, so the answer can be turned back into the document you sent.
Does the model still understand the question?
That is the point of a token rather than a black box: the sentence keeps its shape, so the model still reads who did what to whom — it just does not learn the name.
What happens to a file we attach?
A docx, xlsx, pptx, csv or txt is masked and rebuilt, and still opens. A pdf, a scan, or a file your provider fetched by id is not masked — and the answer says so, with the reason.
Can two of our systems have different rules?
Yes. A key is a system, not a person: each key carries its own rule profile — its own jurisdictions and its own selection of rules. The profile belongs to the credential, not to a header.
How many people can we put on an account?
As many as you like. No plan limits users; we charge for characters.
What does the audit journal record?
Which account, which key, which tool, allowed or refused — with no content at all. It answers who sent this and who approved this. It does not answer who caused a leak.
What if you are down?
The gateway serves from its last snapshot, so existing customers keep working; only new registrations wait.
Can we self-host?
Talk to us — that is an enterprise conversation, not a plan you buy in a browser.
Does OBVELO make us compliant?
It lowers risk and gives you a control point with an audit trail — but compliance depends on your whole processing, not on one component. See the sentence at the foot of this page.
Is there anything OBVELO cannot mask?
PDFs, scanned images and files your provider fetches by id. Each response tells you when that happens, and you choose the policy: refuse the request, warn, pass, or mask.
Change one field. Keep the people.
Enterprise, self-hosting or a question first: office@obvelo.com