verifi
bot protection — passive detection + progressive challenges. no CAPTCHAs, no cookies, one script tag.
drop the script in <head> and verifi passively scores every visitor from mouse tremor, scroll physics, keystroke timing, and hardware signals — only escalating to a challenge when confidence is low.
drop-in
<!-- add to <head> — auto-detects + challenges after 10s analysis --> <script src="https://verifi.zo0p.dev/v.js" data-site="YOUR_ID"></script>
embed widget
// renders an inline checkbox widget — like cf turnstile verifi.embed( '#my-div', // selector or element 'dark', // 'dark' | 'light' 'normal', // 'normal' | 'compact' r => unlock(), // onPass r => block() // onFail )
config
verifi.config({ threshold: 0.6, // bot cutoff 0–1, default 0.45 autoChallenge: true, // show challenge automatically onPass: r => unlock(), onFail: r => block(), })
on-the-spot check
// fresh challenge — login, checkout, form submit verifi.check({ threshold: 0.6, onPass: r => submitForm(), onFail: r => showError(), })
promise api
verifi.verify({ threshold: 0.5 }) .then(r => submitForm()) .catch(r => showError()) verifi.profile() // probability, confidence, signals verifi.botScore() // score, behavioural, verified
living token
// issued after pass, refreshes every 60s verifi.getToken() verifi.waitForToken(8000) verifi.isTokenValid() verifi.tokenExpiry() verifi.on('token', r => attachToForm(r.token)) // verify server-side fetch('https://verifi.zo0p.dev/verify', { method: 'POST', body: JSON.stringify({ token: verifi.getToken() }) })
events
verifi.on('pass', r => log(r.probability)) verifi.on('fail', r => log(r.reason)) verifi.on('score', r => log(r.p, r.c)) verifi.on('token', r => log(r.token)) verifi.off('score', fn)
manual triggers
verifi.botCheck() // respects tier verifi.botCheck(true) // force-fail verifi.fullscreenTest() // fullscreen gate verifi.fullscreenTest(true) verifi.powVerify() // Promise<{ok}>