Results
Fetching test results as FHIR documents: the download flow, how to read the Bundle structure, out-of-range and critical values, and failure scenarios.
Fetching results
When an order item reaches results.results_ready (via webhook), fetch the result:
GET /api/v1/results/{order_item_id}?test_taker_id={test_taker_id}Both identifiers are required. test_taker_id arrives on every result webhook (and is recoverable from GET /api/v1/orders/{orderID} under items[].test_taker_ids).
{
"download_url": "https://storage.googleapis.com/.../normalised.json?X-Goog-Signature=...",
"format": "json",
"expires_at": "2025-11-19T19:08:04.400Z"
}The presigned download_url is valid for 15 minutes. Re-call the endpoint to mint a fresh URL rather than caching it. Each order item holds at most one panel, so a result is uniquely identified by its order_item_id.
To find results across your account (e.g. ready but unacknowledged), use the GET /api/v1/results index - see Managing orders.
Reading the FHIR document
The download is a FHIR Bundle (JSON) containing three resource types:
DiagnosticReport- the panel: which observations it contains (resultreferences), when it was collected (effectiveDateTime) and issued, and thesubjectpatient.Patient- the test taker's demographics as registered at activation.Observation- one per biomarker: thecode(test identifier and display name),valueQuantity(numeric value + unit),referenceRange(normal bounds), andinterpretation(HL7 coding).
You mostly iterate the Bundle's entry array, pick out the Observation resources, and read value, unit, range, and interpretation from each.
Out-of-range results
Compare valueQuantity.value against referenceRange. In the example below, HDL Cholesterol is below normal, which you can observe from:
low: 40.0,high: 100.0value: 35.2interpretationcodeL("Below low normal")
Interpretation codes follow HL7 table 0078: N normal, L below low normal, H above high normal, with LL / HH marking critical values.
Critical results - must be handled properly
Depending on the test supplier you may receive a results.escalation_raised webhook indicating the overall severity of the result set, with an escalation_level of not_escalated, very_low, low, medium, high, or very_high, and an acknowledgment_due_by deadline. In critical cases the interpretation field will typically carry HH or LL codes.
Escalated results demand prompt review and acknowledgment - see Acknowledging Results and Webhooks.
Failed tests
results.sample_rejectedwebhooks carry afailure_cause(e.g. contamination) when the lab rejects a sample.results.lab_processing_errorindicates the lab could not process the sample.
In either case there will be no result document to fetch for that item; handle these paths in your product flow (e.g. offer a replacement kit).
Example result document
Last updated
Was this helpful?