HL7 FHIR R4 Healthcare API

HL7 FHIR R4 (v4.0.1) is a widely adopted normative FHIR standard for healthcare data exchange. FHIR R4 REST APIs are the most commonly implemented version across US healthcare systems, supporting patient data, clinical resources, medications, diagnostics, and financial resources.

OpenAPI Specification

hl7-fhir-r4-openapi.yml Raw ↑
openapi: 3.1.0
info:
  title: HL7 FHIR R4 Healthcare API
  description: >-
    HL7 FHIR R4 (v4.0.1) RESTful API for healthcare data exchange. Provides access
    to patient demographics, clinical observations, conditions, medications,
    encounters, care plans, and diagnostic reports. Implements the FHIR REST
    specification including CRUD operations, search parameters, history, and batch/
    transaction bundles. SMART on FHIR OAuth 2.0 authorization required.
  version: 4.0.1
  contact:
    name: HL7 International
    url: https://www.hl7.org/fhir/
  license:
    name: Creative Commons CC0
    url: https://creativecommons.org/publicdomain/zero/1.0/
externalDocs:
  description: HL7 FHIR R4 Specification
  url: https://www.hl7.org/fhir/R4/

servers:
  - url: https://fhir-server.example.com/fhir/R4
    description: FHIR R4 server base URL (replace with actual server URL)

security:
  - SMARTonFHIR: []

tags:
  - name: Bundle
    description: Batch and transaction operations

  - name: Condition
    description: Clinical conditions, diagnoses, and problems
  - name: Encounter
    description: Patient visits and encounters
  - name: MedicationRequest
    description: Medication prescriptions and orders
  - name: Observation
    description: Clinical measurements, lab results, vital signs
  - name: Patient
    description: Patient demographic and identity resources
paths:
  /Patient:
    get:
      operationId: searchPatient
      summary: Search patients
      description: >-
        Searches for Patient resources matching the specified search parameters.
        Supports name, identifier (MRN), birthdate, gender, and address searches.
        Returns a Bundle containing matching Patient resources.
      tags: [Patient]
      parameters:
        - name: _id
          in: query
          schema:
            type: string
          description: Logical id of the patient
        - name: identifier
          in: query
          schema:
            type: string
          description: Patient identifier (e.g., "http://hospital.example.org/patients|12345")
        - name: family
          in: query
          schema:
            type: string
          description: A portion of the family name of the patient
        - name: given
          in: query
          schema:
            type: string
          description: A portion of the given name of the patient
        - name: birthdate
          in: query
          schema:
            type: string
          description: The patient's date of birth (e.g., "1990-01-15" or "ge1990")
        - name: gender
          in: query
          schema:
            type: string
            enum: [male, female, other, unknown]
        - name: _count
          in: query
          schema:
            type: integer
            default: 20
          description: Number of results per page
        - name: _sort
          in: query
          schema:
            type: string
          description: Sort criteria (e.g., "family,-birthdate")
        - name: _include
          in: query
          schema:
            type: string
          description: Include related resources (e.g., "Patient:general-practitioner")
      responses:
        '200':
          description: Bundle of matching Patient resources
          content:
            application/fhir+json:
              schema:
                $ref: '#/components/schemas/Bundle'
        '400':
          description: Invalid search parameters
          content:
            application/fhir+json:
              schema:
                $ref: '#/components/schemas/OperationOutcome'

    post:
      operationId: createPatient
      summary: Create a patient
      description: Creates a new Patient resource. The server assigns the logical ID.
      tags: [Patient]
      requestBody:
        required: true
        content:
          application/fhir+json:
            schema:
              $ref: '#/components/schemas/Patient'
      responses:
        '201':
          description: Patient created
          headers:
            Location:
              schema:
                type: string
              description: URL of created resource (e.g., Patient/123/_history/1)
          content:
            application/fhir+json:
              schema:
                $ref: '#/components/schemas/Patient'
        '400':
          description: Invalid resource

  /Patient/{id}:
    get:
      operationId: readPatient
      summary: Read a patient
      description: Returns the current version of a Patient resource by its logical ID.
      tags: [Patient]
      parameters:
        - name: id
          in: path
          required: true
          schema:
            type: string
          description: Logical ID of the patient
      responses:
        '200':
          description: Patient resource returned
          content:
            application/fhir+json:
              schema:
                $ref: '#/components/schemas/Patient'
        '404':
          description: Patient not found

    put:
      operationId: updatePatient
      summary: Update a patient
      description: Updates an existing Patient resource using a complete replacement (PUT semantics).
      tags: [Patient]
      parameters:
        - name: id
          in: path
          required: true
          schema:
            type: string
      requestBody:
        required: true
        content:
          application/fhir+json:
            schema:
              $ref: '#/components/schemas/Patient'
      responses:
        '200':
          description: Patient updated
          content:
            application/fhir+json:
              schema:
                $ref: '#/components/schemas/Patient'
        '201':
          description: Patient created (upsert)
        '400':
          description: Invalid resource

  /Observation:
    get:
      operationId: searchObservation
      summary: Search observations
      description: >-
        Searches for Observation resources (lab results, vital signs, surveys).
        Common use cases include retrieving recent vital signs or lab values for a patient.
      tags: [Observation]
      parameters:
        - name: patient
          in: query
          schema:
            type: string
          description: Patient reference (e.g., "Patient/123")
        - name: category
          in: query
          schema:
            type: string
          description: Observation category (vital-signs, laboratory, social-history, etc.)
        - name: code
          in: query
          schema:
            type: string
          description: LOINC code or system|code (e.g., "8302-2" for body height)
        - name: date
          in: query
          schema:
            type: string
          description: Observation date filter (e.g., "ge2024-01-01")
        - name: status
          in: query
          schema:
            type: string
            enum: [registered, preliminary, final, amended, corrected, cancelled]
        - name: _count
          in: query
          schema:
            type: integer
            default: 20
        - name: _sort
          in: query
          schema:
            type: string
            default: -date
      responses:
        '200':
          description: Bundle of matching Observation resources
          content:
            application/fhir+json:
              schema:
                $ref: '#/components/schemas/Bundle'

  /Observation/{id}:
    get:
      operationId: readObservation
      summary: Read an observation
      description: Returns a specific Observation resource by its logical ID.
      tags: [Observation]
      parameters:
        - name: id
          in: path
          required: true
          schema:
            type: string
      responses:
        '200':
          description: Observation resource returned
          content:
            application/fhir+json:
              schema:
                $ref: '#/components/schemas/Observation'
        '404':
          description: Observation not found

  /Condition:
    get:
      operationId: searchCondition
      summary: Search conditions
      description: Searches for Condition resources (diagnoses, problems, health concerns) for a patient.
      tags: [Condition]
      parameters:
        - name: patient
          in: query
          schema:
            type: string
          description: Patient reference
        - name: clinical-status
          in: query
          schema:
            type: string
            enum: [active, recurrence, relapse, inactive, remission, resolved]
        - name: code
          in: query
          schema:
            type: string
          description: ICD-10 or SNOMED CT code
        - name: category
          in: query
          schema:
            type: string
        - name: onset-date
          in: query
          schema:
            type: string
        - name: _count
          in: query
          schema:
            type: integer
            default: 20
      responses:
        '200':
          description: Bundle of Condition resources returned
          content:
            application/fhir+json:
              schema:
                $ref: '#/components/schemas/Bundle'

  /MedicationRequest:
    get:
      operationId: searchMedicationRequest
      summary: Search medication requests
      description: Searches for MedicationRequest resources (prescriptions and medication orders) for a patient.
      tags: [MedicationRequest]
      parameters:
        - name: patient
          in: query
          required: true
          schema:
            type: string
        - name: status
          in: query
          schema:
            type: string
            enum: [active, on-hold, cancelled, completed, entered-in-error, stopped, draft, unknown]
        - name: medication
          in: query
          schema:
            type: string
        - name: authoredon
          in: query
          schema:
            type: string
        - name: _count
          in: query
          schema:
            type: integer
            default: 20
      responses:
        '200':
          description: Bundle of MedicationRequest resources returned
          content:
            application/fhir+json:
              schema:
                $ref: '#/components/schemas/Bundle'

  /Encounter:
    get:
      operationId: searchEncounter
      summary: Search encounters
      description: Searches for Encounter resources (visits, hospitalizations, telehealth) for a patient.
      tags: [Encounter]
      parameters:
        - name: patient
          in: query
          schema:
            type: string
        - name: status
          in: query
          schema:
            type: string
            enum: [planned, arrived, triaged, in-progress, onleave, finished, cancelled]
        - name: class
          in: query
          schema:
            type: string
          description: Encounter class code (AMB, IMP, EMER, etc.)
        - name: date
          in: query
          schema:
            type: string
        - name: _count
          in: query
          schema:
            type: integer
            default: 20
      responses:
        '200':
          description: Bundle of Encounter resources returned
          content:
            application/fhir+json:
              schema:
                $ref: '#/components/schemas/Bundle'

  /:
    post:
      operationId: processBatch
      summary: Process batch or transaction
      description: >-
        Processes a FHIR Bundle of type 'batch' or 'transaction'. Batch processes
        each entry independently; transaction processes all entries atomically.
      tags: [Bundle]
      requestBody:
        required: true
        content:
          application/fhir+json:
            schema:
              $ref: '#/components/schemas/Bundle'
      responses:
        '200':
          description: Bundle response with results for each entry
          content:
            application/fhir+json:
              schema:
                $ref: '#/components/schemas/Bundle'

  /metadata:
    get:
      operationId: getCapabilityStatement
      summary: Get server capability statement
      description: Returns the FHIR CapabilityStatement describing supported resources, operations, and search parameters for this server.
      tags: [Bundle]
      security: []
      responses:
        '200':
          description: CapabilityStatement returned
          content:
            application/fhir+json:
              schema:
                type: object
                properties:
                  resourceType:
                    type: string
                    enum: [CapabilityStatement]

components:
  securitySchemes:
    SMARTonFHIR:
      type: oauth2
      description: SMART on FHIR OAuth 2.0 authorization
      flows:
        authorizationCode:
          authorizationUrl: https://auth.example.com/authorize
          tokenUrl: https://auth.example.com/token
          scopes:
            patient/Patient.read: Read patient data
            patient/Observation.read: Read observations
            patient/Condition.read: Read conditions
            patient/MedicationRequest.read: Read medication requests
            patient/Encounter.read: Read encounters
            launch/patient: Patient context launch
            openid: OpenID Connect identity

  schemas:
    Bundle:
      type: object
      description: A container for a collection of FHIR resources
      properties:
        resourceType:
          type: string
          enum: [Bundle]
        id:
          type: string
        type:
          type: string
          enum: [document, message, transaction, transaction-response, batch, batch-response, history, searchset, collection]
        total:
          type: integer
          description: Total number of matches (for searchset bundles)
        link:
          type: array
          items:
            type: object
            properties:
              relation:
                type: string
                enum: [self, first, previous, next, last]
              url:
                type: string
                format: uri
        entry:
          type: array
          items:
            type: object
            properties:
              fullUrl:
                type: string
                format: uri
              resource:
                type: object
                description: FHIR resource (any type)
              search:
                type: object
                properties:
                  mode:
                    type: string
                    enum: [match, include, outcome]
                  score:
                    type: number
              request:
                type: object
                properties:
                  method:
                    type: string
                    enum: [GET, HEAD, POST, PUT, DELETE, PATCH]
                  url:
                    type: string
              response:
                type: object
                properties:
                  status:
                    type: string
                  location:
                    type: string
      required: [resourceType, type]

    Patient:
      type: object
      description: Demographics and administrative information about a patient
      properties:
        resourceType:
          type: string
          enum: [Patient]
        id:
          type: string
        meta:
          $ref: '#/components/schemas/Meta'
        identifier:
          type: array
          items:
            $ref: '#/components/schemas/Identifier'
          description: Patient identifiers (MRN, SSN, etc.)
        active:
          type: boolean
        name:
          type: array
          items:
            $ref: '#/components/schemas/HumanName'
        telecom:
          type: array
          items:
            $ref: '#/components/schemas/ContactPoint'
        gender:
          type: string
          enum: [male, female, other, unknown]
        birthDate:
          type: string
          format: date
        deceased:
          type: object
          properties:
            deceasedBoolean:
              type: boolean
            deceasedDateTime:
              type: string
              format: date-time
        address:
          type: array
          items:
            $ref: '#/components/schemas/Address'
        communication:
          type: array
          items:
            type: object
            properties:
              language:
                $ref: '#/components/schemas/CodeableConcept'
              preferred:
                type: boolean
        generalPractitioner:
          type: array
          items:
            $ref: '#/components/schemas/Reference'
      required: [resourceType]

    Observation:
      type: object
      description: Measurements and simple assertions about a patient or other subject
      properties:
        resourceType:
          type: string
          enum: [Observation]
        id:
          type: string
        meta:
          $ref: '#/components/schemas/Meta'
        status:
          type: string
          enum: [registered, preliminary, final, amended, corrected, cancelled, entered-in-error, unknown]
        category:
          type: array
          items:
            $ref: '#/components/schemas/CodeableConcept'
        code:
          $ref: '#/components/schemas/CodeableConcept'
        subject:
          $ref: '#/components/schemas/Reference'
        encounter:
          $ref: '#/components/schemas/Reference'
        effectiveDateTime:
          type: string
          format: date-time
        issued:
          type: string
          format: date-time
        valueQuantity:
          $ref: '#/components/schemas/Quantity'
        valueCodeableConcept:
          $ref: '#/components/schemas/CodeableConcept'
        valueString:
          type: string
        interpretation:
          type: array
          items:
            $ref: '#/components/schemas/CodeableConcept'
        note:
          type: array
          items:
            type: object
            properties:
              text:
                type: string
        component:
          type: array
          items:
            type: object
            properties:
              code:
                $ref: '#/components/schemas/CodeableConcept'
              valueQuantity:
                $ref: '#/components/schemas/Quantity'
      required: [resourceType, status, code]

    Meta:
      type: object
      properties:
        versionId:
          type: string
        lastUpdated:
          type: string
          format: date-time
        profile:
          type: array
          items:
            type: string
            format: uri
        tag:
          type: array
          items:
            $ref: '#/components/schemas/Coding'

    Identifier:
      type: object
      properties:
        use:
          type: string
          enum: [usual, official, temp, secondary, old]
        type:
          $ref: '#/components/schemas/CodeableConcept'
        system:
          type: string
          format: uri
        value:
          type: string

    HumanName:
      type: object
      properties:
        use:
          type: string
          enum: [usual, official, temp, nickname, anonymous, old, maiden]
        text:
          type: string
        family:
          type: string
        given:
          type: array
          items:
            type: string
        prefix:
          type: array
          items:
            type: string
        suffix:
          type: array
          items:
            type: string

    ContactPoint:
      type: object
      properties:
        system:
          type: string
          enum: [phone, fax, email, pager, url, sms, other]
        value:
          type: string
        use:
          type: string
          enum: [home, work, temp, old, mobile]

    Address:
      type: object
      properties:
        use:
          type: string
          enum: [home, work, temp, old, billing]
        type:
          type: string
          enum: [postal, physical, both]
        text:
          type: string
        line:
          type: array
          items:
            type: string
        city:
          type: string
        district:
          type: string
        state:
          type: string
        postalCode:
          type: string
        country:
          type: string

    Reference:
      type: object
      properties:
        reference:
          type: string
          description: Relative or absolute URL (e.g., "Patient/123")
        type:
          type: string
          format: uri
        identifier:
          $ref: '#/components/schemas/Identifier'
        display:
          type: string

    CodeableConcept:
      type: object
      properties:
        coding:
          type: array
          items:
            $ref: '#/components/schemas/Coding'
        text:
          type: string

    Coding:
      type: object
      properties:
        system:
          type: string
          format: uri
          description: Identity of the terminology system (e.g., "http://loinc.org", "http://snomed.info/sct")
        version:
          type: string
        code:
          type: string
        display:
          type: string
        userSelected:
          type: boolean

    Quantity:
      type: object
      properties:
        value:
          type: number
        comparator:
          type: string
          enum: ['<', '<=', '>=', '>']
        unit:
          type: string
        system:
          type: string
          format: uri
        code:
          type: string

    OperationOutcome:
      type: object
      properties:
        resourceType:
          type: string
          enum: [OperationOutcome]
        issue:
          type: array
          items:
            type: object
            properties:
              severity:
                type: string
                enum: [fatal, error, warning, information]
              code:
                type: string
              details:
                $ref: '#/components/schemas/CodeableConcept'
              diagnostics:
                type: string
              expression:
                type: array
                items:
                  type: string
      required: [resourceType, issue]