FHIR

FHIR DiagnosticReport explained: how a lab panel, a pathology report or an imaging report groups its results

DiagnosticReport is the FHIR resource for the signed report: it groups Observations into a panel, carries the conclusion and the PDF, and records who issued it and when. Statuses, categories (lab, radiology, pathology), the link to ImagingStudy, a valid R4 example, and how it differs from DocumentReference.

by Published 6 min read

Short answer: DiagnosticReport is the FHIR resource for a report: the set of findings a laboratory, an imaging department or a pathology service issues together, with a status, a category, who issued it and when, a conclusion, the result Observations it groups, the imagingStudy it describes and a presentedForm (the signed PDF). One blood count is a DiagnosticReport with a dozen Observations; one CT scan is a DiagnosticReport with a narrative conclusion and a link to the images. An Observation is a single value; a DiagnosticReport is the document that delivers many of them.

A valid FHIR R4 example

A valid FHIR R4 DiagnosticReport requires status and code, and in practice also carries subject, category, effective time, issued time, performer and the result Observations it groups. The example below is a final haematology report for a complete blood count, coded with a LOINC panel, linking three Observations, a conclusion with a SNOMED CT code and the signed PDF.

{
  "resourceType": "DiagnosticReport",
  "id": "cbc-2026-03-14",
  "identifier": [{"system": "https://lab.example.org/reports", "value": "RPT-2026-77812"}],
  "basedOn": [{"reference": "ServiceRequest/order-778812"}],
  "status": "final",
  "category": [{"coding": [{"system": "http://terminology.hl7.org/CodeSystem/v2-0074", "code": "HM", "display": "Hematology"}]}],
  "code": {"coding": [{"system": "http://loinc.org", "code": "58410-2", "display": "CBC panel - Blood by Automated count"}]},
  "subject": {"reference": "Patient/example"},
  "encounter": {"reference": "Encounter/visit-2026-03-14"},
  "effectiveDateTime": "2026-03-14T08:40:00+01:00",
  "issued": "2026-03-14T13:05:00+01:00",
  "performer": [{"reference": "Organization/central-lab"}],
  "resultsInterpreter": [{"reference": "Practitioner/haematologist-7"}],
  "specimen": [{"reference": "Specimen/edta-1"}],
  "result": [
    {"reference": "Observation/hgb-2026-03-14"},
    {"reference": "Observation/wbc-2026-03-14"},
    {"reference": "Observation/plt-2026-03-14"}
  ],
  "conclusion": "Mild normocytic anaemia; other parameters within reference ranges.",
  "conclusionCode": [{"coding": [{"system": "http://snomed.info/sct", "code": "271737000", "display": "Anemia"}]}],
  "presentedForm": [{"contentType": "application/pdf", "url": "https://lab.example.org/reports/RPT-2026-77812.pdf", "title": "CBC report"}]
}

Each Observation referenced in result has its own LOINC code, value, unit and reference range, as described in FHIR Observation explained.

Status: the report lifecycle

A FHIR DiagnosticReport's status follows the life of a report: registered when ordered, partial as results arrive, preliminary when complete but unverified, final when signed, then amended, corrected or appended if it changes afterwards; cancelled and entered-in-error close it otherwise. Consumers must watch for amended and corrected reports, because a value final last week may have changed.

registered (ordered, nothing yet) → partial (some results in) → preliminary (all in, not verified) → final (signed) → amended or corrected (changed after signing, with the reason in a note) or appended (more added). cancelled and entered-in-error close it otherwise. Consumers must watch for amended and corrected: a value that was final last week may have changed, and the report's issued time moves.

Category and code

DiagnosticReport.category says which diagnostic service issued the report, using HL7 v2 table 0074 codes such as LAB, HM haematology, CH chemistry, MB microbiology, RAD radiology and PAT pathology. DiagnosticReport.code says what the report is, normally a LOINC panel code for laboratory reports and a LOINC radiology or pathology study code, or a local procedure code, for imaging and pathology.

category uses the HL7 v2 table 0074 diagnostic service section: LAB, HM haematology, CH chemistry, MB microbiology, RAD radiology, PAT pathology, CG cytogenetics and others; US Core requires LAB for laboratory reports. code says what the report is: for labs, a LOINC panel code (CBC 58410-2, comprehensive metabolic panel 24323-8, lipid panel 57698-3); for imaging, a LOINC radiology code or a local procedure code; for pathology, a LOINC pathology study code. See What is a LOINC code?.

Lab, imaging and pathology reports

Laboratory, imaging and pathology reports use the same FHIR DiagnosticReport resource with different elements. A laboratory report groups one Observation per analyte with Specimen resources; an imaging report carries the radiologist's conclusion, a reference to the ImagingStudy and key images; a pathology report holds the diagnosis text, grading Observations and tissue specimens. All three attach a signed PDF in presentedForm.

Laboratory Imaging Pathology
result One Observation per analyte Usually none; sometimes measurements Observations for grading, markers, margins
conclusion Optional comment The radiologist's impression The diagnosis text
imagingStudy — Reference to the ImagingStudy Whole-slide images where digital
media — Key images Representative slide images
presentedForm Signed PDF Signed PDF Signed PDF
specimen Blood, urine… Specimen resources — Tissue Specimen resources

For imaging, the images themselves stay in DICOM; see FHIR ImagingStudy vs DICOMweb. For the patient-facing meaning of these reports, see How to read your lab results and CT scan report explained.

DiagnosticReport vs DocumentReference

A FHIR DiagnosticReport is a structured report whose findings are, or can be, coded Observations, while a DocumentReference is a pointer to a document of any kind with metadata and the file. Structured laboratory results become a DiagnosticReport; a scanned PDF with no structured data becomes a DocumentReference, and many systems create both for the same report.

A DiagnosticReport is a structured report whose findings are (or can be) coded Observations; a DocumentReference is a pointer to a document of any kind, with metadata and the file. A lab report that arrives as HL7 v2 ORU becomes a DiagnosticReport with Observations. A scanned PDF of a report from another country, with no structured data, is a DocumentReference. Many systems create both: the DiagnosticReport for the data, with presentedForm or a DocumentReference for the signed file. See DocumentReference vs DiagnosticReport vs Binary.

Mistakes that break reports

The mistakes that most often break FHIR DiagnosticReports are sending Observations with no report to group them, marking a report final while its Observations are still preliminary, duplicating the conclusion into an Observation with an invented code, omitting the issued timestamp so corrections cannot be detected, and inventing local panel codes where a LOINC panel already exists.

  • Results written as Observations with no DiagnosticReport, so a consumer cannot tell which values were issued together or which report was amended.
  • status: final on a report whose Observations are still preliminary.
  • The conclusion duplicated into an Observation with a made-up code.
  • issued missing, so the consumer cannot order reports or detect corrections.
  • Panel codes invented locally when a LOINC panel exists.

In Anpheros

Anpheros Platform turns laboratory results that arrive through its lab connector, as HL7 v2 ORU, CSV or JSON, into FHIR Observations grouped under a DiagnosticReport, with the laboratory as performer and the original file as presentedForm where available. A report a person scans in the app is kept as one report with its individual results and the original image.

The lab connector documents the accepted formats. Because the scanned original is kept with the report, a clinician can check any value against the source. Amended reports keep their history through resource versions.

Sources

Frequently asked questions

Do I need a DiagnosticReport for a single test?

Strictly, a single Observation can stand alone, and home measurements usually do. Anything issued by a laboratory is better wrapped in a DiagnosticReport, even with one result, so status, issuer and the signed form travel with it.

How do I represent an amended result?

Update the Observation (its version changes), set the DiagnosticReport status to amended or corrected, update issued, and record the reason in a note. Never create a second report with the same identifier.

Where does the reference range go?

On each Observation, in referenceRange, because ranges differ per analyte and per laboratory. The report has no range of its own.

Can a DiagnosticReport contain other reports?

Not directly in R4; related reports reference each other through basedOn or extensions, and a panel's sub-panels are usually modelled as Observations with hasMember. R5 keeps the same approach.

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