By EHR

Oracle Health (Cerner) bulk FHIR export for research.

Clinical Extract connects to Oracle Health, formerly Cerner, as a System application on your tenant and runs the Cerner bulk FHIR export for the study cohort’s Group through Oracle Health’s certified FHIR R4 API. The variables your protocol approved come back as study.csv with a data dictionary.

1 Works with Oracle Health

Oracle Health support on your tenant.

Oracle Health’s certified API (ONC §170.315(g)(10)) exports a Group of patients through HL7 FHIR Bulk Data Access with system-level SMART authorization. Clinical Extract uses that exchange for the token request on your tenant, the Group kickoff, the status poll under bulk-export/jobs and each file download, read-only and in your environment.

This is the Cerner bulk data export under Oracle Health’s name. Your tenant ID appears in every URL, which keeps the export to your organization, and the Group you name keeps it to the study cohort.

The study cohort as NDJSON, flattened to CSV
Patient, Encounter, Condition, Observation, MedicationRequest and Procedure files land in your study folder. Clinical Extract writes the approved variables to study.csv, with a data-dictionary.json entry for each column.
Coded columns
Diagnoses, biomarkers, staging, medications and procedures come out as ICD-10-CM, LOINC, RxNorm and SNOMED CT codes, each column traced to its FHIR element.
The oncology lens
ER, PR, HER2, PD-L1, EGFR, KRAS, BRAF, ALK, MSI and TNM clinical and pathologic arrive as named columns.
Roster pull and the cohort builder
Match a list of MRNs or names with graded results, or build the cohort from coded criteria and read the feasibility count before the export.

2 Connecting

Registering in code Console and enabling your tenant.

Oracle Health setup happens once, in three steps.

  1. Register. In code Console, Clinical Extract is an application of type System. Its system account is issued in Cerner Central, its public keys are held as a JWKS in System Account Management, and its system scopes are one system/<Resource>.read scope per exported type plus system/Group.read. The system account’s client ID is issued.
  2. Activate. Your organization enables the application for your tenant, whose tenant ID names it in every URL, and names the study Group.
  3. Export. The token request goes to authorization.cerner.com for your tenant, the kickoff to your tenant’s Group and the status poll to the job URL. Each file URL answers 307 to the NDJSON file, which Clinical Extract fetches with the bearer token.

Our team also builds Oracle Health interfaces outside research.

Connecting Clinical Extract to Oracle HealthThree numbered steps from left to right. Step 1, register, at code Console (Oracle Health app registration), outside your environment: Application type: System; System account: issued in Cerner Central; JWKS: Clinical Extract’s public keys, in System Account Management; System scopes: system/Patient.read, system/Group.read, system/Encounter.read, system/Condition.read, system/Observation.read, system/MedicationRequest.read, system/Procedure.read; Issued: the system account’s client ID. An arrow carries the client ID to step 2. Step 2, activate, at Your Oracle Health (your tenant): Application: enabled by your organization for your tenant; Tenant ID: names your organization in every URL; FHIR base: fhir-ehr.cerner.com/r4/{tenant-id}; Group: the study cohort, by Group ID. An arrow carries the tenant ID and Group ID to step 3. Step 3, export, from Clinical Extract in your environment: request POST authorization.cerner.com/tenants/{tenant-id}/…/smart-v1/token (grant_type=client_credentials, client_assertion: JWT signed RS384, scope=system/Observation.read …); request GET fhir-ehr.cerner.com/r4/{tenant-id}/Group/{id}/$export (?_type=Patient,Encounter,Condition,Observation,MedicationRequest,Procedure, Prefer: respond-async), highlighted; response 202 Accepted (Content-Location: …/bulk-export/jobs/{job-id}); request GET …/bulk-export/jobs/{job-id} (202 Accepted while the export runs, with Retry-After); response 200 OK, JSON manifest (transactionTime, request,, requiresAccessToken, error[],, output[{type, url, count}]); request GET …/bulk-export/files/{file-id} (307 to the NDJSON file); result study.csv, data-dictionary.json (flattened, approved variables only).1REGISTERcode ConsoleOracle Health app registrationAPPLICATION TYPESystemSYSTEM ACCOUNTissued in Cerner CentralJWKSClinical Extract’s public keys, inSystem Account ManagementSYSTEM SCOPESsystem/Patient.readsystem/Group.readsystem/Encounter.readsystem/Condition.readsystem/Observation.readsystem/MedicationRequest.readsystem/Procedure.readISSUEDthe system account’s client ID2ACTIVATEYour Oracle Healthyour tenantAPPLICATIONenabled by your organization foryour tenantTENANT IDnames your organization in everyURLFHIR BASEfhir-ehr.cerner.com/r4/{tenant-id}GROUPthe study cohort, by Group ID3EXPORTClinical Extractin your environmentrequestresponsePOST authorization.cerner.com/tenants/{tenant-id}/…/smart-v1/tokengrant_type=client_credentialsclient_assertion: JWT signed RS384scope=system/Observation.read …GET fhir-ehr.cerner.com/r4/{tenant-id}/Group/{id}/$export?_type=Patient,Encounter,Condition,Observation,MedicationRequest,ProcedurePrefer: respond-async202 AcceptedContent-Location: …/bulk-export/jobs/{job-id}GET …/bulk-export/jobs/{job-id}202 Accepted while the exportruns, with Retry-After200 OK, JSON manifesttransactionTime, request,requiresAccessToken, error[],output[{type, url, count}]GET …/bulk-export/files/{file-id}307 to the NDJSON filestudy.csv, data-dictionary.jsonflattened, approved variables onlyclient IDtenant IDGroup ID
Connecting Clinical Extract to Oracle HealthThree numbered steps from left to right. Step 1, register, at code Console (Oracle Health app registration), outside your environment: Application type: System; System account: issued in Cerner Central; JWKS: Clinical Extract’s public keys, in System Account Management; System scopes: system/Patient.read, system/Group.read, system/Encounter.read, system/Condition.read, system/Observation.read, system/MedicationRequest.read, system/Procedure.read; Issued: the system account’s client ID. An arrow carries the client ID to step 2. Step 2, activate, at Your Oracle Health (your tenant): Application: enabled by your organization for your tenant; Tenant ID: names your organization in every URL; FHIR base: fhir-ehr.cerner.com/r4/{tenant-id}; Group: the study cohort, by Group ID. An arrow carries the tenant ID and Group ID to step 3. Step 3, export, from Clinical Extract in your environment: request POST authorization.cerner.com/tenants/{tenant-id}/…/smart-v1/token (grant_type=client_credentials, client_assertion: JWT signed RS384, scope=system/Observation.read …); request GET fhir-ehr.cerner.com/r4/{tenant-id}/Group/{id}/$export (?_type=Patient,Encounter,Condition,Observation,MedicationRequest,Procedure, Prefer: respond-async), highlighted; response 202 Accepted (Content-Location: …/bulk-export/jobs/{job-id}); request GET …/bulk-export/jobs/{job-id} (202 Accepted while the export runs, with Retry-After); response 200 OK, JSON manifest (transactionTime, request,, requiresAccessToken, error[],, output[{type, url, count}]); request GET …/bulk-export/files/{file-id} (307 to the NDJSON file); result study.csv, data-dictionary.json (flattened, approved variables only).1REGISTERcode ConsoleOracle Health app registrationAPPLICATION TYPESystemSYSTEM ACCOUNTissued in Cerner CentralJWKSClinical Extract’s public keys, inSystem Account ManagementSYSTEM SCOPESsystem/Patient.readsystem/Group.readsystem/Encounter.readsystem/Condition.readsystem/Observation.readsystem/MedicationRequest.readsystem/Procedure.readISSUEDthe system account’s client IDclient ID2ACTIVATEYour Oracle Healthyour tenantAPPLICATIONenabled by your organization for yourtenantTENANT IDnames your organization in every URLFHIR BASEfhir-ehr.cerner.com/r4/{tenant-id}GROUPthe study cohort, by Group IDtenant IDGroup ID3EXPORTClinical Extractin your environmentrequestresponsePOST authorization.cerner.com/tenants/{tenant-id}/…/smart-v1/tokengrant_type=client_credentialsclient_assertion: JWT signed RS384scope=system/Observation.read …GET fhir-ehr.cerner.com/r4/{tenant-id}/Group/{id}/$export?_type=Patient,Encounter,Condition,Observation,MedicationRequest,ProcedurePrefer: respond-async202 AcceptedContent-Location: …/bulk-export/jobs/{job-id}GET …/bulk-export/jobs/{job-id}202 Accepted while the export runs, withRetry-After200 OK, JSON manifesttransactionTime, request,requiresAccessToken, error[],output[{type, url, count}]GET …/bulk-export/files/{file-id}307 to the NDJSON filestudy.csv, data-dictionary.jsonflattened, approved variables only
Figure 1. Connecting Clinical Extract to Oracle Health. Clinical Extract is registered once in code Console as a System application, with its system account and public keys in Cerner Central; your organization enables it for your tenant; Clinical Extract then runs the Group export against your tenant, in your environment. Resource lists and URLs are abridged.

3 Export time

Minutes per study on Oracle Health.

Jones et al. (JAMIA, 2024) measured (g)(10) bulk export at five sites: Cerner ran above 8,000 resources per minute, and it took the sites 2 to 119 days (mean 65) from submitting cohort criteria to the first successful bulk request. Clinical Extract asks your tenant only for the study cohort and the resource types the protocol names. A 212-patient study of about 58,000 resources exports in minutes at that rate, and with the criteria and the count from the cohort builder, your organization sets up the study Group when the protocol is approved.

The export runs asynchronously. Clinical Extract polls the job URL at the interval Retry-After gives and downloads every file the manifest lists, following each 307 to its NDJSON file. Source: Jones et al. J Am Med Inform Assoc. 2024, doi:10.1093/jamia/ocae040.

Every header of the kickoff, status and manifest exchange is in our guide to bulk FHIR export.

4 Facts

Oracle Health connection facts.

Table 1. Endpoint, registration, authentication, export type and output on Oracle Health. Checked September 2026.
Endpoint FHIR R4 base https://fhir-ehr.cerner.com/r4/{tenant-id}; the tenant ID names your organization in every URL
Registration code Console: an application of type System; its system account issued in Cerner Central, Clinical Extract’s public keys as a JWKS in System Account Management, one system/<Resource>.read scope per exported type plus system/Group.read
Authentication SMART Backend Services: a JWT signed RS384 with Clinical Extract’s private key, exchanged at https://authorization.cerner.com/tenants/{tenant-id}/protocols/oauth2/profiles/smart-v1/token for an access token with one system/<Resource>.read scope per exported type plus system/Group.read
Export type Group export: GET .../r4/{tenant-id}/Group/{group-id}/$export with _type; 202 Accepted with a Content-Location status URL under bulk-export/jobs
Status and files 202 with Retry-After while the export runs; 200 with the JSON manifest; each bulk-export/files URL answers 307 to the NDJSON file, fetched with the bearer token, one resource per line
Output study.csv (UTF-8, one row per cohort patient, one column per approved variable) with data-dictionary.json (description, fhirSource and example per column); the NDJSON files and the manifest kept beside them in your study folder

The table scrolls sideways.

Sources: Oracle Health FHIR R4 documentation, HL7 Bulk Data Access, SMART Backend Services.

5 Specimens

What the exchange and the output look like.

Every value is synthetic. The cohort is a 212-patient breast cancer study with 24 approved variables; the manifest counts and the row shown come from it.

Listing 1. The export kickoff: one request for the study cohort's Group and the resource types the protocol names, answered at once with the status URL.
GET https://fhir-ehr.cerner.com/r4/{tenant-id}/Group/{group-id}/$export
    ?_type=Patient,Encounter,Condition,Observation,MedicationRequest,Procedure
Accept: application/fhir+json
Prefer: respond-async
Authorization: Bearer {access token}

202 Accepted
Content-Location: https://fhir-ehr.cerner.com/r4/{tenant-id}/bulk-export/jobs/{job-id}
Listing 2. The completed status response: the manifest lists one NDJSON file per requested type with its line count, and says the files need the bearer token.
{
  "transactionTime": "2026-09-28T14:02:11Z",
  "request": "https://fhir-ehr.cerner.com/r4/{tenant-id}/Group/{group-id}/$export?_type=Patient,Encounter,Condition,Observation,MedicationRequest,Procedure",
  "requiresAccessToken": true,
  "output": [
    { "type": "Patient", "url": "https://fhir-ehr.cerner.com/r4/{tenant-id}/bulk-export/files/{file-1}", "count": 212 },
    { "type": "Encounter", "url": "https://fhir-ehr.cerner.com/r4/{tenant-id}/bulk-export/files/{file-2}", "count": 3120 },
    { "type": "Condition", "url": "https://fhir-ehr.cerner.com/r4/{tenant-id}/bulk-export/files/{file-3}", "count": 1684 },
    { "type": "Observation", "url": "https://fhir-ehr.cerner.com/r4/{tenant-id}/bulk-export/files/{file-4}", "count": 48310 },
    { "type": "MedicationRequest", "url": "https://fhir-ehr.cerner.com/r4/{tenant-id}/bulk-export/files/{file-5}", "count": 3905 },
    { "type": "Procedure", "url": "https://fhir-ehr.cerner.com/r4/{tenant-id}/bulk-export/files/{file-6}", "count": 912 }
  ],
  "error": []
}
Listing 3. One line of Observation.ndjson: a complete FHIR resource per line, here the estrogen receptor status of patient eKx3p9Qa (LOINC 16112-5; SNOMED CT 10828004, Positive).
{"resourceType":"Observation","id":"eObs-3f9a","status":"final","category":[{"coding":[{"system":"http://terminology.hl7.org/CodeSystem/observation-category","code":"laboratory"}]}],"code":{"coding":[{"system":"http://loinc.org","code":"16112-5","display":"Estrogen receptor [Interpretation] in Tissue"}]},"subject":{"reference":"Patient/eKx3p9Qa"},"effectiveDateTime":"2024-03-20","valueCodeableConcept":{"coding":[{"system":"http://snomed.info/sct","code":"10828004","display":"Positive"}]}}
Listing 4. study.csv, the header row and row 1 of 212: one row per patient in the cohort, one column per approved variable (10 of 24 columns shown). Values are synthetic.
patient_ref,birth_year,gender,dx_code,dx_date,stage_group,er_status,pr_status,her2_status,first_chemo
eKx3p9Qa,1961,female,C50.412,2024-03-14,IIA,Positive,Positive,Negative,paclitaxel
Listing 5. The er_status entry in data-dictionary.json: the description with its code system, the FHIR element the value came from, and an example value.
{
  "er_status": {
    "description": "Estrogen receptor status (LOINC 16112-5)",
    "fhirSource": "Observation.valueCodeableConcept",
    "example": "Positive"
  }
}

6 Questions

Questions about Oracle Health

Does Oracle Health support bulk FHIR export?

Oracle Health is certified to ONC §170.315(g)(10), and its FHIR R4 API exposes the Group export with system-level authorization. Clinical Extract runs it as a System application on your tenant.

Is this the same as a Cerner bulk FHIR export?

Oracle Health is Cerner’s current name, and the certified bulk data export is the same API. Clinical Extract runs it against your tenant and writes study.csv and its data dictionary.

What is the tenant ID?

The identifier of your organization’s Oracle Health tenant. It is part of every FHIR URL and of the token endpoint, so every request Clinical Extract makes is scoped to your organization.

What does our organization enable?

The System application, once, for your tenant, and a Group for each study, named by its ID.

How fast is a study export on Oracle Health?

Minutes for a study. Jones et al. measured Cerner above 8,000 resources per minute; a 212-patient study of about 58,000 resources finishes in minutes at that rate, because the request covers the cohort and its resource types only.

Next

See Clinical Extract run on one of your studies.

Tell us which EHR you run and what the study or registry needs. We reply within one business day to set a meeting time.

Request a demo