
FHIR terminology services expose a specific set of operations via the terminology module. Six operations cover essentially all production use cases.
1. $expand — Expand a ValueSet into its constituent codes. Use for populating choice lists at form load time.
2. $validate-code — Verify a code is valid in a ValueSet. Use at write time to reject invalid codes.
3. $translate — Translate a code from one system to another via ConceptMap. Use for ICD-10 to SNOMED, RxNorm to NDC.
4. $lookup — Fetch metadata about a code (display, definition, properties, designations). Use for rendering current display strings.
5. $subsumes — Test if one code subsumes another in a hierarchy. Use for coding hierarchy queries ("is this respiratory infection?").
6. $closure — Maintain a hierarchical closure (all descendants of a concept). Use for building materialized hierarchies for query performance.
Operation invocation examples
`` POST /ValueSet/{id}/$expand GET /CodeSystem/$validate-code?url=...&code=X&system=Y POST /ConceptMap/{id}/$translate?code=X&source=... GET /CodeSystem/$lookup?system=X&code=Y ``
Vendor coverage (mid-2026)
| Server | $expand | $validate-code | $translate | $lookup | $subsumes | $closure |
|---|---|---|---|---|---|---|
| Ontoserver | Full | Full | Full | Full | Full | Full |
| HAPI terminology | Full | Full | Full | Full | Full | Partial |
| Aidbox terminology | Full | Full | Full | Full | Full | Partial |
| MITRE reference | Basic | Basic | Basic | Basic | Basic | Basic |
Common terminology operations mistakes
1. Runtime $expand at query time → slow response. 2. Missing $validate-code in write path → bad codes land. 3. Hardcoded translations instead of $translate → drift. 4. Cached $lookup too long → stale displays. 5. Missing terminology server → all operations unavailable.
Caching strategy
| Operation | Cache TTL |
|---|---|
| $expand (stable ValueSet) | 1 hour to 1 day |
| $validate-code (positive result) | Session |
| $translate (stable ConceptMap) | 1 day |
| $lookup (stable codes) | 1 week |
FHIR terminology services are production infrastructure. Wire them into pipelines correctly and terminology drift becomes a non-issue.



