A FHIR migration can pass a resource-count check and still fail clinically. The destination may contain the same number of Patient, Observation, MedicationRequest, and Encounter resources while historical versions have been flattened, references resolve differently, custom searches return a different cohort, or a SMART launch no longer supplies the patient and encounter context that a clinician-facing application expects. Those are not cosmetic differences. They can change what an application displays, what a user is allowed to see, or whether a downstream workflow makes a safe decision.
Microsoft's migration FAQ states that Azure API for FHIR retires on September 30, 2026, after which customers cannot create or manage accounts, access data through the portal or APIs, receive service updates, or obtain support for the retired service. New customer deployments have already been blocked since April 1, 2025. A separate deadline applies to the legacy SMART on FHIR proxy: Microsoft's proxy guidance says it retires on September 21, 2026 and applications that still depend on it report errors after that date.
Production success therefore means more than copying data. It means preserving approved FHIR meaning, version history, identifiers, references, authorization boundaries, launch context, search behavior, client workflows, auditability, and a recovery path. This runbook treats the move as a controlled service transition: map the estate, compare platform behavior, choose lift-and-shift or incremental copy, prepare the workspace and security boundary, migrate with explicit history scope, reconcile data and searches, cut applications over, test SMART authorization, observe clinical integrity, and decommission only when the evidence supports it.
Define the Retirement Scope and the Two September Deadlines
The retirement is a service boundary, not a suggestion to schedule a future upgrade. According to Microsoft's migration strategies guidance, Azure API for FHIR retires on September 30, 2026. The older service is distinct from the Azure Health Data Services workspace and its FHIR service. After retirement, the access and support consequences described in the FAQ apply even if an application binary, service principal, or DNS entry still points at the old endpoint.
Treat the SMART proxy cutoff as an independent workstream. A team can complete data migration before September 30 and still break a clinician-facing SMART application on September 21 if the app depends on the proxy's callback relay, audience assumptions, or launch-context handling. Conversely, moving a SMART app does not migrate the FHIR store. Maintain two acceptance dates, two owners, and two test packs.
The first governance artifact is a deadline and dependency register. It should distinguish vendor-documented facts from internal milestones. Do not use a generic 'Azure FHIR retirement' ticket that can be closed after the first green smoke test.
Milestone | Vendor fact | Operational owner | Exit evidence |
New-deployment restriction | No new Azure API for FHIR deployments after April 1, 2025 | Cloud platform | Inventory confirms no new dependency is being created |
SMART proxy cutoff | Legacy SMART on FHIR proxy retires September 21, 2026 | Application and identity owners | All SMART clients use the approved replacement and pass launch tests |
Azure API for FHIR retirement | Service retires September 30, 2026 | FHIR platform owner | Production traffic and pipelines are off the legacy service |
Post-deadline remediation | Missed dependencies may be inaccessible after retirement | Executive incident owner | Dependency rebuilt against target with reconciled data and evidence |
Use the API developer learning path only as role context for the API engineering skills involved. The migration itself is a healthcare interoperability and operational-risk exercise, not a general career tutorial.
Build a FHIR Estate, Data, and Application Dependency Map
Start with authoritative discovery. The source resource name in Azure is not the estate. The estate includes every client, user, service principal, app registration, pipeline, export job, analytics consumer, event dependency, secret, certificate, DNS alias, private endpoint, firewall rule, search parameter, and operational runbook that assumes the old endpoint or its behavior.
Inventory by business workflow as well as technology. A medication reconciliation screen, patient portal, quality-measure pipeline, billing export, research extract, clinical decision support integration, or interface-engine feed may touch the same FHIR service differently. One may care about current state, another about historical versions, and another about exact search ordering or bundle semantics. That difference determines migration acceptance criteria.
Inventory object | Required fields | Why it matters |
FHIR service | Subscription, resource group, tenant, region, version, data volume, network mode | Defines migration scope and capacity planning |
Application/client | Owner, endpoint, audience, scopes/roles, SDK, retry behavior, launch mode | Finds semantic and authorization dependencies |
Identity | User/group, service principal, managed identity, app registration, credential owner | Rebuilds target access without privilege drift |
Data movement | Export/import jobs, ETL, staging storage, schedule, manifest owner | Prevents silent gaps and orphaned files |
Search and metadata | Custom SearchParameter resources, capability-statement dependencies, reindex jobs | Protects query behavior and client discovery |
Operations | Logs, alerts, audit retention, on-call owner, downtime plan, rollback authority | Makes the cutover supportable |
Inventory Servers, Tenants, Clients, Jobs, and Integrations
For each client, record how it discovers the FHIR endpoint and token issuer. Hard-coded endpoint strings are obvious. Less obvious are deployment variables, Key Vault secrets, API Management backends, reverse proxies, mobile app configuration, integration-engine channels, scheduled scripts, notebooks, and vendor-managed interfaces. Search source repositories and configuration stores for both the hostname and old audience values.
This is where the dependency-discovery discipline in the Azure Service Bus migration runbook transfers cleanly: enumerate runtime consumers, not just resources. For FHIR, add clinical workflow ownership and patient-safety impact to the normal dependency map.
Capture every registered redirect URI and SMART launch URL, including non-production and vendor-owned callbacks.
Capture all scheduled $export operations, storage destinations, retention policies, downstream loaders, and reconciliation jobs.
Capture all custom SearchParameter resources and the jobs or scripts used to reindex them.
Capture audit evidence obligations, including how long migration manifests, authorization results, and cutover approvals must be retained.
Assign a business validator to every critical workflow. Technical ownership alone cannot sign off a clinician-visible result.
Compare Azure API for FHIR With the Health Data Services FHIR Service
Do not assume the successor is a drop-in endpoint replacement. Microsoft's FHIR service overview describes the target as a managed FHIR service inside Azure Health Data Services, with Microsoft Entra role-based access control, audit logging, and SMART on FHIR support. Microsoft's migration matrix also calls out differences in search capability, transaction bundles, events, autoscaling, disaster-recovery features, and data-ingress mechanisms.
The comparison should be workload-specific. A platform difference matters only when a client depends on it, but a dependency is often hidden until a negative test fails. Capability-statement comparison is necessary because clients may dynamically inspect the metadata endpoint, yet metadata parity is not sufficient. A client can see the same resource type and still receive a different result set for a chained search or custom parameter.
Capability | Legacy assumption to verify | Target decision/test |
Resource model | FHIR version and profiles assumed by clients | Compare metadata and validate representative resources |
Search | Custom parameters, include/revinclude, sorting, partial indexing | Recreate, reindex, and compare saved query corpus |
Bundles | Batch-only client behavior or transaction expectations | Test bundle types, status codes, and rollback semantics |
Events | External proxy or polling workflow | Map to supported eventing or keep a validated alternate architecture |
Identity | Local RBAC, external authority, legacy audience | Redesign issuer, audience, roles, and client registrations |
Resilience | Legacy DR procedures and recovery assumptions | Document target recovery design, restore evidence, and RTO/RPO ownership |
Use API-first design in transformation programs as background for contract ownership: treat endpoint, metadata, error, authorization, and search behavior as consumer-facing contracts. The FHIR-specific acceptance work remains in this runbook.
Select Lift-and-Shift or Incremental Copy by Downtime and Data Volume
Microsoft documents two broad patterns in its migration strategies. Lift-and-shift uses export followed by import and is the simpler choice when the source can tolerate a longer write outage. Incremental copy keeps the legacy service operating while data is moved in stages, reducing final downtime but increasing reconciliation complexity and the need to reason about deltas, versions, and concurrent change.
Choose by operational constraints, not by which tool looks easier in a proof of concept. The decision record should cover source write rate, historical-version scope, data volume, expected export and import duration, validation duration, permitted read and write downtime, number of clients, ability to freeze writes, and rollback design. If history must be preserved, import mode and input metadata become part of the architecture, not an implementation detail.
Condition | Prefer lift-and-shift when | Prefer incremental copy when |
Downtime | A controlled outage can cover export, import, validation, and switch | Clinical or business writes must continue until a short final cutover |
Data volume | Transfer and validation fit comfortably in outage | Bulk copy is too long for the outage window |
Change rate | Writes can be frozen early | Source remains active during most migration |
History | Scope is simple and validated | History/deltas need repeated transfer and ledger tracking |
Rollback | Source can remain authoritative until acceptance | Dual-state reconciliation and reverse decision criteria are defined |
Escalate Large Stores and Capacity Constraints Early
Microsoft's guidance contains two important volume thresholds that should not be conflated. The target's current documented support is 4 TB, with a support request required for more than 4 TB. Separately, Microsoft says that if an Azure API for FHIR instance contains more than 2 TB, open a support request before starting migration and include both the source and target instance names. Treat the 2 TB threshold as a planning trigger, not as a target hard limit.
A useful support request includes the source size and growth trend, required historical scope, desired target region, expected migration pattern, permitted outage, staging-storage design, encryption/network restrictions, planned parallelism, test window, and the consequence if migration exceeds the planned window. For a target expected to exceed documented support, do not proceed on verbal assumptions. Record the supported path, capacity limits, and any Microsoft guidance in the change record.
Stop before bulk migration if target capacity or support status is unresolved.
Load-test representative resource sizes and search patterns before the production import window.
Validate staging-storage throughput and network policy with real migration-format files, not only small samples.
Reserve time for reconciliation and reindexing. Transfer completion is not the same as clinical readiness.
Prepare the Target Workspace, FHIR Service, Network, and Security Controls
Azure Health Data Services uses a workspace model. Microsoft's Azure Health Data Services overview distinguishes the workspace and its FHIR service from the older standalone Azure API for FHIR resource. Deploy the target through repeatable infrastructure so region, workspace, FHIR service, identities, encryption, logging, networking, policy, and tags can be recreated and reviewed consistently.
Network migration deserves its own test. A private endpoint that resolves from an administrator's workstation does not prove that an integration engine, private build agent, vendor network, or analytics worker can reach the target. Recreate DNS, routing, firewall, proxy, and private-access rules from the actual client subnets. Verify both intended access and denied paths.
Microsoft documents Private Link for Azure Health Data Services as a mechanism for restricting access. Treat it as one layer in the boundary: identity, role assignment, endpoint exposure, storage permissions, and logging still require explicit configuration and negative testing.
Target control | Production requirement | Acceptance evidence |
Workspace/FHIR service | Infrastructure-as-code or repeatable deployment record | Recreated environment matches approved configuration |
Network | Approved public/private exposure, DNS, routing, firewall rules | Client-path tests from every critical network zone |
Encryption | Organization-approved platform or customer-managed key design | Key ownership, rotation path, and access test |
Logging/audit | FHIR access and platform logs routed to governed retention | Query proves expected events are captured |
Staging storage | Least-privilege import/export access and retention rule | Read/write test, lifecycle rule, cleanup owner |
Policy/backup | Required Azure Policy, recovery configuration, and monitoring | Compliance scan and recovery drill evidence |
Rebuild Identity, RBAC, and Authority Assumptions
Authorization behavior is a migration surface. A resource that exists in the target but is newly visible to an unauthorized client is a migration failure. So is a legitimate client that can no longer obtain a usable token because its issuer, audience, role, or tenant assumptions were copied incorrectly.
Microsoft's migration guidance states that Azure Health Data Services FHIR service does not support Azure API for FHIR local RBAC and custom authority in the same way, and that the token issuer authority must be the authentication endpoint for the tenant in which the FHIR service runs. The older service guidance describes scenarios where Azure RBAC or local RBAC could be used. Do not translate those configurations one-for-one.
This is where the principles in secure and scalable API design are relevant: explicit authentication, authorization, validation, and least privilege. The healthcare-specific requirement is to prove that each approved FHIR operation is allowed and that every disallowed operation fails safely for the correct reason.
Identity element | Source capture | Target migration action |
Issuer/authority | Tenant, authority URL, custom authority behavior | Use supported target authority and update token acquisition |
Audience | Resource URI or service-specific audience | Set and test target audience expected by FHIR service/client |
App registrations | Client ID, redirect URIs, owners, secret/certificate | Recreate or update with owned credentials and approved callbacks |
Managed identities/service principals | Object ID, role, resource scope | Assign least-privilege target roles and test denied operations |
Users/groups | Clinical/business role mapping | Map to target Azure roles and verify role changes/offboarding |
Emergency access | Break-glass identity and audit owner | Test controlled emergency path and evidence capture |
Replace Local RBAC and Custom Authority Dependencies
Build a permission matrix by actor and operation: read, search, create, update, conditional update, delete, history access, export, import, and administrative jobs. Run the tests with production-like identities, not a subscription owner. Include wrong-tenant, missing-role, expired-token, revoked-credential, and stale-group-membership cases.
No production cutover while any critical client still depends on the legacy authority or local-RBAC behavior.
No broad role assignment as a temporary migration shortcut unless it has a documented expiry and executive exception.
No secret copied without confirming owner, rotation date, storage location, and revocation path.
Every role migration must have both a positive test and a negative test.
Migrate Historical Data, Versions, and Referential Relationships
Decide what 'the data' means before moving it. FHIR current state, historical versions, soft-deleted resources, custom SearchParameter resources, provenance resources, audit logs, export artifacts, and downstream analytic copies are different objects with different migration behavior. The approved scope should list resource types and version-history requirements explicitly.
Microsoft's FHIR import documentation makes a critical distinction. Initial import is intended for an empty server, blocks API writes, retains only the latest version, and sets lastUpdated to import time. Incremental import can preserve versionId and lastUpdated when supplied in the input and can ingest multiple versions. If historical versions or original timestamps matter, an initial import by itself is not equivalent.
Preserve logical resource identifiers wherever the approved migration method allows, then validate references as graph edges, not strings. A MedicationRequest.subject reference that points to Patient/123 is only useful if Patient/123 exists, is the intended patient, and the calling application can resolve it under the target's authorization model. Include contained references, canonical references, version-specific references, and externally resolvable references in the test design.
Data class | Migration decision | Validation |
Current resource state | Included/excluded resource types and identifiers | Counts, hashes, representative content comparison |
Historical versions | All, bounded period, or latest only | Version counts, version IDs, lastUpdated behavior, history queries |
Soft-deleted resources | Preserve, transform, or intentionally exclude | History query and deletion-state verification |
References | Preserve IDs and resolvability | Broken-reference scan plus sampled semantic review |
Invalid resources | Repair, quarantine, or exclude | Exception ledger with owner and disposition |
Audit/operational logs | Usually migrated as evidence, not FHIR resources | Retention repository and retrieval test |
If a resource cannot be imported cleanly, do not silently coerce it. Quarantine the record with source identifier, resource type, version, validation error, decision owner, remediation status, and whether the exception affects a critical workflow. That ledger becomes part of rollback and decommissioning evidence.
Validate $export, $import, Incremental Copy, and Reconciliation
Bulk movement should be restartable and auditable. The source Azure API for FHIR export guidance uses $export to write newline-delimited JSON (NDJSON) to configured Azure Storage. The target's import path reads NDJSON from configured Blob Storage or Azure Data Lake Storage Gen2. Microsoft's import configuration guidance requires appropriate FHIR and storage permissions and documents network-access options for the import path.
Create a migration ledger for every run. At minimum record run ID, source watermark, export request, export completion, files and hashes, storage path, import request, mode, target completion status, errors, retry decisions, and reconciliation result. A rerun must be able to distinguish already accepted data from missing or failed data.
Stage | Evidence | Stop/rollback condition |
Export | Job ID, source watermark, manifest, file hashes, resource-type file list | Missing file, failed job, unexplained count gap |
Staging | Immutable or protected manifest, encryption, retention, access log | Unexpected principal access or changed file hash |
Import | Job ID, mode, input list, error output, completion status | Unsupported resource class or error rate above approved threshold |
Delta | Watermark logic, deduplication key, last successful run | Gap or overlap cannot be explained |
Reconciliation | Counts, versions, references, queries, exception ledger | Unresolved critical discrepancy |
Prove Counts, Versions, References, and Search Results
Resource counts are a first control, not the acceptance gate. Reconcile by resource type and partition where practical, then add version counts for history-bearing resources. Compute sample or full hashes only after normalizing fields whose values are expected to change. Run history queries for resources with known edits and deletions. Scan references for missing targets, then exercise the same reads through the authorization context used by applications.
Search parity needs a versioned corpus. Save representative and high-risk queries before migration: patient identifier lookup, date ranges, chained searches, include/revinclude, custom parameters, sorting, pagination, and clinically important cohort queries. Record result IDs and expected ordering only where ordering is part of the client contract.
Worked example: consider a hospital integration estate with a clinician SMART app, a lab-feed pipeline, a quality-report extract, and a FHIR store whose approved scope includes historical versions. Discovery finds that the lab pipeline writes continuously while the quality job can pause. The team chooses incremental copy. During rehearsal, counts match, but a history test shows only the latest Observation versions in the target. The cause is an import path that did not preserve versionId and lastUpdated metadata. Cutover is stopped, the affected staging set is rebuilt, incremental import is rerun with the required metadata, and history queries are reconciled again. Final evidence includes the corrected manifest, source and target history results, reference checks, search corpus results, and an approved exception list. The failure is caught before clinicians are switched because version history is an acceptance criterion, not a post-migration nice-to-have.
Counts by resource type and migration batch reconcile within approved, explained exceptions.
Historical-version scope is proven with history queries and version counts.
References resolve for critical workflows and sampled high-risk resources.
Search corpus results are semantically equivalent for required queries.
Every exception has an owner, business impact, remediation, and decommission decision.
Update Applications, SDKs, Endpoints, and Configuration
Application migration is a coordinated release, not a search-and-replace of the base URL. Change endpoint, audience, issuer, permissions, redirect URIs, certificates, secret references, DNS aliases, API gateway routes, timeouts, retry policies, health checks, metadata discovery, and deployment variables as applicable. Review SDK behavior where clients depend on service-specific headers, pagination links, bundle handling, or error responses.
Prefer configuration that allows a controlled switch and fast rollback without rebuilding the application. If a DNS alias or gateway abstraction is used, validate caching and propagation behavior. If clients call the service hostname directly, create a deployment plan by consumer and track exactly which version points to which FHIR endpoint.
The operational concepts in managing APIs in production apply here: observability, staged rollout, incident controls, and measurable client behavior. For this migration, add metadata, search, history, and clinical workflow evidence to the usual HTTP success and latency signals.
Application change | Test | Rollback asset |
Base endpoint | Read, write, search, metadata, history | Prior endpoint configuration and release version |
Token configuration | Correct issuer, audience, scope/role, tenant | Previous auth configuration and credential revocation plan |
SDK/client library | Status codes, pagination, bundles, retries, serialization | Pinned prior package and compatibility notes |
Network/DNS | Reachability from actual runtime path | Reversible routing/DNS change with TTL understood |
Health checks | Detect auth, data, and dependency failures | Legacy health endpoint until rollback window closes |
Deployment variables | Environment-specific values are complete and owned | Versioned configuration snapshot |
Replace SMART on FHIR Proxy Before Its Separate Cutoff
The SMART migration is a security and user-context change. Microsoft's legacy proxy page says the proxy retires on September 21, 2026. Microsoft's newer SMART on FHIR guidance describes native SMART support and identity-provider integration. Do not wait for the FHIR data cutover to discover which applications still depend on proxy-specific callbacks or token contents.
Inventory every SMART client by launch type, client ID, redirect URI, issuer, audience, requested scopes, patient/user/encounter context, token exchange behavior, session lifetime, logout behavior, and any proxy-specific customization. Capture both EHR launch and standalone launch where used. A launch that reaches the application's home page is not sufficient; prove that the correct patient and user context is present and that the app cannot silently switch to a broader data scope.
SMART element | Migration question | Acceptance evidence |
Launch URI/context | How is launch supplied and resolved? | Known patient/encounter/user cases produce expected context |
Redirect URI | Does the client still depend on proxy callback composition? | Registered direct/native callback succeeds |
Issuer/audience | Does token configuration match target? | Token inspection and FHIR API call succeed |
Scopes/roles | Are requested permissions enforced as designed? | Positive and missing-scope tests |
Session/logout | What happens after expiry or logout? | No stale access; reauthentication behaves safely |
Consent/admin approval | Who owns consent and app registration? | Documented owner and repeatable authorization setup |
Test Authorization, Launch Context, and Failure Paths
Run SMART tests with a purpose-built matrix. Include a valid patient launch, valid practitioner launch, standalone launch if supported, wrong tenant, wrong audience, expired token, revoked token or credential, missing scope, unconsented client, invalid redirect URI, missing launch context, mismatched patient context, and emergency-access path if the application supports one. Record token claims only in a protected evidence store and redact secrets.
Positive: intended clinician and patient context produce only the approved data and workflow.
Negative: wrong tenant, missing permission, or invalid context fails without leaking patient data.
Expiry/revocation: stale tokens or credentials no longer authorize FHIR calls.
Context integrity: the patient displayed by the app matches the patient context delivered through the SMART flow.
Audit: authorization success and denial can be correlated to user, client, time, and target service.
Recreate Search Parameters, Events, Jobs, and Analytics Integrations
Data transfer can finish while operational behavior is still incomplete. Recreate custom SearchParameter resources, then run and monitor reindex operations before declaring those searches production-ready. Microsoft's selectable search parameters guidance notes that selectable search parameters can change which built-in indexes are enabled, and its reindex guidance warns that reindexing can be performance intensive. Schedule it with the same care as import.
The target supports Azure Health Data Services events, which can publish change notifications through Azure Event Grid. That is not a reason to assume an old proxy-based event integration is equivalent. Compare event type, payload, ordering assumptions, retry behavior, dead-letter handling, idempotency, and downstream side effects. Run end-to-end tests through the consumer, not only a platform event test.
For analytics, update pipelines, linked services, schemas, and refresh schedules, then reconcile outputs. Azure analytics and data integration provides broader platform context, but the migration gate remains FHIR-specific: downstream data must still represent the intended resources, versions, references, and time semantics.
Dependency | Recreate/compare | Production evidence |
Search parameters | Definitions, status, enabled indexes, reindex state | Saved query corpus passes |
Events | Event source, filters, retry, dead-letter, consumer identity | Create/update/delete tests reach downstream exactly as designed |
Scheduled jobs | Export, cleanup, validation, reindex, monitoring | Run history and alert ownership |
Analytics | Endpoint, extract logic, schema, watermark, version semantics | Reconciled dataset and refresh result |
Metadata | Capability statement and client discovery | Automated diff reviewed and approved |
Operational dashboards | Latency, errors, auth, import, search, event delivery | Target dashboards active before cutover |
Rehearse Cutover, Freeze, Delta Capture, and Rollback
A cutover should be rehearsed as a timed operational procedure with named decision authority. The sequence differs by migration pattern, but both need a clear moment when the source stops being authoritative for new writes. For lift-and-shift, that may be the start of the write freeze. For incremental copy, it is the start of final delta capture and the point after which unresolved dual writes become unacceptable.
Define rollback as a data decision, not just an endpoint switch. If writes have reached the target after the switch, returning clients to the source without reconciling those writes can lose or duplicate clinical data. Your rollback window therefore needs rules for whether writes are blocked, mirrored, queued, or reconciled back to the source. If safe reverse reconciliation is not possible, the rollback strategy may be isolation and repair on the target rather than reactivating the source for writes.
Phase | Action | Go/no-go evidence |
T-minus 30 to 7 days | Freeze configuration, complete rehearsal, close critical defects | Approved test pack, support capacity, owner roster |
T-minus 24 hours | Confirm source health, target capacity, credentials, storage, dashboards | No unresolved severity-one migration issue |
Cutover start | Write freeze or final delta capture; stop scheduled conflicting jobs | Source watermark and freeze confirmation |
Switch | Apply endpoint/routing/application configuration changes | Identity, metadata, read/write/search smoke tests |
Validation window | Run clinical workflows, reconciliation, event and analytics checks | All mandatory gates pass |
Rollback decision | Use predefined authority and data-safe rollback method | Affected writes identified and recoverable |
T-plus | Resume jobs, monitor, retain rollback assets until acceptance | Executive/clinical sign-off and stable observation period |
Run the rehearsal with the same people who will execute production: FHIR platform, application owners, identity/security, network, data migration, operations, clinical/business validators, compliance, and the executive risk owner. A runbook that works only for its author is not a runbook.
Observe Clinical and Operational Integrity After Cutover
Post-cutover monitoring must answer two questions at once: is the platform healthy, and are clinical workflows still semantically correct? A 99.9 percent HTTP success rate can coexist with a wrong patient context, missing historical information, incomplete search cohort, or lost downstream event. Combine platform telemetry with workflow validation and reconciliation signals.
Track request success, latency, authorization denials, token failures, search differences, missing references, import exceptions, event-delivery gaps, analytics refresh failures, queue backlogs, and user-reported clinical impact. Compare to an approved pre-cutover baseline where meaningful, but do not turn historical behavior into a requirement if the target intentionally improves it. The decision record should distinguish expected change from defect.
Signal | Owner question | Escalation trigger |
Authorization failures | Are valid users/apps denied or invalid actors allowed? | Unexpected allow or sustained critical denial |
Search parity | Do saved clinical/business queries return the required set? | Missing or extra clinically material resources |
Reference integrity | Do linked resources resolve in target context? | Broken critical reference or wrong patient relation |
Events/jobs | Are downstream workflows receiving changes exactly as designed? | Gap, duplicate side effect, or stalled consumer |
Latency/errors | Is performance within approved service objectives? | Sustained breach affecting clinical workflow |
User reports | Are clinicians seeing missing, stale, or wrong context? | Any credible patient-safety concern |
Define Patient-Safety and Data-Integrity Stop Conditions
Stop conditions should be written before the change window, with authority to act. The incident commander should not have to debate whether a wrong patient banner is serious enough to stop traffic. Immediate stop, isolation, or rollback review is warranted for missing or incorrect patient context, altered clinical results, unauthorized data exposure, unresolved critical resource differences, unexplained reference failures, or a rollback path that is no longer data-safe.
Missing or incorrect patient, encounter, practitioner, or user context in a clinician-facing workflow.
Clinically material search results differ without an approved semantic reason.
Unauthorized read or write succeeds, or an approved critical identity cannot be restored promptly.
Historical/version behavior required by the workflow is absent or inconsistent.
References resolve to the wrong resource, fail at scale, or create ambiguous patient linkage.
Rollback would overwrite or discard accepted post-cutover writes and no safe reconciliation path exists.
For every stop, preserve timestamps, request IDs, resource identifiers, affected client version, token metadata necessary for investigation, configuration versions, and the exact recovery action. Patient-safety review, security incident handling, and technical root-cause analysis may have different evidence-retention requirements; coordinate them rather than letting one cleanup destroy another team's evidence.
Decommission Azure API for FHIR and Preserve Audit Evidence
Decommissioning is the final migration control. Do not delete the source as soon as application traffic drops to zero. First prove that no scheduled job, integration engine, vendor client, SMART callback, analytics pipeline, or break-glass process still depends on it. Confirm that the target has passed the agreed observation period and that the rollback decision has formally expired or changed to target-side recovery.
Then shut down in layers: stop source pipelines and jobs, remove routing and DNS references, revoke legacy app permissions and credentials, remove private endpoints and firewall rules no longer needed, clean migration staging data according to retention policy, archive reconciliation evidence, and decommission the Azure API for FHIR resource according to approved change and records-management procedures. Keep only the evidence required for audit, legal, security, and operational learning.
Decommission item | Owner | Closure evidence |
Applications and pipelines | Application/integration owners | No target points to legacy endpoint; scheduled jobs disabled |
Identity | Security/identity | Legacy roles, secrets, certificates, and app permissions revoked |
Network | Cloud/network | DNS, private endpoints, firewall rules, gateway routes removed or repurposed |
Staging data | Data/compliance | Retention decision executed and access removed |
Audit packet | Migration owner | Manifests, tests, exceptions, approvals, cutover and rollback decisions retained |
Legacy service | Platform owner | Resource decommissioned after executive/clinical acceptance |
Post-deadline remediation needs a separate path because Microsoft states that after September 30, 2026 the retired service cannot be accessed through the portal or APIs and is no longer supported. If a dependency is discovered late, treat it as an incident: identify what data and behavior the dependency expected, locate retained migration evidence or downstream copies, rebuild against the Health Data Services FHIR service, run the same authorization and semantic tests, and obtain explicit business acceptance for any data that cannot be reconstructed. Do not quietly point the missed client at the target and assume equivalence.
A durable evidence packet should include the estate inventory, source and target configuration snapshots, support cases, manifests and hashes, import/export job records, exception ledger, version and reference reconciliation, search corpus results, identity and SMART test results, application release versions, cutover timeline, stop/rollback decisions, monitoring evidence, and final decommission approvals. That packet is what lets a later auditor or incident responder explain not only that the migration happened, but why it was safe to retire the source.
A zero-surprise Azure API for FHIR migration ends when the team can prove clinical and operational equivalence for the scope it approved. Resource and version counts reconcile; historical behavior is preserved where required; references resolve; critical searches return the expected clinical meaning; applications use the intended Health Data Services endpoint and authority; SMART workflows pass both positive and negative authorization tests; events, jobs, and analytics are functioning; patient-safety stop conditions have named owners; and rollback or target-side recovery remains safe until the acceptance window closes.
The permanent lesson is that a FHIR service retirement is an API contract, identity, data-history, and clinical workflow migration at the same time. If a missed dependency appears after retirement, use the retained ledger and evidence to rebuild it deliberately rather than guessing at source behavior. Teams strengthening the underlying REST, authentication, authorization, integration, testing, logging, versioning, performance, and API-security foundations can review the Refonte Learning APIs Developer Program. The program is a three-month API-development program at roughly 10 to 12 hours per week with basic programming knowledge recommended; it is not presented as FHIR, SMART on FHIR, Azure Health Data Services, or healthcare-compliance training.
