
Picking a FHIR client SDK in 2026 is a small decision that compounds across every integration you write. The mature options span six ecosystems, and the tradeoffs — validation strictness, terminology binding support, streaming for bulk data — matter more than the API ergonomics.
JavaScript / TypeScript: fhirclient.js and Medplum SDK
The fhirclient.js library from SMART Health IT is the reference implementation for SMART on FHIR launches — auth, patient context, scope handling all handled. Best for launched-from-EHR apps. The Medplum SDK is the more modern alternative if you're standing up your own FHIR backend; it ships typed TypeScript definitions for R4 and R5, plus first-class SubscriptionTopic support.
Java: HAPI FHIR client
The HAPI FHIR client library is the venerable option — R4 and R5 support, generic and fluent APIs, validation against StructureDefinition, and terminology-server integration for $validate and $expand. Best for enterprise Java stacks, and for teams building on top of HAPI JPA anyway. Heavier than JS SDKs but batteries-included.
Python: fhir.resources
The fhir.resources library provides Pydantic-based typed models for R4 and R5. Best for data-science and pipeline work where you're loading NDJSON exports and doing transformations. It's not a full client — no auth, no request handling — but pairs well with requests for straightforward FHIR I/O.
.NET: firely-net-sdk
The Firely .NET SDK is the canonical .NET option — R4/R5 support, strong validation, terminology integration. Best if your organization is Microsoft-stack or building on top of the Microsoft FHIR Server (Firely's client works cleanly against it).
Go: fhir
The Go fhir package provides R4/R5 typed structs. Best for high-throughput backend services where Go's concurrency model matters and you don't need $validate inline. The ecosystem is smaller than Java/JS but the codegen quality is good.
Rust: fhirtree
Rust SDK support is thinner — fhirtree is the most active R4 option in 2026. Worth considering for embedded / edge deployments (medical device integration) where Rust's memory profile matters, but expect more DIY.
Feature matrix (mid-2026)
| SDK | R4 | R5 | Validation | Terminology $expand | Bulk export | Streaming |
|---|---|---|---|---|---|---|
| fhirclient.js | Yes | Partial | Basic | Via server | No | No |
| Medplum SDK | Yes | Yes | Full | Basic | Yes | Yes |
| HAPI FHIR client | Yes | Yes | Full | Full | Yes | Yes |
| fhir.resources | Yes | Yes | Pydantic | External | Manual | No |
| Firely .NET SDK | Yes | Yes | Full | Full | Yes | Yes |
| Go fhir | Yes | Yes | Basic | External | Manual | No |
| Rust fhirtree | Yes | Partial | Basic | External | No | No |
The practical rule: pick the SDK that matches your language of least resistance, and confirm three things before committing — R4 completeness, $validate support (for CI conformance checks), and whether bulk export is native or you're wrapping HTTP yourself. Everything else is API preference.