HAPI FHIR implementation plan and cost

A HAPI FHIR implementation is driven by the FHIR version and profiles you need, whether you use the JPA server starter or a custom build, your database, and how security is designed. This page shows what the work includes, what moves cost and duration, and what you must provide.

On this page

What a HAPI FHIR implementation involves

A HAPI FHIR implementation starts with a set of decisions, not with installation. HAPI FHIR is a Java API for HL7 FHIR clients and servers, licensed under the Apache Software License 2.0, so the license cost is zero but every other part of a working server is your responsibility. The JPA server starter gives you a complete RESTful FHIR server backed by a database, and it can be deployed as a Docker image, with Docker Compose, with Spring Boot, as a WAR on Tomcat, Jetty or Wildfly, or on Kubernetes with a Helm chart. Choosing among these packaging options, and deciding whether a custom build is needed instead, is the first scoping question.

The core decisions are the FHIR version, the profiles you must conform to, the database, hosting and security. The JPA server documentation covers DSTU2, DSTU3, R4, R4B and R5, so confirm which versions your trading partners, registries or internal consumers actually send and expect before choosing. Profiles, such as national or regional implementation guides, determine validation rules and custom resources. The starter defaults to an embedded H2 database, supports PostgreSQL and Microsoft SQL Server for production, and does not support MySQL. Confirm the database your organization can operate, back up and patch, and confirm the JDK version the chosen release requires (HAPI FHIR 8.2.0 requires JDK 17).

Several situations usually trigger this work: a new clinical data platform, the replacement of a closed or legacy FHIR server, or a regional data exchange where several organizations share records. Each has a different starting point. A replacement project often inherits data and integrations that shape the version and profile choices, while a regional exchange raises partitioning and access questions early. Security is the area most often underestimated. HAPI FHIR does not provide a single security layer, so authentication, authorization, consent, audit logging and network controls must be designed and built around it.

Most teams decide between in-house and partner delivery by looking at Java and FHIR skills. If your engineers already run Java services on Spring or Tomcat and understand FHIR resources, profiles and search, an internal build is realistic. If those skills are thin, a fixed-scope partner engagement with a written list of decisions, deliverables and acceptance tests usually costs less risk than learning on a clinical system. Either way, write down the FHIR version, profiles, database, hosting model and security design before asking for a quote, because those choices drive most of the effort.

What the implementation includes

A typical engagement moves through six work packages, each ending in a named deliverable you keep. The cards show what each package decides and what you receive at the end.

Requirements and FHIR version selection

Scope the resource types, interactions and interfaces the server must expose, then choose the FHIR version: DSTU2, DSTU3, R4, R4B or R5, all covered by the JPA server documentation. Confirm which version your partner systems and certification targets use. You receive a signed decision record with the version, resource scope and open questions.

Profile and terminology design

Define the StructureDefinitions, implementation guide structure and ValueSets your data must conform to, and decide which code systems the terminology services will host. Each profile is tested against sample resources before it is loaded. You receive the profile and terminology package in version control, with a note on which items come from published guides and which are local.

Deployment on the chosen runtime

Build the server on the runtime your operations team already runs: the hapiproject/hapi Docker image, Docker Compose, Spring Boot, a WAR on Tomcat, Jetty or Wildfly, or Kubernetes with the Helm chart. Confirm the JDK version against the release you pick, since HAPI FHIR 8.2.0 requires JDK 17. You receive a deployed non-production environment and the configuration as code that rebuilds it.

Database setup on PostgreSQL or SQL Server

The starter defaults to an embedded H2 database, which is not a production choice. Set up PostgreSQL or Microsoft SQL Server, with schema initialization, connection pooling, backups and service accounts defined for your platform. MySQL is not supported by the starter. You receive provisioning scripts, the connection configuration and a documented backup and restore procedure.

Security design for health data

HAPI FHIR does not ship a single security layer. Design the authentication interceptors, AuthorizationInterceptor rules, CORS policy, consent and search narrowing, and BALP audit logging around your identity provider and data sensitivity. Decide which operations and the testing UI stay enabled in each environment. You receive a security design document with an authorization matrix and open risks.

Validation, testing and handover

Test the server against FHIR conformance expectations, your profiles and the integration flows it serves, then repeat those tests after each configuration change. Write the runbook covering start-up, monitoring, backups and incident steps. You receive test evidence, the runbook and a handover session with the operators who will run the service.

What drives cost and duration

This table lists the decisions and conditions that move HAPI FHIR implementation effort, why each one matters, and how to keep it manageable, so you can compare quotes against the same scope.

DriverWhy it moves effortHow to keep it down
Number and complexity of FHIR resource types and profilesEach resource type and profile needs mapping rules, validation profiles, search parameters and test cases. Custom profiles with extensions and slicing take longer to specify and verify than base resources.Start with the resource types your first use cases need. Reuse published base or implementation guide profiles where they fit, and defer custom extensions until a use case requires them.
FHIR version (DSTU2, DSTU3, R4, R4B or R5)The version sets the resource structures, search behavior and the implementation guides you can use. Clients and partner systems that speak different versions add translation and test work.Confirm the version your partners and regulators expect before design starts. Avoid mixing versions in one server without a written reason.
JPA starter versus custom buildThe JPA server starter covers much of the standard server behavior, so effort goes into configuration and extensions. A custom build means owning server behavior, persistence and upgrade paths, which raises build and maintenance work.Use the starter as the base and limit changes to interceptors and configuration. Record every departure from the starter so upgrades can be tested against a known list.
Custom operations or interceptorsCustom operations, interceptors and providers each need design, code review, tests and regression checks on every HAPI FHIR upgrade. Business rules placed in interceptors are often the largest source of unplanned work.Write down each custom behavior as a requirement before coding. Keep the count small, keep interceptors single-purpose, and build automated tests for each one.
Terminology and validation requirementsCode system loading, value set expansion, external terminology services and strict profile validation add configuration, data loading and performance testing. Validation rules that reject real partner data can drive rework late in the project.Agree which code systems and value sets are required and where they come from. Test validation against real sample messages from each partner early.
MDM and partitioning needsMaster data management matching and partition design change the data model, search behavior and testing scope. Partitioning for tenants, data sources or regions must be designed before data is loaded, and changing it later is costly.Decide whether MDM and partitioning are needed for the first release. If they are, design partition keys and matching rules in a written design document and test them with representative data.
Identity integrationAuthentication through your identity provider, authorization rules and consent handling each need separate design and testing. HAPI FHIR does not supply a complete security layer, so identity work is custom work.Use one identity provider for all clients and document the scopes or roles each client needs. Limit the authorization rules to the resource types and operations in scope.
Number of environmentsEach environment needs its own database, configuration, certificates, data subsets and deployment pipeline. Test, validation and production environments often multiply setup and maintenance work.Keep environments consistent through infrastructure as code and a single container image. Limit the number of non-production environments to those that are used for specific tests.
Hosting model (cloud, data center or air-gapped)Air-gapped and data center hosting means you supply the container images, packages, certificates and time sources offline, and some tooling needs manual handling. Cloud hosting shifts work to managed services but adds network and key management design.Confirm the hosting model and its constraints before scoping. Prepare an internal artifact repository for images and dependencies if the environment is isolated.
Data volume and performance targetsSearch performance, indexing and database sizing depend on resource counts, search patterns and concurrency. Performance tests and tuning cycles grow with the targets set and the data volume loaded.State expected volumes, the top search patterns and response targets in the scope. Test with data at realistic volume early so tuning does not happen at the end of the project.
Compliance evidence requirementsAssessors look for documented controls, access records, audit logs, change records and test results. Producing this evidence for a FHIR server adds documentation, logging configuration and test work that many teams underestimate.Ask which controls and evidence your auditor or certification body expects before scope is written. Plan audit logging and change records from the start, and confirm with your assessor what counts as sufficient evidence.

Project phases and outputs

The sequence moves from agreed requirements to a tested, documented HAPI FHIR server handed over with a production runbook.

  1. Run discovery and agree requirements

    We review your clinical use cases, the FHIR version and profiles you need, data volumes, integrating systems and hosting constraints with your clinical informatics and security leads. The output is a set of signed-off requirements listing in-scope resources, interfaces and operational expectations. The step closes when your sponsor signs the document.

  2. Scope the build and fix the timeline

    We turn the requirements into a written scope covering the HAPI FHIR release and JDK version, profile and terminology work, the server approach, and the deliverables for each phase. Durations for every phase are set in that written scope, so the timeline is agreed before work starts. The step closes when the scope is accepted in writing.

  3. Decide architecture and database

    We compare the JPA server starter with a custom build, choose the deployment model and select PostgreSQL or Microsoft SQL Server with the reasons recorded. The output is an architecture decision record covering hosting, database, partitioning needs and integration points. The step closes when your architecture owner approves the record.

  4. Build the server and profiles

    We configure or build the server, load the chosen FHIR version and profiles, and set up terminology and validation behavior. Custom interceptors and operations are built here if the scope includes them. The output is a deployed non-production environment that your team can query, with build and configuration committed to version control.

  5. Design and configure security

    We design authentication, the AuthorizationInterceptor rules, TLS, network placement, secrets handling and audit logging using the building blocks HAPI FHIR provides. Controls are mapped to your policy and configured in the non-production environment. The step closes with a security design document reviewed by your security team.

  6. Test functionality and performance

    We run conformance and functional tests against the signed-off requirements, then load tests at the volumes agreed in discovery. Failures are logged, fixed and retested. The output is a test report listing results, open defects and accepted risks, which your sponsor reviews before go-live.

  7. Deploy to production and hand over

    We deploy to production in the environment you control, run a cutover checklist and confirm monitoring and backups work. We then deliver a production runbook covering start-up, upgrades, backups, restores and escalation, and train your operators on it. The step closes when your team signs the handover checklist.

What teams keep in-house and what they outsource

This table compares the clinical and governance work that informatics teams usually keep with the engineering work often outsourced, along with the skills each part needs, so you can see where your own staff are essential and where a partner or vendor support may fit.

Work areaUsually kept in-houseOften outsourcedSkills each side needs
Clinical contentChoosing which FHIR resources and data elements the organization uses, and agreeing what clinical meaning they carryNot usually outsourced, though an implementer may advise on how resources map to source dataClinical informatics, FHIR modeling, knowledge of your source systems
Profile ownershipOwning StructureDefinitions, implementation guides and version decisions after go-liveInitial profile authoring and validation setup, handed over with documentationFHIR modeling, FHIR profiling and validation tooling, Java for custom validators
Business rules and access policyDeciding who may read or write which data, consent rules and retention periodsCoding the authorization and consent interceptors that enforce those decisionsPrivacy and security policy, Java and Spring, HAPI FHIR interceptor APIs
Data stewardship and sign-offApproving data quality thresholds, reconciliation results and go-live readinessBuilding reconciliation scripts and reporting that produce the evidence for sign-offData governance, SQL, FHIR resource validation
Server build and Java configurationSetting requirements and reviewing the design and version choiceBuilding the JPA server from the starter or a custom project and configuring it for your needsJava and Spring, the HAPI FHIR JPA server, JDK 17 for HAPI FHIR 8.2.0 and later
Database setupApproving the database engine, backup targets and recovery objectivesProvisioning PostgreSQL or Microsoft SQL Server, schema setup and tuningPostgreSQL or SQL Server administration, backup and point-in-time recovery
Deployment automationOwning the target platform, change approval and production accessWriting Docker, Helm or WAR deployment pipelines and environment configurationKubernetes, Docker, Helm, CI/CD tooling
Security configuration and auditDefining the threat model, audit retention and who reviews BALP audit logsConfiguring TLS, identity integration, audit logging and locking down the testing UIIdentity and access management, TLS, audit logging, security testing
Test automation and supportAcceptance criteria and clinical test cases, plus decisions on upgradesRegression suites for custom interceptors and upgrade testing, with commercial support from Smile CDR as an option to evaluateTest automation, Java, HAPI FHIR release notes, and a vendor support comparison

What usually goes wrong

Most HAPI FHIR problems trace back to decisions made early, before data, clinical requirements and environment limits are understood. Each risk below has a prevention step you can write into the scope.

Fixing the FHIR version too early

Teams often pick FHIR DSTU3, R4, R4B or R5 and a profile set before the clinical data and exchange partners are known. HAPI FHIR's JPA server covers several versions, but the choice shapes resource models, validation and what partners can send. Require a written requirements review that confirms version and profiles before the build starts.

Keeping the H2 default in production

The JPA server starter defaults to an embedded H2 database, which is suited to testing rather than live clinical traffic. Production needs PostgreSQL or Microsoft SQL Server, and MySQL is not supported. Require the scope to name the production database, its sizing, backups and a documented migration off H2 before go-live.

Treating HAPI FHIR as a complete security layer

HAPI FHIR states it does not provide one security layer. It supplies building blocks such as authentication interceptors, AuthorizationInterceptor rules, consent and search narrowing, CORS and BALP audit logging. Require a security design that maps each control to a requirement, with an identity provider, authorization rules and audit coverage all in scope.

Underestimating terminology and validation work

Code systems, value sets, profile validation and terminology services often take more effort than the server installation itself. Load errors and rejected resources usually come from unmapped codes or profiles that were never loaded. Ask for an inventory of code systems and profiles, the sources they come from, and a named owner for each.

Unclear partition design

JPA partitioning assigns each resource to a partition, which can separate tenants, data sources or regions. Choosing partitions after data is loaded makes access rules and reporting harder to change. Require a partition model written before build, covering the partition key, how requests select a partition and how cross-partition queries are handled.

Skipping performance tests on realistic volumes

A server that responds well with sample data can slow sharply under production resource counts, search patterns and concurrent clients. Database indexing and search parameters both affect response times. Require load tests using data volumes and query mixes agreed in the scope, with results recorded before the go-live decision.

How the work changes by starting point

A greenfield server for one application has a narrow scope and few inherited constraints. The work centers on fixing the FHIR version, the resources and profiles the application needs, and the deployment path.

  • Scope: one FHIR version, one set of profiles and one consuming application, recorded in a written interface specification.
  • Database: PostgreSQL or Microsoft SQL Server for production. The embedded H2 default suits evaluation only, so confirm the engine before the build starts.
  • Security: design authentication in front of the server and select the AuthorizationInterceptor rules. HAPI FHIR supplies building blocks, so the access model is your design work.
  • Testing: conformance checks against the agreed profiles and load tests sized to the application's read and write pattern.
  • Decide first: the FHIR version, the JDK version required by the release you select (the versions page lists JDK 17 for 8.2.0), and the database engine.

What you need to provide

Before a HAPI FHIR scope can be fixed, the client has to name owners who can make decisions. Assign a clinical owner and a business owner for requirements and profiles, since they decide which resources, extensions and search parameters the server must support. Also name the people who choose the FHIR version and edition. The supplied facts cover DSTU2, DSTU3, R4, R4B and R5, and the choice drives profile design, validation and client compatibility, so it should be settled early.

Supply a representative sample of data and the use cases that will run against it. Include example messages or extracts from the source systems, the queries clinicians and applications actually issue, and the volumes you expect. Also provide hosting access and a network design: the target cloud account, data center or air-gapped network, ingress path, and which systems are allowed to reach the FHIR endpoint. Confirm whether an existing database or identity service must be used, because that decides whether the team runs PostgreSQL or Microsoft SQL Server and how authentication is wired in.

Provide your security and privacy policy, along with the compliance obligations that apply to the data, such as health privacy rules, retention periods and audit expectations. These documents set the requirements for authorization rules, audit logging and data separation. Confirm also that a dedicated test environment exists, with non-production data and the same database engine as production. Without it, validation and regression testing cannot be run safely.

Settle ownership before handover. Confirm in writing who owns the server, its configuration, its database and its code, and who holds the keys and credentials. Also decide who will run Java and framework upgrades, database schema changes and on-call support after go-live. Ask the implementation partner to document these responsibilities in the handover pack so that the internal team knows what it inherits.

Frequently asked questions

How much does a HAPI FHIR implementation cost and what drives the quote?

The quote follows from a written scope, so cost depends on the decisions made before the build starts. The main drivers are the FHIR versions and profiles in use, whether the JPA server starter covers your needs or a custom build is required, the number of custom interceptors and integrations, the database and hosting platform, security design including identity integration and audit logging, and the volume of data to migrate. DeployOpen does not publish a price list. Ask for the quote to separate one-time work such as scoping, build, testing and handover from recurring work such as support and upgrades.

Can our team build a HAPI FHIR server alone using the open-source packages?

Yes, the packages are licensed under the Apache Software License 2.0, so the software itself carries no license fee. The work is still substantial: Java engineering on the JDK version the release requires (HAPI FHIR 8.2.0 requires JDK 17), database operations, TLS, identity integration, audit logging, regression testing and ongoing upgrades. Check whether your team has these skills in-house and how many people can maintain the server over time. The HAPI FHIR README also points to Smile CDR for commercial support if you want a vendor for that part.

Should we choose PostgreSQL or SQL Server for HAPI FHIR, and why not MySQL?

Choose PostgreSQL or Microsoft SQL Server. The JPA server starter supports both for production use, and MySQL is not supported. Base the choice on the database your organization already operates and can back up, patch and restore, along with the skills your DBAs have. The starter defaults to an embedded H2 database, so plan the production database build, high availability, backup and restore testing as part of the scope from the start.

Which FHIR version should we pick: DSTU2, DSTU3, R4, R4B or R5?

Pick the version that your partner systems, implementation guides and sector requirements use, and confirm it before scoping. The HAPI FHIR JPA server documentation covers DSTU2, DSTU3, R4, R4B and R5. Start by listing the systems you must exchange data with, the profiles they expect and any national or regulatory requirements that apply to you. Supporting more than one version is possible, but it adds mapping, validation and testing effort, which will show up in the quote.

Is the JPA server starter enough, or do we need a custom build?

The starter is enough when your needs fit its standard server: FHIR REST operations, a supported production database, and the built-in terminology, validation and partitioning features that match your use case. A custom build is usually needed when you require bespoke operations, custom interceptors, unusual authorization or consent logic, or packaging inside your own Spring Boot application. Deployment shape is a separate decision, since the starter can run as a Docker image, with Docker Compose, with Spring Boot, as a WAR or on Kubernetes with Helm. List every custom interceptor and integration before choosing.

Does the work include security certification for our environment?

No. DeployOpen does not issue certifications, audit reports or attestations. Within scope, DeployOpen can prepare the controls, configurations and evidence that an assessment will examine, such as access control design, TLS settings, audit logging and backup records. HAPI FHIR provides building blocks rather than a complete security layer, so that design has to be planned explicitly. Independent auditors and certification bodies perform the assessment and issue any attestation. Ask your assessor which control IDs and evidence they expect, and include that list in the written scope.

How DeployOpen scopes and delivers HAPI FHIR work

DeployOpen plans and builds HAPI FHIR servers inside your own infrastructure, starting from written decisions on FHIR version, profiles, database and security. Each stage ends with documented choices your team can review before the next one begins.

How we scope

  • Confirm the FHIR version, resource types and profiles the server must support before any build starts.
  • Choose between the JPA server starter and a custom build, and record the reasons in writing.
  • Agree on PostgreSQL or Microsoft SQL Server as the production database, with the H2 default excluded from production use.
  • Define the written scope, deliverables and timeline in a fixed-scope agreement before work begins.

How we build

  • Set up the chosen deployment method, such as Docker, Spring Boot, a WAR on Tomcat, Jetty or Wildfly, or Kubernetes with Helm.
  • Design the security layer from HAPI FHIR building blocks, including authentication interceptors, AuthorizationInterceptor rules and audit logging.
  • Plan partitioning if data must be separated by tenant, source system or region, and test those boundaries.
  • Test the server against agreed FHIR conformance checks, custom interceptors and representative clinical data loads.

How we hand over

  • Deliver architecture decisions, configuration records and deployment runbooks that your engineers can follow.
  • Document the Java version, database schema, interceptor logic and upgrade constraints for the running release.
  • Run a handover session with your platform, security and integration teams to confirm ownership of each component.
  • Provide test evidence and control documentation so your compliance team and external auditors can review the system.

How we support

  • Offer ongoing support, upgrades and continuous testing as a retainer after the initial build is accepted.
  • Plan upgrades across HAPI FHIR releases and Java requirements, with regression testing for custom interceptors.
  • Confirm with your team whether commercial support from Smile CDR is needed alongside a DeployOpen retainer.
  • Review security configuration and audit logs on a schedule agreed in the retainer scope.

Sources and further reading

Talk to our team.

Tell us what you're working on, whether it's a deployment, an audit, a security test or a cyber range. You'll speak with an engineer who can help you scope it.

  • 30-minute call: free, with no obligation.
  • NDA on request: we can sign before you share details.
  • Clear next steps: a scope and plan after the call.