Concepts · Core concepts

Verdict and score

allow, challenge, block: weights, thresholds, and who decides.

Every check returns a verdict, a score from 0 to 100, and the list of reasons that produced it.

How the score adds up#

Each rule that fires produces a reason carrying a weight. The score is their sum, capped at 100.

{
  "verdict": "challenge",
  "score": 45,
  "reasons": [
    { "category": "network", "code": "datacenterAddress", "severity": "suspicious", "weight": 35, "detail": null },
    { "category": "headers", "code": "languageMismatch", "severity": "info", "weight": 10, "detail": null }
  ],
  "source": "visit",
  "visitorId": "..."
}
FieldMeaning
categoryThe family of cause: automation, consistency, headers, integrity, network, payment, operator
codeStable identifier of the rule that fired
severitycritical, suspicious or info
weightIts contribution to the score
detailSupporting evidence, or null

Thresholds#

ScoreVerdict
0-34allow
35-69challenge
70-100block

A critical reason carries enough weight to reach the block threshold by itself. A suspicious one only convicts in company.

Why two independent causes#

Real people do suspicious-looking things. They use a corporate VPN, they block ads, they open a private window, they travel. Each of those can trip a rule, and if one rule were enough to refuse, you would turn these people away daily.

So the weights are set so that two signals from independent causes are what reach the block threshold. A datacenter proxy is one thing. A datacenter proxy together with a browser misreporting its own operating system is another.

`operator` outranks every measurement#

One category can overturn what was measured: operator, meaning a person decided. The Security section is where those decisions are recorded.

The score is not stored#

What gets stored is the raw signals. The score and the verdict are rebuilt on every read.

That is what lets an improvement to the model re-describe all of history under it. A stored proxy: true destroys that ability permanently. It is also why a number on the dashboard can differ today from yesterday for the very same visit.