[{"data":1,"prerenderedAt":2704},["ShallowReactive",2],{"navLinks":3,"sidebar_docs_navigation_\u002Fdocs\u002Fiam":64,"navigation":257,"navLinks_footer":837,"\u002Fdocs\u002Fiam\u002Fessentials\u002Fapi\u002Frate-limiting_page":850,"\u002Fdocs\u002Fiam\u002Fessentials\u002Fapi\u002Frate-limiting_surround":1920,"\u002Fdocs\u002Fiam\u002Fessentials\u002Fapi\u002Frate-limiting":1923},{"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":27,"path":29,"stem":70,"children":71},"docs\u002Fiam\u002Findex",[72,73,76,216,219,236,240],{"title":27,"path":29,"stem":70},{"title":14,"path":74,"stem":75},"\u002Fdocs\u002Fiam\u002Fgetting-started","docs\u002Fiam\u002F00.getting-started",{"title":77,"path":78,"stem":79,"children":80},"Essentials","\u002Fdocs\u002Fiam\u002Fessentials","docs\u002Fiam\u002F01.essentials\u002Findex",[81,82,86,90,94,98,102,106,110,114,118,122,126,130,134,138,142,146,150,154,158,162,166],{"title":77,"path":78,"stem":79},{"title":83,"path":84,"stem":85},"Tokens","\u002Fdocs\u002Fiam\u002Fessentials\u002Ftokens","docs\u002Fiam\u002F01.essentials\u002F00.tokens",{"title":87,"path":88,"stem":89},"Access Tokens","\u002Fdocs\u002Fiam\u002Fessentials\u002Faccess-tokens","docs\u002Fiam\u002F01.essentials\u002F01.access-tokens",{"title":91,"path":92,"stem":93},"Refresh Tokens","\u002Fdocs\u002Fiam\u002Fessentials\u002Frefresh-tokens","docs\u002Fiam\u002F01.essentials\u002F02.refresh-tokens",{"title":95,"path":96,"stem":97},"Anomaly Detection","\u002Fdocs\u002Fiam\u002Fessentials\u002Fanomalies","docs\u002Fiam\u002F01.essentials\u002F03.anomalies",{"title":99,"path":100,"stem":101},"Signup","\u002Fdocs\u002Fiam\u002Fessentials\u002Fsignup","docs\u002Fiam\u002F01.essentials\u002F04.signup",{"title":103,"path":104,"stem":105},"Login","\u002Fdocs\u002Fiam\u002Fessentials\u002Flogin","docs\u002Fiam\u002F01.essentials\u002F05.login",{"title":107,"path":108,"stem":109},"Logout","\u002Fdocs\u002Fiam\u002Fessentials\u002Flogout","docs\u002Fiam\u002F01.essentials\u002F06.logout",{"title":111,"path":112,"stem":113},"OAuth","\u002Fdocs\u002Fiam\u002Fessentials\u002Foauth","docs\u002Fiam\u002F01.essentials\u002F07.oauth",{"title":115,"path":116,"stem":117},"Magic Links","\u002Fdocs\u002Fiam\u002Fessentials\u002Fmagic-links","docs\u002Fiam\u002F01.essentials\u002F08.magic-links",{"title":119,"path":120,"stem":121},"Emails","\u002Fdocs\u002Fiam\u002Fessentials\u002Femails","docs\u002Fiam\u002F01.essentials\u002F09.emails",{"title":123,"path":124,"stem":125},"MFA","\u002Fdocs\u002Fiam\u002Fessentials\u002Fmfa","docs\u002Fiam\u002F01.essentials\u002F10.mfa",{"title":127,"path":128,"stem":129},"Fingerprinting","\u002Fdocs\u002Fiam\u002Fessentials\u002Ffingerprinting","docs\u002Fiam\u002F01.essentials\u002F11.fingerprinting",{"title":131,"path":132,"stem":133},"Backend for Frontend","\u002Fdocs\u002Fiam\u002Fessentials\u002Fbff","docs\u002Fiam\u002F01.essentials\u002F12.bff",{"title":135,"path":136,"stem":137},"HMAC Authentication","\u002Fdocs\u002Fiam\u002Fessentials\u002Fhmac","docs\u002Fiam\u002F01.essentials\u002F13.hmac",{"title":139,"path":140,"stem":141},"XSS Protection","\u002Fdocs\u002Fiam\u002Fessentials\u002Fxss","docs\u002Fiam\u002F01.essentials\u002F14.xss",{"title":143,"path":144,"stem":145},"Logging","\u002Fdocs\u002Fiam\u002Fessentials\u002Flogging","docs\u002Fiam\u002F01.essentials\u002F15.logging",{"title":147,"path":148,"stem":149},"Rate Limiting","\u002Fdocs\u002Fiam\u002Fessentials\u002Frate-limiting","docs\u002Fiam\u002F01.essentials\u002F16.rate-limiting",{"title":151,"path":152,"stem":153},"Database","\u002Fdocs\u002Fiam\u002Fessentials\u002Fdatabase","docs\u002Fiam\u002F01.essentials\u002F17.database",{"title":155,"path":156,"stem":157},"Cookies","\u002Fdocs\u002Fiam\u002Fessentials\u002Fcookies","docs\u002Fiam\u002F01.essentials\u002F18.cookies",{"title":159,"path":160,"stem":161},"Service Startup","\u002Fdocs\u002Fiam\u002Fessentials\u002Fservice","docs\u002Fiam\u002F01.essentials\u002F19.service",{"title":163,"path":164,"stem":165},"Password Reset","\u002Fdocs\u002Fiam\u002Fessentials\u002Fpassword-reset","docs\u002Fiam\u002F01.essentials\u002F20.password-reset",{"title":167,"path":168,"stem":169,"children":170},"API Tokens","\u002Fdocs\u002Fiam\u002Fessentials\u002Fapi","docs\u002Fiam\u002F01.essentials\u002F21.api\u002Findex",[171,172,176,180,210,213],{"title":167,"path":168,"stem":169},{"title":173,"path":174,"stem":175},"Creating Tokens","\u002Fdocs\u002Fiam\u002Fessentials\u002Fapi\u002Fcreation","docs\u002Fiam\u002F01.essentials\u002F21.api\u002F00.creation",{"title":177,"path":178,"stem":179},"Verifying Tokens","\u002Fdocs\u002Fiam\u002Fessentials\u002Fapi\u002Fverification","docs\u002Fiam\u002F01.essentials\u002F21.api\u002F01.verification",{"title":181,"path":182,"stem":183,"children":184},"Manage Tokens","\u002Fdocs\u002Fiam\u002Fessentials\u002Fapi\u002Fmanagement","docs\u002Fiam\u002F01.essentials\u002F21.api\u002F02.management\u002Findex",[185,186,190,194,198,202,206],{"title":181,"path":182,"stem":183},{"title":187,"path":188,"stem":189},"Privileges","\u002Fdocs\u002Fiam\u002Fessentials\u002Fapi\u002Fmanagement\u002Fprivilege","docs\u002Fiam\u002F01.essentials\u002F21.api\u002F02.management\u002F00.privilege",{"title":191,"path":192,"stem":193},"Revocation","\u002Fdocs\u002Fiam\u002Fessentials\u002Fapi\u002Fmanagement\u002Frevocation","docs\u002Fiam\u002F01.essentials\u002F21.api\u002F02.management\u002F01.revocation",{"title":195,"path":196,"stem":197},"Rotation","\u002Fdocs\u002Fiam\u002Fessentials\u002Fapi\u002Fmanagement\u002Frotation","docs\u002Fiam\u002F01.essentials\u002F21.api\u002F02.management\u002F02.rotation",{"title":199,"path":200,"stem":201},"IP Restriction","\u002Fdocs\u002Fiam\u002Fessentials\u002Fapi\u002Fmanagement\u002Fip-updates","docs\u002Fiam\u002F01.essentials\u002F21.api\u002F02.management\u002F03.ip-updates",{"title":203,"path":204,"stem":205},"Metadata","\u002Fdocs\u002Fiam\u002Fessentials\u002Fapi\u002Fmanagement\u002Fmetadata","docs\u002Fiam\u002F01.essentials\u002F21.api\u002F02.management\u002F04.metadata",{"title":207,"path":208,"stem":209},"Token Listing","\u002Fdocs\u002Fiam\u002Fessentials\u002Fapi\u002Fmanagement\u002Flist","docs\u002Fiam\u002F01.essentials\u002F21.api\u002F02.management\u002F05.list",{"title":147,"path":211,"stem":212},"\u002Fdocs\u002Fiam\u002Fessentials\u002Fapi\u002Frate-limiting","docs\u002Fiam\u002F01.essentials\u002F21.api\u002F03.rate-limiting",{"title":38,"path":214,"stem":215},"\u002Fdocs\u002Fiam\u002Fessentials\u002Fapi\u002Fsecurity","docs\u002Fiam\u002F01.essentials\u002F21.api\u002F04.security",{"title":38,"path":217,"stem":218},"\u002Fdocs\u002Fiam\u002Fsecurity","docs\u002Fiam\u002F02.security",{"title":220,"path":221,"stem":222,"children":223,"page":53},"Guides","\u002Fdocs\u002Fiam\u002Fguides","docs\u002Fiam\u002F03.guides",[224,228,232],{"title":225,"path":226,"stem":227},"Deployment","\u002Fdocs\u002Fiam\u002Fguides\u002Fdeployment","docs\u002Fiam\u002F03.guides\u002Fdeployment",{"title":229,"path":230,"stem":231},"Operation Scripts","\u002Fdocs\u002Fiam\u002Fguides\u002Foperation-scripts","docs\u002Fiam\u002F03.guides\u002Foperation-scripts",{"title":233,"path":234,"stem":235},"Role-Based Access Control","\u002Fdocs\u002Fiam\u002Fguides\u002Frbac","docs\u002Fiam\u002F03.guides\u002Frbac",{"title":237,"path":238,"stem":239},"Configuration","\u002Fdocs\u002Fiam\u002Fconfiguration","docs\u002Fiam\u002F04.configuration",{"title":241,"path":242,"stem":243,"children":244,"page":53},"Api","\u002Fdocs\u002Fiam\u002Fapi","docs\u002Fiam\u002F05.API",[245,249,253],{"title":246,"path":247,"stem":248},"API Reference","\u002Fdocs\u002Fiam\u002Fapi\u002Fapi","docs\u002Fiam\u002F05.API\u002F00.api",{"title":250,"path":251,"stem":252},"Middleware Reference","\u002Fdocs\u002Fiam\u002Fapi\u002Fmiddlewares","docs\u002Fiam\u002F05.API\u002F02.middlewares",{"title":254,"path":255,"stem":256},"Routes Reference","\u002Fdocs\u002Fiam\u002Fapi\u002Froutes","docs\u002Fiam\u002F05.API\u002F03.routes",[258],{"title":9,"path":66,"stem":67,"children":259,"page":53},[260,398,516,521,577,644],{"title":20,"path":22,"stem":261,"children":262},"docs\u002Fauth-h3client\u002Findex",[263,264,273,307,331,353,356,376,379],{"title":20,"path":22,"stem":261},{"title":14,"path":265,"stem":266,"children":267},"\u002Fdocs\u002Fauth-h3client\u002Fgetting-started","docs\u002Fauth-h3client\u002F00.getting-started\u002Findex",[268,269],{"title":14,"path":265,"stem":266},{"title":270,"path":271,"stem":272},"Nuxt Module","\u002Fdocs\u002Fauth-h3client\u002Fgetting-started\u002Fnuxt","docs\u002Fauth-h3client\u002F00.getting-started\u002F00.nuxt",{"title":77,"path":274,"stem":275,"children":276},"\u002Fdocs\u002Fauth-h3client\u002Fessentials","docs\u002Fauth-h3client\u002F01.essentials\u002Findex",[277,278,282,286,290,294,298,301,304],{"title":77,"path":274,"stem":275},{"title":279,"path":280,"stem":281},"Session Management","\u002Fdocs\u002Fauth-h3client\u002Fessentials\u002Fsession","docs\u002Fauth-h3client\u002F01.essentials\u002F00.session",{"title":283,"path":284,"stem":285},"Route Protection","\u002Fdocs\u002Fauth-h3client\u002Fessentials\u002Froute-protection","docs\u002Fauth-h3client\u002F01.essentials\u002F01.route-protection",{"title":287,"path":288,"stem":289},"CSRF Protection","\u002Fdocs\u002Fauth-h3client\u002Fessentials\u002Fcsrf","docs\u002Fauth-h3client\u002F01.essentials\u002F02.csrf",{"title":291,"path":292,"stem":293},"Auth Flows","\u002Fdocs\u002Fauth-h3client\u002Fessentials\u002Fauth-flows","docs\u002Fauth-h3client\u002F01.essentials\u002F03.auth-flows",{"title":295,"path":296,"stem":297},"OAuth and OIDC","\u002Fdocs\u002Fauth-h3client\u002Fessentials\u002Foauth","docs\u002Fauth-h3client\u002F01.essentials\u002F04.oauth",{"title":33,"path":299,"stem":300},"\u002Fdocs\u002Fauth-h3client\u002Fessentials\u002Fbot-detection","docs\u002Fauth-h3client\u002F01.essentials\u002F05.bot-detection",{"title":155,"path":302,"stem":303},"\u002Fdocs\u002Fauth-h3client\u002Fessentials\u002Fcookies","docs\u002Fauth-h3client\u002F01.essentials\u002F06.cookies",{"title":143,"path":305,"stem":306},"\u002Fdocs\u002Fauth-h3client\u002Fessentials\u002Flogging","docs\u002Fauth-h3client\u002F01.essentials\u002F07.logging",{"title":123,"path":308,"stem":309,"children":310},"\u002Fdocs\u002Fauth-h3client\u002Fmfa","docs\u002Fauth-h3client\u002F02.mfa\u002Findex",[311,312,316,319,323,327],{"title":123,"path":308,"stem":309},{"title":313,"path":314,"stem":315},"Built-in MFA","\u002Fdocs\u002Fauth-h3client\u002Fmfa\u002Fbuilt-in-flow","docs\u002Fauth-h3client\u002F02.mfa\u002F01.built-in-flow",{"title":163,"path":317,"stem":318},"\u002Fdocs\u002Fauth-h3client\u002Fmfa\u002Fpassword-reset","docs\u002Fauth-h3client\u002F02.mfa\u002F02.password-reset",{"title":320,"path":321,"stem":322},"Email Change","\u002Fdocs\u002Fauth-h3client\u002Fmfa\u002Femail-change","docs\u002Fauth-h3client\u002F02.mfa\u002F03.email-change",{"title":324,"path":325,"stem":326},"Custom MFA Flow","\u002Fdocs\u002Fauth-h3client\u002Fmfa\u002Fcustom-flow","docs\u002Fauth-h3client\u002F02.mfa\u002F04.custom-flow",{"title":328,"path":329,"stem":330},"Client-Side MFA","\u002Fdocs\u002Fauth-h3client\u002Fmfa\u002Fclient-side","docs\u002Fauth-h3client\u002F02.mfa\u002F05.client-side",{"title":332,"path":333,"stem":334,"children":335},"Client-side","\u002Fdocs\u002Fauth-h3client\u002Fclient","docs\u002Fauth-h3client\u002F03.client\u002Findex",[336,337,341,345,349],{"title":332,"path":333,"stem":334},{"title":338,"path":339,"stem":340},"useAuthData","\u002Fdocs\u002Fauth-h3client\u002Fclient\u002Fuse-auth-data","docs\u002Fauth-h3client\u002F03.client\u002F00.use-auth-data",{"title":342,"path":343,"stem":344},"useMagicLink","\u002Fdocs\u002Fauth-h3client\u002Fclient\u002Fuse-magic-link","docs\u002Fauth-h3client\u002F03.client\u002F01.use-magic-link",{"title":346,"path":347,"stem":348},"executeRequest","\u002Fdocs\u002Fauth-h3client\u002Fclient\u002Fexecute-request","docs\u002Fauth-h3client\u002F03.client\u002F02.execute-request",{"title":350,"path":351,"stem":352},"getCsrfToken","\u002Fdocs\u002Fauth-h3client\u002Fclient\u002Fget-csrf-token","docs\u002Fauth-h3client\u002F03.client\u002F03.get-csrf-token",{"title":38,"path":354,"stem":355},"\u002Fdocs\u002Fauth-h3client\u002Fsecurity","docs\u002Fauth-h3client\u002F04.security",{"title":220,"path":357,"stem":358,"children":359,"page":53},"\u002Fdocs\u002Fauth-h3client\u002Fguides","docs\u002Fauth-h3client\u002F05.guides",[360,364,368,372],{"title":361,"path":362,"stem":363},"H3 and Nitro Setup","\u002Fdocs\u002Fauth-h3client\u002Fguides\u002Fh3-nitro","docs\u002Fauth-h3client\u002F05.guides\u002F00.h3-nitro",{"title":365,"path":366,"stem":367},"HMAC Inter-service Auth","\u002Fdocs\u002Fauth-h3client\u002Fguides\u002Fhmac","docs\u002Fauth-h3client\u002F05.guides\u002Fhmac",{"title":369,"path":370,"stem":371},"Image Upload","\u002Fdocs\u002Fauth-h3client\u002Fguides\u002Fimage-upload","docs\u002Fauth-h3client\u002F05.guides\u002Fimage-upload",{"title":373,"path":374,"stem":375},"mTLS Configuration","\u002Fdocs\u002Fauth-h3client\u002Fguides\u002Fmtls","docs\u002Fauth-h3client\u002F05.guides\u002Fmtls",{"title":237,"path":377,"stem":378},"\u002Fdocs\u002Fauth-h3client\u002Fconfiguration","docs\u002Fauth-h3client\u002F06.configuration",{"title":246,"path":380,"stem":381,"children":382},"\u002Fdocs\u002Fauth-h3client\u002Fapi","docs\u002Fauth-h3client\u002F07.api\u002Findex",[383,384,387,390,394],{"title":246,"path":380,"stem":381},{"title":254,"path":385,"stem":386},"\u002Fdocs\u002Fauth-h3client\u002Fapi\u002Fcontrollers","docs\u002Fauth-h3client\u002F07.api\u002F00.controllers",{"title":250,"path":388,"stem":389},"\u002Fdocs\u002Fauth-h3client\u002Fapi\u002Fmiddleware","docs\u002Fauth-h3client\u002F07.api\u002F01.middleware",{"title":391,"path":392,"stem":393},"Client-side Reference","\u002Fdocs\u002Fauth-h3client\u002Fapi\u002Fcomposables","docs\u002Fauth-h3client\u002F07.api\u002F02.composables",{"title":395,"path":396,"stem":397},"Utilities","\u002Fdocs\u002Fauth-h3client\u002Fapi\u002Futilities","docs\u002Fauth-h3client\u002F07.api\u002F03.utilities",{"title":399,"path":35,"stem":400,"children":401},"Bot Detector","docs\u002Fbot-detection\u002Findex",[402,403,406,410,414,433,507,510,513],{"title":399,"path":35,"stem":400},{"title":14,"path":404,"stem":405},"\u002Fdocs\u002Fbot-detection\u002Fgetting-started","docs\u002Fbot-detection\u002F00.getting-started",{"title":407,"path":408,"stem":409},"CLI","\u002Fdocs\u002Fbot-detection\u002Fcli","docs\u002Fbot-detection\u002F01.cli",{"title":411,"path":412,"stem":413},"Data Sources","\u002Fdocs\u002Fbot-detection\u002Fdata-sources","docs\u002Fbot-detection\u002F02.data-sources",{"title":220,"path":415,"stem":416,"children":417,"page":53},"\u002Fdocs\u002Fbot-detection\u002Fguides","docs\u002Fbot-detection\u002F03.guides",[418,422,426,429],{"title":419,"path":420,"stem":421},"Custom Checkers","\u002Fdocs\u002Fbot-detection\u002Fguides\u002Fcustom","docs\u002Fbot-detection\u002F03.guides\u002FCUSTOM",{"title":423,"path":424,"stem":425},"Scheduling Database Generation","\u002Fdocs\u002Fbot-detection\u002Fguides\u002Fgenerate","docs\u002Fbot-detection\u002F03.guides\u002FGENERATE",{"title":143,"path":427,"stem":428},"\u002Fdocs\u002Fbot-detection\u002Fguides\u002Flogging","docs\u002Fbot-detection\u002F03.guides\u002FLOGGING",{"title":430,"path":431,"stem":432},"Score Modes and Reputation Healing","\u002Fdocs\u002Fbot-detection\u002Fguides\u002Fscore","docs\u002Fbot-detection\u002F03.guides\u002FSCORE",{"title":434,"path":435,"stem":436,"children":437},"Checkers","\u002Fdocs\u002Fbot-detection\u002Fcheckers","docs\u002Fbot-detection\u002F04.checkers\u002Findex",[438,439,443,447,451,455,459,463,467,471,475,479,483,487,491,495,499,503],{"title":434,"path":435,"stem":436},{"title":440,"path":441,"stem":442},"IP Validation","\u002Fdocs\u002Fbot-detection\u002Fcheckers\u002Fip-validation","docs\u002Fbot-detection\u002F04.checkers\u002F01.ip-validation",{"title":444,"path":445,"stem":446},"Good \u002F Bad Bot Verification","\u002Fdocs\u002Fbot-detection\u002Fcheckers\u002Fgood-bots","docs\u002Fbot-detection\u002F04.checkers\u002F02.good-bots",{"title":448,"path":449,"stem":450},"Browser & Device Fingerprint","\u002Fdocs\u002Fbot-detection\u002Fcheckers\u002Fbrowser-device","docs\u002Fbot-detection\u002F04.checkers\u002F03.browser-device",{"title":452,"path":453,"stem":454},"Locale Map","\u002Fdocs\u002Fbot-detection\u002Fcheckers\u002Flocale-map","docs\u002Fbot-detection\u002F04.checkers\u002F04.locale-map",{"title":456,"path":457,"stem":458},"Known Threats","\u002Fdocs\u002Fbot-detection\u002Fcheckers\u002Fknown-threats","docs\u002Fbot-detection\u002F04.checkers\u002F05.known-threats",{"title":460,"path":461,"stem":462},"ASN Classification","\u002Fdocs\u002Fbot-detection\u002Fcheckers\u002Fasn-classification","docs\u002Fbot-detection\u002F04.checkers\u002F06.asn-classification",{"title":464,"path":465,"stem":466},"Tor Analysis","\u002Fdocs\u002Fbot-detection\u002Fcheckers\u002Ftor-analysis","docs\u002Fbot-detection\u002F04.checkers\u002F07.tor-analysis",{"title":468,"path":469,"stem":470},"Timezone Consistency","\u002Fdocs\u002Fbot-detection\u002Fcheckers\u002Ftimezone-consistency","docs\u002Fbot-detection\u002F04.checkers\u002F08.timezone-consistency",{"title":472,"path":473,"stem":474},"Honeypot","\u002Fdocs\u002Fbot-detection\u002Fcheckers\u002Fhoneypot","docs\u002Fbot-detection\u002F04.checkers\u002F09.honeypot",{"title":476,"path":477,"stem":478},"Known Bad IPs","\u002Fdocs\u002Fbot-detection\u002Fcheckers\u002Fknown-bad-ips","docs\u002Fbot-detection\u002F04.checkers\u002F10.known-bad-ips",{"title":480,"path":481,"stem":482},"Behavior Rate","\u002Fdocs\u002Fbot-detection\u002Fcheckers\u002Fbehavior-rate","docs\u002Fbot-detection\u002F04.checkers\u002F11.behavior-rate",{"title":484,"path":485,"stem":486},"Proxy \u002F ISP \u002F Cookie","\u002Fdocs\u002Fbot-detection\u002Fcheckers\u002Fproxy-isp-cookies","docs\u002Fbot-detection\u002F04.checkers\u002F12.proxy-isp-cookies",{"title":488,"path":489,"stem":490},"Session Coherence","\u002Fdocs\u002Fbot-detection\u002Fcheckers\u002Fsession-coherence","docs\u002Fbot-detection\u002F04.checkers\u002F13.session-coherence",{"title":492,"path":493,"stem":494},"Velocity Fingerprint","\u002Fdocs\u002Fbot-detection\u002Fcheckers\u002Fvelocity-fingerprint","docs\u002Fbot-detection\u002F04.checkers\u002F14.velocity-fingerprint",{"title":496,"path":497,"stem":498},"UA & Header Analysis","\u002Fdocs\u002Fbot-detection\u002Fcheckers\u002Fua-header","docs\u002Fbot-detection\u002F04.checkers\u002F15.ua-header",{"title":500,"path":501,"stem":502},"Geolocation","\u002Fdocs\u002Fbot-detection\u002Fcheckers\u002Fgeolocation","docs\u002Fbot-detection\u002F04.checkers\u002F16.geolocation",{"title":504,"path":505,"stem":506},"Known Bad User-Agents","\u002Fdocs\u002Fbot-detection\u002Fcheckers\u002Fknown-bad-ua","docs\u002Fbot-detection\u002F04.checkers\u002F17.known-bad-ua",{"title":38,"path":508,"stem":509},"\u002Fdocs\u002Fbot-detection\u002Fsecurity","docs\u002Fbot-detection\u002F04.security",{"title":246,"path":511,"stem":512},"\u002Fdocs\u002Fbot-detection\u002Fapi","docs\u002Fbot-detection\u002F05.api",{"title":237,"path":514,"stem":515},"\u002Fdocs\u002Fbot-detection\u002Fconfiguration","docs\u002Fbot-detection\u002F06.configuration",{"title":517,"path":11,"stem":518,"children":519},"Introduction","docs\u002Fgetting-started\u002Findex",[520],{"title":517,"path":11,"stem":518},{"title":27,"path":29,"stem":70,"children":522},[523,524,525,565,566,571,572],{"title":27,"path":29,"stem":70},{"title":14,"path":74,"stem":75},{"title":77,"path":78,"stem":79,"children":526},[527,528,529,530,531,532,533,534,535,536,537,538,539,540,541,542,543,544,545,546,547,548,549],{"title":77,"path":78,"stem":79},{"title":83,"path":84,"stem":85},{"title":87,"path":88,"stem":89},{"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},{"title":111,"path":112,"stem":113},{"title":115,"path":116,"stem":117},{"title":119,"path":120,"stem":121},{"title":123,"path":124,"stem":125},{"title":127,"path":128,"stem":129},{"title":131,"path":132,"stem":133},{"title":135,"path":136,"stem":137},{"title":139,"path":140,"stem":141},{"title":143,"path":144,"stem":145},{"title":147,"path":148,"stem":149},{"title":151,"path":152,"stem":153},{"title":155,"path":156,"stem":157},{"title":159,"path":160,"stem":161},{"title":163,"path":164,"stem":165},{"title":167,"path":168,"stem":169,"children":550},[551,552,553,554,563,564],{"title":167,"path":168,"stem":169},{"title":173,"path":174,"stem":175},{"title":177,"path":178,"stem":179},{"title":181,"path":182,"stem":183,"children":555},[556,557,558,559,560,561,562],{"title":181,"path":182,"stem":183},{"title":187,"path":188,"stem":189},{"title":191,"path":192,"stem":193},{"title":195,"path":196,"stem":197},{"title":199,"path":200,"stem":201},{"title":203,"path":204,"stem":205},{"title":207,"path":208,"stem":209},{"title":147,"path":211,"stem":212},{"title":38,"path":214,"stem":215},{"title":38,"path":217,"stem":218},{"title":220,"path":221,"stem":222,"children":567,"page":53},[568,569,570],{"title":225,"path":226,"stem":227},{"title":229,"path":230,"stem":231},{"title":233,"path":234,"stem":235},{"title":237,"path":238,"stem":239},{"title":241,"path":242,"stem":243,"children":573,"page":53},[574,575,576],{"title":246,"path":247,"stem":248},{"title":250,"path":251,"stem":252},{"title":254,"path":255,"stem":256},{"title":40,"path":42,"stem":578,"children":579},"docs\u002Fshield-base\u002Findex",[580,581,584,588,629,633,637,641],{"title":40,"path":42,"stem":578},{"title":14,"path":582,"stem":583},"\u002Fdocs\u002Fshield-base\u002Fgetting-started","docs\u002Fshield-base\u002F00.getting-started",{"title":585,"path":586,"stem":587},"CLI Reference","\u002Fdocs\u002Fshield-base\u002Fcli","docs\u002Fshield-base\u002F01.cli",{"title":411,"path":589,"stem":590,"children":591},"\u002Fdocs\u002Fshield-base\u002Fdata-sources","docs\u002Fshield-base\u002F02.data-sources\u002Findex",[592,593,597,601,605,609,613,617,621,625],{"title":411,"path":589,"stem":590},{"title":594,"path":595,"stem":596},"BGP \u002F ASN","\u002Fdocs\u002Fshield-base\u002Fdata-sources\u002Fbgp","docs\u002Fshield-base\u002F02.data-sources\u002Fbgp",{"title":598,"path":599,"stem":600},"City Geolocation","\u002Fdocs\u002Fshield-base\u002Fdata-sources\u002Fcity","docs\u002Fshield-base\u002F02.data-sources\u002Fcity",{"title":602,"path":603,"stem":604},"Country Geolocation","\u002Fdocs\u002Fshield-base\u002Fdata-sources\u002Fcountry","docs\u002Fshield-base\u002F02.data-sources\u002Fcountry",{"title":606,"path":607,"stem":608},"Verified Crawlers","\u002Fdocs\u002Fshield-base\u002Fdata-sources\u002Fcrawlers","docs\u002Fshield-base\u002F02.data-sources\u002Fcrawlers",{"title":610,"path":611,"stem":612},"Disposable Emails","\u002Fdocs\u002Fshield-base\u002Fdata-sources\u002Femail","docs\u002Fshield-base\u002F02.data-sources\u002Femail",{"title":614,"path":615,"stem":616},"FireHOL Threat Intelligence","\u002Fdocs\u002Fshield-base\u002Fdata-sources\u002Ffirehol","docs\u002Fshield-base\u002F02.data-sources\u002Ffirehol",{"title":618,"path":619,"stem":620},"Proxy Detection","\u002Fdocs\u002Fshield-base\u002Fdata-sources\u002Fproxy","docs\u002Fshield-base\u002F02.data-sources\u002Fproxy",{"title":622,"path":623,"stem":624},"Tor Nodes","\u002Fdocs\u002Fshield-base\u002Fdata-sources\u002Ftor","docs\u002Fshield-base\u002F02.data-sources\u002Ftor",{"title":626,"path":627,"stem":628},"Suspicious User-Agents","\u002Fdocs\u002Fshield-base\u002Fdata-sources\u002Fuseragent","docs\u002Fshield-base\u002F02.data-sources\u002Fuseragent",{"title":630,"path":631,"stem":632},"Programmatic Usage","\u002Fdocs\u002Fshield-base\u002Fusage","docs\u002Fshield-base\u002F03.usage",{"title":634,"path":635,"stem":636},"Custom Data Sources","\u002Fdocs\u002Fshield-base\u002Fcustom-data-sources","docs\u002Fshield-base\u002F04.custom-data-sources",{"title":638,"path":639,"stem":640},"TypeScript Types","\u002Fdocs\u002Fshield-base\u002Ftypes","docs\u002Fshield-base\u002F05.types",{"title":246,"path":642,"stem":643},"\u002Fdocs\u002Fshield-base\u002Fapi","docs\u002Fshield-base\u002F06.api",{"title":395,"path":48,"stem":645,"children":646},"docs\u002Futils\u002Findex",[647,648,665,698,795],{"title":395,"path":48,"stem":645},{"title":649,"path":650,"stem":651,"children":652,"page":53},"Eslint","\u002Fdocs\u002Futils\u002Feslint","docs\u002Futils\u002Feslint",[653,657,661],{"title":654,"path":655,"stem":656},"React Config","\u002Fdocs\u002Futils\u002Feslint\u002Freact","docs\u002Futils\u002Feslint\u002Freact",{"title":658,"path":659,"stem":660},"TypeScript Config","\u002Fdocs\u002Futils\u002Feslint\u002Ftypescript","docs\u002Futils\u002Feslint\u002Ftypescript",{"title":662,"path":663,"stem":664},"Vue Config","\u002Fdocs\u002Futils\u002Feslint\u002Fvue","docs\u002Futils\u002Feslint\u002Fvue",{"title":666,"path":667,"stem":668,"children":669,"page":53},"Server","\u002Fdocs\u002Futils\u002Fserver","docs\u002Futils\u002Fserver",[670,674,678,682,686,690,694],{"title":671,"path":672,"stem":673},"Encryption","\u002Fdocs\u002Futils\u002Fserver\u002Fencryption","docs\u002Futils\u002Fserver\u002Fencryption",{"title":675,"path":676,"stem":677},"Path Resolver","\u002Fdocs\u002Futils\u002Fserver\u002Fpathresolver","docs\u002Futils\u002Fserver\u002FpathResolver",{"title":679,"path":680,"stem":681},"File Replacements","\u002Fdocs\u002Futils\u002Fserver\u002Freplace","docs\u002Futils\u002Fserver\u002Freplace",{"title":683,"path":684,"stem":685},"run","\u002Fdocs\u002Futils\u002Fserver\u002Frun","docs\u002Futils\u002Fserver\u002Frun",{"title":687,"path":688,"stem":689},"scheduleTask","\u002Fdocs\u002Futils\u002Fserver\u002Fscheduletask","docs\u002Futils\u002Fserver\u002FscheduleTask",{"title":691,"path":692,"stem":693},"spawnRun","\u002Fdocs\u002Futils\u002Fserver\u002Fspawnrun","docs\u002Futils\u002Fserver\u002FspawnRun",{"title":695,"path":696,"stem":697},"uploadCsv","\u002Fdocs\u002Futils\u002Fserver\u002Fuploadcsv","docs\u002Futils\u002Fserver\u002FuploadCsv",{"title":699,"path":700,"stem":701,"children":702,"page":53},"Shared","\u002Fdocs\u002Futils\u002Fshared","docs\u002Futils\u002Fshared",[703,707,711,715,719,723,727,731,735,739,743,747,751,755,759,763,767,771,775,779,783,787,791],{"title":704,"path":705,"stem":706},"BatchQueue","\u002Fdocs\u002Futils\u002Fshared\u002Fbatchqueue","docs\u002Futils\u002Fshared\u002FbatchQueue",{"title":708,"path":709,"stem":710},"capitalize","\u002Fdocs\u002Futils\u002Fshared\u002Fcapitalize","docs\u002Futils\u002Fshared\u002Fcapitalize",{"title":712,"path":713,"stem":714},"chunkProcess","\u002Fdocs\u002Futils\u002Fshared\u002Fchunkprocess","docs\u002Futils\u002Fshared\u002FchunkProcess",{"title":716,"path":717,"stem":718},"cleanObject","\u002Fdocs\u002Futils\u002Fshared\u002Fcleanobject","docs\u002Futils\u002Fshared\u002FcleanObject",{"title":720,"path":721,"stem":722},"createConfigManager","\u002Fdocs\u002Futils\u002Fshared\u002Fconfigurationdefiner","docs\u002Futils\u002Fshared\u002FconfigurationDefiner",{"title":724,"path":725,"stem":726},"debounce","\u002Fdocs\u002Futils\u002Fshared\u002Fdebounce","docs\u002Futils\u002Fshared\u002Fdebounce",{"title":728,"path":729,"stem":730},"ensureArray","\u002Fdocs\u002Futils\u002Fshared\u002Fensurearray","docs\u002Futils\u002Fshared\u002FensureArray",{"title":732,"path":733,"stem":734},"fetchWithRetry","\u002Fdocs\u002Futils\u002Fshared\u002Ffetchwithretry","docs\u002Futils\u002Fshared\u002FfetchWithRetry",{"title":736,"path":737,"stem":738},"filterEmptyValues","\u002Fdocs\u002Futils\u002Fshared\u002Ffilteremptyvalues","docs\u002Futils\u002Fshared\u002FfilterEmptyValues",{"title":740,"path":741,"stem":742},"findStringsInObject","\u002Fdocs\u002Futils\u002Fshared\u002Ffindobjectvalues","docs\u002Futils\u002Fshared\u002FfindObjectValues",{"title":744,"path":745,"stem":746},"fisherYatesShuffle","\u002Fdocs\u002Futils\u002Fshared\u002Ffisheryatesshuffle","docs\u002Futils\u002Fshared\u002FfisherYatesShuffle",{"title":748,"path":749,"stem":750},"getRandomImage","\u002Fdocs\u002Futils\u002Fshared\u002Fgetrandomimage","docs\u002Futils\u002Fshared\u002FgetRandomImage",{"title":752,"path":753,"stem":754},"isObjectHasValues","\u002Fdocs\u002Futils\u002Fshared\u002Fisobjecthasvalues","docs\u002Futils\u002Fshared\u002FisObjectHasValues",{"title":756,"path":757,"stem":758},"isAsyncOrPromise","\u002Fdocs\u002Futils\u002Fshared\u002Fispromise","docs\u002Futils\u002Fshared\u002FisPromise",{"title":760,"path":761,"stem":762},"MiniCache","\u002Fdocs\u002Futils\u002Fshared\u002Fminicache","docs\u002Futils\u002Fshared\u002FminiCache",{"title":764,"path":765,"stem":766},"parseCookies","\u002Fdocs\u002Futils\u002Fshared\u002Fparserawcookies","docs\u002Futils\u002Fshared\u002FparseRawCookies",{"title":768,"path":769,"stem":770},"safeAction","\u002Fdocs\u002Futils\u002Fshared\u002Fpromiselocker","docs\u002Futils\u002Fshared\u002FpromiseLocker",{"title":772,"path":773,"stem":774},"Random","\u002Fdocs\u002Futils\u002Fshared\u002Frandom","docs\u002Futils\u002Fshared\u002Frandom",{"title":776,"path":777,"stem":778},"range","\u002Fdocs\u002Futils\u002Fshared\u002Frange","docs\u002Futils\u002Fshared\u002Frange",{"title":780,"path":781,"stem":782},"rateLimiters","\u002Fdocs\u002Futils\u002Fshared\u002Fratelimiters","docs\u002Futils\u002Fshared\u002FrateLimiters",{"title":784,"path":785,"stem":786},"safeObjectMerge","\u002Fdocs\u002Futils\u002Fshared\u002Fsafemerge","docs\u002Futils\u002Fshared\u002FsafeMerge",{"title":788,"path":789,"stem":790},"textTruncation","\u002Fdocs\u002Futils\u002Fshared\u002Ftexttruncation","docs\u002Futils\u002Fshared\u002FtextTruncation",{"title":792,"path":793,"stem":794},"validateZodSchema","\u002Fdocs\u002Futils\u002Fshared\u002Fvalidatezodschema","docs\u002Futils\u002Fshared\u002FvalidateZodSchema",{"title":796,"path":797,"stem":798,"children":799},"Utility Types","\u002Fdocs\u002Futils\u002Ftypes","docs\u002Futils\u002Ftypes\u002Findex",[800,801,805,809,813,817,821,825,829,833],{"title":796,"path":797,"stem":798},{"title":802,"path":803,"stem":804},"Brand","\u002Fdocs\u002Futils\u002Ftypes\u002Fbrand","docs\u002Futils\u002Ftypes\u002FBrand",{"title":806,"path":807,"stem":808},"DeepPartial","\u002Fdocs\u002Futils\u002Ftypes\u002Fdeeppartial","docs\u002Futils\u002Ftypes\u002FDeepPartial",{"title":810,"path":811,"stem":812},"Merge","\u002Fdocs\u002Futils\u002Ftypes\u002Fmerge","docs\u002Futils\u002Ftypes\u002FMerge",{"title":814,"path":815,"stem":816},"NonNullable","\u002Fdocs\u002Futils\u002Ftypes\u002Fnonnullable","docs\u002Futils\u002Ftypes\u002FNonNullable",{"title":818,"path":819,"stem":820},"Prettify","\u002Fdocs\u002Futils\u002Ftypes\u002Fprettify","docs\u002Futils\u002Ftypes\u002FPrettify",{"title":822,"path":823,"stem":824},"PromiseType","\u002Fdocs\u002Futils\u002Ftypes\u002Fpromisetype","docs\u002Futils\u002Ftypes\u002FPromiseType",{"title":826,"path":827,"stem":828},"RequireKeys","\u002Fdocs\u002Futils\u002Ftypes\u002Frequirekeys","docs\u002Futils\u002Ftypes\u002FRequireKeys",{"title":830,"path":831,"stem":832},"StandardResponse","\u002Fdocs\u002Futils\u002Ftypes\u002Fstandardresponse","docs\u002Futils\u002Ftypes\u002FStandardResponse",{"title":834,"path":835,"stem":836},"ValueOf","\u002Fdocs\u002Futils\u002Ftypes\u002Fvalueof","docs\u002Futils\u002Ftypes\u002FValueOf",{"id":4,"extension":5,"links":838,"meta":849,"stem":62,"__hash__":63},[839,847,848],{"nested":8,"label":9,"icon":10,"to":11,"children":840},[841,842,843,844,845,846],{"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":851,"title":147,"body":852,"description":1912,"extension":1913,"icon":1914,"meta":1915,"module":1916,"navigation":8,"path":211,"rawbody":1917,"seo":1918,"stem":212,"__hash__":1919},"docs\u002Fdocs\u002Fiam\u002F01.essentials\u002F21.api\u002F03.rate-limiting.md",{"type":853,"value":854,"toc":1894},"minimark",[855,859,875,905,911,916,923,1163,1179,1183,1197,1315,1328,1348,1364,1445,1451,1455,1458,1465,1488,1502,1508,1518,1535,1555,1573,1579,1589,1593,1599,1608,1612,1618,1625,1629,1635,1642,1646,1652,1660,1664,1670,1678,1682,1686,1697,1701,1708,1713,1742,1746,1753,1757,1770,1774,1786,1790,1805,1809,1822,1826,1839,1843,1856,1860,1873,1877,1890],[856,857,858],"p",{},"API token rate limiting combines shared guards with operation-specific limiter\nbuckets. The service applies these limiters in the public verification route\nand in the authenticated creation and management routes.",[856,860,861,862,866,867,870,871,874],{},"This page documents the ",[863,864,865],"code",{},"apiTokens"," and\n",[863,868,869],{},"rate_limiters.apiTokensLimiters"," configuration only. The generic limiter\nengine, strike cache, and helper utilities are documented on the\n",[872,873,147],"a",{"href":148}," page.",[876,877,878],"note",{},[856,879,880,881,884,885,888,889,892,893,896,897,900,901,904],{},"All API token limiter responses come from ",[863,882,883],{},"guard()"," and ",[863,886,887],{},"consumeOrReject()",".\nThat means API token rate limiting always fails with ",[863,890,891],{},"429 Too Many Requests",",\nnot with the ",[863,894,895],{},"400",", ",[863,898,899],{},"401",", or ",[863,902,903],{},"403"," responses documented on the endpoint\npages.",[906,907,908],"warning",{},[856,909,910],{},"This page only documents limiter behavior. Shared authentication failures, bad\nrequest payloads, and XSS ban responses still belong to the endpoint-specific\ndocs.",[912,913,915],"h2",{"id":914},"api-token-limiter-map","API token limiter map",[856,917,918,919,922],{},"The API token system uses eight limiter objects plus one verification switch.\nSeven buckets are operation or verification limiters, and one bucket is the\nshared ",[863,920,921],{},"generalUnionLimiter"," that sits in front of most API token routes.",[924,925,926,948],"table",{},[927,928,929],"thead",{},[930,931,932,936,939,942,945],"tr",{},[933,934,935],"th",{},"Flow",[933,937,938],{},"Route",[933,940,941],{},"Limiter objects",[933,943,944],{},"Success reset behavior",[933,946,947],{},"Mentioned on",[949,950,951,990,1017,1039,1063,1088,1112,1138],"tbody",{},[930,952,953,957,962,970,986],{},[954,955,956],"td",{},"Verification",[954,958,959],{},[863,960,961],{},"GET \u002Fapi\u002Fpublic\u002Fverify",[954,963,964,967,968],{},[863,965,966],{},"consumptionRateLimiter"," and optional ",[863,969,921],{},[954,971,972,974,975,896,978,981,982,985],{},[863,973,966],{}," is reset on success for ",[863,976,977],{},"${req.ip}_verify",[863,979,980],{},"apiKey",", and ",[863,983,984],{},"providedIpAddress",". The optional union limiter is not reset.",[954,987,988],{},[872,989,177],{"href":178},[930,991,992,995,1000,1007,1013],{},[954,993,994],{},"Token creation",[954,996,997],{},[863,998,999],{},"POST \u002Fapi\u002Fmanage\u002Fnew-token",[954,1001,1002,896,1004],{},[863,1003,921],{},[863,1005,1006],{},"operationRateLimits.newTokenCreationLimiter",[954,1008,1009,1012],{},[863,1010,1011],{},"resetApiUnionLimiters(req.ip!)"," resets only the union limiter.",[954,1014,1015],{},[872,1016,173],{"href":174},[930,1018,1019,1022,1027,1032,1035],{},[954,1020,1021],{},"Token listing",[954,1023,1024],{},[863,1025,1026],{},"GET \u002Fapi\u002Fmanage\u002Flist-metadata",[954,1028,1029,1031],{},[863,1030,921],{}," only",[954,1033,1034],{},"No limiter is reset on success.",[954,1036,1037],{},[872,1038,207],{"href":208},[930,1040,1041,1043,1048,1055,1059],{},[954,1042,191],{},[954,1044,1045],{},[863,1046,1047],{},"POST \u002Fapi\u002Fmanage\u002Frevoke",[954,1049,1050,896,1052],{},[863,1051,921],{},[863,1053,1054],{},"operationRateLimits.revokeTokensLimiter",[954,1056,1057,1012],{},[863,1058,1011],{},[954,1060,1061],{},[872,1062,191],{"href":192},[930,1064,1065,1067,1072,1079,1083],{},[954,1066,203],{},[954,1068,1069],{},[863,1070,1071],{},"POST \u002Fapi\u002Fmanage\u002Fmetadata",[954,1073,1074,896,1076],{},[863,1075,921],{},[863,1077,1078],{},"operationRateLimits.getMetadataTokenLimiter",[954,1080,1081,1012],{},[863,1082,1011],{},[954,1084,1085],{},[872,1086,1087],{"href":204},"Extensive Metadata",[930,1089,1090,1092,1097,1104,1108],{},[954,1091,195],{},[954,1093,1094],{},[863,1095,1096],{},"POST \u002Fapi\u002Fmanage\u002Frotate",[954,1098,1099,896,1101],{},[863,1100,921],{},[863,1102,1103],{},"operationRateLimits.rotationRateLimiter",[954,1105,1106,1012],{},[863,1107,1011],{},[954,1109,1110],{},[872,1111,195],{"href":196},[930,1113,1114,1117,1122,1129,1133],{},[954,1115,1116],{},"IP restriction updates",[954,1118,1119],{},[863,1120,1121],{},"POST \u002Fapi\u002Fmanage\u002Fip-restriction-update",[954,1123,1124,896,1126],{},[863,1125,921],{},[863,1127,1128],{},"operationRateLimits.ipRestrictionUpdate",[954,1130,1131,1012],{},[863,1132,1011],{},[954,1134,1135],{},[872,1136,1137],{"href":200},"IP Restriction Updates",[930,1139,1140,1143,1148,1155,1159],{},[954,1141,1142],{},"Privilege updates",[954,1144,1145],{},[863,1146,1147],{},"POST \u002Fapi\u002Fmanage\u002Fprivilege-update",[954,1149,1150,896,1152],{},[863,1151,921],{},[863,1153,1154],{},"operationRateLimits.privilegeUpdate",[954,1156,1157,1012],{},[863,1158,1011],{},[954,1160,1161],{},[872,1162,187],{"href":188},[876,1164,1165],{},[856,1166,1167,1168,1171,1172,1174,1175,1178],{},"Token listing is the only management action without a dedicated\n",[863,1169,1170],{},"operationRateLimits"," bucket. The controller goes straight from\n",[863,1173,921],{}," to ",[863,1176,1177],{},"getAllValidTokensList(userId)",".",[912,1180,1182],{"id":1181},"failed-rate-limit-responses","Failed rate-limit responses",[856,1184,1185,1186,1188,1189,1192,1193,1196],{},"The first limiter rejection comes from ",[863,1187,887],{},". It catches the\nunderlying limiter error, computes ",[863,1190,1191],{},"retry"," as\n",[863,1194,1195],{},"Math.ceil(err.msBeforeNext \u002F 1000)",", and sends the standard API token\nrate-limit response:",[1198,1199,1205],"pre",{"className":1200,"code":1201,"filename":1202,"language":1203,"meta":1204,"style":1204},"language-http shiki shiki-themes light-plus light-plus dracula","HTTP\u002F1.1 429 Too Many Requests\nContent-Type: application\u002Fjson; charset=utf-8\nRetry-After: 60\n\n{\n    \"error\": \"Too many requests\",\n    \"retry\": 60\n}\n","response.http","http","",[863,1206,1207,1231,1244,1255,1261,1267,1296,1309],{"__ignoreMap":1204},[1208,1209,1212,1216,1220,1224,1227],"span",{"class":1210,"line":1211},"line",1,[1208,1213,1215],{"class":1214},"sl46w","HTTP",[1208,1217,1219],{"class":1218},"sDd4n","\u002F",[1208,1221,1223],{"class":1222},"spgvN","1.1",[1208,1225,1226],{"class":1222}," 429",[1208,1228,1230],{"class":1229},"sFB1V"," Too Many Requests\n",[1208,1232,1234,1238,1241],{"class":1210,"line":1233},2,[1208,1235,1237],{"class":1236},"scd-l","Content-Type",[1208,1239,1240],{"class":1214},":",[1208,1242,1243],{"class":1229}," application\u002Fjson; charset=utf-8\n",[1208,1245,1247,1250,1252],{"class":1210,"line":1246},3,[1208,1248,1249],{"class":1236},"Retry-After",[1208,1251,1240],{"class":1214},[1208,1253,1254],{"class":1229}," 60\n",[1208,1256,1258],{"class":1210,"line":1257},4,[1208,1259,1260],{"emptyLinePlaceholder":8},"\n",[1208,1262,1264],{"class":1210,"line":1263},5,[1208,1265,1266],{"class":1218},"{\n",[1208,1268,1270,1274,1278,1281,1284,1288,1291,1293],{"class":1210,"line":1269},6,[1208,1271,1273],{"class":1272},"saJyd","    \"",[1208,1275,1277],{"class":1276},"s_W10","error",[1208,1279,1280],{"class":1272},"\"",[1208,1282,1240],{"class":1283},"saOXh",[1208,1285,1287],{"class":1286},"sFkSl"," \"",[1208,1289,1290],{"class":1229},"Too many requests",[1208,1292,1280],{"class":1286},[1208,1294,1295],{"class":1218},",\n",[1208,1297,1299,1301,1303,1305,1307],{"class":1210,"line":1298},7,[1208,1300,1273],{"class":1272},[1208,1302,1191],{"class":1276},[1208,1304,1280],{"class":1272},[1208,1306,1240],{"class":1283},[1208,1308,1254],{"class":1222},[1208,1310,1312],{"class":1210,"line":1311},8,[1208,1313,1314],{"class":1218},"}\n",[856,1316,1317,1318,1320,1321,1323,1324,1327],{},"The API token controllers then pass that same key back through ",[863,1319,883],{}," on\nlater requests. ",[863,1322,883],{}," stores consecutive limiter failures in an\naction-specific cache and escalates the key into ",[863,1325,1326],{},"limiter.block()"," when the\nstrike threshold is reached.",[856,1329,1330,1331,884,1333,1335,1336,1339,1340,1343,1344,1347],{},"For API token routes, ",[863,1332,921],{},[863,1334,966],{}," use\n",[863,1337,1338],{},"maxBans = 1",". That means the first actual limiter rejection adds the key to\nthe permanent block cache after the numeric ",[863,1341,1342],{},"429"," response is sent. The\noperation-specific limiters use ",[863,1345,1346],{},"maxBans = 2",", so the second consecutive\nrejection creates the permanent block.",[856,1349,1350,1351,1353,1354,1357,1358,1360,1361,1240],{},"After that cache entry exists, ",[863,1352,883],{}," rejects the request before consuming\nnew points and reuses the cached expiry marker. Because the API token\ncontrollers do not pass a custom ",[863,1355,1356],{},"seconds"," value to ",[863,1359,883],{},", that cached\nmarker becomes ",[863,1362,1363],{},"permanent",[1198,1365,1367],{"className":1200,"code":1366,"filename":1202,"language":1203,"meta":1204,"style":1204},"HTTP\u002F1.1 429 Too Many Requests\nContent-Type: application\u002Fjson; charset=utf-8\nRetry-After: permanent\n\n{\n    \"error\": \"Too many requests\",\n    \"retry\": \"permanent\"\n}\n",[863,1368,1369,1381,1389,1398,1402,1406,1424,1441],{"__ignoreMap":1204},[1208,1370,1371,1373,1375,1377,1379],{"class":1210,"line":1211},[1208,1372,1215],{"class":1214},[1208,1374,1219],{"class":1218},[1208,1376,1223],{"class":1222},[1208,1378,1226],{"class":1222},[1208,1380,1230],{"class":1229},[1208,1382,1383,1385,1387],{"class":1210,"line":1233},[1208,1384,1237],{"class":1236},[1208,1386,1240],{"class":1214},[1208,1388,1243],{"class":1229},[1208,1390,1391,1393,1395],{"class":1210,"line":1246},[1208,1392,1249],{"class":1236},[1208,1394,1240],{"class":1214},[1208,1396,1397],{"class":1229}," permanent\n",[1208,1399,1400],{"class":1210,"line":1257},[1208,1401,1260],{"emptyLinePlaceholder":8},[1208,1403,1404],{"class":1210,"line":1263},[1208,1405,1266],{"class":1218},[1208,1407,1408,1410,1412,1414,1416,1418,1420,1422],{"class":1210,"line":1269},[1208,1409,1273],{"class":1272},[1208,1411,1277],{"class":1276},[1208,1413,1280],{"class":1272},[1208,1415,1240],{"class":1283},[1208,1417,1287],{"class":1286},[1208,1419,1290],{"class":1229},[1208,1421,1280],{"class":1286},[1208,1423,1295],{"class":1218},[1208,1425,1426,1428,1430,1432,1434,1436,1438],{"class":1210,"line":1298},[1208,1427,1273],{"class":1272},[1208,1429,1191],{"class":1276},[1208,1431,1280],{"class":1272},[1208,1433,1240],{"class":1283},[1208,1435,1287],{"class":1286},[1208,1437,1363],{"class":1229},[1208,1439,1440],{"class":1286},"\"\n",[1208,1442,1443],{"class":1210,"line":1311},[1208,1444,1314],{"class":1218},[856,1446,1447,1448,1450],{},"This is why API token rate-limit failures stay in the ",[863,1449,1342],{}," family even after\nthe key has been escalated into a long-lived block.",[912,1452,1454],{"id":1453},"how-each-limiter-is-used","How each limiter is used",[856,1456,1457],{},"Each limiter has a different job in the API token subsystem. Some protect only\nfailed verification attempts, some protect a single dashboard action, and the\nunion limiter acts as the shared front gate.",[1459,1460,1462],"h3",{"id":1461},"rate_limitersapitokenslimitersconsumptionratelimiter",[863,1463,1464],{},"rate_limiters.apiTokensLimiters.consumptionRateLimiter",[856,1466,1467,1468,1471,1472,1475,1476,1479,1480,1483,1484,1487],{},"This limiter only appears in ",[863,1469,1470],{},"verifyApiTokenController",". The controller\nconsumes it when the verification request is already failing, including the\nmissing ",[863,1473,1474],{},"x-api-key"," branch, the missing ",[863,1477,1478],{},"req.ip"," branch, invalid ",[863,1481,1482],{},"privilege","\nschema input, and any failed ",[863,1485,1486],{},"verifyApiKey"," result.",[856,1489,1490,1491,1493,1494,1496,1497,1499,1500,1178],{},"On successful verification, the controller resets this limiter for three keys:\n",[863,1492,977],{},", the provided raw ",[863,1495,980],{},", and the resolved\n",[863,1498,984],{},". That makes it a failure-only limiter for\n",[872,1501,177],{"href":178},[1459,1503,1505],{"id":1504},"rate_limitersapitokenslimitersgeneralunionlimiter",[863,1506,1507],{},"rate_limiters.apiTokensLimiters.generalUnionLimiter",[856,1509,1510,1511,1514,1515,1178],{},"This limiter is the shared burst-plus-slow gate for API token routes. It is\nalways used for token creation and token management, and it is only used for\nverification when ",[863,1512,1513],{},"apiTokens.rateLimitOnSuccessfulRequest"," is ",[863,1516,1517],{},"true",[856,1519,1520,1521,1524,1525,1528,1529,1531,1532,1534],{},"Most API token routes key this limiter by ",[863,1522,1523],{},"req.ip!",". Token listing uses the\ndedicated key ",[863,1526,1527],{},"${req.ip}_list-metadata",", and verification uses\n",[863,1530,977],{},". Successful creation, revocation, metadata, rotation, IP\nupdates, and privilege updates call ",[863,1533,1011],{},", but\ntoken listing and verification do not reset this limiter.",[856,1536,1537,1538,1295,1540,1295,1542,1295,1544,1295,1546,1295,1548,1295,1550,1552,1553,1178],{},"See ",[872,1539,173],{"href":174},[872,1541,177],{"href":178},[872,1543,191],{"href":192},[872,1545,195],{"href":196},[872,1547,1137],{"href":200},[872,1549,187],{"href":188},[872,1551,1087],{"href":204},", and\n",[872,1554,207],{"href":208},[876,1556,1557],{},[856,1558,1559,1562,1563,884,1566,1569,1570,1572],{},[863,1560,1561],{},"resetApiUnionLimiters()"," only deletes the ",[863,1564,1565],{},"burstLimiter",[863,1567,1568],{},"slowLimiter","\nkeys inside ",[863,1571,921],{},". It does not reset the operation-specific\nlimiters or the verification failure limiter.",[1459,1574,1576],{"id":1575},"rate_limitersapitokenslimitersoperationratelimitsnewtokencreationlimiter",[863,1577,1578],{},"rate_limiters.apiTokensLimiters.operationRateLimits.newTokenCreationLimiter",[856,1580,1581,1582,1584,1585,1588],{},"This limiter protects ",[863,1583,999],{}," with the composite key\n",[863,1586,1587],{},"${req.ip}_${userId}",". It is the dedicated quota bucket for token creation and\nis not reset on success, so it always relies on its own duration window.",[856,1590,1537,1591,1178],{},[872,1592,173],{"href":174},[1459,1594,1596],{"id":1595},"rate_limitersapitokenslimitersoperationratelimitsrevoketokenslimiter",[863,1597,1598],{},"rate_limiters.apiTokensLimiters.operationRateLimits.revokeTokensLimiter",[856,1600,1581,1601,1584,1603,1605,1606,1178],{},[863,1602,1047],{},[863,1604,1587],{},". It only applies after schema validation succeeds and the\nrequest has already passed ",[863,1607,921],{},[856,1609,1537,1610,1178],{},[872,1611,191],{"href":192},[1459,1613,1615],{"id":1614},"rate_limitersapitokenslimitersoperationratelimitsgetmetadatatokenlimiter",[863,1616,1617],{},"rate_limiters.apiTokensLimiters.operationRateLimits.getMetadataTokenLimiter",[856,1619,1581,1620,1584,1622,1624],{},[863,1621,1071],{},[863,1623,1587],{},". It is the dedicated high-throughput bucket for metadata\nreads, which is why its defaults are much looser than the other management\noperation limiters.",[856,1626,1537,1627,1178],{},[872,1628,1087],{"href":204},[1459,1630,1632],{"id":1631},"rate_limitersapitokenslimitersoperationratelimitsrotationratelimiter",[863,1633,1634],{},"rate_limiters.apiTokensLimiters.operationRateLimits.rotationRateLimiter",[856,1636,1581,1637,1584,1639,1641],{},[863,1638,1096],{},[863,1640,1587],{},". It sits in front of a destructive replace action, so its\ndefault block duration is longer than the IP and privilege update buckets.",[856,1643,1537,1644,1178],{},[872,1645,195],{"href":196},[1459,1647,1649],{"id":1648},"rate_limitersapitokenslimitersoperationratelimitsiprestrictionupdate",[863,1650,1651],{},"rate_limiters.apiTokensLimiters.operationRateLimits.ipRestrictionUpdate",[856,1653,1581,1654,1656,1657,1659],{},[863,1655,1121],{}," with the\ncomposite key ",[863,1658,1587],{},". It is dedicated to network whitelist\nchanges and uses a shorter block window than revoke or rotate.",[856,1661,1537,1662,1178],{},[872,1663,1137],{"href":200},[1459,1665,1667],{"id":1666},"rate_limitersapitokenslimitersoperationratelimitsprivilegeupdate",[863,1668,1669],{},"rate_limiters.apiTokensLimiters.operationRateLimits.privilegeUpdate",[856,1671,1581,1672,1674,1675,1677],{},[863,1673,1147],{}," with the composite\nkey ",[863,1676,1587],{},". It is dedicated to privilege changes and uses the\nsame default timings as the IP restriction update bucket.",[856,1679,1537,1680,1178],{},[872,1681,187],{"href":188},[912,1683,1685],{"id":1684},"configuration-reference","Configuration reference",[856,1687,1688,1689,866,1691,1693,1694,1178],{},"All API token limiter settings live under ",[863,1690,865],{},[863,1692,869],{}," in the object passed to ",[863,1695,1696],{},"configuration()",[1459,1698,1700],{"id":1699},"verification-switch","Verification switch",[856,1702,1703,1704,1707],{},"Verification has one related switch outside the ",[863,1705,1706],{},"rate_limiters"," object:",[1709,1710,1712],"h4",{"id":1711},"verification-success-switch","Verification success switch",[1714,1715,1716,1722,1737],"ul",{},[1717,1718,1719,1720],"li",{},"Option: ",[863,1721,1513],{},[1717,1723,1724,1725,1727,1728,1730,1731,1734,1735,1178],{},"Description: Enables ",[863,1726,921],{}," in\n",[863,1729,1470],{}," before any token validation happens. When it\nstays ",[863,1732,1733],{},"false",", verification only uses ",[863,1736,966],{},[1717,1738,1739,1740],{},"Default: ",[863,1741,1733],{},[1459,1743,1745],{"id":1744},"rate-limiter-defaults","Rate limiter defaults",[856,1747,1748,1749,1752],{},"These are the built-in defaults from ",[863,1750,1751],{},"buildLimiters()"," when you do not provide\ncustom limiter values in configuration.",[1709,1754,1756],{"id":1755},"verification-failure-limiter","Verification failure limiter",[1714,1758,1759,1764,1767],{},[1717,1760,1761,1762],{},"Limiter name: ",[863,1763,1464],{},[1717,1765,1766],{},"Description: Verification failure limiter. It consumes points only in failed\nverification branches.",[1717,1768,1769],{},"Default behavior: Allows 10 failed verification attempts per minute, then\nblocks for 1 hour.",[1709,1771,1773],{"id":1772},"shared-union-limiter","Shared union limiter",[1714,1775,1776,1780,1783],{},[1717,1777,1761,1778],{},[863,1779,1507],{},[1717,1781,1782],{},"Description: Shared burst-plus-slow front gate for creation and management,\nand optional gate for successful verification.",[1717,1784,1785],{},"Default behavior: The burst limiter allows 1 request per second, then blocks\nfor 15 minutes. The slow limiter allows 50 requests per minute, then blocks\nfor 1 hour.",[1709,1787,1789],{"id":1788},"token-creation-limiter","Token creation limiter",[1714,1791,1792,1797,1802],{},[1717,1793,1794,1795],{},"Limiter name:\n",[863,1796,1578],{},[1717,1798,1799,1800,1178],{},"Description: Dedicated limiter for ",[863,1801,999],{},[1717,1803,1804],{},"Default behavior: Allows 5 token creations per 10 minutes, then blocks for\n1 hour.",[1709,1806,1808],{"id":1807},"revocation-limiter","Revocation limiter",[1714,1810,1811,1815,1819],{},[1717,1812,1794,1813],{},[863,1814,1598],{},[1717,1816,1799,1817,1178],{},[863,1818,1047],{},[1717,1820,1821],{},"Default behavior: Allows 5 revocations per 10 minutes, then blocks for\n2 hours.",[1709,1823,1825],{"id":1824},"metadata-limiter","Metadata limiter",[1714,1827,1828,1832,1836],{},[1717,1829,1794,1830],{},[863,1831,1617],{},[1717,1833,1799,1834,1178],{},[863,1835,1071],{},[1717,1837,1838],{},"Default behavior: Allows 20 metadata requests per 2 seconds, then blocks for\n30 minutes.",[1709,1840,1842],{"id":1841},"rotation-limiter","Rotation limiter",[1714,1844,1845,1849,1853],{},[1717,1846,1794,1847],{},[863,1848,1634],{},[1717,1850,1799,1851,1178],{},[863,1852,1096],{},[1717,1854,1855],{},"Default behavior: Allows 5 rotations per 10 minutes, then blocks for\n2 hours.",[1709,1857,1859],{"id":1858},"ip-restriction-update-limiter","IP restriction update limiter",[1714,1861,1862,1866,1870],{},[1717,1863,1794,1864],{},[863,1865,1651],{},[1717,1867,1799,1868,1178],{},[863,1869,1121],{},[1717,1871,1872],{},"Default behavior: Allows 5 IP restriction updates per 10 minutes, then\nblocks for 30 minutes.",[1709,1874,1876],{"id":1875},"privilege-update-limiter","Privilege update limiter",[1714,1878,1879,1883,1887],{},[1717,1880,1794,1881],{},[863,1882,1669],{},[1717,1884,1799,1885,1178],{},[863,1886,1147],{},[1717,1888,1889],{},"Default behavior: Allows 5 privilege updates per 10 minutes, then blocks for\n30 minutes.",[1891,1892,1893],"style",{},"html pre.shiki code .sl46w, html code.shiki .sl46w{--shiki-light:#0000FF;--shiki-default:#0000FF;--shiki-dark:#FF79C6}html pre.shiki code .sDd4n, html code.shiki .sDd4n{--shiki-light:#000000;--shiki-default:#000000;--shiki-dark:#F8F8F2}html pre.shiki code .spgvN, html code.shiki .spgvN{--shiki-light:#098658;--shiki-default:#098658;--shiki-dark:#BD93F9}html pre.shiki code .sFB1V, html code.shiki .sFB1V{--shiki-light:#A31515;--shiki-default:#A31515;--shiki-dark:#F1FA8C}html pre.shiki code .scd-l, html code.shiki .scd-l{--shiki-light:#800000;--shiki-default:#800000;--shiki-dark:#FF79C6}html pre.shiki code .saJyd, html code.shiki .saJyd{--shiki-light:#0451A5;--shiki-default:#0451A5;--shiki-dark:#8BE9FE}html pre.shiki code .s_W10, html code.shiki .s_W10{--shiki-light:#0451A5;--shiki-default:#0451A5;--shiki-dark:#8BE9FD}html pre.shiki code .saOXh, html code.shiki .saOXh{--shiki-light:#000000;--shiki-default:#000000;--shiki-dark:#FF79C6}html pre.shiki code .sFkSl, html code.shiki .sFkSl{--shiki-light:#A31515;--shiki-default:#A31515;--shiki-dark:#E9F284}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":1204,"searchDepth":1233,"depth":1233,"links":1895},[1896,1897,1898,1908],{"id":914,"depth":1233,"text":915},{"id":1181,"depth":1233,"text":1182},{"id":1453,"depth":1233,"text":1454,"children":1899},[1900,1901,1902,1903,1904,1905,1906,1907],{"id":1461,"depth":1246,"text":1464},{"id":1504,"depth":1246,"text":1507},{"id":1575,"depth":1246,"text":1578},{"id":1595,"depth":1246,"text":1598},{"id":1614,"depth":1246,"text":1617},{"id":1631,"depth":1246,"text":1634},{"id":1648,"depth":1246,"text":1651},{"id":1666,"depth":1246,"text":1669},{"id":1684,"depth":1233,"text":1685,"children":1909},[1910,1911],{"id":1699,"depth":1246,"text":1700},{"id":1744,"depth":1246,"text":1745},"How verification, creation, and management routes are throttled in the IAM API token system.","md","i-lucide-gauge",{},null,"---\ntitle: Rate Limiting\ndescription: How verification, creation, and management routes are throttled in the IAM API token system.\nicon: i-lucide-gauge\n---\n\nAPI token rate limiting combines shared guards with operation-specific limiter\nbuckets. The service applies these limiters in the public verification route\nand in the authenticated creation and management routes.\n\nThis page documents the `apiTokens` and\n`rate_limiters.apiTokensLimiters` configuration only. The generic limiter\nengine, strike cache, and helper utilities are documented on the\n[Rate Limiting](\u002Fdocs\u002Fiam\u002Fessentials\u002Frate-limiting) page.\n\n::note\nAll API token limiter responses come from `guard()` and `consumeOrReject()`.\nThat means API token rate limiting always fails with `429 Too Many Requests`,\nnot with the `400`, `401`, or `403` responses documented on the endpoint\npages.\n::\n\n::warning\nThis page only documents limiter behavior. Shared authentication failures, bad\nrequest payloads, and XSS ban responses still belong to the endpoint-specific\ndocs.\n::\n\n## API token limiter map\n\nThe API token system uses eight limiter objects plus one verification switch.\nSeven buckets are operation or verification limiters, and one bucket is the\nshared `generalUnionLimiter` that sits in front of most API token routes.\n\n| Flow | Route | Limiter objects | Success reset behavior | Mentioned on |\n|---|---|---|---|---|\n| Verification | `GET \u002Fapi\u002Fpublic\u002Fverify` | `consumptionRateLimiter` and optional `generalUnionLimiter` | `consumptionRateLimiter` is reset on success for `${req.ip}_verify`, `apiKey`, and `providedIpAddress`. The optional union limiter is not reset. | [Verifying Tokens](\u002Fdocs\u002Fiam\u002Fessentials\u002Fapi\u002Fverification) |\n| Token creation | `POST \u002Fapi\u002Fmanage\u002Fnew-token` | `generalUnionLimiter`, `operationRateLimits.newTokenCreationLimiter` | `resetApiUnionLimiters(req.ip!)` resets only the union limiter. | [Creating Tokens](\u002Fdocs\u002Fiam\u002Fessentials\u002Fapi\u002Fcreation) |\n| Token listing | `GET \u002Fapi\u002Fmanage\u002Flist-metadata` | `generalUnionLimiter` only | No limiter is reset on success. | [Token Listing](\u002Fdocs\u002Fiam\u002Fessentials\u002Fapi\u002Fmanagement\u002Flist) |\n| Revocation | `POST \u002Fapi\u002Fmanage\u002Frevoke` | `generalUnionLimiter`, `operationRateLimits.revokeTokensLimiter` | `resetApiUnionLimiters(req.ip!)` resets only the union limiter. | [Revocation](\u002Fdocs\u002Fiam\u002Fessentials\u002Fapi\u002Fmanagement\u002Frevocation) |\n| Metadata | `POST \u002Fapi\u002Fmanage\u002Fmetadata` | `generalUnionLimiter`, `operationRateLimits.getMetadataTokenLimiter` | `resetApiUnionLimiters(req.ip!)` resets only the union limiter. | [Extensive Metadata](\u002Fdocs\u002Fiam\u002Fessentials\u002Fapi\u002Fmanagement\u002Fmetadata) |\n| Rotation | `POST \u002Fapi\u002Fmanage\u002Frotate` | `generalUnionLimiter`, `operationRateLimits.rotationRateLimiter` | `resetApiUnionLimiters(req.ip!)` resets only the union limiter. | [Rotation](\u002Fdocs\u002Fiam\u002Fessentials\u002Fapi\u002Fmanagement\u002Frotation) |\n| IP restriction updates | `POST \u002Fapi\u002Fmanage\u002Fip-restriction-update` | `generalUnionLimiter`, `operationRateLimits.ipRestrictionUpdate` | `resetApiUnionLimiters(req.ip!)` resets only the union limiter. | [IP Restriction Updates](\u002Fdocs\u002Fiam\u002Fessentials\u002Fapi\u002Fmanagement\u002Fip-updates) |\n| Privilege updates | `POST \u002Fapi\u002Fmanage\u002Fprivilege-update` | `generalUnionLimiter`, `operationRateLimits.privilegeUpdate` | `resetApiUnionLimiters(req.ip!)` resets only the union limiter. | [Privileges](\u002Fdocs\u002Fiam\u002Fessentials\u002Fapi\u002Fmanagement\u002Fprivilege) |\n\n::note\nToken listing is the only management action without a dedicated\n`operationRateLimits` bucket. The controller goes straight from\n`generalUnionLimiter` to `getAllValidTokensList(userId)`.\n::\n\n## Failed rate-limit responses\n\nThe first limiter rejection comes from `consumeOrReject()`. It catches the\nunderlying limiter error, computes `retry` as\n`Math.ceil(err.msBeforeNext \u002F 1000)`, and sends the standard API token\nrate-limit response:\n\n```http [response.http]\nHTTP\u002F1.1 429 Too Many Requests\nContent-Type: application\u002Fjson; charset=utf-8\nRetry-After: 60\n\n{\n\t\"error\": \"Too many requests\",\n\t\"retry\": 60\n}\n```\n\nThe API token controllers then pass that same key back through `guard()` on\nlater requests. `guard()` stores consecutive limiter failures in an\naction-specific cache and escalates the key into `limiter.block()` when the\nstrike threshold is reached.\n\nFor API token routes, `generalUnionLimiter` and `consumptionRateLimiter` use\n`maxBans = 1`. That means the first actual limiter rejection adds the key to\nthe permanent block cache after the numeric `429` response is sent. The\noperation-specific limiters use `maxBans = 2`, so the second consecutive\nrejection creates the permanent block.\n\nAfter that cache entry exists, `guard()` rejects the request before consuming\nnew points and reuses the cached expiry marker. Because the API token\ncontrollers do not pass a custom `seconds` value to `guard()`, that cached\nmarker becomes `permanent`:\n\n```http [response.http]\nHTTP\u002F1.1 429 Too Many Requests\nContent-Type: application\u002Fjson; charset=utf-8\nRetry-After: permanent\n\n{\n\t\"error\": \"Too many requests\",\n\t\"retry\": \"permanent\"\n}\n```\n\nThis is why API token rate-limit failures stay in the `429` family even after\nthe key has been escalated into a long-lived block.\n\n## How each limiter is used\n\nEach limiter has a different job in the API token subsystem. Some protect only\nfailed verification attempts, some protect a single dashboard action, and the\nunion limiter acts as the shared front gate.\n\n### `rate_limiters.apiTokensLimiters.consumptionRateLimiter`\n\nThis limiter only appears in `verifyApiTokenController`. The controller\nconsumes it when the verification request is already failing, including the\nmissing `x-api-key` branch, the missing `req.ip` branch, invalid `privilege`\nschema input, and any failed `verifyApiKey` result.\n\nOn successful verification, the controller resets this limiter for three keys:\n`${req.ip}_verify`, the provided raw `apiKey`, and the resolved\n`providedIpAddress`. That makes it a failure-only limiter for\n[Verifying Tokens](\u002Fdocs\u002Fiam\u002Fessentials\u002Fapi\u002Fverification).\n\n### `rate_limiters.apiTokensLimiters.generalUnionLimiter`\n\nThis limiter is the shared burst-plus-slow gate for API token routes. It is\nalways used for token creation and token management, and it is only used for\nverification when `apiTokens.rateLimitOnSuccessfulRequest` is `true`.\n\nMost API token routes key this limiter by `req.ip!`. Token listing uses the\ndedicated key `${req.ip}_list-metadata`, and verification uses\n`${req.ip}_verify`. Successful creation, revocation, metadata, rotation, IP\nupdates, and privilege updates call `resetApiUnionLimiters(req.ip!)`, but\ntoken listing and verification do not reset this limiter.\n\nSee [Creating Tokens](\u002Fdocs\u002Fiam\u002Fessentials\u002Fapi\u002Fcreation),\n[Verifying Tokens](\u002Fdocs\u002Fiam\u002Fessentials\u002Fapi\u002Fverification),\n[Revocation](\u002Fdocs\u002Fiam\u002Fessentials\u002Fapi\u002Fmanagement\u002Frevocation),\n[Rotation](\u002Fdocs\u002Fiam\u002Fessentials\u002Fapi\u002Fmanagement\u002Frotation),\n[IP Restriction Updates](\u002Fdocs\u002Fiam\u002Fessentials\u002Fapi\u002Fmanagement\u002Fip-updates),\n[Privileges](\u002Fdocs\u002Fiam\u002Fessentials\u002Fapi\u002Fmanagement\u002Fprivilege),\n[Extensive Metadata](\u002Fdocs\u002Fiam\u002Fessentials\u002Fapi\u002Fmanagement\u002Fmetadata), and\n[Token Listing](\u002Fdocs\u002Fiam\u002Fessentials\u002Fapi\u002Fmanagement\u002Flist).\n\n::note\n`resetApiUnionLimiters()` only deletes the `burstLimiter` and `slowLimiter`\nkeys inside `generalUnionLimiter`. It does not reset the operation-specific\nlimiters or the verification failure limiter.\n::\n\n### `rate_limiters.apiTokensLimiters.operationRateLimits.newTokenCreationLimiter`\n\nThis limiter protects `POST \u002Fapi\u002Fmanage\u002Fnew-token` with the composite key\n`${req.ip}_${userId}`. It is the dedicated quota bucket for token creation and\nis not reset on success, so it always relies on its own duration window.\n\nSee [Creating Tokens](\u002Fdocs\u002Fiam\u002Fessentials\u002Fapi\u002Fcreation).\n\n### `rate_limiters.apiTokensLimiters.operationRateLimits.revokeTokensLimiter`\n\nThis limiter protects `POST \u002Fapi\u002Fmanage\u002Frevoke` with the composite key\n`${req.ip}_${userId}`. It only applies after schema validation succeeds and the\nrequest has already passed `generalUnionLimiter`.\n\nSee [Revocation](\u002Fdocs\u002Fiam\u002Fessentials\u002Fapi\u002Fmanagement\u002Frevocation).\n\n### `rate_limiters.apiTokensLimiters.operationRateLimits.getMetadataTokenLimiter`\n\nThis limiter protects `POST \u002Fapi\u002Fmanage\u002Fmetadata` with the composite key\n`${req.ip}_${userId}`. It is the dedicated high-throughput bucket for metadata\nreads, which is why its defaults are much looser than the other management\noperation limiters.\n\nSee [Extensive Metadata](\u002Fdocs\u002Fiam\u002Fessentials\u002Fapi\u002Fmanagement\u002Fmetadata).\n\n### `rate_limiters.apiTokensLimiters.operationRateLimits.rotationRateLimiter`\n\nThis limiter protects `POST \u002Fapi\u002Fmanage\u002Frotate` with the composite key\n`${req.ip}_${userId}`. It sits in front of a destructive replace action, so its\ndefault block duration is longer than the IP and privilege update buckets.\n\nSee [Rotation](\u002Fdocs\u002Fiam\u002Fessentials\u002Fapi\u002Fmanagement\u002Frotation).\n\n### `rate_limiters.apiTokensLimiters.operationRateLimits.ipRestrictionUpdate`\n\nThis limiter protects `POST \u002Fapi\u002Fmanage\u002Fip-restriction-update` with the\ncomposite key `${req.ip}_${userId}`. It is dedicated to network whitelist\nchanges and uses a shorter block window than revoke or rotate.\n\nSee [IP Restriction Updates](\u002Fdocs\u002Fiam\u002Fessentials\u002Fapi\u002Fmanagement\u002Fip-updates).\n\n### `rate_limiters.apiTokensLimiters.operationRateLimits.privilegeUpdate`\n\nThis limiter protects `POST \u002Fapi\u002Fmanage\u002Fprivilege-update` with the composite\nkey `${req.ip}_${userId}`. It is dedicated to privilege changes and uses the\nsame default timings as the IP restriction update bucket.\n\nSee [Privileges](\u002Fdocs\u002Fiam\u002Fessentials\u002Fapi\u002Fmanagement\u002Fprivilege).\n\n## Configuration reference\n\nAll API token limiter settings live under `apiTokens` and\n`rate_limiters.apiTokensLimiters` in the object passed to `configuration()`.\n\n### Verification switch\n\nVerification has one related switch outside the `rate_limiters` object:\n\n#### Verification success switch\n\n- Option: `apiTokens.rateLimitOnSuccessfulRequest`\n- Description: Enables `generalUnionLimiter` in\n\t`verifyApiTokenController` before any token validation happens. When it\n\tstays `false`, verification only uses `consumptionRateLimiter`.\n- Default: `false`\n\n### Rate limiter defaults\n\nThese are the built-in defaults from `buildLimiters()` when you do not provide\ncustom limiter values in configuration.\n\n#### Verification failure limiter\n\n- Limiter name: `rate_limiters.apiTokensLimiters.consumptionRateLimiter`\n- Description: Verification failure limiter. It consumes points only in failed\n\tverification branches.\n- Default behavior: Allows 10 failed verification attempts per minute, then\n\tblocks for 1 hour.\n\n#### Shared union limiter\n\n- Limiter name: `rate_limiters.apiTokensLimiters.generalUnionLimiter`\n- Description: Shared burst-plus-slow front gate for creation and management,\n\tand optional gate for successful verification.\n- Default behavior: The burst limiter allows 1 request per second, then blocks\n\tfor 15 minutes. The slow limiter allows 50 requests per minute, then blocks\n\tfor 1 hour.\n\n#### Token creation limiter\n\n- Limiter name:\n\t`rate_limiters.apiTokensLimiters.operationRateLimits.newTokenCreationLimiter`\n- Description: Dedicated limiter for `POST \u002Fapi\u002Fmanage\u002Fnew-token`.\n- Default behavior: Allows 5 token creations per 10 minutes, then blocks for\n\t1 hour.\n\n#### Revocation limiter\n\n- Limiter name:\n\t`rate_limiters.apiTokensLimiters.operationRateLimits.revokeTokensLimiter`\n- Description: Dedicated limiter for `POST \u002Fapi\u002Fmanage\u002Frevoke`.\n- Default behavior: Allows 5 revocations per 10 minutes, then blocks for\n\t2 hours.\n\n#### Metadata limiter\n\n- Limiter name:\n\t`rate_limiters.apiTokensLimiters.operationRateLimits.getMetadataTokenLimiter`\n- Description: Dedicated limiter for `POST \u002Fapi\u002Fmanage\u002Fmetadata`.\n- Default behavior: Allows 20 metadata requests per 2 seconds, then blocks for\n\t30 minutes.\n\n#### Rotation limiter\n\n- Limiter name:\n\t`rate_limiters.apiTokensLimiters.operationRateLimits.rotationRateLimiter`\n- Description: Dedicated limiter for `POST \u002Fapi\u002Fmanage\u002Frotate`.\n- Default behavior: Allows 5 rotations per 10 minutes, then blocks for\n\t2 hours.\n\n#### IP restriction update limiter\n\n- Limiter name:\n\t`rate_limiters.apiTokensLimiters.operationRateLimits.ipRestrictionUpdate`\n- Description: Dedicated limiter for `POST \u002Fapi\u002Fmanage\u002Fip-restriction-update`.\n- Default behavior: Allows 5 IP restriction updates per 10 minutes, then\n\tblocks for 30 minutes.\n\n#### Privilege update limiter\n\n- Limiter name:\n\t`rate_limiters.apiTokensLimiters.operationRateLimits.privilegeUpdate`\n- Description: Dedicated limiter for `POST \u002Fapi\u002Fmanage\u002Fprivilege-update`.\n- Default behavior: Allows 5 privilege updates per 10 minutes, then blocks for\n\t30 minutes.\n",{"title":147,"description":1912},"HMQtMJsN_YLKWWL689szqrdbj7ooXR-uBJCc4jvpoU8",[1921,1922],{"title":207,"path":208,"stem":209,"children":-1},{"title":38,"path":214,"stem":215,"children":-1},{"id":851,"title":147,"body":1924,"description":1912,"extension":1913,"icon":1914,"meta":2702,"module":1916,"navigation":8,"path":211,"rawbody":1917,"seo":2703,"stem":212,"__hash__":1919},{"type":853,"value":1925,"toc":2684},[1926,1928,1936,1952,1956,1958,1962,2158,2168,2170,2178,2252,2260,2272,2282,2360,2364,2366,2368,2372,2384,2394,2398,2404,2414,2432,2444,2448,2454,2458,2462,2470,2474,2478,2484,2488,2492,2498,2502,2506,2512,2516,2520,2526,2530,2532,2540,2542,2546,2548,2568,2570,2574,2576,2586,2588,2598,2600,2612,2614,2626,2628,2640,2642,2654,2656,2668,2670,2682],[856,1927,858],{},[856,1929,861,1930,866,1932,870,1934,874],{},[863,1931,865],{},[863,1933,869],{},[872,1935,147],{"href":148},[876,1937,1938],{},[856,1939,880,1940,884,1942,888,1944,892,1946,896,1948,900,1950,904],{},[863,1941,883],{},[863,1943,887],{},[863,1945,891],{},[863,1947,895],{},[863,1949,899],{},[863,1951,903],{},[906,1953,1954],{},[856,1955,910],{},[912,1957,915],{"id":914},[856,1959,918,1960,922],{},[863,1961,921],{},[924,1963,1964,1978],{},[927,1965,1966],{},[930,1967,1968,1970,1972,1974,1976],{},[933,1969,935],{},[933,1971,938],{},[933,1973,941],{},[933,1975,944],{},[933,1977,947],{},[949,1979,1980,2008,2030,2048,2070,2092,2114,2136],{},[930,1981,1982,1984,1988,1994,2004],{},[954,1983,956],{},[954,1985,1986],{},[863,1987,961],{},[954,1989,1990,967,1992],{},[863,1991,966],{},[863,1993,921],{},[954,1995,1996,974,1998,896,2000,981,2002,985],{},[863,1997,966],{},[863,1999,977],{},[863,2001,980],{},[863,2003,984],{},[954,2005,2006],{},[872,2007,177],{"href":178},[930,2009,2010,2012,2016,2022,2026],{},[954,2011,994],{},[954,2013,2014],{},[863,2015,999],{},[954,2017,2018,896,2020],{},[863,2019,921],{},[863,2021,1006],{},[954,2023,2024,1012],{},[863,2025,1011],{},[954,2027,2028],{},[872,2029,173],{"href":174},[930,2031,2032,2034,2038,2042,2044],{},[954,2033,1021],{},[954,2035,2036],{},[863,2037,1026],{},[954,2039,2040,1031],{},[863,2041,921],{},[954,2043,1034],{},[954,2045,2046],{},[872,2047,207],{"href":208},[930,2049,2050,2052,2056,2062,2066],{},[954,2051,191],{},[954,2053,2054],{},[863,2055,1047],{},[954,2057,2058,896,2060],{},[863,2059,921],{},[863,2061,1054],{},[954,2063,2064,1012],{},[863,2065,1011],{},[954,2067,2068],{},[872,2069,191],{"href":192},[930,2071,2072,2074,2078,2084,2088],{},[954,2073,203],{},[954,2075,2076],{},[863,2077,1071],{},[954,2079,2080,896,2082],{},[863,2081,921],{},[863,2083,1078],{},[954,2085,2086,1012],{},[863,2087,1011],{},[954,2089,2090],{},[872,2091,1087],{"href":204},[930,2093,2094,2096,2100,2106,2110],{},[954,2095,195],{},[954,2097,2098],{},[863,2099,1096],{},[954,2101,2102,896,2104],{},[863,2103,921],{},[863,2105,1103],{},[954,2107,2108,1012],{},[863,2109,1011],{},[954,2111,2112],{},[872,2113,195],{"href":196},[930,2115,2116,2118,2122,2128,2132],{},[954,2117,1116],{},[954,2119,2120],{},[863,2121,1121],{},[954,2123,2124,896,2126],{},[863,2125,921],{},[863,2127,1128],{},[954,2129,2130,1012],{},[863,2131,1011],{},[954,2133,2134],{},[872,2135,1137],{"href":200},[930,2137,2138,2140,2144,2150,2154],{},[954,2139,1142],{},[954,2141,2142],{},[863,2143,1147],{},[954,2145,2146,896,2148],{},[863,2147,921],{},[863,2149,1154],{},[954,2151,2152,1012],{},[863,2153,1011],{},[954,2155,2156],{},[872,2157,187],{"href":188},[876,2159,2160],{},[856,2161,1167,2162,1171,2164,1174,2166,1178],{},[863,2163,1170],{},[863,2165,921],{},[863,2167,1177],{},[912,2169,1182],{"id":1181},[856,2171,1185,2172,1188,2174,1192,2176,1196],{},[863,2173,887],{},[863,2175,1191],{},[863,2177,1195],{},[1198,2179,2180],{"className":1200,"code":1201,"filename":1202,"language":1203,"meta":1204,"style":1204},[863,2181,2182,2194,2202,2210,2214,2218,2236,2248],{"__ignoreMap":1204},[1208,2183,2184,2186,2188,2190,2192],{"class":1210,"line":1211},[1208,2185,1215],{"class":1214},[1208,2187,1219],{"class":1218},[1208,2189,1223],{"class":1222},[1208,2191,1226],{"class":1222},[1208,2193,1230],{"class":1229},[1208,2195,2196,2198,2200],{"class":1210,"line":1233},[1208,2197,1237],{"class":1236},[1208,2199,1240],{"class":1214},[1208,2201,1243],{"class":1229},[1208,2203,2204,2206,2208],{"class":1210,"line":1246},[1208,2205,1249],{"class":1236},[1208,2207,1240],{"class":1214},[1208,2209,1254],{"class":1229},[1208,2211,2212],{"class":1210,"line":1257},[1208,2213,1260],{"emptyLinePlaceholder":8},[1208,2215,2216],{"class":1210,"line":1263},[1208,2217,1266],{"class":1218},[1208,2219,2220,2222,2224,2226,2228,2230,2232,2234],{"class":1210,"line":1269},[1208,2221,1273],{"class":1272},[1208,2223,1277],{"class":1276},[1208,2225,1280],{"class":1272},[1208,2227,1240],{"class":1283},[1208,2229,1287],{"class":1286},[1208,2231,1290],{"class":1229},[1208,2233,1280],{"class":1286},[1208,2235,1295],{"class":1218},[1208,2237,2238,2240,2242,2244,2246],{"class":1210,"line":1298},[1208,2239,1273],{"class":1272},[1208,2241,1191],{"class":1276},[1208,2243,1280],{"class":1272},[1208,2245,1240],{"class":1283},[1208,2247,1254],{"class":1222},[1208,2249,2250],{"class":1210,"line":1311},[1208,2251,1314],{"class":1218},[856,2253,1317,2254,1320,2256,1323,2258,1327],{},[863,2255,883],{},[863,2257,883],{},[863,2259,1326],{},[856,2261,1330,2262,884,2264,1335,2266,1339,2268,1343,2270,1347],{},[863,2263,921],{},[863,2265,966],{},[863,2267,1338],{},[863,2269,1342],{},[863,2271,1346],{},[856,2273,1350,2274,1353,2276,1357,2278,1360,2280,1240],{},[863,2275,883],{},[863,2277,1356],{},[863,2279,883],{},[863,2281,1363],{},[1198,2283,2284],{"className":1200,"code":1366,"filename":1202,"language":1203,"meta":1204,"style":1204},[863,2285,2286,2298,2306,2314,2318,2322,2340,2356],{"__ignoreMap":1204},[1208,2287,2288,2290,2292,2294,2296],{"class":1210,"line":1211},[1208,2289,1215],{"class":1214},[1208,2291,1219],{"class":1218},[1208,2293,1223],{"class":1222},[1208,2295,1226],{"class":1222},[1208,2297,1230],{"class":1229},[1208,2299,2300,2302,2304],{"class":1210,"line":1233},[1208,2301,1237],{"class":1236},[1208,2303,1240],{"class":1214},[1208,2305,1243],{"class":1229},[1208,2307,2308,2310,2312],{"class":1210,"line":1246},[1208,2309,1249],{"class":1236},[1208,2311,1240],{"class":1214},[1208,2313,1397],{"class":1229},[1208,2315,2316],{"class":1210,"line":1257},[1208,2317,1260],{"emptyLinePlaceholder":8},[1208,2319,2320],{"class":1210,"line":1263},[1208,2321,1266],{"class":1218},[1208,2323,2324,2326,2328,2330,2332,2334,2336,2338],{"class":1210,"line":1269},[1208,2325,1273],{"class":1272},[1208,2327,1277],{"class":1276},[1208,2329,1280],{"class":1272},[1208,2331,1240],{"class":1283},[1208,2333,1287],{"class":1286},[1208,2335,1290],{"class":1229},[1208,2337,1280],{"class":1286},[1208,2339,1295],{"class":1218},[1208,2341,2342,2344,2346,2348,2350,2352,2354],{"class":1210,"line":1298},[1208,2343,1273],{"class":1272},[1208,2345,1191],{"class":1276},[1208,2347,1280],{"class":1272},[1208,2349,1240],{"class":1283},[1208,2351,1287],{"class":1286},[1208,2353,1363],{"class":1229},[1208,2355,1440],{"class":1286},[1208,2357,2358],{"class":1210,"line":1311},[1208,2359,1314],{"class":1218},[856,2361,1447,2362,1450],{},[863,2363,1342],{},[912,2365,1454],{"id":1453},[856,2367,1457],{},[1459,2369,2370],{"id":1461},[863,2371,1464],{},[856,2373,1467,2374,1471,2376,1475,2378,1479,2380,1483,2382,1487],{},[863,2375,1470],{},[863,2377,1474],{},[863,2379,1478],{},[863,2381,1482],{},[863,2383,1486],{},[856,2385,1490,2386,1493,2388,1496,2390,1499,2392,1178],{},[863,2387,977],{},[863,2389,980],{},[863,2391,984],{},[872,2393,177],{"href":178},[1459,2395,2396],{"id":1504},[863,2397,1507],{},[856,2399,1510,2400,1514,2402,1178],{},[863,2401,1513],{},[863,2403,1517],{},[856,2405,1520,2406,1524,2408,1528,2410,1531,2412,1534],{},[863,2407,1523],{},[863,2409,1527],{},[863,2411,977],{},[863,2413,1011],{},[856,2415,1537,2416,1295,2418,1295,2420,1295,2422,1295,2424,1295,2426,1295,2428,1552,2430,1178],{},[872,2417,173],{"href":174},[872,2419,177],{"href":178},[872,2421,191],{"href":192},[872,2423,195],{"href":196},[872,2425,1137],{"href":200},[872,2427,187],{"href":188},[872,2429,1087],{"href":204},[872,2431,207],{"href":208},[876,2433,2434],{},[856,2435,2436,1562,2438,884,2440,1569,2442,1572],{},[863,2437,1561],{},[863,2439,1565],{},[863,2441,1568],{},[863,2443,921],{},[1459,2445,2446],{"id":1575},[863,2447,1578],{},[856,2449,1581,2450,1584,2452,1588],{},[863,2451,999],{},[863,2453,1587],{},[856,2455,1537,2456,1178],{},[872,2457,173],{"href":174},[1459,2459,2460],{"id":1595},[863,2461,1598],{},[856,2463,1581,2464,1584,2466,1605,2468,1178],{},[863,2465,1047],{},[863,2467,1587],{},[863,2469,921],{},[856,2471,1537,2472,1178],{},[872,2473,191],{"href":192},[1459,2475,2476],{"id":1614},[863,2477,1617],{},[856,2479,1581,2480,1584,2482,1624],{},[863,2481,1071],{},[863,2483,1587],{},[856,2485,1537,2486,1178],{},[872,2487,1087],{"href":204},[1459,2489,2490],{"id":1631},[863,2491,1634],{},[856,2493,1581,2494,1584,2496,1641],{},[863,2495,1096],{},[863,2497,1587],{},[856,2499,1537,2500,1178],{},[872,2501,195],{"href":196},[1459,2503,2504],{"id":1648},[863,2505,1651],{},[856,2507,1581,2508,1656,2510,1659],{},[863,2509,1121],{},[863,2511,1587],{},[856,2513,1537,2514,1178],{},[872,2515,1137],{"href":200},[1459,2517,2518],{"id":1666},[863,2519,1669],{},[856,2521,1581,2522,1674,2524,1677],{},[863,2523,1147],{},[863,2525,1587],{},[856,2527,1537,2528,1178],{},[872,2529,187],{"href":188},[912,2531,1685],{"id":1684},[856,2533,1688,2534,866,2536,1693,2538,1178],{},[863,2535,865],{},[863,2537,869],{},[863,2539,1696],{},[1459,2541,1700],{"id":1699},[856,2543,1703,2544,1707],{},[863,2545,1706],{},[1709,2547,1712],{"id":1711},[1714,2549,2550,2554,2564],{},[1717,2551,1719,2552],{},[863,2553,1513],{},[1717,2555,1724,2556,1727,2558,1730,2560,1734,2562,1178],{},[863,2557,921],{},[863,2559,1470],{},[863,2561,1733],{},[863,2563,966],{},[1717,2565,1739,2566],{},[863,2567,1733],{},[1459,2569,1745],{"id":1744},[856,2571,1748,2572,1752],{},[863,2573,1751],{},[1709,2575,1756],{"id":1755},[1714,2577,2578,2582,2584],{},[1717,2579,1761,2580],{},[863,2581,1464],{},[1717,2583,1766],{},[1717,2585,1769],{},[1709,2587,1773],{"id":1772},[1714,2589,2590,2594,2596],{},[1717,2591,1761,2592],{},[863,2593,1507],{},[1717,2595,1782],{},[1717,2597,1785],{},[1709,2599,1789],{"id":1788},[1714,2601,2602,2606,2610],{},[1717,2603,1794,2604],{},[863,2605,1578],{},[1717,2607,1799,2608,1178],{},[863,2609,999],{},[1717,2611,1804],{},[1709,2613,1808],{"id":1807},[1714,2615,2616,2620,2624],{},[1717,2617,1794,2618],{},[863,2619,1598],{},[1717,2621,1799,2622,1178],{},[863,2623,1047],{},[1717,2625,1821],{},[1709,2627,1825],{"id":1824},[1714,2629,2630,2634,2638],{},[1717,2631,1794,2632],{},[863,2633,1617],{},[1717,2635,1799,2636,1178],{},[863,2637,1071],{},[1717,2639,1838],{},[1709,2641,1842],{"id":1841},[1714,2643,2644,2648,2652],{},[1717,2645,1794,2646],{},[863,2647,1634],{},[1717,2649,1799,2650,1178],{},[863,2651,1096],{},[1717,2653,1855],{},[1709,2655,1859],{"id":1858},[1714,2657,2658,2662,2666],{},[1717,2659,1794,2660],{},[863,2661,1651],{},[1717,2663,1799,2664,1178],{},[863,2665,1121],{},[1717,2667,1872],{},[1709,2669,1876],{"id":1875},[1714,2671,2672,2676,2680],{},[1717,2673,1794,2674],{},[863,2675,1669],{},[1717,2677,1799,2678,1178],{},[863,2679,1147],{},[1717,2681,1889],{},[1891,2683,1893],{},{"title":1204,"searchDepth":1233,"depth":1233,"links":2685},[2686,2687,2688,2698],{"id":914,"depth":1233,"text":915},{"id":1181,"depth":1233,"text":1182},{"id":1453,"depth":1233,"text":1454,"children":2689},[2690,2691,2692,2693,2694,2695,2696,2697],{"id":1461,"depth":1246,"text":1464},{"id":1504,"depth":1246,"text":1507},{"id":1575,"depth":1246,"text":1578},{"id":1595,"depth":1246,"text":1598},{"id":1614,"depth":1246,"text":1617},{"id":1631,"depth":1246,"text":1634},{"id":1648,"depth":1246,"text":1651},{"id":1666,"depth":1246,"text":1669},{"id":1684,"depth":1233,"text":1685,"children":2699},[2700,2701],{"id":1699,"depth":1246,"text":1700},{"id":1744,"depth":1246,"text":1745},{},{"title":147,"description":1912},1780436285484]