Cerner (Oracle Health) API Integration: Routes, Access and What It Costs
CTO & Co-Founder
CTO & Co-Founder at Nirmitee.io. Architects healthcare integrations across FHIR, SMART on FHIR, ABDM and NHCX, writing from production experience taking hospital software from sandbox to go-live.

Updated October 31, 2026. Oracle pages read the same day.
A Cerner API integration connects your product to Oracle Health Millennium, the platform formerly sold as Cerner, through one of five routes: FHIR R4, Oracle's EHR APIs, Bulk Data, HL7 v2 interfaces, or a launch inside PowerChart. The route you pick decides who has to approve your work, so it shapes your sales cycle as much as your code. Every hospital is its own Millennium domain, and a provider app is not live at a hospital until that hospital provisions it.
This guide is for product and technology leaders deciding how to enter Millennium accounts. It covers the routes, the access steps, the fees Oracle lists, and the questions Oracle's public pages leave open. If you already know the route and want a team to build it, see our Oracle Health and Cerner integration services.
What the route decides for your business
The route decides whose calendar you depend on. A consumer app can register once and reach Oracle's active consumer endpoints. A provider or system app only becomes "available for Oracle Health Developer Program clients to consider", in Oracle's words, and each hospital then has to act.
So ask three business questions before anyone writes code. Does a clinician need to use this inside the chart, or can your product run on its own? Does the first customer already run the right interfaces and licenses? Can you sell the product if the first hospital allows reads but not writes? The answers usually remove two or three routes straight away.
Is this your use case?
Find your situation in this table first, because the plan changes with it. The middle column is what teams often have not checked yet.
| Your situation | What you may not know yet | What it means |
|---|---|---|
| You sell to clinicians, and one hospital asks for Cerner | Registration does not put you in that hospital. It has to provision your app in its own domain. | Name the hospital's Millennium owner in the deal, and plan for their requests to Oracle. |
| You sell a patient-facing app | Oracle provisions registered consumer apps for active consumer endpoints, and patient access can filter some data | Faster access, less data. Check which fields your screens depend on. |
| You need nightly data for analytics or AI | Bulk export runs on the hospital's database, and Oracle allows one export in progress per app and tenant | Agree scheduling and scope with the hospital before you promise freshness. |
| You need to act the moment a patient is admitted | The sandbox capability statement we read lists no Subscription resource | Plan on an HL7 v2 feed, which brings in the hospital's interface team. |
| You write results or notes back to the chart | Writes exist, but each operation has its own required fields and authorization types | Test your exact write in that hospital's domain, and sell it only once it passes. |
| Your customer is a community hospital on a shared domain | Self-service provisioning does not apply to CommunityWorks, PowerWorks or Continuum customers unless the case fits Oracle's Minimum Viable Strategy | Ask this on the first call, since it changes the route to go-live. |
| You still call older DSTU 2 APIs | Oracle no longer supports them | Inventory the calls, and move them to R4 before you add features. |
The names you will see, and what they mean
Oracle Health, Cerner and Millennium usually point at the same platform, and Oracle's own pages still mix the names. Oracle Health is the company's current name for the business. Millennium is the EHR platform. Ignite is the name Oracle's support process uses for the Millennium APIs, as in "Cerner Ignite APIs for Millennium". The code Console is where you register an app, and PowerChart is the clinician's desktop chart.
Check one thing early: Oracle documents Soarian Clinicals separately from Millennium. A hospital described as "Oracle Health" may run either, and this guide covers Millennium.
The five Cerner integration routes compared
Most products use two of these five routes, chosen per data need. FHIR R4 fits most new app work, HL7 v2 fits events as they happen, Bulk Data fits population exports, the EHR APIs fit gaps in FHIR, and a chart launch fits screens clinicians must use during care. The table shows who has to say yes to each.
| Route | Fits | Who has to act | Main limit |
|---|---|---|---|
| FHIR R4 APIs | App or server reads and writes on standard resources | Your team registers. Each hospital provisions a provider or system app. | Only the operations Oracle lists and the hospital enables |
| Oracle Health EHR APIs | Work Oracle says goes beyond FHIR, such as patient messaging and allergy review actions | Same registration, with Oracle-specific scopes | Proprietary, so your code will not carry to another EHR. Oracle says pricing may vary for proprietary APIs. |
| FHIR Bulk Data | Population exports for warehouses, registries and model training | A registered bulk app, plus the hospital defining groups | Runs against the hospital's database, so timing varies with size |
| HL7 v2 interfaces | Events pushed as they happen: admissions, orders, results | The hospital's interface team, and possibly Oracle-licensed interfaces | Oracle's public pages describe the products, not the message specifications |
| Inside PowerChart | A screen the clinician opens from the chart | The hospital configures the launch | Setup pages sit behind a sign-in. Access points vary. |
FHIR R4: what the Cerner FHIR API offers today
FHIR R4 is the default route for new work, because Oracle no longer supports the older DSTU 2 APIs and tells developers to move to R4. On 31 October 2026 we pulled the capability statements from Oracle's two public sandboxes. The secure sandbox listed 44 resource types on FHIR 4.0.1, and 21 of those allow a create, update, patch or delete. The open sandbox listed 42 types and allowed no writes, which matches Oracle's note that writes need authentication.
Writes include Observation, Condition, DocumentReference, Appointment, Encounter, MedicationRequest, AllergyIntolerance, Coverage and Patient. So "Cerner is read-only" is out of date as a general statement. Those counts describe Oracle's sandbox on that date, and a hospital's domain can differ, so check each write you plan to sell in that hospital's domain.
Three access models sit on top of those resources. The right one follows from who is using your product.
| Who uses it | Access model | What Oracle's docs say to plan for |
|---|---|---|
| Patient or proxy | Consumer app with SMART sign-in | A separate patient root URL. Registered apps are provisioned for active consumer endpoints. |
| Clinician or staff | Provider app with SMART launch | Default token of 570 seconds. The online_access scope gives refreshed tokens while the user stays signed in. |
| No user, server to server | System account, as a confidential client | Only on resources marked for it. Bulk apps preregister a JSON Web Key Set. |
Our note on vendor-specific FHIR behavior explains why a passing sandbox test is a start and does not settle what a hospital will accept.
What a Cerner FHIR API call looks like
These examples come from Oracle's own reference, trimmed for length, using Oracle's public sandbox tenant and its example IDs. They are here so a product leader can see what the team is signing up for: a tenant in every URL, and a version returned on every write.
Finding a tenant's sign-in endpoints, which Oracle says to discover and not hard-code:
GET https://fhir-ehr-code.cerner.com/r4/ec2458f2-1e24-41c8-b71b-0e701af7583d/.well-known/smart-configuration Reading a patient from Oracle's open sandbox, where the tenant is part of the identity of the record:
GET https://fhir-open.cerner.com/r4/ec2458f2-1e24-41c8-b71b-0e701af7583d/Patient?_id=12724067
Accept: application/fhir+json Creating a laboratory Observation, which Oracle lists for provider and system authorization types:
POST https://fhir-ehr.cerner.com/r4/ec2458f2-1e24-41c8-b71b-0e701af7583d/Observation
{
"resourceType": "Observation",
"status": "final",
"category": [{ "coding": [{
"system": "http://terminology.hl7.org/CodeSystem/observation-category",
"code": "laboratory" }] }],
"code": { "coding": [{
"system": "http://loinc.org", "code": "718-7",
"display": "Hemoglobin [Mass/volume] in Blood" }] },
"subject": { "reference": "Patient/2798003" },
"encounter": { "reference": "Encounter/2673896" },
"effectiveDateTime": "2020-07-30T20:42:00.000Z",
"valueQuantity": { "value": 13.2, "unit": "g/dL",
"system": "http://unitsofmeasure.org", "code": "g/dL" }
} Oracle's example response has an empty body, with the new record's address and version in the headers:
Etag: W/"1"
Location: https://fhir-ehr.cerner.com/r4/ec2458f2-1e24-41c8-b71b-0e701af7583d/Observation/L-197392513 Your product should keep that version, because Oracle returns a 409 when an update uses an out-of-date one. We set the unit to g/dL in this trimmed example, to match the reference range in Oracle's sample. Check the fields required for each operation in Oracle's reference, since Oracle's Observation page says unsupported fields are ignored and modifier fields make the transaction fail, while its R4 overview lists a 422 for unsupported fields.
Oracle's EHR APIs, for work FHIR does not cover
Oracle publishes a second, non-FHIR API family on api.cernermillennium.com, and it says these APIs enable workflows "beyond what's possible with FHIR APIs". The reference lists allergies, chief complaints, code systems, conditions, locations, messages, nomenclatures, personnel and recipients, each with its own scope such as oraclehealth:millennium:allergy.
The business trade-off is portability. These calls tie that part of your product to Oracle, and Oracle's fee page says pricing may vary for noncertified, proprietary APIs without giving a figure. Use them where FHIR has a real gap, and get the commercial terms in writing first.
Bulk Data, for population exports
Bulk Data suits warehouses, registries and model training, and it does not suit anything a clinician is waiting on. Oracle says requests run asynchronously against the organization's own database, using the same services as other applications, and that export time grows with population size, resource types and time range. It publishes no duration or volume figure.
Group export follows v1.0.1 of the HL7 guide with some v2.0.0 parameters. Patient export follows v2.0.0 and needs a list of patient IDs, because Oracle does not support exporting all patients that way. Organizations manage their groups, so you need the hospital's help to find the group to export. Our Bulk FHIR comparison sets this beside Epic and athenahealth.
HL7 v2, for events as they happen
HL7 v2 remains the route when you need an admission or a result the moment it happens, and FHIR polling cannot give you that. Oracle's licensed product list, dated 8 July 2026, describes separate HL7 interfaces such as ADTs Demographics Outgoing and Results Outgoing, plus the Open Engine and OPENLink interface engines.
Ask one question from that list on the first call: does this hospital already hold the interface you need? Our Mirth Connect and Cerner integration guide covers the feeds, the engine and code mapping. Our HL7 integration services page covers the delivery work.
Documents, when the data is really a note or a summary
Choose the document route when the buyer wants a note or a summary in the chart, and discrete data is not the point. Oracle's R4 reference lists DocumentReference create, read, search and update, a $docref operation, and a Binary operation that generates a CCD. Oracle also licenses an HL7 Clinical Documents interface for dictation, transcription and voice recognition systems.
Which of these a hospital allows, and where a filed note appears for its clinicians, is a question for that hospital. Our guide to FHIR DocumentReference for clinical notes goes further.
Inside the chart, when clinicians must not switch screens
If a clinician has to use your screen during the visit, the route is a launch inside PowerChart. That choice carries the most unknowns in public documentation. Our Cerner PowerChart integration guide covers SMART launch and MPages, and says what cannot be checked without hospital access.
From the sandbox to a live hospital
Sandbox work proves your app against test data. Going live is a separate process at each hospital, and the hospital files most of the requests. Oracle's provisioning guide, dated July 2024, sets out the steps by hosting type, and nonproduction comes first where a hospital uses it.
Four details from that guide change project plans:
- Self-service provisioning does not apply to CommunityWorks, PowerWorks or Continuum customers, which Oracle calls shared domain customers, unless the case fits its Minimum Viable Strategy. They go through their Oracle representative.
- Each topic needs its own service request. Oracle says not to combine them.
- A customer may need to complete a Process for Executing Client Approval form.
- Production root URLs differ by region, with separate hosts for Asia-Pacific, Canada and the UK. Read them from the hospital, and do not hard-code them.
If a customer needs help implementing an app, Oracle says it can contract a custom scope with them. Developers in Oracle PartnerNetwork with FHIR expertise can submit a sales request. Our sandbox to production guide covers the engineering side.
What breaks in production, as Oracle documents it
Oracle's reference names these failure points, so plan them as product behavior. The last column is our advice.
| What happens | What Oracle says | What to decide up front |
|---|---|---|
| A hospital call returns 403 | The instance is unknown, or the app is not authorized there | Check provisioning before debugging code. Show the customer a clear status. |
| An update returns 409 | The update used an out-of-date version | Read again, then reapply. Decide who resolves a real conflict. |
| A write returns 422 | Valid JSON broke a business rule, or held unsupported fields, modifier extensions or implicit rules | Send it to a person or fix queue. Retrying as is will not help. |
| A read returns 500 with an OperationOutcome | A field required by FHIR, or a status, is missing from the data | Alert, and do not drop the record silently. The source record may need fixing. |
| A patient search returns 422 | More than 1,000 patients qualify for the criteria | Design search screens that ask for enough detail. |
| A field holds a data-absent reason | Fields required by profiles, or required value sets, can come back as unknown. Patient access can return masked. | Show "not available" on screen, and do not treat it as a value. |
| Data differs between hospitals or users | Encounter or organization security, privileges and preferences may filter data based on the build in the domain | Test with real roles in that domain. Do not read empty as none. |
| A second bulk export will not start | Only one request per client app and tenant may be in progress | Queue exports per hospital in your own system. |
| An offline user stops syncing | An offline refresh token is revoked if unused for more than three months | Monitor token use, and give users a way to reconnect. |
| A token ends mid-task | The default token lasts 570 seconds, and online refresh ends with the session | Save drafts, and refresh ahead of expiry. |
What Oracle charges, and what it leaves out
Oracle lists fees for optional partner services, and it says these "are not required to develop and deploy apps". The figures below come from two Oracle pages read on 31 October 2026. The partner journey page shows the same figures on its US address and its APAC address. Oracle says pricing is subject to change, so confirm with Oracle before you budget.
| Item | Listed fee | Basis |
|---|---|---|
| Oracle PartnerNetwork membership and Industry Healthcare Track | $3,500 a year ($500 and $3,000 on Oracle's fee page) | Annual |
| Millennium environment access for dev, test and demo | $5,000 a year | Per app purchase |
| Validated Integration | $8,500 | Per validation event, first and repeat |
Developers who skip validation can still connect and access API resources, says Oracle, but they lose the value-added services and must follow the marketing rules in its API terms. Those terms, effective 1 March 2024, say the APIs are free in Oracle's developer sandbox, and that additional fees may apply to you or the hospital for Oracle's proprietary APIs outside the sandbox, set in a separate written agreement.
Oracle's public pages give no figure for what a hospital pays to enable an app, how long provisioning takes, or how many requests per minute are allowed. Its Bulk Data page lists a 429 "throttled" error without a threshold. Treat any number you hear on those points as one vendor's experience until the hospital or Oracle confirms it.
Planning mistakes that are expensive to fix later
These come from reading Oracle's documents against how products get designed. Each one is cheap to handle at the design stage.
- Designing long forms around one token. At 570 seconds by default, a token can expire while a clinician is mid-form. Decide on refresh and draft saving when you design the screen.
- Treating an ID as global. Oracle says Millennium IDs and identifiers are only meaningful within their full URL, and that the same ID can mean someone else under another tenant. Store the tenant with every reference.
- Hard-coding endpoints. Oracle says authorization URLs must be discovered from the tenant's SMART configuration, and that they can change.
- Asking for wildcard scopes. Oracle does not support them. Each app requests each scope explicitly, so your scope list becomes part of the hospital's review.
- Building your own paging links. Oracle says to follow the links in the Bundle.
- Carrying DSTU 2 calls forward. Oracle no longer supports them. Inventory any older calls against R4 first.
What to ask before you sign
Settle these before a contract fixes a date or a scope. Each has a named party who can answer, and our reading is that none of them can be settled from public documents alone.
| Question | Why it matters to the business | Who can answer |
|---|---|---|
| Is the hospital remote-hosted, customer-hosted, global or a shared domain? | It decides who issues the tenant ID, and whether self-service provisioning applies | Hospital IT |
| Which exact read and write operations will the domain enable for our app? | The sandbox list is an upper guide. A missing write can remove a feature you sold. | Hospital Millennium team |
| Does the workflow need the proprietary EHR APIs? | Oracle's terms say additional fees may apply outside the sandbox | Oracle and the hospital |
| Who files the service requests, and who follows them up? | The hospital logs them, so your date rests on its team | Hospital project lead |
| Is a nonproduction domain available? | Without one, your first real test may be in production | Hospital IT |
| Do you plan to pursue Oracle validation and a marketplace listing? | It is optional, with fees per validation. It may help a sale, and it adds cost and steps. | Your leadership, with Oracle |
| Who owns the code Console registration and system account? | Oracle issues the system account to the CernerCare account that registered the app | You and your vendor |
| Who answers when a hospital reports missing data at night? | Failures can sit in your code, the domain's build or a source record | You, your vendor and the hospital |
How to judge a Cerner integration partner
Ask for proof that matches your stage, and ask who keeps the access afterward. These questions work for any vendor, including us.
- What can you show from a hospital's domain, and what only from the sandbox?
- Whose company holds the code Console registration and CernerCare account when you finish?
- Which of our write operations have you confirmed, and where?
- Which route would you avoid for this product, and why?
- What will you do when the hospital's interface team has no time this quarter?
What Nirmitee has shown on Oracle Health, and what it has not
We have one public recording to point at: a SMART app run against the Oracle Health and Epic developer sandboxes, covering discovery, PKCE, chart reads and a vital-sign Observation that returned 201 and read back. Watch the side-by-side run.
It is sandbox only, with test patients. It does not show a hospital's domain, access or approval. Our service page marks hospital-domain writes and CareAware flows as dependent on access, and Bulk export as proposed. We would rather you compare that list with what other vendors can show than take a claim on trust.
If you are deciding on a route, book a Cerner integration scoping call. Bring one customer's hospital type and the one workflow you most need to work.
Sources
All read 31 October 2026 unless marked.
- Oracle Health Millennium Platform, overview
- FHIR R4 APIs, all REST endpoints and service root URL
- Authorization Framework
- FHIR Application Provisioning (dated July 2024)
- FHIR R4 Bulk Data Access
- Oracle Health EHR APIs, endpoints
- API Access and Fees and Registering an App
- Integrated with Oracle Health Millennium Platform API, partner journey (APAC address)
- Terms and Conditions for Oracle Health APIs (effective 1 March 2024)
- Oracle Health Licensed Software Solution Descriptions (updated 8 July 2026)
- Oracle Health interoperability
- Sandbox capability statements: secure and open
Oracle Health, Cerner, Millennium and PowerChart are trademarks of Oracle and/or its affiliates. Nirmitee is an independent company, and this guide is not endorsed by Oracle.
Ready to scale?
Talk to our healthcare engineering team about building, integrating, and shipping faster.
Frequently Asked Questions
Does Cerner have an API?
Is the Cerner FHIR API free?
Can you write back to Cerner through FHIR?
How long does a Cerner integration take?
What is the difference between Cerner and Oracle Health?
Do I need to be an Oracle partner to integrate with Cerner?
Is FHIR or HL7 better for Cerner integration?


