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