Standards

CDA vs FHIR: documents vs resources, when each one fits, and how to convert between them

CDA is a document standard: one signed XML file that stays whole. FHIR is a resource standard: small, addressable pieces that an API serves and updates. What that difference means in practice, how FHIR documents (Composition in a Bundle) bring the two together, when CDA is still required, and how conversion works.

by Published 6 min read

Short answer: CDA gives you one document: a signed XML file about one patient at one moment, with narrative a human reads and entries a computer may read, that must stay whole and unchanged. FHIR gives you resources: a Patient, forty Observations, three Conditions, each with its own URL, fetched, searched and updated independently through a REST API. FHIR can also package resources into a document (a Bundle of type document led by a Composition), which is the direct equivalent of CDA. Choose CDA where a regulation or a partner requires it; choose FHIR for APIs, apps and anything that must be queried rather than read.

The two shapes

CDA and FHIR have two different shapes. CDA exchanges whole XML documents built on HL7 v3 data types, identified by OIDs, with mandatory narrative, no querying, no updating and whole-document signing. FHIR exchanges individual JSON or XML resources or Bundles, identified by canonical URLs, with built-in REST querying, versioned updates and profiles published in implementation guides.

CDA / C-CDA FHIR
Unit of exchange A whole document A resource, or a Bundle of resources
Format XML, HL7 v3 data types JSON or XML, FHIR data types
Identification OIDs for templates and code systems URLs (canonical) for profiles and code systems
Human-readable part Mandatory <text> in every section Optional text.div narrative per resource; mandatory in documents
Transport Not defined; carried by XDS, Direct, MLLP, email REST over HTTPS defined by the standard; also messaging and documents
Querying Not possible inside a document; registries index the header Built in: GET /Observation?patient=…&code=…
Updating Never; a new document replaces the old one Resources are versioned and updated in place
Signing Whole document, XML-DSig Whole Bundle possible; individual resources rarely signed
Profiles Templates (templateId) per section and entry StructureDefinition profiles per resource, published in implementation guides
Terminology LOINC section codes, SNOMED/ICD/RxNorm entries Same code systems, as CodeableConcept

What the difference means in practice

In practice the difference between CDA and FHIR is that CDA suits content written once and preserved whole, such as a signed discharge summary, while FHIR suits data that grows and is queried, such as a blood pressure series. A CDA receiver can display but must reconcile to import; a FHIR receiver gets resources already shaped like its own record.

A discharge summary is naturally a document: it is written once, signed by one doctor, and must be reproducible years later exactly as it was read. A blood pressure series is naturally a set of resources: it grows every day, is plotted and filtered, and nobody signs it. CDA handles the first well and the second badly (you would re-send the whole document for each new reading). FHIR handles the second natively and the first through its document mechanism.

The other practical difference is what the receiver can do. A CDA receiver can always display the document; importing its entries requires reconciliation, section by section. A FHIR receiver gets resources that are already in the shape of its own record; the hard questions move to identity (is this the same patient?) and provenance (who asserted this and when?). See Patient matching.

FHIR documents: the meeting point

A FHIR document is a Bundle with type: "document" whose first entry is a Composition. The Composition plays the role of the CDA header and section list: type (LOINC), date, author, subject, custodian, status, and section[] with a title, a code, narrative text and references to the resources that carry the data.

{
  "resourceType": "Bundle",
  "type": "document",
  "identifier": {"system": "urn:ietf:rfc:3986", "value": "urn:uuid:3f2d7a3e-…"},
  "timestamp": "2026-03-14T10:15:00+01:00",
  "entry": [
    {"fullUrl": "urn:uuid:comp-1", "resource": {
      "resourceType": "Composition", "status": "final",
      "type": {"coding": [{"system": "http://loinc.org", "code": "60591-5", "display": "Patient summary Document"}]},
      "subject": {"reference": "urn:uuid:pat-1"},
      "date": "2026-03-14T10:15:00+01:00",
      "author": [{"reference": "urn:uuid:prac-1"}],
      "title": "Patient summary",
      "section": [{
        "title": "Allergies and intolerances",
        "code": {"coding": [{"system": "http://loinc.org", "code": "48765-2"}]},
        "text": {"status": "generated", "div": "<div xmlns=\"http://www.w3.org/1999/xhtml\"><p>Penicillin: rash</p></div>"},
        "entry": [{"reference": "urn:uuid:allergy-1"}]
      }]
    }},
    {"fullUrl": "urn:uuid:pat-1", "resource": {"resourceType": "Patient", "id": "pat-1"}},
    {"fullUrl": "urn:uuid:prac-1", "resource": {"resourceType": "Practitioner", "id": "prac-1"}},
    {"fullUrl": "urn:uuid:allergy-1", "resource": {"resourceType": "AllergyIntolerance", "id": "allergy-1", "patient": {"reference": "urn:uuid:pat-1"}, "code": {"coding": [{"system": "http://snomed.info/sct", "code": "764146007", "display": "Penicillin"}]}}}
  ]
}

The International Patient Summary is exactly this: a FHIR document profile, with a CDA twin for systems that still need it. See also FHIR Bundle explained.

Converting between them

Converting between CDA and FHIR works in both directions with limits. The HL7 C-CDA on FHIR implementation guide maps document types, sections and entries to Composition profiles and resources; narrative-only sections become text without data. FHIR to CDA works for resources that fit C-CDA templates. In either direction, the original should be kept as a DocumentReference with Provenance.

  • CDA → FHIR: the HL7 C-CDA on FHIR implementation guide maps the US document types and sections to Composition profiles; entries map to resources (Problem Concern Act → Condition, Medication Activity → MedicationStatement, Result Observation → Observation). The mapping is deterministic for well-templated Level 3 content and lossy for narrative-only sections, which become text without data.
  • FHIR → CDA: possible for documents whose resources fit the C-CDA templates. Free-form FHIR resources that were never meant as a document (a stream of wearable Observations) do not become a sensible CDA.
  • Keep the original. Whichever direction you convert, store the source as it was received, as a DocumentReference, and let Provenance point from the converted resources to it. Conversion is a view, not a replacement.

When CDA is still the right answer

CDA is still the right answer when the receiving party requires it (US transitions of care, MyHealth@EU patient summary and ePrescription, several national document registries), when the content is legally a document that must be signed and preserved whole, or when the partner's infrastructure is IHE XDS, which indexes documents rather than resources. Otherwise, start with FHIR.

When the receiving party requires it (US transitions of care, MyHealth@EU patient summary and ePrescription today, several national document registries); when the content is legally a document that must be signed and preserved whole; when the partner's infrastructure is IHE XDS, which indexes documents and not resources. In every other case, start with FHIR and produce a FHIR document where a document is needed.

Sources

Frequently asked questions

Is a FHIR document just CDA in JSON?

No. It shares the principles (whole, signed, human-readable, with a header) but its content is ordinary FHIR resources, so the same Observation can live in a document and be served by the API. In CDA, an entry exists only inside its document.

Can I sign a FHIR document?

Yes. Bundle.signature holds a digital signature over the bundle, and the IPS and national guides describe how. In practice many deployments rely on transport security and provenance rather than signatures.

Does FHIR have templateId?

The equivalent is meta.profile, a list of canonical URLs of the StructureDefinitions the resource claims to conform to. Validators check conformance the way CDA schematrons check templates.

Which should a new national programme choose?

Recent programmes (the EHDS exchange format, US patient access rules, the IPS) choose FHIR, with FHIR documents for summaries and letters, and keep a CDA path only for legacy partners.

Anpheros Platform

Try it free in the sandbox

Your first FHIR call in 5 minutes. An HL7 FHIR R4 API with the patient's consent built in: try it in the sandbox, then connect your own app or clinic system.

Free · 30 synthetic patients · no card

This guide is for information and does not replace medical advice. For decisions about your health, talk to your doctor. In an emergency, call your local emergency number (112 in Europe).
Written by
The Anpheros team

Anpheros builds a medical record that the patient controls and can share with any clinic, on an HL7 FHIR R4 platform, based in the EU. These guides help you understand and organise your health; they do not replace your doctor.

About Anpheros →
Anpheros

The more you log, the clearer your record

Your health history in one place, under your control.

Symptom diaryPatterns show over time
Emergency cardQR in your phone's Wallet
All your resultsLabs and reports together
You decideWho sees what, and for how long
Create your free account

Free · Works in your browser · No card