Fires when a lab order's status changes. targetEntity is the LabOrder. The eventType is lab_order_status_update.
Field guarantees
| Field | Guarantee |
|---|---|
eventData.newStatus (v1) | ⚠️ Conditional — present on most paths; the lab-integration (Junction) paths emit a different shape entirely |
eventData.performedBy (v1) | ⚠️ Conditional — only on some paths |
v2 lab reference (lab_order_id, lab_order_status) | ✅ Always present |
eventDatashape varies by path. Some firings send{newStatus, performedBy}, others{newStatus}, and the Junction integration emitslabOrderId/vitalOrderId-style fields instead. Rely on the lab-order reference; in v2,lab_order_statusreflects the current status.
v1 payload (legacy)
Common shape. ownerEntity/targetEntity abbreviated.
{
"ownerEntityModel": "Patient",
"targetEntityModel": "LabOrder",
"deleted": false,
"ownerEntity": { "id": "pat::40c75435-xxxx-xxxx-xxxx-25220febd9cf", "firstName": "<PATIENT_FIRST_NAME>", "lastName": "<PATIENT_LAST_NAME>", "…": "full patient document" },
"targetEntity": { "id": "lbo::3293cd49-xxxx-xxxx-xxxx-c8bb185b979a", "status": "received", "…": "full lab order" },
"eventTitle": "Lab order status updated to received.",
"eventType": "lab_order_status_update",
"eventData": {
"newStatus": "received",
"performedBy": { "id": "usr::a53e1c4b-xxxx-xxxx-xxxx-a6595eb8c3f4", "role": "admin", "name": "<ADMIN_NAME>" }
},
"createdAt": "2025-06-19T16:30:00.000Z",
"updatedAt": "2025-06-19T16:30:00.000Z",
"id": "event::7c9338c2-xxxx-xxxx-xxxx-2d10c34b8289"
}eventData field | Type | Always? | Notes |
|---|---|---|---|
newStatus | string | ⚠️ | Present on most paths; Junction paths use a different shape |
performedBy | object | ⚠️ | Only on some paths |
v2 payload
Sanitized envelope. newStatus aliases to order_status, which is not on the LAB allowlist and is dropped — but lab_order_status (from the lab order) reflects the current status. performedBy is stripped.
{
"event_type": "lab_order_status_update",
"event_id": "event::7c9338c2-xxxx-xxxx-xxxx-2d10c34b8289",
"api_version": "2026-08-09",
"timestamp": "2026-05-30T14:00:00.000Z",
"affiliate_id": "aff::81fdb635-xxxx-xxxx-xxxx-3568ba573d7d",
"patient_id": "pat::40c75435-xxxx-xxxx-xxxx-25220febd9cf",
"patient_external_id": "ext-patient-123",
"patient_marketing_consent": false,
"is_returning_patient": false,
"lab_order_id": "lbo::3293cd49-xxxx-xxxx-xxxx-c8bb185b979a",
"lab_order_status": "received"
}| Field | Delivered in v2 | Notes |
|---|---|---|
| Envelope + patient identity | ✅ | |
lab_order_id, lab_order_status | ✅ | lab_order_status carries the current status |
newStatus, performedBy | ⛔ | Alias target order_status not on LAB allowlist; performedBy stripped |
Completing the loop on v2. Full lab-order detail — the external requisition id (labOrderId), lab name, results, and a status history with dates — is retrievable viaGET /labOrders/:idusing the deliveredlab_order_id. The endpoint is scoped to your affiliate.
