What Saphere is

A camera, thirty seconds, and a set of physiological indicators — with no sensor to distribute and nothing for the user to wear.

Saphere measures physiological signals from video. A person looks at the front camera of their phone or the webcam of their laptop for about thirty seconds; the light their skin reflects carries the rhythm of their pulse; Saphere extracts that rhythm and derives a set of indicators from it.

There is no cuff, no chest strap, no finger clip. The hardware is the one your users already own.

The two pieces

Saphere is delivered as two things, and most integrations use both.

Saphere Scan is the widget. It is a single JavaScript module you drop into a page or a WebView. It owns the whole user journey — explaining the measurement, collecting consent, guiding the person into frame, running the capture, showing the result — and reports what happens back to your code. You give it a container and a way to obtain a token; it does the rest.

The API is everything around the widget. It issues the short-lived tokens the widget presents, accepts recorded video or images when you would rather not use the widget at all, and stores the measurements so you can read them back later.

Which one do I need?

If a person is present and you want a guided, live measurement, use the widget. If you already hold a recorded file — an interview video, a set of stills — send it to the API and skip the widget entirely.

What comes back

A completed measurement returns up to ten variables:

VariableKeyUnitValue shape
Heart ratehrbpmnumber
Breathing ratebrcpmnumber
Heart rate variabilityhrvmsnumber
Stress levelstrs{ level, scale }
Blood pressurebpmmHg{ systole, diastole }
Blood pressure riskbpClass{ level, scale }
Visual agephysicalAgeyearsnumber
Body mass indexbmikg/m²number
BMI from facefaceBmikg/m²number
Cardiovascular health scorehealthScorenumber

Two things about that list are easy to get wrong.

Entitlement is per client, not per request. Which variables your account may receive is configured on the account itself. Asking for a variable you are not entitled to does not produce an error — it simply does not come back. A result whose returnedVariables is empty means the account has been granted nothing yet, which is the usual state of a freshly created test client.

Some variables need to know something about the person. Body mass index cannot be computed without height and weight. The blood-pressure and cardiovascular indicators need age, sex and smoking status. You supply these as userData, either through the widget’s personal-information screen or directly on the API call. Without them, those variables come back carrying an error rather than a value.

The quality indicator

Every completed measurement also carries a signal.qualityScore.

It is a flag, not a grade

qualityScore is binary: 100 if the signal yielded at least one window usable for blood-pressure calibration, 0 if it did not. It is not a score out of a hundred, and it does not tell you how trustworthy the measurement is. Do not build a “reject below 60” rule on it — there is nothing between 0 and 100.

When a variable could not be computed, that variable carries the reason itself, as an error code alongside a null value. That is where to look when a measurement disappoints.

What it needs to work

Saphere reads a very small optical signal. The conditions that make it readable are not negotiable, and your interface should help users meet them rather than leave them to guess:

  • A lit face. Ambient light must fall on the face. A person sitting against a bright window is silhouetted, and there is no signal in a silhouette.
  • A still person. Movement swamps the colour variation the measurement depends on. Thirty seconds of sitting reasonably still is the requirement.
  • An uncovered face. Scarves, high collars, hats pulled low and masks all remove the skin the measurement reads.
  • A face in frame, at the right distance. The widget guides this with an on-screen target; the API expects the same of a recorded file.

The widget’s onboarding screens exist precisely to communicate these four points, in ten languages, before the camera ever opens.

Honest limits

A measurement is an estimate. It is derived from an optical signal under uncontrolled conditions, on consumer hardware. Treat the output as an indicator, and design your product so that a user reads it as one.

The widget is designed for adults. Its own onboarding tells the user it is intended for people between 18 and 80 years old, and the API refuses an age below 18 or above 110.

A measurement can fail, and saying so is part of the contract. 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 generic failure, so that your support team can read what happened months later.

Next