---
title: "Create a new lab order"
method: POST
path: "/Labs"
tags: ["Labs"]
---

# Create a new lab order

`POST /Labs`

## Request body

- CreateLabOrderDto
  - `patientId` string
  - `appointmentId` string, nullable
  - `title` string
  - `testType` string, nullable
  - `source` string, nullable
  - `externalId` string, nullable
  - `accessionNumber` string, nullable
  - `collectedAt` string, date-time, nullable
  - `priority` string, nullable
  - `labPanelId` string, nullable
  - `results` CreateLabResultDto[], nullable
    - `testName` string
    - `testCode` string, nullable
    - `value` string
    - `numericValue` union
      - number, double
      - string, double
    - `unit` string, nullable
    - `referenceRange` string, nullable
    - `referenceLow` union
      - number, double
      - string, double
    - `referenceHigh` union
      - number, double
      - string, double
    - `flag` string, nullable
    - `displayOrder` union
      - integer
      - string, int32
    - `comment` string, nullable

## Response `200`

OK

- LabOrderDto
  - `id` string
  - `patientId` string
  - `patient` LabPatientSummaryDto
    - `id` string
    - `name` string
    - `species` string, nullable
    - `ownerName` string, nullable
  - `orderedById` string, nullable
  - `orderedBy` LabUserSummaryDto
    - `id` string
    - `name` string
    - `role` string, nullable
  - `appointmentId` string, nullable
  - `title` string
  - `testType` string
  - `status` string
  - `resultStatus` string
  - `source` string
  - `externalId` string, nullable
  - `performingLabName` string, nullable — The laboratory behind the Greywind hub that actually ran this, and its id (ITE-552). Null when the order did not come through Greywind, or when the partner directory had not been mirrored when the result landed — the sync backfills the name in that case.
  - `externalPartnerId` string, nullable
  - `submissionUnconfirmedAt` string, date-time, nullable — Set when the submission's outcome was never confirmed with the laboratory (ITE-494) — the order may or may not be live there, and it must never be resubmitted on a guess.
  - `submissionIssue` string, nullable
  - `sampleArrivedAt` string, date-time, nullable — When the laboratory confirmed the sample arrived (ITE-494). Null if they have not.
  - `accessionNumber` string, nullable
  - `collectedAt` string, date-time, nullable
  - `resultsReceivedAt` string, date-time, nullable
  - `reviewedById` string, nullable
  - `reviewedBy` LabUserSummaryDto
    - `id` string
    - `name` string
    - `role` string, nullable
  - `reviewedAt` string, date-time, nullable
  - `summary` string, nullable
  - `reportUrl` string, nullable
  - `reportFileId` string, nullable — PatientFile id of the stored report PDF, presigned on demand via `GET labs/{id}/report-url` (Business API). Wins over string? LabOrderDto.ReportUrl when both are set — older orders still carry an expired presigned URL there.
  - `priority` string
  - `labPanelId` string, nullable
  - `submissionGroupId` string, nullable — Groups sibling orders created by one external submission (ITE-493). Null for manual orders.
  - `manifestFileId` string, nullable — PatientFile id of the stored requisition manifest, when the order went to an external lab.
  - `requiresPartnerAction` boolean — True while the order still needs partner-hosted pages completed before it is really placed.
  - `results` LabResultDto[]
    - `id` string
    - `labOrderId` string
    - `testName` string
    - `testCode` string, nullable
    - `value` string
    - `numericValue` union
      - number, double
      - string, double
    - `unit` string, nullable
    - `referenceRange` string, nullable
    - `referenceLow` union
      - number, double
      - string, double
    - `referenceHigh` union
      - number, double
      - string, double
    - `flag` string, nullable — The flag name, or null when none was reported and none could be derived (ITE-548). Clients must render null as its own state — not as a badge in either direction.
    - `displayOrder` union
      - integer
      - string, int32
    - `comment` string, nullable
    - `createdAt` string, date-time
    - `supersededAt` string, date-time, nullable — Set when a later report replaced this value (ITE-492). Null means this is the value that currently stands. Superseded rows are returned rather than filtered out on purpose: a clinician who acted on the original needs to see that it changed, not just the new number appearing as if it had always been there.
    - `supersededByResultId` string, nullable — The result that replaced this one, when superseded.
    - `referenceIntervalAmendedAt` string, date-time, nullable — Set when a clinician corrected this result's reference interval (ITE-499). Null means the interval is still exactly what the laboratory or analyzer sent. Clients must surface this. A value flagged against a corrected interval is a different clinical claim from one flagged against the lab's own, and a reader who cannot tell the two apart cannot judge how much to trust the flag.
    - `amendments` LabResultAmendmentDto[] — The correction trail, oldest first. Empty for the overwhelming majority of results.
      - `id` string
      - `originalReferenceLow` union
        - number, double
        - string, double
      - `originalReferenceHigh` union
        - number, double
        - string, double
      - `originalReferenceRange` string, nullable
      - `amendedReferenceLow` union
        - number, double
        - string, double
      - `amendedReferenceHigh` union
        - number, double
        - string, double
      - `amendedReferenceRange` string, nullable
      - `originalFlag` string, nullable — Flag name before the correction, or null when none was ever asserted.
      - `amendedFlag` string, nullable — Flag name after re-derivation, or null when the corrected interval implies none.
      - `reason` string, nullable
      - `amendedById` string, nullable
      - `amendedByName` string, nullable — Always populated — "System" when there is no human author, so the trail cannot render as a blank that reads like a missing record.
      - `createdAt` string, date-time
  - `notes` LabNoteDto[]
    - `id` string
    - `labOrderId` string
    - `authorId` string, nullable — Null for a system-generated note, which has no human author (ITE-550).
    - `authorName` string, nullable — Always populated — "System" when there is no author. Never blank.
    - `content` string
    - `isSystemGenerated` boolean
    - `createdAt` string, date-time
  - `createdAt` string, date-time
  - `updatedAt` string, date-time

## Changes

- **2026-09-30** `d58b40cfca93` — 3 info
  - added the optional property `reportFileId` to the response with the `200` status (media type: text/plain)
  - added the optional property `reportFileId` to the response with the `200` status (media type: application/json)
  - added the optional property `reportFileId` to the response with the `200` status (media type: text/json)
- **2026-08-26** `a57456aa87b0` — 6 breaking, 36 info
  - the response property `notes/items/authorId` became nullable for the status `200` (media type: text/plain)
  - the response property `notes/items/authorId` became nullable for the status `200` (media type: application/json)
  - the response property `notes/items/authorId` became nullable for the status `200` (media type: text/json)
  - the response property `results/items/flag` became nullable for the status `200` (media type: text/plain)
  - …38 more

[Change history](https://skmtc.dev/clinicos/apis/pawthosx-business-api-v1/changes/Labs/post.md)

---

[API](https://skmtc.dev/clinicos/apis/pawthosx-business-api-v1.md) · [All operations](https://skmtc.dev/clinicos/apis/pawthosx-business-api-v1/llms.txt) · [OpenAPI document](https://skmtc.dev/clinicos/apis/pawthosx-business-api-v1/revisions/021fabd866ff?raw)
