EU data residency for AI
The EU AI stack.
Three products. One audit trail. Nothing leaves the EU unless you send it. You can prove it.
Registered in the Netherlands. No US parent.
Every request. Every workspace. From the first token.
One request
python
1line changed
client = OpenAI(base_url="https://api.akumi.eu/v1",api_key=os.environ["AKUMI_API_KEY"],)
- Routed to
- mistral-large · eu-west-1
- Latency
- 840ms · cache miss
- SDKs
- python · ts · php
Your client, your SDK, your code. Everything else stays where it is.
Read the docs →firewall
this request
3entities masked
You send
Summarise the dispute for jan.devries@acme.nl, invoice NL4471, IBAN NL91ABNA0417164300.
The model sees
Summarise the dispute for «EMAIL_1», invoice «INVOICE_1», IBAN «IBAN_1».
Restored in your response, never in the model context. This is what makes routing outside the EU safe rather than forbidden.
See the firewall →Audit trail
Today
1,284requests, 0 left the EU
- 14:02ChatFrankfurt
Message sent by m.devries
PII masked
- 14:01PlatformFrankfurt
Completion via API key ending 4f2a
No egress
- 13:58CodeFrankfurt
Repository context read, acme/billing-api
Metadata only
- 13:56ChatBlocked at edge
Non-EU model requested, refused
Egress held
| Time | Source | What happened | Region | Applied |
|---|---|---|---|---|
| 14:02 | Chat | Message sent by m.devries | Frankfurt | PII masked |
| 14:01 | Platform | Completion via API key ending 4f2a | Frankfurt | No egress |
| 13:58 | Code | Repository context read, acme/billing-api | Frankfurt | Metadata only |
| 13:56 | Chat | Non-EU model requested, refused | Blocked at edge | Egress held |
Every product writes to the same record. Metadata only, never prompt content.
See the audit trail →What you get
Nine services. Three ways in.
The Platform is the services. Chat and Code are two more doors into the same building.
- Akumi PlatformIn service
All nine services, over one OpenAI-compatible API.
- Akumi ChatIn preview
The same services, as chat for your whole team.
- Akumi CodeIn preview
Recall over every PR, issue and decision, for your coding agent.
Build
Get a model answering, fast.
- Inference APIOpenAI-compatible, metered per use
- MCP ServerMemory and tools for AI clients
- CacheReuse responses, cut cost and latency
Govern
Decide what a model may see and say.
- Model RouterPolicy-based routing with fallback
- FirewallPseudonymize before models see data
- RecallMemory and documents in one knowledge graph
Prove
Show an auditor what happened.
- Audit TrailEvery request, every product, one record
- Compliance CenterArt. 30 ROPA and EU AI Act records
- ObservabilityTrace latency, cost and every stage
Whichever product makes the call, the same nine services run, and the same trail records it.
Explore the platform →Before you sign
Answers for the person who has to sign off.
Where does the data actually live?
Storage and the application never leave the EU. Model calls leave only with your recorded approval. Your CLOUD Act exposure is a list you can produce.
Residency reportDoes a model ever see personal data?
Not with the firewall on. Personal data is replaced with tokens before any model sees it, and restored only in your own response. The firewall is a per-workspace switch, and the audit trail records which setting each request ran under.
Firewall specCan we prove it afterwards?
Every request records where it ran, and a metadata-only audit trail is retained on your own policy.
Audit exportWho else touches the data?
Every sub-processor is disclosed up front. The DPA is available on request.
Sub-processor listWhich regulations does this cover?
GDPR and the EU AI Act from the start, documented for DORA and NIS2. ISO 27001 is in progress, and we say so.
Article 30 ROPARegistered in the Netherlands. No US parent.
How you start
This is the whole migration.
Keep your OpenAI client and your code. One line points it at the EU, and the record starts writing itself.
Before
Your data leaves the EU, and nothing is written down.
client = OpenAI(api_key=os.environ["OPENAI_API_KEY"],)
What your auditor gets
no record
You write the risk assessment yourself, from memory.
With Akumi
EU-resident by default, and a record of every call.
client = OpenAI(base_url="https://api.akumi.eu/v1",api_key=os.environ["AKUMI_API_KEY"],)
What your auditor gets
- 09:41:02chat.completionseu-west-1Logged
- 09:41:04pii.pseudonymizeeu-west-1Logged
Hand compliance the log, not a risk assessment.
Start here
Ship the AI feature legal already approved.
Three ways in, one key, one audit trail. Pick the door that fits.
Akumi Platform
In serviceAn OpenAI-compatible API and nine services you switch on per request. Swap one URL and start.
Start free →Akumi Chat
In previewPrivate AI chat for your whole team. Same platform, same audit trail.
Join the waitlist →Akumi Code
In previewRecall over every PR, issue and decision, for your coding agent.
Join the waitlist →