Thoryn

Wallet profiles · Wallet profiles

Government permit application — PID

Wallet profile for a municipal permit application. Requests PID with the four claims a clerk needs to pre-fill the form.

Tested against:broker: 1.0.0arf: 1.4

wallet-profiles recipe — shared category architecture: how this pattern composes with Hub, Broker, and the rest of the catalog

Use case

A Dutch municipality replaces a paper-based permit application with an EUDIW flow. The citizen presents their PID once at the start; the portal pre-fills the application form with verified data; the citizen reviews, adds permit-specific details, submits.

Wallet profile (YAML)

id: government-permit
name: "Permit application — PID pre-fill"
accepted_formats:
  - vc+sd-jwt
  - mso_mdoc
trust_registry_url: https://trust.thoryn.org
allowed_issuers:
  - "did:eidas:nl"
session_ttl_seconds: 1800
require_holder_binding: true
nonce_required: true

Presentation definition

{
  "id": "government-permit-pd",
  "input_descriptors": [
    {
      "id": "pid",
      "constraints": {
        "fields": [
          { "path": ["$.vct"], "filter": { "const": "PIDCredential" } },
          { "path": ["$.given_name"] },
          { "path": ["$.family_name"] },
          { "path": ["$.bsn"] },
          { "path": ["$.date_of_birth"] }
        ]
      }
    }
  ]
}

The bsn (Dutch citizen service number) is the join key that links the application to the citizen's records inside the municipality.

Sample webhook payload

{
  "session_id": "...",
  "vct": "PIDCredential",
  "claims": {
    "given_name": "Jan",
    "family_name": "Jansen",
    "bsn": "123456789",
    "date_of_birth": "1985-03-12"
  },
  "verified_at": "2026-04-25T..."
}

The municipality's portal can pre-fill the application form. The clerk never handles the personal data — the verifier did.

Why a long session_ttl

Permit applications take time to fill out. 30 minutes (1800 s) lets the citizen complete the form without re-presenting the credential.

When to use

  • Municipal services replacing paper-passport workflows
  • Member-state services accepting EUDIW PID

When not to use

  • Quick clicks (age-gate) — over-collection
  • Cross-border services — restrict allowed_issuers per jurisdiction

See also