Skip to main content

Reference data reference

A lookup type and its values.

Lookup type

FieldAcceptsDefaultChangeableWhat it does
name1–255 charsNoIdentifies the list wherever configuration refers to it.
displayName1–255 charsYesWhat people read in the console.
descriptionUp to 2,000 charsYesFree text.
isHierarchicaltrue or falsefalseYesWhether values may reference a parent value, forming a tree.
lifecycleStatedraft, active, retiredactiveYesWhere the list is in its life. A draft list can be built up before anything binds to it; a retired one stops being offered.
versionLabel1–32 charsv1NoWhich published version of the list this is.
metadataAn object{}YesYour own annotations, stored and returned uninterpreted.

A new list is active unless you say otherwise. If you are assembling a vocabulary and do not want it bound to attributes mid-build, create it as draft and promote it when the values are in place.

Lookup value

FieldAcceptsDefaultChangeableWhat it does
lookupTypeIdA lookup typeNoWhich list the value belongs to. A value cannot move between lists.
code1–100 charsNoWhat is stored on records. See the warning below.
label1–500 charsYesDisplay text. Freely changeable — the code is what records hold, so renaming a label rewrites nothing.
parentValueIdAnother value, or emptyYesThe parent in a hierarchical list. Empty means a root, and clearing it moves the value back to the root.
sortOrderInteger, 0 or greater0YesPresentation order within its level.
isActivetrue or falsetrueYesWhether the value is offered for new data. Retired values keep resolving on existing records.
effectiveFromA timestampYesWhen the value becomes valid.
effectiveToA timestampYesWhen it stops being valid.
metadataAn object{}YesYour own annotations, stored and returned uninterpreted.

Labels in other languages are not a field on the value — they are a separate child resource, so one value carries one label per language without the value itself changing.

The code is permanent

code is what every record stores. It cannot be edited, and the restriction is load-bearing rather than cautious: labels are resolved by looking up the stored code in its list, so a changed code would leave every existing record pointing at a value that no longer exists — rendering a bare code where a name should be, on data that was correct when it was written.

If a code is genuinely wrong, add the correct value and migrate the records onto it. Get codes right at the start; treat them as permanent from the moment the first record uses one.

A retired code still renders

Label resolution deliberately ignores the active flag and the effective window. A retired code on a historical record must still display its label — the alternative is a record that silently loses meaning because a vocabulary moved on.

Transcoding

SettingNotes
Lookup typeWhich list the mapping targets
Source systemWhose codes are being mapped
Source valueThe incoming code
Canonical valueThe value it becomes

Mappings are per source system, so two systems can map different codes onto the same canonical value without ambiguity.

A mapping as the shipped banking pack authors it:

{ "lookupType": "account_types",
"sourceSystem": "core_banking",
"sourceValue": "CHK",
"canonicalCode": "checking" }

The core banking system calls it CHK. The canonical list calls it checking. Neither system has to change, and nothing downstream — matching, search, reporting — ever sees CHK.

The per-source-system scoping is what makes that safe. CHK from core banking and CHECKING from a card processor both resolve to checking, while the same literal string arriving from two systems can legitimately mean two different things and still be mapped correctly.

Transcoding runs on single-record writes, not bulk

The mapping is consulted when a record is created or patched individually and the caller identified its source system. A bulk load resolves codes strictly and directly, so translate values before submitting them at volume — an unmapped code there fails the load rather than being silently converted.

Hierarchies

ConceptNotes
HierarchyA named levelled structure
LevelAn ordered tier within it
NodeA position, referencing a lookup value
RollupAggregation from a level upward

Two distinct concepts share the word "hierarchy" and are worth keeping apart:

What it isUsed for
Value treeA lookup value referencing a parent valueConstraining permitted values
Levelled hierarchyA named structure with ordered levelsClassification and rollup

Deletion guard

A lookup value in use cannot be deleted. The platform reports which records reference it rather than cascading, because cascading here would silently rewrite governed data.

Next


Last verified against commit a0765982 (2026-08-03)