Easily estimate vital signs from video
The VitalLens API estimates vital signs such as heart rate, HRV, and respiratory rate from video of the face and upper body. Click any icon below to jump straight to that section of the docs.
Try the API in Your Browser
Try the VitalLens API right in your browser, powered by our JavaScript client.
API Plans
Choose the plan that suits your needs. Monthly plans can be cancelled anytime.
Using VitalLens API for research or studies? Apply for an educational discount.
For high-volume or custom use cases, get in touch for an Enterprise plan.
For General Wellness Only
The VitalLens API provides estimates of vital signs for general wellness and informational purposes only. It is not a medical device and is not intended for the diagnosis, prevention, monitoring, treatment, or alleviation of any disease or condition.
This service is not a substitute for professional medical advice. Please review our Terms of Service.
Frequently asked questions
For a deeper technical dive, see our explainer article: Understanding Remote Photoplethysmography .
The API provides an estimate of the pulse and respiratory waveforms at the same sampling rate as the video. From these, HR, HRV, and RR are derived.
We currently support SDNN, RMSSD, and LF/HF metrics for HRV. Future releases may include additional vital signs such as blood oxygen (SpO2) and blood pressure (BP).
We conducted a study on a large, diverse test benchmark including 422 unique individuals (including data from Vital Videos, UBFC-rPPG, and UBFC-Phys) showing a mean absolute error for HR at 1.57 bpm, for RR at 1.08 bpm, and for HRV-SDNN at 10.18 ms.
Lower confidences indicate less accuracy, which can be improved with high-quality videos.
- Real-time Analysis: Use our JavaScript client (or the
/stream endpoint) to estimate vitals live from a webcam feed or video stream.- Ex-post Analysis: Use our Python client (or the
/file endpoint) to analyze pre-recorded video files uploaded for processing.Regardless of the method, usage is always calculated based on the total number of frames processed.
{
'vital_signs': {
'heart_rate': {
'value': Estimated value as float scalar,
'unit': Value unit,
'confidence': Estimation confidence as float scalar,
'note': Explanatory note
},
'respiratory_rate': {
'value': Estimated value as float scalar,
'unit': Value unit,
'confidence': Estimation confidence as float scalar,
'note': Explanatory note
},
'hrv_sdnn': {
'value': Estimated value as float scalar,
'unit': Value unit,
'confidence': Estimation confidence as float scalar,
'note': Explanatory note
},
'hrv_rmssd': {
'value': Estimated value as float scalar,
'unit': Value unit,
'confidence': Estimation confidence as float scalar,
'note': Explanatory note
},
'hrv_lfhf': {
'value': Estimated value as float scalar,
'unit': Value unit,
'confidence': Estimation confidence as float scalar,
'note': Explanatory note
},
'ppg_waveform': {
'data': Estimated waveform value for each frame,
'unit': Data unit,
'confidence': Estimation confidence for each frame,
'note': Explanatory note
},
'respiratory_waveform': {
'data': Estimated waveform value for each frame,
'unit': Data unit,
'confidence': Estimation confidence for each frame,
'note': Explanatory note
},
},
'face': {
'confidence': Face live confidence for each frame,
'note': Explanatory note
},
'message': Message about estimates
}
- Keep the subject still and facing the camera.
- Ensure a bright and steady light source.
- Use as little video compression as possible if you need to encode the video before using the VitalLens API. Video compression can destroy the vitals signal.
- Offline Analysis (Standard): Typically uses 30 fps for maximum precision. Analyzing 1 minute of video costs 1,800 frame credits (60s x 30 fps).
- Real-time Analysis (Eco Mode): Often uses 15 fps to save bandwidth. Streaming for 1 minute costs 900 frame credits (60s x 15 fps).
Please note that these are just examples. You can configure either real-time or offline analysis to run at 30 fps or 15 fps depending on your specific accuracy requirements and budget.
We define a standard Scan as 1,000 frames. This allocates credits for a standard 30-second measurement at 30 fps (900 frames), plus a 100-frame buffer to account for potential restarts or setup overhead.
Calculation: (30 seconds × 30 fps) + 100 buffer frames = 1,000 frames per Scan.
Actual usage varies based on your settings. For example, using Eco Mode (15 fps) halves the number of frames per scan, effectively doubling the number of scans provided by your plan.
Because the VitalLens API bills by the frame, halving the frame rate consumes half the credits per second of video. This effectively doubles the number of scans available in your plan while maintaining sufficient accuracy for most heart rate and respiratory rate use cases.