---
title: "Record a new vital measurement for a patient. Triggers VitalsOutOfRange automation if the value is outside normal range."
method: POST
path: "/patients/{patientId}/Vitals"
tags: ["Vitals"]
---

# Record a new vital measurement for a patient. Triggers VitalsOutOfRange automation if the value is outside normal range.

`POST /patients/{patientId}/Vitals`

## Request

- Base URL: `https://api.clinicos.vet/backend/business`
- URL: `https://api.clinicos.vet/backend/business/patients/{patientId}/Vitals`
- Auth: HTTP bearer
- TypeScript: <https://skmtc.dev/clinicos/apis/pawthosx-business-api-v1/docs/patients/:patientId/Vitals/post.ts> (a function with typed inputs; its response is checked against the schema)

## Path parameters

- `patientId` string, required

## Request body

- RecordVitalRequest
  - `vitalTypeCode` string, required
  - `value` union: Numeric reading, in string? RecordVitalRequest.Unit. Required for Numeric/Scale/Boolean vital types; must be absent for Text types. Nullable since ITE-329 (previously `required double`) — exactly one of decimal? RecordVitalRequest.Value / string? RecordVitalRequest.ValueText is set per request. Decimal since ITE-829: the server stores decimals, and a double here would let float noise back in.
    - number, double
    - string, double
  - `unit` string, nullable: Unit decimal? RecordVitalRequest.Value was taken in (ITE-829): "kg" | "lb" | "g" | "oz" for weight, "c" | "f" for temperature (symbols and plurals like "°C", "lbs" are accepted). Omit for single-unit types and to mean "the vital type's own unit". Clients send what the user typed and never convert; a unit of the wrong quantity is a 400.
  - `valueText` string, nullable: Text reading ("Bright", "pale pink"). Required for Text vital types.
  - `appointmentId` string, nullable
  - `takenById` string, nullable
  - `notes` string, nullable
  - `extractedByAi` boolean: True when the value came from AI transcript extraction and was accepted by the user (PAW-806). Drives the AI badge in the readings list; a human still confirmed it.

## Response `200`

OK

- RecordVitalResponse
  - `id` string, required
  - `patientId` string, required
  - `vitalTypeCode` string, required
  - `vitalTypeLabel` string, required
  - `value` union, required: Numeric reading as entered, in string RecordVitalResponse.Unit; null for Text vital readings (see string? RecordVitalResponse.ValueText).
    - number, double
    - string, double
  - `valueText` string, nullable: Text reading; null for numeric readings.
  - `unit` string, required: Display label of the unit the reading was entered in ("kg", "°C"); the type's unit for text readings.
  - `canonicalValue` union: SI canonical (kg / °C) for weight and temperature; the entered value for single-unit types (ITE-829).
    - number, double
    - string, double
  - `canonicalUnit` string, nullable: Unit code of decimal? RecordVitalResponse.CanonicalValue: "kg", "c", or the entered unit for single-unit types.
  - `takenAt` string, date-time, required
  - `thresholdAlert` VitalThresholdAlertDto
    - `isOutOfRange` boolean
    - `isBelowMin` boolean
    - `isAboveMax` boolean
    - `normalMin` union
      - number, double
      - string, double
    - `normalMax` union
      - number, double
      - string, double
    - `severity` string, required
    - `message` string, required

## Changes

- **2026-09-17** `d4ae30be0619`: 3 warning, 12 info
  - changed the pattern of the request property `value` from `^-?(?:0|[1-9]\d*)(?:\.\d+)?(?:[eE][+-]?\d+)?$` to `^-?(?:0|[1-9]\d*)(?:\.\d+)?$` (media type: application/json)
  - changed the pattern of the request property `value` from `^-?(?:0|[1-9]\d*)(?:\.\d+)?(?:[eE][+-]?\d+)?$` to `^-?(?:0|[1-9]\d*)(?:\.\d+)?$` (media type: text/json)
  - changed the pattern of the request property `value` from `^-?(?:0|[1-9]\d*)(?:\.\d+)?(?:[eE][+-]?\d+)?$` to `^-?(?:0|[1-9]\d*)(?:\.\d+)?$` (media type: application/*+json)
  - added the new optional request property `unit` (media type: application/json)
  - …11 more
- **2026-09-11** `503cd0546309`: 3 info
  - added the new optional request property `extractedByAi` (media type: application/json)
  - added the new optional request property `extractedByAi` (media type: text/json)
  - added the new optional request property `extractedByAi` (media type: application/*+json)
- **2026-08-26** `a57456aa87b0`: 3 breaking, 12 info
  - the response property `value` became nullable for the status `200` (media type: text/plain)
  - the response property `value` became nullable for the status `200` (media type: application/json)
  - the response property `value` became nullable for the status `200` (media type: text/json)
  - added the new optional request property `valueText` (media type: application/json)
  - …11 more

[Operation history](https://skmtc.dev/clinicos/apis/pawthosx-business-api-v1/changes/patients/:patientId/Vitals/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/099cf36186e0?raw)
