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

The webhook delivers physiological measurements collected or derived by the Corsano wearable.
The payload uses HL7 FHIR R5 JSON.
Supported measurements:
| Measurement | LOINC | Unit |
|---|---|---|
| Heart rate | 8867-4 | /min |
| SpO2 | 2708-6 | % |
| Respiratory rate | 9279-1 | /min |
| Body temperature | 8310-5 | Cel or [degF] |
| Blood pressure | 85354-9 | mm[Hg] |
| Systolic blood pressure | 8480-6 | mm[Hg] |
| Diastolic blood pressure | 8462-4 | mm[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
| Measurement | Display | UCUM |
|---|---|---|
| Heart rate | beats/minute | /min |
| SpO2 | % | % |
| Respiratory rate | breaths/minute | /min |
| Temperature | °C | Cel |
| Temperature | °F | [degF] |
| Blood pressure | mmHg | mm[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:
- LOINC codes
- UCUM units
- patient references
- observation timestamps
- blood pressure component structure
- compatibility with the receiving EMR