Client and Context
Client details anonymized under NDA
A healthcare SaaS platform that aggregates clinical data from multiple healthcare organizations and supports more than one EHR system.
Its customers do not all run the same EHR, so support for each additional vendor is a commercial requirement rather than a technical preference.
The Challenge
The platform was widening its EHR support, and a share of the incoming healthcare organizations ran Oracle Health. Adding a vendor is where this kind of product quietly becomes two: a second architecture, a second set of assumptions, a second thing to maintain — each one a copy of work already done, and diverging from the original the moment either changes.
Underneath that, the per-connection work was manual. For every new organization the engineering team checked by hand which resources were actually available, how search behaved on each one, what access rights had been granted, and which API quirks applied this time. None of it is visible to a customer, and all of it sits between signing an organization and its data being usable — so the waiting lands on the people who need the data, not on the team doing the checking.
The requirement was to add Oracle Health as another supported EHR without building a wholly separate architecture for it, and without that per-connection investigation starting over every time.
Why Oracle Health?
Oracle Health wasn’t a choice either. It runs in a substantial share of US health systems, and an integration adapts to the installed system rather than the other way round.
That determines the endpoint persona, how scopes are granted, which constraints are fixed at registration, and who has to approve the connection before data moves.
Our Approach
The same five stages described on our EHR Integration page:
Sandbox verification → access alignment with the organization → build → production readiness → go-live.
Sandbox Verification
Account, application registered through the vendor console, endpoints discovered at runtime, and a verified authenticated read against a synthetic test patient. No production environment, no real patient data at any point.
Access Alignment
Each customer decides whether the application runs in their environment, domain by domain, and Oracle Health states it validates and registers every provider-facing SMART application. Sandbox results have no influence on either decision, so that conversation starts in parallel with development.
Build
Read paths against the resources the product needs, with search behavior, response volume and error handling verified per resource rather than assumed from what the API advertises. The technical approach is ours; access rights and the production connection are agreed with each healthcare organization.
Production Readiness
Separate service addresses and credentials, access rights per organization, audit logging, monitoring, defensive handling of large responses, and security review.
Go-live
Go-live, on the organization’s timetable.
A working sandbox integration proves the protocol works. It is not production readiness.
Technical Solution — Oracle Health Specifics
We built against the correct endpoint persona from the start: Oracle Health runs three separate endpoints on one tenant — open, provider and patient — and they behave differently enough that a token issued for one does not work against another, while the open endpoint is read-only and advertises no write interaction on any resource.
Application and Access Type
We fixed the application type and access type before registering, because those choices cannot be changed afterwards, and granted resource access per resource, where each read or write checkbox becomes exactly one scope — which is why a valid token reached Patient and Observation while a request to Condition returned 403, that right never having been granted.
Session Design
We designed the session around an access token valid for roughly 9.5 minutes rather than a long-lived one, reading the expiry from the token response and refreshing or re-launching on that basis instead of hardcoding a lifetime. We also matched Oracle Health’s request-format requirements exactly, since an incorrect Accept header is enough to produce a 406 on an otherwise valid request.
Management Scenarios
We designed and verified the key scenarios for managing EHR connections — connected systems and their state, resource access rights, authentication, audit trail and synchronization status — and built them into a working demo platform showing Oracle Health and Epic side by side under one administrative view.
The Obstacle: the API Said It Supported It, and It Didn’t
Oracle Health advertised date search on the Encounter resource. Our request with that parameter returned 400. It was a loud failure, but a useful one: a capability statement shows what a server claims to support, not what a specific environment accepts. From then on, we verified every parameter the product relied on with real requests against the endpoint it would actually call.
The quiet version of this problem is worse. Some unsupported parameters are not rejected: the API returns 200, ignores the filter and sends back a broader dataset, with nothing in the response to say so. A narrowed query and an unnarrowed one look identical, so the product can end up processing records the workflow never asked for. A related quirk: _count could be ignored on certain resources, which meant oversized responses, slower processing and a risk of timeouts.
What We Put In Place
- Verification of actual API behavior per parameter and per resource, rather than trust in what is advertised.
- Response validation — checking that what came back matches what was requested, including result counts against expectation.
- Explicit control that filters were applied, so a silently ignored filter surfaces as a problem instead of passing as success.
- Separate handling rules for resources whose behavior differs, including defensive handling of large responses and pagination where _count is not honored.
The critical discrepancies emerged during the first several days of integration testing — early enough to refine the design instead of ever surfacing later in production.
Compliance and Security
No real patient data in any vendor sandbox, at any point
A shared sandbox tenant carries no consent and no business associate agreement.
Sandbox and production credentials held separately
Sandbox and production configuration held separately — separate service addresses, separate credentials, no shared configuration file, no production callback on a sandbox application.
Logs carry identifiers and shapes, never content
Resource type, resource ID, status code, duration. No response bodies, patient names, clinical values, tokens or authorization codes.
Patient identity handled correctly at the data layer
A FHIR resource ID is valid only for the server that issued it and is never a permanent key for a person; business identifiers such as an MRN are matched on assigning system and value together, because two organizations can issue the same MRN to different people.
BAA scope is established before the architecture is fixed,
since whether one applies depends on the role each party plays and how data moves. This is typically confirmed with the healthcare organization’s legal and compliance team before any design decision depends on the answer.
Security review on the organization’s terms and timetable
A sandbox result is not a HIPAA assessment, a penetration test or a clinical safety case.
Outcome
6–10 weeks from kickoff with a committed healthcare organization to production connection (scenario)
Sandbox verification, access alignment, security review and production preparation. The variable is how fast approvals move on the organization’s side, which is why those conversations start in week one rather than at handover.
Four failure modes caught in testing, not in production (verified)
A rejected date filter, a filter silently ignored behind a 200, an ignored _count returning far more than requested, and a 406 from a wrong Accept header. All surfaced in the first days of integration testing, early enough to shape the design.
Two EHR vendors, one architecture (scenario)
Oracle Health added without a separate stack beside the existing one. Connecting a new organization becomes configuration and verification rather than a fresh technical project: standard authentication, access-rights verification, response validation, filter control, large-dataset handling, and one consistent set of error-handling rules.
Planning an Oracle Health integration?
We’ll walk you through the working platform and the implementation path for your use case.




