Skip to content

Results

After a session completes, vital signs results are returned directly in the POST /sdk/session/upload-complete response. Results are not stored on our side — the uploaded RGB tensor is discarded after inference and the result is not retained. If your application needs to keep a user’s results, persist them in your own database when you receive the response.

{
"session_id": "a1b2c3d4-e5f6-7890-abcd-ef1234567890",
"status": "completed",
"vitals": {
"heart_rate": 72,
"respiratory_rate": 16,
"hrv": 45.2,
"spo2": 98.1,
"systolic_bp": 122,
"diastolic_bp": 78,
"confidence": 0.87
},
"completed_at": 1712001900
}
FieldTypeUnitDescription
heart_ratenumberBPMHeart rate in beats per minute
respiratory_ratenumberbreaths/minRespiratory rate in breaths per minute
hrvnumbermsHeart rate variability (SDNN) in milliseconds
spo2number%Blood oxygen saturation percentage
systolic_bpnumbermmHgSystolic blood pressure
diastolic_bpnumbermmHgDiastolic blood pressure
confidencenumber0–1Measurement reliability score

All vital sign fields are present on every completed result. The confidence score applies to the measurement as a whole.

These are the expected ranges for healthy adults. Values outside these ranges are still valid measurements — they may indicate a health condition.

VitalTypical Range
Heart Rate60–100 BPM
Respiratory Rate12–20 breaths/min
HRV (SDNN)20–100 ms
SpO295–100%
Systolic BP90–140 mmHg
Diastolic BP60–90 mmHg

The confidence field indicates how reliable the measurement is, on a scale from 0.0 to 1.0:

RangeMeaningRecommendation
0.7–1.0High confidenceResults are reliable for most use cases
0.4–0.7Moderate confidenceResults are usable but may benefit from a re-scan
0.1–0.4Low confidenceResults may be unreliable — poor lighting, motion, or face detection issues
0.0Fallback valuesInference failed; synthetic values were generated. Do not treat as real measurements
const result = await sdk.measureVitals({
videoElement: document.getElementById('preview') as HTMLVideoElement,
});
if (result.confidence === 0) {
// Fallback values — inference failed
showError('Measurement could not be completed. Please retry.');
} else if (result.confidence < 0.4) {
// Low confidence — quality issues
showWarning('Low confidence. Try again with better lighting and hold still.');
} else {
// Good measurement
displayResults(result);
}

Results are returned once in the upload-complete response and are not retained on our side. Your application should handle the results immediately upon receiving the response — Circadify does not have a copy.

The uploaded RGB tensor is processed and discarded after inference completes. The only artifact retained from a scan is a usage record (one scan credit consumed) for billing and quota — no health data, no tensor, no result.

  • Sessions — Session lifecycle and endpoints
  • Errors — Handle error responses
  • Data Flow — Full pipeline walkthrough