[{"data":1,"prerenderedAt":1423},["ShallowReactive",2],{"navLinks":3,"sidebar_docs_navigation_\u002Fdocs\u002Fbot-detection":64,"navigation":191,"navLinks_footer":816,"\u002Fdocs\u002Fbot-detection\u002Fdata-sources_page":829,"\u002Fdocs\u002Fbot-detection\u002Fdata-sources_surround":1193,"\u002Fdocs\u002Fbot-detection\u002Fdata-sources":1196},{"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":82,"body":831,"description":1185,"extension":1186,"icon":1187,"meta":1188,"module":1189,"navigation":8,"path":83,"rawbody":1190,"seo":1191,"stem":84,"__hash__":1192},"docs\u002Fdocs\u002Fbot-detection\u002F02.data-sources.md",{"type":832,"value":833,"toc":1176},"minimark",[834,846,852,855,860,863,874,901,909,916,924,927,929,933,936,944,951,959,968,976,991,999,1002,1010,1013,1021,1024,1032,1035,1037,1040,1048,1055,1057,1061,1064,1072,1093,1095,1099,1114,1122,1133,1141,1164],[835,836,837,841,842,845],"p",{},[838,839,840],"code",{},"bot-detector init"," downloads and compiles threat intelligence from multiple public feeds into MMDB and LMDB format. All databases are loaded into memory at startup and queried synchronously during the cheap detection phase. The compiled files are written to ",[838,843,844],{},"_data-sources\u002F"," inside the package directory and reloaded automatically when the files change on disk.",[847,848,849],"note",{},[835,850,851],{},"Full schema documentation for each database record type, including every field returned by each lookup method, is covered in the Shield-base module reference.",[853,854],"hr",{},[856,857,859],"h2",{"id":858},"geo-network","Geo & Network",[835,861,862],{},"These databases resolve IP addresses to geographic and network metadata. The middleware merges results from all three before any checker runs, with city-level data taking precedence where both city and country records exist.",[835,864,865,869,870,873],{},[866,867,868],"strong",{},"ASN"," (",[838,871,872],{},"asn.mmdb",")",[835,875,876,877,884,885,888,889,892,893,896,897,900],{},"Maps IP ranges to Autonomous System Numbers using BGP routing data sourced from ",[878,879,883],"a",{"href":880,"rel":881},"https:\u002F\u002Fbgp.tools",[882],"nofollow","BGP.tools",". Each record includes the ASN identifier, organization name, and a network classification of ",[838,886,887],{},"\"Content\""," (hosting\u002FCDN), ",[838,890,891],{},"\"Eyeballs\""," (residential\u002Fbusiness), or ",[838,894,895],{},"\"Unknown\"",". The classification is the primary signal for the ASN checker and for the ",[838,898,899],{},"ctx.geoData.hosting"," field.",[835,902,903,869,906,873],{},[866,904,905],{},"City",[838,907,908],{},"city.mmdb",[835,910,911,912,915],{},"City-level geolocation built from a merged dataset covering city, region, country, postal code, timezone, coordinates, and locale fields. This database provides the majority of geo fields in ",[838,913,914],{},"ctx.geoData",".",[835,917,918,869,921,873],{},[866,919,920],{},"Country",[838,922,923],{},"country.mmdb",[835,925,926],{},"Country-level geolocation used as a fallback when city-level data is unavailable. Records include country name, ISO code, continent, and top-level domain.",[853,928],{},[856,930,932],{"id":931},"threat-intelligence","Threat Intelligence",[835,934,935],{},"These databases identify IPs with a known history of malicious activity. They are compiled from a combination of public threat feeds and anonymity network lists.",[835,937,938,869,941,873],{},[866,939,940],{},"Proxy",[838,942,943],{},"proxy.mmdb",[835,945,946,947,950],{},"A merged list of known proxy and anonymizer IPs aggregated from multiple public sources. Each record carries a ",[838,948,949],{},"comment"," field listing the source feed names that flagged the IP, which the middleware uses to compute multi-source risk bonuses.",[835,952,953,869,956,873],{},[866,954,955],{},"Tor Relays",[838,957,958],{},"tor.mmdb",[835,960,961,962,967],{},"Built from the ",[878,963,966],{"href":964,"rel":965},"https:\u002F\u002Fmetrics.torproject.org\u002Fonionoo.html",[882],"Onionoo"," dataset. Records include relay type (exit, guard, middle), exit probability, guard probability, version status, and exit policy. Exit nodes carry the highest penalty; guard nodes and running relays carry lower risk.",[835,969,970,869,973,873],{},[866,971,972],{},"FireHOL Anonymous",[838,974,975],{},"firehol_anonymous.mmdb",[835,977,978,983,984,987,988,915],{},[878,979,982],{"href":980,"rel":981},"https:\u002F\u002Fiplists.firehol.org\u002F",[882],"FireHOL's"," anonymity feed covering VPNs, open proxies, and Tor exit nodes that are not already in the Tor database. Matching this database sets ",[838,985,986],{},"ctx.anon"," to ",[838,989,990],{},"true",[835,992,993,869,996,873],{},[866,994,995],{},"FireHOL Level 1",[838,997,998],{},"firehol_l1.mmdb",[835,1000,1001],{},"Active attack sources. FireHOL maintains this list with a strict no-false-positives policy. An IP in level 1 is a confirmed threat.",[835,1003,1004,869,1007,873],{},[866,1005,1006],{},"FireHOL Level 2",[838,1008,1009],{},"firehol_l2.mmdb",[835,1011,1012],{},"Current abuse participants: scanners, brute-force sources, and spam senders. Broader than level 1 and updated frequently.",[835,1014,1015,869,1018,873],{},[866,1016,1017],{},"FireHOL Level 3",[838,1019,1020],{},"firehol_l3.mmdb",[835,1022,1023],{},"Broader web threat aggregation combining multiple web attack, exploit, and scanning lists.",[835,1025,1026,869,1029,873],{},[866,1027,1028],{},"FireHOL Level 4",[838,1030,1031],{},"firehol_l4.mmdb",[835,1033,1034],{},"Extended watch list with more relaxed inclusion criteria. Higher false-positive rate than levels 1–3 but useful as a low-weight signal.",[853,1036],{},[856,1038,585],{"id":1039},"verified-crawlers",[835,1041,1042,869,1045,873],{},[866,1043,1044],{},"Good Bots",[838,1046,1047],{},"goodBots.mmdb",[835,1049,1050,1051,1054],{},"Compiled IP ranges for legitimate search engine and platform crawlers: Googlebot, Bingbot, DuckDuckBot, Yandex, Apple, Meta, and others. When a client IP matches this database, the middleware immediately exempts the request from scoring. The ",[838,1052,1053],{},"enableGoodBotsChecks"," checker triggers DNS verification before granting this exemption.",[853,1056],{},[856,1058,1060],{"id":1059},"behavioral-fingerprinting","Behavioral Fingerprinting",[835,1062,1063],{},"These databases are stored in LMDB format and queried by string key rather than by IP.",[835,1065,1066,869,1069,873],{},[866,1067,1068],{},"User-Agent Patterns",[838,1070,1071],{},"useragent.mdb",[835,1073,1074,1075,1078,1079,1078,1082,1078,1085,1088,1089,1092],{},"An LMDB key-value database mapping known malicious, scraper, and vulnerability scanner User-Agent strings to severity levels (",[838,1076,1077],{},"critical",", ",[838,1080,1081],{},"high",[838,1083,1084],{},"medium",[838,1086,1087],{},"low","). Used by the ",[838,1090,1091],{},"knownBadUserAgents"," checker, which reads each pattern at request time and applies the corresponding penalty weight from your configuration.",[853,1094],{},[856,1096,1098],{"id":1097},"custom-generated","Custom Generated",[835,1100,1101,1102,1105,1106,1109,1110,1113],{},"These two databases do not exist after a fresh ",[838,1103,1104],{},"init",". They are compiled by ",[838,1107,1108],{},"bot-detector generate"," (or programmatically via ",[838,1111,1112],{},"runGeneration()",") from your own visitor history and grow as your application accumulates data.",[835,1115,1116,869,1119,873],{},[866,1117,1118],{},"Banned IPs",[838,1120,1121],{},"banned.mmdb",[835,1123,1124,1125,1128,1129,1132],{},"Built from all rows in your ",[838,1126,1127],{},"banned"," table that have a non-null IP address. Once compiled, previously banned visitors are checked in the cheap phase via ",[838,1130,1131],{},"enableKnownBadIpsCheck",", making repeat offenders extremely fast to reject without re-running the full pipeline.",[835,1134,1135,869,1138,873],{},[866,1136,1137],{},"High Risk IPs",[838,1139,1140],{},"highRisk.mmdb",[835,1142,1143,1144,1147,1148,1151,1152,1155,1156,1159,1160,1163],{},"Built from rows in your ",[838,1145,1146],{},"visitors"," table where ",[838,1149,1150],{},"suspicious_activity_score"," is greater than or equal to ",[838,1153,1154],{},"generator.scoreThreshold"," (default ",[838,1157,1158],{},"70","). IPs in this database receive the ",[838,1161,1162],{},"highRiskPenalty"," in the cheap phase on all future requests.",[1165,1166,1167],"tip",{},[835,1168,1169,1170,1172,1173,1175],{},"Run ",[838,1171,1108],{}," after bulk ban operations and on a regular schedule to keep both custom databases current. The ",[838,1174,1131],{}," checker only reads these databases if they exist, missing files are skipped silently.",{"title":1177,"searchDepth":1178,"depth":1178,"links":1179},"",2,[1180,1181,1182,1183,1184],{"id":858,"depth":1178,"text":859},{"id":931,"depth":1178,"text":932},{"id":1039,"depth":1178,"text":585},{"id":1059,"depth":1178,"text":1060},{"id":1097,"depth":1178,"text":1098},"Overview of every compiled database that bot-detector loads at startup.","md","i-lucide-database",{},null,"---\ntitle: Data Sources\ndescription: Overview of every compiled database that bot-detector loads at startup.\nicon: i-lucide-database\n---\n \n`bot-detector init` downloads and compiles threat intelligence from multiple public feeds into MMDB and LMDB format. All databases are loaded into memory at startup and queried synchronously during the cheap detection phase. The compiled files are written to `_data-sources\u002F` inside the package directory and reloaded automatically when the files change on disk.\n\n::note\nFull schema documentation for each database record type, including every field returned by each lookup method, is covered in the Shield-base module reference.\n::\n\n--- \n   \n## Geo & Network\n\nThese databases resolve IP addresses to geographic and network metadata. The middleware merges results from all three before any checker runs, with city-level data taking precedence where both city and country records exist.\n\n**ASN** (`asn.mmdb`)\n\nMaps IP ranges to Autonomous System Numbers using BGP routing data sourced from [BGP.tools](https:\u002F\u002Fbgp.tools). Each record includes the ASN identifier, organization name, and a network classification of `\"Content\"` (hosting\u002FCDN), `\"Eyeballs\"` (residential\u002Fbusiness), or `\"Unknown\"`. The classification is the primary signal for the ASN checker and for the `ctx.geoData.hosting` field.\n\n**City** (`city.mmdb`)\n\nCity-level geolocation built from a merged dataset covering city, region, country, postal code, timezone, coordinates, and locale fields. This database provides the majority of geo fields in `ctx.geoData`.\n\n**Country** (`country.mmdb`)\n\nCountry-level geolocation used as a fallback when city-level data is unavailable. Records include country name, ISO code, continent, and top-level domain.\n\n---\n\n## Threat Intelligence\n\nThese databases identify IPs with a known history of malicious activity. They are compiled from a combination of public threat feeds and anonymity network lists.\n\n**Proxy** (`proxy.mmdb`)\n\nA merged list of known proxy and anonymizer IPs aggregated from multiple public sources. Each record carries a `comment` field listing the source feed names that flagged the IP, which the middleware uses to compute multi-source risk bonuses.\n\n**Tor Relays** (`tor.mmdb`)\n\nBuilt from the [Onionoo](https:\u002F\u002Fmetrics.torproject.org\u002Fonionoo.html) dataset. Records include relay type (exit, guard, middle), exit probability, guard probability, version status, and exit policy. Exit nodes carry the highest penalty; guard nodes and running relays carry lower risk.\n\n**FireHOL Anonymous** (`firehol_anonymous.mmdb`)\n\n[FireHOL's](https:\u002F\u002Fiplists.firehol.org\u002F) anonymity feed covering VPNs, open proxies, and Tor exit nodes that are not already in the Tor database. Matching this database sets `ctx.anon` to `true`.\n\n**FireHOL Level 1** (`firehol_l1.mmdb`)\n\nActive attack sources. FireHOL maintains this list with a strict no-false-positives policy. An IP in level 1 is a confirmed threat.\n\n**FireHOL Level 2** (`firehol_l2.mmdb`)\n\nCurrent abuse participants: scanners, brute-force sources, and spam senders. Broader than level 1 and updated frequently.\n\n**FireHOL Level 3** (`firehol_l3.mmdb`)\n\nBroader web threat aggregation combining multiple web attack, exploit, and scanning lists.\n\n**FireHOL Level 4** (`firehol_l4.mmdb`)\n\nExtended watch list with more relaxed inclusion criteria. Higher false-positive rate than levels 1–3 but useful as a low-weight signal.\n\n---\n\n## Verified Crawlers\n\n**Good Bots** (`goodBots.mmdb`)\n\nCompiled IP ranges for legitimate search engine and platform crawlers: Googlebot, Bingbot, DuckDuckBot, Yandex, Apple, Meta, and others. When a client IP matches this database, the middleware immediately exempts the request from scoring. The `enableGoodBotsChecks` checker triggers DNS verification before granting this exemption.\n\n---\n\n## Behavioral Fingerprinting\n\nThese databases are stored in LMDB format and queried by string key rather than by IP.\n\n**User-Agent Patterns** (`useragent.mdb`)\n\nAn LMDB key-value database mapping known malicious, scraper, and vulnerability scanner User-Agent strings to severity levels (`critical`, `high`, `medium`, `low`). Used by the `knownBadUserAgents` checker, which reads each pattern at request time and applies the corresponding penalty weight from your configuration.\n\n---\n  \n## Custom Generated\n\nThese two databases do not exist after a fresh `init`. They are compiled by `bot-detector generate` (or programmatically via `runGeneration()`) from your own visitor history and grow as your application accumulates data.\n\n**Banned IPs** (`banned.mmdb`)\n\nBuilt from all rows in your `banned` table that have a non-null IP address. Once compiled, previously banned visitors are checked in the cheap phase via `enableKnownBadIpsCheck`, making repeat offenders extremely fast to reject without re-running the full pipeline.\n\n**High Risk IPs** (`highRisk.mmdb`)\n\nBuilt from rows in your `visitors` table where `suspicious_activity_score` is greater than or equal to `generator.scoreThreshold` (default `70`). IPs in this database receive the `highRiskPenalty` in the cheap phase on all future requests.\n\n::tip\nRun `bot-detector generate` after bulk ban operations and on a regular schedule to keep both custom databases current. The `enableKnownBadIpsCheck` checker only reads these databases if they exist, missing files are skipped silently.\n::\n ",{"title":82,"description":1185},"PbuGZ-nMJZVi3cKXRW89DrGzZbJu7QJo_sZ_A1Ls-mI",[1194,1195],{"title":78,"path":79,"stem":80,"children":-1},{"title":91,"path":92,"stem":93,"children":-1},{"id":830,"title":82,"body":1197,"description":1185,"extension":1186,"icon":1187,"meta":1421,"module":1189,"navigation":8,"path":83,"rawbody":1190,"seo":1422,"stem":84,"__hash__":1192},{"type":832,"value":1198,"toc":1414},[1199,1205,1209,1211,1213,1215,1221,1234,1240,1244,1250,1252,1254,1256,1258,1264,1268,1274,1279,1285,1294,1300,1302,1308,1310,1316,1318,1324,1326,1328,1330,1336,1340,1342,1344,1346,1352,1364,1366,1368,1376,1382,1388,1394,1406],[835,1200,1201,841,1203,845],{},[838,1202,840],{},[838,1204,844],{},[847,1206,1207],{},[835,1208,851],{},[853,1210],{},[856,1212,859],{"id":858},[835,1214,862],{},[835,1216,1217,869,1219,873],{},[866,1218,868],{},[838,1220,872],{},[835,1222,876,1223,884,1226,888,1228,892,1230,896,1232,900],{},[878,1224,883],{"href":880,"rel":1225},[882],[838,1227,887],{},[838,1229,891],{},[838,1231,895],{},[838,1233,899],{},[835,1235,1236,869,1238,873],{},[866,1237,905],{},[838,1239,908],{},[835,1241,911,1242,915],{},[838,1243,914],{},[835,1245,1246,869,1248,873],{},[866,1247,920],{},[838,1249,923],{},[835,1251,926],{},[853,1253],{},[856,1255,932],{"id":931},[835,1257,935],{},[835,1259,1260,869,1262,873],{},[866,1261,940],{},[838,1263,943],{},[835,1265,946,1266,950],{},[838,1267,949],{},[835,1269,1270,869,1272,873],{},[866,1271,955],{},[838,1273,958],{},[835,1275,961,1276,967],{},[878,1277,966],{"href":964,"rel":1278},[882],[835,1280,1281,869,1283,873],{},[866,1282,972],{},[838,1284,975],{},[835,1286,1287,983,1290,987,1292,915],{},[878,1288,982],{"href":980,"rel":1289},[882],[838,1291,986],{},[838,1293,990],{},[835,1295,1296,869,1298,873],{},[866,1297,995],{},[838,1299,998],{},[835,1301,1001],{},[835,1303,1304,869,1306,873],{},[866,1305,1006],{},[838,1307,1009],{},[835,1309,1012],{},[835,1311,1312,869,1314,873],{},[866,1313,1017],{},[838,1315,1020],{},[835,1317,1023],{},[835,1319,1320,869,1322,873],{},[866,1321,1028],{},[838,1323,1031],{},[835,1325,1034],{},[853,1327],{},[856,1329,585],{"id":1039},[835,1331,1332,869,1334,873],{},[866,1333,1044],{},[838,1335,1047],{},[835,1337,1050,1338,1054],{},[838,1339,1053],{},[853,1341],{},[856,1343,1060],{"id":1059},[835,1345,1063],{},[835,1347,1348,869,1350,873],{},[866,1349,1068],{},[838,1351,1071],{},[835,1353,1074,1354,1078,1356,1078,1358,1078,1360,1088,1362,1092],{},[838,1355,1077],{},[838,1357,1081],{},[838,1359,1084],{},[838,1361,1087],{},[838,1363,1091],{},[853,1365],{},[856,1367,1098],{"id":1097},[835,1369,1101,1370,1105,1372,1109,1374,1113],{},[838,1371,1104],{},[838,1373,1108],{},[838,1375,1112],{},[835,1377,1378,869,1380,873],{},[866,1379,1118],{},[838,1381,1121],{},[835,1383,1124,1384,1128,1386,1132],{},[838,1385,1127],{},[838,1387,1131],{},[835,1389,1390,869,1392,873],{},[866,1391,1137],{},[838,1393,1140],{},[835,1395,1143,1396,1147,1398,1151,1400,1155,1402,1159,1404,1163],{},[838,1397,1146],{},[838,1399,1150],{},[838,1401,1154],{},[838,1403,1158],{},[838,1405,1162],{},[1165,1407,1408],{},[835,1409,1169,1410,1172,1412,1175],{},[838,1411,1108],{},[838,1413,1131],{},{"title":1177,"searchDepth":1178,"depth":1178,"links":1415},[1416,1417,1418,1419,1420],{"id":858,"depth":1178,"text":859},{"id":931,"depth":1178,"text":932},{"id":1039,"depth":1178,"text":585},{"id":1059,"depth":1178,"text":1060},{"id":1097,"depth":1178,"text":1098},{},{"title":82,"description":1185},1780436274348]