Skip to content

Scoring Systems

Each biometric service returns its own score. A scoring system is the rule set that combines those scores into one verdict — pass, refer or fail — which you get back as scoring_result on v1 and as decision.status on v2.

Every API token is bound to a scoring system. If you never create one, the project default applies.

The model

A scoring system is a list of scoring blocks (one per service) plus a scoring range:

Block propertyMeaning
serviceWhich service this block scores, e.g. Face Liveness Detection.
weightContribution to the weighted average, 01.
fail_valueThe block fails when the service score is at or below this value (0100).
is_criticalA failing critical block forces the whole verdict to fail, whatever the average is.
activeInactive blocks are skipped entirely.
Range propertyMeaning
pass_valueWeighted average at or above this → pass.
fail_valueWeighted average at or below this → fail.

Anything between the two is refer — the transaction needs a human look.

How a verdict is computed

For one request, in order:

  1. Inactive blocks are skipped.
  2. Blocks whose service never ran are skipped, with a reason recorded (… skipped: service not enabled on this API key). A mismatch between your scoring system and your token’s service list does not penalise the transaction.
  3. Blocks whose service ran but produced no usable result are excluded from the average — the service errored, or the user has no enrolled face or voice yet. They are not scored zero, because a zero reads as a confident biometric rejection. Their presence does force the outcome to at least refer.
  4. Each remaining block fails if its score is <= fail_value (or is exactly 0). A failing critical block sets the fail flag.
  5. The weighted average of the remaining block scores is computed: Σ(weight × score) / Σ(weight).
  6. The verdict is decided:
ConditionVerdict
A critical block failedfail
Average <= range.fail_valuefail
Some active service could not be evaluatedrefer
Average >= range.pass_valuepass
Otherwise (between the thresholds)refer

Two edge cases: if no block is active at all, the verdict is pass (nothing was asked of the engine); if every active block was skipped or unevaluable, the verdict is refer with no score — the response carries no score rather than a misleading 0.

Every step that mattered is recorded in decision_reasons (v1) / decision.reasons (v2), including which service failed against which threshold, so you can show or log why a verification was rejected.

The default scoring system

Used when the project has no scoring system of its own:

BlockWeightFail valueCriticalActive
Active Speaker Detection0.590yesyes
Face Liveness Detection0.549yesyes
Face Recognition0.549yesno
Visual Speech Recognition0.549yesno
Voice Recognition0.549yesno

Range: pass_value 80, fail_value 50.

So out of the box a transaction passes on liveness plus active-speaker agreement, and identity checks are not part of the verdict until you activate them.

Beyond the weighted average

Two service families do not fit the score-and-average model and have their own condition lists on the same scoring system:

  • Face match conditions (facematch_conditions) — field-path conditions evaluated against the /match-faces result. Their outcome is what Face Match returns as scoring_result.status, with failed_conditions and failed_refer_conditions listing what tripped.
  • DocAuth conditions (docauth_conditions) — checks applied to the document result: expiry_date (a date must be present and in the future) and validity.

Managing scoring systems

Scoring systems are configuration, so the endpoints require a Console user session, not a project API token, and creating or changing one needs the project owner or admin role. The normal path is the Console under Configurations → Scoring System.

OperationEndpoint
ListGET /api-gateway/v2/scoring-systems
List all versionsGET /api-gateway/v2/scoring-systems/all
CreatePOST /api-gateway/v2/scoring-systems
ReadGET /api-gateway/v2/scoring-systems/{id}
Read a past versionGET /api-gateway/v2/scoring-systems/{id}/versions/{version}
Batch lookupPOST /api-gateway/v2/scoring-systems/info
UpdatePATCH /api-gateway/v2/scoring-systems/{id}
DeleteDELETE /api-gateway/v2/scoring-systems/{id}
Project defaultGET /api-gateway/v2/scoring-systems/default
Create from the default presetPOST /api-gateway/v2/scoring-systems/presets/default
Dry-run against a payloadPOST /api-gateway/v2/scoring-systems/{id}/test

presets/default is the only preset that exists; any other name returns 404.

Which system a request uses

  1. The scoring system bound to the API token (scores_id in the key).
  2. Otherwise the project’s scoring system.
  3. Otherwise the platform default above.

That resolution happens per request, so moving a token onto a different scoring system takes effect immediately — no redeploy on your side. Different tokens can carry different strictness: a lenient system for low-risk logins, a strict one for payments.