healthcare

The discharge letter reaches the model. The patient does not.

Discharge letters, referrals, lab reports and ward notes carry a patient, their family, the clinicians who treated them and a dozen numbers that identify all of them. OBVELO replaces every one with a token before any model reads the document, keeps the clinical content readable, and puts the real values back into the answer.

what the model receives

5 hospital documents in 5 languages, masked by the engine

Each document is invented, written in its country's own language and layout, and masked exactly as the gateway masks it for a hospital: the Healthcare preset on and the catalogue narrowed to the document's country. The right-hand side is not a mock-up — it is the engine's output, regenerated with every release and checked against the engine by a test, so this page cannot show a mask the product no longer makes.

Discharge letter · Germany · German

The diagnosis, medication and allergy behind their labels go with the preset; the clinical narrative stays for the model to work on.

the document
Klinikum Musterstadt — Klinik für Kardiologie, Station 3B
Entlassbrief
Patient: Thomas Becker, geb. 01.02.1960
Anschrift: Musterstraße 12, 10115 Berlin
Versichertennummer: A123456789
Fallnummer: 2026004512
Aufnahme: 12.03.2026, Entlassung: 18.03.2026
Diagnose: I21.4 Nicht-ST-Hebungsinfarkt
Medikation: Metoprolol 47,5 mg 1-0-1
Allergien: Penicillin

Sehr geehrte Kolleginnen und Kollegen,
der Patient stellte sich mit seit zwei Tagen bestehenden Thoraxschmerzen vor. Die Koronarangiographie zeigte eine hochgradige Stenose, die mit einem Stent versorgt wurde. Die Entlassung erfolgte beschwerdefrei; Wiedervorstellung in 2 Wochen.

Dr. Erika Musterfrau, LANR 123456701
the model receives
Klinikum Musterstadt — Klinik für Kardiologie, Station 3B
Entlassbrief
Patient: [Person 1], geb. [DOB 1]
Anschrift: [Address 1]
Versichertennummer: [Health 1]
Fallnummer: [Health 2]
Aufnahme: [Date 1], Entlassung: [Date 2]
Diagnose: [Health 3]
Medikation: [Health 4]
Allergien: [Health 5]

Sehr geehrte Kolleginnen und Kollegen,
der Patient stellte sich mit seit zwei Tagen bestehenden Thoraxschmerzen vor. Die Koronarangiographie zeigte eine hochgradige Stenose, die mit einem Stent versorgt wurde. Die Entlassung erfolgte beschwerdefrei; Wiedervorstellung in 2 Wochen.

[Person 2], LANR [Health 6]

12 values replaced · stays readable: Klinik für Kardiologie, Station 3B · Thoraxschmerzen · Koronarangiographie · hochgradige Stenose · in 2 Wochen

Referral · Netherlands · Dutch

The patient is named three times and is one token throughout, so the model still knows the letter is about one person.

the document
Huisartsenpraktijk Voorbeeld — Verwijsbrief
Aan: polikliniek Cardiologie
Patiënt: Jan Jansen, geboren 15-07-1985
BSN: 274819363
Adres: Voorbeeldstraat 12, 1234 AB Amsterdam
Telefoon: 06 12345678

Geachte collega,
Graag verwijs ik de heer Jansen naar u voor beoordeling van hartkloppingen bij inspanning, zonder syncope. Het ECG in rust was normaal. De heer Jansen gebruikt geen medicatie.

Met collegiale groet,
dr. Anna de Vries, huisarts, AGB-code 01234567
the model receives
Huisartsenpraktijk Voorbeeld — Verwijsbrief
Aan: polikliniek Cardiologie
Patiënt: [Person 1], geboren [DOB 1]
BSN: [ID 1]
Adres: [Address 1]
Telefoon: [Phone 1]

Geachte collega,
Graag verwijs ik de heer [Person 1] naar u voor beoordeling van hartkloppingen bij inspanning, zonder syncope. Het ECG in rust was normaal. De heer [Person 1] gebruikt geen medicatie.

Met collegiale groet,
dr. [Person 2], huisarts, AGB-code [Health 1]

7 values replaced · stays readable: hartkloppingen bij inspanning · Het ECG in rust was normaal · polikliniek Cardiologie

Lab report · Spain · Spanish

The patient, the requesting doctor and their numbers go; every result and its reference range stays readable.

the document
Hospital Universitario de Ejemplo — Laboratorio de Bioquímica
INFORME DE RESULTADOS
Paciente: Lucía Fernández Ruiz
DNI: 87654321X
NHC: 1234567
Fecha de la muestra: 10/03/2026
Médico solicitante: Dr. Juan Pérez García, nº colegiado 282812345

Hemoglobina      13,2 g/dL     (12,0 - 15,5)
Leucocitos       7,4 x10^3/µL  (4,0 - 10,5)
Glucosa          98 mg/dL      (70 - 110)
HbA1c            38 mmol/mol   (< 39)
Creatinina       0,8 mg/dL     (0,5 - 1,1)

Todos los valores dentro del intervalo de referencia.
the model receives
Hospital Universitario de Ejemplo — Laboratorio de Bioquímica
INFORME DE RESULTADOS
Paciente: [Person 1]
DNI: [ID 1]
NHC: [Health 1]
Fecha de la muestra: [Date 1]
Médico solicitante: [Person 2], nº colegiado [Health 2]

Hemoglobina      13,2 g/dL     (12,0 - 15,5)
Leucocitos       7,4 x10^3/µL  (4,0 - 10,5)
Glucosa          98 mg/dL      (70 - 110)
HbA1c            38 mmol/mol   (< 39)
Creatinina       0,8 mg/dL     (0,5 - 1,1)

Todos los valores dentro del intervalo de referencia.

6 values replaced · stays readable: Hemoglobina 13,2 g/dL (12,0 - 15,5) · Glucosa 98 mg/dL (70 - 110) · HbA1c 38 mmol/mol (< 39) · Laboratorio de Bioquímica

Prescription · Italy · Italian

The prescription number, the tax code and the exemption code are identifiers; the therapy behind its label goes with the preset.

the document
SERVIZIO SANITARIO NAZIONALE — Ricetta elettronica
NRE: 1234A1234567890
Assistito: Mario Rossi
Codice fiscale: RSSMRA85T10A562S
Indirizzo: Via Esempio 10, 00100 Roma
Codice esenzione: 048
Terapia: Bisoprololo 5 mg, 28 compresse, una compressa al mattino
Medico prescrittore: Giulia Bianchi
Data: 12/03/2026
the model receives
SERVIZIO SANITARIO NAZIONALE — Ricetta elettronica
NRE: [Health 1]
Assistito: [Person 1]
Codice fiscale: [ID 1]
Indirizzo: [Address 1]
Codice esenzione: [Health 2]
Terapia: [Health 3]
Medico prescrittore: [Person 2]
Data: [Date 1]

8 values replaced · stays readable: Ricetta elettronica · SERVIZIO SANITARIO NAZIONALE

Clinic letter · United Kingdom · English

The NHS number, hospital number and date of birth go; the course of treatment stays, and the diagnosis behind its label goes with the preset.

the document
Cardiology Outpatient Clinic — Example Hospital
Patient: John Smith
NHS number: 943 476 5919
Hospital number: 1234567
Date of birth: 04/05/1958
Address: 12 Example Road, London SW1A 1AA

Dear Dr Patel,
I reviewed your patient in clinic today. His breathlessness has improved since his bisoprolol was increased, and the echocardiogram shows a preserved ejection fraction. He would like to return to cycling, which I have encouraged.
Diagnosis: Heart failure with preserved ejection fraction
Plan: review in clinic in three months.

Dr Sarah Jones, GMC 7654321
the model receives
Cardiology Outpatient Clinic — Example Hospital
Patient: [Person 1]
[Health 1]
Hospital number: [Health 2]
Date of birth: [DOB 1]
Address: [Address 1]

Dear [Person 2],
I reviewed your patient in clinic today. His breathlessness has improved since his bisoprolol was increased, and the echocardiogram shows a preserved ejection fraction. He would like to return to cycling, which I have encouraged.
Diagnosis: [Health 3]
Plan: review in clinic in three months.

[Person 3], GMC [Health 4]

9 values replaced · stays readable: His breathlessness has improved since his bisoprolol was increased · the echocardiogram shows a preserved ejection fraction · review in clinic in three months

Tokens are shown as label and number. A real token also carries a namespace that changes with every request, so two requests never share one; the mapping that turns them back into names travels with your request and stays with you. These outputs are the rule layer alone — in production the name model runs beside it and can only add masks, never remove one.

what is masked

On by default, in every plan

people

Patients, relatives and clinicians

Names in a form field, in a letterhead, in a signature and in running text, found by the rules and the name model together. A surname repeated later in the letter is masked as well and, where the engine can tie it to the full name, carries the same token — the referral above shows it — so the model still follows who is who.

identifiers

The numbers a hospital prints on every page

Health-insurance and national numbers, patient record, stay and case numbers, clinician licence numbers, prescription, referral and sick-note numbers — each under the label its own form prints, in every jurisdiction the catalogue covers (52).

contact

Addresses, phones and e-mail

Street addresses written as a form or as a sentence, postcodes, telephone and fax numbers, e-mail addresses — in the languages the letters are written in.

your country's numbers

The numbers a hospital prints, jurisdiction by jurisdiction

Each family is measured under the label its own country's forms print, in each of that country's languages, with the catalogue narrowed to that one country — so a number is never protected by accident by another country's rule. A single value left in clear fails the build.

  • Patient record52 jurisdictions
  • Stay or admission52 jurisdictions
  • Health insurance46 jurisdictions
  • Clinician licence52 jurisdictions
  • Prescription52 jurisdictions
  • Referral49 jurisdictions
  • Sick note42 jurisdictions
Every one of the 52 jurisdictions, family by family
jurisdictionPatient recordStay or admissionHealth insuranceClinician licencePrescriptionReferralSick note
Argentinayesyesyesyesyesyes—
Australiayesyesyesyesyesyesyes
Austriayesyesyesyesyesyesyes
Belgiumyesyesyesyesyes—yes
Brazilyesyesyesyesyesyesyes
Bulgariayesyesyesyesyesyesyes
Canadayesyesyesyesyesyes—
Chileyesyesyesyesyesyesyes
Chinayesyesyesyesyesyes—
Croatiayesyesyesyesyesyesyes
Cyprusyesyesyesyesyesyesyes
Czechiayesyesyesyesyesyesyes
Denmarkyesyesyesyesyesyesyes
Estoniayesyesyesyesyesyesyes
Finlandyesyesyesyesyesyesyes
Franceyesyesyesyesyes—yes
Germanyyesyesyesyesyesyesyes
Greeceyesyesyesyesyesyesyes
Hungaryyesyesyesyesyesyesyes
Icelandyesyesyesyesyesyesyes
Indiayesyesyesyesyesyes—
Irelandyesyesyesyesyesyesyes
Israelyesyes—yesyesyes—
Italyyesyesyesyesyesyesyes
Japanyesyesyesyesyesyes—
Latviayesyesyesyesyesyesyes
Liechtensteinyesyes—yesyesyesyes
Lithuaniayesyesyesyesyesyesyes
Luxembourgyesyesyesyesyes—yes
Maltayesyesyesyesyesyesyes
Mexicoyesyesyesyesyesyesyes
Netherlandsyesyesyesyesyesyes—
Norwayyesyesyesyesyesyesyes
Polandyesyes—yesyesyesyes
Portugalyesyesyesyesyesyesyes
Romaniayesyesyesyesyesyesyes
Russiayesyesyesyesyesyesyes
Singaporeyesyes—yesyesyesyes
Slovakiayesyesyesyesyesyesyes
Sloveniayesyesyesyesyesyesyes
South Africayesyesyesyesyesyesyes
South Koreayesyesyesyesyesyes—
Spainyesyesyesyesyesyesyes
Swedenyesyesyesyesyesyesyes
Switzerlandyesyesyesyesyesyesyes
Taiwanyesyesyesyesyesyes—
Thailandyesyes—yesyesyesyes
Türkiyeyesyesyesyesyesyesyes
Ukraineyesyes—yesyesyesyes
United Arab Emiratesyesyesyesyesyesyesyes
United Kingdomyesyesyesyesyesyesyes
United Statesyesyesyesyesyesyes—

yes: measured under that country's own labels and held at no value in clear. A dash: not measured — we found no form label we were sure of, so the family is left out rather than guessed. The national, tax and social-security numbers a patient also carries are listed on the public-sector page.

one click in your account panel

The Healthcare preset

Choose Healthcare in the account panel and it ticks these groups at once: health data behind its label — diagnosis, medication, allergies, sick leave, dates and times and case and file references, decision numbers. Nothing downstream is special — the preset only ticks groups you can see and change.

clinical labels

Diagnosis, medication, allergies

Health data behind its own label is masked, so a coded diagnosis does not reach the model beside a name it could be tied to.

dates

Admission, discharge, date of birth

Every date tied to the patient, including the ones written in words.

your choice

Diagnoses in running text stay readable

The model usually needs them to do its work. If it must not see them, switch on disease and medicine names as well — every group the preset ticks can be changed.

measured on clinical documents we did not write

1 598 clinical documents, annotated by others.

1 598

documents from MEDDOCAN, MultiGraSCCo and Nemotron-PII

15 988

values the product owes those documents under this preset

11

languages

held-out test split, never used for tuning · each value judged by position: protected only when every letter and digit of it is masked · layer: rule layer

files and scans

The referral is often a scan

Switch file masking on and a docx, xlsx, pptx, csv or txt comes back masked and still opens. On plans with the OCR add-on (Pro and Enterprise), a scanned referral or a photographed page is read and returned as its masked text. See it on real files.

what stays readable, and why

The model gets the medicine, not the patient

Masking everything would leave the model nothing to work on. What is left in clear is chosen, and every choice can be changed in the account panel.

clinical narrative

History, findings, course of treatment

Symptoms, procedures and the reasoning between them stay as written — that is what a summary, a coding suggestion or a discharge draft is made from. Only the people and their numbers inside the sentences are replaced.

results

Values, units and reference ranges

A lab value identifies nobody on its own, so results, units and ranges come through untouched — the lab report above shows every line of them.

organisation

Wards, departments, follow-up intervals

The hospital, the ward and the clinic a patient is referred to stay readable; so do the intervals in a plan. Your own formats — a ward code that does identify someone in your house — can be added to the list of values to mask.

how a hospital connects it

Where your documents already go to a model

base URL

A system that lets you set the model's address

A clinical documentation tool, a coding assistant, a chatbot: point it at the gateway and add one header. Requests are masked on the way out and restored on the way back.

SDK

Your own code

TypeScript, Python or .NET. The SDK only restores — masking stays on the gateway, where one release reaches every caller. Read the docs.

people at a desk

Staff who paste into a chat window

The browser add-on masks the prompt before it leaves the page and the attachment before the site sees it — included in every paid plan — enterprise, starter, standard, pro — at no extra price and with no seat count; it uses the plan's characters like any other caller. See the add-on.

inside your perimeter

Running it on your own servers

From the Pro plan the whole gateway can run in your own infrastructure, set up with you on request. Hosted by us, it runs in the EU with EU and EEA sub-processors only, and stores nothing from request content.

honest limits

What it does not do, said before you find out

  • The name model matters for names in prose. The examples and the measured counts on this page are the rule layer. A name in running text that no rule recognises is the name model's job; it runs in production, and its own figures are not part of these counts.
  • Diagnoses in running text stay readable unless you choose otherwise. With disease and medicine names switched on, a word is masked in every sense it has — the list cannot tell a stroke from a stroke of luck.
  • A year on its own stays readable. Dates tied to the patient are masked by the preset; a bare year in a history is left on purpose.
  • Scans are only as good as the reading. A value the OCR reads exactly is masked; a value read with damage — a digit lost, two letters swapped — may no longer match any rule and can go out in clear. It happens on low-resolution scans and phone photographs, so scan at a good resolution.
  • A surname after a courtesy title can get a token of its own. It is masked, but today a later mention written with a title — Herr, Mr — may not share the full name's token, so the model can read two people where the letter means one.
  • The coverage table is a statement about the labels we measured. A form label we did not list may not be recognised; tell us yours and it is measured before it is promised.

Keep the clinical content. Keep the patient out.

A pilot on your own documents, or running it inside your perimeter: office@obvelo.com