[{"data":1,"prerenderedAt":4066},["ShallowReactive",2],{"navLinks":3,"sidebar_docs_navigation_\u002Fdocs\u002Fiam":64,"navigation":257,"navLinks_footer":837,"\u002Fdocs\u002Fiam\u002Fessentials\u002Fapi\u002Fmanagement\u002Frotation_page":850,"\u002Fdocs\u002Fiam\u002Fessentials\u002Fapi\u002Fmanagement\u002Frotation_surround":2651,"\u002Fdocs\u002Fiam\u002Fessentials\u002Fapi\u002Fmanagement\u002Frotation":2654},{"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":195,"body":852,"description":2643,"extension":2644,"icon":2645,"meta":2646,"module":2647,"navigation":8,"path":196,"rawbody":2648,"seo":2649,"stem":197,"__hash__":2650},"docs\u002Fdocs\u002Fiam\u002F01.essentials\u002F21.api\u002F02.management\u002F02.rotation.md",{"type":853,"value":854,"toc":2627},"minimark",[855,859,886,892,895,921,931,936,939,944,955,1179,1182,1285,1295,1301,1307,1314,1362,1369,1415,1421,1467,1477,1482,1485,1655,1659,1662,1792,1797,1806,1812,1821,1895,1906,1919,1934,1937,1941,1944,1953,2025,2030,2033,2186,2189,2192,2281,2290,2308,2322,2408,2417,2421,2424,2468,2472,2475,2479,2493,2497,2511,2515,2524,2528,2531,2535,2538,2542,2545,2576,2578,2582,2623],[856,857,858],"p",{},"Rotation replaces an existing API token with a fresh one. The system revokes\nthe old token first, then generates a new raw key so the caller can continue\nusing machine-to-machine access without keeping the previous credential active.",[856,860,861,862,866,867,881,882,885],{},"When you rotate through the ",[863,864,865],"code",{},"privateActionManager"," or the\n",[863,868,872,877],{"className":869,"language":870,"style":871},"language-http shiki shiki-themes light-plus light-plus dracula","http","",[873,874,876],"span",{"class":875},"sZ328","POST",[873,878,880],{"class":879},"sDd4n"," \u002Fapi\u002Fmanage\u002Frotate"," route, the new token inherits the\ncurrent token name, privilege, prefix, remaining expiration time, and existing\nIP restrictions. When you call ",[863,883,884],{},"rotateApiKey"," directly, you can override those\nattributes and choose whether to delete the old row after revocation.",[887,888,889],"caution",{},[856,890,891],{},"Rotation returns the new raw API key only once. Store it securely when the\nrequest succeeds.",[856,893,894],{},"You can rotate a token in 3 ways:",[896,897,898,905,911],"ul",{},[899,900,901,902,904],"li",{},"Directly calling ",[863,903,884],{},".",[899,906,907,908,910],{},"Using the ",[863,909,865],{}," to validate ownership before rotating.",[899,912,913,914,920],{},"Calling the ",[863,915,916,918],{"className":869,"language":870,"style":871},[873,917,876],{"class":875},[873,919,880],{"class":879}," endpoint from an\nauthenticated client.",[922,923,924],"note",{},[856,925,926,927,930],{},"Follow the ",[928,929,173],"a",{"href":174}," docs to create\na token first before attempting to rotate it.",[932,933,935],"h2",{"id":934},"rotating-tokens","Rotating Tokens",[856,937,938],{},"You can rotate tokens either directly in the library or through the\nroute. The direct helper gives you full control over the\nreplacement token attributes, while the route preserves the current token\nsettings and focuses on safe client-driven rotation.",[940,941,943],"h3",{"id":942},"using-the-library","Using the library",[856,945,946,947,951,952,954],{},"To rotate a token ",[948,949,950],"em",{},"directly",", you call ",[863,953,884],{},". This function revokes\nthe old token, optionally deletes its invalidated row, and creates a new token\nwith the privilege and attributes you provide.",[956,957,962],"pre",{"className":958,"code":959,"filename":960,"language":961,"meta":871,"style":871},"language-ts shiki shiki-themes light-plus light-plus dracula","import { rotateApiKey } from '@riavzon\u002Fauth'\n\nconst results = await rotateApiKey(\n    oldToken,\n    'restricted',\n    'server token',\n    false,\n    ['203.0.113.10'],\n    1000 * 60 * 60,\n    'api'\n)\n\nif (results.ok) {\n    console.log(results.data.newRawToken)\n}\n","example.ts","ts",[863,963,964,994,1000,1025,1034,1048,1060,1069,1085,1104,1114,1120,1125,1145,1173],{"__ignoreMap":871},[873,965,968,971,974,977,980,983,987,991],{"class":966,"line":967},"line",1,[873,969,970],{"class":875},"import",[873,972,973],{"class":879}," { ",[873,975,884],{"class":976},"sjsA6",[873,978,979],{"class":879}," } ",[873,981,982],{"class":875},"from",[873,984,986],{"class":985},"sFkSl"," '",[873,988,990],{"class":989},"sFB1V","@riavzon\u002Fauth",[873,992,993],{"class":985},"'\n",[873,995,997],{"class":966,"line":996},2,[873,998,999],{"emptyLinePlaceholder":8},"\n",[873,1001,1003,1007,1011,1015,1018,1022],{"class":966,"line":1002},3,[873,1004,1006],{"class":1005},"sl46w","const",[873,1008,1010],{"class":1009},"s3JHE"," results",[873,1012,1014],{"class":1013},"saOXh"," =",[873,1016,1017],{"class":875}," await",[873,1019,1021],{"class":1020},"sHOzp"," rotateApiKey",[873,1023,1024],{"class":879},"(\n",[873,1026,1028,1031],{"class":966,"line":1027},4,[873,1029,1030],{"class":976},"    oldToken",[873,1032,1033],{"class":879},",\n",[873,1035,1037,1040,1043,1046],{"class":966,"line":1036},5,[873,1038,1039],{"class":985},"    '",[873,1041,1042],{"class":989},"restricted",[873,1044,1045],{"class":985},"'",[873,1047,1033],{"class":879},[873,1049,1051,1053,1056,1058],{"class":966,"line":1050},6,[873,1052,1039],{"class":985},[873,1054,1055],{"class":989},"server token",[873,1057,1045],{"class":985},[873,1059,1033],{"class":879},[873,1061,1063,1067],{"class":966,"line":1062},7,[873,1064,1066],{"class":1065},"sjR7W","    false",[873,1068,1033],{"class":879},[873,1070,1072,1075,1077,1080,1082],{"class":966,"line":1071},8,[873,1073,1074],{"class":879},"    [",[873,1076,1045],{"class":985},[873,1078,1079],{"class":989},"203.0.113.10",[873,1081,1045],{"class":985},[873,1083,1084],{"class":879},"],\n",[873,1086,1088,1092,1095,1098,1100,1102],{"class":966,"line":1087},9,[873,1089,1091],{"class":1090},"spgvN","    1000",[873,1093,1094],{"class":1013}," *",[873,1096,1097],{"class":1090}," 60",[873,1099,1094],{"class":1013},[873,1101,1097],{"class":1090},[873,1103,1033],{"class":879},[873,1105,1107,1109,1112],{"class":966,"line":1106},10,[873,1108,1039],{"class":985},[873,1110,1111],{"class":989},"api",[873,1113,993],{"class":985},[873,1115,1117],{"class":966,"line":1116},11,[873,1118,1119],{"class":879},")\n",[873,1121,1123],{"class":966,"line":1122},12,[873,1124,999],{"emptyLinePlaceholder":8},[873,1126,1128,1131,1134,1137,1139,1142],{"class":966,"line":1127},13,[873,1129,1130],{"class":875},"if",[873,1132,1133],{"class":879}," (",[873,1135,1136],{"class":976},"results",[873,1138,904],{"class":879},[873,1140,1141],{"class":976},"ok",[873,1143,1144],{"class":879},") {\n",[873,1146,1148,1151,1153,1156,1159,1161,1163,1166,1168,1171],{"class":966,"line":1147},14,[873,1149,1150],{"class":976},"    console",[873,1152,904],{"class":879},[873,1154,1155],{"class":1020},"log",[873,1157,1158],{"class":879},"(",[873,1160,1136],{"class":976},[873,1162,904],{"class":879},[873,1164,1165],{"class":976},"data",[873,1167,904],{"class":879},[873,1169,1170],{"class":976},"newRawToken",[873,1172,1119],{"class":879},[873,1174,1176],{"class":966,"line":1175},15,[873,1177,1178],{"class":879},"}\n",[856,1180,1181],{},"On success you get back an object with:",[956,1183,1185],{"className":958,"code":1184,"language":961,"meta":871,"style":871},"{\n    ok: true,\n    date: new Date().toISOString(),\n    data: {\n        msg: 'Successfully rotated an api key',\n        newRawToken: 'api_xxx',\n        newExpiry: new Date('2026-05-01T12:00:00.000Z')\n    }\n}\n",[863,1186,1187,1192,1202,1223,1228,1242,1256,1276,1281],{"__ignoreMap":871},[873,1188,1189],{"class":966,"line":967},[873,1190,1191],{"class":879},"{\n",[873,1193,1194,1197,1200],{"class":966,"line":996},[873,1195,1196],{"class":879},"    ok: ",[873,1198,1199],{"class":1065},"true",[873,1201,1033],{"class":879},[873,1203,1204,1207,1211,1214,1217,1220],{"class":966,"line":1002},[873,1205,1206],{"class":879},"    date: ",[873,1208,1210],{"class":1209},"sakC6","new",[873,1212,1213],{"class":1020}," Date",[873,1215,1216],{"class":879},"().",[873,1218,1219],{"class":1020},"toISOString",[873,1221,1222],{"class":879},"(),\n",[873,1224,1225],{"class":966,"line":1027},[873,1226,1227],{"class":879},"    data: {\n",[873,1229,1230,1233,1235,1238,1240],{"class":966,"line":1036},[873,1231,1232],{"class":879},"        msg: ",[873,1234,1045],{"class":985},[873,1236,1237],{"class":989},"Successfully rotated an api key",[873,1239,1045],{"class":985},[873,1241,1033],{"class":879},[873,1243,1244,1247,1249,1252,1254],{"class":966,"line":1050},[873,1245,1246],{"class":879},"        newRawToken: ",[873,1248,1045],{"class":985},[873,1250,1251],{"class":989},"api_xxx",[873,1253,1045],{"class":985},[873,1255,1033],{"class":879},[873,1257,1258,1261,1263,1265,1267,1269,1272,1274],{"class":966,"line":1062},[873,1259,1260],{"class":879},"        newExpiry: ",[873,1262,1210],{"class":1209},[873,1264,1213],{"class":1020},[873,1266,1158],{"class":879},[873,1268,1045],{"class":985},[873,1270,1271],{"class":989},"2026-05-01T12:00:00.000Z",[873,1273,1045],{"class":985},[873,1275,1119],{"class":879},[873,1277,1278],{"class":966,"line":1071},[873,1279,1280],{"class":879},"    }\n",[873,1282,1283],{"class":966,"line":1087},[873,1284,1178],{"class":879},[856,1286,1287,1288,1291,1292,904],{},"If the new token does not have an expiration date, ",[863,1289,1290],{},"newExpiry"," is ",[863,1293,1294],{},"null",[1296,1297,1298],"warning",{},[856,1299,1300],{},"When Expiry is null NO expiry will be checked in the verification process.",[856,1302,1303,1304,1306],{},"On error, ",[863,1305,884],{}," returns the branch that failed:",[856,1308,1309,1310,1313],{},"If ",[863,1311,1312],{},"revokeApiKey"," reports that the token is already invalid, rotation stops and\nreturns:",[956,1315,1317],{"className":958,"code":1316,"language":961,"meta":871,"style":871},"{\n    ok: false,\n    date: new Date().toISOString(),\n    reason: 'Cannot rotate revoked token'\n}\n",[863,1318,1319,1323,1332,1346,1358],{"__ignoreMap":871},[873,1320,1321],{"class":966,"line":967},[873,1322,1191],{"class":879},[873,1324,1325,1327,1330],{"class":966,"line":996},[873,1326,1196],{"class":879},[873,1328,1329],{"class":1065},"false",[873,1331,1033],{"class":879},[873,1333,1334,1336,1338,1340,1342,1344],{"class":966,"line":1002},[873,1335,1206],{"class":879},[873,1337,1210],{"class":1209},[873,1339,1213],{"class":1020},[873,1341,1216],{"class":879},[873,1343,1219],{"class":1020},[873,1345,1222],{"class":879},[873,1347,1348,1351,1353,1356],{"class":966,"line":1027},[873,1349,1350],{"class":879},"    reason: ",[873,1352,1045],{"class":985},[873,1354,1355],{"class":989},"Cannot rotate revoked token",[873,1357,993],{"class":985},[873,1359,1360],{"class":966,"line":1036},[873,1361,1178],{"class":879},[856,1363,1364,1365,1368],{},"If the revoke step fails for another reason, or if ",[863,1366,1367],{},"deleteOnRotation"," is\nenabled and the invalidated row cannot be deleted, rotation returns:",[956,1370,1372],{"className":958,"code":1371,"language":961,"meta":871,"style":871},"{\n    ok: false,\n    date: new Date().toISOString(),\n    reason: 'Token cannot be rotated this time'\n}\n",[863,1373,1374,1378,1386,1400,1411],{"__ignoreMap":871},[873,1375,1376],{"class":966,"line":967},[873,1377,1191],{"class":879},[873,1379,1380,1382,1384],{"class":966,"line":996},[873,1381,1196],{"class":879},[873,1383,1329],{"class":1065},[873,1385,1033],{"class":879},[873,1387,1388,1390,1392,1394,1396,1398],{"class":966,"line":1002},[873,1389,1206],{"class":879},[873,1391,1210],{"class":1209},[873,1393,1213],{"class":1020},[873,1395,1216],{"class":879},[873,1397,1219],{"class":1020},[873,1399,1222],{"class":879},[873,1401,1402,1404,1406,1409],{"class":966,"line":1027},[873,1403,1350],{"class":879},[873,1405,1045],{"class":985},[873,1407,1408],{"class":989},"Token cannot be rotated this time",[873,1410,993],{"class":985},[873,1412,1413],{"class":966,"line":1036},[873,1414,1178],{"class":879},[856,1416,1417,1418,1420],{},"If an unexpected exception is thrown inside ",[863,1419,884],{},", the catch block\nreturns:",[956,1422,1424],{"className":958,"code":1423,"language":961,"meta":871,"style":871},"{\n    ok: false,\n    date: new Date().toISOString(),\n    reason: 'Server error rotating a token.'\n}\n",[863,1425,1426,1430,1438,1452,1463],{"__ignoreMap":871},[873,1427,1428],{"class":966,"line":967},[873,1429,1191],{"class":879},[873,1431,1432,1434,1436],{"class":966,"line":996},[873,1433,1196],{"class":879},[873,1435,1329],{"class":1065},[873,1437,1033],{"class":879},[873,1439,1440,1442,1444,1446,1448,1450],{"class":966,"line":1002},[873,1441,1206],{"class":879},[873,1443,1210],{"class":1209},[873,1445,1213],{"class":1020},[873,1447,1216],{"class":879},[873,1449,1219],{"class":1020},[873,1451,1222],{"class":879},[873,1453,1454,1456,1458,1461],{"class":966,"line":1027},[873,1455,1350],{"class":879},[873,1457,1045],{"class":985},[873,1459,1460],{"class":989},"Server error rotating a token.",[873,1462,993],{"class":985},[873,1464,1465],{"class":966,"line":1036},[873,1466,1178],{"class":879},[856,1468,1469,1470,1472,1473,1476],{},"If the token creation step fails after the old token is revoked, ",[863,1471,884],{},"\nforwards the reason returned by ",[863,1474,1475],{},"createApiKey",". That usually means the user hit\nthe maximum token limit or the provided prefix is invalid.",[1478,1479,1481],"h4",{"id":1480},"signature","Signature",[856,1483,1484],{},"The direct helper exposes the following signature:",[956,1486,1488],{"className":958,"code":1487,"language":961,"meta":871,"style":871},"export async function rotateApiKey(\n        rawOldToken: string,\n        privilegeType: 'demo' | 'restricted' | 'protected' | 'full' | 'custom',\n        name: string,\n        deleteOnRotation?: boolean,\n        ipAddress?: string[],\n        expires?: number,\n        prefix?: string\n): Promise\u003CResults\u003CApiTokenRotationSuccess>>\n",[863,1489,1490,1505,1520,1572,1583,1596,1608,1620,1630],{"__ignoreMap":871},[873,1491,1492,1495,1498,1501,1503],{"class":966,"line":967},[873,1493,1494],{"class":875},"export",[873,1496,1497],{"class":1005}," async",[873,1499,1500],{"class":1005}," function",[873,1502,1021],{"class":1020},[873,1504,1024],{"class":879},[873,1506,1507,1511,1514,1518],{"class":966,"line":996},[873,1508,1510],{"class":1509},"sygFZ","        rawOldToken",[873,1512,1513],{"class":1013},":",[873,1515,1517],{"class":1516},"sFs1U"," string",[873,1519,1033],{"class":879},[873,1521,1522,1525,1527,1529,1532,1534,1537,1539,1541,1543,1545,1547,1550,1552,1554,1556,1559,1561,1563,1565,1568,1570],{"class":966,"line":1002},[873,1523,1524],{"class":1509},"        privilegeType",[873,1526,1513],{"class":1013},[873,1528,986],{"class":985},[873,1530,1531],{"class":989},"demo",[873,1533,1045],{"class":985},[873,1535,1536],{"class":1013}," |",[873,1538,986],{"class":985},[873,1540,1042],{"class":989},[873,1542,1045],{"class":985},[873,1544,1536],{"class":1013},[873,1546,986],{"class":985},[873,1548,1549],{"class":989},"protected",[873,1551,1045],{"class":985},[873,1553,1536],{"class":1013},[873,1555,986],{"class":985},[873,1557,1558],{"class":989},"full",[873,1560,1045],{"class":985},[873,1562,1536],{"class":1013},[873,1564,986],{"class":985},[873,1566,1567],{"class":989},"custom",[873,1569,1045],{"class":985},[873,1571,1033],{"class":879},[873,1573,1574,1577,1579,1581],{"class":966,"line":1027},[873,1575,1576],{"class":1509},"        name",[873,1578,1513],{"class":1013},[873,1580,1517],{"class":1516},[873,1582,1033],{"class":879},[873,1584,1585,1588,1591,1594],{"class":966,"line":1036},[873,1586,1587],{"class":1509},"        deleteOnRotation",[873,1589,1590],{"class":1013},"?:",[873,1592,1593],{"class":1516}," boolean",[873,1595,1033],{"class":879},[873,1597,1598,1601,1603,1605],{"class":966,"line":1050},[873,1599,1600],{"class":1509},"        ipAddress",[873,1602,1590],{"class":1013},[873,1604,1517],{"class":1516},[873,1606,1607],{"class":879},"[],\n",[873,1609,1610,1613,1615,1618],{"class":966,"line":1062},[873,1611,1612],{"class":1509},"        expires",[873,1614,1590],{"class":1013},[873,1616,1617],{"class":1516}," number",[873,1619,1033],{"class":879},[873,1621,1622,1625,1627],{"class":966,"line":1071},[873,1623,1624],{"class":1509},"        prefix",[873,1626,1590],{"class":1013},[873,1628,1629],{"class":1516}," string\n",[873,1631,1632,1635,1637,1640,1643,1647,1649,1652],{"class":966,"line":1087},[873,1633,1634],{"class":879},")",[873,1636,1513],{"class":1013},[873,1638,1639],{"class":1516}," Promise",[873,1641,1642],{"class":879},"\u003C",[873,1644,1646],{"class":1645},"sW-rI","Results",[873,1648,1642],{"class":879},[873,1650,1651],{"class":1645},"ApiTokenRotationSuccess",[873,1653,1654],{"class":879},">>\n",[1478,1656,1658],{"id":1657},"parameters","Parameters",[856,1660,1661],{},"The rotation helper accepts the following parameters:",[1663,1664,1665,1681],"table",{},[1666,1667,1668],"thead",{},[1669,1670,1671,1675,1678],"tr",{},[1672,1673,1674],"th",{},"Field",[1672,1676,1677],{},"Type",[1672,1679,1680],{},"Description",[1682,1683,1684,1703,1718,1732,1748,1763,1778],"tbody",{},[1669,1685,1686,1692,1697],{},[1687,1688,1689],"td",{},[863,1690,1691],{},"rawOldToken",[1687,1693,1694],{},[863,1695,1696],{},"string",[1687,1698,1699,1700,904],{},"The current token to rotate. It can be hashed or ",[948,1701,1702],{},"Raw",[1669,1704,1705,1710,1715],{},[1687,1706,1707],{},[863,1708,1709],{},"privilegeType",[1687,1711,1712],{},[863,1713,1714],{},"'demo' | 'restricted' | 'protected' | 'full' | 'custom'",[1687,1716,1717],{},"The privilege assigned to the current token and the replacement token.",[1669,1719,1720,1725,1729],{},[1687,1721,1722],{},[863,1723,1724],{},"name",[1687,1726,1727],{},[863,1728,1696],{},[1687,1730,1731],{},"The name assigned to the new token record.",[1669,1733,1734,1738,1743],{},[1687,1735,1736],{},[863,1737,1367],{},[1687,1739,1740],{},[863,1741,1742],{},"boolean",[1687,1744,1309,1745,1747],{},[863,1746,1199],{},", the old token row is deleted after it is revoked.",[1669,1749,1750,1755,1760],{},[1687,1751,1752],{},[863,1753,1754],{},"ipAddress",[1687,1756,1757],{},[863,1758,1759],{},"string[] | undefined",[1687,1761,1762],{},"The IP restriction list assigned to the new token.",[1669,1764,1765,1770,1775],{},[1687,1766,1767],{},[863,1768,1769],{},"expires",[1687,1771,1772],{},[863,1773,1774],{},"number | undefined",[1687,1776,1777],{},"The TTL for the new token in milliseconds.",[1669,1779,1780,1785,1789],{},[1687,1781,1782],{},[863,1783,1784],{},"prefix",[1687,1786,1787],{},[863,1788,1696],{},[1687,1790,1791],{},"The prefix used when generating the new raw token.",[1296,1793,1794],{},[856,1795,1796],{},"This action should be performed by a fully authenticated client.",[887,1798,1799],{},[856,1800,1801,1802,1805],{},"This function does not validate a ",[863,1803,1804],{},"publicIdentifier",", and it does not\nauthenticate the caller for you. Only call it directly in trusted server-side\ncode.",[1478,1807,1809,1810],{"id":1808},"with-the-privateactionmanager","With the ",[863,1811,865],{},[856,1813,1814,1815,1817,1818,1820],{},"The safest internal method is using the ",[863,1816,865],{},". This function\nvalidates the ",[863,1819,1804],{},", token id, token name, user id, and current\nvalid status before it dispatches the rotation.",[956,1822,1824],{"className":958,"code":1823,"filename":960,"language":961,"meta":871,"style":871},"const rotationRes = await privateActionManager(\n    userId,\n    tokenId,\n    publicIdentifier,\n    tokenName,\n    { action: 'rotate' }\n)\n",[863,1825,1826,1842,1849,1856,1863,1870,1891],{"__ignoreMap":871},[873,1827,1828,1830,1833,1835,1837,1840],{"class":966,"line":967},[873,1829,1006],{"class":1005},[873,1831,1832],{"class":1009}," rotationRes",[873,1834,1014],{"class":1013},[873,1836,1017],{"class":875},[873,1838,1839],{"class":1020}," privateActionManager",[873,1841,1024],{"class":879},[873,1843,1844,1847],{"class":966,"line":996},[873,1845,1846],{"class":976},"    userId",[873,1848,1033],{"class":879},[873,1850,1851,1854],{"class":966,"line":1002},[873,1852,1853],{"class":976},"    tokenId",[873,1855,1033],{"class":879},[873,1857,1858,1861],{"class":966,"line":1027},[873,1859,1860],{"class":976},"    publicIdentifier",[873,1862,1033],{"class":879},[873,1864,1865,1868],{"class":966,"line":1036},[873,1866,1867],{"class":976},"    tokenName",[873,1869,1033],{"class":879},[873,1871,1872,1875,1878,1881,1883,1886,1888],{"class":966,"line":1050},[873,1873,1874],{"class":879},"    { ",[873,1876,1877],{"class":976},"action",[873,1879,1513],{"class":1880},"s34zl",[873,1882,986],{"class":985},[873,1884,1885],{"class":989},"rotate",[873,1887,1045],{"class":985},[873,1889,1890],{"class":879}," }\n",[873,1892,1893],{"class":966,"line":1062},[873,1894,1119],{"class":879},[856,1896,1897,1898,1900,1901,1903,1904,904],{},"When the manager rotates a token, it preserves the stored token attributes. It\npasses the current token name, prefix, remaining expiration time, and IP\nrestrictions to ",[863,1899,884],{},", and it keeps ",[863,1902,1367],{}," set to ",[863,1905,1329],{},[856,1907,1908,1909,1911,1912,1914,1915,904],{},"The ",[863,1910,865],{}," returns the response of ",[863,1913,884],{}," directly.\nLearn more at the\n",[928,1916,1918],{"href":1917},"\u002Fdocs\u002Fiam\u002Fessentials\u002Fapi\u002Fmanagement#the-privateactionmanager","introduction page",[922,1920,1921],{},[856,1922,1923,1924,1927,1928,1931,1932,904],{},"The manager only selects rows where ",[863,1925,1926],{},"valid = 1",". Because of that,\nrotation cannot rotate an already revoked token, and it returns\n",[863,1929,1930],{},"Bad Request"," before it reaches ",[863,1933,884],{},[1935,1936],"hr",{},[940,1938,1940],{"id":1939},"using-the-route","Using the route",[856,1942,1943],{},"Let's say you want to rotate a token from your authenticated client or BFF.",[856,1945,1946,1952],{},[863,1947,1948,1950],{"className":869,"language":870,"style":871},[873,1949,876],{"class":875},[873,1951,880],{"class":879}," body:",[956,1954,1957],{"className":1955,"code":1956,"language":5,"meta":871,"style":871},"language-json shiki shiki-themes light-plus light-plus dracula","{\n    \"tokenId\": 12,\n    \"publicIdentifier\": \"public_identifier\",\n    \"name\": \"the token name\"\n}\n",[863,1958,1959,1963,1983,2003,2021],{"__ignoreMap":871},[873,1960,1961],{"class":966,"line":967},[873,1962,1191],{"class":879},[873,1964,1965,1969,1973,1976,1978,1981],{"class":966,"line":996},[873,1966,1968],{"class":1967},"saJyd","    \"",[873,1970,1972],{"class":1971},"s_W10","tokenId",[873,1974,1975],{"class":1967},"\"",[873,1977,1513],{"class":1013},[873,1979,1980],{"class":1090}," 12",[873,1982,1033],{"class":879},[873,1984,1985,1987,1989,1991,1993,1996,1999,2001],{"class":966,"line":1002},[873,1986,1968],{"class":1967},[873,1988,1804],{"class":1971},[873,1990,1975],{"class":1967},[873,1992,1513],{"class":1013},[873,1994,1995],{"class":985}," \"",[873,1997,1998],{"class":989},"public_identifier",[873,2000,1975],{"class":985},[873,2002,1033],{"class":879},[873,2004,2005,2007,2009,2011,2013,2015,2018],{"class":966,"line":1027},[873,2006,1968],{"class":1967},[873,2008,1724],{"class":1971},[873,2010,1975],{"class":1967},[873,2012,1513],{"class":1013},[873,2014,1995],{"class":985},[873,2016,2017],{"class":989},"the token name",[873,2019,2020],{"class":985},"\"\n",[873,2022,2023],{"class":966,"line":1036},[873,2024,1178],{"class":879},[856,2026,1908,2027,2029],{},[863,2028,1724],{}," field identifies the current token during ownership validation. The\nroute does not use it to rename the replacement token.",[856,2031,2032],{},"On success you will get the following response:",[956,2034,2036],{"className":869,"code":2035,"language":870,"meta":871,"style":871},"HTTP\u002F1.1 200 OK\nContent-Type: application\u002Fjson; charset=utf-8\n\n{\n    \"ok\": true,\n    \"date\": \"current date\",\n    \"data\": {\n        \"msg\": \"Successfully rotated an api key\",\n        \"newRawToken\": \"new raw token\",\n        \"newExpiry\": \"current expiry or null\"\n    }\n}\n",[863,2037,2038,2055,2066,2070,2074,2089,2109,2122,2142,2161,2178,2182],{"__ignoreMap":871},[873,2039,2040,2043,2046,2049,2052],{"class":966,"line":967},[873,2041,2042],{"class":1005},"HTTP",[873,2044,2045],{"class":879},"\u002F",[873,2047,2048],{"class":1090},"1.1",[873,2050,2051],{"class":1090}," 200",[873,2053,2054],{"class":989}," OK\n",[873,2056,2057,2061,2063],{"class":966,"line":996},[873,2058,2060],{"class":2059},"scd-l","Content-Type",[873,2062,1513],{"class":1005},[873,2064,2065],{"class":989}," application\u002Fjson; charset=utf-8\n",[873,2067,2068],{"class":966,"line":1002},[873,2069,999],{"emptyLinePlaceholder":8},[873,2071,2072],{"class":966,"line":1027},[873,2073,1191],{"class":879},[873,2075,2076,2078,2080,2082,2084,2087],{"class":966,"line":1036},[873,2077,1968],{"class":1967},[873,2079,1141],{"class":1971},[873,2081,1975],{"class":1967},[873,2083,1513],{"class":1013},[873,2085,2086],{"class":1065}," true",[873,2088,1033],{"class":879},[873,2090,2091,2093,2096,2098,2100,2102,2105,2107],{"class":966,"line":1050},[873,2092,1968],{"class":1967},[873,2094,2095],{"class":1971},"date",[873,2097,1975],{"class":1967},[873,2099,1513],{"class":1013},[873,2101,1995],{"class":985},[873,2103,2104],{"class":989},"current date",[873,2106,1975],{"class":985},[873,2108,1033],{"class":879},[873,2110,2111,2113,2115,2117,2119],{"class":966,"line":1062},[873,2112,1968],{"class":1967},[873,2114,1165],{"class":1971},[873,2116,1975],{"class":1967},[873,2118,1513],{"class":1013},[873,2120,2121],{"class":879}," {\n",[873,2123,2124,2127,2130,2132,2134,2136,2138,2140],{"class":966,"line":1071},[873,2125,2126],{"class":1967},"        \"",[873,2128,2129],{"class":1971},"msg",[873,2131,1975],{"class":1967},[873,2133,1513],{"class":1013},[873,2135,1995],{"class":985},[873,2137,1237],{"class":989},[873,2139,1975],{"class":985},[873,2141,1033],{"class":879},[873,2143,2144,2146,2148,2150,2152,2154,2157,2159],{"class":966,"line":1087},[873,2145,2126],{"class":1967},[873,2147,1170],{"class":1971},[873,2149,1975],{"class":1967},[873,2151,1513],{"class":1013},[873,2153,1995],{"class":985},[873,2155,2156],{"class":989},"new raw token",[873,2158,1975],{"class":985},[873,2160,1033],{"class":879},[873,2162,2163,2165,2167,2169,2171,2173,2176],{"class":966,"line":1106},[873,2164,2126],{"class":1967},[873,2166,1290],{"class":1971},[873,2168,1975],{"class":1967},[873,2170,1513],{"class":1013},[873,2172,1995],{"class":985},[873,2174,2175],{"class":989},"current expiry or null",[873,2177,2020],{"class":985},[873,2179,2180],{"class":966,"line":1116},[873,2181,1280],{"class":879},[873,2183,2184],{"class":966,"line":1122},[873,2185,1178],{"class":879},[856,2187,2188],{},"Aside from the standard errors related to authentication, rate limits, and\nprovided bad data, the route returns the same success object the library users\nget when the manager finds a valid token and the rotation completes.",[856,2190,2191],{},"If the body does not match the schema, the route returns:",[956,2193,2195],{"className":869,"code":2194,"language":870,"meta":871,"style":871},"HTTP\u002F1.1 400 Bad Request\nContent-Type: application\u002Fjson; charset=utf-8\n\n{\n    \"ok\": false,\n    \"date\": \"current date\",\n    \"reason\": \"Bad Request\"\n}\n",[863,2196,2197,2211,2219,2223,2227,2242,2260,2277],{"__ignoreMap":871},[873,2198,2199,2201,2203,2205,2208],{"class":966,"line":967},[873,2200,2042],{"class":1005},[873,2202,2045],{"class":879},[873,2204,2048],{"class":1090},[873,2206,2207],{"class":1090}," 400",[873,2209,2210],{"class":989}," Bad Request\n",[873,2212,2213,2215,2217],{"class":966,"line":996},[873,2214,2060],{"class":2059},[873,2216,1513],{"class":1005},[873,2218,2065],{"class":989},[873,2220,2221],{"class":966,"line":1002},[873,2222,999],{"emptyLinePlaceholder":8},[873,2224,2225],{"class":966,"line":1027},[873,2226,1191],{"class":879},[873,2228,2229,2231,2233,2235,2237,2240],{"class":966,"line":1036},[873,2230,1968],{"class":1967},[873,2232,1141],{"class":1971},[873,2234,1975],{"class":1967},[873,2236,1513],{"class":1013},[873,2238,2239],{"class":1065}," false",[873,2241,1033],{"class":879},[873,2243,2244,2246,2248,2250,2252,2254,2256,2258],{"class":966,"line":1050},[873,2245,1968],{"class":1967},[873,2247,2095],{"class":1971},[873,2249,1975],{"class":1967},[873,2251,1513],{"class":1013},[873,2253,1995],{"class":985},[873,2255,2104],{"class":989},[873,2257,1975],{"class":985},[873,2259,1033],{"class":879},[873,2261,2262,2264,2267,2269,2271,2273,2275],{"class":966,"line":1062},[873,2263,1968],{"class":1967},[873,2265,2266],{"class":1971},"reason",[873,2268,1975],{"class":1967},[873,2270,1513],{"class":1013},[873,2272,1995],{"class":985},[873,2274,1930],{"class":989},[873,2276,2020],{"class":985},[873,2278,2279],{"class":966,"line":1071},[873,2280,1178],{"class":879},[856,2282,2283,2284,2286,2287,904],{},"If the ",[863,2285,1804],{}," checksum is invalid, the route returns ",[863,2288,2289],{},"Invalid identity",[856,2291,2292,2293,2295,2296,2295,2298,2300,2301,2304,2305,2307],{},"If the manager cannot match a currently valid token for the given ",[863,2294,1972],{},", ",[863,2297,1804],{},[863,2299,1724],{},", and ",[863,2302,2303],{},"userId",", it returns ",[863,2306,1930],{},". That also means the token is already revoked, belongs to a different user, or the body does not point to an active row.",[856,2309,2310,2311,2313,2314,2316,2317,2319,2320,1513],{},"If the manager finds the token but the underlying rotation action fails, the\nroute forwards the reason returned by ",[863,2312,884],{},", such as\n",[863,2315,1408],{},", a ",[863,2318,1475],{}," validation reason, or\n",[863,2321,1460],{},[956,2323,2325],{"className":869,"code":2324,"language":870,"meta":871,"style":871},"HTTP\u002F1.1 400 Bad Request\nContent-Type: application\u002Fjson; charset=utf-8\n\n{\n    \"ok\": false,\n    \"date\": \"current date\",\n    \"reason\": \"reason from privateActionManager or rotateApiKey\"\n}\n",[863,2326,2327,2339,2347,2351,2355,2369,2387,2404],{"__ignoreMap":871},[873,2328,2329,2331,2333,2335,2337],{"class":966,"line":967},[873,2330,2042],{"class":1005},[873,2332,2045],{"class":879},[873,2334,2048],{"class":1090},[873,2336,2207],{"class":1090},[873,2338,2210],{"class":989},[873,2340,2341,2343,2345],{"class":966,"line":996},[873,2342,2060],{"class":2059},[873,2344,1513],{"class":1005},[873,2346,2065],{"class":989},[873,2348,2349],{"class":966,"line":1002},[873,2350,999],{"emptyLinePlaceholder":8},[873,2352,2353],{"class":966,"line":1027},[873,2354,1191],{"class":879},[873,2356,2357,2359,2361,2363,2365,2367],{"class":966,"line":1036},[873,2358,1968],{"class":1967},[873,2360,1141],{"class":1971},[873,2362,1975],{"class":1967},[873,2364,1513],{"class":1013},[873,2366,2239],{"class":1065},[873,2368,1033],{"class":879},[873,2370,2371,2373,2375,2377,2379,2381,2383,2385],{"class":966,"line":1050},[873,2372,1968],{"class":1967},[873,2374,2095],{"class":1971},[873,2376,1975],{"class":1967},[873,2378,1513],{"class":1013},[873,2380,1995],{"class":985},[873,2382,2104],{"class":989},[873,2384,1975],{"class":985},[873,2386,1033],{"class":879},[873,2388,2389,2391,2393,2395,2397,2399,2402],{"class":966,"line":1062},[873,2390,1968],{"class":1967},[873,2392,2266],{"class":1971},[873,2394,1975],{"class":1967},[873,2396,1513],{"class":1013},[873,2398,1995],{"class":985},[873,2400,2401],{"class":989},"reason from privateActionManager or rotateApiKey",[873,2403,2020],{"class":985},[873,2405,2406],{"class":966,"line":1071},[873,2407,1178],{"class":879},[922,2409,2410],{},[856,2411,2412,2413,2416],{},"Check the ",[928,2414,1918],{"href":2415},"\u002Fdocs\u002Fiam\u002Fessentials\u002Fapi\u002Fmanagement#service"," to\nsee the standard error response.",[1478,2418,2420],{"id":2419},"rate-limits","Rate Limits",[856,2422,2423],{},"The endpoint also enforces rate limits controlled under the following\nconfiguration options:",[896,2425,2426,2432],{},[899,2427,2428,2431],{},[863,2429,2430],{},"rate_limiters.apiTokensLimiters.operationRateLimits.rotationRateLimiter"," -\nThe main limiter for the rotation endpoint. The default allows 5 rotations in\na window of 10 minutes and will trigger a block for 2 hours if this limit is\nmet. Consecutive triggers in this period will block the client permanently.",[899,2433,2434,2437,2438,2441,2442,2445,2451,2452,2455,2456],{},[863,2435,2436],{},"rate_limiters.apiTokensLimiters.generalUnionLimiter"," - A ",[863,2439,2440],{},"burstLimiter"," and\na ",[863,2443,2444],{},"slowLimiter",[928,2446,2450],{"href":2447,"rel":2448},"https:\u002F\u002Fgithub.com\u002Fanimir\u002Fnode-rate-limiter-flexible\u002Fwiki\u002FRateLimiterUnion",[2449],"nofollow","union limiter",".\nIt enforces no more than one request per second, and only 50 per minute. No\nconsecutive triggers in this limiter are provided, and triggering it again\nwill result in a permanent ban. The limiter is ",[948,2453,2454],{},"restarted"," on successful\nrotations.",[896,2457,2458,2463],{},[899,2459,2460,2462],{},[863,2461,2440],{}," - Will block the client for 15 minutes.",[899,2464,2465,2467],{},[863,2466,2444],{}," - Will block for 1 hour.",[932,2469,2471],{"id":2470},"rotation-process","Rotation Process",[856,2473,2474],{},"Rotation uses a controlled replace workflow so the old credential stops working\nbefore the new one becomes active.",[940,2476,2478],{"id":2477},"revoke-the-current-token","Revoke the current token",[856,2480,2481,2482,2484,2485,2487,2488,2490,2491,904],{},"The direct helper starts by calling ",[863,2483,1312],{}," for the current token and\nprivilege. If this step fails because the token is already revoked,\n",[863,2486,884],{}," returns ",[863,2489,1355],{},". If the revoke step fails\nfor another reason, it returns ",[863,2492,1408],{},[940,2494,2496],{"id":2495},"optionally-delete-the-old-row","Optionally delete the old row",[856,2498,2499,2500,1291,2502,2295,2504,2506,2507,2510],{},"When ",[863,2501,1367],{},[863,2503,1199],{},[863,2505,884],{}," deletes the invalidated row\nfrom ",[863,2508,2509],{},"api_tokens"," after revocation. The route does not enable\nthis option, so the old row stays in the database by default.",[940,2512,2514],{"id":2513},"create-the-replacement-token","Create the replacement token",[856,2516,2517,2518,2520,2521,2523],{},"After the old token is invalid, the helper calls ",[863,2519,1475],{}," to generate the\nreplacement. When you call ",[863,2522,884],{}," directly, the new token uses the\nattributes you provide. When you rotate through the manager or route, the new\ntoken inherits the current token privilege, name, prefix, remaining expiration,\nand IP restrictions.",[940,2525,2527],{"id":2526},"return-the-new-credential","Return the new credential",[856,2529,2530],{},"When rotation succeeds, the API returns the new raw token and the new expiry\ntimestamp. The old token remains invalid, and the new raw token is only exposed\nin that success response.",[932,2532,2534],{"id":2533},"configuration-reference","Configuration Reference",[856,2536,2537],{},"These configuration keys control rotate-specific throttling in the service.",[940,2539,2541],{"id":2540},"rate-limiters","Rate limiters",[856,2543,2544],{},"The rotation flow relies on the following limiter configuration:",[1663,2546,2547,2556],{},[1666,2548,2549],{},[1669,2550,2551,2554],{},[1672,2552,2553],{},"Limiter",[1672,2555,1680],{},[1682,2557,2558,2567],{},[1669,2559,2560,2564],{},[1687,2561,2562],{},[863,2563,2430],{},[1687,2565,2566],{},"The main rate limiter for the rotation endpoint",[1669,2568,2569,2573],{},[1687,2570,2571],{},[863,2572,2436],{},[1687,2574,2575],{},"General burst limiter",[1935,2577],{},[940,2579,2581],{"id":2580},"metadata-returned-on-success","Metadata returned on success",[1663,2583,2584,2592],{},[1666,2585,2586],{},[1669,2587,2588,2590],{},[1672,2589,1674],{},[1672,2591,1680],{},[1682,2593,2594,2603,2612],{},[1669,2595,2596,2600],{},[1687,2597,2598],{},[863,2599,2129],{},[1687,2601,2602],{},"Success message returned by the rotation helper",[1669,2604,2605,2609],{},[1687,2606,2607],{},[863,2608,1170],{},[1687,2610,2611],{},"The newly generated raw API token",[1669,2613,2614,2618],{},[1687,2615,2616],{},[863,2617,1290],{},[1687,2619,2620,2621],{},"The expiration timestamp for the new token, or ",[863,2622,1294],{},[2624,2625,2626],"style",{},"html pre.shiki code .sZ328, html code.shiki .sZ328{--shiki-light:#AF00DB;--shiki-default:#AF00DB;--shiki-dark:#FF79C6}html pre.shiki code .sDd4n, html code.shiki .sDd4n{--shiki-light:#000000;--shiki-default:#000000;--shiki-dark:#F8F8F2}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);}html pre.shiki code .sjsA6, html code.shiki .sjsA6{--shiki-light:#001080;--shiki-default:#001080;--shiki-dark:#F8F8F2}html pre.shiki code .sFkSl, html code.shiki .sFkSl{--shiki-light:#A31515;--shiki-default:#A31515;--shiki-dark:#E9F284}html pre.shiki code .sFB1V, html code.shiki .sFB1V{--shiki-light:#A31515;--shiki-default:#A31515;--shiki-dark:#F1FA8C}html pre.shiki code .sl46w, html code.shiki .sl46w{--shiki-light:#0000FF;--shiki-default:#0000FF;--shiki-dark:#FF79C6}html pre.shiki code .s3JHE, html code.shiki .s3JHE{--shiki-light:#0070C1;--shiki-default:#0070C1;--shiki-dark:#F8F8F2}html pre.shiki code .saOXh, html code.shiki .saOXh{--shiki-light:#000000;--shiki-default:#000000;--shiki-dark:#FF79C6}html pre.shiki code .sHOzp, html code.shiki .sHOzp{--shiki-light:#795E26;--shiki-default:#795E26;--shiki-dark:#50FA7B}html pre.shiki code .sjR7W, html code.shiki .sjR7W{--shiki-light:#0000FF;--shiki-default:#0000FF;--shiki-dark:#BD93F9}html pre.shiki code .spgvN, html code.shiki .spgvN{--shiki-light:#098658;--shiki-default:#098658;--shiki-dark:#BD93F9}html pre.shiki code .sakC6, html code.shiki .sakC6{--shiki-light:#0000FF;--shiki-light-font-weight:inherit;--shiki-default:#0000FF;--shiki-default-font-weight:inherit;--shiki-dark:#FF79C6;--shiki-dark-font-weight:bold}html pre.shiki code .sygFZ, html code.shiki .sygFZ{--shiki-light:#001080;--shiki-light-font-style:inherit;--shiki-default:#001080;--shiki-default-font-style:inherit;--shiki-dark:#FFB86C;--shiki-dark-font-style:italic}html pre.shiki code .sFs1U, html code.shiki .sFs1U{--shiki-light:#267F99;--shiki-light-font-style:inherit;--shiki-default:#267F99;--shiki-default-font-style:inherit;--shiki-dark:#8BE9FD;--shiki-dark-font-style:italic}html pre.shiki code .sW-rI, html code.shiki .sW-rI{--shiki-light:#267F99;--shiki-light-font-style:inherit;--shiki-default:#267F99;--shiki-default-font-style:inherit;--shiki-dark:#FFB86C;--shiki-dark-font-style:italic}html pre.shiki code .s34zl, html code.shiki .s34zl{--shiki-light:#001080;--shiki-default:#001080;--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 .scd-l, html code.shiki .scd-l{--shiki-light:#800000;--shiki-default:#800000;--shiki-dark:#FF79C6}",{"title":871,"searchDepth":996,"depth":996,"links":2628},[2629,2633,2639],{"id":934,"depth":996,"text":935,"children":2630},[2631,2632],{"id":942,"depth":1002,"text":943},{"id":1939,"depth":1002,"text":1940},{"id":2470,"depth":996,"text":2471,"children":2634},[2635,2636,2637,2638],{"id":2477,"depth":1002,"text":2478},{"id":2495,"depth":1002,"text":2496},{"id":2513,"depth":1002,"text":2514},{"id":2526,"depth":1002,"text":2527},{"id":2533,"depth":996,"text":2534,"children":2640},[2641,2642],{"id":2540,"depth":1002,"text":2541},{"id":2580,"depth":1002,"text":2581},"How to replace an API token with a fresh key.","md","i-lucide-refresh-cw",{},null,"---\ntitle: Rotation\ndescription: How to replace an API token with a fresh key.\nicon: i-lucide-refresh-cw\n---\n\nRotation replaces an existing API token with a fresh one. The system revokes\nthe old token first, then generates a new raw key so the caller can continue\nusing machine-to-machine access without keeping the previous credential active.\n\nWhen you rotate through the `privateActionManager` or the\n`POST \u002Fapi\u002Fmanage\u002Frotate`{lang=\"http\"} route, the new token inherits the\ncurrent token name, privilege, prefix, remaining expiration time, and existing\nIP restrictions. When you call `rotateApiKey` directly, you can override those\nattributes and choose whether to delete the old row after revocation.\n\n::caution\nRotation returns the new raw API key only once. Store it securely when the\nrequest succeeds.\n::\n\nYou can rotate a token in 3 ways:\n\n- Directly calling `rotateApiKey`.\n- Using the `privateActionManager` to validate ownership before rotating.\n- Calling the `POST \u002Fapi\u002Fmanage\u002Frotate`{lang=\"http\"} endpoint from an\n\tauthenticated client.\n\n::note\nFollow the [Creating Tokens](\u002Fdocs\u002Fiam\u002Fessentials\u002Fapi\u002Fcreation) docs to create\na token first before attempting to rotate it.\n::\n\n## Rotating Tokens\n\nYou can rotate tokens either directly in the library or through the\nroute. The direct helper gives you full control over the\nreplacement token attributes, while the route preserves the current token\nsettings and focuses on safe client-driven rotation.\n\n### Using the library\n\nTo rotate a token *directly*, you call `rotateApiKey`. This function revokes\nthe old token, optionally deletes its invalidated row, and creates a new token\nwith the privilege and attributes you provide.\n\n```ts [example.ts]\nimport { rotateApiKey } from '@riavzon\u002Fauth'\n\nconst results = await rotateApiKey(\n\toldToken,\n\t'restricted',\n\t'server token',\n\tfalse,\n\t['203.0.113.10'],\n\t1000 * 60 * 60,\n\t'api'\n)\n\nif (results.ok) {\n\tconsole.log(results.data.newRawToken)\n}\n```\n\nOn success you get back an object with:\n\n```ts\n{\n\tok: true,\n\tdate: new Date().toISOString(),\n\tdata: {\n\t\tmsg: 'Successfully rotated an api key',\n\t\tnewRawToken: 'api_xxx',\n\t\tnewExpiry: new Date('2026-05-01T12:00:00.000Z')\n\t}\n}\n```\n\nIf the new token does not have an expiration date, `newExpiry` is `null`.\n\n::warning\nWhen Expiry is null NO expiry will be checked in the verification process.\n::\n\nOn error, `rotateApiKey` returns the branch that failed:\n\nIf `revokeApiKey` reports that the token is already invalid, rotation stops and\nreturns:\n\n```ts\n{\n\tok: false,\n\tdate: new Date().toISOString(),\n\treason: 'Cannot rotate revoked token'\n}\n```\n\nIf the revoke step fails for another reason, or if `deleteOnRotation` is\nenabled and the invalidated row cannot be deleted, rotation returns:\n\n```ts\n{\n\tok: false,\n\tdate: new Date().toISOString(),\n\treason: 'Token cannot be rotated this time'\n}\n```\n\nIf an unexpected exception is thrown inside `rotateApiKey`, the catch block\nreturns:\n\n```ts\n{\n\tok: false,\n\tdate: new Date().toISOString(),\n\treason: 'Server error rotating a token.'\n}\n```\n\nIf the token creation step fails after the old token is revoked, `rotateApiKey`\nforwards the reason returned by `createApiKey`. That usually means the user hit\nthe maximum token limit or the provided prefix is invalid.\n\n#### Signature\n\nThe direct helper exposes the following signature:\n\n```ts\nexport async function rotateApiKey(\n\t\trawOldToken: string,\n\t\tprivilegeType: 'demo' | 'restricted' | 'protected' | 'full' | 'custom',\n\t\tname: string,\n\t\tdeleteOnRotation?: boolean,\n\t\tipAddress?: string[],\n\t\texpires?: number,\n\t\tprefix?: string\n): Promise\u003CResults\u003CApiTokenRotationSuccess>>\n```\n\n#### Parameters\n\nThe rotation helper accepts the following parameters:\n\n| Field | Type | Description |\n|---|---|---|\n| `rawOldToken` | `string` | The current token to rotate. It can be hashed or *Raw*. |\n| `privilegeType` | `'demo' \\| 'restricted' \\| 'protected' \\| 'full' \\| 'custom'` | The privilege assigned to the current token and the replacement token. |\n| `name` | `string` | The name assigned to the new token record. |\n| `deleteOnRotation` | `boolean` | If `true`, the old token row is deleted after it is revoked. |\n| `ipAddress` | `string[] \\| undefined` | The IP restriction list assigned to the new token. |\n| `expires` | `number \\| undefined` | The TTL for the new token in milliseconds. |\n| `prefix` | `string` | The prefix used when generating the new raw token. |\n\n::warning\nThis action should be performed by a fully authenticated client.\n::\n\n::caution\nThis function does not validate a `publicIdentifier`, and it does not\nauthenticate the caller for you. Only call it directly in trusted server-side\ncode.\n::\n\n#### With the `privateActionManager`\n\nThe safest internal method is using the `privateActionManager`. This function\nvalidates the `publicIdentifier`, token id, token name, user id, and current\nvalid status before it dispatches the rotation.\n\n```ts [example.ts]\nconst rotationRes = await privateActionManager(\n\tuserId,\n\ttokenId,\n\tpublicIdentifier,\n\ttokenName,\n\t{ action: 'rotate' }\n)\n```\n\nWhen the manager rotates a token, it preserves the stored token attributes. It\npasses the current token name, prefix, remaining expiration time, and IP\nrestrictions to `rotateApiKey`, and it keeps `deleteOnRotation` set to `false`.\n\nThe `privateActionManager` returns the response of `rotateApiKey` directly.\nLearn more at the\n[introduction page](\u002Fdocs\u002Fiam\u002Fessentials\u002Fapi\u002Fmanagement#the-privateactionmanager).\n\n::note\nThe manager only selects rows where `valid = 1`. Because of that,\nrotation cannot rotate an already revoked token, and it returns\n`Bad Request` before it reaches `rotateApiKey`.\n::\n\n---\n\n### Using the route\n\nLet's say you want to rotate a token from your authenticated client or BFF.\n\n`POST \u002Fapi\u002Fmanage\u002Frotate`{lang=\"http\"} body:\n\n```json\n{\n\t\"tokenId\": 12,\n\t\"publicIdentifier\": \"public_identifier\",\n\t\"name\": \"the token name\"\n}\n```\n\nThe `name` field identifies the current token during ownership validation. The\nroute does not use it to rename the replacement token.\n\nOn success you will get the following response:\n\n```http\nHTTP\u002F1.1 200 OK\nContent-Type: application\u002Fjson; charset=utf-8\n\n{\n\t\"ok\": true,\n\t\"date\": \"current date\",\n\t\"data\": {\n\t\t\"msg\": \"Successfully rotated an api key\",\n\t\t\"newRawToken\": \"new raw token\",\n\t\t\"newExpiry\": \"current expiry or null\"\n\t}\n}\n```\n\nAside from the standard errors related to authentication, rate limits, and\nprovided bad data, the route returns the same success object the library users\nget when the manager finds a valid token and the rotation completes.\n\nIf the body does not match the schema, the route returns:\n\n```http\nHTTP\u002F1.1 400 Bad Request\nContent-Type: application\u002Fjson; charset=utf-8\n\n{\n\t\"ok\": false,\n\t\"date\": \"current date\",\n\t\"reason\": \"Bad Request\"\n}\n```\n\n\nIf the `publicIdentifier` checksum is invalid, the route returns `Invalid identity`.\n\nIf the manager cannot match a currently valid token for the given `tokenId`, `publicIdentifier`, `name`, and `userId`, it returns `Bad Request`. That also means the token is already revoked, belongs to a different user, or the body does not point to an active row.\n\nIf the manager finds the token but the underlying rotation action fails, the\nroute forwards the reason returned by `rotateApiKey`, such as\n`Token cannot be rotated this time`, a `createApiKey` validation reason, or\n`Server error rotating a token.`:\n\n```http\nHTTP\u002F1.1 400 Bad Request\nContent-Type: application\u002Fjson; charset=utf-8\n\n{\n\t\"ok\": false,\n\t\"date\": \"current date\",\n\t\"reason\": \"reason from privateActionManager or rotateApiKey\"\n}\n```\n\n::note\nCheck the [introduction page](\u002Fdocs\u002Fiam\u002Fessentials\u002Fapi\u002Fmanagement#service) to\nsee the standard error response.\n::\n\n#### Rate Limits\n\nThe endpoint also enforces rate limits controlled under the following\nconfiguration options:\n\n- `rate_limiters.apiTokensLimiters.operationRateLimits.rotationRateLimiter` -\n\tThe main limiter for the rotation endpoint. The default allows 5 rotations in\n\ta window of 10 minutes and will trigger a block for 2 hours if this limit is\n\tmet. Consecutive triggers in this period will block the client permanently.\n\n- `rate_limiters.apiTokensLimiters.generalUnionLimiter` - A `burstLimiter` and\n\ta `slowLimiter`\n\t[union limiter](https:\u002F\u002Fgithub.com\u002Fanimir\u002Fnode-rate-limiter-flexible\u002Fwiki\u002FRateLimiterUnion).\n\tIt enforces no more than one request per second, and only 50 per minute. No\n\tconsecutive triggers in this limiter are provided, and triggering it again\n\twill result in a permanent ban. The limiter is *restarted* on successful\n\trotations.\n\t- `burstLimiter` - Will block the client for 15 minutes.\n\t- `slowLimiter` - Will block for 1 hour.\n\n## Rotation Process\n\nRotation uses a controlled replace workflow so the old credential stops working\nbefore the new one becomes active.\n\n### Revoke the current token\n\nThe direct helper starts by calling `revokeApiKey` for the current token and\nprivilege. If this step fails because the token is already revoked,\n`rotateApiKey` returns `Cannot rotate revoked token`. If the revoke step fails\nfor another reason, it returns `Token cannot be rotated this time`.\n\n### Optionally delete the old row\n\nWhen `deleteOnRotation` is `true`, `rotateApiKey` deletes the invalidated row\nfrom `api_tokens` after revocation. The route does not enable\nthis option, so the old row stays in the database by default.\n\n### Create the replacement token\n\nAfter the old token is invalid, the helper calls `createApiKey` to generate the\nreplacement. When you call `rotateApiKey` directly, the new token uses the\nattributes you provide. When you rotate through the manager or route, the new\ntoken inherits the current token privilege, name, prefix, remaining expiration,\nand IP restrictions.\n\n### Return the new credential\n\nWhen rotation succeeds, the API returns the new raw token and the new expiry\ntimestamp. The old token remains invalid, and the new raw token is only exposed\nin that success response.\n\n## Configuration Reference\n\nThese configuration keys control rotate-specific throttling in the service.\n\n### Rate limiters\n\nThe rotation flow relies on the following limiter configuration:\n\n| Limiter | Description |\n|---|---|\n| `rate_limiters.apiTokensLimiters.operationRateLimits.rotationRateLimiter` | The main rate limiter for the rotation endpoint |\n| `rate_limiters.apiTokensLimiters.generalUnionLimiter` | General burst limiter |\n\n---\n\n### Metadata returned on success\n\n| Field | Description |\n|---|---|\n| `msg` | Success message returned by the rotation helper |\n| `newRawToken` | The newly generated raw API token |\n| `newExpiry` | The expiration timestamp for the new token, or `null` |\n",{"title":195,"description":2643},"Cp6cPcUv5u5UKCXI_T2cXu84whRI5KGrI0oAaELOb-o",[2652,2653],{"title":191,"path":192,"stem":193,"children":-1},{"title":199,"path":200,"stem":201,"children":-1},{"id":851,"title":195,"body":2655,"description":2643,"extension":2644,"icon":2645,"meta":4064,"module":2647,"navigation":8,"path":196,"rawbody":2648,"seo":4065,"stem":197,"__hash__":2650},{"type":853,"value":2656,"toc":4048},[2657,2659,2671,2675,2677,2695,2701,2703,2705,2707,2713,2867,2869,2953,2959,2963,2967,2971,3015,3019,3063,3067,3111,3117,3119,3121,3259,3261,3263,3365,3369,3375,3379,3385,3447,3455,3463,3473,3475,3477,3479,3487,3547,3551,3553,3689,3691,3693,3777,3783,3795,3805,3889,3895,3897,3899,3928,3930,3932,3934,3944,3946,3956,3958,3964,3966,3968,3970,3972,3974,3976,4004,4006,4008,4046],[856,2658,858],{},[856,2660,861,2661,866,2663,881,2669,885],{},[863,2662,865],{},[863,2664,2665,2667],{"className":869,"language":870,"style":871},[873,2666,876],{"class":875},[873,2668,880],{"class":879},[863,2670,884],{},[887,2672,2673],{},[856,2674,891],{},[856,2676,894],{},[896,2678,2679,2683,2687],{},[899,2680,901,2681,904],{},[863,2682,884],{},[899,2684,907,2685,910],{},[863,2686,865],{},[899,2688,913,2689,920],{},[863,2690,2691,2693],{"className":869,"language":870,"style":871},[873,2692,876],{"class":875},[873,2694,880],{"class":879},[922,2696,2697],{},[856,2698,926,2699,930],{},[928,2700,173],{"href":174},[932,2702,935],{"id":934},[856,2704,938],{},[940,2706,943],{"id":942},[856,2708,946,2709,951,2711,954],{},[948,2710,950],{},[863,2712,884],{},[956,2714,2715],{"className":958,"code":959,"filename":960,"language":961,"meta":871,"style":871},[863,2716,2717,2735,2739,2753,2759,2769,2779,2785,2797,2811,2819,2823,2827,2841,2863],{"__ignoreMap":871},[873,2718,2719,2721,2723,2725,2727,2729,2731,2733],{"class":966,"line":967},[873,2720,970],{"class":875},[873,2722,973],{"class":879},[873,2724,884],{"class":976},[873,2726,979],{"class":879},[873,2728,982],{"class":875},[873,2730,986],{"class":985},[873,2732,990],{"class":989},[873,2734,993],{"class":985},[873,2736,2737],{"class":966,"line":996},[873,2738,999],{"emptyLinePlaceholder":8},[873,2740,2741,2743,2745,2747,2749,2751],{"class":966,"line":1002},[873,2742,1006],{"class":1005},[873,2744,1010],{"class":1009},[873,2746,1014],{"class":1013},[873,2748,1017],{"class":875},[873,2750,1021],{"class":1020},[873,2752,1024],{"class":879},[873,2754,2755,2757],{"class":966,"line":1027},[873,2756,1030],{"class":976},[873,2758,1033],{"class":879},[873,2760,2761,2763,2765,2767],{"class":966,"line":1036},[873,2762,1039],{"class":985},[873,2764,1042],{"class":989},[873,2766,1045],{"class":985},[873,2768,1033],{"class":879},[873,2770,2771,2773,2775,2777],{"class":966,"line":1050},[873,2772,1039],{"class":985},[873,2774,1055],{"class":989},[873,2776,1045],{"class":985},[873,2778,1033],{"class":879},[873,2780,2781,2783],{"class":966,"line":1062},[873,2782,1066],{"class":1065},[873,2784,1033],{"class":879},[873,2786,2787,2789,2791,2793,2795],{"class":966,"line":1071},[873,2788,1074],{"class":879},[873,2790,1045],{"class":985},[873,2792,1079],{"class":989},[873,2794,1045],{"class":985},[873,2796,1084],{"class":879},[873,2798,2799,2801,2803,2805,2807,2809],{"class":966,"line":1087},[873,2800,1091],{"class":1090},[873,2802,1094],{"class":1013},[873,2804,1097],{"class":1090},[873,2806,1094],{"class":1013},[873,2808,1097],{"class":1090},[873,2810,1033],{"class":879},[873,2812,2813,2815,2817],{"class":966,"line":1106},[873,2814,1039],{"class":985},[873,2816,1111],{"class":989},[873,2818,993],{"class":985},[873,2820,2821],{"class":966,"line":1116},[873,2822,1119],{"class":879},[873,2824,2825],{"class":966,"line":1122},[873,2826,999],{"emptyLinePlaceholder":8},[873,2828,2829,2831,2833,2835,2837,2839],{"class":966,"line":1127},[873,2830,1130],{"class":875},[873,2832,1133],{"class":879},[873,2834,1136],{"class":976},[873,2836,904],{"class":879},[873,2838,1141],{"class":976},[873,2840,1144],{"class":879},[873,2842,2843,2845,2847,2849,2851,2853,2855,2857,2859,2861],{"class":966,"line":1147},[873,2844,1150],{"class":976},[873,2846,904],{"class":879},[873,2848,1155],{"class":1020},[873,2850,1158],{"class":879},[873,2852,1136],{"class":976},[873,2854,904],{"class":879},[873,2856,1165],{"class":976},[873,2858,904],{"class":879},[873,2860,1170],{"class":976},[873,2862,1119],{"class":879},[873,2864,2865],{"class":966,"line":1175},[873,2866,1178],{"class":879},[856,2868,1181],{},[956,2870,2871],{"className":958,"code":1184,"language":961,"meta":871,"style":871},[863,2872,2873,2877,2885,2899,2903,2915,2927,2945,2949],{"__ignoreMap":871},[873,2874,2875],{"class":966,"line":967},[873,2876,1191],{"class":879},[873,2878,2879,2881,2883],{"class":966,"line":996},[873,2880,1196],{"class":879},[873,2882,1199],{"class":1065},[873,2884,1033],{"class":879},[873,2886,2887,2889,2891,2893,2895,2897],{"class":966,"line":1002},[873,2888,1206],{"class":879},[873,2890,1210],{"class":1209},[873,2892,1213],{"class":1020},[873,2894,1216],{"class":879},[873,2896,1219],{"class":1020},[873,2898,1222],{"class":879},[873,2900,2901],{"class":966,"line":1027},[873,2902,1227],{"class":879},[873,2904,2905,2907,2909,2911,2913],{"class":966,"line":1036},[873,2906,1232],{"class":879},[873,2908,1045],{"class":985},[873,2910,1237],{"class":989},[873,2912,1045],{"class":985},[873,2914,1033],{"class":879},[873,2916,2917,2919,2921,2923,2925],{"class":966,"line":1050},[873,2918,1246],{"class":879},[873,2920,1045],{"class":985},[873,2922,1251],{"class":989},[873,2924,1045],{"class":985},[873,2926,1033],{"class":879},[873,2928,2929,2931,2933,2935,2937,2939,2941,2943],{"class":966,"line":1062},[873,2930,1260],{"class":879},[873,2932,1210],{"class":1209},[873,2934,1213],{"class":1020},[873,2936,1158],{"class":879},[873,2938,1045],{"class":985},[873,2940,1271],{"class":989},[873,2942,1045],{"class":985},[873,2944,1119],{"class":879},[873,2946,2947],{"class":966,"line":1071},[873,2948,1280],{"class":879},[873,2950,2951],{"class":966,"line":1087},[873,2952,1178],{"class":879},[856,2954,1287,2955,1291,2957,904],{},[863,2956,1290],{},[863,2958,1294],{},[1296,2960,2961],{},[856,2962,1300],{},[856,2964,1303,2965,1306],{},[863,2966,884],{},[856,2968,1309,2969,1313],{},[863,2970,1312],{},[956,2972,2973],{"className":958,"code":1316,"language":961,"meta":871,"style":871},[863,2974,2975,2979,2987,3001,3011],{"__ignoreMap":871},[873,2976,2977],{"class":966,"line":967},[873,2978,1191],{"class":879},[873,2980,2981,2983,2985],{"class":966,"line":996},[873,2982,1196],{"class":879},[873,2984,1329],{"class":1065},[873,2986,1033],{"class":879},[873,2988,2989,2991,2993,2995,2997,2999],{"class":966,"line":1002},[873,2990,1206],{"class":879},[873,2992,1210],{"class":1209},[873,2994,1213],{"class":1020},[873,2996,1216],{"class":879},[873,2998,1219],{"class":1020},[873,3000,1222],{"class":879},[873,3002,3003,3005,3007,3009],{"class":966,"line":1027},[873,3004,1350],{"class":879},[873,3006,1045],{"class":985},[873,3008,1355],{"class":989},[873,3010,993],{"class":985},[873,3012,3013],{"class":966,"line":1036},[873,3014,1178],{"class":879},[856,3016,1364,3017,1368],{},[863,3018,1367],{},[956,3020,3021],{"className":958,"code":1371,"language":961,"meta":871,"style":871},[863,3022,3023,3027,3035,3049,3059],{"__ignoreMap":871},[873,3024,3025],{"class":966,"line":967},[873,3026,1191],{"class":879},[873,3028,3029,3031,3033],{"class":966,"line":996},[873,3030,1196],{"class":879},[873,3032,1329],{"class":1065},[873,3034,1033],{"class":879},[873,3036,3037,3039,3041,3043,3045,3047],{"class":966,"line":1002},[873,3038,1206],{"class":879},[873,3040,1210],{"class":1209},[873,3042,1213],{"class":1020},[873,3044,1216],{"class":879},[873,3046,1219],{"class":1020},[873,3048,1222],{"class":879},[873,3050,3051,3053,3055,3057],{"class":966,"line":1027},[873,3052,1350],{"class":879},[873,3054,1045],{"class":985},[873,3056,1408],{"class":989},[873,3058,993],{"class":985},[873,3060,3061],{"class":966,"line":1036},[873,3062,1178],{"class":879},[856,3064,1417,3065,1420],{},[863,3066,884],{},[956,3068,3069],{"className":958,"code":1423,"language":961,"meta":871,"style":871},[863,3070,3071,3075,3083,3097,3107],{"__ignoreMap":871},[873,3072,3073],{"class":966,"line":967},[873,3074,1191],{"class":879},[873,3076,3077,3079,3081],{"class":966,"line":996},[873,3078,1196],{"class":879},[873,3080,1329],{"class":1065},[873,3082,1033],{"class":879},[873,3084,3085,3087,3089,3091,3093,3095],{"class":966,"line":1002},[873,3086,1206],{"class":879},[873,3088,1210],{"class":1209},[873,3090,1213],{"class":1020},[873,3092,1216],{"class":879},[873,3094,1219],{"class":1020},[873,3096,1222],{"class":879},[873,3098,3099,3101,3103,3105],{"class":966,"line":1027},[873,3100,1350],{"class":879},[873,3102,1045],{"class":985},[873,3104,1460],{"class":989},[873,3106,993],{"class":985},[873,3108,3109],{"class":966,"line":1036},[873,3110,1178],{"class":879},[856,3112,1469,3113,1472,3115,1476],{},[863,3114,884],{},[863,3116,1475],{},[1478,3118,1481],{"id":1480},[856,3120,1484],{},[956,3122,3123],{"className":958,"code":1487,"language":961,"meta":871,"style":871},[863,3124,3125,3137,3147,3193,3203,3213,3223,3233,3241],{"__ignoreMap":871},[873,3126,3127,3129,3131,3133,3135],{"class":966,"line":967},[873,3128,1494],{"class":875},[873,3130,1497],{"class":1005},[873,3132,1500],{"class":1005},[873,3134,1021],{"class":1020},[873,3136,1024],{"class":879},[873,3138,3139,3141,3143,3145],{"class":966,"line":996},[873,3140,1510],{"class":1509},[873,3142,1513],{"class":1013},[873,3144,1517],{"class":1516},[873,3146,1033],{"class":879},[873,3148,3149,3151,3153,3155,3157,3159,3161,3163,3165,3167,3169,3171,3173,3175,3177,3179,3181,3183,3185,3187,3189,3191],{"class":966,"line":1002},[873,3150,1524],{"class":1509},[873,3152,1513],{"class":1013},[873,3154,986],{"class":985},[873,3156,1531],{"class":989},[873,3158,1045],{"class":985},[873,3160,1536],{"class":1013},[873,3162,986],{"class":985},[873,3164,1042],{"class":989},[873,3166,1045],{"class":985},[873,3168,1536],{"class":1013},[873,3170,986],{"class":985},[873,3172,1549],{"class":989},[873,3174,1045],{"class":985},[873,3176,1536],{"class":1013},[873,3178,986],{"class":985},[873,3180,1558],{"class":989},[873,3182,1045],{"class":985},[873,3184,1536],{"class":1013},[873,3186,986],{"class":985},[873,3188,1567],{"class":989},[873,3190,1045],{"class":985},[873,3192,1033],{"class":879},[873,3194,3195,3197,3199,3201],{"class":966,"line":1027},[873,3196,1576],{"class":1509},[873,3198,1513],{"class":1013},[873,3200,1517],{"class":1516},[873,3202,1033],{"class":879},[873,3204,3205,3207,3209,3211],{"class":966,"line":1036},[873,3206,1587],{"class":1509},[873,3208,1590],{"class":1013},[873,3210,1593],{"class":1516},[873,3212,1033],{"class":879},[873,3214,3215,3217,3219,3221],{"class":966,"line":1050},[873,3216,1600],{"class":1509},[873,3218,1590],{"class":1013},[873,3220,1517],{"class":1516},[873,3222,1607],{"class":879},[873,3224,3225,3227,3229,3231],{"class":966,"line":1062},[873,3226,1612],{"class":1509},[873,3228,1590],{"class":1013},[873,3230,1617],{"class":1516},[873,3232,1033],{"class":879},[873,3234,3235,3237,3239],{"class":966,"line":1071},[873,3236,1624],{"class":1509},[873,3238,1590],{"class":1013},[873,3240,1629],{"class":1516},[873,3242,3243,3245,3247,3249,3251,3253,3255,3257],{"class":966,"line":1087},[873,3244,1634],{"class":879},[873,3246,1513],{"class":1013},[873,3248,1639],{"class":1516},[873,3250,1642],{"class":879},[873,3252,1646],{"class":1645},[873,3254,1642],{"class":879},[873,3256,1651],{"class":1645},[873,3258,1654],{"class":879},[1478,3260,1658],{"id":1657},[856,3262,1661],{},[1663,3264,3265,3275],{},[1666,3266,3267],{},[1669,3268,3269,3271,3273],{},[1672,3270,1674],{},[1672,3272,1677],{},[1672,3274,1680],{},[1682,3276,3277,3291,3303,3315,3329,3341,3353],{},[1669,3278,3279,3283,3287],{},[1687,3280,3281],{},[863,3282,1691],{},[1687,3284,3285],{},[863,3286,1696],{},[1687,3288,1699,3289,904],{},[948,3290,1702],{},[1669,3292,3293,3297,3301],{},[1687,3294,3295],{},[863,3296,1709],{},[1687,3298,3299],{},[863,3300,1714],{},[1687,3302,1717],{},[1669,3304,3305,3309,3313],{},[1687,3306,3307],{},[863,3308,1724],{},[1687,3310,3311],{},[863,3312,1696],{},[1687,3314,1731],{},[1669,3316,3317,3321,3325],{},[1687,3318,3319],{},[863,3320,1367],{},[1687,3322,3323],{},[863,3324,1742],{},[1687,3326,1309,3327,1747],{},[863,3328,1199],{},[1669,3330,3331,3335,3339],{},[1687,3332,3333],{},[863,3334,1754],{},[1687,3336,3337],{},[863,3338,1759],{},[1687,3340,1762],{},[1669,3342,3343,3347,3351],{},[1687,3344,3345],{},[863,3346,1769],{},[1687,3348,3349],{},[863,3350,1774],{},[1687,3352,1777],{},[1669,3354,3355,3359,3363],{},[1687,3356,3357],{},[863,3358,1784],{},[1687,3360,3361],{},[863,3362,1696],{},[1687,3364,1791],{},[1296,3366,3367],{},[856,3368,1796],{},[887,3370,3371],{},[856,3372,1801,3373,1805],{},[863,3374,1804],{},[1478,3376,1809,3377],{"id":1808},[863,3378,865],{},[856,3380,1814,3381,1817,3383,1820],{},[863,3382,865],{},[863,3384,1804],{},[956,3386,3387],{"className":958,"code":1823,"filename":960,"language":961,"meta":871,"style":871},[863,3388,3389,3403,3409,3415,3421,3427,3443],{"__ignoreMap":871},[873,3390,3391,3393,3395,3397,3399,3401],{"class":966,"line":967},[873,3392,1006],{"class":1005},[873,3394,1832],{"class":1009},[873,3396,1014],{"class":1013},[873,3398,1017],{"class":875},[873,3400,1839],{"class":1020},[873,3402,1024],{"class":879},[873,3404,3405,3407],{"class":966,"line":996},[873,3406,1846],{"class":976},[873,3408,1033],{"class":879},[873,3410,3411,3413],{"class":966,"line":1002},[873,3412,1853],{"class":976},[873,3414,1033],{"class":879},[873,3416,3417,3419],{"class":966,"line":1027},[873,3418,1860],{"class":976},[873,3420,1033],{"class":879},[873,3422,3423,3425],{"class":966,"line":1036},[873,3424,1867],{"class":976},[873,3426,1033],{"class":879},[873,3428,3429,3431,3433,3435,3437,3439,3441],{"class":966,"line":1050},[873,3430,1874],{"class":879},[873,3432,1877],{"class":976},[873,3434,1513],{"class":1880},[873,3436,986],{"class":985},[873,3438,1885],{"class":989},[873,3440,1045],{"class":985},[873,3442,1890],{"class":879},[873,3444,3445],{"class":966,"line":1062},[873,3446,1119],{"class":879},[856,3448,1897,3449,1900,3451,1903,3453,904],{},[863,3450,884],{},[863,3452,1367],{},[863,3454,1329],{},[856,3456,1908,3457,1911,3459,1914,3461,904],{},[863,3458,865],{},[863,3460,884],{},[928,3462,1918],{"href":1917},[922,3464,3465],{},[856,3466,1923,3467,1927,3469,1931,3471,904],{},[863,3468,1926],{},[863,3470,1930],{},[863,3472,884],{},[1935,3474],{},[940,3476,1940],{"id":1939},[856,3478,1943],{},[856,3480,3481,1952],{},[863,3482,3483,3485],{"className":869,"language":870,"style":871},[873,3484,876],{"class":875},[873,3486,880],{"class":879},[956,3488,3489],{"className":1955,"code":1956,"language":5,"meta":871,"style":871},[863,3490,3491,3495,3509,3527,3543],{"__ignoreMap":871},[873,3492,3493],{"class":966,"line":967},[873,3494,1191],{"class":879},[873,3496,3497,3499,3501,3503,3505,3507],{"class":966,"line":996},[873,3498,1968],{"class":1967},[873,3500,1972],{"class":1971},[873,3502,1975],{"class":1967},[873,3504,1513],{"class":1013},[873,3506,1980],{"class":1090},[873,3508,1033],{"class":879},[873,3510,3511,3513,3515,3517,3519,3521,3523,3525],{"class":966,"line":1002},[873,3512,1968],{"class":1967},[873,3514,1804],{"class":1971},[873,3516,1975],{"class":1967},[873,3518,1513],{"class":1013},[873,3520,1995],{"class":985},[873,3522,1998],{"class":989},[873,3524,1975],{"class":985},[873,3526,1033],{"class":879},[873,3528,3529,3531,3533,3535,3537,3539,3541],{"class":966,"line":1027},[873,3530,1968],{"class":1967},[873,3532,1724],{"class":1971},[873,3534,1975],{"class":1967},[873,3536,1513],{"class":1013},[873,3538,1995],{"class":985},[873,3540,2017],{"class":989},[873,3542,2020],{"class":985},[873,3544,3545],{"class":966,"line":1036},[873,3546,1178],{"class":879},[856,3548,1908,3549,2029],{},[863,3550,1724],{},[856,3552,2032],{},[956,3554,3555],{"className":869,"code":2035,"language":870,"meta":871,"style":871},[863,3556,3557,3569,3577,3581,3585,3599,3617,3629,3647,3665,3681,3685],{"__ignoreMap":871},[873,3558,3559,3561,3563,3565,3567],{"class":966,"line":967},[873,3560,2042],{"class":1005},[873,3562,2045],{"class":879},[873,3564,2048],{"class":1090},[873,3566,2051],{"class":1090},[873,3568,2054],{"class":989},[873,3570,3571,3573,3575],{"class":966,"line":996},[873,3572,2060],{"class":2059},[873,3574,1513],{"class":1005},[873,3576,2065],{"class":989},[873,3578,3579],{"class":966,"line":1002},[873,3580,999],{"emptyLinePlaceholder":8},[873,3582,3583],{"class":966,"line":1027},[873,3584,1191],{"class":879},[873,3586,3587,3589,3591,3593,3595,3597],{"class":966,"line":1036},[873,3588,1968],{"class":1967},[873,3590,1141],{"class":1971},[873,3592,1975],{"class":1967},[873,3594,1513],{"class":1013},[873,3596,2086],{"class":1065},[873,3598,1033],{"class":879},[873,3600,3601,3603,3605,3607,3609,3611,3613,3615],{"class":966,"line":1050},[873,3602,1968],{"class":1967},[873,3604,2095],{"class":1971},[873,3606,1975],{"class":1967},[873,3608,1513],{"class":1013},[873,3610,1995],{"class":985},[873,3612,2104],{"class":989},[873,3614,1975],{"class":985},[873,3616,1033],{"class":879},[873,3618,3619,3621,3623,3625,3627],{"class":966,"line":1062},[873,3620,1968],{"class":1967},[873,3622,1165],{"class":1971},[873,3624,1975],{"class":1967},[873,3626,1513],{"class":1013},[873,3628,2121],{"class":879},[873,3630,3631,3633,3635,3637,3639,3641,3643,3645],{"class":966,"line":1071},[873,3632,2126],{"class":1967},[873,3634,2129],{"class":1971},[873,3636,1975],{"class":1967},[873,3638,1513],{"class":1013},[873,3640,1995],{"class":985},[873,3642,1237],{"class":989},[873,3644,1975],{"class":985},[873,3646,1033],{"class":879},[873,3648,3649,3651,3653,3655,3657,3659,3661,3663],{"class":966,"line":1087},[873,3650,2126],{"class":1967},[873,3652,1170],{"class":1971},[873,3654,1975],{"class":1967},[873,3656,1513],{"class":1013},[873,3658,1995],{"class":985},[873,3660,2156],{"class":989},[873,3662,1975],{"class":985},[873,3664,1033],{"class":879},[873,3666,3667,3669,3671,3673,3675,3677,3679],{"class":966,"line":1106},[873,3668,2126],{"class":1967},[873,3670,1290],{"class":1971},[873,3672,1975],{"class":1967},[873,3674,1513],{"class":1013},[873,3676,1995],{"class":985},[873,3678,2175],{"class":989},[873,3680,2020],{"class":985},[873,3682,3683],{"class":966,"line":1116},[873,3684,1280],{"class":879},[873,3686,3687],{"class":966,"line":1122},[873,3688,1178],{"class":879},[856,3690,2188],{},[856,3692,2191],{},[956,3694,3695],{"className":869,"code":2194,"language":870,"meta":871,"style":871},[863,3696,3697,3709,3717,3721,3725,3739,3757,3773],{"__ignoreMap":871},[873,3698,3699,3701,3703,3705,3707],{"class":966,"line":967},[873,3700,2042],{"class":1005},[873,3702,2045],{"class":879},[873,3704,2048],{"class":1090},[873,3706,2207],{"class":1090},[873,3708,2210],{"class":989},[873,3710,3711,3713,3715],{"class":966,"line":996},[873,3712,2060],{"class":2059},[873,3714,1513],{"class":1005},[873,3716,2065],{"class":989},[873,3718,3719],{"class":966,"line":1002},[873,3720,999],{"emptyLinePlaceholder":8},[873,3722,3723],{"class":966,"line":1027},[873,3724,1191],{"class":879},[873,3726,3727,3729,3731,3733,3735,3737],{"class":966,"line":1036},[873,3728,1968],{"class":1967},[873,3730,1141],{"class":1971},[873,3732,1975],{"class":1967},[873,3734,1513],{"class":1013},[873,3736,2239],{"class":1065},[873,3738,1033],{"class":879},[873,3740,3741,3743,3745,3747,3749,3751,3753,3755],{"class":966,"line":1050},[873,3742,1968],{"class":1967},[873,3744,2095],{"class":1971},[873,3746,1975],{"class":1967},[873,3748,1513],{"class":1013},[873,3750,1995],{"class":985},[873,3752,2104],{"class":989},[873,3754,1975],{"class":985},[873,3756,1033],{"class":879},[873,3758,3759,3761,3763,3765,3767,3769,3771],{"class":966,"line":1062},[873,3760,1968],{"class":1967},[873,3762,2266],{"class":1971},[873,3764,1975],{"class":1967},[873,3766,1513],{"class":1013},[873,3768,1995],{"class":985},[873,3770,1930],{"class":989},[873,3772,2020],{"class":985},[873,3774,3775],{"class":966,"line":1071},[873,3776,1178],{"class":879},[856,3778,2283,3779,2286,3781,904],{},[863,3780,1804],{},[863,3782,2289],{},[856,3784,2292,3785,2295,3787,2295,3789,2300,3791,2304,3793,2307],{},[863,3786,1972],{},[863,3788,1804],{},[863,3790,1724],{},[863,3792,2303],{},[863,3794,1930],{},[856,3796,2310,3797,2313,3799,2316,3801,2319,3803,1513],{},[863,3798,884],{},[863,3800,1408],{},[863,3802,1475],{},[863,3804,1460],{},[956,3806,3807],{"className":869,"code":2324,"language":870,"meta":871,"style":871},[863,3808,3809,3821,3829,3833,3837,3851,3869,3885],{"__ignoreMap":871},[873,3810,3811,3813,3815,3817,3819],{"class":966,"line":967},[873,3812,2042],{"class":1005},[873,3814,2045],{"class":879},[873,3816,2048],{"class":1090},[873,3818,2207],{"class":1090},[873,3820,2210],{"class":989},[873,3822,3823,3825,3827],{"class":966,"line":996},[873,3824,2060],{"class":2059},[873,3826,1513],{"class":1005},[873,3828,2065],{"class":989},[873,3830,3831],{"class":966,"line":1002},[873,3832,999],{"emptyLinePlaceholder":8},[873,3834,3835],{"class":966,"line":1027},[873,3836,1191],{"class":879},[873,3838,3839,3841,3843,3845,3847,3849],{"class":966,"line":1036},[873,3840,1968],{"class":1967},[873,3842,1141],{"class":1971},[873,3844,1975],{"class":1967},[873,3846,1513],{"class":1013},[873,3848,2239],{"class":1065},[873,3850,1033],{"class":879},[873,3852,3853,3855,3857,3859,3861,3863,3865,3867],{"class":966,"line":1050},[873,3854,1968],{"class":1967},[873,3856,2095],{"class":1971},[873,3858,1975],{"class":1967},[873,3860,1513],{"class":1013},[873,3862,1995],{"class":985},[873,3864,2104],{"class":989},[873,3866,1975],{"class":985},[873,3868,1033],{"class":879},[873,3870,3871,3873,3875,3877,3879,3881,3883],{"class":966,"line":1062},[873,3872,1968],{"class":1967},[873,3874,2266],{"class":1971},[873,3876,1975],{"class":1967},[873,3878,1513],{"class":1013},[873,3880,1995],{"class":985},[873,3882,2401],{"class":989},[873,3884,2020],{"class":985},[873,3886,3887],{"class":966,"line":1071},[873,3888,1178],{"class":879},[922,3890,3891],{},[856,3892,2412,3893,2416],{},[928,3894,1918],{"href":2415},[1478,3896,2420],{"id":2419},[856,3898,2423],{},[896,3900,3901,3905],{},[899,3902,3903,2431],{},[863,3904,2430],{},[899,3906,3907,2437,3909,2441,3911,3913,2451,3916,2455,3918],{},[863,3908,2436],{},[863,3910,2440],{},[863,3912,2444],{},[928,3914,2450],{"href":2447,"rel":3915},[2449],[948,3917,2454],{},[896,3919,3920,3924],{},[899,3921,3922,2462],{},[863,3923,2440],{},[899,3925,3926,2467],{},[863,3927,2444],{},[932,3929,2471],{"id":2470},[856,3931,2474],{},[940,3933,2478],{"id":2477},[856,3935,2481,3936,2484,3938,2487,3940,2490,3942,904],{},[863,3937,1312],{},[863,3939,884],{},[863,3941,1355],{},[863,3943,1408],{},[940,3945,2496],{"id":2495},[856,3947,2499,3948,1291,3950,2295,3952,2506,3954,2510],{},[863,3949,1367],{},[863,3951,1199],{},[863,3953,884],{},[863,3955,2509],{},[940,3957,2514],{"id":2513},[856,3959,2517,3960,2520,3962,2523],{},[863,3961,1475],{},[863,3963,884],{},[940,3965,2527],{"id":2526},[856,3967,2530],{},[932,3969,2534],{"id":2533},[856,3971,2537],{},[940,3973,2541],{"id":2540},[856,3975,2544],{},[1663,3977,3978,3986],{},[1666,3979,3980],{},[1669,3981,3982,3984],{},[1672,3983,2553],{},[1672,3985,1680],{},[1682,3987,3988,3996],{},[1669,3989,3990,3994],{},[1687,3991,3992],{},[863,3993,2430],{},[1687,3995,2566],{},[1669,3997,3998,4002],{},[1687,3999,4000],{},[863,4001,2436],{},[1687,4003,2575],{},[1935,4005],{},[940,4007,2581],{"id":2580},[1663,4009,4010,4018],{},[1666,4011,4012],{},[1669,4013,4014,4016],{},[1672,4015,1674],{},[1672,4017,1680],{},[1682,4019,4020,4028,4036],{},[1669,4021,4022,4026],{},[1687,4023,4024],{},[863,4025,2129],{},[1687,4027,2602],{},[1669,4029,4030,4034],{},[1687,4031,4032],{},[863,4033,1170],{},[1687,4035,2611],{},[1669,4037,4038,4042],{},[1687,4039,4040],{},[863,4041,1290],{},[1687,4043,2620,4044],{},[863,4045,1294],{},[2624,4047,2626],{},{"title":871,"searchDepth":996,"depth":996,"links":4049},[4050,4054,4060],{"id":934,"depth":996,"text":935,"children":4051},[4052,4053],{"id":942,"depth":1002,"text":943},{"id":1939,"depth":1002,"text":1940},{"id":2470,"depth":996,"text":2471,"children":4055},[4056,4057,4058,4059],{"id":2477,"depth":1002,"text":2478},{"id":2495,"depth":1002,"text":2496},{"id":2513,"depth":1002,"text":2514},{"id":2526,"depth":1002,"text":2527},{"id":2533,"depth":996,"text":2534,"children":4061},[4062,4063],{"id":2540,"depth":1002,"text":2541},{"id":2580,"depth":1002,"text":2581},{},{"title":195,"description":2643},1780436286339]