Examples
Issues
| Path | Message |
|---|
Supported resource types
Migrating from HL7 v2? Use the HL7 v2 to FHIR Mapper.
| Path | Message |
|---|
Migrating from HL7 v2? Use the HL7 v2 to FHIR Mapper.
Paste your FHIR R4 JSON resource into the input box, or upload a .json file. You can also drop a file directly onto the text area.
Click Validate. The tool parses the JSON and checks it against the R4 structure for that resource type β required fields, cardinality, data-type formats, and required value sets.
Review the issues table, which lists each error and warning with its element path (for example Patient.birthDate) and, where possible, a suggested fix.
For Bundles, every contained resource is validated and issues are reported with their full path inside the Bundle. Use the example buttons to see common error patterns.
Checks the most common FHIR R4 resource types for required fields, single-versus-repeating cardinality, and correct primitive data types, catching the structural mistakes that break interoperability before you send a resource to a server.
Coded fields such as Observation.status and Bundle.type are checked against their required value sets, so an invalid status like "done" instead of "final" is flagged with the list of allowed codes.
Every issue points to the exact element where it occurs, using a familiar FHIRPath-style path like MedicationRequest.intent, so you can jump straight to the problem instead of hunting through nested JSON.
Drop in a Bundle and each entry's resource is validated independently, with issues reported at their full path inside the Bundle, which is essential when debugging transaction and collection payloads.
Unlike the official validator, which needs a Java runtime and server setup, this runs entirely in your browser. No FHIR payload, which frequently contains protected health information, is ever uploaded.
FHIR resources routinely carry patient names, identifiers, and clinical data. Server-based validators upload that payload, which is a compliance risk. This validator runs entirely client-side, so protected health information stays on your device while you debug a resource.
The reference validator from HL7 is powerful but requires installing Java and configuring packages. For the common case of "is this resource structurally valid?", a browser tool that returns an answer in milliseconds removes all that friction, which matters when you are iterating on an integration.
Healthcare is moving from HL7 v2 to FHIR, and engineers doing that work need quick feedback on the resources they produce. This validator pairs with the HL7 v2 to FHIR Mapper so you can convert and then immediately check the result, all in one private workflow.
Instead of a wall of schema jargon, issues are presented as a readable table with severity, element path, and a plain-language message plus a fix suggestion where one applies, so even developers new to FHIR can act on the results.
FHIR β Fast Healthcare Interoperability Resources β is the modern standard for exchanging healthcare data, developed by HL7 to replace the cryptic pipe-delimited messages of HL7 v2 with clean, web-friendly JSON (or XML). In FHIR, every piece of clinical information is a resource: a Patient, an Observation, a MedicationRequest, a DiagnosticReport, and so on. Resources reference each other and can be bundled together, and they are exchanged over ordinary RESTful APIs. R4 is the most widely deployed version and the one most integrations target today, which is exactly why this validator checks your resources against R4 structural rules.
A FHIR server will reject a resource that does not conform to the standard, and subtle structural mistakes are easy to make by hand or when transforming data from another format. Validating before you send saves a frustrating round-trip and surfaces problems while the context is fresh. Validation answers a precise question: does this JSON match the rules FHIR defines for its resource type?
resourceType. Without it, nothing else can be checked.status and code; a Bundle requires type. Missing a required field is a hard error.date must look like YYYY, YYYY-MM, or YYYY-MM-DD; an instant needs a full timestamp with a timezone. A number where a date string is expected is caught immediately.Not every issue is fatal. The validator separates hard errors β a missing required field, a wrong data type, a code outside a required value set β from warnings, which flag things that are suspicious but technically allowed, such as a CodeableConcept with neither a coding nor text. Treat errors as blockers and warnings as prompts to double-check intent.
A Bundle is a container that carries other resources, used for transactions, search results, documents, and message payloads. Validating a Bundle means validating each contained resource too. This tool recurses into every entry and reports issues with their full path, so a missing Observation status inside the third entry of a Bundle is pinpointed precisely rather than hidden in the nesting. Because real-world FHIR traffic is so often wrapped in Bundles, this recursive behavior is what makes the validator useful beyond toy examples.
A few errors come up again and again, especially when resources are built by hand or transformed from another format. Dates are a frequent offender: writing a birthDate as "12/05/1990" instead of "1990-05-12" fails because FHIR dates must be ISO-8601. Status codes are another: typing "done" or "complete" where the value set expects "final" is invalid, and the validator lists the allowed codes so you can correct it. Cardinality slips happen when a field that should be a single value is supplied as an array, or a repeating field is given as a bare object. And the simplest mistake of all β forgetting the resourceType property β stops validation before anything else can be checked. Seeing these flagged with the exact element path turns a vague "the server rejected it" into a precise, fixable problem.
This validator is pragmatic, not exhaustive. It covers the common resource types and the structural rules that catch most real-world mistakes, but it does not implement the full FHIR specification, every profile, terminology server lookups, or custom implementation-guide constraints. For formal conformance testing against a specific implementation guide, use the official HL7 validator. For the everyday question of "is this resource structurally sound before I send it?", a fast browser check is exactly the right tool, and it keeps your data private while doing so.
The most common workflow follows a v2-to-FHIR conversion: after mapping a synthetic ADT^A01 message into a Patient and Encounter with the v2-to-FHIR Mapper, paste the resulting JSON straight into this validator to confirm the mapper's output is structurally sound β required fields present, dates in ISO-8601 form, status codes drawn from the right value set β before it ever reaches a sandbox FHIR server.
A second workflow is debugging a server rejection. When a FHIR endpoint returns a generic 400 error for a synthetic Observation resource, pasting the same JSON here usually pinpoints the cause in seconds β commonly a missing code element, a status value like "done" instead of the required "final", or an effectiveDateTime written in a non-ISO format.
A third is validating a batch import before it runs. A transaction Bundle assembled by hand from several synthetic Patient and Observation entries can be pasted whole; the validator recurses into every entry and reports a bad one β say, entry 3 missing its Observation.status β at its exact path, so the one broken record in a batch of twenty does not need to be found by trial and error.
Structural, cardinality, data-type, and value-set checks are implemented for eight resource types. Anything outside this list still parses, but only receives a basic resourceType presence check:
| Resource type | What gets checked |
|---|---|
| Patient | Name, identifier, and gender value-set structure |
| Observation | Required status and code, effective date formats |
| DiagnosticReport | Status, code, and result references |
| Bundle | Required type value set, recursive entry validation |
| Encounter | Required status and class |
| Condition | Clinical-status value-set binding |
| MedicationRequest | Required status and intent value sets |
| Practitioner | Name and identifier structure |
Only JSON input is accepted, matching how most current FHIR R4 integrations exchange data; XML resources are not parsed.
A Patient or Observation resource routinely carries a name, a medical record number, and clinical detail β protected health information under HIPAA. Uploading that JSON to a server-based validator, even a well-intentioned one, creates the kind of data-sharing risk that typically needs a business associate agreement to cover. Because this validator runs entirely in the browser's JavaScript engine, an integration engineer can paste a real (not just a synthetic) resource while debugging a live interface and know the PHI in it never left their machine β no fetch call, no logging, nothing to disclose in a security review.
This validator is one stage of a larger v2-to-FHIR migration workflow. Convert a raw HL7 v2 message with the HL7 v2 to FHIR Mapper, then validate the resulting resource here before it reaches a server. If the original v2 message needs closer inspection first β for example to confirm which segments and fields the mapper actually read β the HL7 Viewer renders the same message as a structured, named tree. Chaining the three tools turns "does my mapped FHIR resource work?" into a fast, private, three-step check.
No. The resource is parsed and validated entirely in your browser. FHIR resources often contain protected health information such as patient names and clinical details, so keeping everything client-side avoids a compliance risk. You can confirm no upload occurs by watching your browser's network tab while validating.
It validates against FHIR R4, the most widely deployed version and the target of most current integrations. The checks cover required fields, cardinality, primitive data-type formats, and required value-set bindings for the supported resource types.
The validator supports the most common types including Patient, Observation, DiagnosticReport, Bundle, Encounter, Condition, MedicationRequest, and Practitioner. Other resource types are accepted but receive only a basic resourceType check, with a note that the deeper validation does not apply.
An error means the resource violates a rule and a FHIR server would likely reject it β a missing required field, a wrong data type, or a code outside a required value set. A warning flags something suspicious but technically allowed, such as a CodeableConcept with neither coding nor text. Errors are blockers; warnings are prompts to review.
Yes. When you validate a Bundle, every resource contained in its entries is validated too. Issues are reported with their full path inside the Bundle, for example Bundle.entry[2].resource.Observation.status, so you can locate a problem in a large payload precisely.
The official HL7 validator is the authoritative tool for formal conformance testing, but it requires a Java runtime and configuration. This tool is a fast, browser-based structural check for the common case, with no setup and full privacy. Use this for quick iteration and the official validator for formal certification against an implementation guide.
After converting an HL7 v2 message to FHIR, you can paste the resulting resource here to confirm it is structurally valid before sending it to a server. The tool links to the HL7 v2 to FHIR Mapper so you can move between conversion and validation in one private workflow.
Yes, completely free with no registration, no upload limits, and no ads. Structural validation, value-set checks, path-level error reporting, and recursive Bundle validation are all available at no cost, with every operation running privately in your browser.
No. It checks base FHIR R4 structure, cardinality, and value sets for the supported resource types, not a profile such as US Core or a national extension. A resource can pass this validator's checks and still fail a US Core profile that requires additional must-support elements or tighter value-set bindings. Use it as a fast first pass, and a profile-aware validator for formal Implementation Guide conformance.
The tool still parses the JSON and checks that resourceType is present and the structure is valid JSON, but it does not run the deeper required-field, cardinality, or value-set checks reserved for the eight fully supported types. The issues table notes when a resource type falls into this basic-check category so you know not to treat a clean result as full validation.
A FHIR Bundle packages resources into one JSON document. Learn the nine Bundle types, entry, fullUrl and request structure, and when each is used.
Read more →
Open a .ndjson FHIR bulk export without fighting your editor: what NDJSON is, why one broken line ruins parsing, and how to read per-resource-type files.
Read more →
Relative, absolute, urn:uuid and contained FHIR references β how each resolves, how transaction bundles rewrite them, and why unresolved ones break pipelines.
Read more →
A practical checklist for inspecting a FHIR Bundle someone sent you: what to check first, how to follow references, and how to spot unresolved ones.
Read more →
Troubleshoot FHIR transaction bundles: urn:uuid fullUrl addressing, entry.request semantics, unresolved references, and why entry order rarely matters.
Read more →
How FHIR Bulk Data works: the $export kick-off, async polling, the output manifest, and why exports return NDJSON files instead of one giant Bundle.
Read more →
Turn a FHIR Bundle into a clean CSV: why flattening is hard, join vs expand for repeats, picking columns, and opening the file in Excel safely.
Read more →
A practical intro to FHIR for healthcare IT: what resources are, how R4 works, how it compares to HL7 v2, and how to validate resources before sending.
Read more →