---
title: 'FHIR resources'
description: 'Every FHIR resource on the Huli Public API — both R4 and R5 — with its interactions, scopes, and per-version reference page.'
nav: 'API / FHIR resources'
order: 1
version: v1
source: generated
updated: '2026-09-23'
---

# FHIR resources

The Huli Public API serves **both** [FHIR R4](https://hl7.org/fhir/R4/) (the stable default) and [FHIR R5](https://hl7.org/fhir/R5/). Auth, scopes, and pagination are identical across releases — only the wire shapes and the base path (`/fhir/R4` vs `/fhir/R5`) differ. Not sure which to target? See [Choosing R4 vs R5](/v1/api/fhir-versions).

## Implementation Guide

Huli publishes a FHIR Implementation Guide with the profiles, extensions, and value sets for both R4 and R5 — see the [FHIR Implementation Guide](/v1/api/fhir-ig).

## FHIR R4 resources

The stable default surface.

| Resource | Interactions | Scopes |
|----------|-------------|--------|
| [Patient](/v1/api/r4/patient) | `read`, `search-type`, `create`, `update`, `$everything` | `system/Patient.rs`, `system/Patient.cru` |
| [Appointment](/v1/api/r4/appointment) | `read`, `search-type`, `create`, `update` | `system/Appointment.rs`, `system/Appointment.cru` |
| [Encounter](/v1/api/r4/encounter) | `read`, `search-type`, `create`, `update` | `system/Encounter.rs`, `system/Encounter.cru` |
| [Observation](/v1/api/r4/observation) | `read`, `search-type`, `create`, `update` | `system/Observation.rs`, `system/Observation.cru` |
| [MedicationRequest](/v1/api/r4/medicationrequest) | `read`, `search-type`, `create`, `update` | `system/MedicationRequest.rs`, `system/MedicationRequest.cru` |
| [ServiceRequest](/v1/api/r4/servicerequest) | `read`, `search-type`, `create`, `update` | `system/ServiceRequest.rs`, `system/ServiceRequest.cru` |
| [Composition](/v1/api/r4/composition) | `read`, `search-type`, `create`, `update` | `system/Composition.rs`, `system/Composition.cru` |
| [DocumentReference](/v1/api/r4/documentreference) | `read`, `search-type`, `create`, `update`, `$upload` | `system/DocumentReference.rs`, `system/DocumentReference.cru` |
| [Practitioner](/v1/api/r4/practitioner) | `read`, `search-type` | `system/Practitioner.rs` |
| [Organization](/v1/api/r4/organization) | `read`, `search-type` | `system/Organization.rs` |
| [Subscription](/v1/api/r4/subscription) | `read`, `search-type`, `create`, `update`, `delete`, `$replay`, `$stats`, `$deliveries` | `system/Subscription.rs`, `system/Subscription.crud` |
| [Location](/v1/api/r4/location) | `read`, `search-type` | `system/Appointment.rs` |
| [HealthcareService](/v1/api/r4/healthcareservice) | `read`, `search-type` | `system/Appointment.rs` |
| [PractitionerRole](/v1/api/r4/practitionerrole) | `read`, `search-type` | `system/Practitioner.rs` |
| [Schedule](/v1/api/r4/schedule) | `read`, `search-type` | `system/Appointment.rs` |
| [Slot](/v1/api/r4/slot) | `search-type` | `system/Appointment.rs` |
| [Device](/v1/api/r4/device) | `read`, `search-type` | `system/Appointment.rs` |
| [CodeSystem](/v1/api/r4/codesystem) | `read` |  |
| [ValueSet](/v1/api/r4/valueset) | `$expand` |  |

## FHIR R5 resources

The newer wire shapes — same token, same scopes, base path `/fhir/R5`.

| Resource | Interactions | Scopes |
|----------|-------------|--------|
| [Patient](/v1/api/r5/patient) | `read`, `search-type`, `create`, `update`, `$everything` | `system/Patient.rs`, `system/Patient.cru` |
| [Appointment](/v1/api/r5/appointment) | `read`, `search-type`, `create`, `update` | `system/Appointment.rs`, `system/Appointment.cru` |
| [Encounter](/v1/api/r5/encounter) | `read`, `search-type`, `create`, `update` | `system/Encounter.rs`, `system/Encounter.cru` |
| [Observation](/v1/api/r5/observation) | `read`, `search-type`, `create`, `update` | `system/Observation.rs`, `system/Observation.cru` |
| [MedicationRequest](/v1/api/r5/medicationrequest) | `read`, `search-type`, `create`, `update` | `system/MedicationRequest.rs`, `system/MedicationRequest.cru` |
| [ServiceRequest](/v1/api/r5/servicerequest) | `read`, `search-type`, `create`, `update` | `system/ServiceRequest.rs`, `system/ServiceRequest.cru` |
| [Composition](/v1/api/r5/composition) | `read`, `search-type`, `create`, `update` | `system/Composition.rs`, `system/Composition.cru` |
| [DocumentReference](/v1/api/r5/documentreference) | `read`, `search-type`, `create`, `update`, `$upload` | `system/DocumentReference.rs`, `system/DocumentReference.cru` |
| [Practitioner](/v1/api/r5/practitioner) | `read`, `search-type` | `system/Practitioner.rs` |
| [Organization](/v1/api/r5/organization) | `read`, `search-type` | `system/Organization.rs` |
| [HealthcareService](/v1/api/r5/healthcareservice) | `read`, `search-type` | `system/Appointment.rs` |
| [PractitionerRole](/v1/api/r5/practitionerrole) | `read`, `search-type` | `system/Practitioner.rs` |
| [Schedule](/v1/api/r5/schedule) | `read`, `search-type` | `system/Appointment.rs` |
| [Slot](/v1/api/r5/slot) | `search-type` | `system/Appointment.rs` |

> Subscription, Location, Device, CodeSystem, ValueSet are served on `/fhir/R4` only (forwards-compatible — not duplicated onto R5); find them in the R4 table above.

## Authentication

All resource requests require a Bearer token from [`POST /auth/token`](/v1/api/authentication). See [Authentication](/v1/auth) for the full SMART Backend Services flow, and [Scopes](/v1/scopes) for the access model.
