Oracle Health Millennium Bulk FHIR API

Oracle Health Millennium supports the HL7 Bulk Data Access (Flat FHIR) specification for exporting group-level patient data in NDJSON format for population health, research, and payer-provider data exchange scenarios.

Work with this as data

Every API here is available over the APIs.io API and to AI agents over MCP.

MCP server

One button, every client — Claude, Cursor, VS Code and the rest.

https://apis.io/mcp

Tools for apis

7 MCP tools reach this
  • find_apisBrowse and filter every API in the catalog.
  • get_api_artifactsOne API's artifacts, grouped by type.
  • get_openapiThe primary OpenAPI for this API.
  • find_similar_apisAPIs that look like this one.
  • apis_io_searchSTART HERE — APIs, providers and tags for one query, each with its total.
  • resolveTurn a domain, URL or GitHub org into the provider it belongs to.
  • find_cohortsEvery scored population of providers in the catalog.
All 92 tools

Call it yourself

curl for this page
This API
curl "https://apis.io/api/v1/apis/oracle-health-bulk-fhir-api"
All apis
curl "https://apis.io/api/v1/apis?limit=25"

Discovery needs no key. Ratings and market analysis are Pro.

Get an API key

Free tier, no email required.

A second provider on the same verified email joins the account you already have.

OpenAPI Specification

cerner-millennium-bulk-data-openapi.yml Raw ↑
openapi: 3.1.0
info:
  title: Oracle Health Millennium Platform FHIR R4 Bulk Data Access API
  version: '1.0'
  summary: HL7 FHIR Bulk Data Access (Flat FHIR) export for Oracle Health Millennium Platform.
  description: >-
    Asynchronous bulk export of Millennium EHR data as newline-delimited FHIR (NDJSON), following the HL7
    FHIR Bulk Data Access (Flat FHIR) implementation guide. Every path and method in this document is
    published verbatim on the Oracle Health REST Endpoints page for the Bulk Data Access API; nothing is
    inferred. The flow is kick-off -> poll job -> download files -> delete job. Like the rest of the
    Millennium platform this API is multi-tenant, so the tenant id is a required path segment of the
    service root.
  contact:
    name: Oracle Health Developer Program
    url: https://www.oracle.com/health/developer/
  x-derived-from:
    docs: https://docs.oracle.com/en/industries/health/millennium-platform-apis/mfbda/rest-endpoints.html
    fetched: '2026-08-14'
    note: >-
      Paths and methods are verbatim from the provider's REST Endpoints page. Request/response bodies,
      headers and status codes are not published on that page and are therefore NOT modelled here beyond
      what the Bulk Data Access IG mandates and the page states; they are left open rather than guessed.
externalDocs:
  description: Oracle Health FHIR R4 Bulk Data Access APIs
  url: https://docs.oracle.com/en/industries/health/millennium-platform-apis/mfbda/index.html
servers:
  - url: https://fhir-ehr.cerner.com/r4/{tenant}
    description: Production FHIR service root.
    variables:
      tenant:
        default: ec2458f2-1e24-41c8-b71b-0e701af7583d
        description: Millennium tenant id. The default is the Oracle Health public sandbox tenant.
  - url: https://fhir-ehr-code.cerner.com/r4/{tenant}
    description: Secure sandbox FHIR service root.
    variables:
      tenant:
        default: ec2458f2-1e24-41c8-b71b-0e701af7583d
        description: Millennium tenant id.
security:
  - smartOnFhir: []
tags:
  - name: Export
    description: Kick off a bulk export job.
  - name: Jobs
    description: Poll and cancel bulk export jobs.
  - name: Files
    description: Retrieve the download URLs for completed export files.
paths:
  /Group/{Group_ID}/$export:
    parameters:
      - name: Group_ID
        in: path
        required: true
        description: Logical id of the FHIR Group whose members are exported.
        schema:
          type: string
    get:
      operationId: kickOffGroupExport
      summary: Kick off a bulk export for a Group
      description: >-
        Starts an asynchronous export of every member of the named Group. Per the Bulk Data Access IG the
        request carries `Accept: application/fhir+json` and `Prefer: respond-async`, and a successful
        kick-off returns 202 Accepted with a `Content-Location` header naming the job to poll.
      tags:
        - Export
      responses:
        '202':
          description: Export accepted. Poll the job named in `Content-Location`.
          headers:
            Content-Location:
              description: URL of the export job to poll.
              schema:
                type: string
        '400':
          $ref: '#/components/responses/OperationOutcome'
        '401':
          $ref: '#/components/responses/OperationOutcome'
        '403':
          $ref: '#/components/responses/OperationOutcome'
        '404':
          $ref: '#/components/responses/OperationOutcome'
  /Patient/$export:
    post:
      operationId: kickOffPatientListExport
      summary: Kick off a bulk export for a supplied patient list
      description: >-
        Starts an asynchronous export for a caller-provided list of patients. Published as POST because
        the patient list travels in the request body.
      tags:
        - Export
      responses:
        '202':
          description: Export accepted. Poll the job named in `Content-Location`.
          headers:
            Content-Location:
              description: URL of the export job to poll.
              schema:
                type: string
        '400':
          $ref: '#/components/responses/OperationOutcome'
        '401':
          $ref: '#/components/responses/OperationOutcome'
        '403':
          $ref: '#/components/responses/OperationOutcome'
  /bulk-export/jobs/{Job_ID}:
    parameters:
      - name: Job_ID
        in: path
        required: true
        description: Identifier of the export job returned by the kick-off request.
        schema:
          type: string
    get:
      operationId: getBulkExportJob
      summary: Get export job status
      description: >-
        Polls the status of an export job. While the job is running the server answers 202; on completion
        it answers 200 with the manifest of output files.
      tags:
        - Jobs
      responses:
        '200':
          description: Job complete. The body is the Bulk Data export manifest.
        '202':
          description: Job still in progress.
        '404':
          $ref: '#/components/responses/OperationOutcome'
    delete:
      operationId: deleteBulkExportJob
      summary: Delete an export job
      description: Cancels an in-flight job or discards a completed job and its output.
      tags:
        - Jobs
      responses:
        '202':
          description: Delete accepted.
        '404':
          $ref: '#/components/responses/OperationOutcome'
  /bulk-export/files/{File_ID}:
    parameters:
      - name: File_ID
        in: path
        required: true
        description: Identifier of an output file listed in the completed job manifest.
        schema:
          type: string
    get:
      operationId: getBulkExportFileUrls
      summary: Get file download URLs
      description: Returns the download URL(s) for one NDJSON output file of a completed export.
      tags:
        - Files
      responses:
        '200':
          description: Download URL(s) for the requested file.
        '404':
          $ref: '#/components/responses/OperationOutcome'
components:
  responses:
    OperationOutcome:
      description: FHIR OperationOutcome describing the failure.
      content:
        application/fhir+json:
          schema:
            $ref: '#/components/schemas/OperationOutcome'
  schemas:
    OperationOutcome:
      type: object
      description: FHIR R4 OperationOutcome — the error envelope for the Millennium platform.
      properties:
        resourceType:
          const: OperationOutcome
        issue:
          type: array
          items:
            type: object
            properties:
              severity:
                type: string
              code:
                type: string
              diagnostics:
                type: string
      required:
        - resourceType
        - issue
      additionalProperties: true
  securitySchemes:
    smartOnFhir:
      type: oauth2
      description: >-
        SMART on FHIR OAuth 2.0, client-credentials flow with `system/` scopes. Endpoints are tenant-scoped
        and discovered from /.well-known/smart-configuration at the tenant service root. See
        scopes/cerner-scopes.yml for the 303 scopes the sandbox tenant advertises.
      flows:
        clientCredentials:
          tokenUrl: https://authorization.cerner.com/tenants/{tenant}/hosts/fhir-ehr-code.cerner.com/protocols/oauth2/profiles/smart-v1/token
          scopes:
            system/Patient.read: System-level read access to Patient.
            system/Group.read: System-level read access to Group.