[{"data":1,"prerenderedAt":1785},["ShallowReactive",2],{"navLinks":3,"sidebar_docs_navigation_\u002Fdocs\u002Fbot-detection":64,"navigation":191,"navLinks_footer":816,"\u002Fdocs\u002Fbot-detection\u002Fcheckers\u002Fproxy-isp-cookies_page":829,"\u002Fdocs\u002Fbot-detection\u002Fcheckers\u002Fproxy-isp-cookies_surround":1400,"\u002Fdocs\u002Fbot-detection\u002Fcheckers\u002Fproxy-isp-cookies":1403},{"id":4,"extension":5,"links":6,"meta":61,"stem":62,"__hash__":63},"navigationMenu\u002Fnavigation.json","json",[7,52,57],{"nested":8,"label":9,"icon":10,"to":11,"children":12},true,"Docs","i-lucide-book-open","\u002Fdocs\u002Fgetting-started",[13,19,26,32,39,45],{"label":14,"icon":15,"to":11,"description":16,"github":17,"badge":18},"Getting Started","i-lucide-rocket","An introduction to help you understand the core components.","https:\u002F\u002Fgithub.com\u002FSergo706\u002Fdocshub","Start Here",{"label":20,"icon":21,"to":22,"description":23,"github":24,"badge":25},"Auth H3 Client","i-lucide-key-round","\u002Fdocs\u002Fauth-h3client","Seamlessly enforce OAuth 2.0 authentication and session management integrated directly as the client of the IAM module.","https:\u002F\u002Fgithub.com\u002FSergo706\u002Fauth-h3client","Core",{"label":27,"icon":28,"to":29,"description":30,"github":31,"badge":25},"IAM","i-lucide-shield-check","\u002Fdocs\u002Fiam","Identity and Access Management featuring granular roles, permissions, and security policies.","https:\u002F\u002Fgithub.com\u002FSergo706\u002Fauth",{"label":33,"icon":34,"to":35,"description":36,"github":37,"badge":38},"Bot Detection","i-lucide-cpu","\u002Fdocs\u002Fbot-detection","Advanced behavioral analysis and request fingerprinting to stop malicious automated traffic.","https:\u002F\u002Fgithub.com\u002FSergo706\u002Fbot-detector","Security",{"label":40,"icon":41,"to":42,"description":43,"github":44,"badge":38},"Shield Base","i-lucide-database-zap","\u002Fdocs\u002Fshield-base","CLI and programmatic toolkit for compiling offline-ready IP intelligence databases from BGP, GeoIP, Tor, FireHOL, and other public threat feeds.","https:\u002F\u002Fgithub.com\u002FSergo706\u002Fshield-base-cli",{"label":46,"icon":47,"to":48,"description":49,"github":50,"badge":51},"Utils","i-lucide-wrench","\u002Fdocs\u002Futils","A standard library of highly optimized helpers for formatting, validation, and core logic.","https:\u002F\u002Fgithub.com\u002FSergo706\u002Futils","Library",{"nested":53,"label":54,"icon":55,"to":56},false,"Blog","i-lucide-pen-line","\u002Fblog",{"nested":53,"label":58,"icon":59,"to":60},"Website","lucide:app-window-mac","https:\u002F\u002Friavzon.com",{},"navigation","gkaQ0xRGxSLrLyM3kttLe0oBwkrR1EBjlepF8LSbwF8",[65],{"title":9,"path":66,"stem":67,"children":68,"page":53},"\u002Fdocs","docs",[69],{"title":70,"path":35,"stem":71,"children":72},"Bot Detector","docs\u002Fbot-detection\u002Findex",[73,74,77,81,85,106,180,183,187],{"title":70,"path":35,"stem":71},{"title":14,"path":75,"stem":76},"\u002Fdocs\u002Fbot-detection\u002Fgetting-started","docs\u002Fbot-detection\u002F00.getting-started",{"title":78,"path":79,"stem":80},"CLI","\u002Fdocs\u002Fbot-detection\u002Fcli","docs\u002Fbot-detection\u002F01.cli",{"title":82,"path":83,"stem":84},"Data Sources","\u002Fdocs\u002Fbot-detection\u002Fdata-sources","docs\u002Fbot-detection\u002F02.data-sources",{"title":86,"path":87,"stem":88,"children":89,"page":53},"Guides","\u002Fdocs\u002Fbot-detection\u002Fguides","docs\u002Fbot-detection\u002F03.guides",[90,94,98,102],{"title":91,"path":92,"stem":93},"Custom Checkers","\u002Fdocs\u002Fbot-detection\u002Fguides\u002Fcustom","docs\u002Fbot-detection\u002F03.guides\u002FCUSTOM",{"title":95,"path":96,"stem":97},"Scheduling Database Generation","\u002Fdocs\u002Fbot-detection\u002Fguides\u002Fgenerate","docs\u002Fbot-detection\u002F03.guides\u002FGENERATE",{"title":99,"path":100,"stem":101},"Logging","\u002Fdocs\u002Fbot-detection\u002Fguides\u002Flogging","docs\u002Fbot-detection\u002F03.guides\u002FLOGGING",{"title":103,"path":104,"stem":105},"Score Modes and Reputation Healing","\u002Fdocs\u002Fbot-detection\u002Fguides\u002Fscore","docs\u002Fbot-detection\u002F03.guides\u002FSCORE",{"title":107,"path":108,"stem":109,"children":110},"Checkers","\u002Fdocs\u002Fbot-detection\u002Fcheckers","docs\u002Fbot-detection\u002F04.checkers\u002Findex",[111,112,116,120,124,128,132,136,140,144,148,152,156,160,164,168,172,176],{"title":107,"path":108,"stem":109},{"title":113,"path":114,"stem":115},"IP Validation","\u002Fdocs\u002Fbot-detection\u002Fcheckers\u002Fip-validation","docs\u002Fbot-detection\u002F04.checkers\u002F01.ip-validation",{"title":117,"path":118,"stem":119},"Good \u002F Bad Bot Verification","\u002Fdocs\u002Fbot-detection\u002Fcheckers\u002Fgood-bots","docs\u002Fbot-detection\u002F04.checkers\u002F02.good-bots",{"title":121,"path":122,"stem":123},"Browser & Device Fingerprint","\u002Fdocs\u002Fbot-detection\u002Fcheckers\u002Fbrowser-device","docs\u002Fbot-detection\u002F04.checkers\u002F03.browser-device",{"title":125,"path":126,"stem":127},"Locale Map","\u002Fdocs\u002Fbot-detection\u002Fcheckers\u002Flocale-map","docs\u002Fbot-detection\u002F04.checkers\u002F04.locale-map",{"title":129,"path":130,"stem":131},"Known Threats","\u002Fdocs\u002Fbot-detection\u002Fcheckers\u002Fknown-threats","docs\u002Fbot-detection\u002F04.checkers\u002F05.known-threats",{"title":133,"path":134,"stem":135},"ASN Classification","\u002Fdocs\u002Fbot-detection\u002Fcheckers\u002Fasn-classification","docs\u002Fbot-detection\u002F04.checkers\u002F06.asn-classification",{"title":137,"path":138,"stem":139},"Tor Analysis","\u002Fdocs\u002Fbot-detection\u002Fcheckers\u002Ftor-analysis","docs\u002Fbot-detection\u002F04.checkers\u002F07.tor-analysis",{"title":141,"path":142,"stem":143},"Timezone Consistency","\u002Fdocs\u002Fbot-detection\u002Fcheckers\u002Ftimezone-consistency","docs\u002Fbot-detection\u002F04.checkers\u002F08.timezone-consistency",{"title":145,"path":146,"stem":147},"Honeypot","\u002Fdocs\u002Fbot-detection\u002Fcheckers\u002Fhoneypot","docs\u002Fbot-detection\u002F04.checkers\u002F09.honeypot",{"title":149,"path":150,"stem":151},"Known Bad IPs","\u002Fdocs\u002Fbot-detection\u002Fcheckers\u002Fknown-bad-ips","docs\u002Fbot-detection\u002F04.checkers\u002F10.known-bad-ips",{"title":153,"path":154,"stem":155},"Behavior Rate","\u002Fdocs\u002Fbot-detection\u002Fcheckers\u002Fbehavior-rate","docs\u002Fbot-detection\u002F04.checkers\u002F11.behavior-rate",{"title":157,"path":158,"stem":159},"Proxy \u002F ISP \u002F Cookie","\u002Fdocs\u002Fbot-detection\u002Fcheckers\u002Fproxy-isp-cookies","docs\u002Fbot-detection\u002F04.checkers\u002F12.proxy-isp-cookies",{"title":161,"path":162,"stem":163},"Session Coherence","\u002Fdocs\u002Fbot-detection\u002Fcheckers\u002Fsession-coherence","docs\u002Fbot-detection\u002F04.checkers\u002F13.session-coherence",{"title":165,"path":166,"stem":167},"Velocity Fingerprint","\u002Fdocs\u002Fbot-detection\u002Fcheckers\u002Fvelocity-fingerprint","docs\u002Fbot-detection\u002F04.checkers\u002F14.velocity-fingerprint",{"title":169,"path":170,"stem":171},"UA & Header Analysis","\u002Fdocs\u002Fbot-detection\u002Fcheckers\u002Fua-header","docs\u002Fbot-detection\u002F04.checkers\u002F15.ua-header",{"title":173,"path":174,"stem":175},"Geolocation","\u002Fdocs\u002Fbot-detection\u002Fcheckers\u002Fgeolocation","docs\u002Fbot-detection\u002F04.checkers\u002F16.geolocation",{"title":177,"path":178,"stem":179},"Known Bad User-Agents","\u002Fdocs\u002Fbot-detection\u002Fcheckers\u002Fknown-bad-ua","docs\u002Fbot-detection\u002F04.checkers\u002F17.known-bad-ua",{"title":38,"path":181,"stem":182},"\u002Fdocs\u002Fbot-detection\u002Fsecurity","docs\u002Fbot-detection\u002F04.security",{"title":184,"path":185,"stem":186},"API Reference","\u002Fdocs\u002Fbot-detection\u002Fapi","docs\u002Fbot-detection\u002F05.api",{"title":188,"path":189,"stem":190},"Configuration","\u002Fdocs\u002Fbot-detection\u002Fconfiguration","docs\u002Fbot-detection\u002F06.configuration",[192],{"title":9,"path":66,"stem":67,"children":193,"page":53},[194,338,373,378,556,623],{"title":20,"path":22,"stem":195,"children":196},"docs\u002Fauth-h3client\u002Findex",[197,198,207,243,269,291,294,314,317],{"title":20,"path":22,"stem":195},{"title":14,"path":199,"stem":200,"children":201},"\u002Fdocs\u002Fauth-h3client\u002Fgetting-started","docs\u002Fauth-h3client\u002F00.getting-started\u002Findex",[202,203],{"title":14,"path":199,"stem":200},{"title":204,"path":205,"stem":206},"Nuxt Module","\u002Fdocs\u002Fauth-h3client\u002Fgetting-started\u002Fnuxt","docs\u002Fauth-h3client\u002F00.getting-started\u002F00.nuxt",{"title":208,"path":209,"stem":210,"children":211},"Essentials","\u002Fdocs\u002Fauth-h3client\u002Fessentials","docs\u002Fauth-h3client\u002F01.essentials\u002Findex",[212,213,217,221,225,229,233,236,240],{"title":208,"path":209,"stem":210},{"title":214,"path":215,"stem":216},"Session Management","\u002Fdocs\u002Fauth-h3client\u002Fessentials\u002Fsession","docs\u002Fauth-h3client\u002F01.essentials\u002F00.session",{"title":218,"path":219,"stem":220},"Route Protection","\u002Fdocs\u002Fauth-h3client\u002Fessentials\u002Froute-protection","docs\u002Fauth-h3client\u002F01.essentials\u002F01.route-protection",{"title":222,"path":223,"stem":224},"CSRF Protection","\u002Fdocs\u002Fauth-h3client\u002Fessentials\u002Fcsrf","docs\u002Fauth-h3client\u002F01.essentials\u002F02.csrf",{"title":226,"path":227,"stem":228},"Auth Flows","\u002Fdocs\u002Fauth-h3client\u002Fessentials\u002Fauth-flows","docs\u002Fauth-h3client\u002F01.essentials\u002F03.auth-flows",{"title":230,"path":231,"stem":232},"OAuth and OIDC","\u002Fdocs\u002Fauth-h3client\u002Fessentials\u002Foauth","docs\u002Fauth-h3client\u002F01.essentials\u002F04.oauth",{"title":33,"path":234,"stem":235},"\u002Fdocs\u002Fauth-h3client\u002Fessentials\u002Fbot-detection","docs\u002Fauth-h3client\u002F01.essentials\u002F05.bot-detection",{"title":237,"path":238,"stem":239},"Cookies","\u002Fdocs\u002Fauth-h3client\u002Fessentials\u002Fcookies","docs\u002Fauth-h3client\u002F01.essentials\u002F06.cookies",{"title":99,"path":241,"stem":242},"\u002Fdocs\u002Fauth-h3client\u002Fessentials\u002Flogging","docs\u002Fauth-h3client\u002F01.essentials\u002F07.logging",{"title":244,"path":245,"stem":246,"children":247},"MFA","\u002Fdocs\u002Fauth-h3client\u002Fmfa","docs\u002Fauth-h3client\u002F02.mfa\u002Findex",[248,249,253,257,261,265],{"title":244,"path":245,"stem":246},{"title":250,"path":251,"stem":252},"Built-in MFA","\u002Fdocs\u002Fauth-h3client\u002Fmfa\u002Fbuilt-in-flow","docs\u002Fauth-h3client\u002F02.mfa\u002F01.built-in-flow",{"title":254,"path":255,"stem":256},"Password Reset","\u002Fdocs\u002Fauth-h3client\u002Fmfa\u002Fpassword-reset","docs\u002Fauth-h3client\u002F02.mfa\u002F02.password-reset",{"title":258,"path":259,"stem":260},"Email Change","\u002Fdocs\u002Fauth-h3client\u002Fmfa\u002Femail-change","docs\u002Fauth-h3client\u002F02.mfa\u002F03.email-change",{"title":262,"path":263,"stem":264},"Custom MFA Flow","\u002Fdocs\u002Fauth-h3client\u002Fmfa\u002Fcustom-flow","docs\u002Fauth-h3client\u002F02.mfa\u002F04.custom-flow",{"title":266,"path":267,"stem":268},"Client-Side MFA","\u002Fdocs\u002Fauth-h3client\u002Fmfa\u002Fclient-side","docs\u002Fauth-h3client\u002F02.mfa\u002F05.client-side",{"title":270,"path":271,"stem":272,"children":273},"Client-side","\u002Fdocs\u002Fauth-h3client\u002Fclient","docs\u002Fauth-h3client\u002F03.client\u002Findex",[274,275,279,283,287],{"title":270,"path":271,"stem":272},{"title":276,"path":277,"stem":278},"useAuthData","\u002Fdocs\u002Fauth-h3client\u002Fclient\u002Fuse-auth-data","docs\u002Fauth-h3client\u002F03.client\u002F00.use-auth-data",{"title":280,"path":281,"stem":282},"useMagicLink","\u002Fdocs\u002Fauth-h3client\u002Fclient\u002Fuse-magic-link","docs\u002Fauth-h3client\u002F03.client\u002F01.use-magic-link",{"title":284,"path":285,"stem":286},"executeRequest","\u002Fdocs\u002Fauth-h3client\u002Fclient\u002Fexecute-request","docs\u002Fauth-h3client\u002F03.client\u002F02.execute-request",{"title":288,"path":289,"stem":290},"getCsrfToken","\u002Fdocs\u002Fauth-h3client\u002Fclient\u002Fget-csrf-token","docs\u002Fauth-h3client\u002F03.client\u002F03.get-csrf-token",{"title":38,"path":292,"stem":293},"\u002Fdocs\u002Fauth-h3client\u002Fsecurity","docs\u002Fauth-h3client\u002F04.security",{"title":86,"path":295,"stem":296,"children":297,"page":53},"\u002Fdocs\u002Fauth-h3client\u002Fguides","docs\u002Fauth-h3client\u002F05.guides",[298,302,306,310],{"title":299,"path":300,"stem":301},"H3 and Nitro Setup","\u002Fdocs\u002Fauth-h3client\u002Fguides\u002Fh3-nitro","docs\u002Fauth-h3client\u002F05.guides\u002F00.h3-nitro",{"title":303,"path":304,"stem":305},"HMAC Inter-service Auth","\u002Fdocs\u002Fauth-h3client\u002Fguides\u002Fhmac","docs\u002Fauth-h3client\u002F05.guides\u002Fhmac",{"title":307,"path":308,"stem":309},"Image Upload","\u002Fdocs\u002Fauth-h3client\u002Fguides\u002Fimage-upload","docs\u002Fauth-h3client\u002F05.guides\u002Fimage-upload",{"title":311,"path":312,"stem":313},"mTLS Configuration","\u002Fdocs\u002Fauth-h3client\u002Fguides\u002Fmtls","docs\u002Fauth-h3client\u002F05.guides\u002Fmtls",{"title":188,"path":315,"stem":316},"\u002Fdocs\u002Fauth-h3client\u002Fconfiguration","docs\u002Fauth-h3client\u002F06.configuration",{"title":184,"path":318,"stem":319,"children":320},"\u002Fdocs\u002Fauth-h3client\u002Fapi","docs\u002Fauth-h3client\u002F07.api\u002Findex",[321,322,326,330,334],{"title":184,"path":318,"stem":319},{"title":323,"path":324,"stem":325},"Routes Reference","\u002Fdocs\u002Fauth-h3client\u002Fapi\u002Fcontrollers","docs\u002Fauth-h3client\u002F07.api\u002F00.controllers",{"title":327,"path":328,"stem":329},"Middleware Reference","\u002Fdocs\u002Fauth-h3client\u002Fapi\u002Fmiddleware","docs\u002Fauth-h3client\u002F07.api\u002F01.middleware",{"title":331,"path":332,"stem":333},"Client-side Reference","\u002Fdocs\u002Fauth-h3client\u002Fapi\u002Fcomposables","docs\u002Fauth-h3client\u002F07.api\u002F02.composables",{"title":335,"path":336,"stem":337},"Utilities","\u002Fdocs\u002Fauth-h3client\u002Fapi\u002Futilities","docs\u002Fauth-h3client\u002F07.api\u002F03.utilities",{"title":70,"path":35,"stem":71,"children":339},[340,341,342,343,344,350,370,371,372],{"title":70,"path":35,"stem":71},{"title":14,"path":75,"stem":76},{"title":78,"path":79,"stem":80},{"title":82,"path":83,"stem":84},{"title":86,"path":87,"stem":88,"children":345,"page":53},[346,347,348,349],{"title":91,"path":92,"stem":93},{"title":95,"path":96,"stem":97},{"title":99,"path":100,"stem":101},{"title":103,"path":104,"stem":105},{"title":107,"path":108,"stem":109,"children":351},[352,353,354,355,356,357,358,359,360,361,362,363,364,365,366,367,368,369],{"title":107,"path":108,"stem":109},{"title":113,"path":114,"stem":115},{"title":117,"path":118,"stem":119},{"title":121,"path":122,"stem":123},{"title":125,"path":126,"stem":127},{"title":129,"path":130,"stem":131},{"title":133,"path":134,"stem":135},{"title":137,"path":138,"stem":139},{"title":141,"path":142,"stem":143},{"title":145,"path":146,"stem":147},{"title":149,"path":150,"stem":151},{"title":153,"path":154,"stem":155},{"title":157,"path":158,"stem":159},{"title":161,"path":162,"stem":163},{"title":165,"path":166,"stem":167},{"title":169,"path":170,"stem":171},{"title":173,"path":174,"stem":175},{"title":177,"path":178,"stem":179},{"title":38,"path":181,"stem":182},{"title":184,"path":185,"stem":186},{"title":188,"path":189,"stem":190},{"title":374,"path":11,"stem":375,"children":376},"Introduction","docs\u002Fgetting-started\u002Findex",[377],{"title":374,"path":11,"stem":375},{"title":27,"path":29,"stem":379,"children":380},"docs\u002Fiam\u002Findex",[381,382,385,520,523,539,542],{"title":27,"path":29,"stem":379},{"title":14,"path":383,"stem":384},"\u002Fdocs\u002Fiam\u002Fgetting-started","docs\u002Fiam\u002F00.getting-started",{"title":208,"path":386,"stem":387,"children":388},"\u002Fdocs\u002Fiam\u002Fessentials","docs\u002Fiam\u002F01.essentials\u002Findex",[389,390,394,398,402,406,410,414,418,422,426,430,433,437,441,445,449,452,456,460,463,467,470],{"title":208,"path":386,"stem":387},{"title":391,"path":392,"stem":393},"Tokens","\u002Fdocs\u002Fiam\u002Fessentials\u002Ftokens","docs\u002Fiam\u002F01.essentials\u002F00.tokens",{"title":395,"path":396,"stem":397},"Access Tokens","\u002Fdocs\u002Fiam\u002Fessentials\u002Faccess-tokens","docs\u002Fiam\u002F01.essentials\u002F01.access-tokens",{"title":399,"path":400,"stem":401},"Refresh Tokens","\u002Fdocs\u002Fiam\u002Fessentials\u002Frefresh-tokens","docs\u002Fiam\u002F01.essentials\u002F02.refresh-tokens",{"title":403,"path":404,"stem":405},"Anomaly Detection","\u002Fdocs\u002Fiam\u002Fessentials\u002Fanomalies","docs\u002Fiam\u002F01.essentials\u002F03.anomalies",{"title":407,"path":408,"stem":409},"Signup","\u002Fdocs\u002Fiam\u002Fessentials\u002Fsignup","docs\u002Fiam\u002F01.essentials\u002F04.signup",{"title":411,"path":412,"stem":413},"Login","\u002Fdocs\u002Fiam\u002Fessentials\u002Flogin","docs\u002Fiam\u002F01.essentials\u002F05.login",{"title":415,"path":416,"stem":417},"Logout","\u002Fdocs\u002Fiam\u002Fessentials\u002Flogout","docs\u002Fiam\u002F01.essentials\u002F06.logout",{"title":419,"path":420,"stem":421},"OAuth","\u002Fdocs\u002Fiam\u002Fessentials\u002Foauth","docs\u002Fiam\u002F01.essentials\u002F07.oauth",{"title":423,"path":424,"stem":425},"Magic Links","\u002Fdocs\u002Fiam\u002Fessentials\u002Fmagic-links","docs\u002Fiam\u002F01.essentials\u002F08.magic-links",{"title":427,"path":428,"stem":429},"Emails","\u002Fdocs\u002Fiam\u002Fessentials\u002Femails","docs\u002Fiam\u002F01.essentials\u002F09.emails",{"title":244,"path":431,"stem":432},"\u002Fdocs\u002Fiam\u002Fessentials\u002Fmfa","docs\u002Fiam\u002F01.essentials\u002F10.mfa",{"title":434,"path":435,"stem":436},"Fingerprinting","\u002Fdocs\u002Fiam\u002Fessentials\u002Ffingerprinting","docs\u002Fiam\u002F01.essentials\u002F11.fingerprinting",{"title":438,"path":439,"stem":440},"Backend for Frontend","\u002Fdocs\u002Fiam\u002Fessentials\u002Fbff","docs\u002Fiam\u002F01.essentials\u002F12.bff",{"title":442,"path":443,"stem":444},"HMAC Authentication","\u002Fdocs\u002Fiam\u002Fessentials\u002Fhmac","docs\u002Fiam\u002F01.essentials\u002F13.hmac",{"title":446,"path":447,"stem":448},"XSS Protection","\u002Fdocs\u002Fiam\u002Fessentials\u002Fxss","docs\u002Fiam\u002F01.essentials\u002F14.xss",{"title":99,"path":450,"stem":451},"\u002Fdocs\u002Fiam\u002Fessentials\u002Flogging","docs\u002Fiam\u002F01.essentials\u002F15.logging",{"title":453,"path":454,"stem":455},"Rate Limiting","\u002Fdocs\u002Fiam\u002Fessentials\u002Frate-limiting","docs\u002Fiam\u002F01.essentials\u002F16.rate-limiting",{"title":457,"path":458,"stem":459},"Database","\u002Fdocs\u002Fiam\u002Fessentials\u002Fdatabase","docs\u002Fiam\u002F01.essentials\u002F17.database",{"title":237,"path":461,"stem":462},"\u002Fdocs\u002Fiam\u002Fessentials\u002Fcookies","docs\u002Fiam\u002F01.essentials\u002F18.cookies",{"title":464,"path":465,"stem":466},"Service Startup","\u002Fdocs\u002Fiam\u002Fessentials\u002Fservice","docs\u002Fiam\u002F01.essentials\u002F19.service",{"title":254,"path":468,"stem":469},"\u002Fdocs\u002Fiam\u002Fessentials\u002Fpassword-reset","docs\u002Fiam\u002F01.essentials\u002F20.password-reset",{"title":471,"path":472,"stem":473,"children":474},"API Tokens","\u002Fdocs\u002Fiam\u002Fessentials\u002Fapi","docs\u002Fiam\u002F01.essentials\u002F21.api\u002Findex",[475,476,480,484,514,517],{"title":471,"path":472,"stem":473},{"title":477,"path":478,"stem":479},"Creating Tokens","\u002Fdocs\u002Fiam\u002Fessentials\u002Fapi\u002Fcreation","docs\u002Fiam\u002F01.essentials\u002F21.api\u002F00.creation",{"title":481,"path":482,"stem":483},"Verifying Tokens","\u002Fdocs\u002Fiam\u002Fessentials\u002Fapi\u002Fverification","docs\u002Fiam\u002F01.essentials\u002F21.api\u002F01.verification",{"title":485,"path":486,"stem":487,"children":488},"Manage Tokens","\u002Fdocs\u002Fiam\u002Fessentials\u002Fapi\u002Fmanagement","docs\u002Fiam\u002F01.essentials\u002F21.api\u002F02.management\u002Findex",[489,490,494,498,502,506,510],{"title":485,"path":486,"stem":487},{"title":491,"path":492,"stem":493},"Privileges","\u002Fdocs\u002Fiam\u002Fessentials\u002Fapi\u002Fmanagement\u002Fprivilege","docs\u002Fiam\u002F01.essentials\u002F21.api\u002F02.management\u002F00.privilege",{"title":495,"path":496,"stem":497},"Revocation","\u002Fdocs\u002Fiam\u002Fessentials\u002Fapi\u002Fmanagement\u002Frevocation","docs\u002Fiam\u002F01.essentials\u002F21.api\u002F02.management\u002F01.revocation",{"title":499,"path":500,"stem":501},"Rotation","\u002Fdocs\u002Fiam\u002Fessentials\u002Fapi\u002Fmanagement\u002Frotation","docs\u002Fiam\u002F01.essentials\u002F21.api\u002F02.management\u002F02.rotation",{"title":503,"path":504,"stem":505},"IP Restriction","\u002Fdocs\u002Fiam\u002Fessentials\u002Fapi\u002Fmanagement\u002Fip-updates","docs\u002Fiam\u002F01.essentials\u002F21.api\u002F02.management\u002F03.ip-updates",{"title":507,"path":508,"stem":509},"Metadata","\u002Fdocs\u002Fiam\u002Fessentials\u002Fapi\u002Fmanagement\u002Fmetadata","docs\u002Fiam\u002F01.essentials\u002F21.api\u002F02.management\u002F04.metadata",{"title":511,"path":512,"stem":513},"Token Listing","\u002Fdocs\u002Fiam\u002Fessentials\u002Fapi\u002Fmanagement\u002Flist","docs\u002Fiam\u002F01.essentials\u002F21.api\u002F02.management\u002F05.list",{"title":453,"path":515,"stem":516},"\u002Fdocs\u002Fiam\u002Fessentials\u002Fapi\u002Frate-limiting","docs\u002Fiam\u002F01.essentials\u002F21.api\u002F03.rate-limiting",{"title":38,"path":518,"stem":519},"\u002Fdocs\u002Fiam\u002Fessentials\u002Fapi\u002Fsecurity","docs\u002Fiam\u002F01.essentials\u002F21.api\u002F04.security",{"title":38,"path":521,"stem":522},"\u002Fdocs\u002Fiam\u002Fsecurity","docs\u002Fiam\u002F02.security",{"title":86,"path":524,"stem":525,"children":526,"page":53},"\u002Fdocs\u002Fiam\u002Fguides","docs\u002Fiam\u002F03.guides",[527,531,535],{"title":528,"path":529,"stem":530},"Deployment","\u002Fdocs\u002Fiam\u002Fguides\u002Fdeployment","docs\u002Fiam\u002F03.guides\u002Fdeployment",{"title":532,"path":533,"stem":534},"Operation Scripts","\u002Fdocs\u002Fiam\u002Fguides\u002Foperation-scripts","docs\u002Fiam\u002F03.guides\u002Foperation-scripts",{"title":536,"path":537,"stem":538},"Role-Based Access Control","\u002Fdocs\u002Fiam\u002Fguides\u002Frbac","docs\u002Fiam\u002F03.guides\u002Frbac",{"title":188,"path":540,"stem":541},"\u002Fdocs\u002Fiam\u002Fconfiguration","docs\u002Fiam\u002F04.configuration",{"title":543,"path":544,"stem":545,"children":546,"page":53},"Api","\u002Fdocs\u002Fiam\u002Fapi","docs\u002Fiam\u002F05.API",[547,550,553],{"title":184,"path":548,"stem":549},"\u002Fdocs\u002Fiam\u002Fapi\u002Fapi","docs\u002Fiam\u002F05.API\u002F00.api",{"title":327,"path":551,"stem":552},"\u002Fdocs\u002Fiam\u002Fapi\u002Fmiddlewares","docs\u002Fiam\u002F05.API\u002F02.middlewares",{"title":323,"path":554,"stem":555},"\u002Fdocs\u002Fiam\u002Fapi\u002Froutes","docs\u002Fiam\u002F05.API\u002F03.routes",{"title":40,"path":42,"stem":557,"children":558},"docs\u002Fshield-base\u002Findex",[559,560,563,567,608,612,616,620],{"title":40,"path":42,"stem":557},{"title":14,"path":561,"stem":562},"\u002Fdocs\u002Fshield-base\u002Fgetting-started","docs\u002Fshield-base\u002F00.getting-started",{"title":564,"path":565,"stem":566},"CLI Reference","\u002Fdocs\u002Fshield-base\u002Fcli","docs\u002Fshield-base\u002F01.cli",{"title":82,"path":568,"stem":569,"children":570},"\u002Fdocs\u002Fshield-base\u002Fdata-sources","docs\u002Fshield-base\u002F02.data-sources\u002Findex",[571,572,576,580,584,588,592,596,600,604],{"title":82,"path":568,"stem":569},{"title":573,"path":574,"stem":575},"BGP \u002F ASN","\u002Fdocs\u002Fshield-base\u002Fdata-sources\u002Fbgp","docs\u002Fshield-base\u002F02.data-sources\u002Fbgp",{"title":577,"path":578,"stem":579},"City Geolocation","\u002Fdocs\u002Fshield-base\u002Fdata-sources\u002Fcity","docs\u002Fshield-base\u002F02.data-sources\u002Fcity",{"title":581,"path":582,"stem":583},"Country Geolocation","\u002Fdocs\u002Fshield-base\u002Fdata-sources\u002Fcountry","docs\u002Fshield-base\u002F02.data-sources\u002Fcountry",{"title":585,"path":586,"stem":587},"Verified Crawlers","\u002Fdocs\u002Fshield-base\u002Fdata-sources\u002Fcrawlers","docs\u002Fshield-base\u002F02.data-sources\u002Fcrawlers",{"title":589,"path":590,"stem":591},"Disposable Emails","\u002Fdocs\u002Fshield-base\u002Fdata-sources\u002Femail","docs\u002Fshield-base\u002F02.data-sources\u002Femail",{"title":593,"path":594,"stem":595},"FireHOL Threat Intelligence","\u002Fdocs\u002Fshield-base\u002Fdata-sources\u002Ffirehol","docs\u002Fshield-base\u002F02.data-sources\u002Ffirehol",{"title":597,"path":598,"stem":599},"Proxy Detection","\u002Fdocs\u002Fshield-base\u002Fdata-sources\u002Fproxy","docs\u002Fshield-base\u002F02.data-sources\u002Fproxy",{"title":601,"path":602,"stem":603},"Tor Nodes","\u002Fdocs\u002Fshield-base\u002Fdata-sources\u002Ftor","docs\u002Fshield-base\u002F02.data-sources\u002Ftor",{"title":605,"path":606,"stem":607},"Suspicious User-Agents","\u002Fdocs\u002Fshield-base\u002Fdata-sources\u002Fuseragent","docs\u002Fshield-base\u002F02.data-sources\u002Fuseragent",{"title":609,"path":610,"stem":611},"Programmatic Usage","\u002Fdocs\u002Fshield-base\u002Fusage","docs\u002Fshield-base\u002F03.usage",{"title":613,"path":614,"stem":615},"Custom Data Sources","\u002Fdocs\u002Fshield-base\u002Fcustom-data-sources","docs\u002Fshield-base\u002F04.custom-data-sources",{"title":617,"path":618,"stem":619},"TypeScript Types","\u002Fdocs\u002Fshield-base\u002Ftypes","docs\u002Fshield-base\u002F05.types",{"title":184,"path":621,"stem":622},"\u002Fdocs\u002Fshield-base\u002Fapi","docs\u002Fshield-base\u002F06.api",{"title":335,"path":48,"stem":624,"children":625},"docs\u002Futils\u002Findex",[626,627,644,677,774],{"title":335,"path":48,"stem":624},{"title":628,"path":629,"stem":630,"children":631,"page":53},"Eslint","\u002Fdocs\u002Futils\u002Feslint","docs\u002Futils\u002Feslint",[632,636,640],{"title":633,"path":634,"stem":635},"React Config","\u002Fdocs\u002Futils\u002Feslint\u002Freact","docs\u002Futils\u002Feslint\u002Freact",{"title":637,"path":638,"stem":639},"TypeScript Config","\u002Fdocs\u002Futils\u002Feslint\u002Ftypescript","docs\u002Futils\u002Feslint\u002Ftypescript",{"title":641,"path":642,"stem":643},"Vue Config","\u002Fdocs\u002Futils\u002Feslint\u002Fvue","docs\u002Futils\u002Feslint\u002Fvue",{"title":645,"path":646,"stem":647,"children":648,"page":53},"Server","\u002Fdocs\u002Futils\u002Fserver","docs\u002Futils\u002Fserver",[649,653,657,661,665,669,673],{"title":650,"path":651,"stem":652},"Encryption","\u002Fdocs\u002Futils\u002Fserver\u002Fencryption","docs\u002Futils\u002Fserver\u002Fencryption",{"title":654,"path":655,"stem":656},"Path Resolver","\u002Fdocs\u002Futils\u002Fserver\u002Fpathresolver","docs\u002Futils\u002Fserver\u002FpathResolver",{"title":658,"path":659,"stem":660},"File Replacements","\u002Fdocs\u002Futils\u002Fserver\u002Freplace","docs\u002Futils\u002Fserver\u002Freplace",{"title":662,"path":663,"stem":664},"run","\u002Fdocs\u002Futils\u002Fserver\u002Frun","docs\u002Futils\u002Fserver\u002Frun",{"title":666,"path":667,"stem":668},"scheduleTask","\u002Fdocs\u002Futils\u002Fserver\u002Fscheduletask","docs\u002Futils\u002Fserver\u002FscheduleTask",{"title":670,"path":671,"stem":672},"spawnRun","\u002Fdocs\u002Futils\u002Fserver\u002Fspawnrun","docs\u002Futils\u002Fserver\u002FspawnRun",{"title":674,"path":675,"stem":676},"uploadCsv","\u002Fdocs\u002Futils\u002Fserver\u002Fuploadcsv","docs\u002Futils\u002Fserver\u002FuploadCsv",{"title":678,"path":679,"stem":680,"children":681,"page":53},"Shared","\u002Fdocs\u002Futils\u002Fshared","docs\u002Futils\u002Fshared",[682,686,690,694,698,702,706,710,714,718,722,726,730,734,738,742,746,750,754,758,762,766,770],{"title":683,"path":684,"stem":685},"BatchQueue","\u002Fdocs\u002Futils\u002Fshared\u002Fbatchqueue","docs\u002Futils\u002Fshared\u002FbatchQueue",{"title":687,"path":688,"stem":689},"capitalize","\u002Fdocs\u002Futils\u002Fshared\u002Fcapitalize","docs\u002Futils\u002Fshared\u002Fcapitalize",{"title":691,"path":692,"stem":693},"chunkProcess","\u002Fdocs\u002Futils\u002Fshared\u002Fchunkprocess","docs\u002Futils\u002Fshared\u002FchunkProcess",{"title":695,"path":696,"stem":697},"cleanObject","\u002Fdocs\u002Futils\u002Fshared\u002Fcleanobject","docs\u002Futils\u002Fshared\u002FcleanObject",{"title":699,"path":700,"stem":701},"createConfigManager","\u002Fdocs\u002Futils\u002Fshared\u002Fconfigurationdefiner","docs\u002Futils\u002Fshared\u002FconfigurationDefiner",{"title":703,"path":704,"stem":705},"debounce","\u002Fdocs\u002Futils\u002Fshared\u002Fdebounce","docs\u002Futils\u002Fshared\u002Fdebounce",{"title":707,"path":708,"stem":709},"ensureArray","\u002Fdocs\u002Futils\u002Fshared\u002Fensurearray","docs\u002Futils\u002Fshared\u002FensureArray",{"title":711,"path":712,"stem":713},"fetchWithRetry","\u002Fdocs\u002Futils\u002Fshared\u002Ffetchwithretry","docs\u002Futils\u002Fshared\u002FfetchWithRetry",{"title":715,"path":716,"stem":717},"filterEmptyValues","\u002Fdocs\u002Futils\u002Fshared\u002Ffilteremptyvalues","docs\u002Futils\u002Fshared\u002FfilterEmptyValues",{"title":719,"path":720,"stem":721},"findStringsInObject","\u002Fdocs\u002Futils\u002Fshared\u002Ffindobjectvalues","docs\u002Futils\u002Fshared\u002FfindObjectValues",{"title":723,"path":724,"stem":725},"fisherYatesShuffle","\u002Fdocs\u002Futils\u002Fshared\u002Ffisheryatesshuffle","docs\u002Futils\u002Fshared\u002FfisherYatesShuffle",{"title":727,"path":728,"stem":729},"getRandomImage","\u002Fdocs\u002Futils\u002Fshared\u002Fgetrandomimage","docs\u002Futils\u002Fshared\u002FgetRandomImage",{"title":731,"path":732,"stem":733},"isObjectHasValues","\u002Fdocs\u002Futils\u002Fshared\u002Fisobjecthasvalues","docs\u002Futils\u002Fshared\u002FisObjectHasValues",{"title":735,"path":736,"stem":737},"isAsyncOrPromise","\u002Fdocs\u002Futils\u002Fshared\u002Fispromise","docs\u002Futils\u002Fshared\u002FisPromise",{"title":739,"path":740,"stem":741},"MiniCache","\u002Fdocs\u002Futils\u002Fshared\u002Fminicache","docs\u002Futils\u002Fshared\u002FminiCache",{"title":743,"path":744,"stem":745},"parseCookies","\u002Fdocs\u002Futils\u002Fshared\u002Fparserawcookies","docs\u002Futils\u002Fshared\u002FparseRawCookies",{"title":747,"path":748,"stem":749},"safeAction","\u002Fdocs\u002Futils\u002Fshared\u002Fpromiselocker","docs\u002Futils\u002Fshared\u002FpromiseLocker",{"title":751,"path":752,"stem":753},"Random","\u002Fdocs\u002Futils\u002Fshared\u002Frandom","docs\u002Futils\u002Fshared\u002Frandom",{"title":755,"path":756,"stem":757},"range","\u002Fdocs\u002Futils\u002Fshared\u002Frange","docs\u002Futils\u002Fshared\u002Frange",{"title":759,"path":760,"stem":761},"rateLimiters","\u002Fdocs\u002Futils\u002Fshared\u002Fratelimiters","docs\u002Futils\u002Fshared\u002FrateLimiters",{"title":763,"path":764,"stem":765},"safeObjectMerge","\u002Fdocs\u002Futils\u002Fshared\u002Fsafemerge","docs\u002Futils\u002Fshared\u002FsafeMerge",{"title":767,"path":768,"stem":769},"textTruncation","\u002Fdocs\u002Futils\u002Fshared\u002Ftexttruncation","docs\u002Futils\u002Fshared\u002FtextTruncation",{"title":771,"path":772,"stem":773},"validateZodSchema","\u002Fdocs\u002Futils\u002Fshared\u002Fvalidatezodschema","docs\u002Futils\u002Fshared\u002FvalidateZodSchema",{"title":775,"path":776,"stem":777,"children":778},"Utility Types","\u002Fdocs\u002Futils\u002Ftypes","docs\u002Futils\u002Ftypes\u002Findex",[779,780,784,788,792,796,800,804,808,812],{"title":775,"path":776,"stem":777},{"title":781,"path":782,"stem":783},"Brand","\u002Fdocs\u002Futils\u002Ftypes\u002Fbrand","docs\u002Futils\u002Ftypes\u002FBrand",{"title":785,"path":786,"stem":787},"DeepPartial","\u002Fdocs\u002Futils\u002Ftypes\u002Fdeeppartial","docs\u002Futils\u002Ftypes\u002FDeepPartial",{"title":789,"path":790,"stem":791},"Merge","\u002Fdocs\u002Futils\u002Ftypes\u002Fmerge","docs\u002Futils\u002Ftypes\u002FMerge",{"title":793,"path":794,"stem":795},"NonNullable","\u002Fdocs\u002Futils\u002Ftypes\u002Fnonnullable","docs\u002Futils\u002Ftypes\u002FNonNullable",{"title":797,"path":798,"stem":799},"Prettify","\u002Fdocs\u002Futils\u002Ftypes\u002Fprettify","docs\u002Futils\u002Ftypes\u002FPrettify",{"title":801,"path":802,"stem":803},"PromiseType","\u002Fdocs\u002Futils\u002Ftypes\u002Fpromisetype","docs\u002Futils\u002Ftypes\u002FPromiseType",{"title":805,"path":806,"stem":807},"RequireKeys","\u002Fdocs\u002Futils\u002Ftypes\u002Frequirekeys","docs\u002Futils\u002Ftypes\u002FRequireKeys",{"title":809,"path":810,"stem":811},"StandardResponse","\u002Fdocs\u002Futils\u002Ftypes\u002Fstandardresponse","docs\u002Futils\u002Ftypes\u002FStandardResponse",{"title":813,"path":814,"stem":815},"ValueOf","\u002Fdocs\u002Futils\u002Ftypes\u002Fvalueof","docs\u002Futils\u002Ftypes\u002FValueOf",{"id":4,"extension":5,"links":817,"meta":828,"stem":62,"__hash__":63},[818,826,827],{"nested":8,"label":9,"icon":10,"to":11,"children":819},[820,821,822,823,824,825],{"label":14,"icon":15,"to":11,"description":16,"github":17,"badge":18},{"label":20,"icon":21,"to":22,"description":23,"github":24,"badge":25},{"label":27,"icon":28,"to":29,"description":30,"github":31,"badge":25},{"label":33,"icon":34,"to":35,"description":36,"github":37,"badge":38},{"label":40,"icon":41,"to":42,"description":43,"github":44,"badge":38},{"label":46,"icon":47,"to":48,"description":49,"github":50,"badge":51},{"nested":53,"label":54,"icon":55,"to":56},{"nested":53,"label":58,"icon":59,"to":60},{},{"id":830,"title":157,"body":831,"description":1392,"extension":1393,"icon":1394,"meta":1395,"module":1396,"navigation":8,"path":158,"rawbody":1397,"seo":1398,"stem":159,"__hash__":1399},"docs\u002Fdocs\u002Fbot-detection\u002F04.checkers\u002F12.proxy-isp-cookies.md",{"type":832,"value":833,"toc":1387},"minimark",[834,838,841,844,849,869,872,901,919,933,935,938,1180,1187,1256,1258,1262,1337,1339,1360,1383],[835,836,837],"p",{},"The proxy\u002FISP\u002Fcookie checker evaluates several related signals that together paint a picture of the visitor's network identity. A missing canary cookie suggests the visitor does not persist cookies (common in bots). A proxy IP means the traffic is being routed through an anonymization service. A hosting network IP suggests the request comes from a cloud VM rather than a real user's device. Unknown ISP or organization fields are a secondary indicator of incomplete or obscured network identity.",[835,839,840],{},"This checker runs in the heavy phase.",[842,843],"hr",{},[845,846,848],"h2",{"id":847},"how-it-works","How It Works",[835,850,851,855,856,860,861,864,865,868],{},[852,853,854],"strong",{},"Cookie presence",": The ",[857,858,859],"code",{},"canary_id"," cookie is set by ",[857,862,863],{},"detectBots()"," on the first visit. When a subsequent request arrives without the cookie, the visitor either cleared cookies or never stored them. Most bots discard cookies between requests. A missing cookie on a non-first request applies ",[857,866,867],{},"cookieMissing",".",[835,870,871],{},"The checker determines whether a request is a \"first visit\" using internal context. If the visitor truly has no prior record, the missing cookie is expected and is not penalized.",[835,873,874,877,878,881,882,885,886,889,890,893,894,896,897,900],{},[852,875,876],{},"Proxy detection",": The checker looks up the client IP in ",[857,879,880],{},"proxy.mmdb",", which aggregates known proxy and anonymizer IPs from multiple public sources. A match applies ",[857,883,884],{},"proxyDetected",". The proxy database record includes a ",[857,887,888],{},"comment"," field listing the source feeds that flagged the IP. When the IP appears in two or three sources, a ",[857,891,892],{},"multiSourceBonus2to3"," penalty adds on top of ",[857,895,884],{},". Four or more sources add ",[857,898,899],{},"multiSourceBonus4plus"," instead.",[835,902,903,906,907,910,911,914,915,918],{},[852,904,905],{},"Hosting detection",": The geolocation lookup populates ",[857,908,909],{},"ctx.geoData.hosting",". When this flag is ",[857,912,913],{},"true",", the IP belongs to a hosting or CDN network. The ",[857,916,917],{},"hostingDetected"," penalty applies.",[835,920,921,924,925,928,929,932],{},[852,922,923],{},"Unknown ISP or organization",": The geolocation record includes ",[857,926,927],{},"isp"," and ",[857,930,931],{},"org"," fields. Legitimate residential and business ISPs always populate these. Proxy services, VPNs, and some datacenter providers leave them null. When either field is absent, the corresponding penalty applies.",[842,934],{},[845,936,188],{"id":937},"configuration",[939,940,946],"pre",{"className":941,"code":942,"filename":943,"language":944,"meta":945,"style":945},"language-ts shiki shiki-themes light-plus light-plus dracula","await defineConfiguration({\n  store: { main: { driver: 'sqlite', name: '.\u002Fbot-detector.db' } },\n  checkers: {\n    enableProxyIspCookiesChecks: {\n      enable: true,\n      penalties: {\n        cookieMissing: 80,\n        proxyDetected: 40,\n        multiSourceBonus2to3: 10,\n        multiSourceBonus4plus: 20,\n        hostingDetected: 50,\n        ispUnknown: 10,\n        orgUnknown: 10,\n      },\n    },\n  },\n})\n","server.ts","ts","",[857,947,948,965,1020,1031,1041,1056,1066,1080,1093,1106,1119,1132,1144,1156,1162,1168,1174],{"__ignoreMap":945},[949,950,953,957,961],"span",{"class":951,"line":952},"line",1,[949,954,956],{"class":955},"sZ328","await",[949,958,960],{"class":959},"sHOzp"," defineConfiguration",[949,962,964],{"class":963},"sDd4n","({\n",[949,966,968,972,976,979,982,984,986,989,991,995,999,1002,1005,1008,1010,1012,1015,1017],{"class":951,"line":967},2,[949,969,971],{"class":970},"sjsA6","  store",[949,973,975],{"class":974},"s34zl",":",[949,977,978],{"class":963}," { ",[949,980,981],{"class":970},"main",[949,983,975],{"class":974},[949,985,978],{"class":963},[949,987,988],{"class":970},"driver",[949,990,975],{"class":974},[949,992,994],{"class":993},"sFkSl"," '",[949,996,998],{"class":997},"sFB1V","sqlite",[949,1000,1001],{"class":993},"'",[949,1003,1004],{"class":963},", ",[949,1006,1007],{"class":970},"name",[949,1009,975],{"class":974},[949,1011,994],{"class":993},[949,1013,1014],{"class":997},".\u002Fbot-detector.db",[949,1016,1001],{"class":993},[949,1018,1019],{"class":963}," } },\n",[949,1021,1023,1026,1028],{"class":951,"line":1022},3,[949,1024,1025],{"class":970},"  checkers",[949,1027,975],{"class":974},[949,1029,1030],{"class":963}," {\n",[949,1032,1034,1037,1039],{"class":951,"line":1033},4,[949,1035,1036],{"class":970},"    enableProxyIspCookiesChecks",[949,1038,975],{"class":974},[949,1040,1030],{"class":963},[949,1042,1044,1047,1049,1053],{"class":951,"line":1043},5,[949,1045,1046],{"class":970},"      enable",[949,1048,975],{"class":974},[949,1050,1052],{"class":1051},"sjR7W"," true",[949,1054,1055],{"class":963},",\n",[949,1057,1059,1062,1064],{"class":951,"line":1058},6,[949,1060,1061],{"class":970},"      penalties",[949,1063,975],{"class":974},[949,1065,1030],{"class":963},[949,1067,1069,1072,1074,1078],{"class":951,"line":1068},7,[949,1070,1071],{"class":970},"        cookieMissing",[949,1073,975],{"class":974},[949,1075,1077],{"class":1076},"spgvN"," 80",[949,1079,1055],{"class":963},[949,1081,1083,1086,1088,1091],{"class":951,"line":1082},8,[949,1084,1085],{"class":970},"        proxyDetected",[949,1087,975],{"class":974},[949,1089,1090],{"class":1076}," 40",[949,1092,1055],{"class":963},[949,1094,1096,1099,1101,1104],{"class":951,"line":1095},9,[949,1097,1098],{"class":970},"        multiSourceBonus2to3",[949,1100,975],{"class":974},[949,1102,1103],{"class":1076}," 10",[949,1105,1055],{"class":963},[949,1107,1109,1112,1114,1117],{"class":951,"line":1108},10,[949,1110,1111],{"class":970},"        multiSourceBonus4plus",[949,1113,975],{"class":974},[949,1115,1116],{"class":1076}," 20",[949,1118,1055],{"class":963},[949,1120,1122,1125,1127,1130],{"class":951,"line":1121},11,[949,1123,1124],{"class":970},"        hostingDetected",[949,1126,975],{"class":974},[949,1128,1129],{"class":1076}," 50",[949,1131,1055],{"class":963},[949,1133,1135,1138,1140,1142],{"class":951,"line":1134},12,[949,1136,1137],{"class":970},"        ispUnknown",[949,1139,975],{"class":974},[949,1141,1103],{"class":1076},[949,1143,1055],{"class":963},[949,1145,1147,1150,1152,1154],{"class":951,"line":1146},13,[949,1148,1149],{"class":970},"        orgUnknown",[949,1151,975],{"class":974},[949,1153,1103],{"class":1076},[949,1155,1055],{"class":963},[949,1157,1159],{"class":951,"line":1158},14,[949,1160,1161],{"class":963},"      },\n",[949,1163,1165],{"class":951,"line":1164},15,[949,1166,1167],{"class":963},"    },\n",[949,1169,1171],{"class":951,"line":1170},16,[949,1172,1173],{"class":963},"  },\n",[949,1175,1177],{"class":951,"line":1176},17,[949,1178,1179],{"class":963},"})\n",[835,1181,1182,1183,1186],{},"All weights live inside the ",[857,1184,1185],{},"penalties: {}"," sub-object.",[1188,1189,1190,1203,1214,1222,1232,1240,1248],"field-group",{},[1191,1192,1194],"field",{"name":867,"type":1193},"number",[835,1195,1196,1197,1199,1200,868],{},"Penalty when a returning visitor's request does not carry the ",[857,1198,859],{}," cookie. Default: ",[857,1201,1202],{},"80",[1191,1204,1205],{"name":884,"type":1193},[835,1206,1207,1208,1210,1211,868],{},"Penalty when the client IP is found in ",[857,1209,880],{},". Default: ",[857,1212,1213],{},"40",[1191,1215,1216],{"name":892,"type":1193},[835,1217,1218,1219,868],{},"Additional penalty when the proxy IP appears in two or three source feeds. Default: ",[857,1220,1221],{},"10",[1191,1223,1224],{"name":899,"type":1193},[835,1225,1226,1227,1210,1229,868],{},"Additional penalty when the proxy IP appears in four or more source feeds. Replaces ",[857,1228,892],{},[857,1230,1231],{},"20",[1191,1233,1234],{"name":917,"type":1193},[835,1235,1236,1237,868],{},"Penalty when the geolocation data identifies the IP as belonging to a hosting or CDN network. Default: ",[857,1238,1239],{},"50",[1191,1241,1243],{"name":1242,"type":1193},"ispUnknown",[835,1244,1245,1246,868],{},"Penalty when the geolocation ISP field is null or absent. Default: ",[857,1247,1221],{},[1191,1249,1251],{"name":1250,"type":1193},"orgUnknown",[835,1252,1253,1254,868],{},"Penalty when the geolocation organization field is null or absent. Default: ",[857,1255,1221],{},[842,1257],{},[845,1259,1261],{"id":1260},"reason-codes","Reason Codes",[1263,1264,1265,1278],"table",{},[1266,1267,1268],"thead",{},[1269,1270,1271,1275],"tr",{},[1272,1273,1274],"th",{},"Code",[1272,1276,1277],{},"Trigger",[1279,1280,1281,1295,1307,1317,1327],"tbody",{},[1269,1282,1283,1289],{},[1284,1285,1286],"td",{},[857,1287,1288],{},"COOKIE_MISSING",[1284,1290,1291,1292,1294],{},"A returning visitor's request has no ",[857,1293,859],{}," cookie.",[1269,1296,1297,1302],{},[1284,1298,1299],{},[857,1300,1301],{},"PROXY_DETECTED",[1284,1303,1304,1305,868],{},"The client IP matched a known proxy or anonymizer in ",[857,1306,880],{},[1269,1308,1309,1314],{},[1284,1310,1311],{},[857,1312,1313],{},"HOSTING_DETECTED",[1284,1315,1316],{},"The geolocation data identifies the IP as a hosting or CDN network.",[1269,1318,1319,1324],{},[1284,1320,1321],{},[857,1322,1323],{},"ISP_UNKNOWN",[1284,1325,1326],{},"The ISP field in the geolocation record is null or absent.",[1269,1328,1329,1334],{},[1284,1330,1331],{},[857,1332,1333],{},"ORG_UNKNOWN",[1284,1335,1336],{},"The organization field in the geolocation record is null or absent.",[842,1338],{},[1340,1341,1342],"note",{},[835,1343,1344,1345,1348,1349,1351,1352,1355,1356,1359],{},"This checker requires ",[857,1346,1347],{},"cookie-parser"," to be mounted before ",[857,1350,863],{}," in the Express middleware stack. Without it, ",[857,1353,1354],{},"req.cookies"," is undefined and cookie presence cannot be evaluated. See the ",[1357,1358,38],"a",{"href":181}," page for setup details.",[1361,1362,1363],"tip",{},[835,1364,1365,1366,1368,1369,1371,1372,1375,1376,1379,1380,1382],{},"The ",[857,1367,867],{}," penalty defaults to ",[857,1370,1202],{},", close to the default ",[857,1373,1374],{},"banScore"," of ",[857,1377,1378],{},"100",". A single missing cookie combined with any other weak signal (unknown ISP, hosting IP) will reach ",[857,1381,1374],{},". If your application serves a significant number of legitimate users who disable cookies, reduce this penalty and rely on the combination with other signals.",[1384,1385,1386],"style",{},"html pre.shiki code .sZ328, html code.shiki .sZ328{--shiki-light:#AF00DB;--shiki-default:#AF00DB;--shiki-dark:#FF79C6}html pre.shiki code .sHOzp, html code.shiki .sHOzp{--shiki-light:#795E26;--shiki-default:#795E26;--shiki-dark:#50FA7B}html pre.shiki code .sDd4n, html code.shiki .sDd4n{--shiki-light:#000000;--shiki-default:#000000;--shiki-dark:#F8F8F2}html pre.shiki code .sjsA6, html code.shiki .sjsA6{--shiki-light:#001080;--shiki-default:#001080;--shiki-dark:#F8F8F2}html pre.shiki code .s34zl, html code.shiki .s34zl{--shiki-light:#001080;--shiki-default:#001080;--shiki-dark:#FF79C6}html pre.shiki code .sFkSl, html code.shiki .sFkSl{--shiki-light:#A31515;--shiki-default:#A31515;--shiki-dark:#E9F284}html pre.shiki code .sFB1V, html code.shiki .sFB1V{--shiki-light:#A31515;--shiki-default:#A31515;--shiki-dark:#F1FA8C}html pre.shiki code .sjR7W, html code.shiki .sjR7W{--shiki-light:#0000FF;--shiki-default:#0000FF;--shiki-dark:#BD93F9}html pre.shiki code .spgvN, html code.shiki .spgvN{--shiki-light:#098658;--shiki-default:#098658;--shiki-dark:#BD93F9}html .light .shiki span {color: var(--shiki-light);background: var(--shiki-light-bg);font-style: var(--shiki-light-font-style);font-weight: var(--shiki-light-font-weight);text-decoration: var(--shiki-light-text-decoration);}html.light .shiki span {color: var(--shiki-light);background: var(--shiki-light-bg);font-style: var(--shiki-light-font-style);font-weight: var(--shiki-light-font-weight);text-decoration: var(--shiki-light-text-decoration);}html .default .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html .dark .shiki span {color: var(--shiki-dark);background: var(--shiki-dark-bg);font-style: var(--shiki-dark-font-style);font-weight: var(--shiki-dark-font-weight);text-decoration: var(--shiki-dark-text-decoration);}html.dark .shiki span {color: var(--shiki-dark);background: var(--shiki-dark-bg);font-style: var(--shiki-dark-font-style);font-weight: var(--shiki-dark-font-weight);text-decoration: var(--shiki-dark-text-decoration);}",{"title":945,"searchDepth":967,"depth":967,"links":1388},[1389,1390,1391],{"id":847,"depth":967,"text":848},{"id":937,"depth":967,"text":188},{"id":1260,"depth":967,"text":1261},"Detects proxy IPs, datacenter hosting networks, missing canary cookies, and unknown ISP or organization data.","md","i-lucide-waypoints",{},null,"---\ntitle: Proxy \u002F ISP \u002F Cookie\ndescription: Detects proxy IPs, datacenter hosting networks, missing canary cookies, and unknown ISP or organization data.\nicon: i-lucide-waypoints\n---\n\nThe proxy\u002FISP\u002Fcookie checker evaluates several related signals that together paint a picture of the visitor's network identity. A missing canary cookie suggests the visitor does not persist cookies (common in bots). A proxy IP means the traffic is being routed through an anonymization service. A hosting network IP suggests the request comes from a cloud VM rather than a real user's device. Unknown ISP or organization fields are a secondary indicator of incomplete or obscured network identity.\n\nThis checker runs in the heavy phase.\n\n---\n\n## How It Works\n\n**Cookie presence**: The `canary_id` cookie is set by `detectBots()` on the first visit. When a subsequent request arrives without the cookie, the visitor either cleared cookies or never stored them. Most bots discard cookies between requests. A missing cookie on a non-first request applies `cookieMissing`.\n\nThe checker determines whether a request is a \"first visit\" using internal context. If the visitor truly has no prior record, the missing cookie is expected and is not penalized.\n\n**Proxy detection**: The checker looks up the client IP in `proxy.mmdb`, which aggregates known proxy and anonymizer IPs from multiple public sources. A match applies `proxyDetected`. The proxy database record includes a `comment` field listing the source feeds that flagged the IP. When the IP appears in two or three sources, a `multiSourceBonus2to3` penalty adds on top of `proxyDetected`. Four or more sources add `multiSourceBonus4plus` instead.\n\n**Hosting detection**: The geolocation lookup populates `ctx.geoData.hosting`. When this flag is `true`, the IP belongs to a hosting or CDN network. The `hostingDetected` penalty applies.\n\n**Unknown ISP or organization**: The geolocation record includes `isp` and `org` fields. Legitimate residential and business ISPs always populate these. Proxy services, VPNs, and some datacenter providers leave them null. When either field is absent, the corresponding penalty applies.\n\n---\n\n## Configuration\n\n```ts [server.ts]\nawait defineConfiguration({\n  store: { main: { driver: 'sqlite', name: '.\u002Fbot-detector.db' } },\n  checkers: {\n    enableProxyIspCookiesChecks: {\n      enable: true,\n      penalties: {\n        cookieMissing: 80,\n        proxyDetected: 40,\n        multiSourceBonus2to3: 10,\n        multiSourceBonus4plus: 20,\n        hostingDetected: 50,\n        ispUnknown: 10,\n        orgUnknown: 10,\n      },\n    },\n  },\n})\n```\n\nAll weights live inside the `penalties: {}` sub-object.\n\n::field-group\n::field{name=\"cookieMissing\" type=\"number\"}\nPenalty when a returning visitor's request does not carry the `canary_id` cookie. Default: `80`.\n::\n\n::field{name=\"proxyDetected\" type=\"number\"}\nPenalty when the client IP is found in `proxy.mmdb`. Default: `40`.\n::\n\n::field{name=\"multiSourceBonus2to3\" type=\"number\"}\nAdditional penalty when the proxy IP appears in two or three source feeds. Default: `10`.\n::\n\n::field{name=\"multiSourceBonus4plus\" type=\"number\"}\nAdditional penalty when the proxy IP appears in four or more source feeds. Replaces `multiSourceBonus2to3`. Default: `20`.\n::\n\n::field{name=\"hostingDetected\" type=\"number\"}\nPenalty when the geolocation data identifies the IP as belonging to a hosting or CDN network. Default: `50`.\n::\n\n::field{name=\"ispUnknown\" type=\"number\"}\nPenalty when the geolocation ISP field is null or absent. Default: `10`.\n::\n\n::field{name=\"orgUnknown\" type=\"number\"}\nPenalty when the geolocation organization field is null or absent. Default: `10`.\n::\n::\n\n---\n\n## Reason Codes\n\n| Code | Trigger |\n| --- | --- |\n| `COOKIE_MISSING` | A returning visitor's request has no `canary_id` cookie. |\n| `PROXY_DETECTED` | The client IP matched a known proxy or anonymizer in `proxy.mmdb`. |\n| `HOSTING_DETECTED` | The geolocation data identifies the IP as a hosting or CDN network. |\n| `ISP_UNKNOWN` | The ISP field in the geolocation record is null or absent. |\n| `ORG_UNKNOWN` | The organization field in the geolocation record is null or absent. |\n\n---\n\n::note\nThis checker requires `cookie-parser` to be mounted before `detectBots()` in the Express middleware stack. Without it, `req.cookies` is undefined and cookie presence cannot be evaluated. See the [Security](\u002Fdocs\u002Fbot-detection\u002Fsecurity) page for setup details.\n::\n\n::tip\nThe `cookieMissing` penalty defaults to `80`, close to the default `banScore` of `100`. A single missing cookie combined with any other weak signal (unknown ISP, hosting IP) will reach `banScore`. If your application serves a significant number of legitimate users who disable cookies, reduce this penalty and rely on the combination with other signals.\n::\n",{"title":157,"description":1392},"VzQRrdkZQqpWFK7rQvlc_m2sNVfW_0_XPoi7IvvnT4k",[1401,1402],{"title":153,"path":154,"stem":155,"children":-1},{"title":161,"path":162,"stem":163,"children":-1},{"id":830,"title":157,"body":1404,"description":1392,"extension":1393,"icon":1394,"meta":1783,"module":1396,"navigation":8,"path":158,"rawbody":1397,"seo":1784,"stem":159,"__hash__":1399},{"type":832,"value":1405,"toc":1778},[1406,1408,1410,1412,1414,1424,1426,1442,1452,1460,1462,1464,1634,1638,1688,1690,1692,1748,1750,1762,1776],[835,1407,837],{},[835,1409,840],{},[842,1411],{},[845,1413,848],{"id":847},[835,1415,1416,855,1418,860,1420,864,1422,868],{},[852,1417,854],{},[857,1419,859],{},[857,1421,863],{},[857,1423,867],{},[835,1425,871],{},[835,1427,1428,877,1430,881,1432,885,1434,889,1436,893,1438,896,1440,900],{},[852,1429,876],{},[857,1431,880],{},[857,1433,884],{},[857,1435,888],{},[857,1437,892],{},[857,1439,884],{},[857,1441,899],{},[835,1443,1444,906,1446,910,1448,914,1450,918],{},[852,1445,905],{},[857,1447,909],{},[857,1449,913],{},[857,1451,917],{},[835,1453,1454,924,1456,928,1458,932],{},[852,1455,923],{},[857,1457,927],{},[857,1459,931],{},[842,1461],{},[845,1463,188],{"id":937},[939,1465,1466],{"className":941,"code":942,"filename":943,"language":944,"meta":945,"style":945},[857,1467,1468,1476,1514,1522,1530,1540,1548,1558,1568,1578,1588,1598,1608,1618,1622,1626,1630],{"__ignoreMap":945},[949,1469,1470,1472,1474],{"class":951,"line":952},[949,1471,956],{"class":955},[949,1473,960],{"class":959},[949,1475,964],{"class":963},[949,1477,1478,1480,1482,1484,1486,1488,1490,1492,1494,1496,1498,1500,1502,1504,1506,1508,1510,1512],{"class":951,"line":967},[949,1479,971],{"class":970},[949,1481,975],{"class":974},[949,1483,978],{"class":963},[949,1485,981],{"class":970},[949,1487,975],{"class":974},[949,1489,978],{"class":963},[949,1491,988],{"class":970},[949,1493,975],{"class":974},[949,1495,994],{"class":993},[949,1497,998],{"class":997},[949,1499,1001],{"class":993},[949,1501,1004],{"class":963},[949,1503,1007],{"class":970},[949,1505,975],{"class":974},[949,1507,994],{"class":993},[949,1509,1014],{"class":997},[949,1511,1001],{"class":993},[949,1513,1019],{"class":963},[949,1515,1516,1518,1520],{"class":951,"line":1022},[949,1517,1025],{"class":970},[949,1519,975],{"class":974},[949,1521,1030],{"class":963},[949,1523,1524,1526,1528],{"class":951,"line":1033},[949,1525,1036],{"class":970},[949,1527,975],{"class":974},[949,1529,1030],{"class":963},[949,1531,1532,1534,1536,1538],{"class":951,"line":1043},[949,1533,1046],{"class":970},[949,1535,975],{"class":974},[949,1537,1052],{"class":1051},[949,1539,1055],{"class":963},[949,1541,1542,1544,1546],{"class":951,"line":1058},[949,1543,1061],{"class":970},[949,1545,975],{"class":974},[949,1547,1030],{"class":963},[949,1549,1550,1552,1554,1556],{"class":951,"line":1068},[949,1551,1071],{"class":970},[949,1553,975],{"class":974},[949,1555,1077],{"class":1076},[949,1557,1055],{"class":963},[949,1559,1560,1562,1564,1566],{"class":951,"line":1082},[949,1561,1085],{"class":970},[949,1563,975],{"class":974},[949,1565,1090],{"class":1076},[949,1567,1055],{"class":963},[949,1569,1570,1572,1574,1576],{"class":951,"line":1095},[949,1571,1098],{"class":970},[949,1573,975],{"class":974},[949,1575,1103],{"class":1076},[949,1577,1055],{"class":963},[949,1579,1580,1582,1584,1586],{"class":951,"line":1108},[949,1581,1111],{"class":970},[949,1583,975],{"class":974},[949,1585,1116],{"class":1076},[949,1587,1055],{"class":963},[949,1589,1590,1592,1594,1596],{"class":951,"line":1121},[949,1591,1124],{"class":970},[949,1593,975],{"class":974},[949,1595,1129],{"class":1076},[949,1597,1055],{"class":963},[949,1599,1600,1602,1604,1606],{"class":951,"line":1134},[949,1601,1137],{"class":970},[949,1603,975],{"class":974},[949,1605,1103],{"class":1076},[949,1607,1055],{"class":963},[949,1609,1610,1612,1614,1616],{"class":951,"line":1146},[949,1611,1149],{"class":970},[949,1613,975],{"class":974},[949,1615,1103],{"class":1076},[949,1617,1055],{"class":963},[949,1619,1620],{"class":951,"line":1158},[949,1621,1161],{"class":963},[949,1623,1624],{"class":951,"line":1164},[949,1625,1167],{"class":963},[949,1627,1628],{"class":951,"line":1170},[949,1629,1173],{"class":963},[949,1631,1632],{"class":951,"line":1176},[949,1633,1179],{"class":963},[835,1635,1182,1636,1186],{},[857,1637,1185],{},[1188,1639,1640,1648,1656,1662,1670,1676,1682],{},[1191,1641,1642],{"name":867,"type":1193},[835,1643,1196,1644,1199,1646,868],{},[857,1645,859],{},[857,1647,1202],{},[1191,1649,1650],{"name":884,"type":1193},[835,1651,1207,1652,1210,1654,868],{},[857,1653,880],{},[857,1655,1213],{},[1191,1657,1658],{"name":892,"type":1193},[835,1659,1218,1660,868],{},[857,1661,1221],{},[1191,1663,1664],{"name":899,"type":1193},[835,1665,1226,1666,1210,1668,868],{},[857,1667,892],{},[857,1669,1231],{},[1191,1671,1672],{"name":917,"type":1193},[835,1673,1236,1674,868],{},[857,1675,1239],{},[1191,1677,1678],{"name":1242,"type":1193},[835,1679,1245,1680,868],{},[857,1681,1221],{},[1191,1683,1684],{"name":1250,"type":1193},[835,1685,1253,1686,868],{},[857,1687,1221],{},[842,1689],{},[845,1691,1261],{"id":1260},[1263,1693,1694,1702],{},[1266,1695,1696],{},[1269,1697,1698,1700],{},[1272,1699,1274],{},[1272,1701,1277],{},[1279,1703,1704,1714,1724,1732,1740],{},[1269,1705,1706,1710],{},[1284,1707,1708],{},[857,1709,1288],{},[1284,1711,1291,1712,1294],{},[857,1713,859],{},[1269,1715,1716,1720],{},[1284,1717,1718],{},[857,1719,1301],{},[1284,1721,1304,1722,868],{},[857,1723,880],{},[1269,1725,1726,1730],{},[1284,1727,1728],{},[857,1729,1313],{},[1284,1731,1316],{},[1269,1733,1734,1738],{},[1284,1735,1736],{},[857,1737,1323],{},[1284,1739,1326],{},[1269,1741,1742,1746],{},[1284,1743,1744],{},[857,1745,1333],{},[1284,1747,1336],{},[842,1749],{},[1340,1751,1752],{},[835,1753,1344,1754,1348,1756,1351,1758,1355,1760,1359],{},[857,1755,1347],{},[857,1757,863],{},[857,1759,1354],{},[1357,1761,38],{"href":181},[1361,1763,1764],{},[835,1765,1365,1766,1368,1768,1371,1770,1375,1772,1379,1774,1382],{},[857,1767,867],{},[857,1769,1202],{},[857,1771,1374],{},[857,1773,1378],{},[857,1775,1374],{},[1384,1777,1386],{},{"title":945,"searchDepth":967,"depth":967,"links":1779},[1780,1781,1782],{"id":847,"depth":967,"text":848},{"id":937,"depth":967,"text":188},{"id":1260,"depth":967,"text":1261},{},{"title":157,"description":1392},1780436277741]