What Saphere is
A camera, thirty seconds, and a set of health indicators. Nothing to distribute, and nothing for the user to wear.
Saphere measures health indicators from a video. A person looks at the front camera of their phone, or at the webcam of their laptop, for about thirty seconds. The light their skin reflects carries the rhythm of their pulse. Saphere reads that rhythm and derives a set of indicators from it.
There is no cuff, no chest strap, no clip on a finger. The only device involved is the one your users already own.
The two pieces
Saphere comes in two parts, and most integrations use both.
Saphere Scan is the widget. It is a single JavaScript file you place in a page or in a mobile app. It handles the whole journey: explaining the measurement, collecting consent, guiding the person into position, running the capture, showing the result. It tells your code what happens at every step. You give it a container and a way to obtain a token, and it does the rest.
The API is everything around the widget. It issues the short-lived tokens the widget uses. It accepts a video or images you recorded yourself, if you would rather not use the widget at all. And it keeps the measurements, so you can read them again later.
Which one do I need?
If someone is present and you want a guided, live measurement, use the widget. If you already have a recorded file, such as an interview video or a set of photographs, send it to the API and skip the widget entirely.What comes back
A finished measurement returns up to ten variables.
| Variable | Key | Unit | Value shape |
|---|---|---|---|
| Heart rate | hr | bpm | number |
| Breathing rate | br | cpm | number |
| Heart rate variability | hrv | ms | number |
| Stress level | strs | — | { level, scale } |
| Blood pressure | bp | mmHg | { systole, diastole } |
| Blood pressure risk | bpClass | — | { level, scale } |
| Visual age | physicalAge | years | number |
| Body mass index | bmi | kg/m² | number |
| BMI from face | faceBmi | kg/m² | number |
| Cardiovascular health score | healthScore | — | number |
Alongside them comes the pulse signal they were read from, so a result is never a bare set of numbers: you can always see what produced it.
Each variable arrives in one of two states. Either it has a value, or it has an error code saying why it could not be produced. Nothing is ever silently absent.
What is measured describes each variable, and says what each one needs before it can be computed.
What it needs to work
Saphere reads a very faint signal of light. The conditions that make it readable cannot be negotiated, and your interface should help users meet them rather than leave them guessing.
- A lit face. The light has to fall on the face. Someone sitting in front of a bright window becomes a dark shape, and there is nothing to read in a dark shape.
- A person who stays still. Movement drowns out the colour change the measurement depends on. Sitting reasonably still for thirty seconds is what is asked.
- An uncovered face. Scarves, high collars, hats pulled down and masks all hide the skin the measurement reads.
- A face in the frame, at the right distance. The widget guides this with a target on screen. For a recorded file, the API expects the same care.
The widget’s first screens exist to explain these four points, in ten languages, before the camera opens.
What it does not do
A measurement is an estimate. It comes from a faint optical signal, in conditions nobody controls, on ordinary consumer devices. Treat the result as an indicator, and design your product so that users read it as one.
The widget is meant for adults. Its own introduction says it is intended for people between 18 and 80, and the API refuses an age below 18 or above 110.
A measurement can fail, and saying so is part of the deal. A camera the user refuses, a face that leaves the frame, light that changes halfway through: each is reported to your code with a named reason rather than a vague failure, so your support team can still understand it months later.