[{"data":1,"prerenderedAt":71},["ShallowReactive",2],{"doc:\u002Fdocs\u002Fhow-it-works":3},{"page":4,"toc":62,"updated":70},{"path":5,"title":6,"seoTitle":7,"description":8,"blocks":9},"\u002Fdocs\u002Fhow-it-works","How Fingerly works","How Fingerly Works: From Signals to a Scored Event","Follow one identification from the SDK collecting signals, through identification and scoring on the server, to the stored event, the webhook and your decision.",[10,13,18,20,22,25,27,30,32,34,37,39,42,48,51,53,56,58],{"type":11,"text":12},"p","One identification takes a few hundred milliseconds end to end. Here is what happens in that time.",{"type":14,"level":15,"text":16,"id":17},"heading",2,"1. The SDK collects","1-the-sdk-collects",{"type":11,"text":19},"When you call `identify()`, the SDK reads device and browser characteristics within a strict time budget: 300 ms for the initial tier in browsers. Every source is isolated, so one that is slow, blocked or broken is recorded as such and never holds up the answer. Nothing is ever asked of the visitor.",{"type":11,"text":21},"The SDK also forms local verdicts, such as automation or a rooted device, which your interface can use right away.",{"type":14,"level":15,"text":23,"id":24},"2. The server identifies","2-the-server-identifies",{"type":11,"text":26},"The report is sent to your region's API with your public key. Fingerly resolves it to a `visitor_id` scoped to your organization: the same device gets the same ID on its next visit, even after cookies and storage are cleared, and a device seen for the first time gets a new one. `visitor_confidence` says how close the match was.",{"type":14,"level":15,"text":28,"id":29},"3. The server enriches and scores","3-the-server-enriches-and-scores",{"type":11,"text":31},"The visitor's address is looked up for its country, network and whether it belongs to Tor, a VPN, a proxy or a hosting provider. The server then runs its own detection over the report and the network context, independently of the SDK's local verdicts, and adds up the weights of the signals that fired into the `suspect_score`.",{"type":11,"text":33},"The score is compared with your threshold to give a level: `low`, `medium` or `high`. Weights and the threshold come from your organization's profile, or a key's own profile when it has one.",{"type":14,"level":15,"text":35,"id":36},"4. The answer comes back","4-the-answer-comes-back",{"type":11,"text":38},"The same response returns the request ID, the visitor, the confidence, the score, the level and the triggers. There is no second call to make and nothing to poll.",{"type":14,"level":15,"text":40,"id":41},"5. The event is stored and sent","5-the-event-is-stored-and-sent",{"type":43,"items":44},"list",[45,46,47],"The event becomes readable with your secret key within seconds, and stays readable for 30 days.","Subscribed webhook endpoints receive `identification.completed`, and `visitor.suspect` when the level is `high`.","The event appears in the dashboard's Events view and analytics.",{"type":14,"level":15,"text":49,"id":50},"6. The browser keeps collecting","6-the-browser-keeps-collecting",{"type":11,"text":52},"Slower signals continue in the browser for up to 1,200 ms after the answer and are attached to the same request as a deferred report. They are archived with the event but never change its identity, score, cost or webhooks.",{"type":14,"level":15,"text":54,"id":55},"7. You decide","7-you-decide",{"type":11,"text":57},"Your frontend sends the request ID to your backend with the action. Your backend reads the event with its secret key and makes the decision. Because the event is read from Fingerly, not from the browser, it cannot be edited on the way.",{"type":59,"tone":60,"text":61},"callout","note","Every answer is evidence, not a verdict on a person. Fingerly never blocks traffic on its own behalf.",[63,64,65,66,67,68,69],{"id":17,"text":16,"level":15},{"id":24,"text":23,"level":15},{"id":29,"text":28,"level":15},{"id":36,"text":35,"level":15},{"id":41,"text":40,"level":15},{"id":50,"text":49,"level":15},{"id":55,"text":54,"level":15},"2026-09-17T08:28:36.000Z",1789667797513]