Physical data model for death notification events
Context
The purpose of this RFC is to agree upon the physical data model required to integrate Life Events from the General Register Office (GRO) to GOV.UK One Login. In scope required for MVP is a death notification event which originates from GRO’s Registration Online (RON) system.
Decisions about encryption and signing of these event payloads are out of scope.
Change log
2023-08
First draft to share internally and with the Department for Work and Pensions (DWP).
2023-09
Changes for consistency and future-proofing:
- follow standard event naming conventions by updating event names/URIs to match ‘registered’ and ‘registration updated’
- change
deathRegistrationID
todeathRegistration
- modify that identifier to be a Uniform Resource Name (URN) based on the original ID
- no longer wrap
recordUpdateTime
anddeathRegistrationTime
in an object with avalue
property - include
freeFormatBirthDate
property
Death event structure
A death notification event is represented using a JSON object that conforms to the payload required of a Security Event Token (SET, see IETF RFC 8417).
We refer to this as the ‘event payload’.
The iss
(issuer), iat
(issued at) and jti
(JWT identifier) claims as defined by IETF JSON Web Token (JWT) are required.
Other JWT claims such as txn
may be present in the payload and should follow the requirements of this specification or the SET profile.
Two types of event are defined in this specification - a ‘death registered’ event and a ‘death registration updated’ event. The data model is broadly the same but the significance of certain properties depends on the type of event.
In both cases, the value of the events
claim is a JSON object with a single member, where the name indicates the type of the event, and the value is an ‘event object’ as described in the rest of this document.
ⓘ Note
We intentionally define ‘event object’ as distinct from ‘event payload’ so that it’s easy to be precise when talking about the different levels of the JSON structure.
Classes and types
The specific classes and types described here will be found in future within the GOV.UK One Login vocabulary, and the relevant source is available on GitHub.
For now, JSON Schema files can be found at:
We mention JSON types such as arrays, strings and objects, but also more specific types which imply some particular validation.
We refer to a ‘list’ type where we mean a JSON array in which the order may be significant.
The ‘DateTime’ type refers to a complete ISO date and time as described by Schema.org. All such properties must include a time zone specifier and the time zone should be UTC (even when daylight savings time applies).
The ‘ISODate’ type contains a complete or partial ISO date, without a ‘time’ part and in which the ‘day’ and ‘month’ parts are optional.
Death registered event
The toe
(time of event) claim must correspond to the deathRegistrationTime
property.
The event object will have the name
https://vocab.account.gov.uk/v1/deathRegistered
⚠ Important
We may change the name of these event objects in future, for example we may decide to include a version number. For example,
https://vocab.account.gov.uk/v1/deathRegistered/v3
could indicate ‘the third version of the death registered event in the first version of the event vocabulary’. If we decide to do this, the consequences will be discussed in a separate ADR.
The event object schema is described below in common event object properties.
Death registration updated event
The toe
(time of event) claim must correspond to the recordUpdateTime
property.
The event object will have the name
https://vocab.account.gov.uk/v1/deathRegistrationUpdated
The event object schema is described below in common event object properties. The following properties are also defined:
Property | Required | Description |
---|---|---|
recordUpdateTime |
Required | A DateTime representing the date/time the record was amended. |
deathRegistrationUpdateReason |
Required | An identifier indicating the reason for the update. |
Record update time
The recordUpdateTime
property is a DateTime and should specify the timezone as UTC, which we expect to be represented via a Z
suffix.
The string is therefore expected to be in a yyyy-MM-ddThh:mm:ssZ
format.
Record update reason
The value for the deathRegistrationUpdateReason
property must be one of the following identifiers:
formal_correction
quality_assurance
typographical
cancelled
cancellation_removed
Common event object properties
The following properties are common to both types of event. Some properties are marked as ‘expected’ which means we expect to see them in our initial implementation which uses the RON. However, data from other sources may vary.
Property | Required | Description |
---|---|---|
subject |
Required | An object containing details of a person that has died for matching against existing records. |
deathRegistration |
Expected | A URI representing the entry in the register. |
deathDate |
An object containing details of a person’s death date. | |
freeFormatDeathDate |
A string containing free format death date information, used where the death date could not be expressed as a partial or complete ISO date. This property is expected to be present if deathDate is not present, but could be used alongside deathDate in some cases. |
|
deathRegistrationTime |
A DateTime representing the moment when a person’s death was registered. |
Subject properties
The value for subject
is an object with the following properties:
Property | Required | Description |
---|---|---|
name |
Required | A list of names. |
sex |
Expected | A list with a single value representing the person’s legal sex. |
birthDate |
A list representing facts about the person’s date of birth. | |
freeFormatBirthDate |
A string containing free format birth date information, used where the birth date could not be expressed as a partial or complete ISO date. This property is expected to be present if birthDate is not present, but could be used alongside birthDate in some cases. |
|
address |
Expected | A list representing postal addresses at which the user resided. |
Name list
The value for name
is a list of name objects with the following properties:
Property | Required | Description |
---|---|---|
nameParts |
Required | A list of name parts as described by the core identity atttributes section. |
description |
A human-readable description that may help with manual matching in cases where multiple name objects are in the list. |
There must be at least one entry in the list of name objects. Where a person currently has (or has previously had) more than one name, there will be more than one entry in the list.
The first entry in the list must reflect the person’s full name when they died, as held on the official register.
Where a record shows that the person changed their name as a result of marriage or civil partnership, their given names must be duplicated, together with their family name at birth (often described as a ‘maiden name’), into another entry in the list.
Where a record shows that the person went by one or more other aliases, each alias (as a complete set of name parts, usually multiple given names and a family name) is a separate entry in the list. Each of these objects must include duplicates of any given names or family names that are common with other entries in the list so that it represents a full name.
Person sex (list)
The sex
property captures a person’s legal sex.
A list of objects is used for consistency with other personal attributes that can change over time. Exactly one entry is allowed in a list for a life event originating from an official register.
ⓘ Note
Some sources in the UK use the term ‘gender’ to refer to ‘legal sex’.
The properties allowed in each object are as follows:
Property | Type | Required | Allowed values |
---|---|---|---|
value |
string | Required |
Male , Female , Indeterminate
|
Birth date (list)
The birthDate
property is a list of objects because in some cases there may be a historical record of incorrect birth dates, that were previously considered to be correct.
The value from the register (believed by the authoritative source to be correct) must appear first in the list and is expected to be the only entry.
The properties allowed in each object are as follows:
Property | Type | Required | Description | Allowed values |
---|---|---|---|---|
value |
ISODate | Required | A possibly-partial ISO date. |
yyyy-MM-dd , yyyy-MM , yyyy
|
validFrom |
DateTime | Not expected. | The earliest point in time that the historical record considered the incorrect birthDate value to be correct. | |
validUntil |
DateTime | Not expected. | The latest point in time that the historical record considered the incorrect birthDate value to be correct. | |
description |
string | Not expected. |
Address (list)
The address
property captures any postal addresses associated with a person in the register.
The most recent known address per the register must be first in the list.
The address structure section describes the objects appearing in the list.
Death date properties
The value for deathDate
is an object with the following properties:
Property | Type | Required | Description | Allowed values |
---|---|---|---|---|
value |
ISODate | Required | A possibly-partial ISO date. |
yyyy-MM-dd , yyyy-MM , yyyy
|
description |
string | A qualifier relating to the date, used when a partial date is provided. For example, ‘On or about’, ‘Deceased found on’, ‘Dead body found on’. |
If a date of death is not known or cannot be represented as a complete or partial ISO date, freeFormatDeathDate
may be used instead.
Death registration URI
deathRegistration
must contain a URI for the relevant entry in the register of deaths, and is expected to be a
federated content URN
based on an originator’s identifier.
Death registration time
The deathRegistrationTime
property is a DateTime and is expected for registration events but not for update events.
It should specify the timezone as UTC, which we expect to be represented via a Z
suffix.
The string is therefore expected to be in a yyyy-MM-ddThh:mm:ssZ
format.
Examples of output from the Life Events Platform
Examples of output from the Life Events Platform are currently available in GitHub.
Future work
In future we may capture a level of trust as defined by the UK Trust Framework.
This could apply to the entire event, but might be overridden for specific attributes.
Change control
Adding a property to an object should not be considered as a breaking change to the schema.
ⓘ Note
We’ll add further notes about how this specification may change over time in a future update.
Address Structure
Date: 2023-02-07 Version: 1.0.3
The definition of the Address schema for data for Identity Proofing and Verification (IPV).
1. Background
Data design consistent with widely acceptable practices leading to interoperability and adoption across government. The intention is to define the shape and interpretation of the Canonical Address Model.
The aim is to model the Address Structure to that of the Address collector on to the Credential Issuer through to the Relying Party.
Standards referenced:
2. Attributes/Fields Included
Canonical Address Field | type | maxlength | Mandatory | Definition |
---|---|---|---|---|
validFrom | Date | N | See metadata | |
validUntil | Date | N | See metadata | |
uprn | integer | 12 | N | Unique Property Reference Number (UK addresses only) |
organisationName | string | 60 | N | |
departmentName | string | 60 | N | |
subBuildingName | string | 30 | N | |
buildingNumber | string | 30 | N | |
buildingName | string | 60 | N | |
dependentStreetName | string | 60 | N | |
streetName | string | 60 | N | |
doubleDependentAddressLocality | string | 60 | N | |
dependentAddressLocality | string | 60 | N | |
addressLocality | string | 30 | N | |
postalCode | string | 9 | N | |
addressCountry | string | 2 | N | Two-letter ISO 3166-1 alpha-2 country code |
All fields, unless defined in the table above, have a definition given by the OS Places API, per the mapping below.
Addresses are UK (ISO 3166-1 code GB
) addresses by default, unless specified in the addressCountry
field.
Metadata
validFrom
and validUntil
are ISO 8601 strings representing the date that the user moved into, and away from, a particular address, if known.
If a user tells us that an address is their current address, then validUntil
must be omitted.
If the month is unknown, then we will represent that as 01
; similarly an unknown day-of-month will be represented as 01
.
- Ommitting year or month is permitted under ISO 8601 but we limit ourselves to complete dates as required by RFC 3339 because this is easily validated using JSON Schema and maximally interoperable.
3. JSON Schema
Will link to JSON Schema when available
4. Examples of JSON
Building name and UPRN
{
"uprn": 10002345923,
"buildingName": "SAWLEY MARINA",
"streetName": "INGWORTH ROAD",
"dependentAddressLocality": "LONG EATON",
"addressLocality": "NOTTINGHAM",
"postalCode": "BH12 1JY",
"addressCountry": "GB"
}
Building number and name
{
"uprn": 10022812929,
"organisationName": "FINCH GROUP",
"subBuildingName": "UNIT 2B",
"buildingNumber": "16",
"buildingName": "COY POND BUSINESS PARK",
"dependentStreetName": "KINGS PARK",
"streetName": "BIG STREET",
"doubleDependentAddressLocality": "SOME DISTRICT",
"dependentAddressLocality": "LONG EATON",
"addressLocality": "GREAT MISSENDEN",
"postalCode": "HP16 0AL",
"addressCountry": "GB"
}
Building name without UPRN
{
"buildingName": "R103",
"dependentStreetName": "KINGS PARK",
"streetName": "CREEK ROAD",
"doubleDependentAddressLocality": "",
"addressLocality": "CANVEY ISLAND",
"postalCode": "SS8 8QA",
"addressCountry": "GB"
}
Sub building name with building name
{
"subBuildingName": "FLAT 11",
"buildingName": "BLASHFORD",
"streetName": "ADELAIDE ROAD",
"addressLocality": "LONDON",
"postalCode": "NW3 3RX",
"addressCountry": "GB"
}
Sub building name with building number
{
"subBuildingName": "FLAT 6",
"buildingNumber": "45",
"streetName": "NAVARINO ROAD",
"addressLocality": "LONDON",
"postalCode": "E8 1AG",
"addressCountry": "GB"
}
Building number with dependent address locality
{
"uprn": 151001847,
"buildingNumber": "13",
"streetName": "CHURCH CRESCENT",
"dependentAddressLocality": "NEW PITSLIGO",
"addressLocality": "FRASERBURGH",
"postalCode": "AB43 6LP",
"addressCountry": "GB"
}
Building number
{
"uprn": 100110116546,
"buildingNumber": "3",
"streetName": "HILLEL WALK",
"addressLocality": "MIDDLESBROUGH",
"postalCode": "TS5 8DG",
"addressCountry": "GB"
}
5. Mapping of fields to data sources and reference standards
Canonical | Experian CrossCore | Schema.Org | OS Places / AddressBase | Comment |
---|---|---|---|---|
uprn | addressIdentifier | UPRN | Unique Property Reference Number | |
organisationName | subBuilding | ORGANISATION_NAME | ||
departmentName | subBuilding | DEPARTMENT_NAME | ||
subBuildingName | subBuilding | SUB_BUILDING_NAME | May be used in combination with buildingName or buildingNumber | |
buildingNumber | buildingNumber | BUILDING_NUMBER | ||
buildingName | buildingName | BUILDING_NAME | ||
dependentStreetName | street | DEPENDENT_THOROUGHFARE_NAME | ||
streetName | street | THOROUGHFARE_NAME | ||
doubleDependentAddressLocality | DOUBLE_DEPENDENT_LOCALITY | |||
dependentAddressLocality | locality | DEPENDENT_LOCALITY | ||
addressLocality | postTown | addressLocality | POST_TOWN | Naming convention from schema.org |
postalCode | postal | postalCode | POST_CODE | Naming convention from schema.org |
addressCountry | countryCode | addressCountry | 2-letter ISO code per schema.org, not a COUNTRY_CODE per AddressBase which are single-character codes refering to constituent countries of the UK, and not a 3-letter ISO code as used by Experian. |
Care must be taken when mapping to or from address formats that are line-based (ie “address 1”, “address 2”, etc).
A field such as addressLocality
maps to a different line of the address, depending on the presence of other fields (in this case dependentAddressLocality
and doubleDependentAddressLocality
).
Core identity attributes
History
March 2022 - approved for implementation January 2023 - mappings from other formats clarified
1. Background
We have decided to return verified identity data to relying parties (RPs) using a JWT-encoded Verifiable Credential (VC), signed by the single point of trust.
The Verifiable Credential will contain only data that has been proven to the GPG 45 level of confidence indicated. Other attributes (those which we can’t prove are part of the user’s verified identity) will be returned separately.
2. Attributes included
This RFC describes how the core identity attributes (name and date of birth) will be represented as they are provided by the Single Point of Trust.
We also need to be able to represent the level of confidence achieved.
Our identity assurance process may also give us confidence in non-core attributes such as address and passport number.
These may be returned separately to the RP, in which case they will need to be scored according to whether we were able to link them to the proven core identity attributes. This is out of scope for this RFC.
The Single Point of Trust needs to be told which attributes are to be included in the Verifiable Credential: this is out of scope for this RFC.
3. General requirements
Desirable properties of our representation of identities to relying parties are:
- consistency with the way we represent identity data internally (eg between credential issuers);
- the ability to represent a complete view of the user’s identity attributes, including relevant metadata; and
- allowing future change in predictable and backward-compatible ways;
- to support matching of data we collect (and prove) against government systems that may contain inconsistent data.
Only verified attributes (claims) may appear in the Core Identity verifiable credential; unverified claims must not be present.
Most claims appear as properties of credentialSubject
(which is an object within the vc
JWT claim defined by the VC JWT encoding).
There are some exceptions where JWT claims are used.
All claims within credentialSubject
will be provided as arrays, to support future use cases where multiple identity attributes have been linked to a single identity.
Each attribute is contained within a JSON object: we use the validFrom
and validUntil
properties as metadata, add other metadata properties as required, and represent the attribute itself using the value
property.
All identifiers (such as the subject identifier sub
) must be a URI.
4. Names
We want:
- to be able to represent multiple distinct names, if that’s the most convenient way for a user (or a credential issuer) to represent a change of name;
- for each name to be able to have metadata attached to it (for example, perhaps in future, a language code);
- for each name to be composed of multiple parts, each one either being a given name or a family name;
- for each part to be able to have separate metadata (for example, validity periods, so that we can conveniently represent the situation where just one part of a user’s name changes);
- to be able to attach metadata to either the entire name (i.e. all of the parts) as well as to individual parts.
The credentialSubject
will have a name
property.
Each name
contains an array of objects.
The array is ordered: a current name (one with no validUntil
property) must be first.
Each object represents a name that the user is, or has been, known by. It has the following properties:
validFrom
- a schema.orgDate
orDateTime
validUntil
- a schema.orgDate
orDateTime
nameParts
- an array of objects as described below
The nameParts
array is ordered, reflecting the either the user’s preferred order, or the order of names on a particular identity document.
ⓘ Note
The order of name parts may be ignored when comparing names, for example in a matching process. Comparison and matching rules are outside the scope of this specification.
Each object in nameParts
represents a part of a name, and describes how an individual uses (or acquired) that part of their name.
It has the following properties:
value
- a String (schema.org Text) containing some smallest unit of a user’s namevalidFrom
- a schema.orgDate
orDateTime
validUntil
- a schema.orgDate
orDateTime
type
- eitherGivenName
orFamilyName
ⓘ Note
It’s possible to capture a change of name either using multiple
name
objects (with varying validity periods), or with a single nameobject
that containsnameParts
of varying validity periods. Some representations will be therefore be equivalent to each other: we anticipate that in some cases this is obvious, but no definition of name equivalence is given by this specification. No parts of the system support anything other than a “current name”, at the time of writing.
Mapping to OpenID Connect
OpenID Connect provides various name-related claims, and the following mapping is suggested to help consumers understand the format this specification proposes.
All OpenID Connect fields map only to the user’s current name (the first entry in the name
array); name parts are split or joined using a space character.
name
: derived by joining all of the name parts, in order (we have not yet defined a representation for titles and suffixes)given_name
: derived by joining all of the name parts of typeGivenName
, in orderfamily_name
: derived by joining all of the name parts of typeFamilyName
, in ordermiddle_name
: no mapping from this specification’s format (to avoid unwanted duplication)
To go from the OpenID Connect claims to this specification’s format, a single name
object could be constructed as follows:
nameParts
starts as an empty arraygiven_name
is split, and each part is assigned typeGivenName
, and appended to the arraymiddle_name
is split, and each part is assigned typeGivenName
, and appended to the arrayfamily_name
is copied as-is to a singleFamilyName
name part (regardless of any spaces present) and appended to the array
ⓘ Note
family_name
is transposed to a single name part. This is based on the UK-centric assumption that most end users for One Login have a single family name, which may contain a space (e.g. “Duncan Smith”). Considering names in a global context across multiple cultures, this expectation does not hold. Consumers of this format should understand that multipleFamilyName
parts may be used by One Login in future.
Mapping from other formats
Some name representations don’t have a single obvious mapping, either to this specification’s format, or to OpenID Connect.
In these circumstances, a transformation must be chosen that is correct for as many users as possible, and it is reasonable to make improvements to that transformation as user needs are better understood, and as the capabilities of attribute providers (credential issuers) increase.
ⓘ Note
For example, a UK passport machine readable zone (MRZ) cannot distinguish between
- a hyphenated surname (eg “Brown-green”)
- a compound surname without a hyphen (eg “Duncan Smith”), and
- two family names as found in Portuguese culture (eg “Sousa Carvalho”).
All these cases appear as a single string with the parts of the name separated by a space character.
We have to choose between representing these as a single
FamilyName
part (containing spaces), or multipleFamilyName
parts. Unless we can confirm a preference from the user, we may choose to use a single name part as we are likely to have more users with hyphenated or compound surnames in comparison to Portuguese users whose names should be kept separate.
5. Date of birth
We want:
- to allow multiple values for dates of birth to be recorded;
- to be able to include metadata in future if necessary.
We always expect to include year, month and day whenever a date of birth is supplied.
The credentialSubject
will have a birthDate
property.
Each birthDate
contains an array of objects.
ⓘ Note
While users only have one date of birth, previously-believed values may still be helpful for matching, so representation of multiple dates of birth is rare but could one day be required. At MVP, the Single Point of Trust will only output a single date of birth, but this representation might be useful in future.
The array is ordered: the date of birth that the issuer believes to be correct (the one with no validUntil
property) must be first.
ⓘ Note
This ensures compatibility with existing implementations should we ever capture multiple dates of birth.
Each object represents a date of birth that some system believed was true for the user. It has the following properties:
value
- a schema.orgDate
that is the user’s date of birthvalidFrom
- a schema.orgDate
orDateTime
`validUntil
- a schema.orgDate
orDateTime
`
6. Level of confidence
The level of confidence achieved is strictly speaking neither a property of the credential subject (the user), nor of the account - it is a property of the credential itself and good for only as long as the VC we are issuing is valid.
For greater consistency with Vectors of Trust, we represent this in the JWT directly (see ADR 12).
This is also consistent with the approach taken in the Verifiable Credentials Data Model which says that if in the JWT “specific claim names and header parameters are present, their respective counterpart in the standard verifiable credential and verifiable presentation MAY be omitted to avoid duplication”.
The JWT claims are as follows:
vot
-P1
for low confidence,P2
for medium confidence, etc.vtm
-https://oidc.account.gov.uk/trustmark
or some variation of that, depending on the environment
7. Other JWT claims
We also require the Core Identity JWT to include the following other JWT claims defined by RFC 7519:
sub
(must be a URI)nbf
exp
iat
iss
(must be a URI)
ⓘ Note
A
jti
claim (or corresponding VCid
property) is not included, because we do not want to create identifiers that could be correlated. If we do need credential identifiers, a new one would be generated each time the user presents their identity to a relying party.
8. Other JSON objects / properties
The vc
object may have an @context
property (to support future processing as JSON-LD) and this should be ignored by verifiers (see schemas, below).
The vc
object must have a type
property, which is an array containing the following strings: "VerifiableCredential"
, "VerifiableIdentityCredential"
.
9. Example JWT
In this example, JWT headers are not shown, but alg
must be set per
JWS.
Other headers (for example typ
) should, if present, be constrained according to the
Verifiable Credential data model.
{
"sub": "urn:fdc:gov.uk:2022:JG0RJI1pYbnanbvPs-j4j5-a-PFcmhry9Qu9NCEp5d4",
"nbf": 1670336441,
"iss": "https://identity.account.gov.uk/",
"vot": "P2",
"exp": 1670338241,
"iat": 1670336441,
"vtm": "https://oidc.account.gov.uk/trustmark",
"vc": {
"type": [
"VerifiableCredential",
"VerifiableIdentityCredential"
],
"credentialSubject": {
"name": [
{
"nameParts": [
{
"value": "Jane",
"type": "GivenName"
},
{
"value": "Wright",
"type": "FamilyName"
}
],
"validFrom": "2019-04-01"
},
{
"nameParts": [
{
"value": "Jane",
"type": "GivenName"
},
{
"value": "Wright",
"type": "FamilyName"
}
],
"validUntil": "2019-04-01"
}
],
"birthDate": [
{
"value": "1989-07-06"
}
]
}
}
}
10. Schemas
Relying parties should be able to process the data we generate using either JSON-LD-aware tooling, or using standard JSON tools and libraries. Therefore, we will be conservative in the JSON that we generate, and we’ll publish and iterate a JSON Schema that constrains the JSON documents that the system can produce.
A draft JSON-Schema is under development.
Relying parties that do not use JSON-LD-aware tooling should be aware of the following requirement in the Verifiable Credentials Data Model:
All libraries or processors MUST ensure that the order of the values in the @context property is what is expected for the specific application.
However, as the context URI for our schema has not yet been settled, this requirement SHOULD in practice be ommitted for now as an intentional (but temporary) violation.
Relying parties MUST NOT dynamically load any JSON-LD context across the public Internet. RPs that decide to use JSON-LD-aware tooling MUST cache static copies of the applicable contexts, and have a process in place for updating them securely.