PageSourceSearch

https://www.medplum.com/assets/js/cc687bbc.090666da.js

js medplum.com collected 2026-10-02 07:38:07 UTC 15,518 bytes, 1 lines download raw bytes

1"use strict";(self.webpackChunk_medplum_docs=self.webpackChunk_medplum_docs||[]).push([["13818"],{2635(e,t,i){i.r(t),i.d(t,{metadata:()=>n,default:()=>c,frontMatter:()=>a,contentTitle:()=>r,toc:()=>d,assets:()=>h});var n=JSON.parse('{"id":"intake/smart-health-links","title":"SMART Health Links","description":"This guide describes a practical workflow for testing SMART Health Links (SHLs) between independent healthcare applications.","source":"@site/docs/intake/smart-health-links.md","sourceDirName":"intake","slug":"/intake/smart-health-links","permalink":"/docs/intake/smart-health-links","draft":false,"unlisted":false,"editUrl":"https://github.com/medplum/medplum/blob/main/packages/docs/docs/intake/smart-health-links.md","tags":[{"inline":true,"label":"intake","permalink":"/docs/tags/intake"},{"inline":true,"label":"automation","permalink":"/docs/tags/automation"}],"version":"current","lastUpdatedAt":1782779466000,"sidebarPosition":100,"frontMatter":{"sidebar_position":100,"title":"SMART Health Links","tags":["intake","automation"],"keywords":["cms","ktc","smart","health","links","shl","fhir","interoperability"]},"sidebar":"docsSidebar","previous":{"title":"Post Intake Automation","permalink":"/docs/intake/post-intake-automation"},"next":{"title":"Charting","permalink":"/docs/charting/"}}'),s=i(31085),l=i(71184);let a={sidebar_position:100,title:"SMART Health Links",tags:["intake","automation"],keywords:["cms","ktc","smart","health","links","shl","fhir","interoperability"]},r="SMART Health Links",h={},d=[{value:"What is CMS "Kill the Clipboard"?",id:"what-is-cms-kill-the-clipboard",level:2},{value:"What is a SMART Health Link?",id:"what-is-a-smart-health-link",level:2},{value:"End-to-End Testing Workflow",id:"end-to-end-testing-workflow",level:2},{value:"Step 1: Generate a SMART Health Link",id:"step-1-generate-a-smart-health-link",level:2},{value:"Step 2: Import the SMART Health Link",id:"step-2-import-the-smart-health-link",level:2},{value:"Step 3: Register for Medplum",id:"step-3-register-for-medplum",level:2},{value:"Step 4: Import the SMART Health Link",id:"step-4-import-the-smart-health-link",level:2},{value:"Step 5: Resolve Patient Identity",id:"step-5-resolve-patient-identity",level:2},{value:"Step 6: Review Resources",id:"step-6-review-resources",level:2},{value:"Step 7: Import Resources",id:"step-7-import-resources",level:2},{value:"Step 8: Verify the Results",id:"step-8-verify-the-results",level:2},{value:"About Medplum",id:"about-medplum",level:2}];function o(e){let t={a:"a",code:"code",h1:"h1",h2:"h2",header:"header",img:"img",li:"li",ol:"ol",p:"p",strong:"strong",table:"table",tbody:"tbody",td:"td",th:"th",thead:"thead",tr:"tr",ul:"ul",...(0,l.R)(),...e.components};return(0,s.jsxs)(s.Fragment,{children:[(0,s.jsx)(t.header,{children:(0,s.jsx)(t.h1,{id:"smart-health-links",children:"SMART Health Links"})}),"\n",(0,s.jsx)(t.p,{children:"This guide describes a practical workflow for testing SMART Health Links (SHLs) between independent healthcare applications."}),"\n",(0,s.jsx)(t.p,{children:'It is primarily intended for developers building patient-facing applications as part of the CMS "Kill the Clipboard" (KTC) initiative, but the same workflow applies to any implementation of the SMART Health Links specification.'}),"\n",(0,s.jsx)(t.p,{children:"Although this guide demonstrates testing using Medplum, it is intentionally implementation-agnostic. SMART Health Links are designed to enable interoperability between independently developed systems, and we encourage developers to test against multiple independent implementations whenever possible."}),"\n",(0,s.jsx)(t.h2,{id:"what-is-cms-kill-the-clipboard",children:'What is CMS "Kill the Clipboard"?'}),"\n",(0,s.jsx)(t.p,{children:"The CMS Kill the Clipboard (KTC) initiative promotes standards-based patient data exchange to reduce manual data entry during registration and care transitions."}),"\n",(0,s.jsx)(t.p,{children:"One of the primary mechanisms for patient-mediated exchange is SMART Health Links, which allow a patient application to securely transfer healthcare data into an EHR or other clinical application."}),"\n",(0,s.jsx)(t.p,{children:"Useful references:"}),"\n",(0,s.jsxs)(t.ul,{children:["\n",(0,s.jsx)(t.li,{children:(0,s.jsx)(t.a,{href:"https://ktc-spec.github.io/",children:"CMS KTC specification"})}),"\n",(0,s.jsx)(t.li,{children:(0,s.jsx)(t.a,{href:"https://docs.google.com/document/d/1k8UE4x4MXe8VxCULM4dyUXz62vGwVPQirkPX5EPBmJ4/edit?tab=t.0#heading=h.kiih8s9rx9yl",children:"CMS KTC GA specification"})}),"\n",(0,s.jsx)(t.li,{children:(0,s.jsx)(t.a,{href:"https://hl7.org/fhir/uv/smart-health-cards-and-links/STU1/index.html",children:"SMART Health Links Implementation Guide"})}),"\n"]}),"\n",(0,s.jsx)(t.h2,{id:"what-is-a-smart-health-link",children:"What is a SMART Health Link?"}),"\n",(0,s.jsx)(t.p,{children:"A SMART Health Link is a URL that allows one healthcare application to securely share clinical information with another."}),"\n",(0,s.jsx)(t.p,{children:"Rather than directly embedding patient data, the link contains the information necessary for the receiving application to retrieve and decrypt the data from the originating system."}
1),"\n",(0,s.jsx)(t.p,{children:"SMART Health Links may be exchanged as:"}),"\n",(0,s.jsxs)(t.ul,{children:["\n",(0,s.jsx)(t.li,{children:"URLs"}),"\n",(0,s.jsx)(t.li,{children:"QR codes"}),"\n",(0,s.jsx)(t.li,{children:"NFC tags"}),"\n",(0,s.jsx)(t.li,{children:"Other transport mechanisms"}),"\n"]}),"\n",(0,s.jsx)(t.p,{children:"Most KTC workflows use QR codes for cross-device patient registration."}),"\n",(0,s.jsx)(t.h2,{id:"end-to-end-testing-workflow",children:"End-to-End Testing Workflow"}),"\n",(0,s.jsx)(t.p,{children:"A typical interoperability test consists of four steps."}),"\n",(0,s.jsx)(t.p,{children:(0,s.jsx)(t.img,{alt:"SMART Health Links Diagram",src:i(47273).A+"",width:"1600",height:"807"})}),"\n",(0,s.jsx)(t.p,{children:"The remainder of this guide walks through each step."}),"\n",(0,s.jsx)(t.h2,{id:"step-1-generate-a-smart-health-link",children:"Step 1: Generate a SMART Health Link"}),"\n",(0,s.jsx)(t.p,{children:"There are several publicly available implementations that can generate SMART Health Links."}),"\n",(0,s.jsxs)(t.table,{children:[(0,s.jsx)(t.thead,{children:(0,s.jsxs)(t.tr,{children:[(0,s.jsx)(t.th,{children:"Implementation"}),(0,s.jsx)(t.th,{children:"Notes"})]})}),(0,s.jsxs)(t.tbody,{children:[(0,s.jsxs)(t.tr,{children:[(0,s.jsx)(t.td,{children:(0,s.jsx)(t.a,{href:"https://pshd-shl.exe.xyz/",children:"CMS Reference Application"})}),(0,s.jsx)(t.td,{children:"Official demonstration application for the KTC specification. Useful for validating basic interoperability."})]}),(0,s.jsxs)(t.tr,{children:[(0,s.jsx)(t.td,{children:(0,s.jsx)(t.a,{href:"https://github.com/medplum/foomedical",children:"Foo Medical"})}),(0,s.jsx)(t.td,{children:"Demonstration application built on Medplum. Useful for testing and debugging. Not a production application and not participating in the CMS pledge."})]}),(0,s.jsxs)(t.tr,{children:[(0,s.jsx)(t.td,{children:(0,s.jsx)(t.a,{href:"https://www.flexpa.com/docs/smart-health-links",children:"Flexpa"})}),(0,s.jsx)(t.td,{children:"Patient-facing implementation supporting SMART Health Links."})]})]})]}),"\n",(0,s.jsx)(t.p,{children:"Whenever possible, test using multiple independent implementations rather than relying exclusively on your own software."}),"\n",(0,s.jsx)(t.h2,{id:"step-2-import-the-smart-health-link",children:"Step 2: Import the SMART Health Link"}),"\n",(0,s.jsx)(t.p,{children:"Several applications can consume SMART Health Links."}),"\n",(0,s.jsx)(t.p,{children:"For this guide we'll use the Medplum Provider application."}),"\n",(0,s.jsx)(t.p,{children:"The Provider application includes:"}),"\n",(0,s.jsxs)(t.ul,{children:["\n",(0,s.jsx)(t.li,{children:"QR code scanner"}),"\n",(0,s.jsx)(t.li,{children:"Direct URL import"}),"\n",(0,s.jsx)(t.li,{children:"Patient matching workflow"}),"\n",(0,s.jsx)(t.li,{children:"Resource review before import"}),"\n",(0,s.jsx)(t.li,{children:"Import into a FHIR server"}),"\n"]}),"\n",(0,s.jsx)(t.h2,{id:"step-3-register-for-medplum",children:"Step 3: Register for Medplum"}),"\n",(0,s.jsx)(t.p,{children:"Create a free account at:"}),"\n",(0,s.jsx)(t.p,{children:(0,s.jsx)(t.a,{href:"https://provider.medplum.com/",children:"https://provider.medplum.com"})}),"\n",(0,s.jsx)(t.p,{children:(0,s.jsx)(t.img,{alt:"Provider Sign Up",src:i(34117).A+"",width:"1920",height:"1280"})}),"\n",(0,s.jsx)(t.p,{children:"After registration, create a new project."}),"\n",(0,s.jsx)(t.p,{children:(0,s.jsx)(t.img,{alt:"Create Project",src:i(20312).A+"",width:"1920",height:"1280"})}),"\n",(0,s.jsx)(t.p,{children:"The project provides an isolated FHIR server where imported resources will be stored."}),"\n",(0,s.jsx)(t.h2,{id:"step-4-import-the-smart-health-link",children:"Step 4: Import the SMART Health Link"}),"\n",(0,s.jsxs)(t.p,{children:["Navigate to ",(0,s.jsx)(t.strong,{children:"SMART Health Link"})," from the Provider application's navigation menu."]}),"\n",(0,s.jsx)(t.p,{children:(0,s.jsx)(t.img,{alt:"SMART Health Link menu item",src:i(32857).A+"",width:"1920",height:"1280"})}),"\n",(0,s.jsx)(t.p,{children:"You may either:"}),"\n",(0,s.jsxs)(t.ul,{children:["\n",(0,s.jsx)(t.li,{children:"Paste the SMART Health Link URL"}),"\n",(0,s.jsx)(t.li,{children:"Scan a QR code using your device camera"}),"\n"]}),"\n",(0,s.jsx)(t.p,{children:(0,s.jsx)(t.img,{alt:"Import SMART Health Link",src:i(73583).A+"",width:"1920",height:"1280"})}),"\n",(0,s.jsx)(t.p,{children:"The Provider application resolves the SMART Health Link and retrieves the available resources."}),"\n",(0,s.jsx)(t.h2,{id:"step-5-resolve-patient-identity",children:"Step 5: Resolve Patient Identity"}),"\n",(0,s.jsx)(t.p,{children:"One of the most important steps in any SMART Health Link workflow is patient identity resolution."}),"\n",(0,s.jsx)(t.p,{children:"The receiving system attempts to determine whether the incoming patient already exists within the local FHIR server."}),"\n",(0,s.jsxs)(t.p,{children:["In Medplum, this uses the standard FHIR ",(0,s.jsx)(t.code,{children:"Patient/$match"})," operation together with the CMS-recommended patient matching algorithm."]}),"\n",(0,s.jsx)(t.p,{children:"The workflow is:"}),"\n",(0,s.jsxs)(t.ol,{children:["\n",(0,s.jsx)(t.li,{children:"Incoming Patient"}),"\n",(0,s.jsx)(t.li,{children:(0,s.jsx)(t.code,{children:"Patient/$match"})}),"\n",(0,s.jsx)(t.li,{children:"Candidate Matches"}),"\n",(0,s.jsx)(t.li,{children:"Select Existing Patient OR Create New Patient"}),"\n",(0,s.jsx)(t.li,{children:"Continue Import"}),"\n"]}),"\n",(0,s.jsx)(t.p,{children:"The user may choose an existing patient or create a new patient before continuing."}),"\n",(0,s.jsx)(t.p,{children:(0,s.jsx)(t.img,{alt:"Create Patient",src:i(24508).A+"",width:"1920",height:"1280"})}),"\n",(0,s.jsx)(t.h2,{id:"step-6-review-resources",children:"Step 6: Review Resources"}),"\n",(0,s.jsx)(t.p,{children:"After patient matching, the Provider application displays all resources available within the SMART Health Link."}),"\n",(0,s.jsx)(t.p,{children:"Examples include:"}),"\n",(0,s.jsxs)(t.ul,{children:["\n",(0,s.jsx)(t.li,{children:"Patient"}),"\n",(0,s.jsx)(t.li,{children:"AllergyIntolerance"}),"\n",(0,s.jsx)(t.li,{children:"Condition"}),"\n",(0,s.jsx)(t.li,{children:"Encounter"}),"\n",(0,s.jsx)(t.li,{children:"Immunization"}),"\n",(0,s.jsx)(t.li,{children:"Medication"}),"\n",(0,s.jsx)(t.li,{children:"Observation"}),"\n",(0,s.jsx)(t.li,{children:"Procedure"}),"\n",(0,s.jsx)(t.li,{children:"Coverage"}),"\n",(0,s.jsx)(t.li,{children:"ExplanationOfBenefit"}),"\n"]}),"\n",(0,s.jsx)(t.p,{children:"The user can review the resources before importing them."}),"\n",(0,s.jsx)(t.h2,{id:"step-7-import-resources",children:"Step 7: Import Resources"}),"\n",(0,s.jsxs)(t.p,{children:["Click ",(0,s.jsx)(t.strong,{children:"Import"})," to write the selected resources into the destination FHIR server."]}),"\n",(0,s.jsx)(t.p,{children:"Once complete, the imported data becomes part of the patient's chart."}),"\n",(0,s.jsx)(t.p,{children:(0,s.jsx)(t.img,{alt:"Import Data",src:i(94200).A+"",width:"1920",height:"1280"})}),"\n",(0,s.jsx)(t.h2,{id:"step-8-verify-the-results",children:"Step 8: Verify the Results"}),"\n",(0,s.jsx)(t.p,{children:"Navigate to the imported patient's chart."}),"\n",(0,s.jsx)(t.p,{children:"Verify that:"}),"\n",(0,s.jsxs)(t.ul,{children:["\n",(0,s.jsx)(t.li,{children:"The patient demographics are correct."}),"\n",(0,s.jsx)(t.li,{children:"Clinical resources were imported successfully."}),"\n",(0,s.jsx)(t.li,{children:"Relationships between resources were preserved."}),"\n",(0,s.jsx)(t.li,{children:"References resolve correctly."}),"\n",(0,s.jsx)(t.li,{children:"No duplicate patient was created."}),"\n"]}),"\n",(0,s.jsx)(t.p,{children:"At this point, the interoperability workflow is complete."}),"\n",(0,s.jsx)(t.p,{children:(0,s.jsx)(t.img,{alt:"Import Results",src:i(21610).A+"",width:"1920",height:"1280"})}),"\n",(0,s.jsx)(t.h2,{id:"about-medplum",children:"About Medplum"}),"\n",(0,s.jsx)(t.p,{children:"Medplum is an open source healthcare developer platform that provides building blocks for modern healthcare applications."}),"\n",(0,s.jsx)(t.p,{children:"Relevant SMART Health Link functionality includes:"}),"\n",(0,s.jsxs)(t.ul,{children:["\n",(0,s.jsx)(t.li,{children:"SMART Health Link FHIR operations"}),"\n",(0,s.jsx)(t.li,{children:"QR code generation"}),"\n",(0,s.jsx)(t.li,{children:"QR code scanning"}),"\n",(0,s.jsx)(t.li,{children:"FHIR resource import"}),"\n",(0,s.jsx)(t.li,{children:"Open source reference implementations"}),"\n"]}),"\n",(0,s.jsx)(t.p,{children:"We hope these tools make it easier to build interoperable healthcare applications and to validate SMART Health Link implementations across the healthcare ecosystem."})]})}function c(e={}){let{wrapper:t}={...(0,l.R)(),...e.components};return t?(0,s.jsx)(t,{...e,children:(0,s.jsx)(o,{...e})}):o(e)}},24508(e,t,i){i.d(t,{A:()=>n});let n=i.p+"assets/images/medplum-smart-health-links-create-patient-9f27404bc484a59381a014de47e81250.webp"},20312(e,t,i){i.d(t,{A:()=>n});let n=i.p+"assets/images/medplum-smart-health-links-create-project-38eb2367e28822867b534292a40f457a.webp"},47273(e,t,i){i.d(t,{A:()=>n});let n=i.p+"assets/images/medplum-smart-health-links-diagram-1911c7fd9d04d9d290d548e02e218e09.webp"},94200(e,t,i){i.d(t,{A:()=>n});let n=i.p+"assets/images/medplum-smart-health-links-import-data-c36d691566d45be32b626eb6417b1d6f.webp"},32857(e,t,i){i.d(t,{A:()=>n});let n=i.p+"assets/images/medplum-smart-health-links-menu-item-8c365062ea7ca56dc02bcd0e24a39fac.webp"},73583(e,t,i){i.d(t,{A:()=>n});let n=i.p+"assets/images/medplum-smart-health-links-qr-code-12b2c8d5819c6a7aace7e32dda0d5da4.webp"},34117(e,t,i){i.d(t,{A:()=>n});let n=i.p+"assets/images/medplum-smart-health-links-register-6dd71c66a6e6e88066cfa695c1c273bd.webp"},21610(e,t,i){i.d(t,{A:()=>n});let n=i.p+"assets/images/medplum-smart-health-links-results-05f8c86f18c58391e6420d16c9dc3bcf.webp"},71184(e,t,i){i.d(t,{R:()=>a,x:()=>r});var n=i(14041);let s={},l=n.createContext(s);function a(e){let t=n.useContext(l);return n.useMemo(function(){return"function"==typeof e?e(t):{...t,...e}},[t,e])}function r(e){let t;return t=e.disableParentContext?"function"==typeof e.components?e.components(s):e.components||s:a(e.components),n.createElement(l.Provider,{value:t},e.children)}}}]);

Line numbers count LF bytes from the start of the resource, as the search results do. Vendor segments are library code the classifier recognised; they are stored but not indexed. Bytes are shown as Latin1 characters, one per byte.