<?xml version="1.0" encoding="utf-8"?>
<rss version="2.0" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:content="http://purl.org/rss/1.0/modules/content/">
    <channel>
        <title>Medplum Blog</title>
        <link>https://www.medplum.com/blog</link>
        <description>Medplum Blog</description>
        <lastBuildDate>Wed, 17 Dec 2025 00:00:00 GMT</lastBuildDate>
        <docs>https://validator.w3.org/feed/docs/rss2.html</docs>
        <generator>https://github.com/jpmonette/feed</generator>
        <language>en</language>
        <item>
            <title><![CDATA[Tenant Isolation Approaches in Medplum]]></title>
            <link>https://www.medplum.com/blog/tenant-isolation-approaches-in-medplum</link>
            <guid>https://www.medplum.com/blog/tenant-isolation-approaches-in-medplum</guid>
            <pubDate>Wed, 17 Dec 2025 00:00:00 GMT</pubDate>
            <description><![CDATA[In healthcare applications, practitioners often work across multiple organizational boundaries. A doctor might work at multiple clinics, a nurse might be part of several care teams, or a care coordinator might manage patients across different healthcare services. Each of these—clinics, care teams, and healthcare services—represents a distinct tenant in your system: a collection of resources (patients, observations, encounters, etc.) that should be logically grouped together.]]></description>
            <content:encoded><![CDATA[<p>In healthcare applications, practitioners often work across multiple organizational boundaries. A doctor might work at multiple clinics, a nurse might be part of several care teams, or a care coordinator might manage patients across different healthcare services. Each of these—clinics, care teams, and healthcare services—represents a distinct <strong>tenant</strong> in your system: a collection of resources (patients, observations, encounters, etc.) that should be logically grouped together.</p>
<p>In Medplum, you can build your tenancy model around any FHIR resource type. Common examples include:</p>
<ul>
<li class=""><strong><code>Organization</code></strong>: Different clinics, practices, or healthcare organizations</li>
<li class=""><strong><code>HealthcareService</code></strong>: Different departments or services (e.g., Cardiology Department, Oncology Department)</li>
<li class=""><strong><code>CareTeam</code></strong>: Different care teams (e.g., Diabetes Care Team, Hypertension Care Team)</li>
</ul>
<p>For a comprehensive guide on how to set up multi-tenancy in Medplum—including data modeling, compartments, propagation, and user enrollment—see our <a class="" href="https://www.medplum.com/docs/access/multi-tenant-access-policy">Multi-Tenant Access Control documentation</a>.</p>
<p>This blog post focuses on a specific challenge: <strong>What happens when a user belongs to multiple tenants?</strong> And more importantly, <strong>how can you ensure your application restricts access to only one tenant at a time?</strong></p>
<h2 class="anchor anchorTargetStickyNavbar_SAay" id="understanding-api-level-security-and-isolation">Understanding API-Level Security and Isolation<a href="https://www.medplum.com/blog/tenant-isolation-approaches-in-medplum#understanding-api-level-security-and-isolation" class="hash-link" aria-label="Direct link to Understanding API-Level Security and Isolation" title="Direct link to Understanding API-Level Security and Isolation" translate="no">​</a></h2>
<p>Before diving into the solutions, it's important to understand what <strong>API-level security and isolation</strong> means, especially for non-technical readers.</p>
<p>When a user logs into your application, they receive an <strong>authentication token</strong> (think of it as a digital key). This token is used to make requests to the Medplum API server to read or modify patient data, medical records, and other healthcare information.</p>
<p><strong>API-level isolation</strong> refers to security controls that are enforced by the Medplum server itself—not just by your application's user interface. When properly configured, the server checks every request against the user's permissions and only allows access to data the user is authorized to see.</p>
<h3 class="anchor anchorTargetStickyNavbar_SAay" id="why-this-matters-the-security-risk">Why This Matters: The Security Risk<a href="https://www.medplum.com/blog/tenant-isolation-approaches-in-medplum#why-this-matters-the-security-risk" class="hash-link" aria-label="Direct link to Why This Matters: The Security Risk" title="Direct link to Why This Matters: The Security Risk" translate="no">​</a></h3>
<p>Here's the critical security concern: <strong>If a bad actor obtains a user's authentication token and knows how to construct FHIR API requests, they could potentially access data from all tenants that user has access to—even if your application's UI only shows one tenant at a time.</strong></p>
<p><strong>The risks include:</strong></p>
<ol>
<li class="">
<p><strong>Unauthorized Data Access</strong>: An attacker with a stolen token could bypass your application's UI restrictions entirely and directly query the API to retrieve patient data from multiple tenants simultaneously.</p>
</li>
<li class="">
<p><strong>Data Exfiltration</strong>: They could systematically extract sensitive health information (PHI) from all tenants the user belongs to, not just the one currently displayed in your application.</p>
</li>
<li class="">
<p><strong>Compliance Violations</strong>: Accessing data across tenant boundaries could violate HIPAA, state privacy laws, or organizational policies that require strict data isolation between different clinics, departments, or care teams.</p>
</li>
<li class="">
<p><strong>Cross-Tenant Data Leakage</strong>: Even if your UI correctly filters data, an attacker making direct API calls could discover relationships, patient overlaps, or other sensitive information that should remain isolated between tenants.</p>
</li>
</ol>
<p><strong>The key question</strong>: Does your security model rely solely on your application's UI to restrict access, or does the API server itself enforce single-tenant isolation?</p>
<p>This blog post explores different approaches to ensure that even if someone gets hold of an authentication token, the API server itself will restrict access to only one tenant's data at a time—providing true API-level security.</p>
<h2 class="anchor anchorTargetStickyNavbar_SAay" id="how-to-ensure-your-application-can-be-contained-to-just-one-tenant-at-a-time-when-a-user-belongs-to-multiple-tenants">How to Ensure Your Application Can Be Contained to Just One Tenant at a Time When a User Belongs to Multiple Tenants<a href="https://www.medplum.com/blog/tenant-isolation-approaches-in-medplum#how-to-ensure-your-application-can-be-contained-to-just-one-tenant-at-a-time-when-a-user-belongs-to-multiple-tenants" class="hash-link" aria-label="Direct link to How to Ensure Your Application Can Be Contained to Just One Tenant at a Time When a User Belongs to Multiple Tenants" title="Direct link to How to Ensure Your Application Can Be Contained to Just One Tenant at a Time When a User Belongs to Multiple Tenants" translate="no">​</a></h2>
<h3 class="anchor anchorTargetStickyNavbar_SAay" id="the-challenge-multiple-tenant-memberships">The Challenge: Multiple Tenant Memberships<a href="https://www.medplum.com/blog/tenant-isolation-approaches-in-medplum#the-challenge-multiple-tenant-memberships" class="hash-link" aria-label="Direct link to The Challenge: Multiple Tenant Memberships" title="Direct link to The Challenge: Multiple Tenant Memberships" translate="no">​</a></h3>
<p>When a Practitioner user belongs to multiple tenants, their <code>ProjectMembership</code> will have multiple entries in the <code>access</code> array, each with different tenant parameters:</p>
<p><strong>In this scenario, the user's API-level access includes data from both clinics. But how do you ensure your application is contained to just one tenant at a time?</strong></p>
<div class="theme-tabs-container tabs-container tabList_M0Dn"><ul role="tablist" aria-orientation="horizontal" class="tabs"><li role="tab" tabindex="0" aria-selected="true" class="tabs__item tabItem_ysIP tabs__item--active">Organization</li><li role="tab" tabindex="-1" aria-selected="false" class="tabs__item tabItem_ysIP">HealthcareService</li><li role="tab" tabindex="-1" aria-selected="false" class="tabs__item tabItem_ysIP">CareTeam</li></ul><div class="margin-top--md"><div role="tabpanel" class="tabItem_OMyP"><div class="language-json codeBlockContainer_ZGJx theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_kX1v"><pre tabindex="0" class="prism-code language-json codeBlock_TAPP thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_AdAo"><span class="token-line" style="color:#393A34"><span class="token punctuation" style="color:#393A34">{</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">  </span><span class="token property" style="color:#36acaa">"resourceType"</span><span class="token operator" style="color:#393A34">:</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">"ProjectMembership"</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">  </span><span class="token property" style="color:#36acaa">"access"</span><span class="token operator" style="color:#393A34">:</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">[</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token punctuation" style="color:#393A34">{</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">      </span><span class="token property" style="color:#36acaa">"parameter"</span><span class="token operator" style="color:#393A34">:</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">[</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">        </span><span class="token punctuation" style="color:#393A34">{</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">          </span><span class="token property" style="color:#36acaa">"name"</span><span class="token operator" style="color:#393A34">:</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">"organization"</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">          </span><span class="token property" style="color:#36acaa">"valueReference"</span><span class="token operator" style="color:#393A34">:</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">{</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">            </span><span class="token property" style="color:#36acaa">"reference"</span><span class="token operator" style="color:#393A34">:</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">"Organization/clinic-a"</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">            </span><span class="token property" style="color:#36acaa">"display"</span><span class="token operator" style="color:#393A34">:</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">"Downtown Clinic"</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">          </span><span class="token punctuation" style="color:#393A34">}</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">        </span><span class="token punctuation" style="color:#393A34">}</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">      </span><span class="token punctuation" style="color:#393A34">]</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">      </span><span class="token property" style="color:#36acaa">"policy"</span><span class="token operator" style="color:#393A34">:</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">{</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">        </span><span class="token property" style="color:#36acaa">"reference"</span><span class="token operator" style="color:#393A34">:</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">"AccessPolicy/mso-policy"</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">      </span><span class="token punctuation" style="color:#393A34">}</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token punctuation" style="color:#393A34">}</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token punctuation" style="color:#393A34">{</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">      </span><span class="token property" style="color:#36acaa">"parameter"</span><span class="token operator" style="color:#393A34">:</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">[</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">        </span><span class="token punctuation" style="color:#393A34">{</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">          </span><span class="token property" style="color:#36acaa">"name"</span><span class="token operator" style="color:#393A34">:</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">"organization"</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">          </span><span class="token property" style="color:#36acaa">"valueReference"</span><span class="token operator" style="color:#393A34">:</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">{</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">            </span><span class="token property" style="color:#36acaa">"reference"</span><span class="token operator" style="color:#393A34">:</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">"Organization/clinic-b"</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">            </span><span class="token property" style="color:#36acaa">"display"</span><span class="token operator" style="color:#393A34">:</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">"Uptown Clinic"</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">          </span><span class="token punctuation" style="color:#393A34">}</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">        </span><span class="token punctuation" style="color:#393A34">}</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">      </span><span class="token punctuation" style="color:#393A34">]</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">      </span><span class="token property" style="color:#36acaa">"policy"</span><span class="token operator" style="color:#393A34">:</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">{</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">        </span><span class="token property" style="color:#36acaa">"reference"</span><span class="token operator" style="color:#393A34">:</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">"AccessPolicy/mso-policy"</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">      </span><span class="token punctuation" style="color:#393A34">}</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token punctuation" style="color:#393A34">}</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">  </span><span class="token punctuation" style="color:#393A34">]</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token punctuation" style="color:#393A34">}</span><br></span></code></pre></div></div></div><div role="tabpanel" class="tabItem_OMyP" hidden=""><div class="language-json codeBlockContainer_ZGJx theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_kX1v"><pre tabindex="0" class="prism-code language-json codeBlock_TAPP thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_AdAo"><span class="token-line" style="color:#393A34"><span class="token punctuation" style="color:#393A34">{</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">  </span><span class="token property" style="color:#36acaa">"resourceType"</span><span class="token operator" style="color:#393A34">:</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">"ProjectMembership"</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">  </span><span class="token property" style="color:#36acaa">"access"</span><span class="token operator" style="color:#393A34">:</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">[</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token punctuation" style="color:#393A34">{</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">      </span><span class="token property" style="color:#36acaa">"parameter"</span><span class="token operator" style="color:#393A34">:</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">[</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">        </span><span class="token punctuation" style="color:#393A34">{</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">          </span><span class="token property" style="color:#36acaa">"name"</span><span class="token operator" style="color:#393A34">:</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">"healthcare_service"</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">          </span><span class="token property" style="color:#36acaa">"valueReference"</span><span class="token operator" style="color:#393A34">:</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">{</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">            </span><span class="token property" style="color:#36acaa">"reference"</span><span class="token operator" style="color:#393A34">:</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">"HealthcareService/cardiology-service"</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">            </span><span class="token property" style="color:#36acaa">"display"</span><span class="token operator" style="color:#393A34">:</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">"Cardiology Department"</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">          </span><span class="token punctuation" style="color:#393A34">}</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">        </span><span class="token punctuation" style="color:#393A34">}</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">      </span><span class="token punctuation" style="color:#393A34">]</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">      </span><span class="token property" style="color:#36acaa">"policy"</span><span class="token operator" style="color:#393A34">:</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">{</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">        </span><span class="token property" style="color:#36acaa">"reference"</span><span class="token operator" style="color:#393A34">:</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">"AccessPolicy/service-policy"</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">      </span><span class="token punctuation" style="color:#393A34">}</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token punctuation" style="color:#393A34">}</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token punctuation" style="color:#393A34">{</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">      </span><span class="token property" style="color:#36acaa">"parameter"</span><span class="token operator" style="color:#393A34">:</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">[</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">        </span><span class="token punctuation" style="color:#393A34">{</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">          </span><span class="token property" style="color:#36acaa">"name"</span><span class="token operator" style="color:#393A34">:</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">"healthcare_service"</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">          </span><span class="token property" style="color:#36acaa">"valueReference"</span><span class="token operator" style="color:#393A34">:</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">{</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">            </span><span class="token property" style="color:#36acaa">"reference"</span><span class="token operator" style="color:#393A34">:</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">"HealthcareService/oncology-service"</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">            </span><span class="token property" style="color:#36acaa">"display"</span><span class="token operator" style="color:#393A34">:</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">"Oncology Department"</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">          </span><span class="token punctuation" style="color:#393A34">}</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">        </span><span class="token punctuation" style="color:#393A34">}</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">      </span><span class="token punctuation" style="color:#393A34">]</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">      </span><span class="token property" style="color:#36acaa">"policy"</span><span class="token operator" style="color:#393A34">:</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">{</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">        </span><span class="token property" style="color:#36acaa">"reference"</span><span class="token operator" style="color:#393A34">:</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">"AccessPolicy/service-policy"</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">      </span><span class="token punctuation" style="color:#393A34">}</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token punctuation" style="color:#393A34">}</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">  </span><span class="token punctuation" style="color:#393A34">]</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token punctuation" style="color:#393A34">}</span><br></span></code></pre></div></div></div><div role="tabpanel" class="tabItem_OMyP" hidden=""><div class="language-json codeBlockContainer_ZGJx theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_kX1v"><pre tabindex="0" class="prism-code language-json codeBlock_TAPP thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_AdAo"><span class="token-line" style="color:#393A34"><span class="token punctuation" style="color:#393A34">{</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">  </span><span class="token property" style="color:#36acaa">"resourceType"</span><span class="token operator" style="color:#393A34">:</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">"ProjectMembership"</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">  </span><span class="token property" style="color:#36acaa">"access"</span><span class="token operator" style="color:#393A34">:</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">[</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token punctuation" style="color:#393A34">{</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">      </span><span class="token property" style="color:#36acaa">"parameter"</span><span class="token operator" style="color:#393A34">:</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">[</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">        </span><span class="token punctuation" style="color:#393A34">{</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">          </span><span class="token property" style="color:#36acaa">"name"</span><span class="token operator" style="color:#393A34">:</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">"care_team"</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">          </span><span class="token property" style="color:#36acaa">"valueReference"</span><span class="token operator" style="color:#393A34">:</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">{</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">            </span><span class="token property" style="color:#36acaa">"reference"</span><span class="token operator" style="color:#393A34">:</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">"CareTeam/diabetes-care-team"</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">            </span><span class="token property" style="color:#36acaa">"display"</span><span class="token operator" style="color:#393A34">:</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">"Diabetes Care Team"</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">          </span><span class="token punctuation" style="color:#393A34">}</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">        </span><span class="token punctuation" style="color:#393A34">}</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">      </span><span class="token punctuation" style="color:#393A34">]</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">      </span><span class="token property" style="color:#36acaa">"policy"</span><span class="token operator" style="color:#393A34">:</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">{</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">        </span><span class="token property" style="color:#36acaa">"reference"</span><span class="token operator" style="color:#393A34">:</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">"AccessPolicy/careteam-policy"</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">      </span><span class="token punctuation" style="color:#393A34">}</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token punctuation" style="color:#393A34">}</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token punctuation" style="color:#393A34">{</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">      </span><span class="token property" style="color:#36acaa">"parameter"</span><span class="token operator" style="color:#393A34">:</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">[</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">        </span><span class="token punctuation" style="color:#393A34">{</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">          </span><span class="token property" style="color:#36acaa">"name"</span><span class="token operator" style="color:#393A34">:</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">"care_team"</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">          </span><span class="token property" style="color:#36acaa">"valueReference"</span><span class="token operator" style="color:#393A34">:</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">{</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">            </span><span class="token property" style="color:#36acaa">"reference"</span><span class="token operator" style="color:#393A34">:</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">"CareTeam/hypertension-care-team"</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">            </span><span class="token property" style="color:#36acaa">"display"</span><span class="token operator" style="color:#393A34">:</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">"Hypertension Care Team"</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">          </span><span class="token punctuation" style="color:#393A34">}</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">        </span><span class="token punctuation" style="color:#393A34">}</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">      </span><span class="token punctuation" style="color:#393A34">]</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">      </span><span class="token property" style="color:#36acaa">"policy"</span><span class="token operator" style="color:#393A34">:</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">{</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">        </span><span class="token property" style="color:#36acaa">"reference"</span><span class="token operator" style="color:#393A34">:</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">"AccessPolicy/careteam-policy"</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">      </span><span class="token punctuation" style="color:#393A34">}</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token punctuation" style="color:#393A34">}</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">  </span><span class="token punctuation" style="color:#393A34">]</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token punctuation" style="color:#393A34">}</span><br></span></code></pre></div></div></div></div></div>
<h2 class="anchor anchorTargetStickyNavbar_SAay" id="tenant-isolation-approaches-comparison-table">Tenant Isolation Approaches: Comparison Table<a href="https://www.medplum.com/blog/tenant-isolation-approaches-in-medplum#tenant-isolation-approaches-comparison-table" class="hash-link" aria-label="Direct link to Tenant Isolation Approaches: Comparison Table" title="Direct link to Tenant Isolation Approaches: Comparison Table" translate="no">​</a></h2>
<table><thead><tr><th>Approach</th><th>API-Level Isolation (Enrolled Tenants)</th><th>API-Level Isolation (Per Tenant)</th><th>Application-Level Isolation</th><th>Use Case</th></tr></thead><tbody><tr><td><strong><a href="https://www.medplum.com/blog/tenant-isolation-approaches-in-medplum#option-1-allow-access-to-all-enrolled-tenants" class="">Option 1: All Tenants</a></strong></td><td>Yes</td><td>No</td><td>No</td><td>Cross-tenant visibility acceptable</td></tr><tr><td><strong><a href="https://www.medplum.com/blog/tenant-isolation-approaches-in-medplum#option-2-frontend-level-restriction-with-_compartment" class="">Option 2: <code>_compartment</code> Parameter</a></strong></td><td>Yes</td><td>No</td><td>Yes</td><td>Need UI-level tenant restriction acceptable, API level access to all enrolled tenants</td></tr><tr><td><strong><a href="https://www.medplum.com/blog/tenant-isolation-approaches-in-medplum#option-3-multiple-projectmemberships" class="">Option 3: Multiple Memberships</a></strong></td><td>Yes</td><td>Yes</td><td>Yes</td><td>Need strict API-level tenant isolation</td></tr></tbody></table>
<p><strong>Column Descriptions:</strong></p>
<ul>
<li class="">
<p><strong>API-Level Isolation (All Enrolled Tenants)</strong>: Whether the API restricts access to only the tenants the user is enrolled in via their ProjectMembership.</p>
</li>
<li class="">
<p><strong>API-Level Isolation (Per Tenant)</strong>: Whether the API restricts a User's access to only one tenant at a time, even if the User is enrolled across multiple tenants.</p>
</li>
<li class="">
<p><strong>Application-Level Isolation</strong>: Whether the UI restricts what's displayed to a single tenant.</p>
</li>
</ul>
<h3 class="anchor anchorTargetStickyNavbar_SAay" id="choosing-the-right-approach">Choosing the Right Approach<a href="https://www.medplum.com/blog/tenant-isolation-approaches-in-medplum#choosing-the-right-approach" class="hash-link" aria-label="Direct link to Choosing the Right Approach" title="Direct link to Choosing the Right Approach" translate="no">​</a></h3>
<p><strong>Choose <a href="https://www.medplum.com/blog/tenant-isolation-approaches-in-medplum#option-1-allow-access-to-all-enrolled-tenants" class="">Option 1</a></strong> if cross-tenant visibility is acceptable and you want the simplest implementation.</p>
<p><strong>Choose <a href="https://www.medplum.com/blog/tenant-isolation-approaches-in-medplum#option-2-frontend-level-restriction-with-_compartment" class="">Option 2</a></strong> if you need UI-level tenant isolation but want users to be able to switch between tenants without re-authenticating. This approach maintains API-level access to all tenants and is also able to restrict what's displayed in the UI to only a single tenant at a time. It is much easier to implement <a href="https://www.medplum.com/blog/tenant-isolation-approaches-in-medplum#option-2-frontend-level-restriction-with-_compartment" class="">Option 2</a> than <a href="https://www.medplum.com/blog/tenant-isolation-approaches-in-medplum#option-3-multiple-projectmemberships" class="">Option 3</a>.</p>
<p><strong>Choose <a href="https://www.medplum.com/blog/tenant-isolation-approaches-in-medplum#option-3-multiple-projectmemberships" class="">Option 3</a></strong> if you need strict API-level single tenant access for security or compliance reasons. This is the most secure approach but requires users to sign in separately for each tenant they need to access with a separate ProjectMembership.</p>
<h2 class="anchor anchorTargetStickyNavbar_SAay" id="option-1-allow-access-to-all-enrolled-tenants">Option 1: Allow Access to All Enrolled Tenants<a href="https://www.medplum.com/blog/tenant-isolation-approaches-in-medplum#option-1-allow-access-to-all-enrolled-tenants" class="hash-link" aria-label="Direct link to Option 1: Allow Access to All Enrolled Tenants" title="Direct link to Option 1: Allow Access to All Enrolled Tenants" translate="no">​</a></h2>
<p><strong>Description</strong>: The user can view Patients and resources from all enrolled tenants simultaneously.</p>
<p><strong>Implementation</strong>: No additional restrictions needed. The AccessPolicy already grants access to all enrolled tenants, and your application can display data from all tenants.</p>
<p><strong>Use Case</strong>: This approach works well when cross-tenant visibility is acceptable or desired. <em>For example, a care coordinator who needs to see all patients across multiple clinics they manage.</em></p>
<h2 class="anchor anchorTargetStickyNavbar_SAay" id="option-2-frontend-level-restriction-with-_compartment">Option 2: Frontend-Level Restriction with <code>_compartment</code><a href="https://www.medplum.com/blog/tenant-isolation-approaches-in-medplum#option-2-frontend-level-restriction-with-_compartment" class="hash-link" aria-label="Direct link to option-2-frontend-level-restriction-with-_compartment" title="Direct link to option-2-frontend-level-restriction-with-_compartment" translate="no">​</a></h2>
<p><strong>Description</strong>: Keep the ProjectMembership and AccessPolicy configuration the same, but add the <code>_compartment</code> search parameter to all frontend queries to scope results to a specific tenant. The <code>_compartment</code> search parameter may look familiar because it is used in the AccessPolicy critertia. <strong>We can also use <code>_compartment</code> on the query itself</strong>, in combination with the AccessPolicy criteria, to further restrict the data that is returned to the user to only the data for the currently selected tenant.</p>
<p><strong>Implementation</strong>: At the application level, maintain state for the currently selected tenant, and append <code>_compartment=&lt;current_tenant_ref&gt;</code> to all search queries.</p>
<p><strong>Example:</strong></p>
<div class="language-typescript codeBlockContainer_ZGJx theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_kX1v"><pre tabindex="0" class="prism-code language-typescript codeBlock_TAPP thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_AdAo"><span class="token-line" style="color:#393A34"><span class="token comment" style="color:#999988;font-style:italic">// User selects "Downtown Clinic" in the UI</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token keyword" style="color:#00009f">const</span><span class="token plain"> currentTenant </span><span class="token operator" style="color:#393A34">=</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">'Organization/clinic-a'</span><span class="token punctuation" style="color:#393A34">;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token comment" style="color:#999988;font-style:italic">// All queries include _compartment filter</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token keyword" style="color:#00009f">const</span><span class="token plain"> patients </span><span class="token operator" style="color:#393A34">=</span><span class="token plain"> </span><span class="token keyword" style="color:#00009f">await</span><span class="token plain"> medplum</span><span class="token punctuation" style="color:#393A34">.</span><span class="token function" style="color:#d73a49">search</span><span class="token punctuation" style="color:#393A34">(</span><span class="token string" style="color:#e3116c">'Patient'</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">{</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">  _compartment</span><span class="token operator" style="color:#393A34">:</span><span class="token plain"> currentTenant</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token punctuation" style="color:#393A34">}</span><span class="token punctuation" style="color:#393A34">)</span><span class="token punctuation" style="color:#393A34">;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token keyword" style="color:#00009f">const</span><span class="token plain"> observations </span><span class="token operator" style="color:#393A34">=</span><span class="token plain"> </span><span class="token keyword" style="color:#00009f">await</span><span class="token plain"> medplum</span><span class="token punctuation" style="color:#393A34">.</span><span class="token function" style="color:#d73a49">search</span><span class="token punctuation" style="color:#393A34">(</span><span class="token string" style="color:#e3116c">'Observation'</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">{</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">  _compartment</span><span class="token operator" style="color:#393A34">:</span><span class="token plain"> currentTenant</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token punctuation" style="color:#393A34">}</span><span class="token punctuation" style="color:#393A34">)</span><span class="token punctuation" style="color:#393A34">;</span><br></span></code></pre></div></div>
<p><strong>Use Case</strong>: When you need UI-level tenant isolation but want to maintain API-level access to all tenants. This allows users to switch between tenants in the UI without re-authenticating, while ensuring the UI only displays data from the selected tenant.</p>
<h2 class="anchor anchorTargetStickyNavbar_SAay" id="option-3-multiple-projectmemberships">Option 3: Multiple ProjectMemberships<a href="https://www.medplum.com/blog/tenant-isolation-approaches-in-medplum#option-3-multiple-projectmemberships" class="hash-link" aria-label="Direct link to Option 3: Multiple ProjectMemberships" title="Direct link to Option 3: Multiple ProjectMemberships" translate="no">​</a></h2>
<p><strong>Description</strong>: Create a separate <code>ProjectMembership</code> for each tenant. Each membership has its own AccessPolicy with a single tenant parameter, enforcing isolation at the API level.</p>
<div></div>
<p>Multiple ProjectMemberships is an <strong>advanced Medplum feature</strong>. ProjectMemberships are a crucial part of access control to the Medplum data store and determine what resources a user can read, write, or modify. Misconfiguring ProjectMemberships or AccessPolicies can result in Users being locked out of necessary resources or gaining unauthorized access to data.</p>
<p><strong>Before implementing multiple memberships:</strong></p>
<ul>
<li class="">Thoroughly understand <a class="" href="https://www.medplum.com/docs/access/access-policies">AccessPolicies</a> and how they work</li>
<li class="">Test extensively in a development environment</li>
<li class="">Consider consulting with Medplum support or the community if you're unsure
::</li>
</ul>
<p><strong>Implementation</strong>: Use the <a class="" href="https://www.medplum.com/docs/api/project-admin/invite"><code>/admin/projects/:projectId/invite</code></a> endpoint with <code>forceNewMembership: true</code> to create additional memberships for the same user.</p>
<p>With multiple ProjectMemberships, each membership grants access to only one tenant, ensuring strict API-level isolation:</p>
<div class="theme-tabs-container tabs-container tabList_M0Dn"><ul role="tablist" aria-orientation="horizontal" class="tabs"><li role="tab" tabindex="0" aria-selected="true" class="tabs__item tabItem_ysIP tabs__item--active">Organization</li><li role="tab" tabindex="-1" aria-selected="false" class="tabs__item tabItem_ysIP">HealthcareService</li><li role="tab" tabindex="-1" aria-selected="false" class="tabs__item tabItem_ysIP">CareTeam</li></ul><div class="margin-top--md"><div role="tabpanel" class="tabItem_OMyP"></div><div role="tabpanel" class="tabItem_OMyP" hidden=""></div><div role="tabpanel" class="tabItem_OMyP" hidden=""></div></div></div>
<p><strong>Example:</strong></p>
<div class="theme-tabs-container tabs-container tabList_M0Dn"><ul role="tablist" aria-orientation="horizontal" class="tabs"><li role="tab" tabindex="0" aria-selected="true" class="tabs__item tabItem_ysIP tabs__item--active">Organization</li><li role="tab" tabindex="-1" aria-selected="false" class="tabs__item tabItem_ysIP">HealthcareService</li><li role="tab" tabindex="-1" aria-selected="false" class="tabs__item tabItem_ysIP">CareTeam</li></ul><div class="margin-top--md"><div role="tabpanel" class="tabItem_OMyP"><div class="language-typescript codeBlockContainer_ZGJx theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_kX1v"><pre tabindex="0" class="prism-code language-typescript codeBlock_TAPP thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_AdAo"><span class="token-line" style="color:#393A34"><span class="token comment" style="color:#999988;font-style:italic">// First membership - Downtown Clinic</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token keyword" style="color:#00009f">await</span><span class="token plain"> medplum</span><span class="token punctuation" style="color:#393A34">.</span><span class="token function" style="color:#d73a49">post</span><span class="token punctuation" style="color:#393A34">(</span><span class="token string" style="color:#e3116c">'admin/projects/:projectId/invite'</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">{</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">  resourceType</span><span class="token operator" style="color:#393A34">:</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">'Practitioner'</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">  firstName</span><span class="token operator" style="color:#393A34">:</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">'Jane'</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">  lastName</span><span class="token operator" style="color:#393A34">:</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">'Smith'</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">  email</span><span class="token operator" style="color:#393A34">:</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">'dr.smith@example.com'</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">  password</span><span class="token operator" style="color:#393A34">:</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">'secure-password'</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">  membership</span><span class="token operator" style="color:#393A34">:</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">{</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    access</span><span class="token operator" style="color:#393A34">:</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">[</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">      </span><span class="token punctuation" style="color:#393A34">{</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">        policy</span><span class="token operator" style="color:#393A34">:</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">{</span><span class="token plain"> reference</span><span class="token operator" style="color:#393A34">:</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">'AccessPolicy/mso-policy'</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">}</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">        parameter</span><span class="token operator" style="color:#393A34">:</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">[</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">          </span><span class="token punctuation" style="color:#393A34">{</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">            name</span><span class="token operator" style="color:#393A34">:</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">'organization'</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">            valueReference</span><span class="token operator" style="color:#393A34">:</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">{</span><span class="token plain"> reference</span><span class="token operator" style="color:#393A34">:</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">'Organization/clinic-a'</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">}</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">          </span><span class="token punctuation" style="color:#393A34">}</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">        </span><span class="token punctuation" style="color:#393A34">]</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">      </span><span class="token punctuation" style="color:#393A34">}</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token punctuation" style="color:#393A34">]</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    identifier</span><span class="token operator" style="color:#393A34">:</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">[</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">      </span><span class="token punctuation" style="color:#393A34">{</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">        system</span><span class="token operator" style="color:#393A34">:</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">'https://medplum.com/identifier/label'</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">        value</span><span class="token operator" style="color:#393A34">:</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">'Downtown Clinic'</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">      </span><span class="token punctuation" style="color:#393A34">}</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token punctuation" style="color:#393A34">]</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">  </span><span class="token punctuation" style="color:#393A34">}</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token punctuation" style="color:#393A34">}</span><span class="token punctuation" style="color:#393A34">)</span><span class="token punctuation" style="color:#393A34">;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token comment" style="color:#999988;font-style:italic">// Second membership - Uptown Clinic</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token keyword" style="color:#00009f">await</span><span class="token plain"> medplum</span><span class="token punctuation" style="color:#393A34">.</span><span class="token function" style="color:#d73a49">post</span><span class="token punctuation" style="color:#393A34">(</span><span class="token string" style="color:#e3116c">'admin/projects/:projectId/invite'</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">{</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">  resourceType</span><span class="token operator" style="color:#393A34">:</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">'Practitioner'</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">  firstName</span><span class="token operator" style="color:#393A34">:</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">'Jane'</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">  lastName</span><span class="token operator" style="color:#393A34">:</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">'Smith'</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">  email</span><span class="token operator" style="color:#393A34">:</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">'dr.smith@example.com'</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">  forceNewMembership</span><span class="token operator" style="color:#393A34">:</span><span class="token plain"> </span><span class="token boolean" style="color:#36acaa">true</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain">  </span><span class="token comment" style="color:#999988;font-style:italic">// Required for creating additional membership</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">  membership</span><span class="token operator" style="color:#393A34">:</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">{</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    access</span><span class="token operator" style="color:#393A34">:</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">[</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">      </span><span class="token punctuation" style="color:#393A34">{</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">        policy</span><span class="token operator" style="color:#393A34">:</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">{</span><span class="token plain"> reference</span><span class="token operator" style="color:#393A34">:</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">'AccessPolicy/mso-policy'</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">}</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">        parameter</span><span class="token operator" style="color:#393A34">:</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">[</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">          </span><span class="token punctuation" style="color:#393A34">{</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">            name</span><span class="token operator" style="color:#393A34">:</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">'organization'</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">            valueReference</span><span class="token operator" style="color:#393A34">:</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">{</span><span class="token plain"> reference</span><span class="token operator" style="color:#393A34">:</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">'Organization/clinic-b'</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">}</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">          </span><span class="token punctuation" style="color:#393A34">}</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">        </span><span class="token punctuation" style="color:#393A34">]</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">      </span><span class="token punctuation" style="color:#393A34">}</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token punctuation" style="color:#393A34">]</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    identifier</span><span class="token operator" style="color:#393A34">:</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">[</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">      </span><span class="token punctuation" style="color:#393A34">{</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">        system</span><span class="token operator" style="color:#393A34">:</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">'https://medplum.com/identifier/label'</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">        value</span><span class="token operator" style="color:#393A34">:</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">'Uptown Clinic'</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">      </span><span class="token punctuation" style="color:#393A34">}</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token punctuation" style="color:#393A34">]</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">  </span><span class="token punctuation" style="color:#393A34">}</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token punctuation" style="color:#393A34">}</span><span class="token punctuation" style="color:#393A34">)</span><span class="token punctuation" style="color:#393A34">;</span><br></span></code></pre></div></div></div><div role="tabpanel" class="tabItem_OMyP" hidden=""><div class="language-typescript codeBlockContainer_ZGJx theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_kX1v"><pre tabindex="0" class="prism-code language-typescript codeBlock_TAPP thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_AdAo"><span class="token-line" style="color:#393A34"><span class="token comment" style="color:#999988;font-style:italic">// First membership - Cardiology Service</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token keyword" style="color:#00009f">await</span><span class="token plain"> medplum</span><span class="token punctuation" style="color:#393A34">.</span><span class="token function" style="color:#d73a49">post</span><span class="token punctuation" style="color:#393A34">(</span><span class="token string" style="color:#e3116c">'admin/projects/:projectId/invite'</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">{</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">  resourceType</span><span class="token operator" style="color:#393A34">:</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">'Practitioner'</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">  firstName</span><span class="token operator" style="color:#393A34">:</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">'Jane'</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">  lastName</span><span class="token operator" style="color:#393A34">:</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">'Smith'</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">  email</span><span class="token operator" style="color:#393A34">:</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">'dr.smith@example.com'</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">  password</span><span class="token operator" style="color:#393A34">:</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">'secure-password'</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">  membership</span><span class="token operator" style="color:#393A34">:</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">{</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    access</span><span class="token operator" style="color:#393A34">:</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">[</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">      </span><span class="token punctuation" style="color:#393A34">{</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">        policy</span><span class="token operator" style="color:#393A34">:</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">{</span><span class="token plain"> reference</span><span class="token operator" style="color:#393A34">:</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">'AccessPolicy/service-policy'</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">}</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">        parameter</span><span class="token operator" style="color:#393A34">:</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">[</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">          </span><span class="token punctuation" style="color:#393A34">{</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">            name</span><span class="token operator" style="color:#393A34">:</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">'healthcare_service'</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">            valueReference</span><span class="token operator" style="color:#393A34">:</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">{</span><span class="token plain"> reference</span><span class="token operator" style="color:#393A34">:</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">'HealthcareService/cardiology-service'</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">}</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">          </span><span class="token punctuation" style="color:#393A34">}</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">        </span><span class="token punctuation" style="color:#393A34">]</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">      </span><span class="token punctuation" style="color:#393A34">}</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token punctuation" style="color:#393A34">]</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    identifier</span><span class="token operator" style="color:#393A34">:</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">[</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">      </span><span class="token punctuation" style="color:#393A34">{</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">        system</span><span class="token operator" style="color:#393A34">:</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">'https://medplum.com/identifier/label'</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">        value</span><span class="token operator" style="color:#393A34">:</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">'Cardiology Service'</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">      </span><span class="token punctuation" style="color:#393A34">}</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token punctuation" style="color:#393A34">]</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">  </span><span class="token punctuation" style="color:#393A34">}</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token punctuation" style="color:#393A34">}</span><span class="token punctuation" style="color:#393A34">)</span><span class="token punctuation" style="color:#393A34">;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token comment" style="color:#999988;font-style:italic">// Second membership - Oncology Service</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token keyword" style="color:#00009f">await</span><span class="token plain"> medplum</span><span class="token punctuation" style="color:#393A34">.</span><span class="token function" style="color:#d73a49">post</span><span class="token punctuation" style="color:#393A34">(</span><span class="token string" style="color:#e3116c">'admin/projects/:projectId/invite'</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">{</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">  resourceType</span><span class="token operator" style="color:#393A34">:</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">'Practitioner'</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">  firstName</span><span class="token operator" style="color:#393A34">:</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">'Jane'</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">  lastName</span><span class="token operator" style="color:#393A34">:</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">'Smith'</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">  email</span><span class="token operator" style="color:#393A34">:</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">'dr.smith@example.com'</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">  forceNewMembership</span><span class="token operator" style="color:#393A34">:</span><span class="token plain"> </span><span class="token boolean" style="color:#36acaa">true</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain">  </span><span class="token comment" style="color:#999988;font-style:italic">// Required for creating additional membership</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">  membership</span><span class="token operator" style="color:#393A34">:</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">{</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    access</span><span class="token operator" style="color:#393A34">:</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">[</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">      </span><span class="token punctuation" style="color:#393A34">{</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">        policy</span><span class="token operator" style="color:#393A34">:</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">{</span><span class="token plain"> reference</span><span class="token operator" style="color:#393A34">:</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">'AccessPolicy/service-policy'</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">}</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">        parameter</span><span class="token operator" style="color:#393A34">:</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">[</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">          </span><span class="token punctuation" style="color:#393A34">{</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">            name</span><span class="token operator" style="color:#393A34">:</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">'healthcare_service'</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">            valueReference</span><span class="token operator" style="color:#393A34">:</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">{</span><span class="token plain"> reference</span><span class="token operator" style="color:#393A34">:</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">'HealthcareService/oncology-service'</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">}</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">          </span><span class="token punctuation" style="color:#393A34">}</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">        </span><span class="token punctuation" style="color:#393A34">]</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">      </span><span class="token punctuation" style="color:#393A34">}</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token punctuation" style="color:#393A34">]</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    identifier</span><span class="token operator" style="color:#393A34">:</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">[</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">      </span><span class="token punctuation" style="color:#393A34">{</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">        system</span><span class="token operator" style="color:#393A34">:</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">'https://medplum.com/identifier/label'</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">        value</span><span class="token operator" style="color:#393A34">:</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">'Oncology Service'</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">      </span><span class="token punctuation" style="color:#393A34">}</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token punctuation" style="color:#393A34">]</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">  </span><span class="token punctuation" style="color:#393A34">}</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token punctuation" style="color:#393A34">}</span><span class="token punctuation" style="color:#393A34">)</span><span class="token punctuation" style="color:#393A34">;</span><br></span></code></pre></div></div></div><div role="tabpanel" class="tabItem_OMyP" hidden=""><div class="language-typescript codeBlockContainer_ZGJx theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_kX1v"><pre tabindex="0" class="prism-code language-typescript codeBlock_TAPP thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_AdAo"><span class="token-line" style="color:#393A34"><span class="token comment" style="color:#999988;font-style:italic">// First membership - Diabetes Care Team</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token keyword" style="color:#00009f">await</span><span class="token plain"> medplum</span><span class="token punctuation" style="color:#393A34">.</span><span class="token function" style="color:#d73a49">post</span><span class="token punctuation" style="color:#393A34">(</span><span class="token string" style="color:#e3116c">'admin/projects/:projectId/invite'</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">{</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">  resourceType</span><span class="token operator" style="color:#393A34">:</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">'Practitioner'</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">  firstName</span><span class="token operator" style="color:#393A34">:</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">'Jane'</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">  lastName</span><span class="token operator" style="color:#393A34">:</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">'Smith'</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">  email</span><span class="token operator" style="color:#393A34">:</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">'dr.smith@example.com'</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">  password</span><span class="token operator" style="color:#393A34">:</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">'secure-password'</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">  membership</span><span class="token operator" style="color:#393A34">:</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">{</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    access</span><span class="token operator" style="color:#393A34">:</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">[</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">      </span><span class="token punctuation" style="color:#393A34">{</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">        policy</span><span class="token operator" style="color:#393A34">:</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">{</span><span class="token plain"> reference</span><span class="token operator" style="color:#393A34">:</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">'AccessPolicy/careteam-policy'</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">}</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">        parameter</span><span class="token operator" style="color:#393A34">:</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">[</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">          </span><span class="token punctuation" style="color:#393A34">{</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">            name</span><span class="token operator" style="color:#393A34">:</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">'care_team'</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">            valueReference</span><span class="token operator" style="color:#393A34">:</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">{</span><span class="token plain"> reference</span><span class="token operator" style="color:#393A34">:</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">'CareTeam/diabetes-care-team'</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">}</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">          </span><span class="token punctuation" style="color:#393A34">}</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">        </span><span class="token punctuation" style="color:#393A34">]</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">      </span><span class="token punctuation" style="color:#393A34">}</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token punctuation" style="color:#393A34">]</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    identifier</span><span class="token operator" style="color:#393A34">:</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">[</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">      </span><span class="token punctuation" style="color:#393A34">{</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">        system</span><span class="token operator" style="color:#393A34">:</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">'https://medplum.com/identifier/label'</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">        value</span><span class="token operator" style="color:#393A34">:</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">'Diabetes Care Team'</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">      </span><span class="token punctuation" style="color:#393A34">}</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token punctuation" style="color:#393A34">]</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">  </span><span class="token punctuation" style="color:#393A34">}</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token punctuation" style="color:#393A34">}</span><span class="token punctuation" style="color:#393A34">)</span><span class="token punctuation" style="color:#393A34">;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token comment" style="color:#999988;font-style:italic">// Second membership - Hypertension Care Team</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token keyword" style="color:#00009f">await</span><span class="token plain"> medplum</span><span class="token punctuation" style="color:#393A34">.</span><span class="token function" style="color:#d73a49">post</span><span class="token punctuation" style="color:#393A34">(</span><span class="token string" style="color:#e3116c">'admin/projects/:projectId/invite'</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">{</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">  resourceType</span><span class="token operator" style="color:#393A34">:</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">'Practitioner'</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">  firstName</span><span class="token operator" style="color:#393A34">:</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">'Jane'</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">  lastName</span><span class="token operator" style="color:#393A34">:</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">'Smith'</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">  email</span><span class="token operator" style="color:#393A34">:</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">'dr.smith@example.com'</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">  forceNewMembership</span><span class="token operator" style="color:#393A34">:</span><span class="token plain"> </span><span class="token boolean" style="color:#36acaa">true</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain">  </span><span class="token comment" style="color:#999988;font-style:italic">// Required for creating additional membership</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">  membership</span><span class="token operator" style="color:#393A34">:</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">{</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    access</span><span class="token operator" style="color:#393A34">:</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">[</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">      </span><span class="token punctuation" style="color:#393A34">{</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">        policy</span><span class="token operator" style="color:#393A34">:</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">{</span><span class="token plain"> reference</span><span class="token operator" style="color:#393A34">:</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">'AccessPolicy/careteam-policy'</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">}</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">        parameter</span><span class="token operator" style="color:#393A34">:</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">[</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">          </span><span class="token punctuation" style="color:#393A34">{</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">            name</span><span class="token operator" style="color:#393A34">:</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">'care_team'</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">            valueReference</span><span class="token operator" style="color:#393A34">:</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">{</span><span class="token plain"> reference</span><span class="token operator" style="color:#393A34">:</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">'CareTeam/hypertension-care-team'</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">}</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">          </span><span class="token punctuation" style="color:#393A34">}</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">        </span><span class="token punctuation" style="color:#393A34">]</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">      </span><span class="token punctuation" style="color:#393A34">}</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token punctuation" style="color:#393A34">]</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    identifier</span><span class="token operator" style="color:#393A34">:</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">[</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">      </span><span class="token punctuation" style="color:#393A34">{</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">        system</span><span class="token operator" style="color:#393A34">:</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">'https://medplum.com/identifier/label'</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">        value</span><span class="token operator" style="color:#393A34">:</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">'Hypertension Care Team'</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">      </span><span class="token punctuation" style="color:#393A34">}</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token punctuation" style="color:#393A34">]</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">  </span><span class="token punctuation" style="color:#393A34">}</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token punctuation" style="color:#393A34">}</span><span class="token punctuation" style="color:#393A34">)</span><span class="token punctuation" style="color:#393A34">;</span><br></span></code></pre></div></div></div></div></div>
<p><strong>Sign-In Flow</strong>: When a user with multiple ProjectMemberships signs in, Medplum automatically prompts them to choose which membership to use for their session. Each membership can have a custom label (via the <code>https://medplum.com/identifier/label</code> identifier system) to help users distinguish between them.</p>
<p><img decoding="async" loading="lazy" alt="Medplum Multiple ProjectMemberships Sign-In Screenshot" src="https://www.medplum.com/assets/images/multiple-project-memberships-signin-6c3ebcd4e636ebd416998f60214eaa1b.png" width="892" height="407" class="img__Ss2"></p>
<p><strong>Use Case</strong>: When you need strict API-level tenant isolation. This ensures that once authenticated, the user's API access is limited to only the selected tenant's data. This is the most secure approach and is ideal for scenarios where regulatory requirements or organizational policies mandate strict data isolation.</p>]]></content:encoded>
            <category>tenant</category>
            <category>access-control</category>
            <category>mso</category>
        </item>
        <item>
            <title><![CDATA[Terminology Service Updates in Medplum v5]]></title>
            <link>https://www.medplum.com/blog/v5-terminology</link>
            <guid>https://www.medplum.com/blog/v5-terminology</guid>
            <pubDate>Thu, 06 Nov 2025 00:00:00 GMT</pubDate>
            <description><![CDATA[As part of the Medplum v5 release, we've been hard at work delivering several key improvements to our]]></description>
            <content:encoded><![CDATA[<p>As part of the <a class="" href="https://www.medplum.com/blog/v5-release">Medplum v5 release</a>, we've been hard at work delivering several key improvements to our
<a href="https://hl7.org/fhir/R4/terminology-service.html" target="_blank" rel="noopener noreferrer" class="">FHIR Terminology Services</a>, which power Medplum's rich features for handling coded values:</p>
<ul>
<li class=""><a href="https://github.com/medplum/medplum/pull/7151" target="_blank" rel="noopener noreferrer" class="">Supporting synonyms</a> in <code>ValueSet/$expand</code>, allowing users to find codes by a number of different search terms</li>
<li class=""><a href="https://github.com/medplum/medplum/pull/7579" target="_blank" rel="noopener noreferrer" class="">Scaling our implementation</a> of the <code>ConceptMap/$translate</code> operation to handle maps with over a million entries</li>
<li class="">Updating our library of UMLS code systems with their <a href="https://www.nlm.nih.gov/research/umls/knowledge_sources/metathesaurus/release/notes.html" target="_blank" rel="noopener noreferrer" class="">latest release</a>, including several new code
systems around medications and supplements and a mapping between related code systems and RxNorm</li>
<li class="">A collection of <a href="https://github.com/medplum/medplum/pull/7010" target="_blank" rel="noopener noreferrer" class="">performance enhancements</a> that <a href="https://github.com/medplum/medplum/pull/7570" target="_blank" rel="noopener noreferrer" class="">speed up ValueSet expansion</a> and
<a href="https://github.com/medplum/medplum/pull/7571" target="_blank" rel="noopener noreferrer" class="">code validation</a> by a significant margin</li>
<li class="">(In beta) The option to <a href="https://github.com/medplum/medplum/pull/7666" target="_blank" rel="noopener noreferrer" class="">validate all required terminology bindings</a> in resources on write</li>
</ul>
<p>Below we'll discuss each of these changes in more detail and give examples of the features available in
Medplum's Terminology Services today.</p>
<h2 class="anchor anchorTargetStickyNavbar_SAay" id="coding-synonyms">Coding Synonyms<a href="https://www.medplum.com/blog/v5-terminology#coding-synonyms" class="hash-link" aria-label="Direct link to Coding Synonyms" title="Direct link to Coding Synonyms" translate="no">​</a></h2>
<p>Many codes are known by multiple different related names or terms, and users may use different search terms in different
contexts when trying to find the right code for a clinical concept. For example, consider a provider populating
information about a patient allergy, who wants to fill in the <a href="https://hl7.org/fhir/R4/allergyintolerance-definitions.html#AllergyIntolerance.reaction.manifestation" target="_blank" rel="noopener noreferrer" class=""><code>AllergyIntolerance.reaction.manifestation</code> field</a>
with the SNOMED CT® code for hives using the <a href="https://hl7.org/fhir/R4/valueset-clinical-findings.html" target="_blank" rel="noopener noreferrer" class="">Clinical Findings ValueSet</a>. The relevant code in
SNOMED is <code>247472004</code>, but its display string is "Wheal (finding)" — not "hives"! If the user doesn't know the more
technical term, finding the correct code would be difficult.</p>
<p>Fortunately, most code systems record multiple names (synonyms) for their codes. These are stored as metadata properties
on the coding, which can be seen by <a class="" href="https://www.medplum.com/docs/api/fhir/operations/codesystem-lookup">looking up the code</a>:</p>
<div class="language-json codeBlockContainer_ZGJx theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_kX1v"><pre tabindex="0" class="prism-code language-json codeBlock_TAPP thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_AdAo"><span class="token-line" style="color:#393A34"><span class="token punctuation" style="color:#393A34">{</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">  </span><span class="token property" style="color:#36acaa">"resourceType"</span><span class="token operator" style="color:#393A34">:</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">"Parameters"</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">  </span><span class="token property" style="color:#36acaa">"parameter"</span><span class="token operator" style="color:#393A34">:</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">[</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token punctuation" style="color:#393A34">{</span><span class="token plain"> </span><span class="token property" style="color:#36acaa">"name"</span><span class="token operator" style="color:#393A34">:</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">"name"</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> </span><span class="token property" style="color:#36acaa">"valueString"</span><span class="token operator" style="color:#393A34">:</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">"SNOMED CT (US Edition)"</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">}</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token punctuation" style="color:#393A34">{</span><span class="token plain"> </span><span class="token property" style="color:#36acaa">"name"</span><span class="token operator" style="color:#393A34">:</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">"display"</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> </span><span class="token property" style="color:#36acaa">"valueString"</span><span class="token operator" style="color:#393A34">:</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">"Wheal (finding)"</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">}</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token punctuation" style="color:#393A34">{</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">      </span><span class="token property" style="color:#36acaa">"name"</span><span class="token operator" style="color:#393A34">:</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">"property"</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">      </span><span class="token property" style="color:#36acaa">"part"</span><span class="token operator" style="color:#393A34">:</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">[</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">        </span><span class="token punctuation" style="color:#393A34">{</span><span class="token plain"> </span><span class="token property" style="color:#36acaa">"name"</span><span class="token operator" style="color:#393A34">:</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">"code"</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> </span><span class="token property" style="color:#36acaa">"valueCode"</span><span class="token operator" style="color:#393A34">:</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">"SY"</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">}</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">        </span><span class="token punctuation" style="color:#393A34">{</span><span class="token plain"> </span><span class="token property" style="color:#36acaa">"name"</span><span class="token operator" style="color:#393A34">:</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">"value"</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> </span><span class="token property" style="color:#36acaa">"valueString"</span><span class="token operator" style="color:#393A34">:</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">"Hives"</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">}</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">      </span><span class="token punctuation" style="color:#393A34">]</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token punctuation" style="color:#393A34">}</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token punctuation" style="color:#393A34">{</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">      </span><span class="token property" style="color:#36acaa">"name"</span><span class="token operator" style="color:#393A34">:</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">"property"</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">      </span><span class="token property" style="color:#36acaa">"part"</span><span class="token operator" style="color:#393A34">:</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">[</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">        </span><span class="token punctuation" style="color:#393A34">{</span><span class="token plain"> </span><span class="token property" style="color:#36acaa">"name"</span><span class="token operator" style="color:#393A34">:</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">"code"</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> </span><span class="token property" style="color:#36acaa">"valueCode"</span><span class="token operator" style="color:#393A34">:</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">"SY"</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">}</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">        </span><span class="token punctuation" style="color:#393A34">{</span><span class="token plain"> </span><span class="token property" style="color:#36acaa">"name"</span><span class="token operator" style="color:#393A34">:</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">"value"</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> </span><span class="token property" style="color:#36acaa">"valueString"</span><span class="token operator" style="color:#393A34">:</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">"Urticarial rash"</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">}</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">      </span><span class="token punctuation" style="color:#393A34">]</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token punctuation" style="color:#393A34">}</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token punctuation" style="color:#393A34">{</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">      </span><span class="token property" style="color:#36acaa">"name"</span><span class="token operator" style="color:#393A34">:</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">"property"</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">      </span><span class="token property" style="color:#36acaa">"part"</span><span class="token operator" style="color:#393A34">:</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">[</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">        </span><span class="token punctuation" style="color:#393A34">{</span><span class="token plain"> </span><span class="token property" style="color:#36acaa">"name"</span><span class="token operator" style="color:#393A34">:</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">"code"</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> </span><span class="token property" style="color:#36acaa">"valueCode"</span><span class="token operator" style="color:#393A34">:</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">"SY"</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">}</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">        </span><span class="token punctuation" style="color:#393A34">{</span><span class="token plain"> </span><span class="token property" style="color:#36acaa">"name"</span><span class="token operator" style="color:#393A34">:</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">"value"</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> </span><span class="token property" style="color:#36acaa">"valueString"</span><span class="token operator" style="color:#393A34">:</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">"Welt"</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">}</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">      </span><span class="token punctuation" style="color:#393A34">]</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token punctuation" style="color:#393A34">}</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token punctuation" style="color:#393A34">{</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">      </span><span class="token property" style="color:#36acaa">"name"</span><span class="token operator" style="color:#393A34">:</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">"property"</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">      </span><span class="token property" style="color:#36acaa">"part"</span><span class="token operator" style="color:#393A34">:</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">[</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">        </span><span class="token punctuation" style="color:#393A34">{</span><span class="token plain"> </span><span class="token property" style="color:#36acaa">"name"</span><span class="token operator" style="color:#393A34">:</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">"code"</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> </span><span class="token property" style="color:#36acaa">"valueCode"</span><span class="token operator" style="color:#393A34">:</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">"SY"</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">}</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">        </span><span class="token punctuation" style="color:#393A34">{</span><span class="token plain"> </span><span class="token property" style="color:#36acaa">"name"</span><span class="token operator" style="color:#393A34">:</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">"value"</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> </span><span class="token property" style="color:#36acaa">"valueString"</span><span class="token operator" style="color:#393A34">:</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">"Weal"</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">}</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">      </span><span class="token punctuation" style="color:#393A34">]</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token punctuation" style="color:#393A34">}</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token punctuation" style="color:#393A34">{</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">      </span><span class="token property" style="color:#36acaa">"name"</span><span class="token operator" style="color:#393A34">:</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">"property"</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">      </span><span class="token property" style="color:#36acaa">"part"</span><span class="token operator" style="color:#393A34">:</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">[</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">        </span><span class="token punctuation" style="color:#393A34">{</span><span class="token plain"> </span><span class="token property" style="color:#36acaa">"name"</span><span class="token operator" style="color:#393A34">:</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">"code"</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> </span><span class="token property" style="color:#36acaa">"valueCode"</span><span class="token operator" style="color:#393A34">:</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">"SY"</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">}</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">        </span><span class="token punctuation" style="color:#393A34">{</span><span class="token plain"> </span><span class="token property" style="color:#36acaa">"name"</span><span class="token operator" style="color:#393A34">:</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">"value"</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> </span><span class="token property" style="color:#36acaa">"valueString"</span><span class="token operator" style="color:#393A34">:</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">"Nettle rash"</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">}</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">      </span><span class="token punctuation" style="color:#393A34">]</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token punctuation" style="color:#393A34">}</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token comment" style="color:#999988;font-style:italic">// ...</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">  </span><span class="token punctuation" style="color:#393A34">]</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token punctuation" style="color:#393A34">}</span><br></span></code></pre></div></div>
<p>Medplum now supports searching against these synonyms in addition to the primary display string when searching with the
<code>filter</code> parameter of the <a class="" href="https://www.medplum.com/docs/api/fhir/operations/valueset-expand"><code>ValueSet/$expand</code> operation</a>. Specifically, any coding properties with a
special <a href="https://hl7.org/fhir/R4/codesystem-definitions.html#CodeSystem.property.uri" target="_blank" rel="noopener noreferrer" class=""><code>uri</code> value</a> of <code>http://hl7.org/fhir/concept-properties#synonym</code> will be indexed for search as a
synonym for the given code. The <code>SY</code> property shown above is defined in the corresponding <code>CodeSystem</code> resource:</p>
<div class="language-json codeBlockContainer_ZGJx theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_kX1v"><pre tabindex="0" class="prism-code language-json codeBlock_TAPP thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_AdAo"><span class="token-line" style="color:#393A34"><span class="token punctuation" style="color:#393A34">{</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">  </span><span class="token property" style="color:#36acaa">"code"</span><span class="token operator" style="color:#393A34">:</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">"SY"</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">  </span><span class="token property" style="color:#36acaa">"type"</span><span class="token operator" style="color:#393A34">:</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">"string"</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">  </span><span class="token property" style="color:#36acaa">"description"</span><span class="token operator" style="color:#393A34">:</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">"Designated synonym"</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">  </span><span class="token comment" style="color:#999988;font-style:italic">// Properties with this `uri` will have their values included when searching for codes</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">  </span><span class="token property" style="color:#36acaa">"uri"</span><span class="token operator" style="color:#393A34">:</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">"http://hl7.org/fhir/concept-properties#synonym"</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token punctuation" style="color:#393A34">}</span><br></span></code></pre></div></div>
<p>You can see the feature working as intended below, using Medplum's <a href="https://storybook.medplum.com/?path=/story/medplum-codeableconceptinput--basic" target="_blank" rel="noopener noreferrer" class=""><code>&lt;CodeableConceptInput&gt;</code> React component</a>:</p>
<p><img decoding="async" loading="lazy" alt="A user types &amp;quot;hives&amp;quot; into a search field, and the corresponding SNOMED code is displayed" src="https://www.medplum.com/assets/images/hives-synonym-34d2fa076706ddb778416f1619ca017f.gif" width="1854" height="894" class="img__Ss2"></p>
<h2 class="anchor anchorTargetStickyNavbar_SAay" id="scalable-concept-mapping">Scalable Concept Mapping<a href="https://www.medplum.com/blog/v5-terminology#scalable-concept-mapping" class="hash-link" aria-label="Direct link to Scalable Concept Mapping" title="Direct link to Scalable Concept Mapping" translate="no">​</a></h2>
<p>Some of the largest code systems in common clinical use contain hundreds of thousands of different codes, and mappings
between them also operate on that scale. Our existing implementation of the <a class="" href="https://www.medplum.com/docs/api/fhir/operations/conceptmap-translate"><code>ConceptMap/$translate</code></a>
operation relied on the data present inside the <code>ConceptMap</code> JSON, which limited the number of mappings that could
be supported to the amount that would fit in a single resource.</p>
<p>To enable large mappings between complex code systems, we rebuilt our system for handling <code>ConceptMap</code> resources from
the ground up. Existing mappings contained in the resource JSON were indexed into an optimized lookup table, and we
added a new <code>ConceptMap/$import</code> endpoint similar to the <a class="" href="https://www.medplum.com/docs/api/fhir/operations/codesystem-import">one for CodeSystems</a> to facilitate loading
maps with a million entries or more into the system.</p>
<p>For example, we can query a large map of drugs from many different code systems to get their corresponding RxNorm code:</p>
<div class="language-bash codeBlockContainer_ZGJx theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_kX1v"><pre tabindex="0" class="prism-code language-bash codeBlock_TAPP thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_AdAo"><span class="token-line" style="color:#393A34"><span class="token plain">$ curl -H "Authorization: Bearer $ACCESS_TOKEN" \</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">  'https://api.medplum.com/fhir/R4/ConceptMap/$translate?url=$RXNORM&amp;system=http://snomed.info/sct&amp;code=9500005'</span><br></span></code></pre></div></div>
<div class="language-json codeBlockContainer_ZGJx theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_kX1v"><pre tabindex="0" class="prism-code language-json codeBlock_TAPP thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_AdAo"><span class="token-line" style="color:#393A34"><span class="token punctuation" style="color:#393A34">{</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">  </span><span class="token property" style="color:#36acaa">"resourceType"</span><span class="token operator" style="color:#393A34">:</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">"Parameters"</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">  </span><span class="token property" style="color:#36acaa">"parameter"</span><span class="token operator" style="color:#393A34">:</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">[</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token punctuation" style="color:#393A34">{</span><span class="token plain"> </span><span class="token property" style="color:#36acaa">"name"</span><span class="token operator" style="color:#393A34">:</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">"result"</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> </span><span class="token property" style="color:#36acaa">"valueBoolean"</span><span class="token operator" style="color:#393A34">:</span><span class="token plain"> </span><span class="token boolean" style="color:#36acaa">true</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">}</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token punctuation" style="color:#393A34">{</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">      </span><span class="token property" style="color:#36acaa">"name"</span><span class="token operator" style="color:#393A34">:</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">"match"</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">      </span><span class="token property" style="color:#36acaa">"part"</span><span class="token operator" style="color:#393A34">:</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">[</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">        </span><span class="token punctuation" style="color:#393A34">{</span><span class="token plain"> </span><span class="token property" style="color:#36acaa">"name"</span><span class="token operator" style="color:#393A34">:</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">"equivalence"</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> </span><span class="token property" style="color:#36acaa">"valueCode"</span><span class="token operator" style="color:#393A34">:</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">"equivalent"</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">}</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">        </span><span class="token punctuation" style="color:#393A34">{</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">          </span><span class="token property" style="color:#36acaa">"name"</span><span class="token operator" style="color:#393A34">:</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">"concept"</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">          </span><span class="token property" style="color:#36acaa">"valueCoding"</span><span class="token operator" style="color:#393A34">:</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">{</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">            </span><span class="token property" style="color:#36acaa">"system"</span><span class="token operator" style="color:#393A34">:</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">"http://www.nlm.nih.gov/research/umls/rxnorm"</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">            </span><span class="token property" style="color:#36acaa">"code"</span><span class="token operator" style="color:#393A34">:</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">"8123"</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">          </span><span class="token punctuation" style="color:#393A34">}</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">        </span><span class="token punctuation" style="color:#393A34">}</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">      </span><span class="token punctuation" style="color:#393A34">]</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token punctuation" style="color:#393A34">}</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">  </span><span class="token punctuation" style="color:#393A34">]</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token punctuation" style="color:#393A34">}</span><br></span></code></pre></div></div>
<p>Our Postgres database is able to serve translations like this robustly, with a typical request executing in just
10 – 50 ms on our server! The ability to convert codes efficiently from one system to another is expected to be a
foundational capability for supporting cross-coding and partner integrations at scale in the future.</p>
<p>This development paves the way for us to support complex mappings between large, commonly-used code systems. Next on our
roadmap for this feature is to ingest the entire <a href="https://www.nlm.nih.gov/research/umls/mapping_projects/snomedct_to_icd10cm.html" target="_blank" rel="noopener noreferrer" class="">SNOMED to ICD-10</a> mapping and make it available to
customers for testing. This map is both large (~250,000 entries) and complex, containing dependency requirements and
descriptive notes that ensure codes are mapped correctly in context.</p>
<h2 class="anchor anchorTargetStickyNavbar_SAay" id="updated-umls-library-with-2025aa-release">Updated UMLS Library with 2025AA Release<a href="https://www.medplum.com/blog/v5-terminology#updated-umls-library-with-2025aa-release" class="hash-link" aria-label="Direct link to Updated UMLS Library with 2025AA Release" title="Direct link to Updated UMLS Library with 2025AA Release" translate="no">​</a></h2>
<p>Medplum maintains a library of full code systems imported from the semiannual <a href="https://www.nlm.nih.gov/research/umls/knowledge_sources/metathesaurus/release/notes.html" target="_blank" rel="noopener noreferrer" class="">UMLS releases</a>, which
includes several widely-used systems like SNOMED CT, ICD-10, and LOINC. We've created an updated version of the library
from the latest release (2025AA), containing over 10,000 new codes and several new code systems:</p>
<ul>
<li class=""><a href="http://www.fdbhealth.com/fdb-medknowledge/" target="_blank" rel="noopener noreferrer" class="">FDB MedKnowledge</a></li>
<li class=""><a href="https://www.elsevier.com/solutions/drug-database" target="_blank" rel="noopener noreferrer" class="">Gold Standard Drug Database</a></li>
<li class=""><a href="http://www.fda.gov/ForIndustry/DataStandards/StructuredProductLabeling/default.htm" target="_blank" rel="noopener noreferrer" class="">FDA Structured Product Labels</a> for drugs and active substances</li>
<li class=""><a href="https://www2a.cdc.gov/vaccines/iis/iisstandards/vaccines.asp?rpt=mvx" target="_blank" rel="noopener noreferrer" class="">Manufacturers of Vaccines</a></li>
<li class=""><a href="https://www.nlm.nih.gov/mesh/" target="_blank" rel="noopener noreferrer" class="">Medical Subject Headings (MeSH)</a></li>
</ul>
<p>In tandem with the updates to scale <code>ConceptMap/$translate</code> described above, the mapping of several
<a href="https://www.nlm.nih.gov/research/umls/rxnorm/docs/techdoc.html#s3_1" target="_blank" rel="noopener noreferrer" class="">medication terminologies to RxNorm</a> was extracted from the UMLS data set. This ConceptMap,
containing about a quarter million mappings, was used as the foundation of our testing for the changes to <code>ConceptMap</code>.
The following code systems are currently mapped in whole or part to RxNorm via this resource:</p>
<ul>
<li class="">CVX (vaccines)</li>
<li class="">Gold Standard (drugs)</li>
<li class="">MeSH (drugs and substances subset)</li>
<li class="">FDA Structured Product Labels (drugs)</li>
<li class="">FDB MedKnowledge (drugs)</li>
<li class="">SNOMED CT (drugs subset)</li>
</ul>
<p>Contact <a href="mailto:support@medplum.com" target="_blank" rel="noopener noreferrer" class="">support@medplum.com</a> for access to the updated 2025AA release resources, in either
our hosted cluster or your own self-hosted install.</p>
<h2 class="anchor anchorTargetStickyNavbar_SAay" id="valueset-performance-improvements">ValueSet Performance Improvements<a href="https://www.medplum.com/blog/v5-terminology#valueset-performance-improvements" class="hash-link" aria-label="Direct link to ValueSet Performance Improvements" title="Direct link to ValueSet Performance Improvements" translate="no">​</a></h2>
<p>Expanding a ValueSet to find matching codes is the most common terminology operation on Medplum: every time a user
uses an autocomplete to fill in a coded value, the relevant ValueSet definition is being queried and filtered to provide
them with a list of matching options. However, the database queries to power the autocomplete expansion can and often
do contain complicated recursive joins in combination with text filters to find all the correct codes. While working on
some of the other features listed here, we noticed a few ways to improve the relevant SQL queries. We were able to
significantly boost performance across multiple terminology operations by combining a few different optimizations:</p>
<ol>
<li class="">Improving index usage for text filters</li>
<li class="">Updating indexes on coding properties</li>
<li class="">Preloading property IDs to eliminate a JOIN</li>
</ol>
<p>By replacing conditions of the form <code>LOWER(display) LIKE '%filtertext%'</code> with the equivalent <code>display ILIKE '%filtertext%'</code>,
we enabled better use of existing indexes in our lookup tables and made text search in <code>ValueSet/$expand</code> more efficient.</p>
<p>Since many terminology queries also involve property metadata (for example, to determine whether one code is a child of
another), optimizing that part of our database queries had the potential to impact multiple different operations including
code validation. With a combination of minor changes to our query structure, and updates to our lookup table indexes,
we were able to make these queries up to 20x faster!</p>
<p>The effect these changes had was dramatic: the median latency for our <code>ValueSet/$expand</code> operation improved by 95%, as
shown below (endpoint latency in milliseconds):</p>
<p><strong>Before</strong></p>
<p><img decoding="async" loading="lazy" alt="Graph of endpoint latency with values around 450 ms" src="https://www.medplum.com/assets/images/vs-expand-before-dc6fd8ee12e69bf12f0883afefc0d0dc.png" width="1636" height="822" class="img__Ss2"></p>
<p><strong>After</strong></p>
<p><img decoding="async" loading="lazy" alt="Graph of endpoint latency with values under 50 ms" src="https://www.medplum.com/assets/images/vs-expand-after-288cc484d905600a31d45e4c02fd882b.png" width="1596" height="816" class="img__Ss2"></p>
<h2 class="anchor anchorTargetStickyNavbar_SAay" id="terminology-validation">Terminology Validation<a href="https://www.medplum.com/blog/v5-terminology#terminology-validation" class="hash-link" aria-label="Direct link to Terminology Validation" title="Direct link to Terminology Validation" translate="no">​</a></h2>
<p>Last but not least, we've finally unlocked a long-requested feature: validating all terminology requirements for
FHIR resources on write. Most resources contain some coded values, and the FHIR specification or a custom resource
profile can require that those values are drawn from a specific allowed set. Medplum server now includes the option to
check that any <code>required</code> <a href="https://hl7.org/fhir/R4/terminologies.html#binding" target="_blank" rel="noopener noreferrer" class="">terminology bindings</a> are satisfied in resources being written to the
server. Since this involves potentially tens of <a class="" href="https://www.medplum.com/docs/api/fhir/operations/valueset-validate-code">validation queries</a> to the terminology service per
resource, all the performance work we did over the past few months was instrumental in making it possible.</p>
<p>By enabling the <code>validate-terminology</code> feature for your Project, you can opt into the new validation process. It
provides assurance that your data is fully compliant with the FHIR specification, and maximizes the interoperability of
data stored in Medplum. This does come with a small performance cost to perform the validation, but we will be
continuing to monitor and optimize this functionality in the coming months.</p>
<p>If you're interested in helping us test out terminology validation in your development or staging Project, contact
<a href="mailto:support@medplum.com" target="_blank" rel="noopener noreferrer" class="">support@medplum.com</a> to have the feature enabled. If you operate a self-hosted cluster,
you will need to upgrade to Medplum v5 before the feature will be available.</p>]]></content:encoded>
            <category>fhir-datastore</category>
        </item>
        <item>
            <title><![CDATA[Medplum v5 is Released]]></title>
            <link>https://www.medplum.com/blog/v5-release</link>
            <guid>https://www.medplum.com/blog/v5-release</guid>
            <pubDate>Mon, 27 Oct 2025 00:00:00 GMT</pubDate>
            <description><![CDATA[We are pleased to announce the Release of Medplum v5, the next major version of the open source healthcare developer platform.]]></description>
            <content:encoded><![CDATA[<p>We are pleased to announce the <strong>Release of Medplum v5</strong>, the next major version of the open source healthcare developer platform.</p>
<p>As outlined in our <a class="" href="https://www.medplum.com/blog/preparing-for-v5">preparatory post in May</a>, Medplum v5 represents a comprehensive and necessary modernization of our core stack. This release ensures our platform maintains the highest standards of <strong>performance, security, and developer experience</strong> by aligning with the latest stable versions of our critical runtime and tooling dependencies.</p>
<p>As with all major releases, our goal is to provide a <strong>stable, predictable, and future-proof</strong> platform for building healthcare solutions.</p>
<h2 class="anchor anchorTargetStickyNavbar_SAay" id="core-platform-modernization">Core Platform Modernization<a href="https://www.medplum.com/blog/v5-release#core-platform-modernization" class="hash-link" aria-label="Direct link to Core Platform Modernization" title="Direct link to Core Platform Modernization" translate="no">​</a></h2>
<p>The bulk of the work in v5 involved essential dependency upgrades and technical debt reduction.</p>
<h3 class="anchor anchorTargetStickyNavbar_SAay" id="runtime-and-infrastructure">Runtime and Infrastructure<a href="https://www.medplum.com/blog/v5-release#runtime-and-infrastructure" class="hash-link" aria-label="Direct link to Runtime and Infrastructure" title="Direct link to Runtime and Infrastructure" translate="no">​</a></h3>
<p>Medplum v5 now requires and is rigorously tested against modern runtime environments:</p>
<ul>
<li class=""><strong>Node.js</strong>: We have deprecated Node 20 and now continuously test on <strong>Node 22 and 24</strong>. This upgrade enables access to the latest JavaScript features and performance improvements, including Node 22's Maglev compiler.</li>
<li class=""><strong>PostgreSQL</strong>: We have ended support for Postgres 13 and now continuously test on <strong>Postgres 14 and 18</strong>. Users benefit from major database performance features, such as Postgres 18's asynchronous I/O subsystem.</li>
<li class=""><strong>Redis</strong>: Support for Redis 6 has been dropped; we now continuously test on <strong>Redis 7</strong>.</li>
</ul>
<h2 class="anchor anchorTargetStickyNavbar_SAay" id="new-capabilities">New Capabilities<a href="https://www.medplum.com/blog/v5-release#new-capabilities" class="hash-link" aria-label="Direct link to New Capabilities" title="Direct link to New Capabilities" translate="no">​</a></h2>
<p>We are excited to release several major new features in Medplum v5:</p>
<ol>
<li class=""><strong>Full FHIR Terminology Validation</strong>. Medplum now includes comprehensive, built-in terminology support covering major code systems like <strong>SNOMED, ICD, CPT, and others</strong>. Crucially, this functionality also includes <strong>hierarchy support</strong> (e.g., "descendant of"). This advanced validation logic contributes directly to better <strong>data hygiene</strong>, improves <strong>data quality</strong>, and increases confidence in the integrity of the data managed by the Medplum platform.</li>
<li class=""><strong>FHIR GraphQL Patch support</strong>. The Medplum GraphQL API now supports <strong>FHIR Patch operations</strong>, enabling more efficient and flexible updates to FHIR resources via GraphQL mutations. This enhancement allows developers to perform partial updates, reducing payload sizes and improving performance for applications that require frequent resource modifications.</li>
</ol>
<h3 class="anchor anchorTargetStickyNavbar_SAay" id="frontend-and-developer-tooling">Frontend and Developer Tooling<a href="https://www.medplum.com/blog/v5-release#frontend-and-developer-tooling" class="hash-link" aria-label="Direct link to Frontend and Developer Tooling" title="Direct link to Frontend and Developer Tooling" translate="no">​</a></h3>
<p>We have streamlined the frontend stack to improve build times, component quality, and overall developer experience:</p>
<ul>
<li class=""><strong>React</strong>: We've dropped support for React 18 and <strong>now require React 19</strong>, which simplifies our component maintenance moving forward.</li>
<li class=""><strong>UI Components</strong>: Upgraded all usage from <strong>Mantine v7 to v8</strong>, which features improved date handling and enhanced TypeScript support.</li>
<li class=""><strong>Core Frameworks</strong>: Successfully upgraded <strong>Express from v4 to v5</strong> and <strong>Storybook from v8 to v9</strong>.</li>
</ul>
<h2 class="anchor anchorTargetStickyNavbar_SAay" id="strategic-update-esm-by-default">Strategic Update: ESM by Default<a href="https://www.medplum.com/blog/v5-release#strategic-update-esm-by-default" class="hash-link" aria-label="Direct link to Strategic Update: ESM by Default" title="Direct link to Strategic Update: ESM by Default" translate="no">​</a></h2>
<p>A key architectural shift in v5 is the move to <strong>ES Modules (ESM) by default</strong>.</p>
<p>This aligns Medplum with the modern JavaScript module standard, offering benefits like improved tree-shaking and better future compatibility. For a smooth transition, we will <strong>dual-publish certain SDK packages as CJS+ESM</strong>. We strongly recommend that all custom applications migrate to ESM for optimal compatibility and performance moving forward.</p>
<h2 class="anchor anchorTargetStickyNavbar_SAay" id="planning-your-migration-breaking-changes">Planning Your Migration (Breaking Changes)<a href="https://www.medplum.com/blog/v5-release#planning-your-migration-breaking-changes" class="hash-link" aria-label="Direct link to Planning Your Migration (Breaking Changes)" title="Direct link to Planning Your Migration (Breaking Changes)" translate="no">​</a></h2>
<p>Medplum v5 includes a few minor breaking changes, primarily involving the deprecation of long-standing features and updates to API signatures for better consistency and modern patterns.</p>
<h3 class="anchor anchorTargetStickyNavbar_SAay" id="api-and-sdk-changes">API and SDK Changes<a href="https://www.medplum.com/blog/v5-release#api-and-sdk-changes" class="hash-link" aria-label="Direct link to API and SDK Changes" title="Direct link to API and SDK Changes" translate="no">​</a></h3>
<table><thead><tr><th>Old Feature/Component</th><th>New Feature/Component</th><th>Note</th></tr></thead><tbody><tr><td>Non-standard usage of <code>?param:in=...</code> and <code>?param:not-in=...</code></td><td><strong>Strict FHIR compliance</strong></td><td>Invalid usage of the <code>:in</code> and <code>:not-in</code> search modifiers now <strong>throws an error</strong>. For simple inclusion checks, <strong>remove the modifier</strong>: <code>Patient?_id=uuid1,uuid2</code>.</td></tr><tr><td><code>PasswordChangeRequest</code> resource</td><td><code>UserSecurityRequest</code> resource</td><td><code>PasswordChangeRequest</code> was deprecated for over a year; <code>UserSecurityRequest</code> is a superset of its functionality.</td></tr><tr><td><code>Hl7Server.start</code> and <code>Hl7Server.stop</code> methods</td><td>Same methods, now <strong>async</strong></td><td>These methods must now be used with <code>await</code> or promise chains.</td></tr><tr><td><code>ProjectSecret</code> type definition</td><td><code>ProjectSetting</code> type</td><td>Use the <code>ProjectSetting</code> type instead.</td></tr><tr><td><code>MemoizedSearchControl</code> React component</td><td><code>SearchControl</code> React component</td><td>Use the standard component directly.</td></tr></tbody></table>
<h3 class="anchor anchorTargetStickyNavbar_SAay" id="infrastructure-changes">Infrastructure Changes<a href="https://www.medplum.com/blog/v5-release#infrastructure-changes" class="hash-link" aria-label="Direct link to Infrastructure Changes" title="Direct link to Infrastructure Changes" translate="no">​</a></h3>
<ul>
<li class=""><strong>AWS Container Insights</strong>: Updated from v1 to <strong>Container Insights v2</strong>.</li>
<li class=""><strong>CloudWatch Logs for Audit Events</strong>: Audit logging now utilizes <strong>AWS FireLens log routing</strong> for improved log management.</li>
</ul>
<h2 class="anchor anchorTargetStickyNavbar_SAay" id="the-value-of-upgrading">The Value of Upgrading<a href="https://www.medplum.com/blog/v5-release#the-value-of-upgrading" class="hash-link" aria-label="Direct link to The Value of Upgrading" title="Direct link to The Value of Upgrading" translate="no">​</a></h2>
<p>While a major version upgrade requires planning, Medplum v5 delivers concrete benefits that justify the effort:</p>
<ul>
<li class=""><strong>Performance</strong>: Immediate and substantial performance gains across the stack, from the database and runtime to frontend tooling.</li>
<li class=""><strong>Security</strong>: Access to the latest security features and patches across all dependencies.</li>
<li class=""><strong>Future-Proofing</strong>: Setting your healthcare solutions on a stable, supported platform that is aligned with industry best practices.</li>
</ul>
<h2 class="anchor anchorTargetStickyNavbar_SAay" id="next-steps-for-self-hosted-customers">Next Steps for Self-Hosted Customers<a href="https://www.medplum.com/blog/v5-release#next-steps-for-self-hosted-customers" class="hash-link" aria-label="Direct link to Next Steps for Self-Hosted Customers" title="Direct link to Next Steps for Self-Hosted Customers" translate="no">​</a></h2>
<p>We encourage self-hosted customers to begin planning their upgrade immediately.</p>
<ul>
<li class="">Consult our detailed <strong>migration guides</strong> on the documentation site.</li>
<li class="">Schedule <strong>database and runtime environment upgrades</strong> with your DevOps team.</li>
<li class="">Review your custom application codebase for compatibility with newer dependencies and the breaking changes listed above.</li>
</ul>
<p>For technical questions or feedback, please join the conversation on <a href="https://discord.gg/medplum" target="_blank" rel="noopener noreferrer" class="">Discord</a> or submit issues on <a href="https://github.com/medplum/medplum" target="_blank" rel="noopener noreferrer" class="">GitHub</a>.</p>
<p>Medplum v5 is ready to power your next generation of healthcare applications.</p>]]></content:encoded>
            <category>release</category>
            <category>self-host</category>
            <category>fhir-datastore</category>
            <category>integration</category>
            <category>compliance</category>
            <category>auth</category>
            <category>community</category>
            <category>performance</category>
        </item>
        <item>
            <title><![CDATA[HealthChain: A New Open Source Integration with Epic]]></title>
            <link>https://www.medplum.com/blog/healthchain</link>
            <guid>https://www.medplum.com/blog/healthchain</guid>
            <pubDate>Mon, 29 Sep 2025 00:00:00 GMT</pubDate>
            <description><![CDATA[We're excited to share a new open-source project from the community that addresses a common developer challenge: integrating with legacy healthcare systems. HealthChain, an open-source Python framework, makes it easier to connect AI/ML pipelines to healthcare systems.]]></description>
            <content:encoded><![CDATA[<p>We're excited to share a new open-source project from the community that addresses a common developer challenge: integrating with legacy healthcare systems. <a href="https://dotimplement.github.io/HealthChain/" target="_blank" rel="noopener noreferrer" class="">HealthChain</a>, an open-source Python framework, makes it easier to connect AI/ML pipelines to healthcare systems.</p>
<p>This project is a perfect example of how the open-source community is tackling real-world problems. It was created by <a href="https://jenniferjiangkells.com/" target="_blank" rel="noopener noreferrer" class="">Jennifer Jiang-Kells</a>, an honorary researcher at the <a href="https://www.uclhospitals.brc.nihr.ac.uk/" target="_blank" rel="noopener noreferrer" class="">University College London Hospitals</a> (UCLH) NHS Foundation Trust, highlighting its roots in a premier healthcare institution.</p>
<h3 class="anchor anchorTargetStickyNavbar_SAay" id="connecting-epic-to-medplum">Connecting Epic to Medplum<a href="https://www.medplum.com/blog/healthchain#connecting-epic-to-medplum" class="hash-link" aria-label="Direct link to Connecting Epic to Medplum" title="Direct link to Connecting Epic to Medplum" translate="no">​</a></h3>
<p>One of HealthChain's most useful examples is a "Note Reader" service that integrates <strong>Epic NoteReader</strong> with Medplum. This demo shows how to process clinical notes, extract data like billing codes, and map them to the FHIR format. This addresses a key pain point for developers who need to modernize data workflows without replacing their existing Epic infrastructure.</p>
<p>By connecting Epic NoteReader to a modern FHIR server like Medplum, this project demonstrates a practical, open-source solution for developers. It's a powerful tool for bridging the gap between legacy CDA systems and modern healthcare platforms.</p>
<h3 class="anchor anchorTargetStickyNavbar_SAay" id="get-started">Get Started<a href="https://www.medplum.com/blog/healthchain#get-started" class="hash-link" aria-label="Direct link to Get Started" title="Direct link to Get Started" translate="no">​</a></h3>
<p>We encourage you to explore the project and see what's possible.</p>
<ul>
<li class="">HealthChain: <a href="https://dotimplement.github.io/HealthChain/" target="_blank" rel="noopener noreferrer" class="">https://dotimplement.github.io/HealthChain/</a></li>
<li class="">Clinical Coding Demo: <a href="https://dotimplement.github.io/HealthChain/cookbook/clinical_coding/" target="_blank" rel="noopener noreferrer" class="">https://dotimplement.github.io/HealthChain/cookbook/clinical_coding/</a></li>
</ul>]]></content:encoded>
            <category>fhir-datastore</category>
            <category>security</category>
            <category>auth</category>
            <category>community</category>
        </item>
        <item>
            <title><![CDATA[FHIR + AI for Life Sciences]]></title>
            <link>https://www.medplum.com/blog/fhir-ai-for-life-sciences</link>
            <guid>https://www.medplum.com/blog/fhir-ai-for-life-sciences</guid>
            <pubDate>Tue, 23 Sep 2025 00:00:00 GMT</pubDate>
            <description><![CDATA[Hello everyone,]]></description>
            <content:encoded><![CDATA[<p>Hello everyone,</p>
<p>Thank you so much for joining us today for our FHIR and AI for Life Sciences webinar. It was great to see many familiar and new faces from the broader healthcare community.</p>
<p>We wanted to share the recording for anyone who missed it or who would like to check it out again!</p>
<iframe width="560" height="315" src="https://www.youtube.com/embed/akAtxHFPrX8" title="FHIR + AI for Life Sciences Webinar" frameborder="0" allow="accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture; web-share"></iframe>
<p>Below are a number of the resources which we shared during the webinar for you to peruse!</p>
<p>Medplum:</p>
<ul>
<li class=""><a class="" href="https://www.medplum.com/docs">docs</a>, also <a href="https://cal.com/medplum/30min" target="_blank" rel="noopener noreferrer" class="">book demo</a> if you'd like a walk through</li>
<li class=""><a class="" href="https://www.medplum.com/docs/ai/mcp">mcp server</a>
<ul>
<li class=""><a class="" href="https://www.medplum.com/blog/unlocking-healthcare-ai-medplum-support-mcp">mcp backstory from Medplum CTO</a></li>
<li class=""><a href="https://youtu.be/y3gD7TQ-SM8" target="_blank" rel="noopener noreferrer" class="">mcp demo on YouTube</a></li>
</ul>
</li>
<li class=""><a href="https://github.com/medplum/medplum" target="_blank" rel="noopener noreferrer" class="">github</a></li>
<li class=""><a class="" href="https://www.medplum.com/docs/provider">provider app docs</a>
<ul>
<li class=""><a href="https://provider.medplum.com/" target="_blank" rel="noopener noreferrer" class="">login to hosted</a> provider app (you'll need a <a class="" href="https://www.medplum.com/docs/tutorials/register">Medplum account</a>)</li>
<li class=""><a href="https://github.com/medplum/medplum-provider" target="_blank" rel="noopener noreferrer" class="">provider app source code</a></li>
<li class="">bonus video - <a href="https://youtu.be/ZbxVopl8McI" target="_blank" rel="noopener noreferrer" class="">vibecoding EHRs</a> based on provider app</li>
</ul>
</li>
</ul>
<p>phenoml:</p>
<ul>
<li class=""><a href="https://developer.pheno.ml/" target="_blank" rel="noopener noreferrer" class="">docs</a>
<ul>
<li class=""><a href="https://developer.pheno.ml/docs/medical-codes" target="_blank" rel="noopener noreferrer" class="">Construe</a> is the med RAG API we discussed!</li>
</ul>
</li>
<li class=""><a href="https://github.com/PhenoML/phenoml-demos" target="_blank" rel="noopener noreferrer" class="">agent demos</a> (patient support program, illustrative agents in apps + notebook)</li>
<li class=""><a href="https://github.com/PhenoML/medplum-provider-lang2fhir" target="_blank" rel="noopener noreferrer" class="">phenoml integrated medplum provider app</a></li>
</ul>
<p>If you'll be in San Francisco for JPM in January 2026 please stay tuned for in-person workshops we'll be holding!</p>
<p>Thank you so much!</p>
<p>Reshma &amp; Kerry</p>]]></content:encoded>
            <category>community</category>
        </item>
        <item>
            <title><![CDATA[Medplum Events Calendar]]></title>
            <link>https://www.medplum.com/blog/events-calendar</link>
            <guid>https://www.medplum.com/blog/events-calendar</guid>
            <pubDate>Mon, 22 Sep 2025 00:00:00 GMT</pubDate>
            <description><![CDATA[Upcoming]]></description>
            <content:encoded><![CDATA[<h3 class="anchor anchorTargetStickyNavbar_SAay" id="upcoming">Upcoming<a href="https://www.medplum.com/blog/events-calendar#upcoming" class="hash-link" aria-label="Direct link to Upcoming" title="Direct link to Upcoming" translate="no">​</a></h3>
<table><thead><tr><th>When</th><th>Topic</th><th>Location</th><th>Featuring</th></tr></thead><tbody><tr><td style="white-space:nowrap">Dec 4, 2025, 10:00 AM PT</td><td><strong>Visualizing Patient Flow: A Blueprint Reference App for Healthcare IT</strong></td><td><a href="https://luma.com/a3ye1r18" target="_blank" rel="noopener noreferrer" class="">Zoom</a></td><td align="center"><img src="https://github.com/medplum.png" alt="Medplum" width="50" height="50" style="border-radius:50%"><img src="https://github.com/vintasoftware.png" alt="Vinta" width="50" height="50" style="border-radius:50%"></td></tr><tr><td style="white-space:nowrap">Jan 15, 2025, 9:00 AM - 2:00 PM PT</td><td><strong>Interactive Workshop FHIR+AI for Life Sciences</strong></td><td>San Francisco</td><td align="center"><img src="https://github.com/kerbearasaurus.png" alt="Kerry Weinberg" width="50" height="50" style="border-radius:50%"><img src="https://github.com/reshmakh.png" alt="Reshma Khilnani" width="50" height="50" style="border-radius:50%"><p><a href="https://github.com/kerbearasaurus" target="_blank" rel="noopener noreferrer" class="">Kerry Weinberg</a>, <a href="https://github.com/reshmakh" target="_blank" rel="noopener noreferrer" class="">Reshma Khilnani</a></p></td></tr></tbody></table>
<h3 class="anchor anchorTargetStickyNavbar_SAay" id="past-events">Past Events<a href="https://www.medplum.com/blog/events-calendar#past-events" class="hash-link" aria-label="Direct link to Past Events" title="Direct link to Past Events" translate="no">​</a></h3>
<table><thead><tr><th>When</th><th>Topic</th><th>Location</th><th>Featuring</th></tr></thead><tbody><tr><td style="white-space:nowrap">Nov 18, 2025, 8:00 AM PT</td><td><strong>FHIR Made Fast: Delivering Production-Ready Healthcare Apps in 12 Weeks with Medplum</strong></td><td><a href="https://youtu.be/4M4tG-7-AmQ" target="_blank" rel="noopener noreferrer" class="">YouTube</a></td><td align="center"><img src="https://github.com/medplum.png" alt="Medplum" width="50" height="50" style="border-radius:50%"><p><a href="https://github.com/medplum" target="_blank" rel="noopener noreferrer" class="">Medplum</a>, TechMagic</p></td></tr><tr><td style="white-space:nowrap">Oct 30, 2025, 10:00 AM PT</td><td><strong>Scheduling Agents for Healthcare Operations</strong></td><td><a href="https://luma.com/npl7y6cm" target="_blank" rel="noopener noreferrer" class="">Zoom</a></td><td align="center"><img src="https://github.com/medplum.png" alt="Medplum" width="50" height="50" style="border-radius:50%"><p>Cody Hall from Unity AI, <a href="https://github.com/reshmakh" target="_blank" rel="noopener noreferrer" class="">Medplum Team</a></p></td></tr><tr><td style="white-space:nowrap">Oct 22, 2025, 5:00 PM PT</td><td><strong>AI x Open source : Community evening with Hatchet, Medplum and SigNoz</strong></td><td><a href="https://luma.com/2w9p5qzn" target="_blank" rel="noopener noreferrer" class="">San Francisco</a></td><td align="center"><img src="https://github.com/medplum.png" alt="Medplum" width="50" height="50" style="border-radius:50%"><img src="https://github.com/SigNoz.png" alt="SigNoz" width="50" height="50" style="border-radius:50%"><img src="https://github.com/hatchet-dev.png" alt="Hatchet" width="50" height="50" style="border-radius:50%"></td></tr><tr><td style="white-space:nowrap">Oct 8, 2025, 4:30 PM PT</td><td><strong>Healthcare Devs Open Source Happy Hour - #SFTechWeek</strong></td><td><a href="https://partiful.com/e/GfA7v1EsKiRPtBJwbXbV" target="_blank" rel="noopener noreferrer" class="">San Francisco</a></td><td align="center"><img src="https://github.com/medplum.png" alt="Medplum" width="50" height="50" style="border-radius:50%"><img src="https://github.com/awell-health.png" alt="Awell Health" width="50" height="50" style="border-radius:50%"><p><a href="https://github.com/medplum" target="_blank" rel="noopener noreferrer" class="">Medplum</a>, <a href="https://github.com/awell-health" target="_blank" rel="noopener noreferrer" class="">Awell</a>, <a href="https://x.com/Villi" target="_blank" rel="noopener noreferrer" class="">Villi Itchev</a></p></td></tr><tr><td style="white-space:nowrap">October 2025</td><td><strong>Healthcare Devs Open Source Happy Hour - #SFTechWeek</strong></td><td><a href="https://partiful.com/e/GfA7v1EsKiRPtBJwbXbV" target="_blank" rel="noopener noreferrer" class="">San Francisco</a></td><td align="center"><img src="https://github.com/medplum.png" alt="Medplum" width="50" height="50" style="border-radius:50%"><img src="https://github.com/awell-health.png" alt="Awell Health" width="50" height="50" style="border-radius:50%"><p><a href="https://github.com/medplum" target="_blank" rel="noopener noreferrer" class="">Medplum</a>, <a href="https://github.com/awell-health" target="_blank" rel="noopener noreferrer" class="">Awell</a>, <a href="https://x.com/Villi" target="_blank" rel="noopener noreferrer" class="">Villi Itchev</a></p></td></tr><tr><td style="white-space:nowrap">September 2025</td><td><strong><a class="" href="https://www.medplum.com/blog/fhir-ai-for-life-sciences">FHIR + AI for Life Sciences</a></strong></td><td><a href="https://luma.com/eo757i34" target="_blank" rel="noopener noreferrer" class="">Zoom</a></td><td align="center"><img src="https://github.com/reshmakh.png" alt="Reshma Khilnani" width="50" height="50" style="border-radius:50%"><img src="https://github.com/kerbearasaurus.png" alt="Kerry Weinberg" width="50" height="50" style="border-radius:50%"><p><a href="https://github.com/reshmakh" target="_blank" rel="noopener noreferrer" class="">Reshma Khilnani</a>, <a href="https://github.com/kerbearasaurus" target="_blank" rel="noopener noreferrer" class="">Kerry Weinberg</a></p></td></tr><tr><td style="white-space:nowrap">September 2025</td><td><strong>Infrastructure Tools for the Care Economy</strong></td><td><a href="https://luma.com/wj6ik7nc" target="_blank" rel="noopener noreferrer" class="">San Francisco</a></td><td align="center"><img src="https://github.com/reshmakh.png" alt="Reshma Khilnani" width="50" height="50" style="border-radius:50%"><p><a href="https://github.com/reshmakh" target="_blank" rel="noopener noreferrer" class="">Reshma Khilnani</a>, Pivotal Ventures</p></td></tr><tr><td style="white-space:nowrap">August 2025</td><td><strong><a class="" href="https://www.medplum.com/blog/plumcon-2025-materials">PlumCon 2025</a></strong></td><td><a href="https://luma.com/larg66wc" target="_blank" rel="noopener noreferrer" class="">San Francisco</a></td><td align="center"><img src="https://github.com/medplum.png" alt="Medplum Team" width="50" height="50" style="border-radius:50%"><p><a href="https://github.com/medplum" target="_blank" rel="noopener noreferrer" class="">Medplum Team</a></p></td></tr><tr><td style="white-space:nowrap">June 2025</td><td><strong>San Francisco Health Tech Meetup</strong></td><td><a href="https://luma.com/rtpbd80h" target="_blank" rel="noopener noreferrer" class="">San Francisco</a></td><td align="center"><img src="https://github.com/medplum.png" alt="Medplum Team" width="50" height="50" style="border-radius:50%"><img src="https://github.com/healthtechnerds.png" alt="Health Tech Nerds" width="50" height="50" style="border-radius:50%"><p><a href="https://github.com/medplum" target="_blank" rel="noopener noreferrer" class="">Medplum Team</a>, <a href="https://github.com/healthtechnerds" target="_blank" rel="noopener noreferrer" class="">Health Tech Nerds</a></p></td></tr><tr><td style="white-space:nowrap">July 2025</td><td><strong>San Francisco Health Tech Meetup</strong></td><td><a href="https://luma.com/kz1159r8" target="_blank" rel="noopener noreferrer" class="">San Francisco</a></td><td align="center"><img src="https://github.com/medplum.png" alt="Medplum Team" width="50" height="50" style="border-radius:50%"><img src="https://github.com/healthtechnerds.png" alt="Health Tech Nerds" width="50" height="50" style="border-radius:50%"><p><a href="https://github.com/medplum" target="_blank" rel="noopener noreferrer" class="">Medplum Team</a>, <a href="https://github.com/healthtechnerds" target="_blank" rel="noopener noreferrer" class="">Health Tech Nerds</a></p></td></tr><tr><td style="white-space:nowrap">January 2025</td><td><strong><a class="" href="https://www.medplum.com/blog/life-sciences-devtools">Medplum &amp; Flexpa: Devtools for research, commercialization and more in life sciences</a></strong></td><td><a href="https://luma.com/bonej6ih" target="_blank" rel="noopener noreferrer" class="">San Francisco</a></td><td align="center"><img src="https://github.com/medplum.png" alt="Medplum Team" width="50" height="50" style="border-radius:50%"><img src="https://github.com/flexpa.png" alt="Flexpa" width="50" height="50" style="border-radius:50%"><p><a href="https://github.com/medplum" target="_blank" rel="noopener noreferrer" class="">Medplum Team</a>, <a href="https://github.com/flexpa" target="_blank" rel="noopener noreferrer" class="">Flexpa</a></p></td></tr></tbody></table>]]></content:encoded>
            <category>community</category>
        </item>
        <item>
            <title><![CDATA[Our Journey with the OpenSSF]]></title>
            <link>https://www.medplum.com/blog/openssf</link>
            <guid>https://www.medplum.com/blog/openssf</guid>
            <pubDate>Mon, 22 Sep 2025 00:00:00 GMT</pubDate>
            <description><![CDATA[At Medplum, our mission is to provide the open source developer platform for healthcare. We believe that open source is the best way to build secure and interoperable healthcare applications. However, with the rising concern over software supply chain attacks, we understand that being "open source" isn't enough; we need to actively prove our commitment to security.]]></description>
            <content:encoded><![CDATA[<p>At Medplum, our mission is to provide the open source developer platform for healthcare. We believe that open source is the best way to build secure and interoperable healthcare applications. However, with the rising concern over software supply chain attacks, we understand that being "open source" isn't enough; we need to actively prove our commitment to security.</p>
<p>That's why a few months ago, we decided to ramp up our participation in the <a href="https://openssf.org/" target="_blank" rel="noopener noreferrer" class="">Open Source Security Foundation (OpenSSF)</a>. We're excited to share the progress we've made in two of their key programs: the Best Practices Badge and the Scorecard.</p>
<h3 class="anchor anchorTargetStickyNavbar_SAay" id="openssf-best-practices">OpenSSF Best Practices<a href="https://www.medplum.com/blog/openssf#openssf-best-practices" class="hash-link" aria-label="Direct link to OpenSSF Best Practices" title="Direct link to OpenSSF Best Practices" translate="no">​</a></h3>
<p>The OpenSSF Best Practices Badge program provides a framework for open source projects to demonstrate that they follow security-related best practices. It's a comprehensive and detailed self-assessment that covers a wide range of topics, from secure development processes to vulnerability reporting.</p>
<p>We're incredibly proud to announce that the Medplum repository has achieved <strong>full "gold" status</strong>, the highest level a project can receive. This wasn't a simple task; it involved meticulously reviewing our processes and code to ensure we met every single requirement. You can view our full report <a href="https://www.bestpractices.dev/en/projects/10900" target="_blank" rel="noopener noreferrer" class="">here</a>. This achievement validates our foundational commitment to building secure and reliable software.</p>
<a href="https://www.bestpractices.dev/en/projects/10900" target="_blank"><img src="https://www.medplum.com/img/compliance/openssf-best-practices-screenshot.webp" alt="OpenSSF Best Practices screenshot" width="500"></a>
<h3 class="anchor anchorTargetStickyNavbar_SAay" id="openssf-scorecard">OpenSSF Scorecard<a href="https://www.medplum.com/blog/openssf#openssf-scorecard" class="hash-link" aria-label="Direct link to OpenSSF Scorecard" title="Direct link to OpenSSF Scorecard" translate="no">​</a></h3>
<p>While the Best Practices Badge is a self-assessment, the OpenSSF Scorecard is where the rubber truly meets the road. This automated tool analyzes your repository and verifies that your project actually adheres to critical security practices. When we first ran the Scorecard on our repository, the results were humbling. The tests are rigorous, and they don't hold back.</p>
<p>Over the past few months, we've worked tirelessly to improve our Scorecard results. We are proud to say that Medplum is now consistently scoring 9.5+ out of 10. We see this not as an endpoint, but as a continuous journey to push for a higher and higher score, ensuring our users can trust the security of our platform. You can see our current Scorecard results <a href="https://scorecard.dev/viewer/?uri=github.com/medplum/medplum" target="_blank" rel="noopener noreferrer" class="">here</a>.</p>
<a href="https://scorecard.dev/viewer/?uri=github.com/medplum/medplum" target="_blank"><img src="https://www.medplum.com/img/compliance/openssf-scorecard-screenshot.webp" alt="OpenSSF Scorecard screenshot" width="500"></a>
<h3 class="anchor anchorTargetStickyNavbar_SAay" id="bigger-picture-why-this-matters">Bigger Picture: Why This Matters<a href="https://www.medplum.com/blog/openssf#bigger-picture-why-this-matters" class="hash-link" aria-label="Direct link to Bigger Picture: Why This Matters" title="Direct link to Bigger Picture: Why This Matters" translate="no">​</a></h3>
<p>Our journey with the OpenSSF programs is not just about our project; it's about the state of open source security as a whole. A recent paper, <a href="https://arxiv.org/pdf/2508.03856" target="_blank" rel="noopener noreferrer" class="">“An Analysis of Supply Chain Security in Research Software,”</a> highlights just how challenging this space is. The paper examines the Scorecard scores of 3,248 research software repositories, and the findings are eye opening.</p>
<p>The study found that the mean aggregate Scorecard score was <strong>3.5</strong>, indicating a massive potential for improvement across the majority of scanned repositories.</p>
<a href="https://arxiv.org/pdf/2508.03856" target="_blank"><img src="https://www.medplum.com/img/compliance/openssf-histogram.webp" alt="OpenSSF Scorecard histogram" width="500"></a>
<p>While these stats are a bit sobering, they underscore why our achievements with the Best Practices Badge and the high Scorecard rating are so important. They are a clear signal to our users and the community that we take supply chain security seriously and have gone above and beyond to build a platform that you can trust.</p>
<p>We will continue to be active participants in the OpenSSF community and programs, constantly striving to improve our security posture and contribute to a more secure open source ecosystem for everyone.</p>]]></content:encoded>
            <category>fhir-datastore</category>
            <category>security</category>
            <category>auth</category>
            <category>community</category>
        </item>
        <item>
            <title><![CDATA[PlumCon 2025 - Materials & Agenda]]></title>
            <link>https://www.medplum.com/blog/plumcon-2025-materials</link>
            <guid>https://www.medplum.com/blog/plumcon-2025-materials</guid>
            <pubDate>Fri, 05 Sep 2025 00:00:00 GMT</pubDate>
            <description><![CDATA[On August 28, 2025 Medplum hosted our first annual developer conference PlumCon in San Francisco. Thank you to everyone who attended and made this inaugural event such a success!]]></description>
            <content:encoded><![CDATA[<p>On August 28, 2025 Medplum hosted our first annual <em>developer conference</em> PlumCon in San Francisco. Thank you to everyone who attended and made this inaugural event such a success!</p>
<p>Below you'll find slideshows and videos from each presentation, organized by talk. Most sections includes the speakers presentation and slides.  We also have a <a href="https://youtube.com/playlist?list=PLPLQMmn1jgVktVYV7wOFyx0aOhh3vg66k&amp;si=LDk7kKuEAnPQUOmX" target="_blank" rel="noopener noreferrer" class="">YouTube Playlist</a> available.</p>
<p>We also want to thank everyone who donated demos and demo videos to this event - we are thankful for our community.</p>
<h2 class="anchor anchorTargetStickyNavbar_SAay" id="presentation-materials">Presentation Materials<a href="https://www.medplum.com/blog/plumcon-2025-materials#presentation-materials" class="hash-link" aria-label="Direct link to Presentation Materials" title="Direct link to Presentation Materials" translate="no">​</a></h2>
<h3 class="anchor anchorTargetStickyNavbar_SAay" id="keynote-medplum-past-present-and-future">Keynote: Medplum Past, Present and Future<a href="https://www.medplum.com/blog/plumcon-2025-materials#keynote-medplum-past-present-and-future" class="hash-link" aria-label="Direct link to Keynote: Medplum Past, Present and Future" title="Direct link to Keynote: Medplum Past, Present and Future" translate="no">​</a></h3>
<p><strong>Speaker:</strong> <a href="https://github.com/codyebberson" target="_blank" rel="noopener noreferrer" class="">Cody Ebberson</a></p>
<div style="display:flex;align-items:center;gap:1rem;margin-bottom:1rem"><img src="https://github.com/codyebberson.png" alt="Cody Ebberson" width="80" height="80" style="border-radius:50%"><div><p><strong>Slides:</strong> <a href="https://drive.google.com/file/d/13ChwHbf9S19kGL-kpheFBuR1ccjYQx3V/view?usp=sharing" target="_blank" rel="noopener noreferrer" class="">Download Presentation</a></p></div></div>
<h3 class="anchor anchorTargetStickyNavbar_SAay" id="how-to-be-a-healthtech-hero-and-ship-apps-10x-faster">How to be a Healthtech Hero and Ship Apps 10x Faster<a href="https://www.medplum.com/blog/plumcon-2025-materials#how-to-be-a-healthtech-hero-and-ship-apps-10x-faster" class="hash-link" aria-label="Direct link to How to be a Healthtech Hero and Ship Apps 10x Faster" title="Direct link to How to be a Healthtech Hero and Ship Apps 10x Faster" translate="no">​</a></h3>
<p><strong>Speaker:</strong> <a href="https://github.com/rahul1" target="_blank" rel="noopener noreferrer" class="">Rahul Agarwal</a></p>
<div style="display:flex;align-items:center;gap:1rem;margin-bottom:1rem"><img src="https://github.com/rahul1.png" alt="Rahul Agarwal" width="80" height="80" style="border-radius:50%"><div><p><strong>Slides:</strong> <a href="https://docs.google.com/presentation/d/19GQjsTZcoOLUC1mVKmecvnTz5mFRfcW3QpoU2iATGrs/edit?usp=sharing" target="_blank" rel="noopener noreferrer" class="">How to be a Healthtech Hero and Ship Apps 10x Faster</a><br>
<strong>Video:</strong> <a href="https://www.youtube.com/watch?v=lHhK9dxgl2A" target="_blank" rel="noopener noreferrer" class="">Watch Recording</a></p></div></div>
<h3 class="anchor anchorTargetStickyNavbar_SAay" id="fireside-chat-ai-in-production-in-healthcare">Fireside Chat: AI in Production in Healthcare<a href="https://www.medplum.com/blog/plumcon-2025-materials#fireside-chat-ai-in-production-in-healthcare" class="hash-link" aria-label="Direct link to Fireside Chat: AI in Production in Healthcare" title="Direct link to Fireside Chat: AI in Production in Healthcare" translate="no">​</a></h3>
<p><strong>Speakers:</strong> <a href="https://github.com/matthewwoo" target="_blank" rel="noopener noreferrer" class="">Matthew Woo</a>, <a href="https://github.com/reshmakh" target="_blank" rel="noopener noreferrer" class="">Reshma Khilnani</a></p>
<div style="display:flex;align-items:center;gap:1rem;margin-bottom:1rem"><img src="https://github.com/matthewwoo.png" alt="Matthew Woo" width="80" height="80" style="border-radius:50%"><img src="https://github.com/reshmakh.png" alt="Reshma Khilnani" width="80" height="80" style="border-radius:50%"><div><p>Fireside chat was not recorded, but see more info and case study below.</p></div></div>
<h3 class="anchor anchorTargetStickyNavbar_SAay" id="scaling-to-millions-of-patients">Scaling to Millions of Patients<a href="https://www.medplum.com/blog/plumcon-2025-materials#scaling-to-millions-of-patients" class="hash-link" aria-label="Direct link to Scaling to Millions of Patients" title="Direct link to Scaling to Millions of Patients" translate="no">​</a></h3>
<p><strong>Speakers:</strong> <a href="https://github.com/mattlong" target="_blank" rel="noopener noreferrer" class="">Matt Long</a>, <a href="https://github.com/mattwiller" target="_blank" rel="noopener noreferrer" class="">Matt Willer</a></p>
<div style="display:flex;align-items:center;gap:1rem;margin-bottom:1rem"><img src="https://github.com/mattlong.png" alt="Matt Long" width="80" height="80" style="border-radius:50%"><img src="https://github.com/mattwiller.png" alt="Matt Willer" width="80" height="80" style="border-radius:50%"><div><p><strong>Slides:</strong> <a href="https://docs.google.com/presentation/d/1Ngktqoi8e5prNEq441O_OhVEJmgCDsMwrOQFWK9VLTQ/edit?usp=sharing" target="_blank" rel="noopener noreferrer" class="">Scaling to Millions of Patients</a><br>
<strong>Video:</strong> <a href="https://www.youtube.com/watch?v=0ewuLinTDYQ" target="_blank" rel="noopener noreferrer" class="">Watch Recording</a></p></div></div>
<h3 class="anchor anchorTargetStickyNavbar_SAay" id="realtime-applications-fhircast-websockets-and-hl7v2">Realtime Applications: FHIRcast, Websockets and HL7v2<a href="https://www.medplum.com/blog/plumcon-2025-materials#realtime-applications-fhircast-websockets-and-hl7v2" class="hash-link" aria-label="Direct link to Realtime Applications: FHIRcast, Websockets and HL7v2" title="Direct link to Realtime Applications: FHIRcast, Websockets and HL7v2" translate="no">​</a></h3>
<p><strong>Speakers:</strong> <a href="https://github.com/ThatOneBro" target="_blank" rel="noopener noreferrer" class="">Derrick Farris</a>, <a href="https://github.com/maddyli" target="_blank" rel="noopener noreferrer" class="">Maddy Li</a></p>
<div style="display:flex;align-items:center;gap:1rem;margin-bottom:1rem"><img src="https://github.com/ThatOneBro.png" alt="Derrick Farris" width="80" height="80" style="border-radius:50%"><img src="https://github.com/maddyli.png" alt="Maddy Li" width="80" height="80" style="border-radius:50%"><div><p><strong>Slides:</strong> <a href="https://docs.google.com/presentation/d/1H1JjwD78NB3HFZ7n3sruDHPY82RK0rsJVrJC0GUVY_E/edit?usp=sharing" target="_blank" rel="noopener noreferrer" class="">Real-time Medical Applications for Developers</a><br>
<strong>Video:</strong> <a href="https://www.youtube.com/watch?v=PliSbKE9UNI" target="_blank" rel="noopener noreferrer" class="">Watch Recording</a></p></div></div>
<h3 class="anchor anchorTargetStickyNavbar_SAay" id="vibecoding-ehrs">Vibecoding EHRs<a href="https://www.medplum.com/blog/plumcon-2025-materials#vibecoding-ehrs" class="hash-link" aria-label="Direct link to Vibecoding EHRs" title="Direct link to Vibecoding EHRs" translate="no">​</a></h3>
<p><strong>Speakers:</strong> <a href="https://github.com/kevinwadeshaw" target="_blank" rel="noopener noreferrer" class="">Kevin Shaw</a>, <a href="https://github.com/techdavidy" target="_blank" rel="noopener noreferrer" class="">David Yanez</a></p>
<div style="display:flex;align-items:center;gap:1rem;margin-bottom:1rem"><img src="https://github.com/kevinwadeshaw.png" alt="Kevin Shaw" width="80" height="80" style="border-radius:50%"><img src="https://github.com/techdavidy.png" alt="David Yanez" width="80" height="80" style="border-radius:50%"><div><p><strong>Slides:</strong> <a href="https://docs.google.com/presentation/d/1T_ErFaDrJrPG0Otr0I-l7iog-4Vy3RFvGHJQaMOHWqk/edit?usp=sharing" target="_blank" rel="noopener noreferrer" class="">Vibe Coding EHRs</a><br>
<strong>Video:</strong> <a href="https://www.youtube.com/watch?v=ZbxVopl8McI" target="_blank" rel="noopener noreferrer" class="">Watch Recording</a></p></div></div>
<h3 class="anchor anchorTargetStickyNavbar_SAay" id="healthcare-integrations">Healthcare Integrations<a href="https://www.medplum.com/blog/plumcon-2025-materials#healthcare-integrations" class="hash-link" aria-label="Direct link to Healthcare Integrations" title="Direct link to Healthcare Integrations" translate="no">​</a></h3>
<p><strong>Speakers:</strong> <a href="https://github.com/ianplunkett" target="_blank" rel="noopener noreferrer" class="">Ian Plunkett</a>, <a href="https://github.com/rahul1" target="_blank" rel="noopener noreferrer" class="">Rahul Agarwal</a></p>
<div style="display:flex;align-items:center;gap:1rem;margin-bottom:1rem"><img src="https://github.com/ianplunkett.png" alt="Ian Plunkett" width="80" height="80" style="border-radius:50%"><img src="https://github.com/rahul1.png" alt="Rahul Agarwal" width="80" height="80" style="border-radius:50%"><div><p><strong>Slides:</strong> <a href="https://docs.google.com/presentation/d/11bWfSQ5Gj8keLEdoDDYhjuHK-9_Mz-5nnwaMXrEqmrg/edit?usp=sharing" target="_blank" rel="noopener noreferrer" class="">What We Worry About So You Don't Have To</a><br>
<strong>Video:</strong> <a href="https://www.youtube.com/watch?v=hsBtH35vKzo" target="_blank" rel="noopener noreferrer" class="">Watch Recording</a></p></div></div>
<hr>
<h2 class="anchor anchorTargetStickyNavbar_SAay" id="demo-showcase">Demo Showcase<a href="https://www.medplum.com/blog/plumcon-2025-materials#demo-showcase" class="hash-link" aria-label="Direct link to Demo Showcase" title="Direct link to Demo Showcase" translate="no">​</a></h2>
<p>The following demos were provided by the community. Thank you so much to all teams who contributed videos.</p>
<h3 class="anchor anchorTargetStickyNavbar_SAay" id="seen-health">Seen Health<a href="https://www.medplum.com/blog/plumcon-2025-materials#seen-health" class="hash-link" aria-label="Direct link to Seen Health" title="Direct link to Seen Health" translate="no">​</a></h3>
<p><a href="https://www.dhcs.ca.gov/services/ltc/Pages/programofall-inclusivecarefortheelderly.aspx" target="_blank" rel="noopener noreferrer" class="">PACE</a> specific EHR with realtime collaboration features and multi-player chart editing and workflow.</p>
<div class="responsive-iframe-wrapper"><iframe src="https://www.youtube.com/embed/M9bw4l1-RN8?start=0" title="YouTube video player" frameborder="0" allow="accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture"></iframe></div>
<h3 class="anchor anchorTargetStickyNavbar_SAay" id="summer-health">Summer Health<a href="https://www.medplum.com/blog/plumcon-2025-materials#summer-health" class="hash-link" aria-label="Direct link to Summer Health" title="Direct link to Summer Health" translate="no">​</a></h3>
<p>24/7 Pediatric care via SMS, built their CareOS on Medplum. Read the <a class="" href="https://www.medplum.com/blog/summer-case-study">case study</a>.  A live demo was showcased in the Fireside Chat.</p>
<div class="responsive-iframe-wrapper"><iframe src="https://www.youtube.com/embed/H2fJVYG8LvQ?start=0" title="YouTube video player" frameborder="0" allow="accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture"></iframe></div>
<h3 class="anchor anchorTargetStickyNavbar_SAay" id="rad-ai-omni-reporting">Rad AI Omni Reporting<a href="https://www.medplum.com/blog/plumcon-2025-materials#rad-ai-omni-reporting" class="hash-link" aria-label="Direct link to Rad AI Omni Reporting" title="Direct link to Rad AI Omni Reporting" translate="no">​</a></h3>
<p>Realtime application shown in the Realtime Apps presentation. <a class="" href="https://www.medplum.com/blog/radai-case-study">More details here</a>.</p>
<div class="responsive-iframe-wrapper"><iframe src="https://www.youtube.com/embed/N5ZocZhdPZ0?start=0" title="YouTube video player" frameborder="0" allow="accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture"></iframe></div>
<h3 class="anchor anchorTargetStickyNavbar_SAay" id="progress-notes">Progress Notes<a href="https://www.medplum.com/blog/plumcon-2025-materials#progress-notes" class="hash-link" aria-label="Direct link to Progress Notes" title="Direct link to Progress Notes" translate="no">​</a></h3>
<p>This psychotherapy EHR and scribe was created by one person, Dr. Wong - who is a clinician!  Large portions were vibecoded, and this video was showcased in the Vibecoding EHRs session.</p>
<div class="responsive-iframe-wrapper"><iframe src="https://www.youtube.com/embed/MleerRYHviQ?start=0" title="YouTube video player" frameborder="0" allow="accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture"></iframe></div>
<h3 class="anchor anchorTargetStickyNavbar_SAay" id="payer-data-exchange">Payer Data Exchange<a href="https://www.medplum.com/blog/plumcon-2025-materials#payer-data-exchange" class="hash-link" aria-label="Direct link to Payer Data Exchange" title="Direct link to Payer Data Exchange" translate="no">​</a></h3>
<p>This app was created by <a class="" href="https://www.medplum.com/blog/flexpa-case-study">Flexpa</a> and showcases payer FHIR API network.  It was featured during the Happy Hour.</p>
<div class="responsive-iframe-wrapper"><iframe src="https://www.youtube.com/embed/DsdLq6DGi-0?start=0" title="YouTube video player" frameborder="0" allow="accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture"></iframe></div>
<h3 class="anchor anchorTargetStickyNavbar_SAay" id="clinical-trials-ai-charting-app">Clinical Trials AI Charting App<a href="https://www.medplum.com/blog/plumcon-2025-materials#clinical-trials-ai-charting-app" class="hash-link" aria-label="Direct link to Clinical Trials AI Charting App" title="Direct link to Clinical Trials AI Charting App" translate="no">​</a></h3>
<p>A very cool Clinical Trials charting app created by the team at <a href="https://www.pheno.ml/" target="_blank" rel="noopener noreferrer" class="">PhenoML</a> was showcased at the Happy Hour.</p>
<div class="responsive-iframe-wrapper"><iframe src="https://www.youtube.com/embed/QXv3axkLbTE?start=0" title="YouTube video player" frameborder="0" allow="accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture"></iframe></div>
<h3 class="anchor anchorTargetStickyNavbar_SAay" id="develo-pediatric-ehr">Develo Pediatric EHR<a href="https://www.medplum.com/blog/plumcon-2025-materials#develo-pediatric-ehr" class="hash-link" aria-label="Direct link to Develo Pediatric EHR" title="Direct link to Develo Pediatric EHR" translate="no">​</a></h3>
<p>A comprehensive <a class="" href="https://www.medplum.com/blog/develo-case-study">pediatric EHR</a> system built with Medplum, showcasing specialized workflows for pediatric care was showcased at the Happy Hour.</p>
<div class="responsive-iframe-wrapper"><iframe src="https://www.youtube.com/embed/Jk5jSEiBYbQ?start=0" title="YouTube video player" frameborder="0" allow="accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture"></iframe></div>
<h3 class="anchor anchorTargetStickyNavbar_SAay" id="awell-clinical-ops-automation">Awell Clinical Ops Automation<a href="https://www.medplum.com/blog/plumcon-2025-materials#awell-clinical-ops-automation" class="hash-link" aria-label="Direct link to Awell Clinical Ops Automation" title="Direct link to Awell Clinical Ops Automation" translate="no">​</a></h3>
<p>Clinical operations automation platform built with Medplum, streamlining healthcare workflows and improving operational efficiency.</p>
<div class="responsive-iframe-wrapper"><iframe src="https://www.youtube.com/embed/tjOZt4RzVic?start=0" title="YouTube video player" frameborder="0" allow="accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture"></iframe></div>
<h3 class="anchor anchorTargetStickyNavbar_SAay" id="vibrant-ai-enabled-ehr">Vibrant AI Enabled EHR<a href="https://www.medplum.com/blog/plumcon-2025-materials#vibrant-ai-enabled-ehr" class="hash-link" aria-label="Direct link to Vibrant AI Enabled EHR" title="Direct link to Vibrant AI Enabled EHR" translate="no">​</a></h3>
<p>AI-powered EHR system built with Medplum, featuring intelligent automation and enhanced clinical decision support.</p>
<div class="responsive-iframe-wrapper"><iframe src="https://www.youtube.com/embed/aZudzbHNmIE?start=0" title="YouTube video player" frameborder="0" allow="accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture"></iframe></div>
<hr>
<h2 class="anchor anchorTargetStickyNavbar_SAay" id="plumcon-2025-photos">PlumCon 2025 Photos<a href="https://www.medplum.com/blog/plumcon-2025-materials#plumcon-2025-photos" class="hash-link" aria-label="Direct link to PlumCon 2025 Photos" title="Direct link to PlumCon 2025 Photos" translate="no">​</a></h2>
<p>Some photos from the conference.</p>
<p><img decoding="async" loading="lazy" alt="Plumcon photo 7" src="https://www.medplum.com/assets/images/plumcon-2025-7-6bf5e335134a75e228c1a8d5ef462a47.jpg" width="4080" height="3072" class="img__Ss2"></p>
<p><img decoding="async" loading="lazy" alt="Plumcon photo 1" src="https://www.medplum.com/assets/images/plumcon-2025-1-950c3ed893e72a38f58018276ee8a1cb.jpg" width="5712" height="4284" class="img__Ss2"></p>
<p><img decoding="async" loading="lazy" alt="Plumcon photo 2" src="https://www.medplum.com/assets/images/plumcon-2025-2-9ef2917afff9d9877863cfa260a01fbb.jpg" width="3464" height="4618" class="img__Ss2"></p>
<p><img decoding="async" loading="lazy" alt="Plumcon photo 3" src="https://www.medplum.com/assets/images/plumcon-2025-3-a0b9435b180f575554c1050267caf3c5.jpg" width="4032" height="3024" class="img__Ss2"></p>
<p><img decoding="async" loading="lazy" alt="Plumcon photo 4" src="https://www.medplum.com/assets/images/plumcon-2025-4-93476dc76c59097c25d4c7777ebc3bd1.jpg" width="5712" height="4284" class="img__Ss2"></p>
<p><img decoding="async" loading="lazy" alt="Plumcon photo 5" src="https://www.medplum.com/assets/images/plumcon-2025-5-10572139136555353f498787baa3bd74.jpg" width="5712" height="4284" class="img__Ss2"></p>
<p><img decoding="async" loading="lazy" alt="Plumcon photo 6" src="https://www.medplum.com/assets/images/plumcon-2025-6-701982afad30f7bf8da8ab1201c42ff7.jpg" width="4032" height="3024" class="img__Ss2"></p>]]></content:encoded>
            <category>community</category>
        </item>
        <item>
            <title><![CDATA[Medplum Certifies IRA]]></title>
            <link>https://www.medplum.com/blog/ihe-ira-radiology-reporting</link>
            <guid>https://www.medplum.com/blog/ihe-ira-radiology-reporting</guid>
            <pubDate>Sat, 12 Jul 2025 00:00:00 GMT</pubDate>
            <description><![CDATA[Medplum has become one of the first platforms to achieve certification for the Hub role in the Integrated Reporting Applications (IRA) IHE Profile, marking a milestone in radiology workflow interoperability. This certification positions Medplum as a central orchestrator for real-time synchronization between radiology applications, addressing one of healthcare's most persistent challenges: fragmented diagnostic workflows.]]></description>
            <content:encoded><![CDATA[<p>Medplum has become one of the first platforms to achieve certification for the <strong>Hub role</strong> in the Integrated Reporting Applications (IRA) IHE Profile, marking a milestone in radiology workflow interoperability. This certification positions Medplum as a central orchestrator for real-time synchronization between radiology applications, addressing one of healthcare's most persistent challenges: fragmented diagnostic workflows.</p>
<p>The IRA profile, published in October 2023 by Integrating the Healthcare Enterprise (IHE), represents a <strong>transformative approach</strong> to radiology interoperability. Built on <a class="" href="https://www.medplum.com/docs/fhircast">FHIRcast</a> 3.0.0 and FHIR R5 standards, IRA enables different applications—from PACS systems to AI tools—to share context and content seamlessly during diagnostic reporting. For Medplum, certification as a FHIRcast Hub means our platform can now coordinate complex radiology workflows where multiple applications must work together in harmony.</p>
<h2 class="anchor anchorTargetStickyNavbar_SAay" id="the-radiology-workflow-challenge-ira-solves">The Radiology Workflow Challenge IRA Solves<a href="https://www.medplum.com/blog/ihe-ira-radiology-reporting#the-radiology-workflow-challenge-ira-solves" class="hash-link" aria-label="Direct link to The Radiology Workflow Challenge IRA Solves" title="Direct link to The Radiology Workflow Challenge IRA Solves" translate="no">​</a></h2>
<p>Today's radiologists navigate <strong>disconnected systems</strong> during their daily work. A typical workflow involves juggling between three to five applications simultaneously: PACS for image viewing, RIS for patient scheduling, dictation systems for reporting, and increasingly, AI tools for analysis/reporting. Each system operates in isolation, requiring manual synchronization that costs radiologists 1-2 minutes per patient—time that adds up to significant productivity losses across thousands of daily studies.</p>
<p>Manual data entry between systems introduces errors, while the <strong>cognitive burden</strong> of constant context switching contributes to radiologist burnout.</p>
<p>IRA addresses these challenges through <strong>intelligent application synchronization</strong>. When a radiologist opens a chest CT in their PACS system, IRA automatically synchronizes the reporting application, AI tools, and any other connected systems to the same patient and study. This seemingly simple capability eliminates thousands of manual clicks daily while dramatically reducing the risk of context-related errors.</p>
<!-- -->
<h2 class="anchor anchorTargetStickyNavbar_SAay" id="understanding-iras-technical-architecture">Understanding IRA's Technical Architecture<a href="https://www.medplum.com/blog/ihe-ira-radiology-reporting#understanding-iras-technical-architecture" class="hash-link" aria-label="Direct link to Understanding IRA's Technical Architecture" title="Direct link to Understanding IRA's Technical Architecture" translate="no">​</a></h2>
<p>At its core, IRA leverages <strong>FHIRcast</strong>, a modern publish-subscribe protocol designed for real-time healthcare application communication. As the certified Hub, Medplum serves as the central nervous system for radiology workflows, managing multiple concurrent sessions and ensuring all connected applications stay synchronized.</p>
<p>The profile defines <strong>five key actors</strong> in the radiology ecosystem. Image Display applications present studies for diagnostic review. Report Creators handle dictation and structured reporting. Content Creators generate clinical evidence like measurements and annotations. Evidence Creators perform advanced visualization and AI analysis. The Hub—Medplum's certified role—orchestrates communication between all these actors through standardized events.</p>
<!-- -->
<p>Four primary events drive the <strong>synchronization workflow</strong>. <code>DiagnosticReport-open</code> fires when a radiologist selects a study, establishing the anchor context for all connected applications. <code>DiagnosticReport-update</code> shares clinical content like measurements or AI findings across the ecosystem. <code>DiagnosticReport-select</code> indicates when specific content needs attention, enabling features like synchronized highlighting. <code>DiagnosticReport-close</code> cleanly terminates the session when reporting completes.</p>
<h2 class="anchor anchorTargetStickyNavbar_SAay" id="how-fhircast-powers-real-time-synchronization">How FHIRcast Powers Real-Time Synchronization<a href="https://www.medplum.com/blog/ihe-ira-radiology-reporting#how-fhircast-powers-real-time-synchronization" class="hash-link" aria-label="Direct link to How FHIRcast Powers Real-Time Synchronization" title="Direct link to How FHIRcast Powers Real-Time Synchronization" translate="no">​</a></h2>
<p>FHIRcast provides the <strong>underlying communication infrastructure</strong> that makes IRA possible. Using WebSocket connections for real-time notifications and OAuth 2.0 for secure authentication, FHIRcast enables applications to subscribe to relevant workflow events and respond instantly to context changes.</p>
<p>The protocol distinguishes between <strong>driving applications</strong> that initiate context changes and subscribing applications that follow along. In a typical scenario, a PACS system acts as the driving application when a radiologist opens a study. The reporting system, AI tools, and advanced visualization applications subscribe to these events, automatically updating their context to match. This publish-subscribe model ensures all applications remain synchronized without requiring point-to-point integrations between each system.</p>
<p>Version control mechanisms using <code>context.versionId</code> and <code>context.priorVersionId</code> ensure events process in the <strong>correct sequence</strong>, even in distributed environments where network delays might otherwise cause synchronization issues. When synchronization errors occur, the protocol includes sophisticated error handling and recovery mechanisms, allowing applications to query the Hub for the latest context and self-correct.</p>
<h2 class="anchor anchorTargetStickyNavbar_SAay" id="real-world-scenarios-enabled-by-ira">Real-World Scenarios Enabled by IRA<a href="https://www.medplum.com/blog/ihe-ira-radiology-reporting#real-world-scenarios-enabled-by-ira" class="hash-link" aria-label="Direct link to Real-World Scenarios Enabled by IRA" title="Direct link to Real-World Scenarios Enabled by IRA" translate="no">​</a></h2>
<p>The true power of IRA emerges in <strong>everyday radiology workflows</strong>. Consider a radiologist reviewing a complex oncology case requiring measurements across multiple imaging series. With IRA, measurements created in the PACS automatically appear in the reporting system as structured FHIR Observation resources. The radiologist can reference these measurements in their report without manual transcription, while the measurements remain linked to their precise anatomical locations for future reference.</p>
<p><strong>AI integration</strong> represents another transformative use case. When an AI algorithm detects a pulmonary nodule, it creates an ImagingSelection resource highlighting the specific region of concern. Through IRA's <code>DiagnosticReport-update</code> event, this finding immediately appears in both the PACS and reporting system. The radiologist sees the AI annotation overlaid on the image while simultaneously having access to quantitative measurements and confidence scores in their report template.</p>
<p>For interrupted workflows—a constant reality in busy radiology departments—IRA enables <strong>seamless suspend and resume</strong> capabilities. A radiologist called away for an urgent case can return later to find all applications automatically restored to the exact context where they left off. This session persistence eliminates the frustrating and error-prone process of manually reopening studies and relocating specific findings across multiple systems.</p>
<h2 class="anchor anchorTargetStickyNavbar_SAay" id="medplums-unique-position-in-healthcare-interoperability">Medplum's Unique Position in Healthcare Interoperability<a href="https://www.medplum.com/blog/ihe-ira-radiology-reporting#medplums-unique-position-in-healthcare-interoperability" class="hash-link" aria-label="Direct link to Medplum's Unique Position in Healthcare Interoperability" title="Direct link to Medplum's Unique Position in Healthcare Interoperability" translate="no">​</a></h2>
<p>Medplum's achievement of IRA Hub certification represents a <strong>natural evolution</strong> of our FHIR-native platform strategy. As an open-source platform released under Apache 2.0 license, through open source Medplum makes integrations possible that weren't before. The Medplum architecture combines the flexibility developers need with the compliance healthcare requires, including HIPAA compliance, SOC 2 Type 2 certification, and ONC certification for patient API services.</p>
<p>The Hub certification adds a <strong>critical capability</strong> to Medplum's platform: the ability to orchestrate complex, multi-vendor radiology workflows. Unlike traditional integration approaches requiring custom interfaces between each application pair, Medplum's IRA Hub provides a standards-based switchboard that any compliant application can connect to. This dramatically reduces integration complexity while enabling true plug-and-play interoperability between best-of-breed radiology solutions.</p>
<h2 class="anchor anchorTargetStickyNavbar_SAay" id="the-big-picture">The Big Picture<a href="https://www.medplum.com/blog/ihe-ira-radiology-reporting#the-big-picture" class="hash-link" aria-label="Direct link to The Big Picture" title="Direct link to The Big Picture" translate="no">​</a></h2>
<p>IRA represents more than incremental improvement—it's a <strong>fundamental reimagining</strong> of how radiology applications interact. As the profile matures from experimental status to production readiness over the next 2-3 years, we can expect transformative changes in radiology workflows.</p>
<p><strong>Radiology has always been a bellwether</strong> in healthcare IT, early to adopt digital systems, scribing technologies, and AI use cases. This type of real-time event context synchronization is emblematic of what scribes will need in the future as healthcare workflows become more complex and AI-driven.</p>
<p>Near-term developments will focus on <strong>stabilizing the underlying</strong> FHIRcast 3.0.0 specification and incorporating feedback from early implementations. As more vendors achieve certification, the network effects will accelerate adoption—each new IRA-compliant application increases the value proposition for all participants in the ecosystem.</p>
<p>The convergence of IRA with related IHE profiles promises <strong>even greater capabilities</strong>. The AI Workflow for Imaging (AIW-I) profile standardizes how AI algorithms integrate into diagnostic workflows. The AI Results (AIR) profile defines how AI findings are stored and communicated. Together with IRA, these profiles create a comprehensive framework for intelligent, AI-augmented radiology workflows where human expertise and machine analysis seamlessly combine.</p>
<p>Looking further ahead, IRA lays the groundwork for <strong>autonomous reporting systems</strong> where AI generates preliminary reports that save radiologists time and busy work. Real-time quality assurance could flag potential errors before reports are finalized. Predictive analytics might optimize workflow routing based on case complexity and radiologist expertise. These advances all depend on the real-time, standards-based interoperability that IRA enables.</p>
<p>For radiology departments struggling with fragmented workflows and disconnected systems, <strong>IRA offers a standards-based path</strong> forward. For vendors building next-generation radiology applications, Medplum's certified Hub provides the interoperability infrastructure needed to participate in modern, integrated workflows. For radiologists themselves, IRA promises workflows where technology enhances rather than hinders their ability to provide excellent patient care.</p>
<p>As healthcare continues its digital transformation, <strong>standards like IRA</strong> and platforms like Medplum that embrace them will prove essential. The future of radiology lies not in monolithic, single-vendor solutions, but in ecosystems of specialized, interoperable applications working in concert. With IRA Hub certification, Medplum has positioned itself at the center of this transformation, ready to enable the next generation of radiology workflows.</p>
<p><img decoding="async" loading="lazy" alt="IRA Certification" src="https://www.medplum.com/assets/images/ihe-ira-5fea2cf932cef8852f62eb1ad107753a.png" width="600" height="464" class="img__Ss2"></p>
<h2 class="anchor anchorTargetStickyNavbar_SAay" id="related-reading">Related Reading<a href="https://www.medplum.com/blog/ihe-ira-radiology-reporting#related-reading" class="hash-link" aria-label="Direct link to Related Reading" title="Direct link to Related Reading" translate="no">​</a></h2>
<ul>
<li class=""><a href="https://drive.google.com/file/d/13GSEGd5pXSn9M8gN8skKpwPRUIuLTz3U/view?usp=sharing" target="_blank" rel="noopener noreferrer" class="">Medplum IRA Seal as PDF</a></li>
<li class=""><a href="https://profiles.ihe.net/RAD/IRA/" target="_blank" rel="noopener noreferrer" class="">IHE Integrated Reporting Applications (IRA) Profile</a></li>
<li class=""><a href="https://fhircast.org/" target="_blank" rel="noopener noreferrer" class="">FHIRcast Specification</a></li>
<li class=""><a href="https://www.agfahealthcare.com/news/connectathon-2024/" target="_blank" rel="noopener noreferrer" class="">AGFA HealthCare IHE 2024 Connectathon Results</a></li>
<li class=""><a href="https://www.radai.com/blogs/the-evolution-of-radiology-reporting-embracing-fhircast-for-seamless-integration" target="_blank" rel="noopener noreferrer" class="">Rad AI Evolution of Radiology Reporting</a></li>
<li class=""><a href="https://pubs.rsna.org/doi/abs/10.1148/radiol.232653" target="_blank" rel="noopener noreferrer" class="">RSNA AI Integration in Radiology Workflows</a></li>
<li class=""><a href="https://infocentral.infoway-inforoute.ca/en/forum/223-integrating-the-healthcare-enterprise-ihe/5987-register-today-ihe-north-america-connectathon-week-2025" target="_blank" rel="noopener noreferrer" class="">IHE North America Connectathon 2025</a></li>
<li class=""><a href="https://media.market.us/radiology-information-systems-market-news/" target="_blank" rel="noopener noreferrer" class="">Radiology Information Systems Market Analysis</a></li>
<li class=""><a href="https://www.gehealthcare.com/products/interoperability/ihe" target="_blank" rel="noopener noreferrer" class="">GE Healthcare IHE Interoperability</a></li>
</ul>]]></content:encoded>
            <category>fhir-datastore</category>
            <category>integration</category>
            <category>auth</category>
            <category>community</category>
            <category>ai</category>
        </item>
        <item>
            <title><![CDATA[PlumCon 2025 - Agenda]]></title>
            <link>https://www.medplum.com/blog/plumcon-2025</link>
            <guid>https://www.medplum.com/blog/plumcon-2025</guid>
            <pubDate>Sat, 05 Jul 2025 00:00:00 GMT</pubDate>
            <description><![CDATA[On August 28, 2025 Medplum is hosting our first annual developer conference PlumCon in San Francisco. The conference is by invitation, but please email us at hello@medplum.com if you are interested. Here is the agenda.]]></description>
            <content:encoded><![CDATA[<p>On August 28, 2025 Medplum is hosting our first annual <em>developer conference</em> PlumCon in San Francisco. The conference is by invitation, but please email us at <a href="mailto:hello@medplum.com?subject=PlumCon%202025%20Invite" target="_blank" rel="noopener noreferrer" class="">hello@medplum.com</a> if you are interested. Here is the agenda.</p>
<h3 class="anchor anchorTargetStickyNavbar_SAay" id="morning-session">Morning Session<a href="https://www.medplum.com/blog/plumcon-2025#morning-session" class="hash-link" aria-label="Direct link to Morning Session" title="Direct link to Morning Session" translate="no">​</a></h3>
<table><tbody><tr><td style="white-space:nowrap">9:00 AM</td><td><strong>Breakfast</strong></td><td></td></tr><tr><td style="white-space:nowrap">9:30 AM</td><td><strong>Keynote: Medplum Past, Present and Future</strong>  </td><td align="center"><img src="https://github.com/codyebberson.png" alt="Cody Ebberson" width="50" height="50" style="border-radius:50%"><p><a href="https://github.com/codyebberson" target="_blank" rel="noopener noreferrer" class="">Cody Ebberson</a></p></td></tr><tr><td style="white-space:nowrap">10:15 AM</td><td><strong>Implementation Speedrun: 5 Pro Tips to Ship Healthcare Apps 10x Faster</strong></td><td align="center"><img src="https://github.com/rahul1.png" alt="Rahul Agarwal" width="50" height="50" style="border-radius:50%"><p><a href="https://github.com/rahul1" target="_blank" rel="noopener noreferrer" class="">Rahul Agarwal</a></p></td></tr><tr><td style="white-space:nowrap">10:30 AM</td><td><strong>Coffee Break</strong></td><td></td></tr><tr><td style="white-space:nowrap">10:45 AM</td><td><strong>Fireside Chat: AI in Production in Healthcare</strong></td><td align="center"><img src="https://github.com/matthewwoo.png" alt="Matthew Woo" width="50" height="50" style="border-radius:50%"><img src="https://github.com/reshmakh.png" alt="Reshma Khilnani" width="50" height="50" style="border-radius:50%"><p><a href="https://github.com/matthewwoo" target="_blank" rel="noopener noreferrer" class="">Matthew Woo</a>, <a href="https://github.com/reshmakh" target="_blank" rel="noopener noreferrer" class="">Reshma Khilnani</a></p></td></tr><tr><td style="white-space:nowrap">11:30 AM</td><td><strong>Scaling to Millions of Patients</strong></td><td align="center"><img src="https://github.com/mattlong.png" alt="Matt Long" width="50" height="50" style="border-radius:50%"><img src="https://github.com/mattwiller.png" alt="Matt Willer" width="50" height="50" style="border-radius:50%"><p><a href="https://github.com/mattlong" target="_blank" rel="noopener noreferrer" class="">Matt Long</a>, <a href="https://github.com/mattwiller" target="_blank" rel="noopener noreferrer" class="">Matt Willer</a></p></td></tr><tr><td style="white-space:nowrap">12:00 PM</td><td><strong>Lunch Break</strong></td><td></td></tr></tbody></table>
<h3 class="anchor anchorTargetStickyNavbar_SAay" id="afternoon-session">Afternoon Session<a href="https://www.medplum.com/blog/plumcon-2025#afternoon-session" class="hash-link" aria-label="Direct link to Afternoon Session" title="Direct link to Afternoon Session" translate="no">​</a></h3>
<table><tbody><tr><td style="white-space:nowrap">1:00 PM</td><td><strong>Realtime Applications: FHIRcast, Websockets and HL7v2</strong></td><td align="center"><img src="https://github.com/ThatOneBro.png" alt="Derrick Farris" width="50" height="50" style="border-radius:50%"><img src="https://github.com/maddyli.png" alt="Maddy Li" width="50" height="50" style="border-radius:50%"><p><a href="https://github.com/ThatOneBro" target="_blank" rel="noopener noreferrer" class="">Derrick Farris</a>, <a href="https://github.com/maddyli" target="_blank" rel="noopener noreferrer" class="">Maddy Li</a></p></td></tr><tr><td style="white-space:nowrap">1:40 PM</td><td><strong>Vibecoding EHRs</strong></td><td align="center"><img src="https://github.com/kevinwadeshaw.png" alt="Kevin Shaw" width="50" height="50" style="border-radius:50%"><img src="https://github.com/techdavidy.png" alt="David Yanez" width="50" height="50" style="border-radius:50%"><p><a href="https://github.com/kevinwadeshaw" target="_blank" rel="noopener noreferrer" class="">Kevin Shaw</a>, <a href="https://github.com/techdavidy" target="_blank" rel="noopener noreferrer" class="">David Yanez</a></p></td></tr><tr><td style="white-space:nowrap">2:00 PM</td><td><strong>Stretch Break</strong></td><td></td></tr><tr><td style="white-space:nowrap">2:20 PM</td><td><strong>Orders, Medications and Transactions</strong></td><td align="center"><img src="https://github.com/ianplunkett.png" alt="Ian Plunkett" width="50" height="50" style="border-radius:50%"><img src="https://github.com/rahul1.png" alt="Rahul Agarwal" width="50" height="50" style="border-radius:50%"><p><a href="https://github.com/ianplunkett" target="_blank" rel="noopener noreferrer" class="">Ian Plunkett</a>, <a href="https://github.com/rahul1" target="_blank" rel="noopener noreferrer" class="">Rahul Agarwal</a></p></td></tr><tr><td style="white-space:nowrap">3:30 PM</td><td><strong>Happy Hour and Demos</strong></td><td></td></tr></tbody></table>]]></content:encoded>
            <category>community</category>
        </item>
        <item>
            <title><![CDATA[Medplum Supports Custom FHIR Operations]]></title>
            <link>https://www.medplum.com/blog/custom-fhir-operations</link>
            <guid>https://www.medplum.com/blog/custom-fhir-operations</guid>
            <pubDate>Thu, 03 Jul 2025 00:00:00 GMT</pubDate>
            <description><![CDATA[Healthcare APIs need flexibility. While FHIR's standard CRUD operations (create, read, update, delete) handle most use cases, real-world healthcare workflows often require custom logic that goes beyond basic data manipulation. That's why we're excited to introduce custom FHIR operations in Medplum.]]></description>
            <content:encoded><![CDATA[<p>Healthcare APIs need flexibility. While FHIR's standard CRUD operations (create, read, update, delete) handle most use cases, real-world healthcare workflows often require custom logic that goes beyond basic data manipulation. That's why we're excited to introduce custom FHIR operations in Medplum.</p>
<h2 class="anchor anchorTargetStickyNavbar_SAay" id="what-are-fhir-operations">What Are FHIR Operations?<a href="https://www.medplum.com/blog/custom-fhir-operations#what-are-fhir-operations" class="hash-link" aria-label="Direct link to What Are FHIR Operations?" title="Direct link to What Are FHIR Operations?" translate="no">​</a></h2>
<p>FHIR operations are the "dollar sign things" – endpoints like <code>$validate</code>, <code>$expand</code>, or <code>$match</code> that perform specialized functions beyond standard CRUD operations. These are technically called "operations" in FHIR terminology, distinct from the basic "interactions" used for everyday data management.</p>
<p>Until now, Medplum supported built-in FHIR operations like <code>$validate</code> and custom logic through our Bot framework using <code>$execute</code>. But there was a gap: customers wanted more natural, domain-specific endpoints that felt like proper FHIR operations.</p>
<h2 class="anchor anchorTargetStickyNavbar_SAay" id="why-custom-operations-matter">Why Custom Operations Matter<a href="https://www.medplum.com/blog/custom-fhir-operations#why-custom-operations-matter" class="hash-link" aria-label="Direct link to Why Custom Operations Matter" title="Direct link to Why Custom Operations Matter" translate="no">​</a></h2>
<p>Consider these scenarios:</p>
<ul>
<li class="">A pharmacy system that needs a <code>MedicationRequest/$submit</code> operation</li>
<li class="">A quality assurance workflow requiring <code>Patient/$quality-check</code></li>
<li class="">Custom patient matching logic via <code>Patient/$match</code></li>
<li class="">Integration workflows that transform data before processing</li>
</ul>
<p>Previously, these would all use the generic <code>Bot/{id}/$execute</code> syntax. Custom operations provide a more elegant, FHIR-native approach with endpoints that clearly communicate their purpose.</p>
<h2 class="anchor anchorTargetStickyNavbar_SAay" id="how-it-works">How It Works<a href="https://www.medplum.com/blog/custom-fhir-operations#how-it-works" class="hash-link" aria-label="Direct link to How It Works" title="Direct link to How It Works" translate="no">​</a></h2>
<p>Custom FHIR operations build on Medplum's existing Bot infrastructure, providing three key benefits:</p>
<ol>
<li class=""><strong>Natural API Design</strong>: Instead of <code>Bot/dose-calculator/$execute</code>, you can now use <code>MedicationRequest/$calculate-dose</code></li>
<li class=""><strong>FHIR Standards Compliance</strong>: Operations are defined using standard FHIR OperationDefinition resources</li>
<li class=""><strong>Existing Security Model</strong>: Custom operations inherit all the access controls and permissions from the underlying Bot framework</li>
</ol>
<h2 class="anchor anchorTargetStickyNavbar_SAay" id="getting-started">Getting Started<a href="https://www.medplum.com/blog/custom-fhir-operations#getting-started" class="hash-link" aria-label="Direct link to Getting Started" title="Direct link to Getting Started" translate="no">​</a></h2>
<p>Setting up a custom operation involves three steps:</p>
<ol>
<li class="">Create and deploy your Bot with the custom logic</li>
<li class="">Create an OperationDefinition resource that defines the operation's interface</li>
<li class="">Link them together using the operation-definition-implementation extension</li>
</ol>
<p>The OperationDefinition specifies the operation code (like "quality-check"), input/output parameters, and includes a reference to your Bot implementation.</p>
<p>Once configured, you can call your custom operation using standard FHIR syntax:</p>
<div class="language-text codeBlockContainer_ZGJx theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_kX1v"><pre tabindex="0" class="prism-code language-text codeBlock_TAPP thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_AdAo"><span class="token-line" style="color:#393A34"><span class="token plain">POST /fhir/R4/Patient/$quality-check</span><br></span></code></pre></div></div>
<h2 class="anchor anchorTargetStickyNavbar_SAay" id="security-and-access-control">Security and Access Control<a href="https://www.medplum.com/blog/custom-fhir-operations#security-and-access-control" class="hash-link" aria-label="Direct link to Security and Access Control" title="Direct link to Security and Access Control" translate="no">​</a></h2>
<p>Custom operations follow Medplum's principle of "syntactic sugar on the existing Bot execute framework." They inherit all existing security controls:</p>
<ul>
<li class="">Bots must have appropriate project membership</li>
<li class="">Standard FHIR access control applies</li>
<li class="">Access policies are recommended for all Bot implementations</li>
<li class="">The same permission model that governs <code>$execute</code> applies to custom operations</li>
</ul>
<h2 class="anchor anchorTargetStickyNavbar_SAay" id="implementation-philosophy">Implementation Philosophy<a href="https://www.medplum.com/blog/custom-fhir-operations#implementation-philosophy" class="hash-link" aria-label="Direct link to Implementation Philosophy" title="Direct link to Implementation Philosophy" translate="no">​</a></h2>
<p>We've designed custom operations following Postel's Law: "be liberal in what you accept and conservative in what you send." The system is flexible with inputs (your Bot receives the raw POST body) but strict with outputs (responses are properly formatted according to the OperationDefinition).</p>
<p>This approach prioritizes developer experience while maintaining FHIR compliance for API consumers.</p>
<h2 class="anchor anchorTargetStickyNavbar_SAay" id="looking-forward">Looking Forward<a href="https://www.medplum.com/blog/custom-fhir-operations#looking-forward" class="hash-link" aria-label="Direct link to Looking Forward" title="Direct link to Looking Forward" translate="no">​</a></h2>
<p>This initial implementation focuses on Bot-backed operations, but the framework is extensible. Future versions could support external web service implementations or other execution models.</p>
<p>We're also considering whether customers should be able to override built-in operations – a powerful capability that opens interesting possibilities while requiring careful consideration of the implications.</p>
<h2 class="anchor anchorTargetStickyNavbar_SAay" id="ready-to-try-it">Ready to Try It?<a href="https://www.medplum.com/blog/custom-fhir-operations#ready-to-try-it" class="hash-link" aria-label="Direct link to Ready to Try It?" title="Direct link to Ready to Try It?" translate="no">​</a></h2>
<p>Custom FHIR operations are available now in Medplum. Check out <a class="" href="https://www.medplum.com/docs/bots/custom-fhir-operations">our documentation</a> for detailed setup instructions, examples, and best practices.</p>
<p>This feature represents our commitment to providing healthcare developers with powerful, standards-compliant tools that adapt to real-world workflows. We can't wait to see what custom operations you build.</p>]]></content:encoded>
            <category>fhir-datastore</category>
            <category>integration</category>
            <category>auth</category>
            <category>community</category>
            <category>ai</category>
        </item>
        <item>
            <title><![CDATA[Medplum Support for Anthropic's Model Context Protocol (MCP)]]></title>
            <link>https://www.medplum.com/blog/unlocking-healthcare-ai-medplum-support-mcp</link>
            <guid>https://www.medplum.com/blog/unlocking-healthcare-ai-medplum-support-mcp</guid>
            <pubDate>Fri, 20 Jun 2025 00:00:00 GMT</pubDate>
            <description><![CDATA[Medplum is the platform of choice for technical leaders in healthcare, and that has given us a unique perspective into the transformative power of AI in healthcare - we get asked about it every single day.]]></description>
            <content:encoded><![CDATA[<p>Medplum is the platform of choice for technical leaders in healthcare, and that has given us a unique perspective into the transformative power of AI in healthcare - we get asked about it every single day.</p>
<p>We know that technical leaders feel the pressure to define and execute on an AI strategy, and to demonstrate tangible progress to teams and stakeholders, that's expected in times of rapid technical advances.</p>
<p>That's why we're thrilled to announce our beta support for Anthropic's <strong>Model Context Protocol (MCP)</strong>, marking a significant leap forward in how large language models (LLMs) can securely and intelligently interact with healthcare infrastructure and systems of record.</p>
<div class="responsive-iframe-wrapper"><iframe width="560" height="315" src="https://www.youtube.com/embed/y3gD7TQ-SM8" title="YouTube video player" frameborder="0" allow="accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture; web-share"></iframe></div>
<h2 class="anchor anchorTargetStickyNavbar_SAay" id="what-is-the-model-context-protocol-mcp">What is the Model Context Protocol (MCP)?<a href="https://www.medplum.com/blog/unlocking-healthcare-ai-medplum-support-mcp#what-is-the-model-context-protocol-mcp" class="hash-link" aria-label="Direct link to What is the Model Context Protocol (MCP)?" title="Direct link to What is the Model Context Protocol (MCP)?" translate="no">​</a></h2>
<p>Think of the Model Context Protocol (MCP) as the <strong>universal adapter for AI applications</strong>. Developed by Anthropic, MCP is an open standard designed to standardize how AI models, particularly LLMs, connect with and utilize external tools, systems, and data sources.</p>
<p><strong>MCP provides a structured way for LLMs to understand and interact with the outside world</strong>, moving beyond simple text generation to actual, actionable engagement with your existing infrastructure.</p>
<p>For healthcare, this is a game-changer due to the rigors of the workflow. Imagine LLMs not just summarizing information, but intelligently querying patient data (securely and appropriately), managing workflows, or even orchestrating integrations with medical devices. That's the promise of MCP.</p>
<h2 class="anchor anchorTargetStickyNavbar_SAay" id="medplums-next-step-empowering-intelligent-healthcare-applications-with-mcp">Medplum's Next Step: Empowering Intelligent Healthcare Applications with MCP<a href="https://www.medplum.com/blog/unlocking-healthcare-ai-medplum-support-mcp#medplums-next-step-empowering-intelligent-healthcare-applications-with-mcp" class="hash-link" aria-label="Direct link to Medplum's Next Step: Empowering Intelligent Healthcare Applications with MCP" title="Direct link to Medplum's Next Step: Empowering Intelligent Healthcare Applications with MCP" translate="no">​</a></h2>
<p>Our initial support for MCP leverages the official TypeScript SDK, with a focus on cloud-native interactions via SSE (Server-Sent Events) and Streamable HTTP. While the MCP team is pushing for Streamable HTTP, we're currently supporting both to ensure compatibility with major LLM vendors.</p>
<p>The real power we're unlocking comes from our custom <code>fhir-request</code> tool, exposed through our MCP API. This tool allows an LLM to invoke almost any function within the Medplum API, because nearly everything in Medplum is exposed as <strong>FHIR resources and operations</strong>.</p>
<p>Here's a glimpse of what you can do:</p>
<p><strong>Intelligent Data Retrieval</strong>: Imagine an LLM securely searching for synthetic patient data, reading specific observations, or getting conditions lists.<br>
<strong>Automated Workflows</strong>: LLMs can initiate and manage healthcare processes, like creating a new task, scheduling an appointment, or marking a task as completed.<br>
<strong>Complex Operations</strong>: Beyond standard FHIR resources, our fhir-request tool enables LLMs to trigger Medplum's powerful integrations and FHIR operations, such as submitting a Claim via $submit.</p>
<p>We're particularly optimistic about this pattern because <strong>LLMs already have a strong understanding of FHIR</strong>, allowing them to adapt to our API naturally and with surprising accuracy.</p>
<p>This capability is enhanced when combined with <a class="" href="https://www.medplum.com/docs/bots">Medplum Bots</a>. These are JavaScript/TypeScript snippets that run in response to triggers – imagine an LLM orchestrating a workflow that a Medplum Bot then executes, like deploying another Bot or executing a complex operation (<code>/Bot/{id}/$deploy</code>, <code>/Bot/{id}/$execute</code>).</p>
<p>And for those deeply embedded in existing healthcare infrastructure, our <a class="" href="https://www.medplum.com/docs/agent">Medplum Agent</a> takes this even further. The Agent provides on-premise connectivity to EHRs, LIS, RIS, PACS, and other devices. With MCP, an LLM could intelligently construct an HL7 v2 message and push it directly to an on-premise destination via <code>/Agent/{id}/$push</code> – that's truly sending data from the LLM chat to the front lines of healthcare delivery!</p>
<h2 class="anchor anchorTargetStickyNavbar_SAay" id="why-this-matters-staying-ahead-in-ai">Why This Matters: Staying Ahead in AI<a href="https://www.medplum.com/blog/unlocking-healthcare-ai-medplum-support-mcp#why-this-matters-staying-ahead-in-ai" class="hash-link" aria-label="Direct link to Why This Matters: Staying Ahead in AI" title="Direct link to Why This Matters: Staying Ahead in AI" translate="no">​</a></h2>
<p>For healthcare technical leaders, the message is clear: AI is no longer a distant future; it requires action today. The pressure to innovate and integrate AI into your healthcare strategy is real. Medplum's support for MCP offers a unique opportunity to:</p>
<p><strong>Experiment Safely and Intelligently</strong>: Get hands-on with cutting-edge AI integration without starting from scratch.<br>
<strong>Demonstrate Rapid Progress</strong>: Show your teams and leadership how AI can tangibly interact with healthcare data and workflows, even with experimental, de-identified data.<br>
<strong>Build Future-Proof Architectures</strong>: By embracing open standards like MCP, you're positioning your organization to seamlessly adopt the next generation of AI capabilities.<br>
<strong>Attract Top Talent</strong>: Signal that your organization is at the bleeding edge, embracing new technologies and solving complex problems.</p>
<p>We know you're looking for ways to leverage AI now to drive innovation and efficiency. Medplum, with MCP, provides a powerful pathway to explore these possibilities.</p>
<h2 class="anchor anchorTargetStickyNavbar_SAay" id="responsible-innovation-experimental-technology-ahead">Responsible Innovation: Experimental Technology Ahead<a href="https://www.medplum.com/blog/unlocking-healthcare-ai-medplum-support-mcp#responsible-innovation-experimental-technology-ahead" class="hash-link" aria-label="Direct link to Responsible Innovation: Experimental Technology Ahead" title="Direct link to Responsible Innovation: Experimental Technology Ahead" translate="no">​</a></h2>
<p>We are a healthcare company first and foremost, and that means prioritizing patient safety and data security above all else. Most major LLM vendors do not yet support HIPAA Business Associate Agreements (BAAs), and the landscape around production-grade, HIPAA-compliant AI integrations is still evolving rapidly.</p>
<p>Therefore, it is absolutely critical to understand that Medplum's current MCP implementation is a preview release and is experimental technology.</p>
<ul>
<li class="">Do not use this for protected health information (PHI).</li>
<li class="">Use only with synthetic, de-identified, or test data.</li>
<li class="">No guarantees are made about uptime or suitability for production workloads.</li>
<li class="">Proceed with caution and exercise your best judgment.</li>
</ul>
<p>Our commitment is to be a forward-leaning "high tech" player in healthcare. This means we make investments to get out in front of new technology trends, enabling you to explore future possibilities today. We're excited to offer this capability, but always with emphasis on responsible and ethical use.</p>
<h2 class="anchor anchorTargetStickyNavbar_SAay" id="join-medplums-mcp-beta-today">Join Medplum's MCP Beta Today<a href="https://www.medplum.com/blog/unlocking-healthcare-ai-medplum-support-mcp#join-medplums-mcp-beta-today" class="hash-link" aria-label="Direct link to Join Medplum's MCP Beta Today" title="Direct link to Join Medplum's MCP Beta Today" translate="no">​</a></h2>
<p>The current MCP implementation is available to all Medplum users. We encourage you to dive in and experiment!</p>
<p><strong>Existing Medplum users</strong>: Jump into your <a href="https://app.medplum.com/" target="_blank" rel="noopener noreferrer" class="">Medplum project</a> and start exploring our MCP capabilities. Look for the "beta" label and the associated disclaimers.</p>
<p><strong>New to Medplum?</strong> The first step is to <a class="" href="https://www.medplum.com/docs/tutorials/register">sign up for an account</a> and go through our standard "Getting Started" flow. Once you're up and running, you'll have access to our MCP features.</p>
<p>We believe this initial support for MCP will spark incredible innovation. We can't wait to see what you build!</p>
<h2 class="anchor anchorTargetStickyNavbar_SAay" id="how-to-set-it-up">How to Set it Up<a href="https://www.medplum.com/blog/unlocking-healthcare-ai-medplum-support-mcp#how-to-set-it-up" class="hash-link" aria-label="Direct link to How to Set it Up" title="Direct link to How to Set it Up" translate="no">​</a></h2>
<ul>
<li class="">Open <a href="https://claude.ai/" target="_blank" rel="noopener noreferrer" class="">Claude</a> and log in, you'll need to be on a paid plan to add integrations</li>
<li class="">Navigate to the <a href="https://claude.ai/settings/profile" target="_blank" rel="noopener noreferrer" class="">settings page</a> in the bottom left and then click on "Add Integration" on the Organization Integrations page.</li>
<li class="">In the diaglog that opens input "Medplum" for the <strong>Integration Name</strong>, and "<a href="https://api.medplum.com/mcp/stream" target="_blank" rel="noopener noreferrer" class="">https://api.medplum.com/mcp/stream</a>" for the <strong>Integration URL</strong> and click Add</li>
<li class="">Back on the Organization integrations page, you'll see a button to <strong>Connect</strong>, click on it and it will redirect you to Medplum where you should authenticate</li>
<li class="">You'll be redirected to the Integrations page where</li>
<li class="">Create a <a href="https://claude.ai/new" target="_blank" rel="noopener noreferrer" class="">New Chat</a> in Claude and paste the following</li>
</ul>
<blockquote>
<p>can you please confirm you have access to the "fhir-request" MCP tool?</p>
</blockquote>
<p>LLMs can cometimes cache sessions, so if you find yourself unable to connect you can disconnect and reconnect in a new chat in order to get back to a good state.</p>
<p>Feedback welcome at <a href="mailto:support@medplum.com" target="_blank" rel="noopener noreferrer" class="">support@medplum.com</a> or join our <a href="https://discord.gg/medplum" target="_blank" rel="noopener noreferrer" class="">Discord</a></p>]]></content:encoded>
            <category>self-host</category>
            <category>fhir-datastore</category>
            <category>integration</category>
            <category>compliance</category>
            <category>auth</category>
            <category>community</category>
            <category>ai</category>
        </item>
        <item>
            <title><![CDATA[Our Guide to Security Reports]]></title>
            <link>https://www.medplum.com/blog/security-reports</link>
            <guid>https://www.medplum.com/blog/security-reports</guid>
            <pubDate>Mon, 09 Jun 2025 00:00:00 GMT</pubDate>
            <description><![CDATA[As a founder, you wear a lot of hats. One of mine is handling the security reports that land in our inbox.]]></description>
            <content:encoded><![CDATA[<p>As a founder, you wear a lot of hats. One of mine is handling the security reports that land in our inbox.</p>
<p>Thanks to a strong security posture, including regular third-party pen tests, genuine vulnerability reports are rare. However, like any online business, we see a steady stream of security <em>inquiries</em>. These tend to fall into two distinct camps: the valuable, good-faith reports from legitimate researchers... and the noise.</p>
<p>The "noise" is what security expert Troy Hunt perfectly named <strong><a href="https://www.troyhunt.com/beg-bounties/" target="_blank" rel="noopener noreferrer" class="">"Beg Bounties."</a></strong> These are the low-effort, templated emails fishing for a payout for a non-issue.</p>
<p>We decided early on to be direct, transparent, and respectful of everyone's time—ours and the researcher's. So, when someone emails us about a potential vulnerability, here's the kind of response they can expect from us:</p>
<blockquote>
<p><strong>Subject: Re: Inquiry Regarding Security Issue</strong></p>
<p>Thanks for your interest in the security of the Medplum platform. We take all potential vulnerabilities seriously.</p>
<p>Our process is to first receive the full details of the potential issue, including steps to reproduce it. Once received, our team will validate the report.</p>
<p>To set clear expectations, we absolutely offer fair compensation for novel, verifiable vulnerabilities with a demonstrable security impact.</p>
<p>We do not, however, provide compensation for common out-of-scope reports, including:</p>
<ul>
<li class="">Suboptimal HTTP security header configurations</li>
<li class="">Missing best practices on DNS records (SPF/DKIM/DMARC)</li>
<li class="">Scanner output without a proven, practical exploit</li>
</ul>
<p>This approach allows us to focus on genuine, impactful security research. We look forward to receiving the details of your finding.</p>
<p>Best regards,</p>
<p>The Medplum Team</p>
</blockquote>
<p>That's it. It's a simple, firm, and fair template. Here's why it works for us:</p>
<ol>
<li class=""><strong>It puts process first.</strong> The conversation about money is on hold until we see a real vulnerability.</li>
<li class=""><strong>It filters out the noise.</strong> It clearly states what we don't pay for, saving everyone a lot of back-and-forth.</li>
<li class=""><strong>It encourages real research.</strong> It confirms we <em>do</em> pay for legitimate findings with a real-world impact.</li>
</ol>
<p>This email is our day-to-day tactic, but it's based on our official strategy, which is documented for anyone to see in our <strong><a href="https://github.com/medplum/medplum/blob/main/SECURITY.md" target="_blank" rel="noopener noreferrer" class="">Responsible Disclosure Policy on GitHub</a></strong>. It goes into more detail and includes a Safe Harbor clause to assure good-faith researchers they're protected.</p>
<p>The bottom line is simple: We take security seriously, and we take real security researchers seriously. If you have a legitimate, high-impact vulnerability, we genuinely want to hear from you and will be happy to compensate you for your work.</p>]]></content:encoded>
            <category>security</category>
            <category>compliance</category>
            <category>auth</category>
            <category>community</category>
        </item>
        <item>
            <title><![CDATA[EHRs, UDHPs, and Health Tech's Next Phase]]></title>
            <link>https://www.medplum.com/blog/ehr-vs-udhp</link>
            <guid>https://www.medplum.com/blog/ehr-vs-udhp</guid>
            <pubDate>Fri, 30 May 2025 00:00:00 GMT</pubDate>
            <description><![CDATA[Healthcare technology relies on established systems like Electronic Health Records (EHRs) and is now incorporating concepts like Unified Digital Health Platforms (UDHPs). Understanding this evolution is key to navigating the industry's direction.]]></description>
            <content:encoded><![CDATA[<p>Healthcare technology relies on established systems like Electronic Health Records (EHRs) and is now incorporating concepts like Unified Digital Health Platforms (UDHPs). Understanding this evolution is key to navigating the industry's direction.</p>
<h3 class="anchor anchorTargetStickyNavbar_SAay" id="ehrs-the-foundation-and-its-boundaries">EHRs: The Foundation and Its Boundaries<a href="https://www.medplum.com/blog/ehr-vs-udhp#ehrs-the-foundation-and-its-boundaries" class="hash-link" aria-label="Direct link to EHRs: The Foundation and Its Boundaries" title="Direct link to EHRs: The Foundation and Its Boundaries" translate="no">​</a></h3>
<p>EHRs were pivotal in digitizing patient records and streamlining billing. While foundational, many traditional EHRs present limitations in flexible data sharing, adaptability to varied workflows, and support for modern, rapid development cycles. These boundaries are less a critique of their original design and more an acknowledgment of today's expanded healthcare needs.</p>
<h3 class="anchor anchorTargetStickyNavbar_SAay" id="udhps-expanding-the-horizon">UDHPs: Expanding the Horizon<a href="https://www.medplum.com/blog/ehr-vs-udhp#udhps-expanding-the-horizon" class="hash-link" aria-label="Direct link to UDHPs: Expanding the Horizon" title="Direct link to UDHPs: Expanding the Horizon" translate="no">​</a></h3>
<p>Unified Digital Health Platforms (UDHPs) represent a move to address these limitations. Unlike monolithic EHRs, a UDHP is envisioned as an ecosystem platform fostering interoperability (often via FHIR®), enabling seamless data flow, and providing robust APIs to spur innovation. The interest in UDHPs centers on their potential to create more connected and responsive healthcare experiences by extending capabilities rather than solely storing records.</p>
<h3 class="anchor anchorTargetStickyNavbar_SAay" id="realizing-the-udhp-vision-implementation-matters">Realizing the UDHP Vision: Implementation Matters<a href="https://www.medplum.com/blog/ehr-vs-udhp#realizing-the-udhp-vision-implementation-matters" class="hash-link" aria-label="Direct link to Realizing the UDHP Vision: Implementation Matters" title="Direct link to Realizing the UDHP Vision: Implementation Matters" translate="no">​</a></h3>
<p>The UDHP concept is promising, but its practical realization depends heavily on the implementation approach. Healthcare's inherent diversity—unique organizational workflows, existing tech stacks, and specific patient needs—means a one-size-fits-all UDHP solution often falls short. The "last-mile" challenge of tailoring the platform to these specific needs is critical.</p>
<h3 class="anchor anchorTargetStickyNavbar_SAay" id="medplums-approach-a-developer-first-udhp-foundation">Medplum's Approach: A Developer-First UDHP Foundation<a href="https://www.medplum.com/blog/ehr-vs-udhp#medplums-approach-a-developer-first-udhp-foundation" class="hash-link" aria-label="Direct link to Medplum's Approach: A Developer-First UDHP Foundation" title="Direct link to Medplum's Approach: A Developer-First UDHP Foundation" translate="no">​</a></h3>
<p>At Medplum, we believe a developer-first strategy is essential to effectively harness the UDHP model. Our open-source, FHIR-native platform functions as a "headless EHR," providing the core, secure, and compliant infrastructure. This empowers healthcare organizations and innovators to:</p>
<ul>
<li class=""><strong>Build with Precision:</strong> Develop applications and workflows tailored to their exact requirements.</li>
<li class=""><strong>Ensure Data Interoperability:</strong> Leverage a FHIR-native data store for standardized and accessible information.</li>
<li class=""><strong>Automate Effectively:</strong> Utilize an extensible framework to create custom automation for clinical and administrative processes.</li>
</ul>
<p>This approach allows organizations to construct their own UDHP-powered solutions on a flexible foundation, ensuring the platform meets their unique needs and addresses integration challenges effectively.</p>
<h3 class="anchor anchorTargetStickyNavbar_SAay" id="building-a-connected-future">Building a Connected Future<a href="https://www.medplum.com/blog/ehr-vs-udhp#building-a-connected-future" class="hash-link" aria-label="Direct link to Building a Connected Future" title="Direct link to Building a Connected Future" translate="no">​</a></h3>
<p>The shift towards a UDHP model signifies a positive evolution, emphasizing greater connectivity and flexibility. Medplum is committed to supporting this evolution by providing robust, open tools for the builders who are shaping the future of healthcare technology.</p>]]></content:encoded>
            <category>self-host</category>
            <category>fhir-datastore</category>
            <category>integration</category>
            <category>compliance</category>
            <category>auth</category>
            <category>community</category>
        </item>
        <item>
            <title><![CDATA[So You’re Thinking About Forking]]></title>
            <link>https://www.medplum.com/blog/so-youre-thinking-about-forking</link>
            <guid>https://www.medplum.com/blog/so-youre-thinking-about-forking</guid>
            <pubDate>Thu, 15 May 2025 00:00:00 GMT</pubDate>
            <description><![CDATA[Forking can look like the fastest path to control, but it often becomes a long‑term maintenance tax. Here’s a pragmatic checklist to decide—and alternatives that usually win.]]></description>
            <content:encoded><![CDATA[<p>Forking can look like the fastest path to control, but it often becomes a long‑term maintenance tax. Here’s a pragmatic checklist to decide—and alternatives that usually win.</p>
<blockquote>
<p><strong>TL;DR</strong> Forking feels like freedom; more often it is technical debt in disguise. Before you spin up a divergent codebase, walk through the checklist below and consider proven collaboration patterns that deliver 90 % of the control with 10 % of the cost.</p>
</blockquote>
<h2 class="anchor anchorTargetStickyNavbar_SAay" id="the-temptation-tofork">The Temptation to&nbsp;Fork<a href="https://www.medplum.com/blog/so-youre-thinking-about-forking#the-temptation-tofork" class="hash-link" aria-label="Direct link to The Temptation to&nbsp;Fork" title="Direct link to The Temptation to&nbsp;Fork" translate="no">​</a></h2>
<p>Every open‑source maintainer eventually receives the same message: <em>“We love your project, but we need feature&nbsp;X immediately—so we’re considering a fork.”</em>&nbsp;The allure is clear:</p>
<ul>
<li class=""><strong>Unblocked roadmap</strong> No need to wait for upstream review cycles.</li>
<li class=""><strong>Rapid experimentation</strong> Freedom to rewrite modules, tweak schemas, or cut corners.</li>
<li class=""><strong>Perceived leverage</strong> A fork can feel like an insurance policy against future licence or direction changes.</li>
</ul>
<p>Yet the freedom is rarely free.</p>
<h2 class="anchor anchorTargetStickyNavbar_SAay" id="what-a-fork-reallymeans">What a Fork Really&nbsp;Means<a href="https://www.medplum.com/blog/so-youre-thinking-about-forking#what-a-fork-reallymeans" class="hash-link" aria-label="Direct link to What a Fork Really&nbsp;Means" title="Direct link to What a Fork Really&nbsp;Means" translate="no">​</a></h2>
<table><thead><tr><th>Hidden Cost</th><th>Why It Hurts Over&nbsp;Time</th></tr></thead><tbody><tr><td><strong>Merge fatigue</strong></td><td>Every upstream security patch, performance fix, or new feature now requires repeated cherry‑picks and conflict resolution.</td></tr><tr><td><strong>Security surface</strong></td><td>Divergent codepaths double the CVE tracking burden and slow incident response.</td></tr><tr><td><strong>Community isolation</strong></td><td>Third‑party plugins, docs, and Stack&nbsp;Overflow answers increasingly apply to the <em>mainline</em>, not your fork.</td></tr><tr><td><strong>Talent attraction</strong></td><td>Engineers prefer contributing to widely‑used projects; recruiting for a niche fork is tougher.</td></tr></tbody></table>
<p>At Medplum, we have seen partners launch forks with convinced leadership support—only to merge back within months after realising the hidden cost curve.</p>
<h2 class="anchor anchorTargetStickyNavbar_SAay" id="when-a-fork-is-justified">When a Fork <em>Is</em> Justified<a href="https://www.medplum.com/blog/so-youre-thinking-about-forking#when-a-fork-is-justified" class="hash-link" aria-label="Direct link to when-a-fork-is-justified" title="Direct link to when-a-fork-is-justified" translate="no">​</a></h2>
<p>There <strong>are</strong> legitimate scenarios:</p>
<ol>
<li class=""><strong>Project abandonment</strong> No active maintainers, unmerged PRs, stale security issues.</li>
<li class=""><strong>License retreat</strong> Upstream changes from permissive to restrictive terms.</li>
<li class=""><strong>Irreconcilable governance clash</strong> The core team rejects a domain‑specific regulatory requirement that your business legally must meet.</li>
</ol>
<p>If none of the above apply, pause before you type <code>git clone</code>.</p>
<h2 class="anchor anchorTargetStickyNavbar_SAay" id="alternatives-that-usuallywin">Alternatives That Usually&nbsp;Win<a href="https://www.medplum.com/blog/so-youre-thinking-about-forking#alternatives-that-usuallywin" class="hash-link" aria-label="Direct link to Alternatives That Usually&nbsp;Win" title="Direct link to Alternatives That Usually&nbsp;Win" translate="no">​</a></h2>
<h3 class="anchor anchorTargetStickyNavbar_SAay" id="contribute-upstream">Contribute Upstream<a href="https://www.medplum.com/blog/so-youre-thinking-about-forking#contribute-upstream" class="hash-link" aria-label="Direct link to Contribute Upstream" title="Direct link to Contribute Upstream" translate="no">​</a></h3>
<p>Large features land faster than you think when paired with a well‑structured proposal, passing tests, and open communication. For context, Medplum has merged &gt;1 000 community PRs, including entire modules such as the upcoming Kafka subscription channel.</p>
<h3 class="anchor anchorTargetStickyNavbar_SAay" id="maintain-a-thin-extensionlayer">Maintain a Thin Extension&nbsp;Layer<a href="https://www.medplum.com/blog/so-youre-thinking-about-forking#maintain-a-thin-extensionlayer" class="hash-link" aria-label="Direct link to Maintain a Thin Extension&nbsp;Layer" title="Direct link to Maintain a Thin Extension&nbsp;Layer" translate="no">​</a></h3>
<p>Build your business logic in a&nbsp;<strong>backend‑for‑frontend (BFF)</strong> or dedicated microservice, leaving the core FHIR server untouched. You keep velocity while upstream remains a drop‑in upgrade.</p>
<h3 class="anchor anchorTargetStickyNavbar_SAay" id="sponsor-roadmapwork">Sponsor Roadmap&nbsp;Work<a href="https://www.medplum.com/blog/so-youre-thinking-about-forking#sponsor-roadmapwork" class="hash-link" aria-label="Direct link to Sponsor Roadmap&nbsp;Work" title="Direct link to Sponsor Roadmap&nbsp;Work" translate="no">​</a></h3>
<p>If a feature is strategic but non‑differentiating—think sharding, compliance, or new spec versions—directly funding upstream development is often faster and cheaper than hiring a fork&nbsp;team.</p>
<h2 class="anchor anchorTargetStickyNavbar_SAay" id="case-study-four-years-of-medplumevolution">Case Study: Four Years of Medplum&nbsp;Evolution<a href="https://www.medplum.com/blog/so-youre-thinking-about-forking#case-study-four-years-of-medplumevolution" class="hash-link" aria-label="Direct link to Case Study: Four Years of Medplum&nbsp;Evolution" title="Direct link to Case Study: Four Years of Medplum&nbsp;Evolution" translate="no">​</a></h2>
<ul>
<li class=""><strong>250+ releases</strong> Semantic‑versioned, backwards‑compatible upgrades every two weeks.</li>
<li class=""><strong>New capabilities</strong> Subscriptions, bots, Azure/GCP execution targets, sharding, DoseSpot integration.</li>
<li class=""><strong>Regulatory alignment</strong> HIPAA, US&nbsp;Core, USCDI updates shipped continuously.</li>
</ul>
<p>A downstream fork would have needed to replicate every one of these changes—or risk falling behind on performance and compliance.</p>
<h2 class="anchor anchorTargetStickyNavbar_SAay" id="a-30minute-fork-decisionchecklist">A 30‑Minute Fork Decision&nbsp;Checklist<a href="https://www.medplum.com/blog/so-youre-thinking-about-forking#a-30minute-fork-decisionchecklist" class="hash-link" aria-label="Direct link to A 30‑Minute Fork Decision&nbsp;Checklist" title="Direct link to A 30‑Minute Fork Decision&nbsp;Checklist" translate="no">​</a></h2>
<ol>
<li class=""><strong>List blockers</strong> Write down the features or constraints driving the fork discussion.</li>
<li class=""><strong>Search the tracker</strong> Is someone already working on your need? Comment and collaborate.</li>
<li class=""><strong>Draft a proposal PR</strong> Even a&nbsp;work‑in‑progress branch sparks upstream feedback.</li>
<li class=""><strong>Estimate ownership cost</strong> How many engineer‑months per year will merges, CI, and CVE triage consume? Multiply by three.</li>
<li class=""><strong>Schedule an architecture chat</strong> Most maintainers (Medplum included) are happy to roadmap with partners—often unlocking an upstream path.</li>
</ol>
<h2 class="anchor anchorTargetStickyNavbar_SAay" id="conclusion--nextsteps">Conclusion &amp; Next&nbsp;Steps<a href="https://www.medplum.com/blog/so-youre-thinking-about-forking#conclusion--nextsteps" class="hash-link" aria-label="Direct link to Conclusion &amp; Next&nbsp;Steps" title="Direct link to Conclusion &amp; Next&nbsp;Steps" translate="no">​</a></h2>
<p>Forking should be the <em>exception</em>, not the default. The open‑source ecosystem thrives when contributors pull in the same direction, sharing maintenance and innovation. Before you commit to life on a fork:</p>
<ul>
<li class="">Open an issue outlining your blockers.</li>
<li class="">Gauge maintainer responsiveness on a small PR.</li>
<li class="">Consider a thin extension or sponsored roadmap work.</li>
</ul>
<p><strong>Our door is always open.</strong> If you’re weighing a fork—or just need architectural advice—reach out in the Medplum&nbsp;Slack, book office hours, or send us a pull&nbsp;request.</p>
<blockquote>
<p><em>Move fast—but merge faster.</em></p>
</blockquote>]]></content:encoded>
            <category>self-host</category>
            <category>fhir-datastore</category>
            <category>integration</category>
            <category>compliance</category>
            <category>auth</category>
            <category>community</category>
        </item>
        <item>
            <title><![CDATA[Preparing for Medplum v5]]></title>
            <link>https://www.medplum.com/blog/preparing-for-v5</link>
            <guid>https://www.medplum.com/blog/preparing-for-v5</guid>
            <pubDate>Mon, 12 May 2025 00:00:00 GMT</pubDate>
            <description><![CDATA[As the open source healthcare developer platform of choice for innovators worldwide, Medplum continues to evolve with the rapidly changing technology landscape. We're excited to announce our upcoming major version release, Medplum v5, scheduled for October 2025. This post outlines the significant changes coming in this release to help our users prepare accordingly.]]></description>
            <content:encoded><![CDATA[<p>As the open source healthcare developer platform of choice for innovators worldwide, Medplum continues to evolve with the rapidly changing technology landscape. We're excited to announce our upcoming major version release, Medplum v5, scheduled for October 2025. This post outlines the significant changes coming in this release to help our users prepare accordingly.</p>
<h2 class="anchor anchorTargetStickyNavbar_SAay" id="modern-runtime-dependencies">Modern Runtime Dependencies<a href="https://www.medplum.com/blog/preparing-for-v5#modern-runtime-dependencies" class="hash-link" aria-label="Direct link to Modern Runtime Dependencies" title="Direct link to Modern Runtime Dependencies" translate="no">​</a></h2>
<p>Medplum v5 makes several important dependency upgrades to provide the best performance, security, and developer experience:</p>
<h3 class="anchor anchorTargetStickyNavbar_SAay" id="nodejs">Node.js<a href="https://www.medplum.com/blog/preparing-for-v5#nodejs" class="hash-link" aria-label="Direct link to Node.js" title="Direct link to Node.js" translate="no">​</a></h3>
<ul>
<li class=""><strong>Dropping support for Node 20</strong> (which reaches end-of-life in April 2026)</li>
<li class=""><strong>Supporting Node 22 and 24</strong> - taking advantage of the latest JavaScript runtime features and performance improvements</li>
<li class="">Node 22 brings significant performance improvements with its Maglev compiler, enhanced WebSocket support, and better error handling for async middleware</li>
</ul>
<h3 class="anchor anchorTargetStickyNavbar_SAay" id="postgresql">PostgreSQL<a href="https://www.medplum.com/blog/preparing-for-v5#postgresql" class="hash-link" aria-label="Direct link to PostgreSQL" title="Direct link to PostgreSQL" translate="no">​</a></h3>
<ul>
<li class=""><strong>Dropping support for Postgres 13</strong> (which reaches end-of-life in November 2025)</li>
<li class=""><strong>Adding support for Postgres 18</strong> (releasing September 2025)</li>
<li class="">Postgres 18 introduces major performance improvements with its new asynchronous I/O subsystem, enabling up to 2-3x faster operations for sequential scans and other common operations</li>
</ul>
<h3 class="anchor anchorTargetStickyNavbar_SAay" id="redis">Redis<a href="https://www.medplum.com/blog/preparing-for-v5#redis" class="hash-link" aria-label="Direct link to Redis" title="Direct link to Redis" translate="no">​</a></h3>
<ul>
<li class=""><strong>Dropping support for Redis 6</strong> (reaching end-of-life)</li>
<li class=""><strong>Continuing support for all active Redis 7 versions</strong></li>
<li class="">Redis 7 includes Redis Functions, ACLv2, command introspection, and Sharded Pub/Sub, significantly enhancing flexibility and performance</li>
</ul>
<h2 class="anchor anchorTargetStickyNavbar_SAay" id="frontend-modernization">Frontend Modernization<a href="https://www.medplum.com/blog/preparing-for-v5#frontend-modernization" class="hash-link" aria-label="Direct link to Frontend Modernization" title="Direct link to Frontend Modernization" translate="no">​</a></h2>
<h3 class="anchor anchorTargetStickyNavbar_SAay" id="react-and-ui-components">React and UI Components<a href="https://www.medplum.com/blog/preparing-for-v5#react-and-ui-components" class="hash-link" aria-label="Direct link to React and UI Components" title="Direct link to React and UI Components" translate="no">​</a></h3>
<ul>
<li class=""><strong>Dropping support for React 18</strong></li>
<li class=""><strong>Requiring React 19 only</strong> - we've already migrated internally and are prepared to support one React version moving forward</li>
<li class=""><strong>Upgrading from Mantine 7 to Mantine 8</strong> for our front-end components<!-- -->
<ul>
<li class="">Mantine 8 features improved date handling, new CSS-based organization, and enhanced typescript support</li>
</ul>
</li>
</ul>
<h3 class="anchor anchorTargetStickyNavbar_SAay" id="web-framework-and-code-quality">Web Framework and Code Quality<a href="https://www.medplum.com/blog/preparing-for-v5#web-framework-and-code-quality" class="hash-link" aria-label="Direct link to Web Framework and Code Quality" title="Direct link to Web Framework and Code Quality" translate="no">​</a></h3>
<ul>
<li class=""><strong>Upgrading Express from v4 to v5</strong>
<ul>
<li class="">Express 5 brings stronger Node 18+ compatibility, automatic error handling for async/await functions, and improved security</li>
</ul>
</li>
<li class=""><strong>Replacing ESLint and Prettier with Biome</strong>
<ul>
<li class="">This unified toolchain offers faster performance, simpler configuration, and reduced dependency overhead</li>
<li class="">Note: Our <code>@medplum/eslint-config</code> package will be deprecated as part of this transition</li>
</ul>
</li>
</ul>
<h2 class="anchor anchorTargetStickyNavbar_SAay" id="planning-your-migration">Planning Your Migration<a href="https://www.medplum.com/blog/preparing-for-v5#planning-your-migration" class="hash-link" aria-label="Direct link to Planning Your Migration" title="Direct link to Planning Your Migration" translate="no">​</a></h2>
<p>We recommend self-hosted customers begin preparation for these changes, particularly:</p>
<ol>
<li class="">
<p><strong>Database planning</strong>: Schedule Postgres upgrades and Redis updates with your DevOps team. These infrastructure components require careful migration planning.</p>
</li>
<li class="">
<p><strong>Application codebase</strong>: Review any custom apps built on Medplum to ensure compatibility with newer React, Node, and Express versions.</p>
</li>
<li class="">
<p><strong>Development environment</strong>: Consider upgrading local development environments to test with newer versions ahead of the v5 release.</p>
</li>
</ol>
<h2 class="anchor anchorTargetStickyNavbar_SAay" id="the-benefits-of-upgrading">The Benefits of Upgrading<a href="https://www.medplum.com/blog/preparing-for-v5#the-benefits-of-upgrading" class="hash-link" aria-label="Direct link to The Benefits of Upgrading" title="Direct link to The Benefits of Upgrading" translate="no">​</a></h2>
<p>While upgrades may require some adjustment, Medplum v5 delivers significant advantages:</p>
<ul>
<li class=""><strong>Performance</strong>: Benefit from substantial performance improvements across the entire stack</li>
<li class=""><strong>Security</strong>: Access the latest security features and mitigations in all dependencies</li>
<li class=""><strong>Developer experience</strong>: Enjoy better tooling, faster build times, and modern language features</li>
<li class=""><strong>Future-proofing</strong>: Set your healthcare solutions on a stable foundation for years to come</li>
</ul>
<h2 class="anchor anchorTargetStickyNavbar_SAay" id="timeline">Timeline<a href="https://www.medplum.com/blog/preparing-for-v5#timeline" class="hash-link" aria-label="Direct link to Timeline" title="Direct link to Timeline" translate="no">​</a></h2>
<ul>
<li class=""><strong>May 2025</strong>: Blog post and initial announcements</li>
<li class=""><strong>September 2025</strong>: Medplum v5 beta release</li>
<li class=""><strong>October 2025</strong>: General availability release</li>
</ul>
<p>We're committed to making this transition as smooth as possible. Our team will provide detailed migration guides, support resources, and early access testing opportunities as we approach the release date.</p>
<h2 class="anchor anchorTargetStickyNavbar_SAay" id="stay-connected">Stay Connected<a href="https://www.medplum.com/blog/preparing-for-v5#stay-connected" class="hash-link" aria-label="Direct link to Stay Connected" title="Direct link to Stay Connected" translate="no">​</a></h2>
<p>For questions, concerns, or feedback about the upcoming v5 release, please join the conversation on <a href="https://discord.gg/medplum" target="_blank" rel="noopener noreferrer" class="">Discord</a> or submit issues on <a href="https://github.com/medplum/medplum" target="_blank" rel="noopener noreferrer" class="">GitHub</a>.</p>
<p>By embracing these modern technologies, Medplum continues its mission to accelerate healthcare innovation through powerful, interoperable, and developer-friendly tools.</p>]]></content:encoded>
            <category>self-host</category>
            <category>fhir-datastore</category>
            <category>integration</category>
            <category>compliance</category>
            <category>auth</category>
            <category>community</category>
        </item>
        <item>
            <title><![CDATA[Multi-Tenant MSO with Medplum]]></title>
            <link>https://www.medplum.com/blog/multi-tenant-mso</link>
            <guid>https://www.medplum.com/blog/multi-tenant-mso</guid>
            <pubDate>Tue, 22 Apr 2025 00:00:00 GMT</pubDate>
            <description><![CDATA[In the Medplum community of implementors, a common use case is building an application that serves multiple clinics in the form of a Managed Service Organization (MSO). An MSO is a separate business entity that provides non-clinical services—e.g., revenue-cycle management, HR, IT, compliance, facilities, and purchasing—to physician groups or other provider organizations.]]></description>
            <content:encoded><![CDATA[<p>In the Medplum community of implementors, a common use case is building an application that <strong>serves multiple clinics</strong> in the form of a Managed Service Organization (MSO). An MSO is a separate business entity that provides non-clinical services—e.g., revenue-cycle management, HR, IT, compliance, facilities, and purchasing—to physician groups or other provider organizations.</p>
<p>In this post, we'll focus on some key features of an MSO application using Medplum: <a href="https://www.medplum.com/blog/multi-tenant-mso#tenant-management-with-organizations" class="">multi-tenancy</a>, <a href="https://www.medplum.com/blog/multi-tenant-mso#access-control" class="">access control</a>, <a href="https://www.medplum.com/blog/multi-tenant-mso#additional-access-control-patient-consent" class="">patient consent management</a>, and <a href="https://www.medplum.com/blog/multi-tenant-mso#user-management-strategy" class="">project-scoped users</a>. The application also supports FHIR, C-CDA and HL7v2 interfacing making it well suited to interface with record-keeping solutions across multiple practices.</p>
<p>If you haven't checked out the <strong>MSO Demo App</strong> yet, you can view the code <a href="https://github.com/medplum/medplum-mso-demo" target="_blank" rel="noopener noreferrer" class="">here</a> or watch our demo video below. The demo app is an example implementation for how to build the enrollment workflows and user management console for clinicians and patients across different clinics of an MSO provider network.</p>
<div class="responsive-iframe-wrapper"><iframe src="https://www.youtube.com/embed/FJIZTI9_fBc?start=0" title="YouTube video player" frameborder="0" allow="accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture"></iframe></div>
<h2 class="anchor anchorTargetStickyNavbar_SAay" id="understanding-the-mso-architectural-needs">Understanding the MSO Architectural Needs<a href="https://www.medplum.com/blog/multi-tenant-mso#understanding-the-mso-architectural-needs" class="hash-link" aria-label="Direct link to Understanding the MSO Architectural Needs" title="Direct link to Understanding the MSO Architectural Needs" translate="no">​</a></h2>
<p>At its core, an MSO usually needs to handle the following requirements:</p>
<ul>
<li class="">Multiple clinics (tenants) sharing the same platform</li>
<li class=""><a href="https://github.com/medplum/medplum-mso-demo/blob/main/src/operations/enrollment.ts" target="_blank" rel="noopener noreferrer" class="">Enrollment workflows</a> that allow Practitioners and Patients to be added and removed from one or more clinics</li>
<li class="">Customizable access control which Users have access to which resources. This can built with varying levels of sophistication depending on how restrictive the MSO wants to be.</li>
<li class=""><a class="" href="https://www.medplum.com/docs/administration/provider-directory">Provider directory</a> to group and display clinicians from across the MSO.</li>
</ul>
<h2 class="anchor anchorTargetStickyNavbar_SAay" id="core-implementation">Core Implementation<a href="https://www.medplum.com/blog/multi-tenant-mso#core-implementation" class="hash-link" aria-label="Direct link to Core Implementation" title="Direct link to Core Implementation" translate="no">​</a></h2>
<h3 class="anchor anchorTargetStickyNavbar_SAay" id="tenant-management-with-organizations">Tenant Management with Organizations<a href="https://www.medplum.com/blog/multi-tenant-mso#tenant-management-with-organizations" class="hash-link" aria-label="Direct link to Tenant Management with Organizations" title="Direct link to Tenant Management with Organizations" translate="no">​</a></h3>
<p>To achieve multi-tenancy with Medplum while allowing for some level of coordination between tenants, the recommended pattern is to represent each healthcare clinic as an <a class="" href="https://www.medplum.com/docs/api/fhir/resources/organization">Organization</a> resource, all within a single Medplum <a class="" href="https://www.medplum.com/docs/api/fhir/medplum/project">Project</a>.</p>
<div class="language-ts codeBlockContainer_ZGJx theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_kX1v"><pre tabindex="0" class="prism-code language-ts codeBlock_TAPP thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_AdAo"><span class="token-line" style="color:#393A34"><span class="token keyword" style="color:#00009f">const</span><span class="token plain"> clinic </span><span class="token operator" style="color:#393A34">=</span><span class="token plain"> </span><span class="token keyword" style="color:#00009f">await</span><span class="token plain"> medplum</span><span class="token punctuation" style="color:#393A34">.</span><span class="token generic-function function" style="color:#d73a49">createResource</span><span class="token generic-function generic class-name operator" style="color:#393A34">&lt;</span><span class="token generic-function generic class-name">Organization</span><span class="token generic-function generic class-name operator" style="color:#393A34">&gt;</span><span class="token punctuation" style="color:#393A34">(</span><span class="token punctuation" style="color:#393A34">{</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">  resourceType</span><span class="token operator" style="color:#393A34">:</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">'Organization'</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">  name</span><span class="token operator" style="color:#393A34">:</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">'Kings Landing Health Center'</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">  active</span><span class="token operator" style="color:#393A34">:</span><span class="token plain"> </span><span class="token boolean" style="color:#36acaa">true</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token punctuation" style="color:#393A34">}</span><span class="token punctuation" style="color:#393A34">)</span><span class="token punctuation" style="color:#393A34">;</span><br></span></code></pre></div></div>
<h2 class="anchor anchorTargetStickyNavbar_SAay" id="access-control">Access Control<a href="https://www.medplum.com/blog/multi-tenant-mso#access-control" class="hash-link" aria-label="Direct link to Access Control" title="Direct link to Access Control" translate="no">​</a></h2>
<h3 class="anchor anchorTargetStickyNavbar_SAay" id="organizationally-contained-access-restrictions">Organizationally Contained Access Restrictions<a href="https://www.medplum.com/blog/multi-tenant-mso#organizationally-contained-access-restrictions" class="hash-link" aria-label="Direct link to Organizationally Contained Access Restrictions" title="Direct link to Organizationally Contained Access Restrictions" translate="no">​</a></h3>
<div class="theme-admonition theme-admonition-info admonition_IZjC alert alert--info"><div class="admonitionHeading_uVvU"><span class="admonitionIcon_HiR3"><svg viewBox="0 0 14 16"><path fill-rule="evenodd" d="M7 2.3c3.14 0 5.7 2.56 5.7 5.7s-2.56 5.7-5.7 5.7A5.71 5.71 0 0 1 1.3 8c0-3.14 2.56-5.7 5.7-5.7zM7 1C3.14 1 0 4.14 0 8s3.14 7 7 7 7-3.14 7-7-3.14-7-7-7zm1 3H6v5h2V4zm0 6H6v2h2v-2z"></path></svg></span>info</div><div class="admonitionContent_bl22"><p>To see reference implementation of each enrollment operation, see the <a href="https://github.com/medplum/medplum-mso-demo/blob/main/src/utils/enrollment.ts" target="_blank" rel="noopener noreferrer" class="">MSO Demo App Enrollment Operations</a>.</p></div></div>
<p>The most basic MSO access control model is to <strong>restrict access to resources that share a common Organization assignment</strong>.</p>
<p>Imposing these restrictions on Practitioner users is done via Medplum's <a class="" href="https://www.medplum.com/docs/access/access-policies">AccessPolicies</a>, which are applied to each Practitioner user's <a class="" href="https://www.medplum.com/docs/api/fhir/medplum/projectmembership">ProjectMembership</a>.</p>
<p><strong>Enrollment of a Practitioner into an Organization</strong> is done by adding a Organization reference to the Practitioner ProjectMembership's <strong>access</strong> field. Here is an example for a Practitioner enrolled in one Organization:</p>
<div class="language-ts codeBlockContainer_ZGJx theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_kX1v"><pre tabindex="0" class="prism-code language-ts codeBlock_TAPP thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_AdAo"><span class="token-line" style="color:#393A34"><span class="token punctuation" style="color:#393A34">{</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"> </span><span class="token string-property property" style="color:#36acaa">"resourceType"</span><span class="token operator" style="color:#393A34">:</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">"ProjectMembership"</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"> </span><span class="token comment" style="color:#999988;font-style:italic">//...</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"> </span><span class="token string-property property" style="color:#36acaa">"access"</span><span class="token operator" style="color:#393A34">:</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">[</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">   </span><span class="token punctuation" style="color:#393A34">{</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">     </span><span class="token string-property property" style="color:#36acaa">"parameter"</span><span class="token operator" style="color:#393A34">:</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">[</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">       </span><span class="token punctuation" style="color:#393A34">{</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">         </span><span class="token string-property property" style="color:#36acaa">"name"</span><span class="token operator" style="color:#393A34">:</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">"organization"</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">         </span><span class="token string-property property" style="color:#36acaa">"valueReference"</span><span class="token operator" style="color:#393A34">:</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">{</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">           </span><span class="token string-property property" style="color:#36acaa">"reference"</span><span class="token operator" style="color:#393A34">:</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">"Organization/0195b4a4-0ed7-71ed-80cf-c6fff1e31152"</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">           </span><span class="token string-property property" style="color:#36acaa">"display"</span><span class="token operator" style="color:#393A34">:</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">"Kings Landing Health Center"</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">         </span><span class="token punctuation" style="color:#393A34">}</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">       </span><span class="token punctuation" style="color:#393A34">}</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">     </span><span class="token punctuation" style="color:#393A34">]</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">     </span><span class="token string-property property" style="color:#36acaa">"policy"</span><span class="token operator" style="color:#393A34">:</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">{</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">       </span><span class="token string-property property" style="color:#36acaa">"reference"</span><span class="token operator" style="color:#393A34">:</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">"AccessPolicy/0195b4a3-374e-75cf-a6f0-0bcee7c754c5"</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">     </span><span class="token punctuation" style="color:#393A34">}</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">   </span><span class="token punctuation" style="color:#393A34">}</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">]</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token punctuation" style="color:#393A34">}</span><br></span></code></pre></div></div>
<p><strong>Enrollment of a Patient into an Organization</strong> uses <a class="" href="https://www.medplum.com/docs/access/access-policies#compartments">Compartments</a>, which provide a way to tag Patient resources with the Organization references that it belongs to. So for example, a Patient enrolled in two Organizations might look like this:</p>
<div class="language-ts codeBlockContainer_ZGJx theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_kX1v"><pre tabindex="0" class="prism-code language-ts codeBlock_TAPP thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_AdAo"><span class="token-line" style="color:#393A34"><span class="token punctuation" style="color:#393A34">{</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"> </span><span class="token string-property property" style="color:#36acaa">"resourceType"</span><span class="token operator" style="color:#393A34">:</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">"Patient"</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"> </span><span class="token comment" style="color:#999988;font-style:italic">//...</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"> </span><span class="token string-property property" style="color:#36acaa">"meta"</span><span class="token operator" style="color:#393A34">:</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">{</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">   </span><span class="token string-property property" style="color:#36acaa">"project"</span><span class="token operator" style="color:#393A34">:</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">"019571c0-035b-72fe-a5fa-75d13a09589c"</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">   </span><span class="token string-property property" style="color:#36acaa">"compartment"</span><span class="token operator" style="color:#393A34">:</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">[</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">     </span><span class="token punctuation" style="color:#393A34">{</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">       </span><span class="token string-property property" style="color:#36acaa">"reference"</span><span class="token operator" style="color:#393A34">:</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">"Organization/019571c0-035b-72fe-a5fa-75d13a09589c"</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">       </span><span class="token string-property property" style="color:#36acaa">"display"</span><span class="token operator" style="color:#393A34">:</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">"King's Landing Center for Medicine"</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">     </span><span class="token punctuation" style="color:#393A34">}</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">     </span><span class="token punctuation" style="color:#393A34">{</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">       </span><span class="token string-property property" style="color:#36acaa">"reference"</span><span class="token operator" style="color:#393A34">:</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">"Organization/0195b4a3-e637-77e2-ab0c-7ec36b68932d"</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">       </span><span class="token string-property property" style="color:#36acaa">"display"</span><span class="token operator" style="color:#393A34">:</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">"Winterfell Pediatrics Center"</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">     </span><span class="token punctuation" style="color:#393A34">}</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">   </span><span class="token punctuation" style="color:#393A34">]</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">}</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token punctuation" style="color:#393A34">}</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></span></code></pre></div></div>
<p>Because of the Patient's <a href="https://build.fhir.org/compartmentdefinition-patient.html" target="_blank" rel="noopener noreferrer" class="">compartment definition</a>, which is essentially a way to link related resource types to the Patient resource, we can set the <strong>compartment</strong> array on the Patient resource and have that same <strong>compartment</strong> propogate to all the other resources related to the Patient. These are resources like Appointments, Observations, and DiagnosticReports that should all inherit the same access restrictions. This is done using the Patient <a class="" href="https://www.medplum.com/docs/api/fhir/operations/patient-set-accounts">$set-accounts</a> FHIR operation.</p>
<p>For example, say you want to enroll <em>Patient/123</em> into two Organizations, <em>Organization/789</em> and <em>Organization/456</em>. You can do this by making the following request:</p>
<div class="language-ts codeBlockContainer_ZGJx theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_kX1v"><pre tabindex="0" class="prism-code language-ts codeBlock_TAPP thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_AdAo"><span class="token-line" style="color:#393A34"><span class="token keyword" style="color:#00009f">const</span><span class="token plain"> response </span><span class="token operator" style="color:#393A34">=</span><span class="token plain"> </span><span class="token keyword" style="color:#00009f">await</span><span class="token plain"> medplum</span><span class="token punctuation" style="color:#393A34">.</span><span class="token function" style="color:#d73a49">post</span><span class="token punctuation" style="color:#393A34">(</span><span class="token string" style="color:#e3116c">'/fhir/R4/Patient/123/$set-accounts'</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">{</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">  resourceType</span><span class="token operator" style="color:#393A34">:</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">'Parameters'</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">  parameter</span><span class="token operator" style="color:#393A34">:</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">[</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token punctuation" style="color:#393A34">{</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">      name</span><span class="token operator" style="color:#393A34">:</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">'accounts'</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">      valueReference</span><span class="token operator" style="color:#393A34">:</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">{</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">        reference</span><span class="token operator" style="color:#393A34">:</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">'Organization/789'</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">      </span><span class="token punctuation" style="color:#393A34">}</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token punctuation" style="color:#393A34">}</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token punctuation" style="color:#393A34">{</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">      name</span><span class="token operator" style="color:#393A34">:</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">'accounts'</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">      valueReference</span><span class="token operator" style="color:#393A34">:</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">{</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">        reference</span><span class="token operator" style="color:#393A34">:</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">'Organization/456'</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">      </span><span class="token punctuation" style="color:#393A34">}</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token punctuation" style="color:#393A34">}</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token punctuation" style="color:#393A34">{</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">      name</span><span class="token operator" style="color:#393A34">:</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">'propagate'</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">      valueBoolean</span><span class="token operator" style="color:#393A34">:</span><span class="token plain"> </span><span class="token boolean" style="color:#36acaa">true</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token punctuation" style="color:#393A34">}</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">  </span><span class="token punctuation" style="color:#393A34">]</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token punctuation" style="color:#393A34">}</span><span class="token punctuation" style="color:#393A34">)</span><span class="token punctuation" style="color:#393A34">;</span><br></span></code></pre></div></div>
<p>Then, the <a class="" href="https://www.medplum.com/docs/access/access-policies">AccessPolicy</a> can be configured to restrict access to all of the resources based on the Organization references in each resource's <strong>compartment</strong>. Here is what the Practitioner AccessPolicy might look like:</p>
<div class="theme-admonition theme-admonition-info admonition_IZjC alert alert--info"><div class="admonitionHeading_uVvU"><span class="admonitionIcon_HiR3"><svg viewBox="0 0 14 16"><path fill-rule="evenodd" d="M7 2.3c3.14 0 5.7 2.56 5.7 5.7s-2.56 5.7-5.7 5.7A5.71 5.71 0 0 1 1.3 8c0-3.14 2.56-5.7 5.7-5.7zM7 1C3.14 1 0 4.14 0 8s3.14 7 7 7 7-3.14 7-7-3.14-7-7-7zm1 3H6v5h2V4zm0 6H6v2h2v-2z"></path></svg></span>info</div><div class="admonitionContent_bl22"><p>The <code>%organization</code> value is replaced at runtime with one or more of the Organization references from the Practitioner's ProjectMembership.access array</p></div></div>
<div class="language-ts codeBlockContainer_ZGJx theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_kX1v"><pre tabindex="0" class="prism-code language-ts codeBlock_TAPP thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_AdAo"><span class="token-line" style="color:#393A34"><span class="token punctuation" style="color:#393A34">{</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"> </span><span class="token string-property property" style="color:#36acaa">"resourceType"</span><span class="token operator" style="color:#393A34">:</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">"AccessPolicy"</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"> </span><span class="token string-property property" style="color:#36acaa">"name"</span><span class="token operator" style="color:#393A34">:</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">"Managed Service Organization Access Policy"</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"> </span><span class="token string-property property" style="color:#36acaa">"compartment"</span><span class="token operator" style="color:#393A34">:</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">{</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">   </span><span class="token string-property property" style="color:#36acaa">"reference"</span><span class="token operator" style="color:#393A34">:</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">"%organization"</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">}</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"> </span><span class="token string-property property" style="color:#36acaa">"resource"</span><span class="token operator" style="color:#393A34">:</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">[</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">   </span><span class="token punctuation" style="color:#393A34">{</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">     </span><span class="token string-property property" style="color:#36acaa">"resourceType"</span><span class="token operator" style="color:#393A34">:</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">"Patient"</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">     </span><span class="token string-property property" style="color:#36acaa">"criteria"</span><span class="token operator" style="color:#393A34">:</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">"Patient?_compartment=%organization"</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">   </span><span class="token punctuation" style="color:#393A34">}</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">   </span><span class="token punctuation" style="color:#393A34">{</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">     </span><span class="token string-property property" style="color:#36acaa">"resourceType"</span><span class="token operator" style="color:#393A34">:</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">"Observation"</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">     </span><span class="token string-property property" style="color:#36acaa">"criteria"</span><span class="token operator" style="color:#393A34">:</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">"Observation?_compartment=%organization"</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">   </span><span class="token punctuation" style="color:#393A34">}</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">   </span><span class="token punctuation" style="color:#393A34">{</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">     </span><span class="token string-property property" style="color:#36acaa">"resourceType"</span><span class="token operator" style="color:#393A34">:</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">"DiagnosticReport"</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">     </span><span class="token string-property property" style="color:#36acaa">"criteria"</span><span class="token operator" style="color:#393A34">:</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">"DiagnosticReport?_compartment=%organization"</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">   </span><span class="token punctuation" style="color:#393A34">}</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">   </span><span class="token punctuation" style="color:#393A34">{</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">     </span><span class="token string-property property" style="color:#36acaa">"resourceType"</span><span class="token operator" style="color:#393A34">:</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">"Encounter"</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">     </span><span class="token string-property property" style="color:#36acaa">"criteria"</span><span class="token operator" style="color:#393A34">:</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">"Encounter?_compartment=%organization"</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">   </span><span class="token punctuation" style="color:#393A34">}</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">   </span><span class="token punctuation" style="color:#393A34">{</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">     </span><span class="token string-property property" style="color:#36acaa">"resourceType"</span><span class="token operator" style="color:#393A34">:</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">"Communication"</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">     </span><span class="token string-property property" style="color:#36acaa">"criteria"</span><span class="token operator" style="color:#393A34">:</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">"Communication?_compartment=%organization"</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">   </span><span class="token punctuation" style="color:#393A34">}</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">   </span><span class="token comment" style="color:#999988;font-style:italic">//...</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">]</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token punctuation" style="color:#393A34">}</span><br></span></code></pre></div></div>
<h3 class="anchor anchorTargetStickyNavbar_SAay" id="additional-access-control-patient-consent">Additional Access Control: Patient Consent<a href="https://www.medplum.com/blog/multi-tenant-mso#additional-access-control-patient-consent" class="hash-link" aria-label="Direct link to Additional Access Control: Patient Consent" title="Direct link to Additional Access Control: Patient Consent" translate="no">​</a></h3>
<p>What if we want to do everything discussed above but also restrict any access until the Patient has given consent?</p>
<p>To do this, we can create a universal <a class="" href="https://www.medplum.com/docs/api/fhir/resources/consent">Consent</a> resource with its <em>status</em> set to <em>active</em> that can also be added to the Patient's compartment and extended to all resources related to the Patient using the <a class="" href="https://www.medplum.com/docs/api/fhir/operations/patient-set-accounts">$set-accounts</a> operation. Then to revoke Patient consent, you can simply remove the Consent resource from the Patient's compartment.</p>
<p>Then, your access policy will look like this:</p>
<div class="language-ts codeBlockContainer_ZGJx theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_kX1v"><pre tabindex="0" class="prism-code language-ts codeBlock_TAPP thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_AdAo"><span class="token-line" style="color:#393A34"><span class="token punctuation" style="color:#393A34">{</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">  </span><span class="token string-property property" style="color:#36acaa">"resourceType"</span><span class="token operator" style="color:#393A34">:</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">"AccessPolicy"</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">  </span><span class="token string-property property" style="color:#36acaa">"name"</span><span class="token operator" style="color:#393A34">:</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">"Managed Service Organization Access Policy with Patient Consent"</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">  </span><span class="token string-property property" style="color:#36acaa">"compartment"</span><span class="token operator" style="color:#393A34">:</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">{</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token string-property property" style="color:#36acaa">"reference"</span><span class="token operator" style="color:#393A34">:</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">"%organization"</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">  </span><span class="token punctuation" style="color:#393A34">}</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">  </span><span class="token string-property property" style="color:#36acaa">"resource"</span><span class="token operator" style="color:#393A34">:</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">[</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token punctuation" style="color:#393A34">{</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">      </span><span class="token string-property property" style="color:#36acaa">"resourceType"</span><span class="token operator" style="color:#393A34">:</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">"Patient"</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">      </span><span class="token string-property property" style="color:#36acaa">"criteria"</span><span class="token operator" style="color:#393A34">:</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">"Patient?_compartment=%organization&amp;_compartment=Consent/&lt;your-universal-consent-id&gt;"</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token punctuation" style="color:#393A34">}</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token punctuation" style="color:#393A34">{</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">      </span><span class="token string-property property" style="color:#36acaa">"resourceType"</span><span class="token operator" style="color:#393A34">:</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">"Observation"</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">      </span><span class="token string-property property" style="color:#36acaa">"criteria"</span><span class="token operator" style="color:#393A34">:</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">"Observation?_compartment=%organization&amp;_compartment=Consent/&lt;your-universal-consent-id&gt;"</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token punctuation" style="color:#393A34">}</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token punctuation" style="color:#393A34">{</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">      </span><span class="token string-property property" style="color:#36acaa">"resourceType"</span><span class="token operator" style="color:#393A34">:</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">"DiagnosticReport"</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">      </span><span class="token string-property property" style="color:#36acaa">"criteria"</span><span class="token operator" style="color:#393A34">:</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">"DiagnosticReport?_compartment=%organization&amp;_compartment=Consent/&lt;your-universal-consent-id&gt;"</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token punctuation" style="color:#393A34">}</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token punctuation" style="color:#393A34">{</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">      </span><span class="token string-property property" style="color:#36acaa">"resourceType"</span><span class="token operator" style="color:#393A34">:</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">"Encounter"</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">      </span><span class="token string-property property" style="color:#36acaa">"criteria"</span><span class="token operator" style="color:#393A34">:</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">"Encounter?_compartment=%organization&amp;_compartment=Consent/&lt;your-universal-consent-id&gt;"</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token punctuation" style="color:#393A34">}</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token punctuation" style="color:#393A34">{</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">      </span><span class="token string-property property" style="color:#36acaa">"resourceType"</span><span class="token operator" style="color:#393A34">:</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">"Communication"</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">      </span><span class="token string-property property" style="color:#36acaa">"criteria"</span><span class="token operator" style="color:#393A34">:</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">"Communication?_compartment=%organization&amp;_compartment=Consent/&lt;your-universal-consent-id&gt;"</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token punctuation" style="color:#393A34">}</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token comment" style="color:#999988;font-style:italic">//...</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">  </span><span class="token punctuation" style="color:#393A34">]</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token punctuation" style="color:#393A34">}</span><br></span></code></pre></div></div>
<h3 class="anchor anchorTargetStickyNavbar_SAay" id="additional-access-control-assigning-practitioner-access-to-specific-patients">Additional Access Control: Assigning Practitioner Access to Specific Patients<a href="https://www.medplum.com/blog/multi-tenant-mso#additional-access-control-assigning-practitioner-access-to-specific-patients" class="hash-link" aria-label="Direct link to Additional Access Control: Assigning Practitioner Access to Specific Patients" title="Direct link to Additional Access Control: Assigning Practitioner Access to Specific Patients" translate="no">​</a></h3>
<p>If allowing Practitioners to access all Patients enrolled in a shared Organization is not restrictive enough, you can also configure the AccessPolicy to only allow access to specifically assigned Patients. This can be done using a similar pattern to the Organizational access by not just adding Organization references to the Patient's compartment, but also adding Practitioner references to the Patient's compartment that represent the Practitioners that are allowed to access the Patient. Again, this is done using the <a class="" href="https://www.medplum.com/docs/api/fhir/operations/patient-set-accounts">$set-accounts</a> FHIR operation.</p>
<p>For example, say you want to give <em>Practitioner/456</em> in <em>Organization/789</em> access to <em>Patient/123</em>. You can do this by making the following request:</p>
<div class="language-typescript codeBlockContainer_ZGJx theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_kX1v"><pre tabindex="0" class="prism-code language-typescript codeBlock_TAPP thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_AdAo"><span class="token-line" style="color:#393A34"><span class="token keyword" style="color:#00009f">const</span><span class="token plain"> response </span><span class="token operator" style="color:#393A34">=</span><span class="token plain"> </span><span class="token keyword" style="color:#00009f">await</span><span class="token plain"> medplum</span><span class="token punctuation" style="color:#393A34">.</span><span class="token function" style="color:#d73a49">post</span><span class="token punctuation" style="color:#393A34">(</span><span class="token string" style="color:#e3116c">'/fhir/R4/Patient/123/$set-accounts'</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">{</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">  resourceType</span><span class="token operator" style="color:#393A34">:</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">'Parameters'</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">  parameter</span><span class="token operator" style="color:#393A34">:</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">[</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token punctuation" style="color:#393A34">{</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">      name</span><span class="token operator" style="color:#393A34">:</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">'accounts'</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">      valueReference</span><span class="token operator" style="color:#393A34">:</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">{</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">        reference</span><span class="token operator" style="color:#393A34">:</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">'Organization/456'</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">      </span><span class="token punctuation" style="color:#393A34">}</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token punctuation" style="color:#393A34">}</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token punctuation" style="color:#393A34">{</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">      name</span><span class="token operator" style="color:#393A34">:</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">'accounts'</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">      valueReference</span><span class="token operator" style="color:#393A34">:</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">{</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">        reference</span><span class="token operator" style="color:#393A34">:</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">'Practitioner/789'</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">      </span><span class="token punctuation" style="color:#393A34">}</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token punctuation" style="color:#393A34">}</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token punctuation" style="color:#393A34">{</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">      name</span><span class="token operator" style="color:#393A34">:</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">'propagate'</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">      valueBoolean</span><span class="token operator" style="color:#393A34">:</span><span class="token plain"> </span><span class="token boolean" style="color:#36acaa">true</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token punctuation" style="color:#393A34">}</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">  </span><span class="token punctuation" style="color:#393A34">]</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token punctuation" style="color:#393A34">}</span><span class="token punctuation" style="color:#393A34">)</span><span class="token punctuation" style="color:#393A34">;</span><br></span></code></pre></div></div>
<p>along with this AccessPolicy:</p>
<div class="theme-admonition theme-admonition-note admonition_IZjC alert alert--secondary"><div class="admonitionHeading_uVvU"><span class="admonitionIcon_HiR3"><svg viewBox="0 0 14 16"><path fill-rule="evenodd" d="M6.3 5.69a.942.942 0 0 1-.28-.7c0-.28.09-.52.28-.7.19-.18.42-.28.7-.28.28 0 .52.09.7.28.18.19.28.42.28.7 0 .28-.09.52-.28.7a1 1 0 0 1-.7.3c-.28 0-.52-.11-.7-.3zM8 7.99c-.02-.25-.11-.48-.31-.69-.2-.19-.42-.3-.69-.31H6c-.27.02-.48.13-.69.31-.2.2-.3.44-.31.69h1v3c.02.27.11.5.31.69.2.2.42.31.69.31h1c.27 0 .48-.11.69-.31.2-.19.3-.42.31-.69H8V7.98v.01zM7 2.3c-3.14 0-5.7 2.54-5.7 5.68 0 3.14 2.56 5.7 5.7 5.7s5.7-2.55 5.7-5.7c0-3.15-2.56-5.69-5.7-5.69v.01zM7 .98c3.86 0 7 3.14 7 7s-3.14 7-7 7-7-3.12-7-7 3.14-7 7-7z"></path></svg></span>note</div><div class="admonitionContent_bl22"><p>The <code>%profile</code> value does not need to be explicitly added to the Practitioner's ProjectMembership like the Organization references are. <code>%profile</code> is a special variable that, in this case, is replaced with a reference to the Practitioner.</p></div></div>
<div class="language-ts codeBlockContainer_ZGJx theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_kX1v"><pre tabindex="0" class="prism-code language-ts codeBlock_TAPP thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_AdAo"><span class="token-line" style="color:#393A34"><span class="token punctuation" style="color:#393A34">{</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"> </span><span class="token string-property property" style="color:#36acaa">"resourceType"</span><span class="token operator" style="color:#393A34">:</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">"AccessPolicy"</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"> </span><span class="token string-property property" style="color:#36acaa">"name"</span><span class="token operator" style="color:#393A34">:</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">"Managed Service Organization Access Policy with Patient Consent"</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"> </span><span class="token string-property property" style="color:#36acaa">"compartment"</span><span class="token operator" style="color:#393A34">:</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">{</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">   </span><span class="token string-property property" style="color:#36acaa">"reference"</span><span class="token operator" style="color:#393A34">:</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">"%organization"</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">}</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"> </span><span class="token string-property property" style="color:#36acaa">"resource"</span><span class="token operator" style="color:#393A34">:</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">[</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">   </span><span class="token punctuation" style="color:#393A34">{</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">     </span><span class="token string-property property" style="color:#36acaa">"resourceType"</span><span class="token operator" style="color:#393A34">:</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">"Patient"</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">     </span><span class="token string-property property" style="color:#36acaa">"criteria"</span><span class="token operator" style="color:#393A34">:</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">"Patient?_compartment=%organization&amp;_compartment=%profile"</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">   </span><span class="token punctuation" style="color:#393A34">}</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">   </span><span class="token punctuation" style="color:#393A34">{</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">     </span><span class="token string-property property" style="color:#36acaa">"resourceType"</span><span class="token operator" style="color:#393A34">:</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">"Observation"</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">     </span><span class="token string-property property" style="color:#36acaa">"criteria"</span><span class="token operator" style="color:#393A34">:</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">"Observation?_compartment=%organization&amp;_compartment=%profile"</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">   </span><span class="token punctuation" style="color:#393A34">}</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">   </span><span class="token punctuation" style="color:#393A34">{</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">     </span><span class="token string-property property" style="color:#36acaa">"resourceType"</span><span class="token operator" style="color:#393A34">:</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">"DiagnosticReport"</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">     </span><span class="token string-property property" style="color:#36acaa">"criteria"</span><span class="token operator" style="color:#393A34">:</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">"DiagnosticReport?_compartment=%organization&amp;_compartment=%profile"</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">   </span><span class="token punctuation" style="color:#393A34">}</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">   </span><span class="token punctuation" style="color:#393A34">{</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">     </span><span class="token string-property property" style="color:#36acaa">"resourceType"</span><span class="token operator" style="color:#393A34">:</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">"Encounter"</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">     </span><span class="token string-property property" style="color:#36acaa">"criteria"</span><span class="token operator" style="color:#393A34">:</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">"Encounter?_compartment=%organization&amp;_compartment=%profile"</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">   </span><span class="token punctuation" style="color:#393A34">}</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">   </span><span class="token punctuation" style="color:#393A34">{</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">     </span><span class="token string-property property" style="color:#36acaa">"resourceType"</span><span class="token operator" style="color:#393A34">:</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">"Communication"</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">     </span><span class="token string-property property" style="color:#36acaa">"criteria"</span><span class="token operator" style="color:#393A34">:</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">"Communication?_compartment=%organization&amp;_compartment=%profile"</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">   </span><span class="token punctuation" style="color:#393A34">}</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">   </span><span class="token comment" style="color:#999988;font-style:italic">//...</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">]</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token punctuation" style="color:#393A34">}</span><br></span></code></pre></div></div>
<h2 class="anchor anchorTargetStickyNavbar_SAay" id="user-management-strategy">User Management Strategy<a href="https://www.medplum.com/blog/multi-tenant-mso#user-management-strategy" class="hash-link" aria-label="Direct link to User Management Strategy" title="Direct link to User Management Strategy" translate="no">​</a></h2>
<h3 class="anchor anchorTargetStickyNavbar_SAay" id="project-vs-server-scoped-users">Project vs Server Scoped Users<a href="https://www.medplum.com/blog/multi-tenant-mso#project-vs-server-scoped-users" class="hash-link" aria-label="Direct link to Project vs Server Scoped Users" title="Direct link to Project vs Server Scoped Users" translate="no">​</a></h3>
<p>When building an MSO, it is recommended to follow the best practices for <a class="" href="https://www.medplum.com/docs/user-management/project-vs-server-scoped-users">project-scoped and server-scoped users</a>:</p>
<ul>
<li class=""><strong>Project-scoped users</strong>: Ideal for clinicians and patients who primarily interact with a single production project</li>
<li class=""><strong>Server-scoped users</strong>: Best for administrators and developers who need access across multiple projects</li>
</ul>
<p>As you can see in the <a href="https://github.com/medplum/medplum-mso-demo" target="_blank" rel="noopener noreferrer" class="">MSO Demo App</a>, we use project-scoped users for clinicians that are actually enrolled across different Organizations and server-scoped users for the administrators and developers who are provisioning clinician and patient access with the different <a href="https://github.com/medplum/medplum-mso-demo/blob/main/src/utils/enrollment.ts" target="_blank" rel="noopener noreferrer" class="">enrollment operations</a>.</p>
<p>For reference, <a href="https://github.com/medplum/medplum/blob/4e7955ffc9daba354ee2fe502b8f8c919916b0c7/examples/medplum-mso-demo/src/pages/NewClinicianPage.tsx#L96" target="_blank" rel="noopener noreferrer" class="">here</a> is the code that the MSO Demo App uses to invite clinicians as project-scoped users.</p>
<h2 class="anchor anchorTargetStickyNavbar_SAay" id="mso-demo-links">MSO Demo Links<a href="https://www.medplum.com/blog/multi-tenant-mso#mso-demo-links" class="hash-link" aria-label="Direct link to MSO Demo Links" title="Direct link to MSO Demo Links" translate="no">​</a></h2>
<ul>
<li class=""><a href="https://www.youtube.com/watch?v=FJIZTI9_fBc" target="_blank" rel="noopener noreferrer" class="">MSO Demo App Video</a></li>
<li class=""><a href="https://github.com/medplum/medplum-mso-demo" target="_blank" rel="noopener noreferrer" class="">MSO Demo App Code</a></li>
</ul>]]></content:encoded>
            <category>mso</category>
            <category>tenant</category>
            <category>access-control</category>
        </item>
        <item>
            <title><![CDATA[Technical Guide to TEFCA]]></title>
            <link>https://www.medplum.com/blog/technical-guide-to-tefca</link>
            <guid>https://www.medplum.com/blog/technical-guide-to-tefca</guid>
            <pubDate>Thu, 27 Mar 2025 00:00:00 GMT</pubDate>
            <description><![CDATA[Andrei Zudin is a healthcare interoperability expert and advisor to the Medplum community.  He is the former CTO and co-founder of Health Gorilla.]]></description>
            <content:encoded><![CDATA[<blockquote>
<p><a href="https://www.linkedin.com/in/andrei-zudin-phd-1300021" target="_blank" rel="noopener noreferrer" class="">Andrei Zudin</a> is a healthcare interoperability expert and advisor to the Medplum community.  He is the former CTO and co-founder of <a href="https://healthgorilla.com/" target="_blank" rel="noopener noreferrer" class="">Health Gorilla</a>.</p>
</blockquote>
<blockquote>
<p>A Technical Guide to TEFCA Integration for Software Developers and Health IT Professionals (<a href="https://drive.google.com/file/d/11xRALs60J-hwkdylll0biRMa63peYnFm/view?usp=sharing" target="_blank" rel="noopener noreferrer" class="">Download as PDF</a>)</p>
</blockquote>
<h2 class="anchor anchorTargetStickyNavbar_SAay" id="purpose">Purpose<a href="https://www.medplum.com/blog/technical-guide-to-tefca#purpose" class="hash-link" aria-label="Direct link to Purpose" title="Direct link to Purpose" translate="no">​</a></h2>
<p>This white paper aims to provide a <strong>technical guide for software developers and healthcare IT professionals seeking to integrate their systems with the Trusted Exchange Framework</strong> <strong>and Common Agreement</strong> (TEFCA). It delves into the technical aspects of TEFCA, including the various participation models, QHIN connectivity, data exchange methods, and security considerations. It also explores the incentives for TEFCA participation and how Medplum can help organizations achieve TEFCA compliance and leverage its benefits.</p>
<h2 class="anchor anchorTargetStickyNavbar_SAay" id="background">Background<a href="https://www.medplum.com/blog/technical-guide-to-tefca#background" class="hash-link" aria-label="Direct link to Background" title="Direct link to Background" translate="no">​</a></h2>
<p>The healthcare industry has long struggled with <strong>fragmented data</strong>, leading to <strong>inefficiencies</strong>, errors, and suboptimal patient care. TEFCA represents a step towards addressing these challenges by establishing a nationwide framework for secure and interoperable health information exchange<sup><a href="https://www.medplum.com/blog/technical-guide-to-tefca#user-content-fn-1-477cb7" id="user-content-fnref-1-477cb7" data-footnote-ref="true" aria-describedby="footnote-label" class="anchorTargetStickyNavbar_SAay">1</a></sup>. By participating in TEFCA, healthcare organizations can improve care coordination, reduce costs, and enhance patient outcomes<sup><a href="https://www.medplum.com/blog/technical-guide-to-tefca#user-content-fn-2-477cb7" id="user-content-fnref-2-477cb7" data-footnote-ref="true" aria-describedby="footnote-label" class="anchorTargetStickyNavbar_SAay">2</a></sup>.</p>
<h2 class="anchor anchorTargetStickyNavbar_SAay" id="understanding-the-tefca-framework">Understanding the TEFCA Framework<a href="https://www.medplum.com/blog/technical-guide-to-tefca#understanding-the-tefca-framework" class="hash-link" aria-label="Direct link to Understanding the TEFCA Framework" title="Direct link to Understanding the TEFCA Framework" translate="no">​</a></h2>
<p>TEFCA, enacted through the 21st Century Cures Act, aims to establish a <strong>universal policy</strong> and <strong>technical floor</strong> for nationwide interoperability<sup><a href="https://www.medplum.com/blog/technical-guide-to-tefca#user-content-fn-3-477cb7" id="user-content-fnref-3-477cb7" data-footnote-ref="true" aria-describedby="footnote-label" class="anchorTargetStickyNavbar_SAay">3</a></sup>. It seeks to simplify connectivity for organizations to securely exchange information to improve patient care, enhance the welfare of populations, and generate healthcare value<sup><a href="https://www.medplum.com/blog/technical-guide-to-tefca#user-content-fn-3-477cb7" id="user-content-fnref-3-477cb7-2" data-footnote-ref="true" aria-describedby="footnote-label" class="anchorTargetStickyNavbar_SAay">3</a></sup>. TEFCA operates as a "network of networks," connecting various Health Information Networks (HINs) across the country<sup><a href="https://www.medplum.com/blog/technical-guide-to-tefca#user-content-fn-1-477cb7" id="user-content-fnref-1-477cb7-2" data-footnote-ref="true" aria-describedby="footnote-label" class="anchorTargetStickyNavbar_SAay">1</a></sup>. These HINs, upon meeting specific criteria and undergoing a vetting process, are designated as Qualified Health Information Networks (QHINs)<sup><a href="https://www.medplum.com/blog/technical-guide-to-tefca#user-content-fn-4-477cb7" id="user-content-fnref-4-477cb7" data-footnote-ref="true" aria-describedby="footnote-label" class="anchorTargetStickyNavbar_SAay">4</a></sup>.</p>
<h3 class="anchor anchorTargetStickyNavbar_SAay" id="tefca-goals">TEFCA Goals<a href="https://www.medplum.com/blog/technical-guide-to-tefca#tefca-goals" class="hash-link" aria-label="Direct link to TEFCA Goals" title="Direct link to TEFCA Goals" translate="no">​</a></h3>
<p>TEFCA has three primary goals:</p>
<ol>
<li class="">Establish a <strong>universal policy and technical framework</strong> for nationwide interoperability.</li>
<li class=""><strong>Simplify connectivity</strong> for organizations to securely exchange information.</li>
<li class=""><strong>Empower individuals (patients)</strong> to gather their own health information<sup><a href="https://www.medplum.com/blog/technical-guide-to-tefca#user-content-fn-3-477cb7" id="user-content-fnref-3-477cb7-3" data-footnote-ref="true" aria-describedby="footnote-label" class="anchorTargetStickyNavbar_SAay">3</a></sup>.</li>
</ol>
<h3 class="anchor anchorTargetStickyNavbar_SAay" id="trusted-exchange-framework-tef-principles">Trusted Exchange Framework (TEF) Principles<a href="https://www.medplum.com/blog/technical-guide-to-tefca#trusted-exchange-framework-tef-principles" class="hash-link" aria-label="Direct link to Trusted Exchange Framework (TEF) Principles" title="Direct link to Trusted Exchange Framework (TEF) Principles" translate="no">​</a></h3>
<p>The Trusted Exchange Framework (TEF) outlines seven foundational principles for trust policies and practices to facilitate data sharing among HINs:</p>
<ol>
<li class=""><strong>Standardization:</strong> Prioritize the use of federally recognized and industry-acknowledged technical standards, policies, best practices, and procedures for a cohesive and efficient exchange ecosystem<sup><a href="https://www.medplum.com/blog/technical-guide-to-tefca#user-content-fn-5-477cb7" id="user-content-fnref-5-477cb7" data-footnote-ref="true" aria-describedby="footnote-label" class="anchorTargetStickyNavbar_SAay">5</a></sup>.</li>
<li class=""><strong>Openness and Transparency:</strong> QHINs should operate transparently, promoting stakeholder trust and fostering a collaborative environment<sup><a href="https://www.medplum.com/blog/technical-guide-to-tefca#user-content-fn-5-477cb7" id="user-content-fnref-5-477cb7-2" data-footnote-ref="true" aria-describedby="footnote-label" class="anchorTargetStickyNavbar_SAay">5</a></sup>.</li>
<li class=""><strong>Cooperation and Non-discrimination:</strong> QHINs should cooperate with each other and not discriminate against other HINs or participants<sup><a href="https://www.medplum.com/blog/technical-guide-to-tefca#user-content-fn-5-477cb7" id="user-content-fnref-5-477cb7-3" data-footnote-ref="true" aria-describedby="footnote-label" class="anchorTargetStickyNavbar_SAay">5</a></sup>.</li>
<li class=""><strong>Privacy:</strong> QHINs should prioritize the privacy of individuals' health information and comply with applicable privacy laws and regulations<sup><a href="https://www.medplum.com/blog/technical-guide-to-tefca#user-content-fn-5-477cb7" id="user-content-fnref-5-477cb7-4" data-footnote-ref="true" aria-describedby="footnote-label" class="anchorTargetStickyNavbar_SAay">5</a></sup>.</li>
<li class=""><strong>Security and Safety:</strong> QHINs should ensure the security and safety of health information exchange, protecting it from unauthorized access and disclosure<sup><a href="https://www.medplum.com/blog/technical-guide-to-tefca#user-content-fn-5-477cb7" id="user-content-fnref-5-477cb7-5" data-footnote-ref="true" aria-describedby="footnote-label" class="anchorTargetStickyNavbar_SAay">5</a></sup>.</li>
<li class=""><strong>Access:</strong> QHINs should facilitate and promote a clear understanding of how information has been used or disclosed while adhering to civil rights obligations on accessibility<sup><a href="https://www.medplum.com/blog/technical-guide-to-tefca#user-content-fn-5-477cb7" id="user-content-fnref-5-477cb7-6" data-footnote-ref="true" aria-describedby="footnote-label" class="anchorTargetStickyNavbar_SAay">5</a></sup>.</li>
<li class=""><strong>Equity:</strong> QHINs should consider the diverse impacts of interoperability on different populations and throughout the entire lifecycle of the activity, ensuring an inclusive approach<sup><a href="https://www.medplum.com/blog/technical-guide-to-tefca#user-content-fn-5-477cb7" id="user-content-fnref-5-477cb7-7" data-footnote-ref="true" aria-describedby="footnote-label" class="anchorTargetStickyNavbar_SAay">5</a></sup>.</li>
</ol>
<p>These principles guide the development and implementation of TEFCA, fostering a trustworthy and reliable health information exchange ecosystem.</p>
<h3 class="anchor anchorTargetStickyNavbar_SAay" id="tefca-architecture">TEFCA Architecture<a href="https://www.medplum.com/blog/technical-guide-to-tefca#tefca-architecture" class="hash-link" aria-label="Direct link to TEFCA Architecture" title="Direct link to TEFCA Architecture" translate="no">​</a></h3>
<p>TEFCA operates as a "<strong>network of networks</strong>," connecting various Health Information Networks (HINs) across the country<sup><a href="https://www.medplum.com/blog/technical-guide-to-tefca#user-content-fn-1-477cb7" id="user-content-fnref-1-477cb7-3" data-footnote-ref="true" aria-describedby="footnote-label" class="anchorTargetStickyNavbar_SAay">1</a></sup>. These HINs, upon meeting specific criteria and undergoing a rigorous vetting process, are designated as Qualified Health Information Networks (QHINs)<sup><a href="https://www.medplum.com/blog/technical-guide-to-tefca#user-content-fn-4-477cb7" id="user-content-fnref-4-477cb7-2" data-footnote-ref="true" aria-describedby="footnote-label" class="anchorTargetStickyNavbar_SAay">4</a></sup>. QHINs serve as facilitators of nationwide interoperability within the TEFCA framework, adhering to a common set of rules and technical specifications<sup><a href="https://www.medplum.com/blog/technical-guide-to-tefca#user-content-fn-1-477cb7" id="user-content-fnref-1-477cb7-4" data-footnote-ref="true" aria-describedby="footnote-label" class="anchorTargetStickyNavbar_SAay">1</a></sup>.</p>
<p>Participants, such as healthcare providers, health systems,  payers, connect to a QHIN to engage in TEFCA exchange<sup><a href="https://www.medplum.com/blog/technical-guide-to-tefca#user-content-fn-6-477cb7" id="user-content-fnref-6-477cb7" data-footnote-ref="true" aria-describedby="footnote-label" class="anchorTargetStickyNavbar_SAay">6</a></sup>. Subparticipants, often members of a Participant's organization, can also connect to a QHIN through a Participant<sup><a href="https://www.medplum.com/blog/technical-guide-to-tefca#user-content-fn-6-477cb7" id="user-content-fnref-6-477cb7-2" data-footnote-ref="true" aria-describedby="footnote-label" class="anchorTargetStickyNavbar_SAay">6</a></sup>. This layered structure creates an interconnected network where data can flow seamlessly between different organizations and systems.</p>
<p><img decoding="async" loading="lazy" alt="Exchange under TEFCA" src="https://www.medplum.com/assets/images/exchange-under-tefca-59bd5f8b682405a3ee9a1aac982013cc.png" width="1920" height="1080" class="img__Ss2"></p>
<p>The following table illustrates the different ways an organization can participate in TEFCA:</p>
<table><thead><tr><th style="text-align:left">Participation Model</th><th style="text-align:left">Description</th></tr></thead><tbody><tr><td style="text-align:left">QHIN</td><td style="text-align:left">A large HIN that serves as the backbone for nationwide interoperability, connecting to other QHINs and facilitating data exchange between its Participants and Subparticipants.</td></tr><tr><td style="text-align:left">Participant</td><td style="text-align:left">An organization that connects to a QHIN to engage in TEFCA exchange, typically a healthcare individual patient, provider, health system, government agency or payer.</td></tr><tr><td style="text-align:left">Subparticipant</td><td style="text-align:left">An organization that connects to a QHIN through a Participant, often a member of the Participant's organization.</td></tr></tbody></table>
<h3></h3>
<p><img decoding="async" loading="lazy" alt="QHIN" src="https://www.medplum.com/assets/images/qhin-4f68708d65e160bed082aa8316187982.png" width="1915" height="1078" class="img__Ss2"></p>
<h3 class="anchor anchorTargetStickyNavbar_SAay" id="qualified-health-information-networks-qhins">Qualified Health Information Networks (QHINs)<a href="https://www.medplum.com/blog/technical-guide-to-tefca#qualified-health-information-networks-qhins" class="hash-link" aria-label="Direct link to Qualified Health Information Networks (QHINs)" title="Direct link to Qualified Health Information Networks (QHINs)" translate="no">​</a></h3>
<p>QHINs are the foundation of the TEFCA framework, responsible for ensuring secure and reliable health information exchange across the network<sup><a href="https://www.medplum.com/blog/technical-guide-to-tefca#user-content-fn-1-477cb7" id="user-content-fnref-1-477cb7-5" data-footnote-ref="true" aria-describedby="footnote-label" class="anchorTargetStickyNavbar_SAay">1</a></sup>. They play a crucial role in upholding the principles of TEFCA and ensuring compliance with the Common Agreement.</p>
<p>To become a QHIN, an organization must meet stringent requirements, including:</p>
<ul>
<li class=""><strong>Ownership Requirements:</strong> Being a U.S. entity with no foreign control that could pose a national security risk<sup><a href="https://www.medplum.com/blog/technical-guide-to-tefca#user-content-fn-7-477cb7" id="user-content-fnref-7-477cb7" data-footnote-ref="true" aria-describedby="footnote-label" class="anchorTargetStickyNavbar_SAay">7</a></sup>.</li>
<li class=""><strong>Exchange Requirements:</strong> Demonstrating the capability to exchange Electronic Health Information (EHI) with multiple unaffiliated organizations, supporting all required exchange purposes, and adhering to non-discrimination policies<sup><a href="https://www.medplum.com/blog/technical-guide-to-tefca#user-content-fn-7-477cb7" id="user-content-fnref-7-477cb7-2" data-footnote-ref="true" aria-describedby="footnote-label" class="anchorTargetStickyNavbar_SAay">7</a></sup>.</li>
<li class=""><strong>Designated Network Services Requirements:</strong> Maintaining a robust and secure network infrastructure, establishing data governance policies, and ensuring compliance with privacy and security standards<sup><a href="https://www.medplum.com/blog/technical-guide-to-tefca#user-content-fn-8-477cb7" id="user-content-fnref-8-477cb7" data-footnote-ref="true" aria-describedby="footnote-label" class="anchorTargetStickyNavbar_SAay">8</a></sup>.</li>
</ul>
<p><strong>QHIN Onboarding</strong></p>
<p>The QHIN onboarding process involves several steps to ensure the organization's readiness for participation in TEFCA exchange. This includes:</p>
<ul>
<li class=""><strong>Application and Review:</strong> Submitting a comprehensive application with supporting documentation and undergoing a thorough review by the Recognized Coordinating Entity (RCE)<sup><a href="https://www.medplum.com/blog/technical-guide-to-tefca#user-content-fn-7-477cb7" id="user-content-fnref-7-477cb7-3" data-footnote-ref="true" aria-describedby="footnote-label" class="anchorTargetStickyNavbar_SAay">7</a></sup>.</li>
<li class=""><strong>Testing:</strong> Conducting tests to ensure the QHIN's network can connect to those of other QHINs<sup><a href="https://www.medplum.com/blog/technical-guide-to-tefca#user-content-fn-7-477cb7" id="user-content-fnref-7-477cb7-4" data-footnote-ref="true" aria-describedby="footnote-label" class="anchorTargetStickyNavbar_SAay">7</a></sup>.</li>
<li class=""><strong>Production Environment Integration:</strong> Successfully integrating the QHIN's network into the TEFCA production environment and demonstrating the ability to exchange data with other QHINs<sup><a href="https://www.medplum.com/blog/technical-guide-to-tefca#user-content-fn-7-477cb7" id="user-content-fnref-7-477cb7-5" data-footnote-ref="true" aria-describedby="footnote-label" class="anchorTargetStickyNavbar_SAay">7</a></sup>.</li>
</ul>
<p>This rigorous onboarding process ensures that QHINs meet the technical and operational requirements for secure and reliable health information exchange within the TEFCA framework.</p>
<p>As of March 2025, eight organizations have been designated as QHINs:</p>
<table><thead><tr><th style="text-align:left">QHIN</th><th style="text-align:left">Description</th></tr></thead><tbody><tr><td style="text-align:left">CommonWell Health Alliance</td><td style="text-align:left">A non-profit trade association focused on enabling nationwide health data exchange.</td></tr><tr><td style="text-align:left">eHealth Exchange</td><td style="text-align:left">A nationwide health information network that facilitates data exchange between federal agencies and private sector healthcare organizations.</td></tr><tr><td style="text-align:left">Epic Nexus</td><td style="text-align:left">A QHIN specifically for organizations using Epic's EHR systems.</td></tr><tr><td style="text-align:left">Health Gorilla</td><td style="text-align:left">A health information network that focuses on providing access to clinical data, including social determinants of health (SDOH) data.</td></tr><tr><td style="text-align:left">KONZA National Network</td><td style="text-align:left">A national health information network that enables data exchange across different care settings and communities.</td></tr><tr><td style="text-align:left">Kno2</td><td style="text-align:left">A health information network that provides solutions for connecting healthcare providers, health plans, and public health agencies.</td></tr><tr><td style="text-align:left">MedAllies</td><td style="text-align:left">A nationwide health information network that offers a platform for secure and efficient data exchange.</td></tr><tr><td style="text-align:left">eClinicalWorks</td><td style="text-align:left">A QHIN specifically for organizations using eClinicalWorks' EHR systems.</td></tr></tbody></table>
<h3 class="anchor anchorTargetStickyNavbar_SAay" id="data-exchange-methods">Data Exchange Methods<a href="https://www.medplum.com/blog/technical-guide-to-tefca#data-exchange-methods" class="hash-link" aria-label="Direct link to Data Exchange Methods" title="Direct link to Data Exchange Methods" translate="no">​</a></h3>
<p>TEFCA supports both document-based (CDA) and FHIR-based exchange methods to accommodate the diverse needs of healthcare organizations.</p>
<p><strong>Document-Based Exchange</strong></p>
<p>The initial iteration of TEFCA focuses on document-based exchange, leveraging existing standards and infrastructure<sup><a href="https://www.medplum.com/blog/technical-guide-to-tefca#user-content-fn-9-477cb7" id="user-content-fnref-9-477cb7" data-footnote-ref="true" aria-describedby="footnote-label" class="anchorTargetStickyNavbar_SAay">9</a></sup>. This involves the exchange of HL7 CDA documents, which are widely used in healthcare for sharing clinical information<sup><a href="https://www.medplum.com/blog/technical-guide-to-tefca#user-content-fn-9-477cb7" id="user-content-fnref-9-477cb7-2" data-footnote-ref="true" aria-describedby="footnote-label" class="anchorTargetStickyNavbar_SAay">9</a></sup>. TEFCA leverages Integrating the Healthcare Enterprise (IHE) profiles, such as Cross-Community Patient Discovery (XCPD) and Cross-Community Access (XCA), to facilitate the secure retrieval of these documents<sup><a href="https://www.medplum.com/blog/technical-guide-to-tefca#user-content-fn-5-477cb7" id="user-content-fnref-5-477cb7-8" data-footnote-ref="true" aria-describedby="footnote-label" class="anchorTargetStickyNavbar_SAay">5</a></sup>.</p>
<p><strong>FHIR-Based Exchange</strong></p>
<p>While the first iteration of TEFCA focuses on document-based exchange and supports facilitated FHIR exchange, FHIR is not mandatory at this time. Nevertheless a large number of Participants and Sub-participants voluntarily use FHIR as it addresses their needs best. Examples of such use cases included but not limited to Individual Access Services using SMART-on-FHIR and Electronic Case Reporting. More use cases and exchange purposes are on the roadmap for future development<sup><a href="https://www.medplum.com/blog/technical-guide-to-tefca#user-content-fn-9-477cb7" id="user-content-fnref-9-477cb7-3" data-footnote-ref="true" aria-describedby="footnote-label" class="anchorTargetStickyNavbar_SAay">9</a></sup>. The TEFCA FHIR roadmap outlines a phased approach for incorporating FHIR into TEFCA, with the goal of enabling more granular and standardized data exchange<sup><a href="https://www.medplum.com/blog/technical-guide-to-tefca#user-content-fn-5-477cb7" id="user-content-fnref-5-477cb7-9" data-footnote-ref="true" aria-describedby="footnote-label" class="anchorTargetStickyNavbar_SAay">5</a></sup>. This will allow developers to leverage FHIR APIs for accessing and exchanging data, promoting interoperability and innovation in healthcare applications.</p>
<h3 class="anchor anchorTargetStickyNavbar_SAay" id="patient-matching-in-tefca">Patient Matching in TEFCA<a href="https://www.medplum.com/blog/technical-guide-to-tefca#patient-matching-in-tefca" class="hash-link" aria-label="Direct link to Patient Matching in TEFCA" title="Direct link to Patient Matching in TEFCA" translate="no">​</a></h3>
<p>Patient matching is a critical aspect of TEFCA, ensuring that the correct patient data is accessed and exchanged<sup><a href="https://www.medplum.com/blog/technical-guide-to-tefca#user-content-fn-5-477cb7" id="user-content-fnref-5-477cb7-10" data-footnote-ref="true" aria-describedby="footnote-label" class="anchorTargetStickyNavbar_SAay">5</a></sup>. Accurate patient matching is essential for preventing errors, improving care coordination, and ensuring the integrity of health information exchange.</p>
<p>TEFCA acknowledges the challenges of patient matching and plans to work with QHINs to create future patient-matching guidelines<sup><a href="https://www.medplum.com/blog/technical-guide-to-tefca#user-content-fn-5-477cb7" id="user-content-fnref-5-477cb7-11" data-footnote-ref="true" aria-describedby="footnote-label" class="anchorTargetStickyNavbar_SAay">5</a></sup>. This collaborative approach will help improve patient matching accuracy and consistency across the TEFCA network.</p>
<h2 class="anchor anchorTargetStickyNavbar_SAay" id="key-considerations-for-qhin-connectivity">Key Considerations for QHIN Connectivity<a href="https://www.medplum.com/blog/technical-guide-to-tefca#key-considerations-for-qhin-connectivity" class="hash-link" aria-label="Direct link to Key Considerations for QHIN Connectivity" title="Direct link to Key Considerations for QHIN Connectivity" translate="no">​</a></h2>
<p>Connecting to a QHIN is a crucial step for organizations seeking to participate in TEFCA exchange. Here are some key considerations:</p>
<ul>
<li class=""><strong>Technical Requirements:</strong> Organizations must ensure their systems meet the technical specifications specific to the QHIN of their choice. Organizations can join several QHINs if necessary. Depending on the selected QHIN connectivity specifications may  include supporting IHE profiles, FHIR IGs, security standards, patient matching methods, and provenance tracking<sup><a href="https://www.medplum.com/blog/technical-guide-to-tefca#user-content-fn-6-477cb7" id="user-content-fnref-6-477cb7-3" data-footnote-ref="true" aria-describedby="footnote-label" class="anchorTargetStickyNavbar_SAay">6</a></sup>.</li>
<li class=""><strong>Data Governance and Compliance:</strong> Organizations must establish data governance policies and procedures that align with TEFCA requirements and flow down agreements. This includes addressing data quality control, data storage, and legal considerations related to privacy and security<sup><a href="https://www.medplum.com/blog/technical-guide-to-tefca#user-content-fn-10-477cb7" id="user-content-fnref-10-477cb7" data-footnote-ref="true" aria-describedby="footnote-label" class="anchorTargetStickyNavbar_SAay">10</a></sup>.</li>
<li class=""><strong>Operational Considerations:</strong> Organizations should consider operational factors such as network traffic, potential data quality issues, and the dispute resolution process when connecting to a QHIN<sup><a href="https://www.medplum.com/blog/technical-guide-to-tefca#user-content-fn-7-477cb7" id="user-content-fnref-7-477cb7-6" data-footnote-ref="true" aria-describedby="footnote-label" class="anchorTargetStickyNavbar_SAay">7</a></sup>.</li>
<li class=""><strong>Choosing a QHIN:</strong> Organizations should carefully evaluate different QHINs based on their technical capabilities, network reach, governance model, and participation costs<sup><a href="https://www.medplum.com/blog/technical-guide-to-tefca#user-content-fn-6-477cb7" id="user-content-fnref-6-477cb7-4" data-footnote-ref="true" aria-describedby="footnote-label" class="anchorTargetStickyNavbar_SAay">6</a></sup>.</li>
</ul>
<h2 class="anchor anchorTargetStickyNavbar_SAay" id="medplum--tefca">Medplum &amp; TEFCA<a href="https://www.medplum.com/blog/technical-guide-to-tefca#medplum--tefca" class="hash-link" aria-label="Direct link to Medplum &amp; TEFCA" title="Direct link to Medplum &amp; TEFCA" translate="no">​</a></h2>
<p>Becoming a TEFCA compatible FHIR responding node is part of the Medplum roadmap and we hope to connect with organizations that are interested in this functionality.</p>
<p>Today, Medplum is a healthcare platform that can help organizations achieve TEFCA compliance and leverage its benefits<sup><a href="https://www.medplum.com/blog/technical-guide-to-tefca#user-content-fn-11-477cb7" id="user-content-fnref-11-477cb7" data-footnote-ref="true" aria-describedby="footnote-label" class="anchorTargetStickyNavbar_SAay">11</a></sup>. It offers a range of capabilities that align with TEFCA requirements, including:</p>
<ul>
<li class=""><strong>Integration Engine:</strong> Medplum's integration engine supports various healthcare data exchange standards, including FHIR, HL7, and CCD-A<sup><a href="https://www.medplum.com/blog/technical-guide-to-tefca#user-content-fn-12-477cb7" id="user-content-fnref-12-477cb7" data-footnote-ref="true" aria-describedby="footnote-label" class="anchorTargetStickyNavbar_SAay">12</a></sup>. This allows organizations to connect their existing systems to QHINs and participate in TEFCA exchange.</li>
<li class=""><strong>FHIR Support:</strong> Medplum is FHIR-native, providing a FHIR datastore and API for storing and accessing healthcare data<sup><a href="https://www.medplum.com/blog/technical-guide-to-tefca#user-content-fn-13-477cb7" id="user-content-fnref-13-477cb7" data-footnote-ref="true" aria-describedby="footnote-label" class="anchorTargetStickyNavbar_SAay">13</a></sup>. This ensures compliance with TEFCA's future direction towards FHIR-based exchange.</li>
<li class=""><strong>Security Features:</strong> Medplum prioritizes security and compliance, offering HIPAA compliance, SOC2 certification, and robust security controls<sup><a href="https://www.medplum.com/blog/technical-guide-to-tefca#user-content-fn-14-477cb7" id="user-content-fnref-14-477cb7" data-footnote-ref="true" aria-describedby="footnote-label" class="anchorTargetStickyNavbar_SAay">14</a></sup>. This helps organizations meet TEFCA's security requirements and protect patient data.</li>
</ul>
<p>The following are specific features that relate to TEFCA that are on the Medplum roadmap.</p>
<table><thead><tr><th style="text-align:left">Feature Area</th><th style="text-align:left">Feature</th><th style="text-align:left">Description</th><th style="text-align:left">Plan</th></tr></thead><tbody><tr><td style="text-align:left">Authentication</td><td style="text-align:left">TEFCA Certificates</td><td style="text-align:left">Authentication via TEFCA X.509 certificates</td><td style="text-align:left">On Roadmap</td></tr><tr><td style="text-align:left">Administration</td><td style="text-align:left">Dynamic Client Registration (<a href="https://www.udap.org/udap-dynamic-client-registration-stu1.html" target="_blank" rel="noopener noreferrer" class="">UDAP</a>)</td><td style="text-align:left">Dynamic client registration with support for Basic App Certification</td><td style="text-align:left">On Roadmap</td></tr><tr><td style="text-align:left">Authorization</td><td style="text-align:left">Authorization Extension Objects</td><td style="text-align:left">Support TEFCA-specific authorization extension for user and apps</td><td style="text-align:left">On Roadmap</td></tr><tr><td style="text-align:left">Error Handling</td><td style="text-align:left">Error responses with TEFCA support</td><td style="text-align:left">Medplum's error responses need to include TEFCA Authorization Extension Error objects.</td><td style="text-align:left">On Roadmap</td></tr><tr><td style="text-align:left">Identity</td><td style="text-align:left">Patient Match</td><td style="text-align:left">Medplum's FHIR implementation should support the $match operation</td><td style="text-align:left">On Roadmap</td></tr><tr><td style="text-align:left">Auditability</td><td style="text-align:left">FHIR Provenance</td><td style="text-align:left">Track FHIR resources through transformations</td><td style="text-align:left">On Roadmap</td></tr></tbody></table>
<h3 class="anchor anchorTargetStickyNavbar_SAay" id="addressing-the-gaps">Addressing the Gaps<a href="https://www.medplum.com/blog/technical-guide-to-tefca#addressing-the-gaps" class="hash-link" aria-label="Direct link to Addressing the Gaps" title="Direct link to Addressing the Gaps" translate="no">​</a></h3>
<p>Medplum is committed to supporting TEFCA and has a roadmap for addressing any potential gaps in its capabilities<sup><a href="https://www.medplum.com/blog/technical-guide-to-tefca#user-content-fn-15-477cb7" id="user-content-fnref-15-477cb7" data-footnote-ref="true" aria-describedby="footnote-label" class="anchorTargetStickyNavbar_SAay">15</a></sup>. This includes plans for enhancing FHIR-based exchange functionalities, expanding its integration engine to support emerging TEFCA use cases, and continuously improving its security and compliance posture.</p>
<h3 class="anchor anchorTargetStickyNavbar_SAay" id="medplums-value-proposition">Medplum's Value Proposition<a href="https://www.medplum.com/blog/technical-guide-to-tefca#medplums-value-proposition" class="hash-link" aria-label="Direct link to Medplum's Value Proposition" title="Direct link to Medplum's Value Proposition" translate="no">​</a></h3>
<p>Medplum offers a compelling value proposition for organizations looking to participate in TEFCA:</p>
<ul>
<li class=""><strong>Open-Source:</strong> Medplum's core technology is open source, providing flexibility, transparency, and community-driven innovation<sup><a href="https://www.medplum.com/blog/technical-guide-to-tefca#user-content-fn-16-477cb7" id="user-content-fnref-16-477cb7" data-footnote-ref="true" aria-describedby="footnote-label" class="anchorTargetStickyNavbar_SAay">16</a></sup>.</li>
<li class=""><strong>Comprehensive Feature Set:</strong> Medplum offers a wide range of features, including questionnaires, scheduling, communications, care plans, and analytics, enabling organizations to build comprehensive healthcare solutions<sup><a href="https://www.medplum.com/blog/technical-guide-to-tefca#user-content-fn-16-477cb7" id="user-content-fnref-16-477cb7-2" data-footnote-ref="true" aria-describedby="footnote-label" class="anchorTargetStickyNavbar_SAay">16</a></sup>.</li>
<li class=""><strong>Simplified Compliance:</strong> Medplum simplifies compliance with HIPAA and other healthcare regulations, providing built-in audit capabilities and secure authentication<sup><a href="https://www.medplum.com/blog/technical-guide-to-tefca#user-content-fn-16-477cb7" id="user-content-fnref-16-477cb7-3" data-footnote-ref="true" aria-describedby="footnote-label" class="anchorTargetStickyNavbar_SAay">16</a></sup>.</li>
</ul>
<h2 class="anchor anchorTargetStickyNavbar_SAay" id="incentives-for-tefca-participation">Incentives for TEFCA Participation<a href="https://www.medplum.com/blog/technical-guide-to-tefca#incentives-for-tefca-participation" class="hash-link" aria-label="Direct link to Incentives for TEFCA Participation" title="Direct link to Incentives for TEFCA Participation" translate="no">​</a></h2>
<p>Participating in TEFCA offers several incentives for healthcare organizations:</p>
<ul>
<li class=""><strong>Regulatory Requirements:</strong> TEFCA aligns with federal regulations and may be required for participation in certain government programs<sup><a href="https://www.medplum.com/blog/technical-guide-to-tefca#user-content-fn-6-477cb7" id="user-content-fnref-6-477cb7-5" data-footnote-ref="true" aria-describedby="footnote-label" class="anchorTargetStickyNavbar_SAay">6</a></sup>.</li>
<li class=""><strong>Value-Based Care:</strong> TEFCA facilitates data exchange necessary for value-based care models, enabling care coordination and improved patient outcomes<sup><a href="https://www.medplum.com/blog/technical-guide-to-tefca#user-content-fn-6-477cb7" id="user-content-fnref-6-477cb7-6" data-footnote-ref="true" aria-describedby="footnote-label" class="anchorTargetStickyNavbar_SAay">6</a></sup>.</li>
<li class=""><strong>Improved Patient Care:</strong> TEFCA enables access to a more complete patient record, leading to better clinical decision-making and improved care coordination<sup><a href="https://www.medplum.com/blog/technical-guide-to-tefca#user-content-fn-6-477cb7" id="user-content-fnref-6-477cb7-7" data-footnote-ref="true" aria-describedby="footnote-label" class="anchorTargetStickyNavbar_SAay">6</a></sup>.</li>
<li class=""><strong>Enhanced Interoperability:</strong> TEFCA promotes interoperability across different healthcare systems, enabling seamless data exchange and reducing administrative burden<sup><a href="https://www.medplum.com/blog/technical-guide-to-tefca#user-content-fn-6-477cb7" id="user-content-fnref-6-477cb7-8" data-footnote-ref="true" aria-describedby="footnote-label" class="anchorTargetStickyNavbar_SAay">6</a></sup>.</li>
<li class=""><strong>Public Health Reporting:</strong> TEFCA facilitates public health reporting, enabling the electronic submission of case reports and other critical data<sup><a href="https://www.medplum.com/blog/technical-guide-to-tefca#user-content-fn-6-477cb7" id="user-content-fnref-6-477cb7-9" data-footnote-ref="true" aria-describedby="footnote-label" class="anchorTargetStickyNavbar_SAay">6</a></sup>.</li>
<li class=""><strong>Competitive Advantage:</strong> TEFCA participation can provide a competitive advantage by demonstrating a commitment to interoperability and data exchange<sup><a href="https://www.medplum.com/blog/technical-guide-to-tefca#user-content-fn-6-477cb7" id="user-content-fnref-6-477cb7-10" data-footnote-ref="true" aria-describedby="footnote-label" class="anchorTargetStickyNavbar_SAay">6</a></sup>.</li>
</ul>
<h2 class="anchor anchorTargetStickyNavbar_SAay" id="data-governance-and-compliance">Data Governance and Compliance<a href="https://www.medplum.com/blog/technical-guide-to-tefca#data-governance-and-compliance" class="hash-link" aria-label="Direct link to Data Governance and Compliance" title="Direct link to Data Governance and Compliance" translate="no">​</a></h2>
<p>TEFCA emphasizes data governance and compliance to ensure the responsible and secure exchange of health information. Key considerations include:</p>
<ul>
<li class=""><strong>Data Quality Control:</strong> QHINs and their participants are responsible for implementing data quality control measures to ensure the accuracy and reliability of exchanged data<sup><a href="https://www.medplum.com/blog/technical-guide-to-tefca#user-content-fn-17-477cb7" id="user-content-fnref-17-477cb7" data-footnote-ref="true" aria-describedby="footnote-label" class="anchorTargetStickyNavbar_SAay">17</a></sup>.</li>
<li class=""><strong>Data Storage:</strong> QHINs generally act as pass-throughs for data and do not store it. Participants and Subparticipants become stewards of the data they consume and are responsible for its storage and use in compliance with HIPAA and other applicable laws<sup><a href="https://www.medplum.com/blog/technical-guide-to-tefca#user-content-fn-17-477cb7" id="user-content-fnref-17-477cb7-2" data-footnote-ref="true" aria-describedby="footnote-label" class="anchorTargetStickyNavbar_SAay">17</a></sup>.</li>
<li class=""><strong>Legal Considerations:</strong> Agreements between QHINs, Participants, and Subparticipants address how information will be exchanged and do not alter existing legal authority for accessing or sharing data<sup><a href="https://www.medplum.com/blog/technical-guide-to-tefca#user-content-fn-17-477cb7" id="user-content-fnref-17-477cb7-3" data-footnote-ref="true" aria-describedby="footnote-label" class="anchorTargetStickyNavbar_SAay">17</a></sup>.</li>
</ul>
<h2 class="anchor anchorTargetStickyNavbar_SAay" id="operational-considerations">Operational Considerations<a href="https://www.medplum.com/blog/technical-guide-to-tefca#operational-considerations" class="hash-link" aria-label="Direct link to Operational Considerations" title="Direct link to Operational Considerations" translate="no">​</a></h2>
<p>When connecting to a QHIN, organizations should consider the following operational aspects:</p>
<ul>
<li class=""><strong>Network Traffic:</strong> QHINs are designed to handle high volumes of transactions, but organizations should monitor network traffic and potential bottlenecks<sup><a href="https://www.medplum.com/blog/technical-guide-to-tefca#user-content-fn-17-477cb7" id="user-content-fnref-17-477cb7-4" data-footnote-ref="true" aria-describedby="footnote-label" class="anchorTargetStickyNavbar_SAay">17</a></sup>.</li>
<li class=""><strong>Data Quality Issues:</strong> Organizations should have processes in place to address potential data quality issues and escalate concerns to the RCE if necessary<sup><a href="https://www.medplum.com/blog/technical-guide-to-tefca#user-content-fn-17-477cb7" id="user-content-fnref-17-477cb7-5" data-footnote-ref="true" aria-describedby="footnote-label" class="anchorTargetStickyNavbar_SAay">17</a></sup>.</li>
<li class=""><strong>Dispute Resolution:</strong> Organizations should be familiar with the TEFCA dispute resolution process for resolving any issues or disagreements that may arise<sup><a href="https://www.medplum.com/blog/technical-guide-to-tefca#user-content-fn-17-477cb7" id="user-content-fnref-17-477cb7-6" data-footnote-ref="true" aria-describedby="footnote-label" class="anchorTargetStickyNavbar_SAay">17</a></sup>.</li>
</ul>
<h2 class="anchor anchorTargetStickyNavbar_SAay" id="the-evolving-landscape-and-future-of-tefca">The Evolving Landscape and Future of TEFCA<a href="https://www.medplum.com/blog/technical-guide-to-tefca#the-evolving-landscape-and-future-of-tefca" class="hash-link" aria-label="Direct link to The Evolving Landscape and Future of TEFCA" title="Direct link to The Evolving Landscape and Future of TEFCA" translate="no">​</a></h2>
<p>TEFCA is shaping the future of healthcare interoperability, and its landscape is constantly evolving.</p>
<h3 class="anchor anchorTargetStickyNavbar_SAay" id="the-role-of-epic-and-other-ehr-vendors">The Role of Epic and Other EHR Vendors<a href="https://www.medplum.com/blog/technical-guide-to-tefca#the-role-of-epic-and-other-ehr-vendors" class="hash-link" aria-label="Direct link to The Role of Epic and Other EHR Vendors" title="Direct link to The Role of Epic and Other EHR Vendors" translate="no">​</a></h3>
<p>Epic, a leading EHR vendor, plays a significant role in TEFCA. Epic has developed its own QHIN, Epic Nexus, to facilitate TEFCA participation for its customers<sup><a href="https://www.medplum.com/blog/technical-guide-to-tefca#user-content-fn-18-477cb7" id="user-content-fnref-18-477cb7" data-footnote-ref="true" aria-describedby="footnote-label" class="anchorTargetStickyNavbar_SAay">18</a></sup>. As of December 2024, Epic Nexus has connected 625 hospitals to the TEFCA network<sup><a href="https://www.medplum.com/blog/technical-guide-to-tefca#user-content-fn-18-477cb7" id="user-content-fnref-18-477cb7-2" data-footnote-ref="true" aria-describedby="footnote-label" class="anchorTargetStickyNavbar_SAay">18</a></sup>. This demonstrates the commitment of EHR vendors to supporting TEFCA and promoting nationwide interoperability.</p>
<h3 class="anchor anchorTargetStickyNavbar_SAay" id="the-future-of-carequality-and-commonwell">The Future of Carequality and CommonWell<a href="https://www.medplum.com/blog/technical-guide-to-tefca#the-future-of-carequality-and-commonwell" class="hash-link" aria-label="Direct link to The Future of Carequality and CommonWell" title="Direct link to The Future of Carequality and CommonWell" translate="no">​</a></h3>
<p>Carequality and CommonWell, two major health information exchange frameworks, are aligning their strategies with TEFCA<sup><a href="https://www.medplum.com/blog/technical-guide-to-tefca#user-content-fn-19-477cb7" id="user-content-fnref-19-477cb7" data-footnote-ref="true" aria-describedby="footnote-label" class="anchorTargetStickyNavbar_SAay">19</a></sup>. Carequality is enhancing its framework to bolster trust and plans to converge with TEFCA in the future<sup><a href="https://www.medplum.com/blog/technical-guide-to-tefca#user-content-fn-19-477cb7" id="user-content-fnref-19-477cb7-2" data-footnote-ref="true" aria-describedby="footnote-label" class="anchorTargetStickyNavbar_SAay">19</a></sup>. CommonWell, now a designated QHIN, is actively collaborating with TEFCA to improve data exchange and interoperability<sup><a href="https://www.medplum.com/blog/technical-guide-to-tefca#user-content-fn-20-477cb7" id="user-content-fnref-20-477cb7" data-footnote-ref="true" aria-describedby="footnote-label" class="anchorTargetStickyNavbar_SAay">20</a></sup>. This convergence of existing frameworks with TEFCA will further strengthen nationwide interoperability and streamline data exchange.</p>
<h3 class="anchor anchorTargetStickyNavbar_SAay" id="emerging-use-cases">Emerging Use Cases<a href="https://www.medplum.com/blog/technical-guide-to-tefca#emerging-use-cases" class="hash-link" aria-label="Direct link to Emerging Use Cases" title="Direct link to Emerging Use Cases" translate="no">​</a></h3>
<p>TEFCA is enabling new and innovative use cases for health information exchange. Some examples include:</p>
<ul>
<li class=""><strong>Electronic Case Reporting:</strong> TEFCA facilitates electronic case reporting to public health agencies, enabling the automated transmission of case reports and supporting public health surveillance<sup><a href="https://www.medplum.com/blog/technical-guide-to-tefca#user-content-fn-21-477cb7" id="user-content-fnref-21-477cb7" data-footnote-ref="true" aria-describedby="footnote-label" class="anchorTargetStickyNavbar_SAay">21</a></sup>.</li>
<li class=""><strong>Public Health Data Exchange:</strong> TEFCA enables public health agencies to access and exchange data for various purposes, such as case investigations, syndromic surveillance, and immunization reporting<sup><a href="https://www.medplum.com/blog/technical-guide-to-tefca#user-content-fn-21-477cb7" id="user-content-fnref-21-477cb7-2" data-footnote-ref="true" aria-describedby="footnote-label" class="anchorTargetStickyNavbar_SAay">21</a></sup>.</li>
<li class=""><strong>HEDIS Reporting:</strong> TEFCA is being explored for HEDIS reporting, potentially streamlining data collection and reducing the burden associated with quality measurement<sup><a href="https://www.medplum.com/blog/technical-guide-to-tefca#user-content-fn-22-477cb7" id="user-content-fnref-22-477cb7" data-footnote-ref="true" aria-describedby="footnote-label" class="anchorTargetStickyNavbar_SAay">22</a></sup>.</li>
</ul>
<p>These emerging use cases demonstrate the potential of TEFCA to transform healthcare interoperability and improve various aspects of healthcare delivery and public health.</p>
<h2 class="anchor anchorTargetStickyNavbar_SAay" id="benefits-of-tefca-for-developers">Benefits of TEFCA for Developers<a href="https://www.medplum.com/blog/technical-guide-to-tefca#benefits-of-tefca-for-developers" class="hash-link" aria-label="Direct link to Benefits of TEFCA for Developers" title="Direct link to Benefits of TEFCA for Developers" translate="no">​</a></h2>
<p>TEFCA offers several benefits for software developers:</p>
<ul>
<li class=""><strong>Facilitating Innovation:</strong> TEFCA provides a standardized framework for data exchange, removing barriers to innovation and enabling the development of new technologies and applications<sup><a href="https://www.medplum.com/blog/technical-guide-to-tefca#user-content-fn-2-477cb7" id="user-content-fnref-2-477cb7-2" data-footnote-ref="true" aria-describedby="footnote-label" class="anchorTargetStickyNavbar_SAay">2</a></sup>.</li>
<li class=""><strong>Reducing Administrative Burden:</strong> TEFCA streamlines data exchange processes, reducing administrative burden and allowing developers to focus on building and improving healthcare solutions<sup><a href="https://www.medplum.com/blog/technical-guide-to-tefca#user-content-fn-2-477cb7" id="user-content-fnref-2-477cb7-3" data-footnote-ref="true" aria-describedby="footnote-label" class="anchorTargetStickyNavbar_SAay">2</a></sup>.</li>
<li class=""><strong>Promoting the Development of New Technologies:</strong> TEFCA fosters a collaborative environment for developing new technologies and applications that leverage interoperable health data<sup><a href="https://www.medplum.com/blog/technical-guide-to-tefca#user-content-fn-2-477cb7" id="user-content-fnref-2-477cb7-4" data-footnote-ref="true" aria-describedby="footnote-label" class="anchorTargetStickyNavbar_SAay">2</a></sup>.</li>
</ul>
<h2 class="anchor anchorTargetStickyNavbar_SAay" id="challenges-and-opportunities-of-tefca">Challenges and Opportunities of TEFCA<a href="https://www.medplum.com/blog/technical-guide-to-tefca#challenges-and-opportunities-of-tefca" class="hash-link" aria-label="Direct link to Challenges and Opportunities of TEFCA" title="Direct link to Challenges and Opportunities of TEFCA" translate="no">​</a></h2>
<p>While TEFCA presents a significant opportunity for improving healthcare interoperability, there are also challenges to consider:</p>
<ul>
<li class=""><strong>Implementation Complexity:</strong> Implementing TEFCA requires careful planning and coordination to ensure compliance with technical specifications, governance policies, and security requirements<sup><a href="https://www.medplum.com/blog/technical-guide-to-tefca#user-content-fn-10-477cb7" id="user-content-fnref-10-477cb7-2" data-footnote-ref="true" aria-describedby="footnote-label" class="anchorTargetStickyNavbar_SAay">10</a></sup>.</li>
<li class=""><strong>Stakeholder Alignment:</strong> Achieving widespread adoption of TEFCA requires alignment and collaboration among various stakeholders, including healthcare providers, payers, health IT vendors, and government agencies<sup><a href="https://www.medplum.com/blog/technical-guide-to-tefca#user-content-fn-10-477cb7" id="user-content-fnref-10-477cb7-3" data-footnote-ref="true" aria-describedby="footnote-label" class="anchorTargetStickyNavbar_SAay">10</a></sup>.</li>
</ul>
<p>Despite these challenges, TEFCA offers a unique opportunity to create a more connected and interoperable healthcare system, leading to improved patient care, enhanced efficiency, and greater innovation.</p>
<h2 class="anchor anchorTargetStickyNavbar_SAay" id="security-considerations">Security Considerations<a href="https://www.medplum.com/blog/technical-guide-to-tefca#security-considerations" class="hash-link" aria-label="Direct link to Security Considerations" title="Direct link to Security Considerations" translate="no">​</a></h2>
<p>TEFCA prioritizes security and privacy, requiring QHINs and their participants to implement robust security controls<sup><a href="https://www.medplum.com/blog/technical-guide-to-tefca#user-content-fn-23-477cb7" id="user-content-fnref-23-477cb7" data-footnote-ref="true" aria-describedby="footnote-label" class="anchorTargetStickyNavbar_SAay">23</a></sup>. These include:</p>
<ul>
<li class=""><strong>HIPAA Compliance:</strong> QHINs and participants subject to HIPAA must comply with its privacy and security rules<sup><a href="https://www.medplum.com/blog/technical-guide-to-tefca#user-content-fn-23-477cb7" id="user-content-fnref-23-477cb7-2" data-footnote-ref="true" aria-describedby="footnote-label" class="anchorTargetStickyNavbar_SAay">23</a></sup>.</li>
<li class=""><strong>Data Encryption:</strong> All entities must encrypt individually identifiable information, both in transit and at rest<sup><a href="https://www.medplum.com/blog/technical-guide-to-tefca#user-content-fn-23-477cb7" id="user-content-fnref-23-477cb7-3" data-footnote-ref="true" aria-describedby="footnote-label" class="anchorTargetStickyNavbar_SAay">23</a></sup>.</li>
<li class=""><strong>Cybersecurity Measures:</strong> QHINs must implement cybersecurity measures, including annual technical audits, penetration testing, and incident reporting<sup><a href="https://www.medplum.com/blog/technical-guide-to-tefca#user-content-fn-23-477cb7" id="user-content-fnref-23-477cb7-4" data-footnote-ref="true" aria-describedby="footnote-label" class="anchorTargetStickyNavbar_SAay">23</a></sup>.</li>
<li class=""><strong>Identity Proofing and Authentication:</strong> TEFCA requires strong identity proofing and authentication mechanisms to ensure secure access to health information<sup><a href="https://www.medplum.com/blog/technical-guide-to-tefca#user-content-fn-23-477cb7" id="user-content-fnref-23-477cb7-5" data-footnote-ref="true" aria-describedby="footnote-label" class="anchorTargetStickyNavbar_SAay">23</a></sup>.</li>
</ul>
<p>These security measures help protect patient data and maintain the integrity and trustworthiness of the TEFCA exchange ecosystem.</p>
<h2 class="anchor anchorTargetStickyNavbar_SAay" id="conclusion">Conclusion<a href="https://www.medplum.com/blog/technical-guide-to-tefca#conclusion" class="hash-link" aria-label="Direct link to Conclusion" title="Direct link to Conclusion" translate="no">​</a></h2>
<p>TEFCA represents a significant advancement in healthcare interoperability, establishing a nationwide framework for secure and efficient data exchange. By connecting various health information networks and their participants, TEFCA enables seamless access to patient information, improves care coordination, and promotes innovation in healthcare.</p>
<p>Software developers and healthcare IT professionals play a crucial role in integrating systems with TEFCA. By understanding the technical specifications, governance policies, and security requirements of TEFCA, they can ensure their applications and organizations are TEFCA-compliant and leverage its benefits.</p>
<p>Medplum offers a valuable platform for organizations seeking to participate in TEFCA. Its integration engine, FHIR support, and security features facilitate QHIN connectivity and enable the development of interoperable healthcare solutions.</p>
<p>The evolving landscape of TEFCA, with the participation of major EHR vendors and the alignment of existing HIE frameworks, further strengthens the foundation for nationwide interoperability. Emerging use cases, such as electronic case reporting and public health data exchange, demonstrate the potential of TEFCA to transform healthcare and improve patient outcomes.</p>
<p>We encourage healthcare organizations and developers to embrace TEFCA and contribute to the development of a more connected and interoperable healthcare ecosystem.</p>
<h2 class="anchor anchorTargetStickyNavbar_SAay" id="glossary-of-terms">Glossary of Terms<a href="https://www.medplum.com/blog/technical-guide-to-tefca#glossary-of-terms" class="hash-link" aria-label="Direct link to Glossary of Terms" title="Direct link to Glossary of Terms" translate="no">​</a></h2>
<table><thead><tr><th style="text-align:left">Term</th><th style="text-align:left">Definition</th></tr></thead><tbody><tr><td style="text-align:left"><strong>Access Consent Policy (ACP)</strong></td><td style="text-align:left">Policies that may influence access control decisions and which can be referenced in queries<sup><a href="https://www.medplum.com/blog/technical-guide-to-tefca#user-content-fn-24-477cb7" id="user-content-fnref-24-477cb7" data-footnote-ref="true" aria-describedby="footnote-label" class="anchorTargetStickyNavbar_SAay">24</a></sup>.</td></tr><tr><td style="text-align:left"><strong>Actor</strong></td><td style="text-align:left">A QHIN, Participant, or Subparticipant<sup><a href="https://www.medplum.com/blog/technical-guide-to-tefca#user-content-fn-24-477cb7" id="user-content-fnref-24-477cb7-2" data-footnote-ref="true" aria-describedby="footnote-label" class="anchorTargetStickyNavbar_SAay">24</a></sup>.</td></tr><tr><td style="text-align:left"><strong>Applicable Law</strong></td><td style="text-align:left">All federal, state, local, or tribal laws and regulations then in effect and applicable to the activities of a QHIN, Participant, or Subparticipant<sup><a href="https://www.medplum.com/blog/technical-guide-to-tefca#user-content-fn-24-477cb7" id="user-content-fnref-24-477cb7-3" data-footnote-ref="true" aria-describedby="footnote-label" class="anchorTargetStickyNavbar_SAay">24</a></sup>.</td></tr><tr><td style="text-align:left"><strong>Breach of Unencrypted Individually Identifiable Information</strong></td><td style="text-align:left">The acquisition, access, or disclosure of unencrypted individually identifiable information maintained by an Individual Access Services (IAS) Provider that compromises the security or privacy of the unencrypted individually identifiable information<sup><a href="https://www.medplum.com/blog/technical-guide-to-tefca#user-content-fn-24-477cb7" id="user-content-fnref-24-477cb7-4" data-footnote-ref="true" aria-describedby="footnote-label" class="anchorTargetStickyNavbar_SAay">24</a></sup>.</td></tr><tr><td style="text-align:left"><strong>Confidential Information</strong></td><td style="text-align:left">Any information that is designated as confidential by the disclosing person or entity, or that a reasonable person would understand to be confidential, and is disclosed pursuant to a Framework Agreement<sup><a href="https://www.medplum.com/blog/technical-guide-to-tefca#user-content-fn-24-477cb7" id="user-content-fnref-24-477cb7-5" data-footnote-ref="true" aria-describedby="footnote-label" class="anchorTargetStickyNavbar_SAay">24</a></sup>.</td></tr><tr><td style="text-align:left"><strong>Delegate</strong></td><td style="text-align:left">A QHIN, Participant, or Subparticipant that is not a Principal and has a written agreement with a Principal authorizing the Delegate to conduct TEFCA Exchange activities on behalf of the Principal<sup><a href="https://www.medplum.com/blog/technical-guide-to-tefca#user-content-fn-24-477cb7" id="user-content-fnref-24-477cb7-6" data-footnote-ref="true" aria-describedby="footnote-label" class="anchorTargetStickyNavbar_SAay">24</a></sup>.</td></tr><tr><td style="text-align:left"><strong>Delegated Request</strong></td><td style="text-align:left">A TEFCA Exchange Request initiated by a Delegate working for a Principal<sup><a href="https://www.medplum.com/blog/technical-guide-to-tefca#user-content-fn-24-477cb7" id="user-content-fnref-24-477cb7-7" data-footnote-ref="true" aria-describedby="footnote-label" class="anchorTargetStickyNavbar_SAay">24</a></sup>.</td></tr><tr><td style="text-align:left"><strong>Designated Network</strong></td><td style="text-align:left">The health information network that a QHIN uses to offer and provide Designated Network Services<sup><a href="https://www.medplum.com/blog/technical-guide-to-tefca#user-content-fn-25-477cb7" id="user-content-fnref-25-477cb7" data-footnote-ref="true" aria-describedby="footnote-label" class="anchorTargetStickyNavbar_SAay">25</a></sup>.</td></tr><tr><td style="text-align:left"><strong>Designated Network Governance Body</strong></td><td style="text-align:left">A representative and participatory group or groups that approve the processes for fulfilling the Governance Functions and participate in such Governance Functions for Signatory's Designated Network<sup><a href="https://www.medplum.com/blog/technical-guide-to-tefca#user-content-fn-25-477cb7" id="user-content-fnref-25-477cb7-2" data-footnote-ref="true" aria-describedby="footnote-label" class="anchorTargetStickyNavbar_SAay">25</a></sup>.</td></tr><tr><td style="text-align:left"><strong>Directory Entry(ies)</strong></td><td style="text-align:left">The listing of each Node controlled by a QHIN, Participant, or Subparticipant, which includes the Endpoint for such Node(s) and any other organizational or technical information required by the QTF or applicable SOP<sup><a href="https://www.medplum.com/blog/technical-guide-to-tefca#user-content-fn-24-477cb7" id="user-content-fnref-24-477cb7-8" data-footnote-ref="true" aria-describedby="footnote-label" class="anchorTargetStickyNavbar_SAay">24</a></sup>.</td></tr><tr><td style="text-align:left"><strong>Discovery</strong></td><td style="text-align:left">For purposes of determining the date on which a TEFCA Security Incident was discovered, the term Discovery shall be determined consistent with 45 CFR § 164.402<sup><a href="https://www.medplum.com/blog/technical-guide-to-tefca#user-content-fn-24-477cb7" id="user-content-fnref-24-477cb7-9" data-footnote-ref="true" aria-describedby="footnote-label" class="anchorTargetStickyNavbar_SAay">24</a></sup>.</td></tr><tr><td style="text-align:left"><strong>Electronic Case Investigation</strong></td><td style="text-align:left">A public health tool that involves a PHA gathering additional information in response to a disease or condition that has already been reported under Applicable Law<sup><a href="https://www.medplum.com/blog/technical-guide-to-tefca#user-content-fn-24-477cb7" id="user-content-fnref-24-477cb7-10" data-footnote-ref="true" aria-describedby="footnote-label" class="anchorTargetStickyNavbar_SAay">24</a></sup>.</td></tr><tr><td style="text-align:left"><strong>Enterprise Master Patient Index (eMPI)</strong></td><td style="text-align:left">A system that coordinates patient identification across multiple systems by collecting, storing, and managing identifiers and patient-identifying demographic information from a source system<sup><a href="https://www.medplum.com/blog/technical-guide-to-tefca#user-content-fn-24-477cb7" id="user-content-fnref-24-477cb7-11" data-footnote-ref="true" aria-describedby="footnote-label" class="anchorTargetStickyNavbar_SAay">24</a></sup>.</td></tr><tr><td style="text-align:left"><strong>Exchange Modality</strong></td><td style="text-align:left">QHIN Query, Message Delivery, and Facilitated FHIR<sup><a href="https://www.medplum.com/blog/technical-guide-to-tefca#user-content-fn-24-477cb7" id="user-content-fnref-24-477cb7-12" data-footnote-ref="true" aria-describedby="footnote-label" class="anchorTargetStickyNavbar_SAay">24</a></sup>.</td></tr><tr><td style="text-align:left"><strong>Exchange Purpose(s) or XP(s)</strong></td><td style="text-align:left">The reason, as authorized by a Framework Agreement, including the applicable SOPs for a Transmission, Request, Use, Disclosure, or Response transacted through TEFCA Exchange<sup><a href="https://www.medplum.com/blog/technical-guide-to-tefca#user-content-fn-24-477cb7" id="user-content-fnref-24-477cb7-13" data-footnote-ref="true" aria-describedby="footnote-label" class="anchorTargetStickyNavbar_SAay">24</a></sup>.</td></tr><tr><td style="text-align:left"><strong>FHIR Adopters</strong></td><td style="text-align:left">Any QHIN, Participant, or Subparticipant that wishes to engage in TEFCA Exchange using FHIR<sup><a href="https://www.medplum.com/blog/technical-guide-to-tefca#user-content-fn-25-477cb7" id="user-content-fnref-25-477cb7-3" data-footnote-ref="true" aria-describedby="footnote-label" class="anchorTargetStickyNavbar_SAay">25</a></sup>.</td></tr><tr><td style="text-align:left"><strong>FHIR Endpoint</strong></td><td style="text-align:left">Has the meaning assigned to such term in the Health Level Seven (HL7®) FHIR® standard<sup><a href="https://www.medplum.com/blog/technical-guide-to-tefca#user-content-fn-25-477cb7" id="user-content-fnref-25-477cb7-4" data-footnote-ref="true" aria-describedby="footnote-label" class="anchorTargetStickyNavbar_SAay">25</a></sup>.</td></tr><tr><td style="text-align:left"><strong>FHIR Push</strong></td><td style="text-align:left">A PUT or POST operation that submits data to a QHIN, Participant, or Subparticipant<sup><a href="https://www.medplum.com/blog/technical-guide-to-tefca#user-content-fn-25-477cb7" id="user-content-fnref-25-477cb7-5" data-footnote-ref="true" aria-describedby="footnote-label" class="anchorTargetStickyNavbar_SAay">25</a></sup>.</td></tr><tr><td style="text-align:left"><strong>FHIR Query</strong></td><td style="text-align:left">An operation that Queries information from a Responding Node<sup><a href="https://www.medplum.com/blog/technical-guide-to-tefca#user-content-fn-25-477cb7" id="user-content-fnref-25-477cb7-6" data-footnote-ref="true" aria-describedby="footnote-label" class="anchorTargetStickyNavbar_SAay">25</a></sup>.</td></tr><tr><td style="text-align:left"><strong>QHIN Directory</strong></td><td style="text-align:left">A system used by QHINs to record and resolve the identifiers and Endpoints of their Participants and Subparticipants<sup><a href="https://www.medplum.com/blog/technical-guide-to-tefca#user-content-fn-25-477cb7" id="user-content-fnref-25-477cb7-7" data-footnote-ref="true" aria-describedby="footnote-label" class="anchorTargetStickyNavbar_SAay">25</a></sup>.</td></tr><tr><td style="text-align:left"><strong>QHIN Message Delivery</strong></td><td style="text-align:left">The act of a QHIN delivering information to one or more other QHINs<sup><a href="https://www.medplum.com/blog/technical-guide-to-tefca#user-content-fn-25-477cb7" id="user-content-fnref-25-477cb7-8" data-footnote-ref="true" aria-describedby="footnote-label" class="anchorTargetStickyNavbar_SAay">25</a></sup>.</td></tr><tr><td style="text-align:left"><strong>QHIN Query</strong></td><td style="text-align:left">The act of a QHIN Querying information from one or more other QHINs<sup><a href="https://www.medplum.com/blog/technical-guide-to-tefca#user-content-fn-25-477cb7" id="user-content-fnref-25-477cb7-9" data-footnote-ref="true" aria-describedby="footnote-label" class="anchorTargetStickyNavbar_SAay">25</a></sup>.</td></tr><tr><td style="text-align:left"><strong>QHIN Technical Framework (QTF)</strong></td><td style="text-align:left">The most recent effective version of the document that outlines the technical specifications and other technical requirements necessary for QHINs to exchange information<sup><a href="https://www.medplum.com/blog/technical-guide-to-tefca#user-content-fn-25-477cb7" id="user-content-fnref-25-477cb7-10" data-footnote-ref="true" aria-describedby="footnote-label" class="anchorTargetStickyNavbar_SAay">25</a></sup>.</td></tr></tbody></table>
<h4 class="anchor anchorTargetStickyNavbar_SAay" id="works-cited"><strong>Works cited</strong><a href="https://www.medplum.com/blog/technical-guide-to-tefca#works-cited" class="hash-link" aria-label="Direct link to works-cited" title="Direct link to works-cited" translate="no">​</a></h4>
<p>1. TEFCA | HealthIT.gov, accessed February 16, 2025, <a href="https://www.healthit.gov/topic/interoperability/policy/trusted-exchange-framework-and-common-agreement-tefca" target="_blank" rel="noopener noreferrer" class="">https://www.healthit.gov/topic/interoperability/policy/trusted-exchange-framework-and-common-agreement-tefca</a><br>
<!-- -->2. Understanding TEFCA: Key Changes and Impacts on Healthcare in 2025 and Beyond, accessed February 16, 2025, <a href="https://www.productiveedge.com/blog/understanding-tefca-key-changes-and-impacts-on-healthcare-in-2025-and-beyond" target="_blank" rel="noopener noreferrer" class="">https://www.productiveedge.com/blog/understanding-tefca-key-changes-and-impacts-on-healthcare-in-2025-and-beyond</a><br>
<!-- -->3. TEFCA Overview and Perspectives From the Field - ASTHO, accessed February 16, 2025, <a href="https://www.astho.org/48f67a/globalassets/pdf/tefca-overview-and-perspectives-slides-april-2024.pdf" target="_blank" rel="noopener noreferrer" class="">https://www.astho.org/48f67a/globalassets/pdf/tefca-overview-and-perspectives-slides-april-2024.pdf</a><br>
<!-- -->4. Qualified Health Information Network | QHIN - MedAllies, accessed February 16, 2025, <a href="https://www.medallies.com/qualified-health-information-network-qhin/" target="_blank" rel="noopener noreferrer" class="">https://www.medallies.com/qualified-health-information-network-qhin/</a><br>
<!-- -->5. TEFCA in Healthcare: TEFCA QHIN and Components of TEFC - Kodjin, accessed February 16, 2025, <a href="https://kodjin.com/blog/trusted-exchange-framework-and-common-agreement/" target="_blank" rel="noopener noreferrer" class="">https://kodjin.com/blog/trusted-exchange-framework-and-common-agreement/</a><br>
<!-- -->6. Trusted Exchange Framework and Common Agreement (TEFCA) Overview - CDC Foundation, accessed February 16, 2025, <a href="https://www.cdcfoundation.org/TEFCADataSharingandImplementationCenters-JimJirjis.pdf?inline" target="_blank" rel="noopener noreferrer" class="">https://www.cdcfoundation.org/TEFCADataSharingandImplementationCenters-JimJirjis.pdf?inline</a><br>
<!-- -->7. HTI-2 Final Rule Fact Sheet: TEFCA and QHIN Designations, Governance and Appeal Rights | HIMSS, accessed February 16, 2025, <a href="https://gkc.himss.org/resources/hti-2-final-rule-fact-sheet-tefca-and-qhin-designations-governance-and-appeal-rights" target="_blank" rel="noopener noreferrer" class="">https://gkc.himss.org/resources/hti-2-final-rule-fact-sheet-tefca-and-qhin-designations-governance-and-appeal-rights</a><br>
<!-- -->8. Standard Operating Procedure (SOP): TEFCA Security Incident Reporting, accessed February 16, 2025, <a href="https://rce.sequoiaproject.org/wp-content/uploads/2024/07/SOP-TSI-Reporting-v1-508.pdf" target="_blank" rel="noopener noreferrer" class="">https://rce.sequoiaproject.org/wp-content/uploads/2024/07/SOP-TSI-Reporting-v1-508.pdf</a><br>
<!-- -->9. Understanding TEFCA and its Role in National Interoperability - Harmony Healthcare IT, accessed February 16, 2025, <a href="https://www.harmonyhit.com/understanding-tefca-and-its-role-in-national-interoperability/" target="_blank" rel="noopener noreferrer" class="">https://www.harmonyhit.com/understanding-tefca-and-its-role-in-national-interoperability/</a><br>
<!-- -->10. Decoding Interoperability: TEFCA and National Networks and Frameworks Explained, accessed February 16, 2025, <a href="https://gkc.himss.org/news/decoding-interoperability-tefca-and-national-networks-and-frameworks-explained" target="_blank" rel="noopener noreferrer" class="">https://gkc.himss.org/news/decoding-interoperability-tefca-and-national-networks-and-frameworks-explained</a><br>
<!-- -->11. Medplum | Medplum, accessed February 16, 2025, <a href="https://www.medplum.com/" target="_blank" rel="noopener noreferrer" class="">https://www.medplum.com/</a><br>
<!-- -->12. Integrations and Interoperability Engine - Medplum, accessed February 16, 2025, <a href="https://www.medplum.com/products/integration" target="_blank" rel="noopener noreferrer" class="">https://www.medplum.com/products/integration</a><br>
<!-- -->13. Products | Medplum, accessed February 16, 2025, <a href="https://www.medplum.com/products" target="_blank" rel="noopener noreferrer" class="">https://www.medplum.com/products</a><br>
<!-- -->14. Security | Medplum, accessed February 16, 2025, <a href="https://www.medplum.com/security" target="_blank" rel="noopener noreferrer" class="">https://www.medplum.com/security</a><br>
<!-- -->15. Blog | Medplum, accessed February 16, 2025, <a href="https://www.medplum.com/blog" target="_blank" rel="noopener noreferrer" class="">https://www.medplum.com/blog</a><br>
<!-- -->16. Stop building your own EHR - A CTO's introduction to Medplum, accessed February 16, 2025, <a href="https://www.vintasoftware.com/blog/building-ehr-introducing-medplum" target="_blank" rel="noopener noreferrer" class="">https://www.vintasoftware.com/blog/building-ehr-introducing-medplum</a><br>
<!-- -->17. TEFCA Frequently Asked Questions | ASTHO, accessed February 16, 2025, <a href="https://www.astho.org/globalassets/pdf/tefca-frequently-asked-questions.pdf" target="_blank" rel="noopener noreferrer" class="">https://www.astho.org/globalassets/pdf/tefca-frequently-asked-questions.pdf</a><br>
<!-- -->18. Health Systems Using Epic Have Connected 625 Hospitals to the ..., accessed February 16, 2025, <a href="https://www.epic.com/epic/post/health-systems-using-epic-have-connected-625-hospitals-to-the-tefca-interoperability-framework-in-one-year/" target="_blank" rel="noopener noreferrer" class="">https://www.epic.com/epic/post/health-systems-using-epic-have-connected-625-hospitals-to-the-tefca-interoperability-framework-in-one-year/</a><br>
<!-- -->19. Carequality Announcement About Framework Enhancements, accessed February 16, 2025, <a href="https://carequality.org/carequality-announcement-about-framework-enhancements/" target="_blank" rel="noopener noreferrer" class="">https://carequality.org/carequality-announcement-about-framework-enhancements/</a><br>
<!-- -->20. About CommonWell, accessed February 16, 2025, <a href="https://www.commonwellalliance.org/about/" target="_blank" rel="noopener noreferrer" class="">https://www.commonwellalliance.org/about/</a><br>
<!-- -->21. <a href="http://www.cdcfoundation.org/" target="_blank" rel="noopener noreferrer" class="">www.cdcfoundation.org</a>, accessed February 16, 2025, <a href="https://www.cdcfoundation.org/TEFCA-eCR-Query-Hartsell?inline" target="_blank" rel="noopener noreferrer" class="">https://www.cdcfoundation.org/TEFCA-eCR-Query-Hartsell?inline</a><br>
<!-- -->22. Updated TEFCA SOPs for Health Care Operations and NCQA - NCQA, accessed February 16, 2025, <a href="https://www.ncqa.org/blog/updated-tefca-sops-for-health-care-operations/" target="_blank" rel="noopener noreferrer" class="">https://www.ncqa.org/blog/updated-tefca-sops-for-health-care-operations/</a><br>
<!-- -->23. ASTP Final Rule Codifies Requirements for TEFCA-Qualified Health Information Networks, accessed February 16, 2025, <a href="https://www.mwe.com/insights/astp-final-rule-codifies-requirements-for-tefca-qualified-health-information-networks/" target="_blank" rel="noopener noreferrer" class="">https://www.mwe.com/insights/astp-final-rule-codifies-requirements-for-tefca-qualified-health-information-networks/</a><br>
<!-- -->24. TEFCA Glossary, accessed February 16, 2025, <a href="https://rce.sequoiaproject.org/wp-content/uploads/2024/01/Draft-TEFCA-Glossary-508-Compliant.pdf" target="_blank" rel="noopener noreferrer" class="">https://rce.sequoiaproject.org/wp-content/uploads/2024/01/Draft-TEFCA-Glossary-508-Compliant.pdf</a><br>
<!-- -->25. TEFCA Glossary, accessed February 16, 2025, <a href="https://rce.sequoiaproject.org/wp-content/uploads/2024/07/TEFCA-Glossary_508-1.pdf" target="_blank" rel="noopener noreferrer" class="">https://rce.sequoiaproject.org/wp-content/uploads/2024/07/TEFCA-Glossary_508-1.pdf</a></p>
<h2 class="anchor anchorTargetStickyNavbar_SAay" id="footnotes">Footnotes<a href="https://www.medplum.com/blog/technical-guide-to-tefca#footnotes" class="hash-link" aria-label="Direct link to Footnotes" title="Direct link to Footnotes" translate="no">​</a></h2>
<!-- -->
<section data-footnotes="true" class="footnotes"><h2 class="anchor anchorTargetStickyNavbar_SAay sr-only" id="footnote-label">Footnotes<a href="https://www.medplum.com/blog/technical-guide-to-tefca#footnote-label" class="hash-link" aria-label="Direct link to Footnotes" title="Direct link to Footnotes" translate="no">​</a></h2>
<ol>
<li class="anchorTargetStickyNavbar_SAay" id="user-content-fn-1-477cb7">
<p>Framework for Public Health Interoperability - Version 2.1 Published. NACCHO. (n.d.). Retrieved February 16, 2025, from <a href="https://www.naccho.org/blog/articles/tefca-ver-2.1-published" target="_blank" rel="noopener noreferrer" class="">https://www.naccho.org/blog/articles/tefca-ver-2.1-published</a> <a href="https://www.medplum.com/blog/technical-guide-to-tefca#user-content-fnref-1-477cb7" data-footnote-backref="" aria-label="Back to reference 1" class="data-footnote-backref">↩</a> <a href="https://www.medplum.com/blog/technical-guide-to-tefca#user-content-fnref-1-477cb7-2" data-footnote-backref="" aria-label="Back to reference 1-2" class="data-footnote-backref">↩<sup>2</sup></a> <a href="https://www.medplum.com/blog/technical-guide-to-tefca#user-content-fnref-1-477cb7-3" data-footnote-backref="" aria-label="Back to reference 1-3" class="data-footnote-backref">↩<sup>3</sup></a> <a href="https://www.medplum.com/blog/technical-guide-to-tefca#user-content-fnref-1-477cb7-4" data-footnote-backref="" aria-label="Back to reference 1-4" class="data-footnote-backref">↩<sup>4</sup></a> <a href="https://www.medplum.com/blog/technical-guide-to-tefca#user-content-fnref-1-477cb7-5" data-footnote-backref="" aria-label="Back to reference 1-5" class="data-footnote-backref">↩<sup>5</sup></a></p>
</li>
<li class="anchorTargetStickyNavbar_SAay" id="user-content-fn-2-477cb7">
<p>Health Data, Technology, and Interoperability: Trusted Exchange Framework and Common Agreement (TEFCA) Rule. Federal Register. (2024, December 16). Retrieved February 16, 2025, from <a href="https://www.federalregister.gov/documents/2024/12/16/2024-29163/health-data-technology-and-interoperability-trusted-exchange-framework-and-common-agreement-tefca" target="_blank" rel="noopener noreferrer" class="">https://www.federalregister.gov/documents/2024/12/16/2024-29163/health-data-technology-and-interoperability-trusted-exchange-framework-and-common-agreement-tefca</a> <a href="https://www.medplum.com/blog/technical-guide-to-tefca#user-content-fnref-2-477cb7" data-footnote-backref="" aria-label="Back to reference 2" class="data-footnote-backref">↩</a> <a href="https://www.medplum.com/blog/technical-guide-to-tefca#user-content-fnref-2-477cb7-2" data-footnote-backref="" aria-label="Back to reference 2-2" class="data-footnote-backref">↩<sup>2</sup></a> <a href="https://www.medplum.com/blog/technical-guide-to-tefca#user-content-fnref-2-477cb7-3" data-footnote-backref="" aria-label="Back to reference 2-3" class="data-footnote-backref">↩<sup>3</sup></a> <a href="https://www.medplum.com/blog/technical-guide-to-tefca#user-content-fnref-2-477cb7-4" data-footnote-backref="" aria-label="Back to reference 2-4" class="data-footnote-backref">↩<sup>4</sup></a></p>
</li>
<li class="anchorTargetStickyNavbar_SAay" id="user-content-fn-3-477cb7">
<p>Trusted Exchange Framework and Common Agreement (TEFCA). HealthIT.gov. (n.d.). Retrieved February 16, 2025, from <a href="https://www.healthit.gov/topic/interoperability/policy/trusted-exchange-framework-and-common-agreement-tefca" target="_blank" rel="noopener noreferrer" class="">https://www.healthit.gov/topic/interoperability/policy/trusted-exchange-framework-and-common-agreement-tefca</a> <a href="https://www.medplum.com/blog/technical-guide-to-tefca#user-content-fnref-3-477cb7" data-footnote-backref="" aria-label="Back to reference 3" class="data-footnote-backref">↩</a> <a href="https://www.medplum.com/blog/technical-guide-to-tefca#user-content-fnref-3-477cb7-2" data-footnote-backref="" aria-label="Back to reference 3-2" class="data-footnote-backref">↩<sup>2</sup></a> <a href="https://www.medplum.com/blog/technical-guide-to-tefca#user-content-fnref-3-477cb7-3" data-footnote-backref="" aria-label="Back to reference 3-3" class="data-footnote-backref">↩<sup>3</sup></a></p>
</li>
<li class="anchorTargetStickyNavbar_SAay" id="user-content-fn-4-477cb7">
<p>Common Agreement - ONC TEFCA RCE. The Sequoia Project. (n.d.). Retrieved February 16, 2025, from <a href="https://rce.sequoiaproject.org/common-agreement/" target="_blank" rel="noopener noreferrer" class="">https://rce.sequoiaproject.org/common-agreement/</a> <a href="https://www.medplum.com/blog/technical-guide-to-tefca#user-content-fnref-4-477cb7" data-footnote-backref="" aria-label="Back to reference 4" class="data-footnote-backref">↩</a> <a href="https://www.medplum.com/blog/technical-guide-to-tefca#user-content-fnref-4-477cb7-2" data-footnote-backref="" aria-label="Back to reference 4-2" class="data-footnote-backref">↩<sup>2</sup></a></p>
</li>
<li class="anchorTargetStickyNavbar_SAay" id="user-content-fn-5-477cb7">
<p>TEFCA Overview and Perspectives Slides (April 2024). Association of State and Territorial Health Officials (ASTHO). (2024, April). Retrieved February 16, 2025, from <a href="https://www.astho.org/48f67a/globalassets/pdf/tefca-overview-and-perspectives-slides-april-2024.pdf" target="_blank" rel="noopener noreferrer" class="">https://www.astho.org/48f67a/globalassets/pdf/tefca-overview-and-perspectives-slides-april-2024.pdf</a> <a href="https://www.medplum.com/blog/technical-guide-to-tefca#user-content-fnref-5-477cb7" data-footnote-backref="" aria-label="Back to reference 5" class="data-footnote-backref">↩</a> <a href="https://www.medplum.com/blog/technical-guide-to-tefca#user-content-fnref-5-477cb7-2" data-footnote-backref="" aria-label="Back to reference 5-2" class="data-footnote-backref">↩<sup>2</sup></a> <a href="https://www.medplum.com/blog/technical-guide-to-tefca#user-content-fnref-5-477cb7-3" data-footnote-backref="" aria-label="Back to reference 5-3" class="data-footnote-backref">↩<sup>3</sup></a> <a href="https://www.medplum.com/blog/technical-guide-to-tefca#user-content-fnref-5-477cb7-4" data-footnote-backref="" aria-label="Back to reference 5-4" class="data-footnote-backref">↩<sup>4</sup></a> <a href="https://www.medplum.com/blog/technical-guide-to-tefca#user-content-fnref-5-477cb7-5" data-footnote-backref="" aria-label="Back to reference 5-5" class="data-footnote-backref">↩<sup>5</sup></a> <a href="https://www.medplum.com/blog/technical-guide-to-tefca#user-content-fnref-5-477cb7-6" data-footnote-backref="" aria-label="Back to reference 5-6" class="data-footnote-backref">↩<sup>6</sup></a> <a href="https://www.medplum.com/blog/technical-guide-to-tefca#user-content-fnref-5-477cb7-7" data-footnote-backref="" aria-label="Back to reference 5-7" class="data-footnote-backref">↩<sup>7</sup></a> <a href="https://www.medplum.com/blog/technical-guide-to-tefca#user-content-fnref-5-477cb7-8" data-footnote-backref="" aria-label="Back to reference 5-8" class="data-footnote-backref">↩<sup>8</sup></a> <a href="https://www.medplum.com/blog/technical-guide-to-tefca#user-content-fnref-5-477cb7-9" data-footnote-backref="" aria-label="Back to reference 5-9" class="data-footnote-backref">↩<sup>9</sup></a> <a href="https://www.medplum.com/blog/technical-guide-to-tefca#user-content-fnref-5-477cb7-10" data-footnote-backref="" aria-label="Back to reference 5-10" class="data-footnote-backref">↩<sup>10</sup></a> <a href="https://www.medplum.com/blog/technical-guide-to-tefca#user-content-fnref-5-477cb7-11" data-footnote-backref="" aria-label="Back to reference 5-11" class="data-footnote-backref">↩<sup>11</sup></a></p>
</li>
<li class="anchorTargetStickyNavbar_SAay" id="user-content-fn-6-477cb7">
<p>TEFCA Data Sharing and Implementation Centers. CDC Foundation. (n.d.). Retrieved February 16, 2025, from <a href="https://www.cdcfoundation.org/TEFCADataSharingandImplementationCenters-JimJirjis.pdf?inline" target="_blank" rel="noopener noreferrer" class="">https://www.cdcfoundation.org/TEFCADataSharingandImplementationCenters-JimJirjis.pdf?inline</a> <a href="https://www.medplum.com/blog/technical-guide-to-tefca#user-content-fnref-6-477cb7" data-footnote-backref="" aria-label="Back to reference 6" class="data-footnote-backref">↩</a> <a href="https://www.medplum.com/blog/technical-guide-to-tefca#user-content-fnref-6-477cb7-2" data-footnote-backref="" aria-label="Back to reference 6-2" class="data-footnote-backref">↩<sup>2</sup></a> <a href="https://www.medplum.com/blog/technical-guide-to-tefca#user-content-fnref-6-477cb7-3" data-footnote-backref="" aria-label="Back to reference 6-3" class="data-footnote-backref">↩<sup>3</sup></a> <a href="https://www.medplum.com/blog/technical-guide-to-tefca#user-content-fnref-6-477cb7-4" data-footnote-backref="" aria-label="Back to reference 6-4" class="data-footnote-backref">↩<sup>4</sup></a> <a href="https://www.medplum.com/blog/technical-guide-to-tefca#user-content-fnref-6-477cb7-5" data-footnote-backref="" aria-label="Back to reference 6-5" class="data-footnote-backref">↩<sup>5</sup></a> <a href="https://www.medplum.com/blog/technical-guide-to-tefca#user-content-fnref-6-477cb7-6" data-footnote-backref="" aria-label="Back to reference 6-6" class="data-footnote-backref">↩<sup>6</sup></a> <a href="https://www.medplum.com/blog/technical-guide-to-tefca#user-content-fnref-6-477cb7-7" data-footnote-backref="" aria-label="Back to reference 6-7" class="data-footnote-backref">↩<sup>7</sup></a> <a href="https://www.medplum.com/blog/technical-guide-to-tefca#user-content-fnref-6-477cb7-8" data-footnote-backref="" aria-label="Back to reference 6-8" class="data-footnote-backref">↩<sup>8</sup></a> <a href="https://www.medplum.com/blog/technical-guide-to-tefca#user-content-fnref-6-477cb7-9" data-footnote-backref="" aria-label="Back to reference 6-9" class="data-footnote-backref">↩<sup>9</sup></a> <a href="https://www.medplum.com/blog/technical-guide-to-tefca#user-content-fnref-6-477cb7-10" data-footnote-backref="" aria-label="Back to reference 6-10" class="data-footnote-backref">↩<sup>10</sup></a></p>
</li>
<li class="anchorTargetStickyNavbar_SAay" id="user-content-fn-7-477cb7">
<p>Understanding TEFCA: Key Changes and Impacts on Healthcare in 2025 and Beyond. Productive Edge. (n.d.). Retrieved February 16, 2025, from <a href="https://www.productiveedge.com/blog/understanding-tefca-key-changes-and-impacts-on-healthcare-in-2025-and-beyond" target="_blank" rel="noopener noreferrer" class="">https://www.productiveedge.com/blog/understanding-tefca-key-changes-and-impacts-on-healthcare-in-2025-and-beyond</a> <a href="https://www.medplum.com/blog/technical-guide-to-tefca#user-content-fnref-7-477cb7" data-footnote-backref="" aria-label="Back to reference 7" class="data-footnote-backref">↩</a> <a href="https://www.medplum.com/blog/technical-guide-to-tefca#user-content-fnref-7-477cb7-2" data-footnote-backref="" aria-label="Back to reference 7-2" class="data-footnote-backref">↩<sup>2</sup></a> <a href="https://www.medplum.com/blog/technical-guide-to-tefca#user-content-fnref-7-477cb7-3" data-footnote-backref="" aria-label="Back to reference 7-3" class="data-footnote-backref">↩<sup>3</sup></a> <a href="https://www.medplum.com/blog/technical-guide-to-tefca#user-content-fnref-7-477cb7-4" data-footnote-backref="" aria-label="Back to reference 7-4" class="data-footnote-backref">↩<sup>4</sup></a> <a href="https://www.medplum.com/blog/technical-guide-to-tefca#user-content-fnref-7-477cb7-5" data-footnote-backref="" aria-label="Back to reference 7-5" class="data-footnote-backref">↩<sup>5</sup></a> <a href="https://www.medplum.com/blog/technical-guide-to-tefca#user-content-fnref-7-477cb7-6" data-footnote-backref="" aria-label="Back to reference 7-6" class="data-footnote-backref">↩<sup>6</sup></a></p>
</li>
<li class="anchorTargetStickyNavbar_SAay" id="user-content-fn-8-477cb7">
<p>Epic TEFCA Alignment: Key Takeaways for Development Companies. Vitamin Software. (n.d.). Retrieved February 16, 2025, from <a href="https://vitaminsoftware.com/blog/epic-tefca-alignment-key-takeaways-for-development-companies" target="_blank" rel="noopener noreferrer" class="">https://vitaminsoftware.com/blog/epic-tefca-alignment-key-takeaways-for-development-companies</a> <a href="https://www.medplum.com/blog/technical-guide-to-tefca#user-content-fnref-8-477cb7" data-footnote-backref="" aria-label="Back to reference 8" class="data-footnote-backref">↩</a></p>
</li>
<li class="anchorTargetStickyNavbar_SAay" id="user-content-fn-9-477cb7">
<p>The Trusted Exchange Framework and Common Agreement (TEFCA) and Blockchain Technology. National Library of Medicine. (2024). Retrieved February 16, 2025, from <a href="https://pmc.ncbi.nlm.nih.gov/articles/PMC10785864/" target="_blank" rel="noopener noreferrer" class="">https://pmc.ncbi.nlm.nih.gov/articles/PMC10785864/</a> <a href="https://www.medplum.com/blog/technical-guide-to-tefca#user-content-fnref-9-477cb7" data-footnote-backref="" aria-label="Back to reference 9" class="data-footnote-backref">↩</a> <a href="https://www.medplum.com/blog/technical-guide-to-tefca#user-content-fnref-9-477cb7-2" data-footnote-backref="" aria-label="Back to reference 9-2" class="data-footnote-backref">↩<sup>2</sup></a> <a href="https://www.medplum.com/blog/technical-guide-to-tefca#user-content-fnref-9-477cb7-3" data-footnote-backref="" aria-label="Back to reference 9-3" class="data-footnote-backref">↩<sup>3</sup></a></p>
</li>
<li class="anchorTargetStickyNavbar_SAay" id="user-content-fn-10-477cb7">
<p>What is TEFCA? How the ONC's Trusted Exchange Framework Impacts Your Practice. RXNT. (n.d.). Retrieved February 16, 2025, from <a href="https://www.rxnt.com/what-is-tefca-how-the-oncs-trusted-exchange-framework-impacts-your-practice/" target="_blank" rel="noopener noreferrer" class="">https://www.rxnt.com/what-is-tefca-how-the-oncs-trusted-exchange-framework-impacts-your-practice/</a> <a href="https://www.medplum.com/blog/technical-guide-to-tefca#user-content-fnref-10-477cb7" data-footnote-backref="" aria-label="Back to reference 10" class="data-footnote-backref">↩</a> <a href="https://www.medplum.com/blog/technical-guide-to-tefca#user-content-fnref-10-477cb7-2" data-footnote-backref="" aria-label="Back to reference 10-2" class="data-footnote-backref">↩<sup>2</sup></a> <a href="https://www.medplum.com/blog/technical-guide-to-tefca#user-content-fnref-10-477cb7-3" data-footnote-backref="" aria-label="Back to reference 10-3" class="data-footnote-backref">↩<sup>3</sup></a></p>
</li>
<li class="anchorTargetStickyNavbar_SAay" id="user-content-fn-11-477cb7">
<p>Medplum. (n.d.). Retrieved February 16, 2025, from <a href="https://www.medplum.com/" target="_blank" rel="noopener noreferrer" class="">https://www.medplum.com/</a> <a href="https://www.medplum.com/blog/technical-guide-to-tefca#user-content-fnref-11-477cb7" data-footnote-backref="" aria-label="Back to reference 11" class="data-footnote-backref">↩</a></p>
</li>
<li class="anchorTargetStickyNavbar_SAay" id="user-content-fn-12-477cb7">
<p>Medplum Integration. (n.d.). Retrieved February 16, 2025, from <a href="https://www.medplum.com/products/integration" target="_blank" rel="noopener noreferrer" class="">https://www.medplum.com/products/integration</a> <a href="https://www.medplum.com/blog/technical-guide-to-tefca#user-content-fnref-12-477cb7" data-footnote-backref="" aria-label="Back to reference 12" class="data-footnote-backref">↩</a></p>
</li>
<li class="anchorTargetStickyNavbar_SAay" id="user-content-fn-13-477cb7">
<p>Medplum FHIR Datastore. (n.d.). Retrieved February 16, 2025, from <a href="https://www.google.com/search?q=https://www.medplum.com/products/fhir-datastore" target="_blank" rel="noopener noreferrer" class="">https://www.medplum.com/products/fhir-datastore</a> <a href="https://www.medplum.com/blog/technical-guide-to-tefca#user-content-fnref-13-477cb7" data-footnote-backref="" aria-label="Back to reference 13" class="data-footnote-backref">↩</a></p>
</li>
<li class="anchorTargetStickyNavbar_SAay" id="user-content-fn-14-477cb7">
<p>Medplum Security. (n.d.). Retrieved February 16, 2025, from <a href="https://www.medplum.com/security" target="_blank" rel="noopener noreferrer" class="">https://www.medplum.com/security</a> <a href="https://www.medplum.com/blog/technical-guide-to-tefca#user-content-fnref-14-477cb7" data-footnote-backref="" aria-label="Back to reference 14" class="data-footnote-backref">↩</a></p>
</li>
<li class="anchorTargetStickyNavbar_SAay" id="user-content-fn-15-477cb7">
<p>Medplum 2025 Roadmap. Medplum. (2025, January 8). Retrieved February 16, 2025, from <a href="https://www.google.com/search?q=https://www.medplum.com/blog/medplum-2025-roadmap" target="_blank" rel="noopener noreferrer" class="">https://www.medplum.com/blog/medplum-2025-roadmap</a> <a href="https://www.medplum.com/blog/technical-guide-to-tefca#user-content-fnref-15-477cb7" data-footnote-backref="" aria-label="Back to reference 15" class="data-footnote-backref">↩</a></p>
</li>
<li class="anchorTargetStickyNavbar_SAay" id="user-content-fn-16-477cb7">
<p>Building EHR: Introducing Medplum. Vinta Software. (n.d.). Retrieved February 16, 2025, from <a href="https://www.vintasoftware.com/blog/building-ehr-introducing-medplum" target="_blank" rel="noopener noreferrer" class="">https://www.vintasoftware.com/blog/building-ehr-introducing-medplum</a> <a href="https://www.medplum.com/blog/technical-guide-to-tefca#user-content-fnref-16-477cb7" data-footnote-backref="" aria-label="Back to reference 16" class="data-footnote-backref">↩</a> <a href="https://www.medplum.com/blog/technical-guide-to-tefca#user-content-fnref-16-477cb7-2" data-footnote-backref="" aria-label="Back to reference 16-2" class="data-footnote-backref">↩<sup>2</sup></a> <a href="https://www.medplum.com/blog/technical-guide-to-tefca#user-content-fnref-16-477cb7-3" data-footnote-backref="" aria-label="Back to reference 16-3" class="data-footnote-backref">↩<sup>3</sup></a></p>
</li>
<li class="anchorTargetStickyNavbar_SAay" id="user-content-fn-17-477cb7">
<p>TEFCA Frequently Asked Questions. Association of State and Territorial Health Officials (ASTHO). (n.d.). Retrieved February 16, 2025, from <a href="https://www.astho.org/globalassets/pdf/tefca-frequently-asked-questions.pdf" target="_blank" rel="noopener noreferrer" class="">https://www.astho.org/globalassets/pdf/tefca-frequently-asked-questions.pdf</a> <a href="https://www.medplum.com/blog/technical-guide-to-tefca#user-content-fnref-17-477cb7" data-footnote-backref="" aria-label="Back to reference 17" class="data-footnote-backref">↩</a> <a href="https://www.medplum.com/blog/technical-guide-to-tefca#user-content-fnref-17-477cb7-2" data-footnote-backref="" aria-label="Back to reference 17-2" class="data-footnote-backref">↩<sup>2</sup></a> <a href="https://www.medplum.com/blog/technical-guide-to-tefca#user-content-fnref-17-477cb7-3" data-footnote-backref="" aria-label="Back to reference 17-3" class="data-footnote-backref">↩<sup>3</sup></a> <a href="https://www.medplum.com/blog/technical-guide-to-tefca#user-content-fnref-17-477cb7-4" data-footnote-backref="" aria-label="Back to reference 17-4" class="data-footnote-backref">↩<sup>4</sup></a> <a href="https://www.medplum.com/blog/technical-guide-to-tefca#user-content-fnref-17-477cb7-5" data-footnote-backref="" aria-label="Back to reference 17-5" class="data-footnote-backref">↩<sup>5</sup></a> <a href="https://www.medplum.com/blog/technical-guide-to-tefca#user-content-fnref-17-477cb7-6" data-footnote-backref="" aria-label="Back to reference 17-6" class="data-footnote-backref">↩<sup>6</sup></a></p>
</li>
<li class="anchorTargetStickyNavbar_SAay" id="user-content-fn-18-477cb7">
<p>Epic Welcomes Oracle Health to TEFCA. PR Newswire. (2024, October 28). Retrieved February 16, 2025, from <a href="https://www.prnewswire.com/news-releases/epic-welcomes-oracle-health-to-tefca-302289098.html" target="_blank" rel="noopener noreferrer" class="">https://www.prnewswire.com/news-releases/epic-welcomes-oracle-health-to-tefca-302289098.html</a> <a href="https://www.medplum.com/blog/technical-guide-to-tefca#user-content-fnref-18-477cb7" data-footnote-backref="" aria-label="Back to reference 18" class="data-footnote-backref">↩</a> <a href="https://www.medplum.com/blog/technical-guide-to-tefca#user-content-fnref-18-477cb7-2" data-footnote-backref="" aria-label="Back to reference 18-2" class="data-footnote-backref">↩<sup>2</sup></a></p>
</li>
<li class="anchorTargetStickyNavbar_SAay" id="user-content-fn-19-477cb7">
<p>Carequality to align interoperability strategy with TEFCA. Healthcare IT News. (n.d.). Retrieved February 16, 2025, from <a href="https://www.healthcareitnews.com/news/carequality-align-interoperability-strategy-tefca" target="_blank" rel="noopener noreferrer" class="">https://www.healthcareitnews.com/news/carequality-align-interoperability-strategy-tefca</a> <a href="https://www.medplum.com/blog/technical-guide-to-tefca#user-content-fnref-19-477cb7" data-footnote-backref="" aria-label="Back to reference 19" class="data-footnote-backref">↩</a> <a href="https://www.medplum.com/blog/technical-guide-to-tefca#user-content-fnref-19-477cb7-2" data-footnote-backref="" aria-label="Back to reference 19-2" class="data-footnote-backref">↩<sup>2</sup></a></p>
</li>
<li class="anchorTargetStickyNavbar_SAay" id="user-content-fn-20-477cb7">
<p>CommonWell Health Alliance is now a Designated Qualified Health Information Network™ (QHIN™). CommonWell Health Alliance. (n.d.). Retrieved February 16, 2025, from <a href="https://www.commonwellalliance.org/tefca/" target="_blank" rel="noopener noreferrer" class="">https://www.commonwellalliance.org/tefca/</a> <a href="https://www.medplum.com/blog/technical-guide-to-tefca#user-content-fnref-20-477cb7" data-footnote-backref="" aria-label="Back to reference 20" class="data-footnote-backref">↩</a></p>
</li>
<li class="anchorTargetStickyNavbar_SAay" id="user-content-fn-21-477cb7">
<p>TEFCA: A Framework for Public Health Interoperability - Version 2.1 Published. NACCHO. (n.d.). Retrieved February 16, 2025, from <a href="https://www.naccho.org/blog/articles/tefca-ver-2.1-published" target="_blank" rel="noopener noreferrer" class="">https://www.naccho.org/blog/articles/tefca-ver-2.1-published</a> ↩ ↩2 <a href="https://www.medplum.com/blog/technical-guide-to-tefca#user-content-fnref-21-477cb7" data-footnote-backref="" aria-label="Back to reference 21" class="data-footnote-backref">↩</a> <a href="https://www.medplum.com/blog/technical-guide-to-tefca#user-content-fnref-21-477cb7-2" data-footnote-backref="" aria-label="Back to reference 21-2" class="data-footnote-backref">↩<sup>2</sup></a></p>
</li>
<li class="anchorTargetStickyNavbar_SAay" id="user-content-fn-22-477cb7">
<p>Updated TEFCA SOPs for Health Care Operations. NCQA. (n.d.). Retrieved February 16, 2025, from <a href="https://www.ncqa.org/blog/updated-tefca-sops-for-health-care-operations/" target="_blank" rel="noopener noreferrer" class="">https://www.ncqa.org/blog/updated-tefca-sops-for-health-care-operations/</a> ↩ <a href="https://www.medplum.com/blog/technical-guide-to-tefca#user-content-fnref-22-477cb7" data-footnote-backref="" aria-label="Back to reference 22" class="data-footnote-backref">↩</a></p>
</li>
<li class="anchorTargetStickyNavbar_SAay" id="user-content-fn-23-477cb7">
<p>The Impact of TEFCA &amp; HITRUST on Patient Privacy and Security. A-LIGN. (n.d.). Retrieved February 16, 2025, from <a href="https://www.a-lign.com/articles/the-impact-of-tefca-hitrust-on-patient-privacy-and-security" target="_blank" rel="noopener noreferrer" class="">https://www.a-lign.com/articles/the-impact-of-tefca-hitrust-on-patient-privacy-and-security</a> ↩ ↩2 ↩3 ↩4 ↩5 <a href="https://www.medplum.com/blog/technical-guide-to-tefca#user-content-fnref-23-477cb7" data-footnote-backref="" aria-label="Back to reference 23" class="data-footnote-backref">↩</a> <a href="https://www.medplum.com/blog/technical-guide-to-tefca#user-content-fnref-23-477cb7-2" data-footnote-backref="" aria-label="Back to reference 23-2" class="data-footnote-backref">↩<sup>2</sup></a> <a href="https://www.medplum.com/blog/technical-guide-to-tefca#user-content-fnref-23-477cb7-3" data-footnote-backref="" aria-label="Back to reference 23-3" class="data-footnote-backref">↩<sup>3</sup></a> <a href="https://www.medplum.com/blog/technical-guide-to-tefca#user-content-fnref-23-477cb7-4" data-footnote-backref="" aria-label="Back to reference 23-4" class="data-footnote-backref">↩<sup>4</sup></a> <a href="https://www.medplum.com/blog/technical-guide-to-tefca#user-content-fnref-23-477cb7-5" data-footnote-backref="" aria-label="Back to reference 23-5" class="data-footnote-backref">↩<sup>5</sup></a></p>
</li>
<li class="anchorTargetStickyNavbar_SAay" id="user-content-fn-24-477cb7">
<p>TEFCA Glossary. The Sequoia Project. (2024, July). Retrieved February 16, 2025, from <a href="https://rce.sequoiaproject.org/wp-content/uploads/2024/07/TEFCA-Glossary_508-1.pdf" target="_blank" rel="noopener noreferrer" class="">https://rce.sequoiaproject.org/wp-content/uploads/2024/07/TEFCA-Glossary_508-1.pdf</a> ↩ ↩2 ↩3 ↩4 ↩5 ↩6 ↩7 ↩8 ↩9 ↩10 ↩11 ↩12 ↩13 <a href="https://www.medplum.com/blog/technical-guide-to-tefca#user-content-fnref-24-477cb7" data-footnote-backref="" aria-label="Back to reference 24" class="data-footnote-backref">↩</a> <a href="https://www.medplum.com/blog/technical-guide-to-tefca#user-content-fnref-24-477cb7-2" data-footnote-backref="" aria-label="Back to reference 24-2" class="data-footnote-backref">↩<sup>2</sup></a> <a href="https://www.medplum.com/blog/technical-guide-to-tefca#user-content-fnref-24-477cb7-3" data-footnote-backref="" aria-label="Back to reference 24-3" class="data-footnote-backref">↩<sup>3</sup></a> <a href="https://www.medplum.com/blog/technical-guide-to-tefca#user-content-fnref-24-477cb7-4" data-footnote-backref="" aria-label="Back to reference 24-4" class="data-footnote-backref">↩<sup>4</sup></a> <a href="https://www.medplum.com/blog/technical-guide-to-tefca#user-content-fnref-24-477cb7-5" data-footnote-backref="" aria-label="Back to reference 24-5" class="data-footnote-backref">↩<sup>5</sup></a> <a href="https://www.medplum.com/blog/technical-guide-to-tefca#user-content-fnref-24-477cb7-6" data-footnote-backref="" aria-label="Back to reference 24-6" class="data-footnote-backref">↩<sup>6</sup></a> <a href="https://www.medplum.com/blog/technical-guide-to-tefca#user-content-fnref-24-477cb7-7" data-footnote-backref="" aria-label="Back to reference 24-7" class="data-footnote-backref">↩<sup>7</sup></a> <a href="https://www.medplum.com/blog/technical-guide-to-tefca#user-content-fnref-24-477cb7-8" data-footnote-backref="" aria-label="Back to reference 24-8" class="data-footnote-backref">↩<sup>8</sup></a> <a href="https://www.medplum.com/blog/technical-guide-to-tefca#user-content-fnref-24-477cb7-9" data-footnote-backref="" aria-label="Back to reference 24-9" class="data-footnote-backref">↩<sup>9</sup></a> <a href="https://www.medplum.com/blog/technical-guide-to-tefca#user-content-fnref-24-477cb7-10" data-footnote-backref="" aria-label="Back to reference 24-10" class="data-footnote-backref">↩<sup>10</sup></a> <a href="https://www.medplum.com/blog/technical-guide-to-tefca#user-content-fnref-24-477cb7-11" data-footnote-backref="" aria-label="Back to reference 24-11" class="data-footnote-backref">↩<sup>11</sup></a> <a href="https://www.medplum.com/blog/technical-guide-to-tefca#user-content-fnref-24-477cb7-12" data-footnote-backref="" aria-label="Back to reference 24-12" class="data-footnote-backref">↩<sup>12</sup></a> <a href="https://www.medplum.com/blog/technical-guide-to-tefca#user-content-fnref-24-477cb7-13" data-footnote-backref="" aria-label="Back to reference 24-13" class="data-footnote-backref">↩<sup>13</sup></a></p>
</li>
<li class="anchorTargetStickyNavbar_SAay" id="user-content-fn-25-477cb7">
<p>QHIN Technical Framework (QTF) Version 2.0. The Sequoia Project. (2024, July). Retrieved February 16, 2025, from <a href="https://rce.sequoiaproject.org/wp-content/uploads/2024/07/QTF-v2.0_508.pdf" target="_blank" rel="noopener noreferrer" class="">https://rce.sequoiaproject.org/wp-content/uploads/2024/07/QTF-v2.0_508.pdf</a> ↩ ↩2 ↩3 ↩4 ↩5 ↩6 ↩7 ↩8 ↩9 ↩10 <a href="https://www.medplum.com/blog/technical-guide-to-tefca#user-content-fnref-25-477cb7" data-footnote-backref="" aria-label="Back to reference 25" class="data-footnote-backref">↩</a> <a href="https://www.medplum.com/blog/technical-guide-to-tefca#user-content-fnref-25-477cb7-2" data-footnote-backref="" aria-label="Back to reference 25-2" class="data-footnote-backref">↩<sup>2</sup></a> <a href="https://www.medplum.com/blog/technical-guide-to-tefca#user-content-fnref-25-477cb7-3" data-footnote-backref="" aria-label="Back to reference 25-3" class="data-footnote-backref">↩<sup>3</sup></a> <a href="https://www.medplum.com/blog/technical-guide-to-tefca#user-content-fnref-25-477cb7-4" data-footnote-backref="" aria-label="Back to reference 25-4" class="data-footnote-backref">↩<sup>4</sup></a> <a href="https://www.medplum.com/blog/technical-guide-to-tefca#user-content-fnref-25-477cb7-5" data-footnote-backref="" aria-label="Back to reference 25-5" class="data-footnote-backref">↩<sup>5</sup></a> <a href="https://www.medplum.com/blog/technical-guide-to-tefca#user-content-fnref-25-477cb7-6" data-footnote-backref="" aria-label="Back to reference 25-6" class="data-footnote-backref">↩<sup>6</sup></a> <a href="https://www.medplum.com/blog/technical-guide-to-tefca#user-content-fnref-25-477cb7-7" data-footnote-backref="" aria-label="Back to reference 25-7" class="data-footnote-backref">↩<sup>7</sup></a> <a href="https://www.medplum.com/blog/technical-guide-to-tefca#user-content-fnref-25-477cb7-8" data-footnote-backref="" aria-label="Back to reference 25-8" class="data-footnote-backref">↩<sup>8</sup></a> <a href="https://www.medplum.com/blog/technical-guide-to-tefca#user-content-fnref-25-477cb7-9" data-footnote-backref="" aria-label="Back to reference 25-9" class="data-footnote-backref">↩<sup>9</sup></a> <a href="https://www.medplum.com/blog/technical-guide-to-tefca#user-content-fnref-25-477cb7-10" data-footnote-backref="" aria-label="Back to reference 25-10" class="data-footnote-backref">↩<sup>10</sup></a></p>
</li>
</ol>
</section>]]></content:encoded>
            <category>self-host</category>
            <category>integration</category>
            <category>interop</category>
            <category>community</category>
        </item>
        <item>
            <title><![CDATA[Medplum for Mirth Users]]></title>
            <link>https://www.medplum.com/blog/medplum-for-mirth-users</link>
            <guid>https://www.medplum.com/blog/medplum-for-mirth-users</guid>
            <pubDate>Sun, 23 Mar 2025 00:00:00 GMT</pubDate>
            <description><![CDATA[Modern Healthcare Integration in the Wake of NextGen's Announcement]]></description>
            <content:encoded><![CDATA[<blockquote>
<p><em>Modern Healthcare Integration in the Wake of NextGen's Announcement</em></p>
</blockquote>
<p>This week, NextGen Healthcare <a href="https://forums.mirthproject.io/forum/mirth-connect/general-discussion/186098-new-era-for-mirth%C2%AE-connect-by-nextgen-healthcare-begins-with-version-4-6" target="_blank" rel="noopener noreferrer" class="">announced</a> that <a href="https://www.nextgen.com/insight/interop/demo/mirth-family-insights" target="_blank" rel="noopener noreferrer" class="">Mirth Connect</a>, the healthcare integration engine that has been a cornerstone of interoperability for countless organizations, will no longer be available. As long-time healthcare integration engineers ourselves, we recognize this news creates significant uncertainty for the many organizations that rely on Mirth Connect for critical healthcare workflows.</p>
<h2 class="anchor anchorTargetStickyNavbar_SAay" id="honoring-mirths-legacy">Honoring Mirth's Legacy<a href="https://www.medplum.com/blog/medplum-for-mirth-users#honoring-mirths-legacy" class="hash-link" aria-label="Direct link to Honoring Mirth's Legacy" title="Direct link to Honoring Mirth's Legacy" translate="no">​</a></h2>
<p>First, we want to acknowledge Mirth Connect's tremendous contribution to healthcare interoperability. For more than a decade, Mirth has enabled healthcare data exchange for organizations of all sizes, from small clinics to large hospital systems. It helped usher in an era of digital healthcare, and many of us at Medplum have deep experience with Mirth throughout our careers.</p>
<h2 class="anchor anchorTargetStickyNavbar_SAay" id="moving-forward-why-consider-medplum">Moving Forward: Why Consider Medplum<a href="https://www.medplum.com/blog/medplum-for-mirth-users#moving-forward-why-consider-medplum" class="hash-link" aria-label="Direct link to Moving Forward: Why Consider Medplum" title="Direct link to Moving Forward: Why Consider Medplum" translate="no">​</a></h2>
<p>As healthcare organizations evaluate their options, we believe Medplum offers a modern, future-proof alternative for many Mirth use cases. While we're developing a comprehensive comparison guide (coming soon), we wanted to highlight some key differences that make Medplum worth considering:</p>
<h3 class="anchor anchorTargetStickyNavbar_SAay" id="cloud-native-architecture-with-local-protocol-support">Cloud-Native Architecture with Local Protocol Support<a href="https://www.medplum.com/blog/medplum-for-mirth-users#cloud-native-architecture-with-local-protocol-support" class="hash-link" aria-label="Direct link to Cloud-Native Architecture with Local Protocol Support" title="Direct link to Cloud-Native Architecture with Local Protocol Support" translate="no">​</a></h3>
<p>Mirth's on-premise model required maintaining local servers with all business logic and integration channels running on-site. Medplum takes a different approach:</p>
<ul>
<li class=""><a class="" href="https://www.medplum.com/docs/agent">Medplum Agent</a>: Our lightweight local component converts legacy protocols (HL7, DICOM, ASTM - coming soon!) into secure websockets, eliminating the need for VPNs while maintaining compatibility with local systems.</li>
<li class="">Cloud Processing: Complex transformation logic runs in the cloud using modern JavaScript/TypeScript through <a class="" href="https://www.medplum.com/docs/bots/bot-basics">Medplum Bots</a>, improving maintainability and scalability.</li>
</ul>
<div class="responsive-iframe-wrapper"><iframe src="https://www.youtube.com/embed/MmE3Dn939B4?start=0" title="YouTube video player" frameborder="0" allow="accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture"></iframe></div>
<h3 class="anchor anchorTargetStickyNavbar_SAay" id="modern-technology-stack">Modern Technology Stack<a href="https://www.medplum.com/blog/medplum-for-mirth-users#modern-technology-stack" class="hash-link" aria-label="Direct link to Modern Technology Stack" title="Direct link to Modern Technology Stack" translate="no">​</a></h3>
<p>One of Mirth's challenges has been its reliance on aging Java versions and custom Rhino JavaScript implementations. Medplum is built on a continuously maintained modern tech stack:</p>
<ul>
<li class="">TypeScript/JavaScript: Industry-standard languages that are widely understood and have robust tooling</li>
<li class="">Regular Security Updates: Weekly dependency upgrades and proactive security maintenance</li>
<li class="">Compliance Ready: SOC2 Type 2 certified with ONC certifications and HITRUST certification in progress</li>
</ul>
<h3 class="anchor anchorTargetStickyNavbar_SAay" id="open-source">Open Source<a href="https://www.medplum.com/blog/medplum-for-mirth-users#open-source" class="hash-link" aria-label="Direct link to Open Source" title="Direct link to Open Source" translate="no">​</a></h3>
<p>Like Mirth in its early days, Medplum is committed to open source. Our <a href="https://github.com/medplum/medplum" target="_blank" rel="noopener noreferrer" class="">core platform</a> is Apache 2 licensed, giving you the freedom to use, modify, and deploy as needed without vendor lock-in.</p>
<h3 class="anchor anchorTargetStickyNavbar_SAay" id="designed-for-todays-healthcare-integration-challenges">Designed for Today's Healthcare Integration Challenges<a href="https://www.medplum.com/blog/medplum-for-mirth-users#designed-for-todays-healthcare-integration-challenges" class="hash-link" aria-label="Direct link to Designed for Today's Healthcare Integration Challenges" title="Direct link to Designed for Today's Healthcare Integration Challenges" translate="no">​</a></h3>
<p>Medplum was built by experienced healthcare engineers who have suffered through the limitations of previous-generation integration engines:</p>
<ul>
<li class="">FHIR-Native: Though we support HL7v2 and other formats, we embrace modern FHIR standards</li>
<li class="">Developer Experience: Purpose-built for the way modern healthcare applications are developed</li>
<li class="">Scalability: Designed from the ground up for horizontal scaling across cloud environments</li>
</ul>
<h2 class="anchor anchorTargetStickyNavbar_SAay" id="next-steps-for-mirth-users">Next Steps for Mirth Users<a href="https://www.medplum.com/blog/medplum-for-mirth-users#next-steps-for-mirth-users" class="hash-link" aria-label="Direct link to Next Steps for Mirth Users" title="Direct link to Next Steps for Mirth Users" translate="no">​</a></h2>
<p>We understand that migrating from a system as essential as Mirth requires careful planning. In the coming weeks, we'll publish a comprehensive guide for Mirth users considering Medplum, including:</p>
<ul>
<li class="">Detailed feature comparisons</li>
<li class="">Migration strategies and patterns</li>
<li class="">Technical implementation guidance</li>
<li class="">Case studies from organizations who have made similar transitions</li>
</ul>
<p>In the meantime, we invite you to:</p>
<ul>
<li class="">Join our <a href="https://discord.gg/medplum" target="_blank" rel="noopener noreferrer" class="">Discord community</a> where you can connect with our team and other healthcare developers</li>
<li class="">Explore <a class="" href="https://www.medplum.com/docs">our documentation</a> to understand Medplum's capabilities</li>
<li class="">Try our <a href="https://app.medplum.com/register" target="_blank" rel="noopener noreferrer" class="">sandbox environment</a> to experiment with the platform</li>
</ul>
<h2 class="anchor anchorTargetStickyNavbar_SAay" id="were-here-to-help">We're Here to Help<a href="https://www.medplum.com/blog/medplum-for-mirth-users#were-here-to-help" class="hash-link" aria-label="Direct link to We're Here to Help" title="Direct link to We're Here to Help" translate="no">​</a></h2>
<p>As <a class="" href="https://www.medplum.com/about">fellow healthcare interoperability enthusiasts</a>, we understand the challenges you're facing. Whether you ultimately choose Medplum or another path forward, we're committed to supporting the healthcare integration community through this transition.</p>
<p>Look for our comprehensive Mirth to Medplum comparison guide in the coming days, and please reach out if we can assist with your evaluation process.</p>
<hr>
<p><em>Medplum is an open-source healthcare development platform that provides infrastructure and tools for rapidly building compliant healthcare applications. Learn more at medplum.com.</em></p>]]></content:encoded>
            <category>self-host</category>
            <category>integration</category>
            <category>interop</category>
            <category>community</category>
        </item>
        <item>
            <title><![CDATA[Medplum v4.0.0 Upgrade Notice]]></title>
            <link>https://www.medplum.com/blog/v4-upgrade</link>
            <guid>https://www.medplum.com/blog/v4-upgrade</guid>
            <pubDate>Fri, 28 Feb 2025 00:00:00 GMT</pubDate>
            <description><![CDATA[We've heard many success stories from enthusiastic early adopters who have smoothly upgraded to v4. Thank you all for your support and your feedback in this process!]]></description>
            <content:encoded><![CDATA[<p>We've heard many success stories from enthusiastic early adopters who have smoothly upgraded to v4. Thank you all for your support and your feedback in this process!</p>
<p>However, we've identified an issue affecting some Medplum deployments that are configured to automatically pull the <code>:latest</code> Docker tag. With our recent release of Medplum 4.0.0, these deployments may be caught in a failing deployment loop. This post explains why this is happening and how to resolve it.</p>
<h2 class="anchor anchorTargetStickyNavbar_SAay" id="the-issue">The Issue<a href="https://www.medplum.com/blog/v4-upgrade#the-issue" class="hash-link" aria-label="Direct link to The Issue" title="Direct link to The Issue" translate="no">​</a></h2>
<p>Medplum 4.0.0 introduces significant improvements that require a data migration step. This migration <strong>must</strong> be completed while running version 3.3.0 before upgrading to 4.0.0 <strong>if</strong> your deployment contains data from before version 2.2.0 (released in November 2023).</p>
<p>If your deployment is:</p>
<ul>
<li class="">Using the <code>:latest</code> Docker tag</li>
<li class="">Configured to automatically upgrade</li>
<li class="">Attempting to jump directly from a pre-3.3.0 version to 4.0.0</li>
</ul>
<p>Then your deployment is likely failing and retrying in a loop.</p>
<h2 class="anchor anchorTargetStickyNavbar_SAay" id="how-to-fix-it">How to Fix It<a href="https://www.medplum.com/blog/v4-upgrade#how-to-fix-it" class="hash-link" aria-label="Direct link to How to Fix It" title="Direct link to How to Fix It" translate="no">​</a></h2>
<p>If you're experiencing this issue, follow these steps to resolve it:</p>
<h3 class="anchor anchorTargetStickyNavbar_SAay" id="important-caveat">Important Caveat<a href="https://www.medplum.com/blog/v4-upgrade#important-caveat" class="hash-link" aria-label="Direct link to Important Caveat" title="Direct link to Important Caveat" translate="no">​</a></h3>
<p><strong>The data migration is only necessary for deployments that contain data from before version 2.2.0</strong> (released in November 2023). If your deployment started on version 2.2.0 or later, you can skip the migration step using one of the methods described below.</p>
<ol>
<li class="">
<p><strong>Stop the auto-update process temporarily</strong>:</p>
<ul>
<li class="">Modify your deployment configuration to use a specific version tag (<code>3.3.0</code>) instead of <code>:latest</code></li>
<li class="">This will break the failing deployment cycle</li>
</ul>
</li>
<li class="">
<p><strong>Perform the required upgrade path</strong>:</p>
<div class="language-text codeBlockContainer_ZGJx theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_kX1v"><pre tabindex="0" class="prism-code language-text codeBlock_TAPP thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_AdAo"><span class="token-line" style="color:#393A34"><span class="token plain">Pre-3.3.0 → 3.3.0 → Run Data Migration → 4.0.0</span><br></span></code></pre></div></div>
</li>
<li class="">
<p><strong>Deploy version 3.3.0 explicitly</strong>:</p>
<ul>
<li class="">Update your infrastructure-as-code (AWS CDK, Terraform, Helm charts, etc.) to use the specific <code>3.3.0</code> tag</li>
<li class="">Apply your updated infrastructure configuration to deploy version 3.3.0</li>
</ul>
</li>
<li class="">
<p><strong>Run the data migration</strong>:</p>
<ul>
<li class="">Log in to your Medplum admin interface</li>
<li class="">Navigate to the Admin panel</li>
<li class="">Click on the "Data Migration" button</li>
<li class="">Wait for the migration to complete successfully</li>
</ul>
</li>
<li class="">
<p><strong>Update to 4.0.0</strong>:</p>
<ul>
<li class="">Once migration is complete, you can safely update to 4.0.0</li>
<li class="">You may resume using <code>:latest</code> if desired, or pin to <code>4.0.0</code> for stability</li>
</ul>
</li>
</ol>
<h3 class="anchor anchorTargetStickyNavbar_SAay" id="skipping-the-migration-for-deployments-started-on-220-or-later">Skipping the Migration (For Deployments Started on 2.2.0 or Later)<a href="https://www.medplum.com/blog/v4-upgrade#skipping-the-migration-for-deployments-started-on-220-or-later" class="hash-link" aria-label="Direct link to Skipping the Migration (For Deployments Started on 2.2.0 or Later)" title="Direct link to Skipping the Migration (For Deployments Started on 2.2.0 or Later)" translate="no">​</a></h3>
<p>If your deployment started on version 2.2.0 or later (November 2023), you can skip the migration step using one of these methods:</p>
<p><strong>Option 1: Direct Database Update</strong></p>
<div class="language-sql codeBlockContainer_ZGJx theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_kX1v"><pre tabindex="0" class="prism-code language-sql codeBlock_TAPP thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_AdAo"><span class="token-line" style="color:#393A34"><span class="token comment" style="color:#999988;font-style:italic">-- Run this SQL query on your Postgres database</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token keyword" style="color:#00009f">UPDATE</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">"DatabaseMigration"</span><span class="token plain"> </span><span class="token keyword" style="color:#00009f">SET</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">"dataVersion"</span><span class="token operator" style="color:#393A34">=</span><span class="token number" style="color:#36acaa">1</span><span class="token punctuation" style="color:#393A34">;</span><br></span></code></pre></div></div>
<p><strong>Option 2: API Command</strong></p>
<p>In version 3.3.0, we also added an API endpoint to set the data version. You can use this endpoint to set the data version to 1.</p>
<div class="language-bash codeBlockContainer_ZGJx theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_kX1v"><pre tabindex="0" class="prism-code language-bash codeBlock_TAPP thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_AdAo"><span class="token-line" style="color:#393A34"><span class="token plain"># Get an auth token</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">export AUTH_TOKEN=$(npx medplum token)</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"># Use curl to set the data version</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">curl -X POST \</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">  -H "Authorization: Bearer $AUTH_TOKEN" \</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">  -H "Content-Type: application/json" \</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">  https://api.medplum.com/admin/super/setdataversion \</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">  -d '{ "dataVersion": 1 }'</span><br></span></code></pre></div></div>
<p>After using either option, you can proceed directly to upgrading to version 4.0.0.</p>
<h2 class="anchor anchorTargetStickyNavbar_SAay" id="best-practices-for-production-deployments">Best Practices for Production Deployments<a href="https://www.medplum.com/blog/v4-upgrade#best-practices-for-production-deployments" class="hash-link" aria-label="Direct link to Best Practices for Production Deployments" title="Direct link to Best Practices for Production Deployments" translate="no">​</a></h2>
<p>This situation highlights some important deployment best practices:</p>
<ol>
<li class=""><strong>Avoid <code>:latest</code> in production</strong>: Always pin to specific version tags in production environments</li>
<li class=""><strong>Read release notes</strong>: Always check release notes before upgrading, especially for major version changes</li>
<li class=""><strong>Test upgrades in staging</strong>: Validate upgrade procedures in a non-production environment first</li>
<li class=""><strong>Implement controlled rollouts</strong>: Consider using a controlled rollout strategy for updates</li>
</ol>
<h2 class="anchor anchorTargetStickyNavbar_SAay" id="looking-forward">Looking Forward<a href="https://www.medplum.com/blog/v4-upgrade#looking-forward" class="hash-link" aria-label="Direct link to Looking Forward" title="Direct link to Looking Forward" translate="no">​</a></h2>
<p>We understand this may have caused disruption for some users, and we're taking steps to improve our release process:</p>
<ul>
<li class="">We're exploring ways to make the upgrade path more robust</li>
<li class="">We're enhancing our tooling to detect and prevent problematic upgrade paths</li>
<li class="">We're improving our documentation around version dependencies</li>
</ul>
<h2 class="anchor anchorTargetStickyNavbar_SAay" id="need-additional-help">Need Additional Help?<a href="https://www.medplum.com/blog/v4-upgrade#need-additional-help" class="hash-link" aria-label="Direct link to Need Additional Help?" title="Direct link to Need Additional Help?" translate="no">​</a></h2>
<p>If you continue to experience issues with your upgrade:</p>
<ul>
<li class="">Join our <a href="https://discord.gg/medplum" target="_blank" rel="noopener noreferrer" class="">Discord community</a> for real-time support</li>
<li class="">Check our comprehensive <a class="" href="https://www.medplum.com/docs/self-hosting/upgrading-server">upgrade documentation</a></li>
<li class="">Open an issue on our <a href="https://github.com/medplum/medplum" target="_blank" rel="noopener noreferrer" class="">GitHub repository</a></li>
<li class="">Contact us directly at <a href="mailto:support@medplum.com" target="_blank" rel="noopener noreferrer" class="">support@medplum.com</a></li>
</ul>
<p>We're committed to helping every Medplum user successfully upgrade to version 4.0.0 and benefit from the latest improvements to our platform.</p>]]></content:encoded>
            <category>self-host</category>
            <category>fhir-datastore</category>
            <category>integration</category>
            <category>compliance</category>
            <category>auth</category>
            <category>community</category>
        </item>
    </channel>
</rss>