Skip to main content
Every check produces a genuine_score in [0, 1] — higher means more likely a genuine, live capture — and applies one rule:

The score is calibrated

Raw model probabilities shift when models are retrained. SpoofSense remaps every model’s output so that the decision boundary always sits at 0.5: a threshold you tune today keeps meaning the same thing after a model update, and thresholds are comparable across products. Model internals (architecture, raw per-class probabilities) are deliberately not exposed.

Where the threshold comes from

Highest priority wins:
  1. Per-request overridethreshold (or thresholds on unified) in the request body.
  2. Organization default — set per product in the console (Dashboard → Settings).
  3. Platform default0.5.
The threshold actually applied is echoed back in every response, so your logs always show which rule made the call.

Tuning guidance

  • Start at the default 0.5 and only move after measuring on your own traffic.
  • For verification sessions, thresholds are fixed server-side at session creation — the client can never loosen them.
  • On /v1/unified_detection, the overall decision is "real" only if every product’s check passes its own threshold; the per-product outcomes are in checks.
Unified response