PlanDefinition $apply | Medplum

On this page

Medplum implements the FHIR $apply operation for PlanDefinition resources.

The $apply operation converts a PlanDefinition into a set of actionable resources for a specific patient. It creates a CarePlan containing a RequestGroup with Tasks based on the actions defined in the PlanDefinition.

For a detailed explanation of how Medplum processes PlanDefinitions, resolves ActivityDefinitions, and handles custom Task extensions, see our guide on Authoring Clinical Protocols.

Use Cases

Invoke the $apply operation

[base]/PlanDefinition/[id]/$apply

For example:

curl -X POST 'https://api.medplum.com/fhir/R4/PlanDefinition/example-id/$apply' \

-H "Content-Type: application/fhir+json" \

-H "Authorization: Bearer MY_ACCESS_TOKEN" \

-d '{

"resourceType": "Parameters",

"parameter": [\
\
      {\
\
        "name": "subject",\
\
        "valueString": "Patient/patient-123"\
\
      }\
\
    ]

}'

Parameters

Name Type Description Required
subject string[] Reference to the Patient the plan applies to Yes
encounter string Reference to the Encounter for context No
practitioner string Reference to the Practitioner applying the plan No
organization string Reference to the Organization context No

Example with All Parameters

curl -X POST 'https://api.medplum.com/fhir/R4/PlanDefinition/example-id/$apply' \

-H "Content-Type: application/fhir+json" \

-H "Authorization: Bearer MY_ACCESS_TOKEN" \

-d '{

"resourceType": "Parameters",

"parameter": [\
\
      {\
\
        "name": "subject",\
\
        "valueString": "Patient/patient-123"\
\
      },\
\
      {\
\
        "name": "encounter",\
\
        "valueString": "Encounter/encounter-456"\
\
      },\
\
      {\
\
        "name": "practitioner",\
\
        "valueString": "Practitioner/dr-smith"\
\
      },\
\
      {\
\
        "name": "organization",\
\
        "valueString": "Organization/clinic-abc"\
\
      }\
\
    ]

}'

Output

The operation returns a CarePlan resource that references a RequestGroup containing the generated Tasks.

Example Response

{

"resourceType": "CarePlan",

"id": "generated-careplan-id",

"status": "active",

"intent": "plan",

"subject": {

"reference": "Patient/patient-123"

},

"instantiatesCanonical": [\
\
    "http://example.org/PlanDefinition/diabetes-management"\
\
  ],

"activity": [\
\
    {\
\
      "reference": {\
\
        "reference": "RequestGroup/generated-requestgroup-id"\
\
      }\
\
    }\
\
  ]

}

Example PlanDefinition

At its most basic level, a PlanDefinition is a list of sequential tasks. The $apply operation converts these actions into a RequestGroup and individual Task resources.

{

"resourceType": "PlanDefinition",

"id": "example-plan",

"url": "http://example.org/PlanDefinition/diabetes-screening",

"title": "Diabetes Screening Protocol",

"status": "active",

"action": [\
\
    {\
\
      "title": "Order HbA1c Test",\
\
      "definitionCanonical": "http://example.org/ActivityDefinition/hba1c-order"\
\
    },\
\
    {\
\
      "title": "Complete Risk Assessment",\
\
      "definitionCanonical": "http://example.org/Questionnaire/diabetes-risk"\
\
    },\
\
    {\
\
      "title": "Schedule Follow-up",\
\
      "description": "Schedule a follow-up appointment in 3 months"\
\
    }\
\
  ]

}

For more advanced examples of modeling workflows (including hierarchical actions, conditional logic, timing dependencies, and dynamic values), see our guide on Authoring Clinical Protocols.