Skip to main content

StructureDefinition $expand-profile

The $expand-profile operation expands a StructureDefinition profile by recursively loading all nested StructureDefinition resources referenced in the profile's element type definitions. This is useful for obtaining a complete set of profiles needed to validate or render resources conforming to a profile.

Use Cases​

  • Profile Validation Setup: Load all profiles needed to validate a resource against a profile hierarchy
  • UI Schema Generation: Load all profiles to generate a complete UI schema with proper constraints
  • Profile Documentation: Generate documentation that includes all referenced profiles
  • Implementation Guide Support: Work with complex profile hierarchies from implementation guides like US Core

Invocation​

GET [base]/StructureDefinition/$expand-profile?url=[profile URL]

Input Parameters​

ParameterCardinalityTypeDescription
url1..1stringThe canonical URL of the StructureDefinition to expand

Output​

Returns a Bundle of type searchset containing the requested profile and all nested StructureDefinition resources.

Behavior​

  1. Profile Lookup: Searches for a StructureDefinition with the given URL
  2. Element Scanning: Scans the profile's snapshot.element array for type profiles
  3. Recursive Loading: Recursively loads all referenced profiles
  4. Deduplication: Avoids loading the same profile multiple times
  5. Depth Limiting: Limits recursion to 10 levels to prevent infinite loops

Example​

Request​

GET /fhir/R4/StructureDefinition/$expand-profile?url=http://example.org/fhir/StructureDefinition/custom-patient

Response​

{
"resourceType": "Bundle",
"type": "searchset",
"entry": [
{
"fullUrl": "https://api.medplum.com/fhir/R4/StructureDefinition/custom-patient-id",
"resource": {
"resourceType": "StructureDefinition",
"id": "custom-patient-id",
"url": "http://example.org/fhir/StructureDefinition/custom-patient",
"name": "CustomPatient",
"status": "active",
"kind": "resource",
"type": "Patient",
"snapshot": {
"element": [
{
"id": "Patient.identifier",
"path": "Patient.identifier",
"type": [
{
"code": "Identifier",
"profile": [
"http://example.org/fhir/StructureDefinition/custom-identifier"
]
}
]
}
]
}
}
},
{
"fullUrl": "https://api.medplum.com/fhir/R4/StructureDefinition/custom-identifier-id",
"resource": {
"resourceType": "StructureDefinition",
"id": "custom-identifier-id",
"url": "http://example.org/fhir/StructureDefinition/custom-identifier",
"name": "CustomIdentifier",
"status": "active",
"kind": "complex-type",
"type": "Identifier"
}
}
]
}

Example Usage​

Profile Validation Setup​

Load all profiles needed to validate a resource:

const bundle = await medplum.get(
'StructureDefinition/$expand-profile?url=http://example.org/fhir/StructureDefinition/my-profile'
);

// Extract all profiles for validator
const profiles = bundle.entry.map(e => e.resource);

UI Schema Generation​

Load all profiles to generate a complete UI schema:

const bundle = await medplum.get(
'StructureDefinition/$expand-profile?url=http://hl7.org/fhir/us/core/StructureDefinition/us-core-patient'
);

// Use profiles to build form fields with proper constraints

Profile Documentation​

Generate documentation that includes all referenced profiles:

const bundle = await medplum.get(
'StructureDefinition/$expand-profile?url=http://example.org/fhir/StructureDefinition/custom-resource'
);

// Generate documentation for each profile
for (const entry of bundle.entry) {
generateDocumentation(entry.resource);
}

Version Resolution​

When multiple versions of a profile exist, the operation returns the latest version based on the version field (sorted descending).

Error Responses​

Status CodeDescription
400 Bad RequestMissing url parameter
400 Bad RequestProfile with the specified URL not found

Notes​

  • The operation only includes profiles referenced in element.type.profile
  • Base FHIR types are not included in the expansion
  • The response includes the original requested profile as the first entry
  • Circular references are handled gracefully through deduplication