Epic FHIR Integration: 7 Patterns for Third-Party Apps

Seven Epic FHIR integration patterns for third-party apps, from SMART registration to FHIR write via SDC $extract.

Epic's FHIR API is the most widely-supported integration surface in US healthcare. Seven patterns cover essentially all third-party integration work.

Pattern 1: SMART app registration and launch. Register app in Epic App Orchard; users launch via SMART on FHIR. Standard OAuth 2.0 flow.

Pattern 2: Patient context via launch. Epic launches app with patient=, encounter=, user= context. App reads these Patients via FHIR.

Pattern 3: US Core-conformant reads. Epic exposes US Core profiles for Patient, Encounter, Observation, Condition, MedicationRequest, and more.

Pattern 4: Bulk data export for population analytics. Epic supports Bulk Data IG $export for Groups and Patients.

Pattern 5: CDS Hooks integration. Third-party CDS services registered with Epic; fire at patient-view, order-select, order-sign.

Pattern 6: SMART Backend Services for system-scope access. Server-to-server integrations without user context. JWT assertion + client credentials.

Pattern 7: FHIR write via SDC extraction. SDC-based form results extracted into Observation, Condition; written back to Epic chart.

Common Epic integration mistakes

1. Assuming write access from day one — read/write scopes require Epic-side configuration. 2. Not registering CORS domains — SMART launch silently fails. 3. Testing against sandbox with different scopes than production. 4. Missing rate limit handling — Epic returns 429. 5. Skipping App Orchard security review — required for external distribution.

Epic FHIR API details

Epic's FHIR API supports R4 with US Core profiles. Documentation at fhir.epic.com. Sandbox for development; production requires signed App Orchard agreement.

Rate limits (typical production)

Scope Rate limit
patient/* 60 req/min
user/* 100 req/min
system/* 1000 req/min
Bulk export 1 concurrent

Epic FHIR integration is well-defined but has vendor-specific quirks. Get through App Orchard once; then future integrations use the same pattern.