Frequently asked questions

The questions that come back most often when a team is deciding whether Saphere fits, and where the full answer lives.

What does Saphere measure, and from what?

A person’s face, filmed for about thirty seconds. From the light their skin reflects, Saphere rebuilds a pulse signal, and derives up to ten variables from it: heart rate, breathing rate, variability, stress, blood pressure, visual age, body mass index and a combined cardiovascular score. The full list, with what each one depends on, is on what is measured.

What are the ways to take a measurement?

Two, and they share the same backend. Saphere Scan runs a live, guided measurement in a browser or a WebView and hands you a result. The API takes a file you already recorded, a video or a set of images, and returns the same kind of result without any widget. Teams that need both use both.

How long must a video be?

At least 25 seconds. Only the first 30 are used, whatever the length of the file.

Do I need a server of my own?

For anything that reaches production, yes — a small endpoint that mints an access token for each measurement. The reason is not the widget’s convenience but yours: your API key opens every route of your account and has no expiry, so it must never reach a browser. The widget asks your endpoint for a short-lived, single-use token instead. Access tokens covers the three ways to wire it, including the one meant only for trials.

Where do I find my API key?

In the console, per environment. A Test key and a Production key are different keys and are not interchangeable — see environments.

Can I change the widget’s colours and screens?

Yes, both. You prepare them in the ops console, in the customisation workshop, and attach the result to the widget by its identifier. Nothing is copied into your code, and a change needs no deployment on your side. Customisation explains how.

Which languages does it speak?

Ten: Arabic, German, English, Spanish, French, Italian, Polish, Portuguese, Brazilian Portuguese and Turkish. The layout mirrors itself for Arabic, from the toolbar to the chevrons.

Does it work inside a mobile app?

Yes, in a WebView — React Native, Ionic/Capacitor, or a native shell. The camera permission has to be granted by the host application, which is the step most integrations miss first. WebView integration has the per-platform details.

Why did a measurement come back with no variables?

Almost always an entitlement rather than a failure: the variables an account may receive are configured on the account, and a freshly created test client has been granted none. A result with a quality score and an empty returnedVariables is that signature.

Why did one variable fail while the rest succeeded?

Because it needed something it did not have — height and weight for body mass index, the demographic fields for the blood-pressure and cardiovascular indicators. That variable comes back carrying an error code naming what was missing; the rest of the measurement is unaffected.

What conditions does a good measurement need?

Light on the face, a still person, an uncovered face, and correct framing at 40 to 60 cm with the upper chest visible. Conditions for a good measurement explains why each one is not negotiable and how the widget guides a person into position.

What happens after I upload a video?

The server processes it and returns the variables your account is entitled to, along with the signal they were derived from. Two routes exist: a single call that carries the file and the options together, or a two-step flow that creates the measurement first and uploads the file second. Both are on the measurements page.

Which video formats are supported?

.mp4, .avi, .mov and .webm, up to 100 MB. Only the first 30 seconds are used.

How does the credit system work?

Each variable a measurement successfully computes consumes credits — the cost of that variable, as configured on your account. A measurement that returns four variables therefore costs the sum of those four, and a variable that could not be computed costs nothing. Credits are counted per calendar month: a fresh allowance each month, and what was not spent does not carry over.

What happens when credits run out?

Measurements stop being possible for that account until the next month, and the widget shows a message saying so rather than failing silently. If you expect a peak, ask for the allowance to be raised before it rather than after.

Why did my measurement fail?

Where it failed tells you most of it.

Before the capture starts — the measurement could not be opened at all. Almost always the token: absent, already used, expired, or minted for an account that is inactive or out of credits.

During the capture — the conditions were not met or the session was interrupted:

  • no face detected, or the face left the frame;
  • lighting too dim, too harsh, or backlit;
  • the widget’s container was resized mid-capture;
  • the camera became unavailable — another application took it, or the permission was revoked;
  • the person cancelled.

Conditions for a good measurement covers the ones that depend on the environment.

How do I debug a failed measurement?

Listen to the event stream. measure:aborted carries the reason a person ended the measurement, measure:failed the reason the system could not complete it, and each carries a code rather than a message — codes do not change with the display language. The full list is in events.

How does Saphere protect personal data?

Processing is limited to producing the vital-sign indicators the measurement is for. Captures are held only for as long as the computation needs them, and a measurement can be deleted through the API — which removes the stored objects as well as the record, in that order, so that no capture survives the record that addresses it.

Where is the data hosted?

In France, with OVHcloud, on an infrastructure approved for hosting health data. Transport is encrypted end to end, and the database connection is itself verified against the hosting authority rather than merely encrypted.

How can I send feedback or report a problem?

By email, at issue@i-virtual.ai. Include the measurement identifier if there is one — it is what lets the problem be traced.

Is there a way to try it before integrating?

Yes — the widget can be pointed straight at the API with your key, with no endpoint of your own, for exactly that purpose. It is named unsafe-api-key because that is what it is: it puts a permanent key in a page. Use it for a trial and never for production.