FHIR Resources Explained: Structure, Categories and Key Resources
A practical tour of FHIR resources: what every resource contains, how they are grouped, the ones you will meet in almost every integration, and how references, maturity levels and profiles fit together.
Key takeaways
- A resource is FHIR's unit of exchange: a typed, independently addressable record with an id, metadata, a human-readable narrative and defined elements.
- FHIR groups resources into foundation, base, clinical, financial and specialized categories; most integrations touch only a few dozen of the roughly 150 resource types in R4.
- Resources link through references rather than nesting, so understanding reference resolution is as important as understanding individual resources.
- Maturity levels (FMM 0 to 5, plus Normative) signal how stable a resource is; profiles in implementation guides such as US Core define how it must be used in a given context.
What a FHIR resource is
In FHIR, everything exchanged is a resource: a patient, a blood pressure reading, a prescription, an insurance claim, even the description of what a server can do. Each resource type has a published definition listing its elements, their data types, cardinality and meaning. Resources can be serialized as JSON, XML or RDF, and on a RESTful server each instance has its own URL such as [base]/Patient/123.
The design goal is reuse. Rather than defining a new message for every workflow, FHIR provides a library of granular, composable resources that cover the common 80 percent of each concept and leave the remainder to extensions. If you are new to the standard, start with what FHIR is and then come back here for the details.
Anatomy of a resource
Every resource shares a common skeleton inherited from the base Resource and DomainResource definitions:
- resourceType names the type, e.g. Observation. In JSON it is always present.
- id is the logical id assigned by the server holding the resource. It is local to that server, not a business identifier.
- meta carries technical metadata: versionId, lastUpdated, the profiles the resource claims to conform to, security labels and tags.
- text is a human-readable XHTML narrative so that a person can read the resource even if their system does not understand every element.
- extension and modifierExtension hold data the base definition does not cover. Modifier extensions change the meaning of the resource and cannot be safely ignored.
- identifier (on most resources) holds business identifiers such as a medical record number, with a system URI that says who issued it.
Below the shared skeleton, each resource defines its own elements. Data types are reused everywhere: CodeableConcept for coded values, Quantity for measured amounts, Reference for links, Period for date ranges, and so on. Learning the dozen most common data types pays off more than memorising individual resources.
Example: a compact Observation
The Observation below records a body weight measurement. It uses a LOINC code, a UCUM unit, and a reference to the subject Patient. The status and code elements are required by the base specification.
{
"resourceType": "Observation",
"id": "weight-example",
"meta": {
"lastUpdated": "2026-11-01T09:30:00Z"
},
"status": "final",
"category": [
{
"coding": [
{
"system": "http://terminology.hl7.org/CodeSystem/observation-category",
"code": "vital-signs",
"display": "Vital Signs"
}
]
}
],
"code": {
"coding": [
{
"system": "http://loinc.org",
"code": "29463-7",
"display": "Body weight"
}
]
},
"subject": {
"reference": "Patient/example"
},
"effectiveDateTime": "2026-11-01T09:15:00Z",
"valueQuantity": {
"value": 72.5,
"unit": "kg",
"system": "http://unitsofmeasure.org",
"code": "kg"
}
}How resources are categorized
The FHIR resource list groups types into five levels, which roughly reflect how foundational they are:
| Category | Purpose | Examples |
|---|---|---|
| Foundation | Infrastructure, conformance and terminology | CapabilityStatement, StructureDefinition, ValueSet, CodeSystem, Bundle, OperationOutcome |
| Base | People, organizations, workflow and administration | Patient, Practitioner, PractitionerRole, Organization, Location, Encounter, Task |
| Clinical | Clinical content: summary, diagnostics, medications, care provision | Condition, AllergyIntolerance, Observation, DiagnosticReport, MedicationRequest, CarePlan |
| Financial | Coverage, claims and payment | Coverage, Claim, ClaimResponse, ExplanationOfBenefit |
| Specialized | Public health, research, quality measurement, evidence, product definition | Measure, MeasureReport, ResearchStudy, PlanDefinition |
Key resources you will meet in almost every integration
- Patient: demographics and identifiers. Nearly every clinical resource points to one.
- Practitioner and PractitionerRole: the individual clinician, and the role they play at a specific organization or location.
- Encounter: an interaction between a patient and provider, such as an outpatient visit or inpatient stay. It gives clinical data its context.
- Observation: measurements and simple assertions, from vital signs and lab results to smoking status. It is the most heavily used clinical resource.
- Condition: problems, diagnoses and health concerns.
- AllergyIntolerance: allergies and intolerances, with criticality and reactions.
- MedicationRequest: an order or prescription for a medication, distinct from MedicationStatement (what the patient reports taking) and MedicationAdministration (what was actually given).
- DiagnosticReport: the report for a set of tests, such as a lab panel or imaging study, grouping result Observations and any conclusion.
- Bundle: a container for a collection of resources, used for search results, transactions, messages and documents.
When planning an API integration, list the resources each use case needs and check them against the target EHR's CapabilityStatement; support varies by vendor and by version.
References: how resources link together
Resources rarely stand alone. An Observation references its Patient and Encounter; a DiagnosticReport references its result Observations; a MedicationRequest references its requester. The Reference data type can hold a relative URL (Patient/123), an absolute URL to another server, a logical identifier, or an internal pointer to a contained resource.
- Relative references resolve against the server's base URL and are the most common form.
- Contained resources are embedded within a parent and have no independent identity; use them only when the referenced data cannot exist on its own.
- Search parameters such as _include and _revinclude let clients fetch referenced resources in one request instead of many round trips.
- When aggregating data from several systems, references often have to be rewritten. Plan for this in any interoperability design.
Working with resources over the REST API
Each resource type gets the same set of RESTful interactions: read and vread by id and version, create, update, patch and delete, history, and search. That uniformity is one of FHIR's biggest practical advantages. Once a developer has retrieved Patients, retrieving Conditions or AllergyIntolerances is the same pattern with a different type name and a different set of search parameters.
GET /fhir/Observation?patient=example&category=laboratory&date=ge2026-01-01&_sort=-date&_count=50 HTTP/1.1
Host: fhir.example.org
Accept: application/fhir+jsonSearch parameters are defined per resource type, and servers declare which they support in their CapabilityStatement. Results come back in a Bundle with paging links, so clients should always follow the next link rather than assuming one page holds everything. Operations, invoked with a $ prefix such as Patient/$everything or ValueSet/$expand, cover behaviour that does not fit simple create, read, update and delete.
- Fetch the server's CapabilityStatement (GET [base]/metadata) before building against it; it is the authoritative list of supported resources, interactions and search parameters.
- Expect OperationOutcome resources on errors. They carry structured issue codes and are far more useful than HTTP status codes alone.
- Treat narrative text as display-only. Systems should compute on structured elements, not parse the XHTML.
Maturity levels and profiles
Each resource carries a FHIR Maturity Model (FMM) level from 0 (draft) to 5 (widely implemented and stable), or the status Normative. In R4, a core set of content, including Patient, Observation, Bundle, StructureDefinition and the RESTful API, was the first to become normative, meaning future versions commit to backward compatibility for it. Lower-maturity resources can still change significantly between releases, which matters when you choose a FHIR version.
Base resources are intentionally broad. Profiles narrow them for a specific context: making elements required, binding codes to specific value sets, and defining extensions. Profiles are published in implementation guides, for example US Core for US clinical data and the International Patient Summary for cross-border summaries. A resource declares conformance in meta.profile, and validators can check it against the profile's StructureDefinition.
Build to the profile, not just the resource
Two systems can both support Observation and still fail to interoperate if they use different profiles, code systems or extensions. Agree the implementation guide and version up front.
Frequently asked questions
How many resource types does FHIR have?
FHIR R4 defines roughly 145 resource types and R5 roughly 157, though the exact count depends on the release. Most production integrations rely on a much smaller core set centred on Patient, Encounter, Observation, Condition, medications and documents.
What is the difference between id and identifier?
The id is the logical id assigned by the server that stores the resource and is part of its URL. An identifier is a business identifier, such as a medical record number or national ID, with a system URI naming the issuer. The same patient can have different ids on different servers but share identifiers.
When should I use an extension?
Use an extension only when the base resource and an applicable profile have no element for the data. Prefer extensions already published in an implementation guide or the HL7 extensions pack over inventing your own, so other systems are more likely to understand them.
Is a Bundle a resource?
Yes. A Bundle is a foundation resource that groups other resources. Its type element says how it should be processed, for example searchset, transaction, batch, document, message or collection.
What does Normative mean for a resource?
Normative content has passed ballot as stable and HL7 commits that future versions will stay backward compatible with it, apart from narrowly defined exceptions. Trial-use content can still change in breaking ways between releases.
References
- HL7 FHIR R4: Resource list
- HL7 FHIR R4: Resource definitions
- HL7 FHIR R4: Observation
- HL7 FHIR R4: References
- HL7 FHIR R4: Maturity model
- HL7 US Core Implementation Guide
FHIR® is a registered trademark of HL7 International. This guide is independent educational content and is not legal or compliance advice.
Related guides
- What Is FHIR? How the HL7 FHIR Standard WorksFHIR is the HL7 standard for exchanging healthcare data through web APIs. This guide explains resources, the REST API, profiles, extensions and versions in plain terms.
- FHIR API Integration: How It Works End to EndA practical walk-through of integrating with a FHIR REST API, from reading the CapabilityStatement to authentication, searching, paging, error handling, rate limits and testing.
- FHIR R4 vs R4B vs R5: What Changed and Which Version to UseR5 brings topic-based subscriptions, CodeableReference and a batch of new resources, yet most production systems still run R4. Here is what changed and how to decide.
- How FHIR Enables Healthcare InteroperabilityFHIR is a powerful interoperability tool, but only one layer of it. This guide maps FHIR to the four levels of interoperability, the terminologies it depends on, and the policy frameworks driving adoption.
Related FHIR services
- FHIR ImplementationEnd-to-end FHIR implementation services: program planning, data mapping, platform build, testing and go-live, plus governance and partner questions.
- FHIR API DevelopmentHow FHIR API development services design and build compliant FHIR REST APIs: profiles, CapabilityStatements, SMART auth, testing and choosing a capable team.
- HL7 FHIR ConsultingWhat HL7 FHIR consultants deliver, from interoperability strategy and regulatory readiness to architecture reviews and IG authoring, and how to pick a firm.
Find the Right FHIR Integration Partner for Your Healthcare Project
Tell us what you need to build or connect. We review every request and share a short list of relevant vendors from our directory — no obligation.