4. Reading the error report
Every validation — in the web validator, through the API or in a scenario — produces the same validation report. This chapter explains each part.
The verdict#
At the top you see Valid or Has errors, the resource type, and the profile that was used.
A resource is valid when it has no issues of severity fatal or error. Warnings and information messages never make a resource invalid.
Which profile was used?
If you chose Auto-detect, the sandbox uses the first NP Core profile in meta.profile. If there is
none, it uses the general NP Core profile for the resource type (for example NP Core Patient for any
Patient). Check the profile name in the verdict — validating a lab result against the generic
Observation profile gives different results than against NP Core Laboratory Result Observation.
Severity#
| Severity | Meaning | Must you fix it? |
|---|---|---|
| Fatal | The content could not be processed at all (e.g. broken JSON). Nothing else was checked. | Yes, first |
| Error | A SHALL rule of FHIR or NP Core is broken. Receivers may reject the data. | Yes |
| Warning | A SHOULD rule or best practice is not followed, or a code could not be fully checked. | Review; fix when you can |
| Information | Notes from the validator, e.g. about must-support or slices that did not match. | No |
Fix fatal issues first and re-validate: once the content parses, more issues may appear.
Location paths#
Each issue has a location in FHIRPath-like notation:
Patient.identifier[1].system
Patient.address[0].extension[2].valueCoding.code
Bundle.entry[3].resource/*Observation/bp-1*/.component[0].valueQuantity
- Indexes start at 0:
identifier[1]is the second identifier. Bundle.entry[3].resourceis the fourth entry of a Bundle; the validator often adds the resource type and id in a comment/*Observation/bp-1*/.- A slice name appears after a colon:
Patient.identifier:healthId.
In the web validator, click the location to jump to that line in the editor; the line is highlighted. When the validator reports a line and column (JSON and XML), the jump is exact.
Categories#
The sandbox groups issues into categories so you can see what kind of work is needed. Use the category filter in the results panel.
| Category | Typical cause |
|---|---|
| Missing or repeated elements (cardinality) | A required element or slice is missing, or appears too often |
| Identifiers | Wrong or missing identifier system, missing Health ID / NHFR / council number |
| Codes & terminology | Code not in the bound value set, unknown code system, wrong display |
| References | Reference points to the wrong resource type or cannot be resolved |
| Data formats | Bad date, wrong JSON type, invalid characters, malformed JSON |
| Profile rules | Fixed/pattern value not matched, element not allowed, unknown extension |
| Structure | Unknown property, empty element, wrong order (XML) |
| Business rules (invariants) | An NP Core or FHIR rule such as np-prac-1 or np-addr-1 failed |
Terminology: warnings vs errors#
Terminology issues are the most confusing, because the same mistake can be an error or a warning depending on the binding strength:
| Binding strength | Code not in value set gives |
|---|---|
required |
Error |
extensible |
Warning if a suitable code exists in the value set, otherwise allowed |
preferred / example |
Information or nothing |
Other terminology messages you may see:
- "Unknown code system" — usually a typo in
system, or a local code system. Check the system URI against the Profiles browser. - "Wrong display" — the
displaytext does not match the code system's display. Usually a warning. Copy the official display, or omitdisplay. - "Unable to check … external terminology" — the sandbox does not have a full copy of large external terminologies such as SNOMED CT or LOINC, so it cannot always confirm a code. This is a warning, not a failure of your data. Double-check the code yourself.
The issue card#
Each issue card has:
- Title — a short plain-language name of the problem.
- What it means — the problem in simple words.
- Why — why FHIR or NP Core has this rule.
- How to fix — concrete steps.
- Example — a JSON snippet with a Copy button.
- Open in IG — the IG page that defines the rule.
- Raw validator message — the original text from the HL7 validator (include it when asking for help).
Download, print and share#
- Download JSON report saves the full report, including the raw
OperationOutcome. Attach it to your bug tracker. - Print gives a clean printable view of the results.
- Every validation is saved in Run history, where your team can open it again.
API responses#
Through the API you receive the same information. POST /api/validate returns the report as JSON;
the FHIR endpoint returns a FHIR OperationOutcome where each issue has the explanation in
diagnostics and in an extension. See Machine testing via the API.