A FHIR Data Type is a formal specification for a complex, reusable data structure that standardizes how a common pattern of information is represented across all FHIR resources. Unlike a FHIR Resource, a data type does not stand alone; it exists only as a component within a resource. Examples include the CodeableConcept for representing coded text, the Identifier for business identifiers, and the HumanName for parsing name parts. These types define the structural grammar for healthcare data exchange.
Glossary
FHIR Data Type

What is FHIR Data Type?
A FHIR data type defines a reusable, structured pattern of data elements that can be used as a building block across multiple FHIR resources, ensuring consistency for common patterns like identifiers, human names, and coded concepts.
Data types enforce rigorous constraints on primitive values, such as limiting string lengths or defining precision for decimals. They are the mechanism by which FHIR achieves syntactic consistency, ensuring that an Address or a Period is represented identically whether it appears in a Patient resource or a Location resource. This reusability is fundamental to the 80/20 rule of the FHIR specification, allowing implementers to compose complex clinical documents from a small set of well-understood, validated building blocks.
Key Characteristics of FHIR Data Types
FHIR data types are reusable, complex structures that define common data patterns—like identifiers, quantities, and coded concepts—used consistently across all FHIR resources to ensure semantic interoperability.
Complex Value Encapsulation
Unlike simple primitives, FHIR data types bundle multiple related elements into a single logical unit. For example, a Quantity data type carries both a numerical value and a unit of measure, preventing the ambiguity that arises when these are stored as separate, disconnected fields. This encapsulation ensures that meaning is preserved when data moves between systems.
CodeableConcept: Human & Machine Readability
The CodeableConcept data type is the primary mechanism for representing coded clinical concepts. It contains an array of coding elements, each linking to a specific CodeSystem (like SNOMED CT or LOINC), alongside a text field for the human-readable description. This dual representation allows systems to process structured codes while preserving the original narrative for display.
Identifier: Cross-System Uniqueness
The Identifier data type provides a structured way to represent business identifiers, such as a Medical Record Number or a National Provider Identifier. It combines a value with a system URI that defines the identifier's namespace, ensuring global uniqueness. This prevents collisions when integrating data from multiple healthcare organizations.
HumanName: Parsed Name Components
Rather than storing a name as a single string, the HumanName data type breaks it down into discrete, searchable components:
familyfor surnamegivenfor first and middle namesprefixandsuffixfor titles and credentials This granular structure supports accurate patient matching and international name formatting.
Period & Timing: Temporal Precision
FHIR uses dedicated data types to handle time with clinical precision. Period defines a span with explicit start and end timestamps. Timing is more complex, handling recurring events with a structured repeat element that defines frequency, period, and bounds. This allows precise modeling of medication schedules and encounter durations.
Extension: The Built-in Escape Hatch
Every FHIR data type and resource can be extended using the Extension mechanism without breaking conformance to the base specification. An extension is itself a data type containing a url that defines its meaning and a value[x] that holds the custom data. This allows implementers to add domain-specific information, such as a patient's preferred language for communication, where no standard element exists.
Primitive vs. Complex Data Types
Structural comparison of FHIR's two fundamental data type categories, contrasting their value representation, internal complexity, and usage patterns across resources.
| Feature | Primitive Types | Complex Types |
|---|---|---|
Value Representation | Single scalar value | Composed of multiple elements |
Internal Structure | Atomic, no child elements | Hierarchical, contains nested elements |
String Example | "Smith" (string type) | HumanName with family, given, prefix |
Has Extensions | ||
Has an 'id' Attribute | ||
Direct JSON Representation | JSON string, number, or boolean | JSON object with nested properties |
XML Representation | XML attribute or text content | XML element with child elements |
Common Use Case | Simple values like booleans, integers, dates | Structured data like CodeableConcept, Identifier, Address |
Common Complex FHIR Data Types
FHIR defines a library of reusable, complex data types that structure common patterns like identifiers, human names, and coded concepts. These types ensure consistency across all FHIR resources.
CodeableConcept
The primary type for representing coded clinical data. It allows a concept to be described using multiple codings from different terminologies simultaneously, along with a plain text representation.
- coding: An array of
Codingelements, each specifying asystem(e.g.,http://snomed.info/sct) and acode. - text: A human-readable string, essential when no suitable code exists.
- Mechanism: Enables terminology translation by sending a SNOMED CT code and an ICD-10-CM code for the same diagnosis in one field.
Identifier
A structured data type used to uniquely identify a real-world entity, such as a patient's medical record number or a national provider identifier. It binds an identifier value to a specific system and assigns a use context.
- system: A URI that defines the namespace for the identifier (e.g.,
urn:oid:2.16.840.1.113883.4.1for NPI). - value: The actual identifier string.
- use: A code specifying the context, such as
usual,official,temp, orsecondary.
HumanName
A complex type for representing human names with full internationalization support. It parses a name into its constituent parts rather than treating it as a single string, enabling reliable indexing and display.
- Parts: Includes
family,given,prefix, andsuffixelements. - Period: Allows tracking of name changes over time with an effective date range.
- use: Indicates the context, such as
official,usual,maiden, oranonymous.
Address
A data type for representing postal addresses with global applicability. It supports both structured components and a formatted text representation for systems that cannot parse the individual parts.
- Structured Parts: Includes
line,city,district,state,postalCode, andcountry. - type: Distinguishes between
postal,physical, andboth. - use: Specifies context like
home,work,temp, orold.
Period
A simple but critical type that defines a time interval with a start and an end boundary. It is used across resources to specify durations for events, names, addresses, and clinical observations.
- Boundaries: Both
startandendare optional, allowing for open-ended intervals. - Precision: Boundaries are
dateTimevalues, supporting varying precision from year down to second. - Usage: Found in
Observation.effectivePeriod,Patient.name.period, andMedicationRequest.dispenseRequest.validityPeriod.
Quantity
A measured amount with a numeric value and a coded unit. It is the foundation for representing lab results, vital signs, and medication dosages, ensuring semantic interoperability of measurements.
- value: A decimal number.
- unit: A human-readable representation of the unit (e.g.,
mg/dL). - system and code: A machine-processable UCUM code (e.g.,
mg/dLasmg/dL). - Comparator: Optional operators like
<,>,<=,>=for ranges.
Enabling Efficiency, Speed & Accuracy
Intelligent Analysis, Decision & Execution
We build AI systems for teams that need search across company data, workflow automation across tools, or AI features inside products and internal software.
Talk to Us
Search across company data
Give teams answers from docs, tickets, runbooks, and product data with sources and permissions.
Useful when people spend too long searching or get different answers from different systems.

Automate internal workflows
Use AI to route work, draft outputs, trigger actions, and keep approvals and logs in place.
Useful when repetitive work moves across multiple tools and teams.

Add AI to products and internal tools
Build assistants, guided actions, or decision support into the software your team or customers already use.
Useful when AI needs to be part of the product, not a separate tool.
Frequently Asked Questions
Clear, technical answers to common questions about the structure, purpose, and application of FHIR data types in healthcare interoperability.
A FHIR data type is a reusable, complex building block that defines the structure of a common data pattern, such as CodeableConcept or Identifier, used across many resources. A FHIR Resource, in contrast, is a discrete, modular unit of data representing a complete clinical or administrative concept, like Patient or Observation. The key distinction is scope and independence: a resource is a standalone entity with its own identity and lifecycle, while a data type is a dependent component that provides a consistent structure for elements within a resource. For example, the Patient.name element uses the HumanName data type, and Patient.identifier uses the Identifier data type. Data types ensure structural consistency across the entire FHIR specification without duplicating definitions.
Related Terms
Explore the fundamental building blocks and related concepts that define how structured data patterns are reused across FHIR resources.
Primitive Data Types
The base scalar types that carry a single value. These are the atomic units of FHIR data.
- string: A sequence of Unicode characters.
- integer / decimal: Numeric values for counts and precise measurements.
- boolean: A true or false value.
- dateTime / date / time / instant: Temporal values with varying precision.
- uri / url / canonical: Strings that conform to specific URI formats for identification and linking.
- base64Binary: Arbitrary binary content encoded as a base64 string.
- code: A string that must match a defined pattern, typically used for controlled vocabularies.
Complex Data Types
Reusable structures composed of multiple elements, including other primitives or complex types. They define common patterns.
- Identifier: Uniquely labels an entity with a system and value pair.
- HumanName: Parses a person's name into components like given, family, and prefix.
- CodeableConcept: A value from a terminology system, including the code, display text, and coding system.
- Address: Structured postal address with street, city, state, and country.
- ContactPoint: A technology-mediated contact detail like a phone number or email.
- Quantity: A measured amount with a numeric value and a coded unit.
- Period: A time range defined by a start and end date/time.
- Ratio / Range: Structures for expressing relationships between quantities and bounded intervals.
The BackboneElement Constraint
A special type of complex data type that can only be used within a single resource and cannot be reused elsewhere. It defines the structure of repeating, nested components.
- Purpose: To model resource-specific, hierarchical data that has no meaning outside its parent context.
- Example:
Patient.contactis a BackboneElement. It defines the relationship and contact details for a patient's emergency contact, a structure unique to the Patient resource. - Key Distinction: Unlike a reusable complex type like
Address, a BackboneElement is not defined globally and cannot be referenced by other resources.
Data Type Choice Elements
A mechanism where a single element can be one of several possible data types, denoted by [x] in the element name.
- Function: Provides flexibility to represent a value in different ways depending on the context.
- Example:
Observation.value[x]can be aQuantity(e.g., 140 mg/dL), aCodeableConcept(e.g., 'Positive'), astring, aboolean, or aRange. - Serialization: The type is appended to the element name in the JSON, e.g.,
valueQuantityorvalueCodeableConcept. This allows a single resource to handle diverse clinical findings.
Representation in JSON and XML
FHIR data types are serialized consistently across formats, ensuring predictable parsing.
- Primitive in JSON: Represented as a JSON string, but can also carry an internal
idandextensionby using an object wrapper:"status": {"extension": [...], "value": "final"}. - Complex in JSON: Represented as a JSON object with properties matching the element names.
- XML Representation: Primitives are attributes or simple elements, while complex types are nested elements. The
valueattribute is used for the actual primitive content when extensions are present. - Consistency: The logical model is format-independent, guaranteeing that the same data structure is understood whether it's in JSON, XML, or RDF.
Common Type Profiles
Standard profiles that constrain base data types for specific use cases, ensuring interoperability.
- SimpleQuantity: A profile on
Quantitythat forbids the use of a comparator, used for exact measurements. - Money: A profile on
Quantitythat constrains the unit to a currency code. - Age: A profile on
Quantitywhere the unit is a time duration, typically used for patient age. - Distance: A profile on
Quantitywhere the unit is a measure of length. - Count: A profile on
Quantitywith no unit, used for a discrete number of items. - Purpose: These profiles provide semantic clarity and allow validators to enforce stricter rules than the base type definition.

About the author
Prasad Kumkar
CEO & MD, Inference Systems
Prasad Kumkar is the CEO & MD of Inference Systems and writes about AI systems architecture, LLM infrastructure, model serving, evaluation, and production deployment. Over 5+ years, he has worked across computer vision models, L5 autonomous vehicle systems, and LLM research, with a focus on taking complex AI ideas into real-world engineering systems.
His work and writing cover AI systems, large language models, AI agents, multimodal systems, autonomous systems, inference optimization, RAG, evaluation, and production AI engineering.
Partnered with leading AI, data, and software stack.
How We Work
Custom AI workflows for your Business
One-fit-all AI don't work for modern businesses. At Inferensys, we aim to understand your business & custom requirements; which we use to define most efficient agentic workflows, the data, and the tools for your business.
01
Review the use case
We understand the task, the users, and where AI can actually help.
Read more02
Pick the right approach
We define what needs search, automation, or product integration.
Read more03
Build the first useful version
We implement the part that proves the value first.
Read more04
Improve from there
We add the checks and visibility needed to keep it useful.
Read moreThe first call is a practical review of your use case and the right next step.
Talk to Us