Security
What happens to a request, and what we keep.
Every claim below was read out of the code, and each one names the file it came from so you can hold us to it. What we have not done yet is further down the same page.
Prompts are scanned before they leave, not after
Six prompt-injection patterns and eight personal-data and secret patterns run over the messages on the way in, ahead of the call to the provider. A check that runs afterwards tells you what already left.
packages/security/src/detect.ts
Findings are kinds and counts, never the matched text
When the scanner finds a card number, what gets stored is that it found one, of that kind, that many times, in that message. Recording the match would mean a security feature that creates a second copy of exactly the data it exists to notice.
packages/db/prisma/schema.prisma, UsageRecord
No prompt or response body is stored against a request
A usage record carries the model, the token counts, the cost and the timings. It carries no message content, which is why the charge can be recomputed from it and your text cannot.
packages/db/prisma/schema.prisma, UsageRecord
The cache is scoped to your organisation and expires
A cached response is keyed on a SHA-256 of your organisation, the model and the normalised request, and the uniqueness constraint includes the organisation. One organisation cannot read another's cached answer, by construction rather than by a check somebody has to remember. Every entry carries an expiry.
packages/db/prisma/schema.prisma, CacheEntry
Your provider keys are encrypted at rest
A key you bring is stored as AES-GCM ciphertext with its own initialisation vector and authentication tag, never as text in a column.
packages/db/prisma/schema.prisma, ProviderKey
Spend caps refuse the request, they do not report on it
Both the per-key cap and the organisation limit are checked before a provider is called, and a request over the line comes back 402 rather than succeeding and appearing on a report.
apps/gateway-api/src/billing
Sessions are revocable, individually and all at once
Every token carries an identifier that maps to a session row, and both guards check it on every request. Signing out everywhere takes effect immediately rather than waiting for a token to expire.
packages/auth
Single sign-on, per organisation
An organisation can connect its own identity provider, so joining and leaving is handled where your other software already handles it.
packages/db/prisma/schema.prisma, OrgSsoConnection
What we do not do
You would find all of this out eventually. Finding it out later is worse for both of us.
No SOC 2, and no penetration test report
Neither exists yet. Both are money and elapsed time rather than engineering, and claiming either before it is true is the one thing on this page that could not be walked back.
The scanners are heuristics, and the default is to flag
They are regular expressions over the messages, not a model, and they will miss things a determined author can phrase around. Every organisation starts in flag mode, where nothing is ever refused. Block mode is one header or one setting away, and it is off until you choose it.
Caching is off unless you ask for it
A response is only cached when the request carries the cache header, so nothing is stored on your behalf by default.
Your prompt still reaches the provider you chose
Vatan sits in front of the model providers; it does not replace them. What we can do is tell you what left, refuse what should not, and never keep a copy ourselves.
If a shared service is not an option
For an organisation that cannot send traffic to a shared service, Enterprise is a managed deployment inside your own infrastructure, operated by us. Not a licence to run it yourself: we run it, in your environment, under an agreement that says so.
Read on 28 August 2026. The developer-facing detail, including how to switch the scanners to block, is in the docs. To report a vulnerability, see security.txt.