Skip to main content

Corsano Vital Signs Webhook Specification

This webhook currently uses HL7 FHIR R5. We plan to support FHIR R4 (4.0.1) and HL7 v2.x as well, since these are still extremely common in hospital systems. We welcome you to test out our webhook and share your feedback.

1. Overview

Enabling HL7 FHIR R5 JSON in the on-prem system

The webhook delivers physiological measurements collected or derived by the Corsano wearable.

The payload uses HL7 FHIR R5 JSON.

Supported measurements:

MeasurementLOINCUnit
Heart rate8867-4/min
SpO22708-6%
Respiratory rate9279-1/min
Body temperature8310-5Cel or [degF]
Blood pressure85354-9mm[Hg]
Systolic blood pressure8480-6mm[Hg]
Diastolic blood pressure8462-4mm[Hg]

Measurements are normally generated approximately once per minute.

2. Webhook

The webhook uses:

POST
Content-Type: application/fhir+json

Production endpoints use HTTPS.

The request body contains a FHIR R5 Bundle.

{
"resourceType": "Bundle",
"type": "collection",
"timestamp": "2026-08-18T16:40:00+02:00",
"entry": []
}

Each measurement is represented as an Observation.

Heart rate, SpO2, respiratory rate and temperature use separate Observations.

Blood pressure uses one Observation containing systolic and diastolic components.

3. Common Observation Fields

Each Observation contains:

resourceType
identifier
status
category
code
subject
effectiveDateTime

Scalar measurements also contain:

valueQuantity

Example category:

{
"category": [
{
"coding": [
{
"system": "http://terminology.hl7.org/CodeSystem/observation-category",
"code": "vital-signs",
"display": "Vital Signs"
}
]
}
]
}

Completed measurements use:

{
"status": "final"
}

4. Patient Reference

The patient is referenced through subject.

{
"subject": {
"reference": "Patient/RABNC"
}
}

The patient identifier and mapping to the receiving EMR are agreed as part of the integration.

5. Observation Identifier

Each Observation has a unique and stable identifier.

{
"identifier": [
{
"system": "https://corsano.com/fhir/observation",
"value": "RABNC_1787064000000_hr"
}
]
}

Recommended suffixes:

_hr
_spo2
_rr
_temp
_bp

The identifier remains unchanged if the same measurement is delivered again.

6. Heart Rate

LOINC:

8867-4

Example:

{
"resourceType": "Observation",
"identifier": [
{
"system": "https://corsano.com/fhir/observation",
"value": "RABNC_1787064000000_hr"
}
],
"status": "final",
"category": [
{
"coding": [
{
"system": "http://terminology.hl7.org/CodeSystem/observation-category",
"code": "vital-signs",
"display": "Vital Signs"
}
]
}
],
"code": {
"coding": [
{
"system": "http://loinc.org",
"code": "8867-4",
"display": "Heart rate"
}
]
},
"subject": {
"reference": "Patient/RABNC"
},
"effectiveDateTime": "2026-08-18T16:40:00+02:00",
"valueQuantity": {
"value": 72,
"unit": "beats/minute",
"system": "http://unitsofmeasure.org",
"code": "/min"
}
}

7. SpO2

LOINC:

2708-6

Example value:

{
"valueQuantity": {
"value": 98,
"unit": "%",
"system": "http://unitsofmeasure.org",
"code": "%"
}
}

8. Respiratory Rate

LOINC:

9279-1

Example value:

{
"valueQuantity": {
"value": 21.75,
"unit": "breaths/minute",
"system": "http://unitsofmeasure.org",
"code": "/min"
}
}

9. Body Temperature

LOINC:

8310-5

Celsius uses UCUM Cel.

{
"code": {
"coding": [
{
"system": "http://loinc.org",
"code": "8310-5",
"display": "Body temperature"
}
],
"text": "Core body temperature"
},
"valueQuantity": {
"value": 37.1,
"unit": "°C",
"system": "http://unitsofmeasure.org",
"code": "Cel"
}
}

Fahrenheit uses UCUM [degF].

{
"valueQuantity": {
"value": 98.8,
"unit": "°F",
"system": "http://unitsofmeasure.org",
"code": "[degF]"
}
}

10. Blood Pressure

Blood pressure uses LOINC:

85354-9

Systolic blood pressure:

8480-6

Diastolic blood pressure:

8462-4

Both values use UCUM:

mm[Hg]

Example:

{
"resourceType": "Observation",
"identifier": [
{
"system": "https://corsano.com/fhir/observation",
"value": "RABNC_1787064000000_bp"
}
],
"status": "final",
"category": [
{
"coding": [
{
"system": "http://terminology.hl7.org/CodeSystem/observation-category",
"code": "vital-signs",
"display": "Vital Signs"
}
]
}
],
"code": {
"coding": [
{
"system": "http://loinc.org",
"code": "85354-9",
"display": "Blood pressure panel with all children optional"
}
],
"text": "Blood pressure"
},
"subject": {
"reference": "Patient/RABNC"
},
"effectiveDateTime": "2026-08-18T16:40:00+02:00",
"component": [
{
"code": {
"coding": [
{
"system": "http://loinc.org",
"code": "8480-6",
"display": "Systolic blood pressure"
}
]
},
"valueQuantity": {
"value": 118,
"unit": "mmHg",
"system": "http://unitsofmeasure.org",
"code": "mm[Hg]"
}
},
{
"code": {
"coding": [
{
"system": "http://loinc.org",
"code": "8462-4",
"display": "Diastolic blood pressure"
}
]
},
"valueQuantity": {
"value": 76,
"unit": "mmHg",
"system": "http://unitsofmeasure.org",
"code": "mm[Hg]"
}
}
]
}

11. Measurement Time

Each Observation contains the time represented by the measurement.

{
"effectiveDateTime": "2026-08-18T16:40:00+02:00"
}

Timestamps include the timezone.

When several minutes are included in one webhook, each measurement keeps its own timestamp.

12. Units

MeasurementDisplayUCUM
Heart ratebeats/minute/min
SpO2%%
Respiratory ratebreaths/minute/min
Temperature°CCel
Temperature°F[degF]
Blood pressuremmHgmm[Hg]

The machine readable unit system is:

http://unitsofmeasure.org

13. Webhook Response

Successful processing returns HTTP 2xx.

Recommended:

HTTP/1.1 204 No Content

Supported error responses:

400 Invalid request
401 Authentication failed
403 Not authorized
422 Invalid FHIR or measurement data
429 Rate limit
500 Server error

14. Validation

Payloads are validated against FHIR R5.

The integration also verifies:

  1. LOINC codes
  2. UCUM units
  3. patient references
  4. observation timestamps
  5. blood pressure component structure
  6. compatibility with the receiving EMR