Profile-Based Validation Without a Full IG Deploy

Profile-based validation requires a StructureDefinition, some terminology, and enough of the surrounding IG to interpret cross-references. In practice teams reach for the full-IG deploy as if it were the only option — and it is not. A pragmatic profile-based validator can run against a targeted subset of an IG and catch the most impactful violations without the operational overhead. The site's R4 resource vetter runs against the base spec by default and can be pointed at a profile. For the wider FHIR framing, the payer interoperability hub has more.

What A Profile Actually Adds

A profile refines a base resource by:

  • Tightening cardinality (0..1 becomes 1..1)
  • Adding required extensions
  • Fixing values on specific elements
  • Binding coded elements to value sets
  • Slicing repeating elements into named sub-lists
  • Adding invariant expressions

Every one of those is a validation check. Together they turn a general Patient into a US Core Patient or an IPS Patient.

The Minimum Profile Package

To validate against a profile, you need:

  • The profile StructureDefinition (differential is enough)
  • Any StructureDefinitions the profile references (extensions, sub-profiles)
  • Any ValueSet and CodeSystem for required bindings
  • The base resource spec

That is often a handful of files, not the full IG. The vetter loads only what the profile references.

Skip What You Do Not Need

Full IG deploys bring:

  • Every profile in the IG, even ones you never validate against
  • Every ValueSet, including the ones for optional elements
  • CapabilityStatements, ImplementationGuide metadata, examples

You do not need most of that to validate a specific payload. For the base pattern of what a validator has to do, single-resource validation vs Bundle validation: knowing the boundary is the entry.

The Terminology Question

Required value-set bindings drive the biggest incremental cost. Loading a large ValueSet with an $expand operation is expensive. Terminology validation itself is a decision worth making explicitly rather than defaulting to on. For the trade-off, terminology validation and the tradeoffs of enabling it is the entry.

Pragmatic pattern: enable terminology validation for the value sets you actually care about. Skip it for advisory bindings.

Pin The Profile Version

Every profile carries a canonical URL, optionally with a version suffix. Pin your validator to a specific version. Upgrading is a controlled change; drift is not.

Producers that emit a profile version and validators that check a different version produce disagreement. That is where the "the vendor says it validates, our validator says it doesn't" incidents come from.

Cache The Package

Loading the same StructureDefinitions on every validation run is expensive and unnecessary. Cache the parsed package once. Refresh on version bumps, not per request.

For high-throughput validators, the cache is what makes profile validation viable. Without it, the load latency dominates.

Meta.profile Interplay

If the resource claims a profile via meta.profile, the validator can:

  • Trust the claim and run only the claimed profile
  • Ignore the claim and run only the configured profile
  • Combine — run both

For the specific mechanics, meta.profile: what it claims and what it costs to enforce is the entry.

When To Skip Profile Validation

  • The payload does not target any specific profile
  • The producer is early-stage and structural checks are enough
  • Downstream systems do their own profile validation
  • The profile is drifting and the target is unclear

Skipping is not laziness — it is scope management. For the risk-based framing, when structural validation is enough for your risk profile covers when the base spec suffices.

The Short Version

Profile validation is doable with a small StructureDefinition subset. Pin the version. Cache the package. Enable terminology selectively. Skip when the payload does not target a profile. Full-IG deploys are one option; not the only one.

Editorial-gouache diagram of a targeted profile package with StructureDefinition, referenced extensions, and required-binding ValueSets loaded into a lean validator, in soft coral gouache tones on cream paper

Sources