[{"data":1,"prerenderedAt":113},["ShallowReactive",2],{"doc:\u002Fdocs\u002Fsuspect-score":3},{"page":4,"toc":106,"updated":112},{"path":5,"title":6,"seoTitle":7,"description":8,"blocks":9},"\u002Fdocs\u002Fsuspect-score","Suspect score","Suspect Score: How Fingerly Scores Risk","How the suspect score is calculated from weighted signals, how levels are derived from your threshold, and why an unscored request is not a zero.",[10,13,18,20,27,33,36,38,57,59,62,64,68,74,76,79,81,84,94],{"type":11,"text":12},"p","The suspect score summarises how suspicious a session looks. It is simple on purpose: a sum of weights you can read, explain and change.",{"type":14,"level":15,"text":16,"id":17},"heading",2,"How the score is calculated","how-the-score-is-calculated",{"type":11,"text":19},"Each signal that fires adds its weight once. The score is the sum.",{"type":21,"samples":22},"code",[23],{"label":24,"lang":25,"code":26},"Example","text","tor               14\nautomation         9\ntampering          8\nhigh_activity      6\n----------------------\nsuspect_score     37     → high (threshold 30)",{"type":28,"items":29},"list",[30,31,32],"The score is not a percentage and has no maximum.","Every signal that fired is listed in `triggers` with its weight and confidence, heaviest first. A signal with weight `0` still appears.","Weights come from your [risk weights](\u002Fdocs\u002Frisk-weights): a key's own profile if it has one, otherwise your organization's, otherwise the defaults.",{"type":14,"level":15,"text":34,"id":35},"Levels","levels",{"type":11,"text":37},"The level compares the score with your threshold, which is `30` by default.",{"type":39,"columns":40,"rows":44},"table",[41,42,43],"Level","When","With the default threshold",[45,49,53],[46,47,48],"`low`","The score is below half the threshold.","0 to 14",[50,51,52],"`medium`","The score is at least half the threshold.","15 to 29",[54,55,56],"`high`","The score is at least the threshold.","30 and above",{"type":11,"text":58},"An identification that reaches `high` also sends the [`visitor.suspect`](\u002Freference\u002Fwebhooks\u002Fvisitor-suspect) webhook.",{"type":14,"level":15,"text":60,"id":61},"When a request is not scored","when-a-request-is-not-scored",{"type":11,"text":63},"If the network lookup could not run, the request is answered but not scored: `state` is `unavailable`, and `suspect_score` and `suspect_level` are absent. Fingerly does not invent a score from half the evidence.",{"type":65,"tone":66,"text":67},"callout","warning","An absent score is not a score of `0`. `0` means everything was checked and nothing fired. Absent means the check did not happen. Decide separately what your application does in that case.",{"type":21,"samples":69},[70],{"label":71,"lang":72,"code":73},"Handling an unscored request","ts","if (event.suspect_score === null) {\n  \u002F\u002F Not scored: fall back to your own rules, or ask for a second factor.\n} else if (event.suspect_level === 'high') {\n  \u002F\u002F …\n}",{"type":11,"text":75},"Requests whose network lookup could not run are not billed.",{"type":14,"level":15,"text":77,"id":78},"Confidence","confidence",{"type":11,"text":80},"Each trigger has a `confidence` of `low`, `medium` or `high`, which says how strong the evidence for that signal was. Confidence is reported, not multiplied into the weight: a high-confidence signal with weight `0` adds nothing. Use confidence when you write rules on individual triggers.",{"type":14,"level":15,"text":82,"id":83},"Choosing actions","choosing-actions",{"type":39,"columns":85,"rows":87},[41,86],"A common first policy",[88,90,92],[46,89],"Allow.",[50,91],"Add friction a real customer can pass, such as a second factor or a CAPTCHA.",[54,93],"Hold for review, limit what the session can do, or refuse.",{"type":95,"columns":15,"cards":96},"cards",[97,101],{"title":98,"text":99,"href":100,"icon":28},"Signals reference","Every signal group and its default weight.","\u002Fdocs\u002Fsignals",{"title":102,"text":103,"href":104,"icon":105},"Risk weights","Change what each signal is worth.","\u002Fdocs\u002Frisk-weights","sliders",[107,108,109,110,111],{"id":17,"text":16,"level":15},{"id":35,"text":34,"level":15},{"id":61,"text":60,"level":15},{"id":78,"text":77,"level":15},{"id":83,"text":82,"level":15},"2026-09-17T08:28:36.000Z",1789667797513]