0.1.0 - ci-build
PatientScheduling - Local Development build (v0.1.0) built by the FHIR (HL7® FHIR® Standard) Build Tools. See the Directory of published versions
| Official URL: http://example.org/StructureDefinition/smart-schedule | Version: 0.1.0 | |||
| Draft as of 2025-12-23 | Computable Name: SMARTSchedule | |||
This profile sets minimum expectations for the Schedule resource to enable SMART Schedule Links use cases
Example usage scenarios:
The following are example usage scenarios for this profile:
The following data elements must always be present (Mandatory) or must be supported if the data is present in the sending system (Must Support). These requirements are derived from the SMART Scheduling Links specification, aligned with US Core Schedule guidance, and adapted to support scheduling and coordination workflows.
Each Schedule Must Have:
Each Schedule Must Support:
Additional Guidance for Implementers
Virtual visits: The 80/20 of schedules will represent an in-person visit and a Schedule with an actor.reference(Location) is expected. However, to accommodate virtual visits, we align with the idea that Locations in R5 can also be used to represent virtual/telemedicine visits and opt to profile Virtual Locations with location.physicalType=vi. Implementers can denote a Schedule offers in-person visits (default) and *additionally** virtual visits by using the SMART Location profile that requires address. Further, virtual-only visits can be specified by profiling against the Virtual Location profile.
HealthcareService: In light of R5 promoting serviceType to be a codeableReference to HealthcareService, we'd suggest thinking of that as the primary 'healthcare service' field. Further, for R4 implementation, we'd suggest using Schedule.actor.reference(HealthcareService) as a way to represent Schedule.serviceType - which should also make it easier to transition from R4 to R5 in the future. (TODO - check FHIR version extensions)
Usages:
You can also check for usages in the FHIR IG Statistics
Description of Profiles, Differentials, Snapshots and how the different presentations work.
| Name | Flags | Card. | Type | Description & Constraints Filter: ![]() ![]() |
|---|---|---|---|---|
![]() |
0..* | Schedule | A container for slots of time that may be available for booking appointments | |
![]() ![]() |
?!Σ | 0..1 | uri | A set of rules under which this content was created |
![]() ![]() |
?! | 0..* | Extension | Extensions that cannot be ignored |
![]() ![]() |
?!Σ | 0..1 | boolean | Whether this schedule is in active use |
![]() ![]() |
SΣ | 1..* | CodeableConcept | Specific service Binding: Common Service Types for Scheduling (preferred) |
![]() ![]() |
Σ | 1..* | Reference(SMART Location | SMART PractitionerRole | Virtual Location | SMART Healthcare Service) | Resource(s) that availability information is being provided for |
![]() ![]() ![]() |
SΣC | 0..1 | string | Literal reference, Relative, internal or absolute URL |
![]() ![]() ![]() |
SΣ | 0..1 | string | Text alternative for the resource |
Documentation for this format | ||||
| Path | Status | Usage | ValueSet | Version | Source |
| Schedule.serviceType | Base | preferred | Common Service Types for Scheduling | 📦0.1.0 | This IG |
| Id | Grade | Path(s) | Description | Expression |
| dom-2 | error | Schedule | If the resource is contained in another resource, it SHALL NOT contain nested Resources |
contained.contained.empty()
|
| dom-3 | error | Schedule | If the resource is contained in another resource, it SHALL be referred to from elsewhere in the resource or SHALL refer to the containing resource |
contained.where((('#'+id in (%resource.descendants().reference | %resource.descendants().as(canonical) | %resource.descendants().as(uri) | %resource.descendants().as(url))) or descendants().where(reference = '#').exists() or descendants().where(as(canonical) = '#').exists() or descendants().where(as(canonical) = '#').exists()).not()).trace('unmatched', id).empty()
|
| dom-4 | error | Schedule | If a resource is contained in another resource, it SHALL NOT have a meta.versionId or a meta.lastUpdated |
contained.meta.versionId.empty() and contained.meta.lastUpdated.empty()
|
| dom-5 | error | Schedule | If a resource is contained in another resource, it SHALL NOT have a security label |
contained.meta.security.empty()
|
| dom-6 | best practice | Schedule | A resource should have narrative for robust management |
text.`div`.exists()
|
| ele-1 | error | **ALL** elements | All FHIR elements must have a @value or children |
hasValue() or (children().count() > id.count())
|
| ext-1 | error | **ALL** extensions | Must have either extensions or value[x], not both |
extension.exists() != value.exists()
|
This structure is derived from Schedule
| Name | Flags | Card. | Type | Description & Constraints Filter: ![]() ![]() |
|---|---|---|---|---|
![]() |
0..* | Schedule | A container for slots of time that may be available for booking appointments | |
![]() ![]() |
S | 1..* | CodeableConcept | Specific service Binding: Common Service Types for Scheduling (preferred) |
![]() ![]() |
1..* | Reference(SMART Location | SMART PractitionerRole | Virtual Location | SMART Healthcare Service) | Resource(s) that availability information is being provided for | |
![]() ![]() ![]() |
S | 0..1 | string | Literal reference, Relative, internal or absolute URL |
![]() ![]() ![]() |
S | 0..1 | string | Text alternative for the resource |
Documentation for this format | ||||
| Path | Status | Usage | ValueSet | Version | Source |
| Schedule.serviceType | Base | preferred | Common Service Types for Scheduling | 📦0.1.0 | This IG |
| Name | Flags | Card. | Type | Description & Constraints Filter: ![]() ![]() | ||||
|---|---|---|---|---|---|---|---|---|
![]() |
0..* | Schedule | A container for slots of time that may be available for booking appointments | |||||
![]() ![]() |
Σ | 0..1 | id | Logical id of this artifact | ||||
![]() ![]() |
Σ | 0..1 | Meta | Metadata about the resource | ||||
![]() ![]() |
?!Σ | 0..1 | uri | A set of rules under which this content was created | ||||
![]() ![]() |
0..1 | code | Language of the resource content Binding: CommonLanguages (preferred): A human language.
| |||||
![]() ![]() |
0..1 | Narrative | Text summary of the resource, for human interpretation This profile does not constrain the narrative in regard to content, language, or traceability to data elements | |||||
![]() ![]() |
0..* | Resource | Contained, inline Resources | |||||
![]() ![]() |
0..* | Extension | Additional content defined by implementations | |||||
![]() ![]() |
?! | 0..* | Extension | Extensions that cannot be ignored | ||||
![]() ![]() |
Σ | 0..* | Identifier | External Ids for this item | ||||
![]() ![]() |
?!Σ | 0..1 | boolean | Whether this schedule is in active use | ||||
![]() ![]() |
Σ | 0..* | CodeableConcept | High-level category Binding: ServiceCategory (example) | ||||
![]() ![]() |
SΣ | 1..* | CodeableConcept | Specific service Binding: Common Service Types for Scheduling (preferred) | ||||
![]() ![]() |
Σ | 0..* | CodeableConcept | Type of specialty needed Binding: PracticeSettingCodeValueSet (preferred): Additional details about where the content was created (e.g. clinical specialty). | ||||
![]() ![]() |
Σ | 1..* | Reference(SMART Location | SMART PractitionerRole | Virtual Location | SMART Healthcare Service) | Resource(s) that availability information is being provided for | ||||
![]() ![]() ![]() |
0..1 | string | Unique id for inter-element referencing | |||||
![]() ![]() ![]() |
0..* | Extension | Additional content defined by implementations Slice: Unordered, Open by value:url | |||||
![]() ![]() ![]() |
SΣC | 0..1 | string | Literal reference, Relative, internal or absolute URL | ||||
![]() ![]() ![]() |
Σ | 0..1 | uri | Type the reference refers to (e.g. "Patient") Binding: ResourceType (extensible): Aa resource (or, for logical models, the URI of the logical model). | ||||
![]() ![]() ![]() |
Σ | 0..1 | Identifier | Logical reference, when literal reference is not known | ||||
![]() ![]() ![]() |
SΣ | 0..1 | string | Text alternative for the resource | ||||
![]() ![]() |
Σ | 0..1 | Period | Period of time covered by schedule | ||||
![]() ![]() |
0..1 | string | Comments on availability | |||||
Documentation for this format | ||||||||
| Path | Status | Usage | ValueSet | Version | Source |
| Schedule.language | Base | preferred | Common Languages | 📍4.0.1 | FHIR Std. |
| Schedule.serviceCategory | Base | example | Service category | 📍4.0.1 | FHIR Std. |
| Schedule.serviceType | Base | preferred | Common Service Types for Scheduling | 📦0.1.0 | This IG |
| Schedule.specialty | Base | preferred | Practice Setting Code Value Set | 📍4.0.1 | FHIR Std. |
| Schedule.actor.type | Base | extensible | ResourceType | 📍4.0.1 | FHIR Std. |
| Id | Grade | Path(s) | Description | Expression |
| dom-2 | error | Schedule | If the resource is contained in another resource, it SHALL NOT contain nested Resources |
contained.contained.empty()
|
| dom-3 | error | Schedule | If the resource is contained in another resource, it SHALL be referred to from elsewhere in the resource or SHALL refer to the containing resource |
contained.where((('#'+id in (%resource.descendants().reference | %resource.descendants().as(canonical) | %resource.descendants().as(uri) | %resource.descendants().as(url))) or descendants().where(reference = '#').exists() or descendants().where(as(canonical) = '#').exists() or descendants().where(as(canonical) = '#').exists()).not()).trace('unmatched', id).empty()
|
| dom-4 | error | Schedule | If a resource is contained in another resource, it SHALL NOT have a meta.versionId or a meta.lastUpdated |
contained.meta.versionId.empty() and contained.meta.lastUpdated.empty()
|
| dom-5 | error | Schedule | If a resource is contained in another resource, it SHALL NOT have a security label |
contained.meta.security.empty()
|
| dom-6 | best practice | Schedule | A resource should have narrative for robust management |
text.`div`.exists()
|
| ele-1 | error | **ALL** elements | All FHIR elements must have a @value or children |
hasValue() or (children().count() > id.count())
|
| ext-1 | error | **ALL** extensions | Must have either extensions or value[x], not both |
extension.exists() != value.exists()
|
This structure is derived from Schedule
Summary
Mandatory: 1 element
Must-Support: 3 elements
Structures
This structure refers to these other structures:
Key Elements View
| Name | Flags | Card. | Type | Description & Constraints Filter: ![]() ![]() |
|---|---|---|---|---|
![]() |
0..* | Schedule | A container for slots of time that may be available for booking appointments | |
![]() ![]() |
?!Σ | 0..1 | uri | A set of rules under which this content was created |
![]() ![]() |
?! | 0..* | Extension | Extensions that cannot be ignored |
![]() ![]() |
?!Σ | 0..1 | boolean | Whether this schedule is in active use |
![]() ![]() |
SΣ | 1..* | CodeableConcept | Specific service Binding: Common Service Types for Scheduling (preferred) |
![]() ![]() |
Σ | 1..* | Reference(SMART Location | SMART PractitionerRole | Virtual Location | SMART Healthcare Service) | Resource(s) that availability information is being provided for |
![]() ![]() ![]() |
SΣC | 0..1 | string | Literal reference, Relative, internal or absolute URL |
![]() ![]() ![]() |
SΣ | 0..1 | string | Text alternative for the resource |
Documentation for this format | ||||
| Path | Status | Usage | ValueSet | Version | Source |
| Schedule.serviceType | Base | preferred | Common Service Types for Scheduling | 📦0.1.0 | This IG |
| Id | Grade | Path(s) | Description | Expression |
| dom-2 | error | Schedule | If the resource is contained in another resource, it SHALL NOT contain nested Resources |
contained.contained.empty()
|
| dom-3 | error | Schedule | If the resource is contained in another resource, it SHALL be referred to from elsewhere in the resource or SHALL refer to the containing resource |
contained.where((('#'+id in (%resource.descendants().reference | %resource.descendants().as(canonical) | %resource.descendants().as(uri) | %resource.descendants().as(url))) or descendants().where(reference = '#').exists() or descendants().where(as(canonical) = '#').exists() or descendants().where(as(canonical) = '#').exists()).not()).trace('unmatched', id).empty()
|
| dom-4 | error | Schedule | If a resource is contained in another resource, it SHALL NOT have a meta.versionId or a meta.lastUpdated |
contained.meta.versionId.empty() and contained.meta.lastUpdated.empty()
|
| dom-5 | error | Schedule | If a resource is contained in another resource, it SHALL NOT have a security label |
contained.meta.security.empty()
|
| dom-6 | best practice | Schedule | A resource should have narrative for robust management |
text.`div`.exists()
|
| ele-1 | error | **ALL** elements | All FHIR elements must have a @value or children |
hasValue() or (children().count() > id.count())
|
| ext-1 | error | **ALL** extensions | Must have either extensions or value[x], not both |
extension.exists() != value.exists()
|
Differential View
This structure is derived from Schedule
| Name | Flags | Card. | Type | Description & Constraints Filter: ![]() ![]() |
|---|---|---|---|---|
![]() |
0..* | Schedule | A container for slots of time that may be available for booking appointments | |
![]() ![]() |
S | 1..* | CodeableConcept | Specific service Binding: Common Service Types for Scheduling (preferred) |
![]() ![]() |
1..* | Reference(SMART Location | SMART PractitionerRole | Virtual Location | SMART Healthcare Service) | Resource(s) that availability information is being provided for | |
![]() ![]() ![]() |
S | 0..1 | string | Literal reference, Relative, internal or absolute URL |
![]() ![]() ![]() |
S | 0..1 | string | Text alternative for the resource |
Documentation for this format | ||||
| Path | Status | Usage | ValueSet | Version | Source |
| Schedule.serviceType | Base | preferred | Common Service Types for Scheduling | 📦0.1.0 | This IG |
Snapshot View
| Name | Flags | Card. | Type | Description & Constraints Filter: ![]() ![]() | ||||
|---|---|---|---|---|---|---|---|---|
![]() |
0..* | Schedule | A container for slots of time that may be available for booking appointments | |||||
![]() ![]() |
Σ | 0..1 | id | Logical id of this artifact | ||||
![]() ![]() |
Σ | 0..1 | Meta | Metadata about the resource | ||||
![]() ![]() |
?!Σ | 0..1 | uri | A set of rules under which this content was created | ||||
![]() ![]() |
0..1 | code | Language of the resource content Binding: CommonLanguages (preferred): A human language.
| |||||
![]() ![]() |
0..1 | Narrative | Text summary of the resource, for human interpretation This profile does not constrain the narrative in regard to content, language, or traceability to data elements | |||||
![]() ![]() |
0..* | Resource | Contained, inline Resources | |||||
![]() ![]() |
0..* | Extension | Additional content defined by implementations | |||||
![]() ![]() |
?! | 0..* | Extension | Extensions that cannot be ignored | ||||
![]() ![]() |
Σ | 0..* | Identifier | External Ids for this item | ||||
![]() ![]() |
?!Σ | 0..1 | boolean | Whether this schedule is in active use | ||||
![]() ![]() |
Σ | 0..* | CodeableConcept | High-level category Binding: ServiceCategory (example) | ||||
![]() ![]() |
SΣ | 1..* | CodeableConcept | Specific service Binding: Common Service Types for Scheduling (preferred) | ||||
![]() ![]() |
Σ | 0..* | CodeableConcept | Type of specialty needed Binding: PracticeSettingCodeValueSet (preferred): Additional details about where the content was created (e.g. clinical specialty). | ||||
![]() ![]() |
Σ | 1..* | Reference(SMART Location | SMART PractitionerRole | Virtual Location | SMART Healthcare Service) | Resource(s) that availability information is being provided for | ||||
![]() ![]() ![]() |
0..1 | string | Unique id for inter-element referencing | |||||
![]() ![]() ![]() |
0..* | Extension | Additional content defined by implementations Slice: Unordered, Open by value:url | |||||
![]() ![]() ![]() |
SΣC | 0..1 | string | Literal reference, Relative, internal or absolute URL | ||||
![]() ![]() ![]() |
Σ | 0..1 | uri | Type the reference refers to (e.g. "Patient") Binding: ResourceType (extensible): Aa resource (or, for logical models, the URI of the logical model). | ||||
![]() ![]() ![]() |
Σ | 0..1 | Identifier | Logical reference, when literal reference is not known | ||||
![]() ![]() ![]() |
SΣ | 0..1 | string | Text alternative for the resource | ||||
![]() ![]() |
Σ | 0..1 | Period | Period of time covered by schedule | ||||
![]() ![]() |
0..1 | string | Comments on availability | |||||
Documentation for this format | ||||||||
| Path | Status | Usage | ValueSet | Version | Source |
| Schedule.language | Base | preferred | Common Languages | 📍4.0.1 | FHIR Std. |
| Schedule.serviceCategory | Base | example | Service category | 📍4.0.1 | FHIR Std. |
| Schedule.serviceType | Base | preferred | Common Service Types for Scheduling | 📦0.1.0 | This IG |
| Schedule.specialty | Base | preferred | Practice Setting Code Value Set | 📍4.0.1 | FHIR Std. |
| Schedule.actor.type | Base | extensible | ResourceType | 📍4.0.1 | FHIR Std. |
| Id | Grade | Path(s) | Description | Expression |
| dom-2 | error | Schedule | If the resource is contained in another resource, it SHALL NOT contain nested Resources |
contained.contained.empty()
|
| dom-3 | error | Schedule | If the resource is contained in another resource, it SHALL be referred to from elsewhere in the resource or SHALL refer to the containing resource |
contained.where((('#'+id in (%resource.descendants().reference | %resource.descendants().as(canonical) | %resource.descendants().as(uri) | %resource.descendants().as(url))) or descendants().where(reference = '#').exists() or descendants().where(as(canonical) = '#').exists() or descendants().where(as(canonical) = '#').exists()).not()).trace('unmatched', id).empty()
|
| dom-4 | error | Schedule | If a resource is contained in another resource, it SHALL NOT have a meta.versionId or a meta.lastUpdated |
contained.meta.versionId.empty() and contained.meta.lastUpdated.empty()
|
| dom-5 | error | Schedule | If a resource is contained in another resource, it SHALL NOT have a security label |
contained.meta.security.empty()
|
| dom-6 | best practice | Schedule | A resource should have narrative for robust management |
text.`div`.exists()
|
| ele-1 | error | **ALL** elements | All FHIR elements must have a @value or children |
hasValue() or (children().count() > id.count())
|
| ext-1 | error | **ALL** extensions | Must have either extensions or value[x], not both |
extension.exists() != value.exists()
|
This structure is derived from Schedule
Summary
Mandatory: 1 element
Must-Support: 3 elements
Structures
This structure refers to these other structures:
Other representations of profile: CSV, Excel, Schematron