Skip to main content

The flow in four steps

1

Verify connectivity

GET /version with your Api-Key (it doesn’t require it, but this way you test the full header). It must return 200. Check the status code, not the body: its format is not part of the contract. If it fails, the problem is URL, network or proxy — there is nothing to debug on the API side yet.
2

Prepare the images

JPEG or PNG, base64 without the data: prefix and without line breaks. One face per image, frontal, well lit.
3

Declare the operations

operations is a list of lists aligned with images: operations[i] applies to images[i]. If you omit it, every image runs biometric by default.
4

Decide with the rule in the positive

status === 200 && biometric["0"]["1"] >= 70 confirms; anything else does not. The threshold details are in the introduction.

Image requirements

To convert an image to base64:

The request body

A misaligned operations is not a tidy 400. An operations list shorter than images produces a 500 with a plain-text body (Internal Server Error), and omitting images does too. Validate the alignment before calling; those errors are caused by your request and retrying returns exactly the same thing.

The three ways to compare

If you store vectors to compare later, also store which methodology generated them and always compare with the same one. A vu_v4 vector compared with euclidean_l2 yields scores on another scale and your threshold stops being valid.

A batch does not tolerate partial failures

If you send 4 images and the third has no face, you do not get 3 results and one error: you get a single 400 with imageNumber: 2 (0-based) and no results at all. There are no partial results. If your flow tolerates per-image failures, send one request per image.

Timeouts and retries

Before going to production

  1. GET /version returns 200 from your production connectivity.
  2. Your verification condition requires 200 and a score ≥ 70 on biometric["0"]["1"], and an unexpected response does not approve by exclusion.
  3. If you changed distanceMethodology, you calibrated your own threshold and did not reuse 70.
  4. Your deserializer indexes results by string ("0", "1") and tolerates inferenceConfidence with or without code/confidence.
  5. Your HTTP client tolerates error bodies that are not JSON (the plain-text 500s).
  6. operations has exactly one entry per image.
  7. Images are at least 360 × 360 and JPEG quality is ≥ 90.
  8. You never retry a no-match or a spoofing: true with the same image.
  9. The api-key lives in your backend, never in the mobile app or front-end.
  10. You send your own info per operation and log the id of every response.
  11. events stays disabled in production: the trace is for diagnostics.

Next: Responses

The biometric matrix field by field, the quality verdict that changes shape, and the nested antispoofing.
Last modified on September 9, 2026