Skip to content
MK CDN
Menu
  • Terminology server
  • Medical form builder
  • Ehr development
  • Emr development
Menu
Editorial illustration in neubrutalism-shadow style depicting a US Core Patient differential with extension slots and mustSupport flags

Reading an IG for the Extensions You Actually Need

Posted on July 13, 2026July 13, 2026 by Mei Lin

An implementation guide (IG) is where the extensions your integration needs are declared. Not by name, exactly — by the profile-plus-extension shape that the IG expects on every payload it accepts. Reading the IG the way a compiler reads a spec is the fastest way to know what your producer has to send and what your consumer has to handle. The site's Extension registry audit surfaces the ones from major IGs. For the wider FHIR framing, the broader FHIR knowledge hub has more.

What An IG Actually Publishes

  • A set of profiles per resource type
  • A set of extensions with canonical URLs
  • Terminology bindings — value sets and code systems
  • CapabilityStatements describing what a conformant server supports
  • Guidance prose that binds it all together

The extensions are usually the smallest artefact and the load-bearing one. Every profile refers to them by URL. Every payload conforming to a profile has to carry them where they are required.

Read The Differential, Not The Snapshot

Every profile has two views: differential (what changed from the base) and snapshot (the full expanded shape). Read the differential first. It lists the elements the profile added or tightened, including the extensions.

Snapshot is useful for validators and generators; differential is what humans read to understand a profile. Trying to reverse-engineer an IG from snapshots is a slow path.

Note Every mustSupport Flag

Extensions marked mustSupport are the ones consumers must handle. The producer may not always populate them, but the consumer cannot silently drop them.

That flag drives implementation priority. US Core profiles for Patient carry mustSupport on race, ethnicity, and birthsex extensions — those are non-negotiable handling. For the specific case, finding US Core extensions your data has to carry walks through them.

Read The Extension Definitions

Every extension the profile references has its own StructureDefinition. Read those:

  • What value type does the extension carry?
  • Is it a simple extension (one value) or a complex extension (nested sub-extensions)?
  • What is the canonical URL?
  • Is it modifier or regular?

Sending a complex extension as if it were simple, or vice versa, produces payloads that fail validation on the receiver.

Look For Cross-Version Drift

IGs often exist in multiple versions. US Core 3.1.1, 5.0.1, 6.1.0, 7.0.0 — each may reference slightly different extension URLs. Producers stuck on an older IG send URLs consumers on a newer IG do not recognize.

The right pattern: pin to a specific IG version, document which extensions it uses, upgrade in a controlled manner. For the validation side of this, extension validation that doesn't trip on optional URLs is the entry.

Ignore The Optional Extensions Until You Need Them

An IG usually declares extensions beyond mustSupport — optional ones profiles or consumers may use. Producers do not have to send them. Consumers do not have to handle them beyond ignoring them safely.

Ignoring the optional extensions is not laziness; it is scope management. Add them when a downstream workflow actually needs them, not because they appear in the profile.

Terminology Bindings Are Half The Story

Extensions with coded values carry bindings to value sets. A race extension binds to a specific ombCategory value set. Sending a code outside the value set makes the payload technically valid but semantically wrong.

Read the binding strength. Required bindings must come from the set. Extensible bindings can be extended when the set is insufficient. Preferred and example bindings are advisory.

The Audit Tool As A Shortcut

The extension audit at /lint-lab/audit-extension-urls/ walks a resource or Bundle and classifies every extension URL against known IGs. That is the fast path from "does my payload look conformant?" to a definite answer.

For the base case of whether a gap even deserves an extension, when a FHIR extension is the right answer, and when it isn't is the entry.

The Short Version

Read the differential. Note mustSupport. Read extension definitions individually. Watch version drift. Terminology bindings matter. Optional extensions can wait. The audit tool catches most of the misses.

Neubrutalism-shadow diagram of an IG profile differential with extension slots and mustSupport flags called out as annotated boxes, with heavy black borders and hard shadows on ivory

Sources

  • HL7 US Core Implementation Guide STU7 canonical index - HL7 US Core Implementation Guide STU7 canonical index

Dev utility

Dev utility

Wondering whether that Extension URL matches a known registry? an extension URL auditor lives in the toolbox pages nearby.

Recent Posts

  • FHIR Questionnaire vs REDCap for US Clinical Research
  • Self-Hosted vs Cloud FHIR Terminology Servers for US Hospitals
  • Open-Source vs Commercial FHIR Servers for US Hospital IT
  • SDC Forms vs JotForm for US Clinical Intake
  • LOINC vs ICD-10 FHIR Bindings for US Lab Workflows

Categories

  • Ehr development
  • Emr development
  • Extension Registry
  • Medical form builder
  • Terminology server
© Copyright 2025.
imunify-bot-check