{"id":58447,"date":"2026-11-05T04:12:49","date_gmt":"2026-11-05T04:12:49","guid":{"rendered":"https:\/\/www.bridge-global.com\/blog\/?p=58447"},"modified":"2026-11-05T04:12:51","modified_gmt":"2026-11-05T04:12:51","slug":"smart-on-fhir-launch-scopes-security","status":"publish","type":"post","link":"https:\/\/www.bridge-global.com\/blog\/smart-on-fhir-launch-scopes-security\/","title":{"rendered":"SMART on FHIR: Launch, Scopes and Security"},"content":{"rendered":"<p>SMART on FHIR combines a standard app launch, authorization, and FHIR clinical data access so applications can connect to electronic health records. Product teams need to get launch context, least-privilege scopes, security checks, and per-EHR compatibility right, since resources, search behavior, and approval requirements can differ across systems.<\/p>\n<h2>Why a Certified EHR Must Speak SMART on FHIR<\/h2>\n<p>SMART on FHIR is an open app-launch and authorization profile that lets one healthcare application run against different electronic health records. It combines HL7 FHIR resources for clinical data, OAuth 2.0 for permission, and a standard way to pass the selected patient and signed-in user into the app. Say a clinician opens a chart and launches a lab review tool from inside the record. The tool shouldn&#039;t ask the clinician to find the patient again, and it shouldn&#039;t invent its own login. SMART defines how that handoff happens.<\/p>\n<p>The regulatory reason comes first for most U.S. products. Under the ONC Cures Act Final Rule, certified health IT must offer standardized APIs so third-party apps can reach structured clinical data under defined authorization and patient-context rules, a requirement described in the <a href=\"https:\/\/healthit.gov\/blog\/public-health\/innovation-in-population-data-analytics-driven-by-the-21st-century-cures-acts-api-standards-requirements\/\" target=\"_blank\" rel=\"noopener\">HealthIT.gov overview of the Cures Act API standards<\/a>. That makes SMART on FHIR a platform contract your team designs against, whether you sell to hospitals, build patient-facing tools, or add an embedded module to an existing product.<\/p>\n<h3>Where the standard came from<\/h3>\n<p>The history is short. The SMART Health IT project began in 2010, when Harvard Medical School and Boston Children&#039;s Hospital received a four-year, $15 million award from the U.S. Office of the National Coordinator for Health Information Technology, as recorded in the <a href=\"https:\/\/pmc.ncbi.nlm.nih.gov\/articles\/PMC4997036\/\" target=\"_blank\" rel=\"noopener\">peer-reviewed history of the SMART project<\/a>. The goal was to let developers build a medical application once and run it across different record systems. In 2013, the project built an open-source FHIR API server and adopted HL7&#039;s emerging FHIR standard.<\/p>\n<p>In January 2014, Cerner, Intermountain Healthcare, Hewlett-Packard for the U.S. Veterans Administration, and Harris Corporation demonstrated prototype implementations. FHIR reached the Draft Standard for Trial Use milestone in the same month. That pairing, FHIR resources plus OAuth-based authorization plus web launch, is still the architecture teams implement today.<\/p>\n<p>For buyers, the practical questions are what the server publishes, which scopes it honors, and how your team will handle gaps. Those decisions sit inside larger work such as custom healthcare software development, where security review should start early. Teams planning that review can use <a href=\"https:\/\/www.devarmor.com\/healthtech-grc\" target=\"_blank\" rel=\"noopener\">continuous threat modeling for healthtech teams<\/a> as a prompt to map threats against each launch path before code hardens.<\/p>\n<h2>FHIR Data, OAuth and Launch Context<\/h2>\n<p>Think of SMART on FHIR as three contracts that travel together. FHIR resources are the clinical vocabulary, typically Patient, Observation, MedicationRequest, and Encounter, narrowed by the US Core profiles an EHR exposes. OAuth 2.0 is the permission system. An authorization server issues an access token limited to granted scopes, and the app sends that token as a bearer token when it calls the FHIR base URL. Launch context tells the app which patient, encounter, or user is already selected, so the clinician doesn&#039;t repeat a search.<\/p>\n<p>One analogy covers it, and then you can drop it. FHIR is the chart&#039;s language, OAuth is the badge, and launch context is the open exam room. A badge doesn&#039;t tell you how to read the chart. The chart&#039;s language doesn&#039;t prove you&#039;re allowed in the room. You need all three working together before a screen can safely show clinical data.<\/p>\n<p><figure class=\"wp-block-image size-large\"><img decoding=\"async\" src=\"https:\/\/www.bridge-global.com\/blog\/wp-content\/uploads\/2026\/11\/smart-on-fhir-fhir-framework.jpg\" alt=\"A diagram illustrating the connection between FHIR data, OAuth authorization, and EHR launch context for healthcare interoperability.\" \/><\/figure>\n<\/p>\n<h3>The roles behind the contracts<\/h3>\n<p>Name the roles before you write code, because each role decides where a control belongs. The EHR&#039;s FHIR server acts as the resource server and is often paired with the authorization server that decides whether to issue a token. Your app is the OAuth client that requests tokens. The clinician&#039;s browser carries the redirect between them.<\/p>\n<p>Your backend, or your browser code for a public client, has to handle each role&#039;s responses correctly. A token error points to an authorization failure rather than a FHIR parsing failure. A valid token permits access, while the returned Observation still needs to be checked for the fields your logic requires. Separating those failures early saves painful debugging during site testing.<\/p>\n<p>Discovery ties the roles together. The app reads the server document at .well-known\/smart-configuration to find the authorization and token endpoints and to see which launch and challenge methods the server supports. Don&#039;t hard-code those endpoints from a sandbox and assume production matches.<\/p>\n<h3>What each contract gives the app<\/h3>\n<p>Use this table as a design checklist. Each row should have an owner on your team and a test that proves it works against a real target server.<\/p>\n<p><strong>What each SMART on FHIR contract gives the app<\/strong><\/p>\n\n\n<figure class=\"wp-block-table\"><table><tr>\n<th>Contract<\/th>\n<th>Job in the integration<\/th>\n<th>What the app receives<\/th>\n<th>When it is required<\/th>\n<\/tr>\n<tr>\n<td>FHIR resources<\/td>\n<td>Clinical data model and REST API<\/td>\n<td>Patient, Observation and other profiled resources<\/td>\n<td>Always, for any clinical read or write<\/td>\n<\/tr>\n<tr>\n<td>OAuth 2.0 authorization<\/td>\n<td>Permission and token issuance<\/td>\n<td>Authorization code, then access token bound to scopes<\/td>\n<td>Always<\/td>\n<\/tr>\n<tr>\n<td>SMART launch context<\/td>\n<td>Bind the app to the open chart or a chosen patient<\/td>\n<td>patient, encounter and related context<\/td>\n<td>EHR launch, or standalone when a patient must be picked<\/td>\n<\/tr>\n<tr>\n<td>OpenID Connect<\/td>\n<td>Authenticated user identity<\/td>\n<td>ID token when openid and fhirUser are granted<\/td>\n<td>Only if the app must know which user launched it<\/td>\n<\/tr>\n<\/table><\/figure>\n\n\n<p>Add OpenID Connect only when the product needs a signed-in user identity. The scopes openid and fhirUser, when granted, allow the app to receive an ID token. If your app only needs patient data for a chart already open, requesting identity scopes adds consent surface without improving the feature.<\/p>\n<p>The mapping work sits between these contracts and your own product model. Your internal objects rarely match FHIR resources field for field, so someone must decide how codes, units, statuses, and missing values translate. That&#039;s the core engineering behind <a href=\"https:\/\/www.bridge-global.com\/blog\/fhir-integration-services\/\">FHIR integration services<\/a> and the <a href=\"https:\/\/www.bridge-global.com\/blog\/fhir-hl7-integration-services-guide\/\">FHIR and HL7 integration services guide<\/a>. Vague assumptions turn into site-specific defects if nobody writes the mapping down.<\/p>\n<p>A screen is ready to build when the team can name the FHIR resource, scope, and launch context it depends on.<\/p>\n<h2>EHR Launch Versus Standalone Launch<\/h2>\n<p>Choose a launch style before you write the authorize URL. Swapping flows later changes your scope request, your consent screen, and your handling of patient selection. Both flows end with an access token, but each establishes patient context differently.<\/p>\n<p>In an EHR launch, the record system opens the app and places an opaque launch handle on the launch URL. The app returns that handle on the authorization request so the server can attach session context, including the selected patient, as described in the <a href=\"https:\/\/www.hl7.org\/fhir\/smart-app-launch\/STU2\/app-launch.html\" target=\"_blank\" rel=\"noopener\">HL7 SMART App Launch specification<\/a>. The launch scope is what permits that embedded context. Treat the handle as opaque. Don&#039;t parse it, store it as a clinical identifier, or reuse it after the launch completes.<\/p>\n<p><figure class=\"wp-block-image size-large\"><img decoding=\"async\" src=\"https:\/\/www.bridge-global.com\/blog\/wp-content\/uploads\/2026\/11\/smart-on-fhir-launch-style.jpg\" alt=\"A flowchart showing the difference between EHR launch and standalone launch styles for software development.\" \/><\/figure>\n<\/p>\n<p>In a standalone launch, the user opens the app outside the EHR, from a phone, a portal link, or a bookmark. There&#039;s no session handle because there&#039;s no EHR session. The <strong>launch\/patient<\/strong> scope asks the authorization server to have the user pick a patient during consent. If you request the wrong context scope, the server may reject the request or return a token without the patient context your first screen expects.<\/p>\n<h3>The shared sequence in order<\/h3>\n<p>Both flows then follow the same redirect and token exchange. Write these steps into your implementation ticket, not just your architecture diagram.<\/p>\n<ol>\n<li>\n<p><strong>Discover endpoints:<\/strong> Fetch <strong>.well-known\/smart-configuration<\/strong> and read the authorization and token endpoints.<\/p>\n<\/li>\n<li>\n<p><strong>Create PKCE values:<\/strong> Generate a verifier and derive its <strong>S256<\/strong> challenge.<\/p>\n<\/li>\n<li>\n<p><strong>Redirect to authorize:<\/strong> Send the client ID, redirect URI, requested scopes, <strong>state<\/strong>, code challenge, and, for an EHR launch only, the launch handle.<\/p>\n<\/li>\n<li>\n<p><strong>Validate the return:<\/strong> Reject the response if <strong>state<\/strong> does not match what you sent.<\/p>\n<\/li>\n<li>\n<p><strong>Exchange the code:<\/strong> Post the authorization code and the verifier to the token endpoint.<\/p>\n<\/li>\n<li>\n<p><strong>Plan for expiry:<\/strong> Read <strong>expires_in<\/strong> from the token response and plan a new authorization when the token lapses.<\/p>\n<\/li>\n<li>\n<p><strong>Call FHIR safely:<\/strong> Call the FHIR base URL with the bearer token, never place it in a URL or long-lived browser storage, and confirm the token audience matches the FHIR server you&#039;re calling.<\/p>\n<\/li>\n<\/ol>\n<p>Step 6 catches teams out. A token that works during a short demo can expire mid-shift, and an app that responds with a blank screen will lose clinicians quickly. Decide what the user sees when reauthorization is needed, and test that path on purpose by using short-lived tokens in your sandbox.<\/p>\n<p>Step 7 matters just as much. A token issued for one FHIR server shouldn&#039;t be replayed against another, even if both sit behind similar URLs. Checking audience expectation is a small control that prevents a confusing class of wrong-environment bugs.<\/p>\n<h3>EHR launch and standalone launch side by side<\/h3>\n\n\n<figure class=\"wp-block-table\"><table><tr>\n<th>Question<\/th>\n<th>EHR launch<\/th>\n<th>Standalone launch<\/th>\n<\/tr>\n<tr>\n<td>Who starts the app<\/td>\n<td>The EHR opens the app from a launch URL<\/td>\n<td>The user opens the app outside the EHR<\/td>\n<\/tr>\n<tr>\n<td>Context handle<\/td>\n<td>Opaque launch parameter from the EHR session<\/td>\n<td>No EHR session handle<\/td>\n<\/tr>\n<tr>\n<td>Context scope<\/td>\n<td>launch<\/td>\n<td>launch\/patient<\/td>\n<\/tr>\n<tr>\n<td>Who selects the patient<\/td>\n<td>Already selected in the EHR<\/td>\n<td>The authorization server asks the user<\/td>\n<\/tr>\n<\/table><\/figure>\n\n\n<p>If your product supports both styles, build them as two explicit entry points with separate tests. Don&#8217;t detect the flow by guessing from missing parameters and then improvise. Explicit entry points make consent behavior predictable, and predictable consent behavior is what hospital reviewers want to see.<\/p>\n<h2>Scope Strings That Enforce Least Privilege<\/h2>\n<p>A SMART scope encodes who the access is for, which FHIR resource is involved, and which operations are allowed. SMART App Launch 2.0 writes that structure as patient, user, or system, then a FHIR resource or wildcard, then a dot and the letters c, r, u, d, and s for create, read, update, delete, and search, according to the <a href=\"http:\/\/hl7.org\/fhir\/us\/core\/scopes.html\" target=\"_blank\" rel=\"noopener\">US Core scopes documentation<\/a>. The current published version on hl7.org is <a href=\"https:\/\/www.hl7.org\/fhir\/smart-app-launch\/STU2.2\/app-launch.html\" target=\"_blank\" rel=\"noopener\">SMART App Launch 2.2 (STU 2.2)<\/a>. An optional search parameter can narrow the set further.<\/p>\n<p>Read a scope from left to right, and it tells a story. The subject says whose data boundary applies. The resource says which clinical concept is exposed. The letters say what the app may do to it. If any part is broader than the screen needs, the request is broader than it should be.<\/p>\n<h3>Four strings worth decoding<\/h3>\n<ul>\n<li>\n<p><strong>patient\/Observation.rs?category=<\/strong><a href=\"http:\/\/terminology.hl7.org\/CodeSystem\/observation-category%7Claboratory\" target=\"_blank\" rel=\"noopener\"><strong>http:\/\/terminology.hl7.org\/CodeSystem\/observation-category|laboratory<\/strong><\/a><strong>:<\/strong> Read and search laboratory observations for the current patient only. This fits a lab results screen that has no business reading medications or notes.<\/p>\n<\/li>\n<li>\n<p><strong>patient\/*.rs:<\/strong> Read and search any resource for the current patient. That&#8217;s broader than most single-purpose screens need, even though it stays inside one patient&#8217;s chart.<\/p>\n<\/li>\n<li>\n<p><strong>user\/*.cruds:<\/strong> Create, read, update, delete, and search whatever the authorizing user can already access. That&#8217;s a clinician workspace permission, not a single-chart permission, and reviewers will read it that way.<\/p>\n<\/li>\n<li>\n<p><strong>system-level read scope:<\/strong> Fits a backend client with no interactive user, such as a scheduled quality job. Treat it as an organizational grant because no patient or clinician selection narrows it at launch.<\/p>\n<\/li>\n<\/ul>\n<p>The difference between the first and second examples is the difference between a defensible request and a difficult approval meeting. A lab viewer requesting every resource for the patient invites questions it can&#8217;t answer well. Why does it need conditions, procedures, and documents to draw a lab trend? If the honest answer is convenience during development, fix the scope before production.<\/p>\n<p>The third example deserves extra caution. <strong>user\/*.cruds<\/strong> includes write and delete across the user&#8217;s reach. Some clinician tools need write access, for example, to file a note or update a care plan. Name the resource and keep the letters tight. A tool that creates one resource type shouldn&#8217;t request delete on everything.<\/p>\n<h3>Context scopes are not data scopes<\/h3>\n<p>Don&#8217;t confuse <strong>launch<\/strong> and <strong>launch\/patient<\/strong> with clinical access. They grant context, the right to learn which patient or session the app is bound to. They don&#8217;t grant permission to read an Observation or a MedicationRequest. Your request usually needs a context scope plus one or more resource scopes, and each part should be justified separately.<\/p>\n<p>A server also only honors scopes it publishes. US Core documents resource-level forms such as <strong>patient\/Patient.rs<\/strong>, <strong>user\/Patient.rs<\/strong> and <strong>system\/Patient.rs<\/strong>, with support depending on the server&#8217;s published SMART capability declarations. Check that publication for each target EHR instead of copying a scope list from a tutorial or a previous customer.<\/p>\n<p>Each screen should name the resources it touches and the minimum operation letters it requires, with wildcard scopes kept in the sandbox.<\/p>\n<p>Build a scope-to-screen map during design. It takes an afternoon, and it becomes evidence later when a privacy reviewer asks why your app requests what it requests. Teams that skip the map usually reconstruct it under pressure, after the first rejection, when changing scopes also means retesting consent screens.<\/p>\n<h2>PKCE and the Other Launch Security Checks<\/h2>\n<p>Start with the current rule. SMART applications must support Proof Key for Code Exchange, or PKCE. Authorization servers must support the S256 challenge method, and they must not support the weaker plain method, under the <a href=\"https:\/\/hl7.org\/fhir\/smart-app-launch\/STU2.1\/app-launch.html\" target=\"_blank\" rel=\"noopener\">SMART App Launch 2.1 conformance guidance<\/a>. This is not an optional hardening item to schedule after launch.<\/p>\n<p>The threat is concrete. A browser or mobile app is a public client, which means it can&#8217;t hide a client secret from anyone who inspects the code or intercepts traffic on the device. Say an attacker steals the authorization code during the redirect. Without PKCE, that code may be enough to redeem a token. With PKCE, the attacker still needs the high-entropy verifier that produced the S256 challenge sent at the start, and the verifier never travels with the authorize request.<\/p>\n<figure class=\"wp-block-image size-large\"><img decoding=\"async\" src=\"https:\/\/www.bridge-global.com\/blog\/wp-content\/uploads\/2026\/11\/smart-on-fhir-security-checks.jpg\" alt=\"An infographic detailing launch security requirements for SMART applications, highlighting PKCE, S256 support, and avoiding plain methods.\" \/><\/figure>\n<h3>The fixed implementation order<\/h3>\n<p>The sequence has no flexibility. Generate a cryptographically random verifier for each authorization attempt. Derive its S256 challenge. Send the challenge on the authorize request. Send the verifier only on the token request, when you exchange the returned code. Reusing a verifier across launches, or deriving it from something predictable like a timestamp, defeats the control.<\/p>\n<p>Read the supported challenge methods from SMART metadata before you assume S256 is available. Discovery exists so your app can confirm server behavior instead of guessing. If a target server advertises only plain, that&#8217;s a finding to raise with the site, not a reason to downgrade your client.<\/p>\n<h3>Checks a review should fail the build for<\/h3>\n<ul>\n<li>\n<p><strong>Mismatched state:<\/strong> The returned state value doesn&#8217;t match what the app sent.<\/p>\n<\/li>\n<li>\n<p><strong>Missing TLS:<\/strong> Any step in the redirect or token exchange runs over an unprotected connection.<\/p>\n<\/li>\n<li>\n<p><strong>Unexpected issuer:<\/strong> The token or discovery document comes from an issuer the app didn&#8217;t expect for that EHR.<\/p>\n<\/li>\n<li>\n<p><strong>Unregistered redirect URI:<\/strong> The app uses a redirect URI that wasn&#8217;t registered with the authorization server.<\/p>\n<\/li>\n<li>\n<p><strong>Token in a query string:<\/strong> An access token appears in a URL, where logs and browser history can capture it.<\/p>\n<\/li>\n<li>\n<p><strong>Token in long-lived browser storage:<\/strong> A token sits in storage that survives the session and widens the theft window.<\/p>\n<\/li>\n<\/ul>\n<p>Cover these controls with automated SMART conformance tests and a security review before a hospital pilot. A FHIR resource that parses correctly can still be reached through a broken token exchange, and the hospital&#8217;s security team will test the exchange, not just your JSON handling. Identity questions usually surface in the same review, so it helps to align your answers with a clear approach to <a href=\"https:\/\/www.bridge-global.com\/blog\/healthcare-identity-management\/\">healthcare identity management<\/a> before reviewers ask who owns each decision.<\/p>\n<h2>Use Cases That Still Need a Compatibility Matrix<\/h2>\n<p>Four common patterns show why one integration design doesn&#8217;t fit every SMART on FHIR product. They differ in launch style, data needs, and failure tolerance, even when they share the same authorization shape.<\/p>\n<p>A chart-embedded decision aid uses EHR launch and a narrow patient resource set, such as recent labs or active medications. Its main risk is latency and clutter inside a busy workflow. A patient-facing app started from a portal or phone, uses standalone launch with launch\/patient, and its main risk is confusing consent. A medication-education tool deployed across several pharmacy and clinic sites faces a different problem. The same build must tolerate different EHR behaviors at each site, so rollout discipline matters as much as the first successful launch. A quality or population job uses system scopes with no interactive chart, and its risk sits in governance because no clinician narrows the data at runtime.<\/p>\n<figure class=\"wp-block-image size-large\"><img decoding=\"async\" src=\"https:\/\/www.bridge-global.com\/blog\/wp-content\/uploads\/2026\/11\/smart-on-fhir-healthcare-dashboard.jpg\" alt=\"A healthcare professional analyzing a SMART on FHIR app pattern compatibility matrix on a modern office computer screen.\" \/><\/figure>\n<h3>Why plug-and-play breaks down<\/h3>\n<p>An EHR can advertise SMART on FHIR and still expose a different resource subset, a different US Core profile, extra extensions, uneven search support, or a workflow that never writes the field your app expects. Recent implementation research presented through <a href=\"https:\/\/amia.secure-platform.com\/symposium\/gallery\/rounds\/82021\/details\/20706\" target=\"_blank\" rel=\"noopener\">AMIA symposium proceedings<\/a> identifies technical incompatibility, limited organizational capacity, and policy uncertainty as persistent barriers even where federal policy promotes FHIR adoption. Standards adoption can rise while real portability stays limited.<\/p>\n<blockquote>\n<p>A passing conformance test proves your app speaks the protocol. It doesn&#8217;t prove the next hospital&#8217;s data will answer your clinical question.<\/p>\n<\/blockquote>\n<p>Keep one compatibility matrix per target EHR. Record required resources, fields that come back empty, extensions you must normalize, the API version, search parameters that work, and the empty-state behavior when data is missing. Update it from test results against that site&#8217;s sandbox and, later, its production-like environment. A matrix built from vendor documentation alone will flatter you.<\/p>\n<p>Version your own API contract too. If a partial EHR can&#8217;t supply a field, your app should degrade in a designed way, for example by hiding a risk score and showing the underlying values with a note. It shouldn&#8217;t omit a clinical safety check and present the result as complete. That distinction belongs in product requirements, not in a support ticket after go-live.<\/p>\n<p>Products sold in more than one country inherit different consent and privacy rules on top of the same OAuth shape. The matrix should capture those differences as first-class rows, alongside resources and scopes. At this point, <a href=\"https:\/\/www.bridge-global.com\/blog\/ehr-integration-services\/\">EHR integration services<\/a> and a broader <a href=\"https:\/\/www.bridge-global.com\/blog\/healthcare-data-interoperability-strategy\/\">healthcare data interoperability strategy<\/a> move beyond planning slogans and become testable work your engineers and reviewers can share.<\/p>\n<h2>Choose a Launch Model and an Approval Path<\/h2>\n<p>Write down three decisions before sprint planning. First, EHR launch, standalone launch, or both, because the context, scope, and consent screen change. Second, the minimum scope set per role, with wildcards removed for production. Third, who at the hospital must approve the app, because a working token exchange doesn&#8217;t replace their sign-off.<\/p>\n<p>That approval group often includes security, privacy, clinical informatics, procurement, compliance, and a frontline clinical champion. Each group asks a different question. Security asks how tokens are protected. Privacy asks why each scope is necessary. Clinical informatics asks whether the app saves time or adds clicks. Procurement asks what happens when the contract ends. If you prepare one generic interoperability slide for all of them, you&#8217;ll answer none of them well.<\/p>\n<h3>Build a short evidence pack<\/h3>\n<p>Bring a document reviewers can check. Include your data minimization argument, the scope-to-role map, audit events you&#8217;ll produce, clinical safety assumptions, failure modes when a resource is missing, how patient consent behaves, and one measurable workflow benefit stated in plain terms. Keep it short enough that a busy reviewer will read it.<\/p>\n<p>An app that adds clicks or ignores how clinicians already think can be rejected even when SMART conformance passes. Observe the workflow you&#8217;re entering, name a local champion, and be ready to show what the clinician stops doing because your app exists.<\/p>\n<p>Take one concrete next step. Pull <strong>.well-known\/smart-configuration<\/strong> from one target EHR and fill the first rows of your compatibility matrix before promising that the same build will run everywhere. A <a href=\"https:\/\/www.bridge-global.com\/\">healthtech software development partner<\/a> can help turn that matrix into build work through <a href=\"https:\/\/www.bridge-global.com\/healthcare\">custom healthcare software development<\/a> and <a href=\"https:\/\/www.bridge-global.com\/healthcare\/tools-and-integrations\">healthcare integrations<\/a>. We can build a healthtech product from scratch or plug into an ongoing product roadmap, and we&#8217;ve built a HIPAA-compliant remote patient monitoring platform as a healthcare IoT application.<\/p>\n<h2>Frequently Asked Questions<\/h2>\n<h3>What is SMART on FHIR in one sentence?<\/h3>\n<p>It&#8217;s the HL7 profile that launches an app with FHIR data, OAuth 2.0 authorization, and patient or user context, so the same app can target more than one EHR. It standardizes the handoff between the record system and your application.<\/p>\n<h3>Is SMART on FHIR the same as FHIR?<\/h3>\n<p>No. FHIR is the data and API standard that defines resources such as Patient and Observation. SMART on FHIR is the launch and authorization layer on top of it.<\/p>\n<h3>What does patient\/Observation.rs mean?<\/h3>\n<p>It allows reading and searching of Observation resources for the current patient only. A category parameter can narrow it further, for example, to laboratory results when that&#8217;s all the app needs.<\/p>\n<h3>Why did our app work in one EHR and fail in another?<\/h3>\n<p>Conformance doesn&#8217;t guarantee the same resources, profiles, search behavior, or clinical workflow. Test each target EHR against a compatibility matrix and design a clear empty state when a field is absent.<\/p>\n<h3>Who approves a SMART app at a hospital?<\/h3>\n<p>Expect security, privacy, clinical informatics, procurement, and a clinical owner to sign off, not only the integration engineer. Bring an evidence pack that answers each group&#8217;s questions directly.<\/p>\n<hr \/>\n<p>If you&#8217;re planning a SMART on FHIR integration and want the launch model, scope map, and compatibility matrix settled before your first hospital review, talk to us about the engineering and approval work behind it. Visit <a href=\"https:\/\/www.bridge-global.com\">Bridge Global<\/a> to discuss your product, your target EHRs, and the safest path from sandbox launch to approved deployment.<\/p><!-- AddThis Advanced Settings generic via filter on the_content --><!-- AddThis Share Buttons generic via filter on the_content -->","protected":false},"excerpt":{"rendered":"<p>SMART on FHIR combines a standard app launch, authorization, and FHIR clinical data access so applications can connect to electronic health records. Product teams need to get launch context, least-privilege scopes, security checks, and per-EHR compatibility right, since resources, search &hellip;<!-- AddThis Advanced Settings generic via filter on get_the_excerpt --><!-- AddThis Share Buttons generic via filter on get_the_excerpt --><\/p>\n","protected":false},"author":1,"featured_media":58446,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[1015],"tags":[1216,1368,2043,2044,2045],"class_list":["post-58447","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","category-healthcare","tag-ehr-integration","tag-healthcare-interoperability","tag-smart-on-fhir","tag-fhir-app-launch","tag-oauth-scopes"],"featured_image_src":"https:\/\/www.bridge-global.com\/blog\/wp-content\/uploads\/2026\/11\/smart-on-fhir-medical-technology.jpg","author_info":{"display_name":"admin","author_link":"https:\/\/www.bridge-global.com\/blog\/author\/admin\/"},"_links":{"self":[{"href":"https:\/\/www.bridge-global.com\/blog\/wp-json\/wp\/v2\/posts\/58447","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/www.bridge-global.com\/blog\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/www.bridge-global.com\/blog\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/www.bridge-global.com\/blog\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/www.bridge-global.com\/blog\/wp-json\/wp\/v2\/comments?post=58447"}],"version-history":[{"count":2,"href":"https:\/\/www.bridge-global.com\/blog\/wp-json\/wp\/v2\/posts\/58447\/revisions"}],"predecessor-version":[{"id":58478,"href":"https:\/\/www.bridge-global.com\/blog\/wp-json\/wp\/v2\/posts\/58447\/revisions\/58478"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/www.bridge-global.com\/blog\/wp-json\/wp\/v2\/media\/58446"}],"wp:attachment":[{"href":"https:\/\/www.bridge-global.com\/blog\/wp-json\/wp\/v2\/media?parent=58447"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/www.bridge-global.com\/blog\/wp-json\/wp\/v2\/categories?post=58447"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/www.bridge-global.com\/blog\/wp-json\/wp\/v2\/tags?post=58447"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}