Displays the contents of a FHIR Bundle in a number of different visualizations.

There are 2 ways to specify the bundle:
  • By entering a query url that will return a Bundle. Generally this will be to a FHIR server, but it can be any Bundle accessible via HTTP. Url's can be saved in the browser cache for easy access if needed. Saved queries are in the list to the right, use the 'enter query' tab above to enter a new one
  • You can paste a bundle directly into the tab above - either Json or XML is supported.


Data server: {{dataServer.name}} ({{dataServer.url}}) Change

The data server is the 'default' server when creating a query. You can however specify any server you want by using the full url when creating the query.

Validation options

Validation server: {{validationServer.name}} ({{validationServer.url}}) Change

Used when validating the bundle and its contents. This occurs automatically when a bundle is processed and displayed, unless disabled using the otion below.

Saved queries

Queries are saved in the local browser cache

Paste a bundle into the text area to the right.

Click the 'View bundle' button (that will appear) to start the Visualizer.

Either Json or XML can be used. XML will be converted to Json (using the Lantana library) before being displayed.

Enter a query that returns a FHIR bundle

The query can be to a FHIR server or standard server (like a bundle stored in Github)

You can use the currently configured data server ({{dataServer.url}}) or any other server. To specify another server simply use the full url - eg http://myserver/mybundle. If you leave off the 'http' the app will assume you are making standard FHIR query (Only a GET is supported)

You can change the configured server here.

If you want to save the query (so it will appear in your personal list, you need to specify a name in the box below and click the 'Add query to list' button that appears after testing the query.

Use full query (incl. http) if to a different server

Required if the query is to be saved

Executed query
{{executedQueryBundle | json}}

{{exampleBundle | json}}

Adding a bundle to view

The left pane allows 2 ways to add a bundle to the visualizer.
  • A bundle can be pasted in directly by clicking the 'Import Bundle'. Json bundles are processed directly. XML bundles are saved to the Data server, and then retrieved as Json. In either case the bundle can be saved to the bundle list by supplying an identifier.
  • A query can be entered that will call the REST API of a server to return the bundle. The format must be Json and the server must support CORS.
Strategy for determining references between resources

  • If an entry has a fullUrl (preferred), then this will become the id of the resource from the perspective of a reference target. Otherwise the data server root, resource type and resource id are combined to make an absolute url to act as the id
  • If a reference is relative, it is combined with the server root to make it absolute.
Link to on-line docs

Bundle entries {{fhir.entry.length}}
{{entry.resource.resourceType}} {{hashErrors[$index].length}}
{{entry.resource.text.div | cleanTextDiv | limitTo:50}}
Id: {{entry.resource.id}}
{{entry.resource.text.div | cleanTextDiv | limitTo:50}}
Id: {{entry.resource.id}}
{{selectedBundleEntry.resource | json}}
{{selectedBundleEntry | json}}

Hide Patient

{{selectedFromSingleGraph | json}}

{{obs.text.div | cleanTextDiv}}
{{obs.valueCodeableConcept.text}} {{obs.valueString}} {{obs.valueQuantity.value}}

Errors {{selectedBundleEntryErrors.length}}
Validation Server: {{validationServer.url}}
{{err.severity}} {{err.diagnostics}} {{err.details.text}}

  • "Resource should have narrative..." means you're missing the .text element
  • "Unable to resolve resource..." errors simply mean that the referenced resource was not found on the Validation server. These can generally be ignored.
{{resourceFromSection | json}}
Expansion {{selectedBundleEntry.resource.expansion.contains.length}}
Canonicals {{hashRefsByResource[selectedBundleEntry.resource.id].length}}
{{hashRefsByResource[selectedBundleEntry.resource.id] | json}}
Large graphs can take a while to render in the graph. Be patient!
Hide Patient
{{selectedNode.entry.resource | json}}
{{selectedNode.entry | json}}

{{obs.text.div | cleanTextDiv}}
{{obs.valueCodeableConcept.text}} {{obs.valueString}} {{obs.valueQuantity.value}} {{obs.valueQuantity.unit}}
{{selectedCanResource | json}}
Expansion {{selectedCanResource.expansion.contains.length}}
Canonicals {{hashRefsByResource[selectedCanResource.id].length}}
{{hashRefsByResource[selectedCanResource.id] | json}}

The deep validation will save all the resources in the bundle to the Validation Server ( {{validationServer.url}} ) and then validate the entire bundle.

In some cases, the server might not save a resource if it has a reference to a resource that has not been saved. In that case, simply repeat the 'Perform Validation' step (you may need to do this multiple times) and eventually all resources will be saved)

Todo: change to allow a transaction as update as well (if the server supports it)
{{deepValidationResult | json}}
{{selectedDeepValidationEntry | json}}
{{cpSummary | json}}

Calling the Inferno API - please be patient!

Oops, there was an error from inferno (likely a timeout)
{{infernoError | json}}

This function will call the Inferno API to perfrom validation.

Note that this is an experimental feature so may not be correct or may fail (currently it seems to be timing out on large documents

{{src | json}}
{{infernoValidationResult | json}}

Document metadata



Derived from the Composition and Subject text elements as per the spec
{{section.code.coding[0].system}} {{section.code.coding[0].code}}
{{selectedEntryFromSection | json}}
Observation Codes
{{selectedObservations[0].code.coding[0].code}} {{selectedObservations[0].code.coding[0].display}}
DateAgeResultReference Range
{{moment(obs.effectiveDateTime).format('YYYY-MM-DD')}} {{obs.effectivePeriod.start}} {{obs.effectivePeriod.end}} {{obs.effectiveDateTime | getAgeSeconds}} {{obs.valueString}}
{{coding.system}} {{coding.code}} {{coding.display}}
{{obs.valueCodeableConcept.text}} {{obs.valueQuantity.value}} {{obs.valueQuantity.unit}}
Selected Observation
{{selectedObservation | json}}
  {{fhir | json}}