Skip to main content

Corsano Vital Signs Webhook Specification (HL7)

The webhook sends vital signs in one of two HL7 formats: HL7 FHIR R5 or HL7 v2.5.1. Select the format with the payload format setting (hl7-fhir or hl7-v2). Each section below shows both formats in tabs, so you can compare them. When you select a tab, all the tabs on the page change to that format. We welcome you to test out our webhook and share your feedback.

Enabling HL7 FHIR R5 JSON in the on-prem system

1. Overview​

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

HL7 FHIR R5HL7 v2.5.1
PayloadFHIR Bundle in JSONORU^R01 message in pipe-delimited (ER7) encoding
Content-Typeapplication/fhir+jsonx-application/hl7-v2+er7; charset=utf-8
One measurementOne ObservationOne OBX segment
Blood pressureOne Observation with systolic and diastolic componentsTwo OBX segments: systolic and diastolic
Measurement timeeffectiveDateTimeOBR-7 and OBX-14
Recommended responseHTTP 204 No ContentHTTP 200 with an HL7 ACK

Supported measurements:

MeasurementLOINCUnitFHIR identifier suffixHL7 v2 OBX-4
Heart rate8867-4/min_hrhr
SpO22708-6%_spo2spo2
Respiratory rate9279-1/min_rrrr
Body temperature8310-5Cel or [degF]_temptemp
Blood pressure panel (FHIR only)85354-9mm[Hg]_bp—
Systolic blood pressure8480-6mm[Hg]_bp (component)bp
Diastolic blood pressure8462-4mm[Hg]_bp (component)bp

Measurements are normally generated approximately once per minute.

2. Webhook​

Production endpoints use HTTPS.

POST
Content-Type: application/fhir+json

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​

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

The patient is referenced through subject.

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

5. Observation Identifier​

Each observation has a unique and stable identifier. The identifier is the same in both formats, for example RABNC_1787064000000_hr.

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

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

Recommended suffixes:

_hr
_spo2
_rr
_temp
_bp

6. Heart Rate​

LOINC: 8867-4

{
"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​

Systolic blood pressure: 8480-6

Diastolic blood pressure: 8462-4

Both values use UCUM mm[Hg].

Blood pressure uses one Observation with LOINC 85354-9 (blood pressure panel). Systolic and diastolic are components.

{
"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. Complete Example​

The Bundle contains one entry for each Observation. The Observations are the same as in sections 6–10.

12. Measurement Time​

Each measurement contains the time represented by the measurement. Timestamps include the timezone.

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

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

13. 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

14. 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

15. 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