DIDAS

GovTech Hackathon · roadmap step 1 · 2026

Immunisation records as verifiable credentials

This project demonstrates an immunisation record carried as verifiable credentials on the swiyu Trust Infrastructure. A vaccinator holding the vaccinator role in this project's policy configuration issues one administered dose to the patient's wallet, as a credential signed by that vaccinator. When a travel clinic later requests vaccination evidence, the presentation request selects four of the eighteen claims the credential type defines, and the remaining claims are not included in the presentation. The clinic evaluates the issuer signature, the credential status and the holder binding. Whether the patient is clinically protected is a separate inference, drawn by the clinician from the disclosed doses. The code runs against the swiyu Sandbox and Swiss Profiles 1.0.

4 / 18claims included in the presentation when a travel clinic requests vaccination evidence
4credential types issued, each generating its own metadata, schema and wallet rendering
11documented flows with governance and standardisation constraints
0clinical repositories operated by this project; it depends on the Confederation's registries for identifier, status and trust information

Terms

Terms used on this page

The words below have a narrow technical meaning in this field. This page uses them in that meaning throughout. Each term links to its entry in the DIDAS Glossary, which defines the same words for the whole Swiss ecosystem and carries them in German, French and Italian.

TermMeaning here
CredentialA set of claims about a subject, signed by the organisation that issued it and stored in the patient's wallet. One administered dose is issued as one credential.
ClaimA single data item inside a credential, such as the date of a dose or the disease it targets. The immunization credential type defines eighteen.
WalletThe application that stores issued credentials under its own storage and lifecycle model, and that releases selected claims in response to a presentation request. The patient operates it.
IssuerThe organisation that signs a credential and transfers it to the wallet. Here that is a practice, a pharmacy, an insurer or the Confederation.
VerifierThe organisation that sends a presentation request and evaluates the response. Here that is a travel clinic, a practice reception, a pharmacy or a survey.
Selective disclosureA property of the credential format: the issuer commits to each claim separately, and the holder can open some of those commitments and leave the others closed. Claims not selected by the presentation request and not released by the wallet are not included in the presentation response.
Status listA published list with one entry per credential. Each credential carries the index of its own entry, and a verifier fetches the list and reads that entry to obtain the status the issuer has published. The status-list representation contains no clinical payload and no patient attributes.

Background

An architectural consideration

meineimpfungen.ch held the national electronic vaccination record until its closure in 2021, after which the records it held were no longer accessible to the people they described.

The episode illustrates the availability and continuity risks associated with relying on a single service for access to longitudinal health information. This showcase explores a different distribution model rather than a judgement on that platform.

The exchange model demonstrated here does not require a central repository holding the clinical payloads exchanged through these credentials. It does depend on the registries of the swiyu Trust Infrastructure, on wallet availability and recovery, and on governance arrangements that do not yet exist for the health domain.

What the model does and does not change

In this showcase each administered dose is issued as its own credential, signed by the vaccinator that administered it, and stored in the patient's wallet. A credential already issued remains usable by its holder if the issuing organisation ceases to operate, subject to the status and revocation mechanisms the profile defines and to the continued availability of the identifier, status and trust infrastructure a verifier reads.

The mechanism

How credentials reach the wallet and how claims are presented

Four organisations issue credentials to the wallet: the Confederation, a health insurer, a practice and a pharmacy. Each issues the credential types its role permits in this project's policy configuration. Claims leave the wallet in response to a specific presentation request from a verifier, after the patient confirms that request in the wallet, one request at a time. Issuer and verifier exchange no clinical payload through a shared store. The component both sides read is the status list published by the Confederation's Base Registry, which carries a status entry per credential and no clinical payload or patient attributes. Both parties also resolve identifiers through the Base Registry and read trust statements from the Trust Registry.

ISSUERS HOLDER VERIFIERS Confederation · BCS Beta-ID, Sandbox stand-in for the e-ID Health insurer Insurance card Practice · vaccinator Immunization, one per dose Lab report · prescription Patient wallet betaid-sdjwt insurance-card:1.0 immunization:1.0 ×3 lab-report:1.0 prescription:1.0 survey-invitation:1.0 single use · specified, not built SD-JWT VC · every claim selectively disclosable Practice reception 13 claims · identity + cover Travel clinic 4 claims · dose evidence Pharmacy 10 claims · to dispense EBPI coverage survey 5 claims · no identifier OpenID4VCI issues issues the single-use invitation OpenID4VP asks for n claims Base Registry · status lists 2 bits per credential. No patient, no medication, no pharmacy. publishes · revokes reads status pharmacy asks the prescriber to revoke. Only the issuer can Green marks the immunization showcase path. Dashed lines are specified and not built: the coverage survey and the invitation it issues.
The status list carries two bits per credential, which is what makes a prescription single-use without any party keeping a record of who was prescribed what. The fourth verifier is the national coverage survey. Its presentation request selects five claims and no person identifier. Today the survey obtains comparable information from a photocopied vaccination record sent by post. It is also the only verifier here that issues: its letter to a sampled household carries a single-use invitation credential, the wallet presents that credential together with the dose claims, and the survey revokes it once the response is accepted. Survey and invitation are drawn dashed because neither is built.

Selective disclosure

What each verifier receives

The immunization credential type defines eighteen claims. This project's policy layer attaches an entitlement to each verifier role, naming the claims a verifier in that role may request. A query naming a claim outside that entitlement is rejected by the policy layer while the query is being built, before any request reaches the wallet.

The point at which that check runs is a design decision. A check applied after the wallet has responded operates on data the verifier already holds, so it constrains what the verifier is permitted to do with the claims rather than which claims it received.

4 / 18 claims disclosed

For comparison, the alternatives in routine use disclose differently: a paper booklet is read as a whole page, and a PDF exported from a portal is transferred as a whole file. Selective disclosure narrows the presentation to the claims the request selects and the wallet releases. It says nothing about correlation across presentations, which depends on the credential identifier, the holder key, the disclosed claim values, the status-list reference, timing and network metadata.

Governance

What happens before a clinical fact is accepted

A presentation raises several distinct questions. The technical profile and the trust infrastructure answer some of them: protocol validity, cryptographic validity, credential and status validity, holder key binding and issuer trust. Three further questions are governance questions and are answered here.

First, whether the issuing party may assert a clinical fact of this kind. A signature that verifies establishes which key signed and, through identifier resolution, which issuer holds that key. It does not establish that the issuer holds the role this project requires for the assertion. Second, whether the requesting party may ask for the claims it is requesting, which is a separate question from whether the request is well formed. Third, whether this particular presentation should be accepted, given its scope and context. Each question is implemented as its own function; the three run in a fixed order, and each records its reasoning whether the outcome is acceptance or refusal.

reviewIssuance()

Who may assert this?

A practice may issue an immunization credential because it holds the vaccinator role in this project's policy configuration. An insurer does not hold that role, so the same request is rejected before it reaches the issuer.

reviewRequest()

Who may ask and for what?

A query naming a claim outside the requesting role's entitlement is rejected while the query is being built. A protected claim such as the AHV number needs an authorisation of its own, in addition to the role entitlement, whichever credential carries it.

reviewPresentation()

Should this be accepted?

The status-list entry first, then the Trust Protocol 2.0 evaluation: the applicable statements about the counterparty are validated and the markers for this interaction are derived from them. An interaction for which the evaluation derives the governed use case marker gucTM without the matching authorisation marker gucaTM is declined under every policy, because swiss-profile-trust:1.0 states that rule at MUST level. A marker is the result of that evaluation rather than something the counterparty holds.

Some of the Swiss Profile's trust rules are stated at SHOULD level and cannot be satisfied in the Sandbox, because the Sandbox makes the official verification of an organisation optional. The Sandbox policy records each such rule as waived. The journal then shows which rule was relaxed and on what grounds. A demonstrator that deletes the rule instead reports the same success and leaves no trace that anything was skipped. On production swiyu the same code runs the strict policy, which requires the markers this one waives. That is one environment variable. It is the smallest of the differences between the two environments: what changes on production swiyu →

The journal records claim names and no claim values, so it evidences which rules were applied to an interaction without becoming a second copy of the patient's data. A test asserts that no AHV number and no vaccine lot number reaches it.

Standards

Composing with the openEHR and HL7 FHIR information models

HL7 FHIR and openEHR address healthcare semantics, information models and clinical data exchange and persistence. Verifiable credentials and the swiyu Trust Infrastructure address authenticity, provenance, controlled presentation and trust relationships. These are different layers and they can be composed. This project reuses the information models and does not itself operate a clinical data repository; that is a property of this demonstrator, not a position on how FHIR or openEHR should be deployed.

Every claim carries the FHIR element path it corresponds to and, where one exists, its openEHR archetype path. When a presentation arrives, the receiving system can rebuild the representation it already understands from the claims the holder released, locally. The mappings below are this project's own and have not been reviewed by the standards bodies concerned.

HL7 FHIR · CH VACD

"resourceType": "Immunization",
"status": "completed",
"vaccineCode": {
  "coding": [{
    "system": "http://snomed.info/sct",
    "code": "871895005" }],
  "text": "dTpa-IPV combination vaccine" },
"occurrenceDateTime": "2026-09-11",
"lotNumber": "S4021-B",
"protocolApplied": [{
  "targetDisease": [ … ],
  "doseNumberPositiveInt": 1,
  "seriesDosesPositiveInt": 3 }]

openEHR · flat composition

immunisation/medication_management/
  medication_item:      "dTpa-IPV combination vaccine"
immunisation/medication_management/
  medication_item/code: "871895005"
immunisation/medication_management/
  time:                 "2026-09-11"
immunisation/medication_management/
  batch_id:             "S4021-B"
immunisation/medication_management/
  route:                "IM"
immunisation/territory|code:    "CH"

Two properties hold for every projection. The code states both wherever it performs one. First, a projection is derived and not authoritative. The signed credential remains the evidence. Second, a projection is legitimately partial. After selective disclosure a FHIR resource may carry findings and no patient name. A receiving system therefore has to treat an absent element as an expected outcome of the disclosure rather than as a data error. Handling those partial resources is the main integration cost of this approach.

Pinned to Swiss Profiles 1.0 as published for the swiyu Sandbox.
ProfileCarries
swiss-profile-anchor:1.0.0DID Core 1.0, did:webvh 1.0
swiss-profile-issuance:1.0.0OpenID4VCI 1.0, OAuth 2.0 DPoP (RFC 9449)
swiss-profile-verification:1.0.0OpenID4VP 1.0 with DCQL, JAR (RFC 9101)
swiss-profile-vc:1.0.0SD-JWT (RFC 9901), SD-JWT VC draft-15, Token Status List draft-20, OCA 1.0
Trust Protocol 2.0Trust markers, trust registry, protected fields

The blueprint

Eleven documented flows

Each of the eleven is a self-contained file holding machine-readable front matter, a diagram, the governance constraints that apply, the standardisation constraints that apply and the questions it leaves open. The file is the specification; every entry below links to it. Each file can be moved into a trust flows repository and sit beside flows from unrelated sectors.

The eleven are not the same kind of object, and the ways they differ are independent of each other. Each file declares four characteristics: whether it is a flow or a transformation, whether messages cross a party boundary (multi-party, local or unresolved), whether it is atomic or composed, and whether it concerns a discrete event or a continuous stream. F-08 is composed and an inter-party exchange; F-10 is continuous, which says nothing about whether it is local or multi-party, so those two fields are unresolved for it.

F-01Becoming an actorDID, trust statement, role grant · Sequence diagramPartial
F-02Issuing an administered doseOne credential per dose, signed by the vaccinator that administered it · Sequence diagramBuilt
F-04Check-in at the practiceTwo issuers, one presentation, a name that must match · Sequence diagramBuilt
F-05Prescription and its redemptionSingle use, without a register recording who was prescribed what · Sequence diagramBuilt
F-06Correction, suspension and revocationWhy business expiry and technical expiry must stay apart · Sequence diagramPartial
F-07Local model projectionProject disclosed credential claims into FHIR or openEHR representations within the verifying system · transformation · localBuilt
F-08Assembling an International Patient SummaryAllergies, problems, medication statements · composed · not yet modelledStep 2
F-09Secondary use under revocable research consentPolicy configuration prevents the research role requesting identifying claims · multi-party · not yet modelledStep 2
F-10Wearables and continuous dataLimits of the authored-event model · continuous · scope unresolvedStep 3
F-11Answering the national coverage surveyFive claims and no person identifier, in place of a photocopied record · Sequence diagramStep 2

Roadmap

Planned work, 2026 to 2028

2026 · prototype

Immunization Showcase

  • FHIR / openEHR interplay
  • End-to-end prototype, runnable offline
  • Blueprint: the eleven flows
  • Governance model that rejects out-of-policy issuance and requests
2027 · specified

International Patient Summary

  • Allergies, problems, medication statements
  • Multi-credential presentation, which the current Swiss Profile Verification does not define (GP-01)
  • Absence semantics: "none known" vs "none held"
  • Interoperation with EPD / EGD infrastructure: issuer, source, verifier and repository roles to be examined
  • Composition with the openEHR / HL7 blueprint
2028 · sketched

Swiss Health App

  • Wearable and continuous data
  • Summary credentials with accountable computation
  • Measurement provenance (GP-05) and standing authorisation (GP-04)
  • User experience optimised

Step 1, item by item

DeliverableStatusWhere
End-to-end prototypeDoneapps/demo
Immunization credential, issuance and verificationDoneF-02, F-03
FHIR / openEHR interplayDoneF-07, projections.ts
BlueprintDoneflows/ · eleven flows
Governance modelDonegovernance.ts
Supporting consultation flowsDoneF-04, F-05
Lifecycle and correctionPartialF-06 · supersession missing
Actor onboardingPartialF-01 · no governance body

The IPS sections step 2 has to cover

Step 1 covers Immunizations. It reaches partway into Medications and Results. The remaining sections are the natural unit of work for 2027. Their LOINC codes are the ones the IPS uses.

SectionLOINCStatus here
Immunizations11369-6Covered. The showcase credential
Medications10160-0Partial. Prescriptions, without medication statements
Results30954-2Partial. Laboratory reports
Allergies48765-2Gap. The 2024 project carried these
Problems11450-4Step 2
Procedures47519-4Step 2
Devices46264-8Step 2

Allergies are the one gap here against the project this work continues: the 2024 wallet carried allergies and the practice asked for them at check-in. Everything else in this table is an extension of what step 1 built.

The other 2026 showcase

openEHR Switzerland brought a second vaccination showcase to the same hackathon: FHIR intake in CH VACD format, persisted as an openEHR composition in a clinical data repository. openEHR Switzerland and HL7 Switzerland have since formed a joint working group to turn it into a reusable implementation blueprint. They raise the substantive objection to the design on this page. A vaccination record has to stay clinically usable for a lifetime. A document exchanged at one moment is a different object from a record maintained over decades.

The 2024 project's own staging is where the two approaches meet. It described three stages: document-oriented "EPD 1.0", structured and server-based "EPD 2.0", structured and wallet-based "EPD 3.0". The openEHR showcase is a working stage 2 and this project is a working stage 3. Composition in both directions is already specified. A repository can issue credentials from the records it holds. A presented credential can project into the ingestion path that blueprint defines. Building that composition is the main item on the 2027 list.

Public health

Vaccination coverage monitoring in Switzerland

Switzerland measures vaccination coverage through the Swiss National Vaccination Coverage Survey, run since 1999 by the Epidemiology, Biostatistics and Prevention Institute (EBPI) at the University of Zurich with the Federal Office of Public Health and all 26 cantons. It samples randomly selected households of 2-, 8- and 16-year-olds on a three-year rolling cycle. It asks the family to post a copy of the child's vaccination record.

The data source is already the record the family holds. Coverage monitoring never depended on a central register. When meineimpfungen.ch closed in 2021 the survey carried on, because it had never read from it.

What the photocopy discloses

Every dose, every date, the vaccinating physician and usually the child's name. Then manual transcription, manual coding and up to three contact attempts by post and telephone.

What a presentation discloses

Five claims: target disease, date, dose number, doses in series, vaccine code. No name, no birth date, no performer, no lot number. Structured, signed, already coded to SNOMED.

Today a family posts a photocopy of the child's vaccination record, which shows every dose, every date, the vaccinating physician and usually the child's name. The presentation modelled here selects five claims and no person identifier, so of the eleven flows it is the one whose disclosure is narrower than the procedure it would replace. The survey response does not require the presentation of an explicit person identifier; the stratum the analysis needs arrives inside the invitation credential. Other disclosed values and protocol metadata may still contribute to correlation, which the section below sets out. The approval step is not new either: households are invited by letter today and may decline today, and the wallet adds a confirmation of the presentation request rather than a new legal consent.

One methodological constraint governs the whole design. The wallet is a response channel and not a sampling frame. A survey that accepted volunteered credentials would measure the population that chose to volunteer, and that selection bias cannot be corrected from inside the sample. EBPI draws the sample from the population register or an equivalent method, and the wallet is used only to return a response to an invitation already issued.

Unlinkability

Unlinkability is used here for two distinct properties. First, that the receiving party cannot associate a response with the household it came from. Second, that it cannot associate two responses with each other. Each depends on a specific correlation surface: the credential identifier, the holder key, the disclosed claim values, the status-list reference, the issuer, timing and network metadata. For a coverage survey the first property is the one that decides the design, because a response that can be associated with a household makes the survey a record of who replied and what they replied.

The design addresses the first half. The invitation posted to the household carries a single-use credential holding the stratum (age band, canton, survey cycle) and no household identifier. The wallet presents it together with the dose claims in one presentation, and the survey revokes it once the response is accepted, using the same two bits on a public status list that make a prescription single-use in F-05. From the response itself the survey learns that a household in a given canton with an 8-year-old reported a given set of doses. No person identifier is disclosed that the survey could use to join that response to its sampling record.

Record nothing that could be recorded

A verifier receives a signed presentation and is technically able to keep all of it. The rule here is that the analysis variables are extracted and everything else is discarded: the transcript, the credentials, the signatures and the request metadata. Metadata here means timing, IP address, user agent and response ordering. In a sample this small each of those is identifying.

Where unlinkability is not yet structural

The survey both issues the invitation and revokes it. A retained mapping from invitation index to posted address, combined with revocation timing, would let the survey associate a response with a household. Separately, the same dose credentials presented in two cycles expose the same credential-level artefacts, so those two responses may be associated with each other. Closing either requires batch issuance or a zero-knowledge presentation, and neither is in place.

Until one of those two mechanisms is implemented, the property rests on the survey operator following the retention rules above rather than on the protocol preventing the correlation, which is the weaker of the two positions. A zero-knowledge presentation would let the wallet demonstrate that it holds an invitation credential whose status entry is still unset, without disclosing which invitation that is. That would remove the correlation available through the invitation index and its revocation timing. The candidate scheme and its fit to this profile are tracked in issue 10, Longfellow ZK.

Open the F-11 diagram →

Scope

What this prototype is and is not

This is a prototype for exploration and discussion. It has not undergone a security review, a data protection impact assessment or operational hardening, and it is not production-ready.

Open questions

What is not solved

No one can grant the roles yet

Nothing here deploys until some body can issue the trust statement that says "this DID is a practice authorised to vaccinate". The Confederation's onboarding establishes which legal entity controls the identifier. It does not state what that entity may do in healthcare, and no health-domain governance body exists to state it.

There is a second half to this, at the protocol layer. swiyu opens governed credential types in stages, by ambition level. AN1 covers the e-ID. AN2 covers other authoritative credentials from federal, cantonal or municipal authorities. AN3 is the open ecosystem where private organisations issue on the same infrastructure. Governed issuance currently reaches AN1 and AN2. A practice, a pharmacy and an insurer are private organisations, so the health showcase sits in AN3. Going to production resolves neither half: what changes on production swiyu →

Series across issuers

Dose 2 is given by a pharmacy that cannot see dose 1. Today the administering party asserts the dose number, so a wallet holding two "dose 1 of 3" credentials is possible. Resolving it needs a presentation at administration time or a shared series identifier.

The double-dispensing window

Between a prescription being presented and being revoked there is a window in which a second pharmacy could accept it. Paper has the same window and closes it physically.

"Protected against X" is an inference

The credential says which diseases a dose targets and when. Whether that amounts to protection depends on the schedule and elapsed time. Who is accountable for that inference is a clinical-safety question for the sector to settle.

Presentations are not unlinkable

Repeated presentations of the same credential may be correlatable where the presentations expose stable credential-level or claim-level information. Two verifiers that exchange presentation data may therefore be able to determine that two presentations relate to the same credential, and so to the same holder. The degree of correlation depends on the credential format, the holder-binding mechanism, the disclosed claims and the presentation protocol. Batch issuance reduces the credential-level surface and is not used here, because across a dose series the disclosed claim values are themselves close to identifying. A zero-knowledge presentation would address the credential-level surface directly; the candidate is tracked in issue 10.

The susceptible cannot be enumerated

Coverage measurement survives, because Switzerland has never measured it from a register, as the section above sets out. What a decentralised record removes is the ability to act on named individuals. Outbreak response, recall and catch-up campaigns all require knowing who is behind on a series. A sample yields a rate. A register would yield a list. A wallet yields neither. This follows from the design. It is a policy question rather than an engineering one.

Next step

Discuss, test and learn

The open questions above are not resolved by architecture alone. Further dialogue among healthcare actors, regulators, patient representatives, insurers and implementers is needed to decide which use cases are worth pursuing, which concerns matter in their specific context and which technical or governance choices are proportionate.

Bounded experiments can turn those discussions into evidence. A pilot can test an actual workflow, observe user and operational effects, surface unintended consequences and feed the results into the next design cycle. The objective is iterative learning rather than confirming a preselected solution: define a use case, test a limited model, evaluate the outcomes and concerns, and refine or discard the approach.

As an official swiyu Orchestrator, DIDAS can help convene the multi-stakeholder dialogue and support regulatory sandboxing or other controlled experimentation where the use case calls for it.

Where an experiment requires a temporary deviation from rules under the Federal Health Insurance Act, Article 59b KVG (the Experimentierartikel) provides a basis for EDI-approved pilot projects in specified areas, including strengthening quality and promoting digitalisation. Its applicability has to be assessed for the concrete use case; it is not a general sandbox for health regulation.

Origins

Where this work comes from

This showcase was prompted by two GovTech Hackathons. Both supplied part of the basis it builds on.

Use caseWhat it contributed
GovTech Hackathon 2024, project 1103
"Digital Health mit der neuen E-ID Trust-Infrastruktur"
Led by DIDAS, with Peter Janes as project lead. It established the use case, the stakeholder model and the staged EPD 1.0 / 2.0 / 3.0 framing that this repository continues. It won the future-oriented category that year.
GovTech Hackathon 2026, project 28
"Showcase Impf-Modul"
Brought by openEHR Switzerland with a DIDAS contribution. It supplied the clinical model side: CH VACD profiling, terminology binding and openEHR persistence. This project reuses the information models; it does not itself operate a clinical data repository. The two address different layers and can be composed.

The code in this repository and the runnable application it builds were originally developed and contributed by Accelerate GmbH.