[{"data":1,"prerenderedAt":2563},["ShallowReactive",2],{"navLinks":3,"sidebar_docs_navigation_\u002Fdocs\u002Fiam":64,"navigation":257,"navLinks_footer":837,"\u002Fdocs\u002Fiam\u002Fessentials\u002Fapi\u002Fmanagement_page":850,"\u002Fdocs\u002Fiam\u002Fessentials\u002Fapi\u002Fmanagement_surround":1840,"\u002Fdocs\u002Fiam\u002Fessentials\u002Fapi\u002Fmanagement":1843},{"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":181,"body":852,"description":1832,"extension":1833,"icon":1834,"meta":1835,"module":1836,"navigation":8,"path":182,"rawbody":1837,"seo":1838,"stem":183,"__hash__":1839},"docs\u002Fdocs\u002Fiam\u002F01.essentials\u002F21.api\u002F02.management\u002Findex.md",{"type":853,"value":854,"toc":1819},"minimark",[855,859,862,888,891,946,949,956,962,968,971,975,982,987,995,999,1117,1121,1221,1225,1228,1236,1243,1247,1250,1271,1275,1280,1286,1289,1352,1355,1404,1407,1453,1466,1478,1482,1506,1513,1520,1523,1526,1529,1638,1641,1693,1696,1777,1779,1783,1815],[856,857,858],"p",{},"The IAM service provide a full life cycle to manage api keys, getting metadata or setting new privileges to a token.",[856,860,861],{},"The actions that are available are:",[863,864,865,869,872,879,882,885],"ul",{},[866,867,868],"li",{},"Revocation - Revoking a token",[866,870,871],{},"Rotation - Revoking the provided token and generating a new one",[866,873,874,875],{},"Update IP - Updating the ip restriction list to remove and address or add new one for the ",[876,877,878],"a",{"href":178},"verification process",[866,880,881],{},"Privilege - Updating the privilege for a given token.",[866,883,884],{},"Metadata - Fetches extensive audit logs.",[866,886,887],{},"List - Getting a list of tokens metadata and counts for a given user",[856,889,890],{},"For the service users, the actions is behind a full authentication flow, each needs to succeeded before an action can be performed:",[863,892,893,900,906,912,918,924,934,940],{},[866,894,895,899],{},[896,897,898],"code",{},"requireAccessToken"," Requires the access token header to be present",[866,901,902,905],{},[896,903,904],{},"requireRefreshToken"," Requires the refresh token to be present",[866,907,908,911],{},[896,909,910],{},"getFingerPrint"," Gets the finger prints for MFA",[866,913,914,917],{},[896,915,916],{},"checkForActiveMfa"," MFA cache",[866,919,920,923],{},[896,921,922],{},"protectRoute"," Enforces authentication, and perform the 9 mfa checks,",[866,925,926,929,930,933],{},[896,927,928],{},"contentType('application\u002Fjson')"," Enforces ",[896,931,932],{},"application\u002Fjson",",",[866,935,936,939],{},[896,937,938],{},"express.json"," To limit the body size to 1kb",[866,941,942,945],{},[896,943,944],{},"apiTokensController"," The actions happens here",[856,947,948],{},"If the client is not authenticate, cannot be found, have an active MFA, the actions will fail, with the appropriate response.",[856,950,951,952,955],{},"For the library users you call the ",[896,953,954],{},"privateActionManager"," for all actions except from the List actions, to enforce the same security as the routes. You can also however call it's underlying methods directly for custom use cases.",[957,958,959],"caution",{},[856,960,961],{},"No authentication is enforces in these actions when you use the library.",[963,964,965],"warning",{},[856,966,967],{},"Never pass untrusted data to these actions.",[969,970],"hr",{},[972,973,51],"h2",{"id":974},"library",[976,977,979,980],"h3",{"id":978},"the-privateactionmanager","The ",[896,981,954],{},[856,983,979,984,986],{},[896,985,954],{}," acts as the high-level coordinator for all dashboard driven token operations. It serves as a security layer between the user’s intent and the cryptographic operations required to modify or rotate API keys.",[856,988,989,990,994],{},"Instead of the client interacting with raw, hashed tokens directly, the manager uses a ",[991,992,993],"em",{},"Public Identifier",", a non sensitive key, to locate the correct record and ensure the authenticated user actually owns the resource they are trying to modify.",[976,996,998],{"id":997},"signature","Signature",[1000,1001,1006],"pre",{"className":1002,"code":1003,"language":1004,"meta":1005,"style":1005},"language-ts shiki shiki-themes light-plus light-plus dracula","async function privateActionManager(\n    userId: number,\n    tokenId: number,\n    publicIdentifier: string,\n    name: string,\n    options: ActionArgs,\n): Promise\u003CActionManagerResult>\n","ts","",[896,1007,1008,1028,1046,1058,1071,1083,1096],{"__ignoreMap":1005},[1009,1010,1013,1017,1020,1024],"span",{"class":1011,"line":1012},"line",1,[1009,1014,1016],{"class":1015},"sl46w","async",[1009,1018,1019],{"class":1015}," function",[1009,1021,1023],{"class":1022},"sHOzp"," privateActionManager",[1009,1025,1027],{"class":1026},"sDd4n","(\n",[1009,1029,1031,1035,1039,1043],{"class":1011,"line":1030},2,[1009,1032,1034],{"class":1033},"sygFZ","    userId",[1009,1036,1038],{"class":1037},"saOXh",":",[1009,1040,1042],{"class":1041},"sFs1U"," number",[1009,1044,1045],{"class":1026},",\n",[1009,1047,1049,1052,1054,1056],{"class":1011,"line":1048},3,[1009,1050,1051],{"class":1033},"    tokenId",[1009,1053,1038],{"class":1037},[1009,1055,1042],{"class":1041},[1009,1057,1045],{"class":1026},[1009,1059,1061,1064,1066,1069],{"class":1011,"line":1060},4,[1009,1062,1063],{"class":1033},"    publicIdentifier",[1009,1065,1038],{"class":1037},[1009,1067,1068],{"class":1041}," string",[1009,1070,1045],{"class":1026},[1009,1072,1074,1077,1079,1081],{"class":1011,"line":1073},5,[1009,1075,1076],{"class":1033},"    name",[1009,1078,1038],{"class":1037},[1009,1080,1068],{"class":1041},[1009,1082,1045],{"class":1026},[1009,1084,1086,1089,1091,1094],{"class":1011,"line":1085},6,[1009,1087,1088],{"class":1033},"    options",[1009,1090,1038],{"class":1037},[1009,1092,1093],{"class":1041}," ActionArgs",[1009,1095,1045],{"class":1026},[1009,1097,1099,1102,1104,1107,1110,1114],{"class":1011,"line":1098},7,[1009,1100,1101],{"class":1026},")",[1009,1103,1038],{"class":1037},[1009,1105,1106],{"class":1041}," Promise",[1009,1108,1109],{"class":1026},"\u003C",[1009,1111,1113],{"class":1112},"sW-rI","ActionManagerResult",[1009,1115,1116],{"class":1026},">\n",[976,1118,1120],{"id":1119},"parameters","Parameters",[1122,1123,1124,1140],"table",{},[1125,1126,1127],"thead",{},[1128,1129,1130,1134,1137],"tr",{},[1131,1132,1133],"th",{},"Parameter",[1131,1135,1136],{},"Type",[1131,1138,1139],{},"Description",[1141,1142,1143,1159,1173,1188,1202],"tbody",{},[1128,1144,1145,1151,1156],{},[1146,1147,1148],"td",{},[896,1149,1150],{},"userId",[1146,1152,1153],{},[896,1154,1155],{},"number",[1146,1157,1158],{},"The ID of the authenticated user.",[1128,1160,1161,1166,1170],{},[1146,1162,1163],{},[896,1164,1165],{},"tokenId",[1146,1167,1168],{},[896,1169,1155],{},[1146,1171,1172],{},"The internal database ID of the token being managed.",[1128,1174,1175,1180,1185],{},[1146,1176,1177],{},[896,1178,1179],{},"publicIdentifier",[1146,1181,1182],{},[896,1183,1184],{},"string",[1146,1186,1187],{},"The public key used to identify the token safely.",[1128,1189,1190,1195,1199],{},[1146,1191,1192],{},[896,1193,1194],{},"name",[1146,1196,1197],{},[896,1198,1184],{},[1146,1200,1201],{},"The friendly name assigned to the token.",[1128,1203,1204,1209,1214],{},[1146,1205,1206],{},[896,1207,1208],{},"options",[1146,1210,1211],{},[896,1212,1213],{},"ActionArgs",[1146,1215,1216,1217,1220],{},"An object containing the ",[896,1218,1219],{},"action"," type and any associated payload.",[976,1222,1224],{"id":1223},"behavior","Behavior",[856,1226,1227],{},"The manager performs a three-step process before executing any action to prevent unauthorized access:",[863,1229,1230,1233],{},[866,1231,1232],{},"Checksum Validation: It first validates the publicIdentifier format and checksum. If the identifier is malformed, the request is dropped before querying the database.",[866,1234,1235],{},"It executes a query that requires five points of data to match: id, user_id, name, public_identifier, and a valid = 1 status.",[856,1237,1238,1239,1242],{},"Once identity is confirmed, it extracts the ",[896,1240,1241],{},"api_token"," hash from the database and dispatches it to the specific utility (revoke, rotate, etcetera).",[976,1244,1246],{"id":1245},"supported-actions","Supported Actions",[856,1248,1249],{},"The manager handles five distinct lifecycle actions through the options argument:",[863,1251,1252,1255,1262,1265,1268],{},[866,1253,1254],{},"revoke: Marks the token as invalid. No further requests using this key will be accepted by the verification process.",[866,1256,1257,1258,1261],{},"rotate: An atomic ",[991,1259,1260],{},"replace"," operation. It generates a new raw key while inheriting the attributes of the old one. Same prefix, remaining expiry, and existing IP restrictions.",[866,1263,1264],{},"metadata: Returns extensive audit data, including when the token was last used and total usage counts.",[866,1266,1267],{},"ip-restriction-update: Updates the whitelist of IP addresses allowed to use the token.",[866,1269,1270],{},"privilege-update: Modifies the privileges of the token.",[976,1272,1274],{"id":1273},"return-type","Return type",[856,1276,1277,1279],{},[896,1278,954],{}," returns the response of the underlying functions, even it these actions fails. Explore the docs to learn more.",[856,1281,1282,1283,1285],{},"When ",[896,1284,954],{}," its self fails, it returns the following:",[856,1287,1288],{},"Checksum validations failure:",[1000,1290,1292],{"className":1002,"code":1291,"language":1004,"meta":1005,"style":1005},"{\n  ok: false,\n  date: new Date().toISOString(),\n  reason: 'Invalid identity'\n}\n",[896,1293,1294,1299,1310,1331,1347],{"__ignoreMap":1005},[1009,1295,1296],{"class":1011,"line":1012},[1009,1297,1298],{"class":1026},"{\n",[1009,1300,1301,1304,1308],{"class":1011,"line":1030},[1009,1302,1303],{"class":1026},"  ok: ",[1009,1305,1307],{"class":1306},"sjR7W","false",[1009,1309,1045],{"class":1026},[1009,1311,1312,1315,1319,1322,1325,1328],{"class":1011,"line":1048},[1009,1313,1314],{"class":1026},"  date: ",[1009,1316,1318],{"class":1317},"sakC6","new",[1009,1320,1321],{"class":1022}," Date",[1009,1323,1324],{"class":1026},"().",[1009,1326,1327],{"class":1022},"toISOString",[1009,1329,1330],{"class":1026},"(),\n",[1009,1332,1333,1336,1340,1344],{"class":1011,"line":1060},[1009,1334,1335],{"class":1026},"  reason: ",[1009,1337,1339],{"class":1338},"sFkSl","'",[1009,1341,1343],{"class":1342},"sFB1V","Invalid identity",[1009,1345,1346],{"class":1338},"'\n",[1009,1348,1349],{"class":1011,"line":1073},[1009,1350,1351],{"class":1026},"}\n",[856,1353,1354],{},"When the query resulted in 0 rows, or when the provided action is not found:",[1000,1356,1358],{"className":1002,"code":1357,"language":1004,"meta":1005,"style":1005},"{\n ok: false,\n date: new Date().toISOString(),\n reason: 'Bad Request'\n}\n",[896,1359,1360,1364,1373,1388,1400],{"__ignoreMap":1005},[1009,1361,1362],{"class":1011,"line":1012},[1009,1363,1298],{"class":1026},[1009,1365,1366,1369,1371],{"class":1011,"line":1030},[1009,1367,1368],{"class":1026}," ok: ",[1009,1370,1307],{"class":1306},[1009,1372,1045],{"class":1026},[1009,1374,1375,1378,1380,1382,1384,1386],{"class":1011,"line":1048},[1009,1376,1377],{"class":1026}," date: ",[1009,1379,1318],{"class":1317},[1009,1381,1321],{"class":1022},[1009,1383,1324],{"class":1026},[1009,1385,1327],{"class":1022},[1009,1387,1330],{"class":1026},[1009,1389,1390,1393,1395,1398],{"class":1011,"line":1060},[1009,1391,1392],{"class":1026}," reason: ",[1009,1394,1339],{"class":1338},[1009,1396,1397],{"class":1342},"Bad Request",[1009,1399,1346],{"class":1338},[1009,1401,1402],{"class":1011,"line":1073},[1009,1403,1351],{"class":1026},[856,1405,1406],{},"Database failure:",[1000,1408,1410],{"className":1002,"code":1409,"language":1004,"meta":1005,"style":1005},"{\n  ok: false,\n  date: new Date().toISOString(),\n  reason: 'Server Error'\n}\n\n",[896,1411,1412,1416,1424,1438,1449],{"__ignoreMap":1005},[1009,1413,1414],{"class":1011,"line":1012},[1009,1415,1298],{"class":1026},[1009,1417,1418,1420,1422],{"class":1011,"line":1030},[1009,1419,1303],{"class":1026},[1009,1421,1307],{"class":1306},[1009,1423,1045],{"class":1026},[1009,1425,1426,1428,1430,1432,1434,1436],{"class":1011,"line":1048},[1009,1427,1314],{"class":1026},[1009,1429,1318],{"class":1317},[1009,1431,1321],{"class":1022},[1009,1433,1324],{"class":1026},[1009,1435,1327],{"class":1022},[1009,1437,1330],{"class":1026},[1009,1439,1440,1442,1444,1447],{"class":1011,"line":1060},[1009,1441,1335],{"class":1026},[1009,1443,1339],{"class":1338},[1009,1445,1446],{"class":1342},"Server Error",[1009,1448,1346],{"class":1338},[1009,1450,1451],{"class":1011,"line":1073},[1009,1452,1351],{"class":1026},[963,1454,1455],{},[856,1456,1457,1458,1461,1462,1465],{},"While the manager is the primary way to handle dashboard actions, it relies on the ",[876,1459,1460],{"href":132},"BFF"," (Backend for Frontend) to provide the correct publicIdentifier. This prevents the browser from ever needing to ",[991,1463,1464],{},"know"," or store internal token hashes.",[1467,1468,1469],"note",{},[856,1470,979,1471,1473,1474,1477],{},[896,1472,1179],{}," is generated with the api token in the ",[876,1475,1476],{"href":174},"creation step",".",[972,1479,1481],{"id":1480},"service","Service",[856,1483,1484,1485,1488,1489,1492,1493,1498,1499,1501,1502,1505],{},"As mentioned above, to perform any action, your client needs to be fully authenticated, with a valid ",[876,1486,1487],{"href":92},"refresh token"," a valid ",[876,1490,1491],{"href":88},"access token"," and a ",[876,1494,1495],{"href":84},[896,1496,1497],{},"canary_id"," cookie.\nThe session also should not have any active ",[876,1500,123],{"href":124}," or ",[876,1503,1504],{"href":96},"anomaly"," associated with it.",[856,1507,1508,1509,1512],{},"Each actions enforces the full ",[876,1510,1511],{"href":78},"authentication"," life-cycle before it perform any actions.",[856,1514,1515,1516,1519],{},"How ever every endpoint haves a different path, rate limiters, methods and a different body shape for ",[896,1517,1518],{},"POST"," requests.",[856,1521,1522],{},"Explore the logs below to learn how to perform an action.",[856,1524,1525],{},"Some of the failure response are identical for all actions, which are the following:",[856,1527,1528],{},"If the body is not valid or missing required values 400 will be returned:",[1000,1530,1534],{"className":1531,"code":1532,"language":1533,"meta":1005,"style":1005},"language-http shiki shiki-themes light-plus light-plus dracula","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","http",[896,1535,1536,1554,1565,1570,1574,1594,1615,1633],{"__ignoreMap":1005},[1009,1537,1538,1541,1544,1548,1551],{"class":1011,"line":1012},[1009,1539,1540],{"class":1015},"HTTP",[1009,1542,1543],{"class":1026},"\u002F",[1009,1545,1547],{"class":1546},"spgvN","1.1",[1009,1549,1550],{"class":1546}," 400",[1009,1552,1553],{"class":1342}," Bad request\n",[1009,1555,1556,1560,1562],{"class":1011,"line":1030},[1009,1557,1559],{"class":1558},"scd-l","Content-Type",[1009,1561,1038],{"class":1015},[1009,1563,1564],{"class":1342}," application\u002Fjson; charset=utf-8\n",[1009,1566,1567],{"class":1011,"line":1048},[1009,1568,1569],{"emptyLinePlaceholder":8},"\n",[1009,1571,1572],{"class":1011,"line":1060},[1009,1573,1298],{"class":1026},[1009,1575,1576,1580,1584,1587,1589,1592],{"class":1011,"line":1073},[1009,1577,1579],{"class":1578},"saJyd","  \"",[1009,1581,1583],{"class":1582},"s_W10","ok",[1009,1585,1586],{"class":1578},"\"",[1009,1588,1038],{"class":1037},[1009,1590,1591],{"class":1306}," false",[1009,1593,1045],{"class":1026},[1009,1595,1596,1598,1601,1603,1605,1608,1611,1613],{"class":1011,"line":1085},[1009,1597,1579],{"class":1578},[1009,1599,1600],{"class":1582},"date",[1009,1602,1586],{"class":1578},[1009,1604,1038],{"class":1037},[1009,1606,1607],{"class":1338}," \"",[1009,1609,1610],{"class":1342},"current date",[1009,1612,1586],{"class":1338},[1009,1614,1045],{"class":1026},[1009,1616,1617,1619,1622,1624,1626,1628,1630],{"class":1011,"line":1098},[1009,1618,1579],{"class":1578},[1009,1620,1621],{"class":1582},"reason",[1009,1623,1586],{"class":1578},[1009,1625,1038],{"class":1037},[1009,1627,1607],{"class":1338},[1009,1629,1397],{"class":1342},[1009,1631,1632],{"class":1338},"\"\n",[1009,1634,1636],{"class":1011,"line":1635},8,[1009,1637,1351],{"class":1026},[856,1639,1640],{},"If the body contains HTML:",[1000,1642,1644],{"className":1531,"code":1643,"language":1533,"meta":1005,"style":1005},"HTTP\u002F1.1 403 Bad request\nContent-Type: application\u002Fjson; charset=utf-8\n\n{\n \"banned\": true\n}\n",[896,1645,1646,1659,1667,1671,1675,1689],{"__ignoreMap":1005},[1009,1647,1648,1650,1652,1654,1657],{"class":1011,"line":1012},[1009,1649,1540],{"class":1015},[1009,1651,1543],{"class":1026},[1009,1653,1547],{"class":1546},[1009,1655,1656],{"class":1546}," 403",[1009,1658,1553],{"class":1342},[1009,1660,1661,1663,1665],{"class":1011,"line":1030},[1009,1662,1559],{"class":1558},[1009,1664,1038],{"class":1015},[1009,1666,1564],{"class":1342},[1009,1668,1669],{"class":1011,"line":1048},[1009,1670,1569],{"emptyLinePlaceholder":8},[1009,1672,1673],{"class":1011,"line":1060},[1009,1674,1298],{"class":1026},[1009,1676,1677,1679,1682,1684,1686],{"class":1011,"line":1073},[1009,1678,1607],{"class":1578},[1009,1680,1681],{"class":1582},"banned",[1009,1683,1586],{"class":1578},[1009,1685,1038],{"class":1037},[1009,1687,1688],{"class":1306}," true\n",[1009,1690,1691],{"class":1011,"line":1085},[1009,1692,1351],{"class":1026},[856,1694,1695],{},"Rate Limits:",[1000,1697,1699],{"className":1531,"code":1698,"language":1533,"meta":1005,"style":1005},"HTTP\u002F1.1 429\nContent-Type: application\u002Fjson; charset=utf-8\nRetry-After: number\n{\n  \"error\": \"Too many requests\",\n  \"retry\": \"number\",\n}\n",[896,1700,1701,1712,1720,1730,1734,1754,1773],{"__ignoreMap":1005},[1009,1702,1703,1705,1707,1709],{"class":1011,"line":1012},[1009,1704,1540],{"class":1015},[1009,1706,1543],{"class":1026},[1009,1708,1547],{"class":1546},[1009,1710,1711],{"class":1546}," 429\n",[1009,1713,1714,1716,1718],{"class":1011,"line":1030},[1009,1715,1559],{"class":1558},[1009,1717,1038],{"class":1015},[1009,1719,1564],{"class":1342},[1009,1721,1722,1725,1727],{"class":1011,"line":1048},[1009,1723,1724],{"class":1558},"Retry-After",[1009,1726,1038],{"class":1015},[1009,1728,1729],{"class":1342}," number\n",[1009,1731,1732],{"class":1011,"line":1060},[1009,1733,1298],{"class":1026},[1009,1735,1736,1738,1741,1743,1745,1747,1750,1752],{"class":1011,"line":1073},[1009,1737,1579],{"class":1578},[1009,1739,1740],{"class":1582},"error",[1009,1742,1586],{"class":1578},[1009,1744,1038],{"class":1037},[1009,1746,1607],{"class":1338},[1009,1748,1749],{"class":1342},"Too many requests",[1009,1751,1586],{"class":1338},[1009,1753,1045],{"class":1026},[1009,1755,1756,1758,1761,1763,1765,1767,1769,1771],{"class":1011,"line":1085},[1009,1757,1579],{"class":1578},[1009,1759,1760],{"class":1582},"retry",[1009,1762,1586],{"class":1578},[1009,1764,1038],{"class":1037},[1009,1766,1607],{"class":1338},[1009,1768,1155],{"class":1342},[1009,1770,1586],{"class":1338},[1009,1772,1045],{"class":1026},[1009,1774,1775],{"class":1011,"line":1098},[1009,1776,1351],{"class":1026},[969,1778],{},[972,1780,1782],{"id":1781},"documentation","Documentation",[1784,1785,1788,1794,1798,1802,1806,1811],"u-page-grid",{"className":1786},[1787],"lg:grid-cols-3",[1789,1790],"u-page-card",{"description":1791,"icon":1792,"title":1793,"to":188},"Learn how to update the privilege for a given token.","i-lucide-shield","Privilege",[1789,1795],{"description":1796,"icon":1797,"title":191,"to":192},"Permanently invalidate an API token to immediately block all future access.","i-lucide-trash-2",[1789,1799],{"description":1800,"icon":1801,"title":195,"to":196},"Securely cycle a token by revoking the existing key and generating a fresh one in a single atomic action.","i-lucide-refresh-cw",[1789,1803],{"description":1804,"icon":1805,"title":199,"to":200},"Update the whitelist of authorized IP addresses allowed to perform requests with a specific token.","i-lucide-globe",[1789,1807],{"description":1808,"icon":1809,"title":1810,"to":204},"Fetch detailed audit logs, including full usage history and precise lifecycle timestamps.","i-lucide-file-search","Extensive Metadata",[1789,1812],{"description":1813,"icon":1814,"title":207,"to":208},"Retrieve a high-level overview of all active tokens, including their names and current usage counts for a given user.","i-lucide-list",[1816,1817,1818],"style",{},"html pre.shiki code .sl46w, html code.shiki .sl46w{--shiki-light:#0000FF;--shiki-default:#0000FF;--shiki-dark:#FF79C6}html pre.shiki code .sHOzp, html code.shiki .sHOzp{--shiki-light:#795E26;--shiki-default:#795E26;--shiki-dark:#50FA7B}html pre.shiki code .sDd4n, html code.shiki .sDd4n{--shiki-light:#000000;--shiki-default:#000000;--shiki-dark:#F8F8F2}html pre.shiki code .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 .saOXh, html code.shiki .saOXh{--shiki-light:#000000;--shiki-default:#000000;--shiki-dark:#FF79C6}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 .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 .sjR7W, html code.shiki .sjR7W{--shiki-light:#0000FF;--shiki-default:#0000FF;--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 .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 .spgvN, html code.shiki .spgvN{--shiki-light:#098658;--shiki-default:#098658;--shiki-dark:#BD93F9}html pre.shiki code .scd-l, html code.shiki .scd-l{--shiki-light:#800000;--shiki-default:#800000;--shiki-dark:#FF79C6}html pre.shiki code .saJyd, html code.shiki .saJyd{--shiki-light:#0451A5;--shiki-default:#0451A5;--shiki-dark:#8BE9FE}html pre.shiki code .s_W10, html code.shiki .s_W10{--shiki-light:#0451A5;--shiki-default:#0451A5;--shiki-dark:#8BE9FD}",{"title":1005,"searchDepth":1030,"depth":1030,"links":1820},[1821,1830,1831],{"id":974,"depth":1030,"text":51,"children":1822},[1823,1825,1826,1827,1828,1829],{"id":978,"depth":1048,"text":1824},"The privateActionManager",{"id":997,"depth":1048,"text":998},{"id":1119,"depth":1048,"text":1120},{"id":1223,"depth":1048,"text":1224},{"id":1245,"depth":1048,"text":1246},{"id":1273,"depth":1048,"text":1274},{"id":1480,"depth":1030,"text":1481},{"id":1781,"depth":1030,"text":1782},"Learn how to rotate, revoke, update and restrict new ip's and privileges.","md","i-lucide-check-circle",{},null,"---\ntitle: Manage Tokens\ndescription: Learn how to rotate, revoke, update and restrict new ip's and privileges.\nicon: i-lucide-check-circle\n---\n\nThe IAM service provide a full life cycle to manage api keys, getting metadata or setting new privileges to a token.\n\nThe actions that are available are:\n\n- Revocation - Revoking a token\n- Rotation - Revoking the provided token and generating a new one\n- Update IP - Updating the ip restriction list to remove and address or add new one for the [verification process](\u002Fdocs\u002Fiam\u002Fessentials\u002Fapi\u002Fverification)\n- Privilege - Updating the privilege for a given token.\n- Metadata - Fetches extensive audit logs.\n- List - Getting a list of tokens metadata and counts for a given user\n\nFor the service users, the actions is behind a full authentication flow, each needs to succeeded before an action can be performed: \n\n - `requireAccessToken` Requires the access token header to be present\n - `requireRefreshToken` Requires the refresh token to be present\n - `getFingerPrint` Gets the finger prints for MFA\n - `checkForActiveMfa` MFA cache\n - `protectRoute` Enforces authentication, and perform the 9 mfa checks,\n - `contentType('application\u002Fjson')` Enforces `application\u002Fjson`,\n - `express.json` To limit the body size to 1kb\n - `apiTokensController` The actions happens here\n\nIf the client is not authenticate, cannot be found, have an active MFA, the actions will fail, with the appropriate response.\n\n\nFor the library users you call the `privateActionManager` for all actions except from the List actions, to enforce the same security as the routes. You can also however call it's underlying methods directly for custom use cases.\n\n::caution\nNo authentication is enforces in these actions when you use the library.\n::\n\n::warning\nNever pass untrusted data to these actions.\n::\n\n---\n\n## Library\n\n### The `privateActionManager`\n\nThe `privateActionManager` acts as the high-level coordinator for all dashboard driven token operations. It serves as a security layer between the user’s intent and the cryptographic operations required to modify or rotate API keys.\n\nInstead of the client interacting with raw, hashed tokens directly, the manager uses a *Public Identifier*, a non sensitive key, to locate the correct record and ensure the authenticated user actually owns the resource they are trying to modify.\n\n### Signature\n\n```ts\nasync function privateActionManager(\n    userId: number,\n    tokenId: number,\n    publicIdentifier: string,\n    name: string,\n    options: ActionArgs,\n): Promise\u003CActionManagerResult>\n```\n\n### Parameters\n\n| Parameter | Type | Description |\n| --- | --- | --- |\n| `userId` | `number` | The ID of the authenticated user. |\n| `tokenId` | `number` | The internal database ID of the token being managed. |\n| `publicIdentifier` | `string` | The public key used to identify the token safely. |\n| `name` | `string` | The friendly name assigned to the token. |\n| `options` | `ActionArgs` | An object containing the `action` type and any associated payload. |\n\n### Behavior\n\nThe manager performs a three-step process before executing any action to prevent unauthorized access:\n\n* Checksum Validation: It first validates the publicIdentifier format and checksum. If the identifier is malformed, the request is dropped before querying the database.\n\n* It executes a query that requires five points of data to match: id, user_id, name, public_identifier, and a valid = 1 status.\n\nOnce identity is confirmed, it extracts the `api_token` hash from the database and dispatches it to the specific utility (revoke, rotate, etcetera).\n\n### Supported Actions\nThe manager handles five distinct lifecycle actions through the options argument:\n\n* revoke: Marks the token as invalid. No further requests using this key will be accepted by the verification process.\n\n* rotate: An atomic *replace* operation. It generates a new raw key while inheriting the attributes of the old one. Same prefix, remaining expiry, and existing IP restrictions.\n\n* metadata: Returns extensive audit data, including when the token was last used and total usage counts.\n\n* ip-restriction-update: Updates the whitelist of IP addresses allowed to use the token.\n\n* privilege-update: Modifies the privileges of the token.\n\n\n### Return type\n\n`privateActionManager` returns the response of the underlying functions, even it these actions fails. Explore the docs to learn more.\n\nWhen `privateActionManager` its self fails, it returns the following:\n\nChecksum validations failure:\n\n```ts\n{\n  ok: false,\n  date: new Date().toISOString(),\n  reason: 'Invalid identity'\n}\n```\nWhen the query resulted in 0 rows, or when the provided action is not found: \n```ts\n{\n ok: false,\n date: new Date().toISOString(),\n reason: 'Bad Request'\n}\n```\nDatabase failure:\n\n```ts\n{\n  ok: false,\n  date: new Date().toISOString(),\n  reason: 'Server Error'\n}\n\n```\n\n::warning\nWhile the manager is the primary way to handle dashboard actions, it relies on the [BFF](\u002Fdocs\u002Fiam\u002Fessentials\u002Fbff) (Backend for Frontend) to provide the correct publicIdentifier. This prevents the browser from ever needing to *know* or store internal token hashes.\n::\n\n::note\nThe `publicIdentifier` is generated with the api token in the [creation step](\u002Fdocs\u002Fiam\u002Fessentials\u002Fapi\u002Fcreation).\n::\n\n## Service \n\nAs mentioned above, to perform any action, your client needs to be fully authenticated, with a valid [refresh token](\u002Fdocs\u002Fiam\u002Fessentials\u002Frefresh-tokens) a valid [access token](\u002Fdocs\u002Fiam\u002Fessentials\u002Faccess-tokens) and a [`canary_id`](\u002Fdocs\u002Fiam\u002Fessentials\u002Ftokens) cookie.\nThe session also should not have any active [MFA](\u002Fdocs\u002Fiam\u002Fessentials\u002Fmfa) or [anomaly](\u002Fdocs\u002Fiam\u002Fessentials\u002Fanomalies) associated with it.\n\nEach actions enforces the full [authentication](\u002Fdocs\u002Fiam\u002Fessentials) life-cycle before it perform any actions.\n\nHow ever every endpoint haves a different path, rate limiters, methods and a different body shape for `POST` requests.\n\nExplore the logs below to learn how to perform an action.\n\nSome of the failure response are identical for all actions, which are the following:\n\nIf the body is not valid or missing required values 400 will be returned:\n\n```http\nHTTP\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```\n\nIf the body contains HTML:\n\n```http\nHTTP\u002F1.1 403 Bad request\nContent-Type: application\u002Fjson; charset=utf-8\n\n{\n \"banned\": true\n}\n```\n\nRate Limits:\n\n```http\nHTTP\u002F1.1 429\nContent-Type: application\u002Fjson; charset=utf-8\nRetry-After: number\n{\n  \"error\": \"Too many requests\",\n  \"retry\": \"number\",\n}\n```\n\n\n---\n\n## Documentation\n\n::UPageGrid{class=\"lg:grid-cols-3\"}\n  ::UPageCard\n  ---\n    title: Privilege\n    description: Learn how to update the privilege for a given token.\n    to: \u002Fdocs\u002Fiam\u002Fessentials\u002Fapi\u002Fmanagement\u002Fprivilege\n    icon: i-lucide-shield\n  ---\n  ::\n\n  ::UPageCard\n  ---\n    title: Revocation\n    description: Permanently invalidate an API token to immediately block all future access.\n    to: \u002Fdocs\u002Fiam\u002Fessentials\u002Fapi\u002Fmanagement\u002Frevocation\n    icon: i-lucide-trash-2\n  ---\n  ::\n\n  ::UPageCard\n  ---\n    title: Rotation\n    description: Securely cycle a token by revoking the existing key and generating a fresh one in a single atomic action.\n    to: \u002Fdocs\u002Fiam\u002Fessentials\u002Fapi\u002Fmanagement\u002Frotation\n    icon: i-lucide-refresh-cw\n  ---\n  ::\n\n  ::UPageCard\n  ---\n    title: IP Restriction\n    description: Update the whitelist of authorized IP addresses allowed to perform requests with a specific token.\n    to: \u002Fdocs\u002Fiam\u002Fessentials\u002Fapi\u002Fmanagement\u002Fip-updates\n    icon: i-lucide-globe\n  ---\n  ::\n\n  ::UPageCard\n  ---\n  title: Extensive Metadata\n  description: Fetch detailed audit logs, including full usage history and precise lifecycle timestamps.\n  to: \u002Fdocs\u002Fiam\u002Fessentials\u002Fapi\u002Fmanagement\u002Fmetadata\n  icon: i-lucide-file-search\n  ---\n  ::\n\n  ::UPageCard\n  ---\n    title: Token Listing\n    description: Retrieve a high-level overview of all active tokens, including their names and current usage counts for a given user.\n    to: \u002Fdocs\u002Fiam\u002Fessentials\u002Fapi\u002Fmanagement\u002Flist\n    icon: i-lucide-list\n  ---\n  ::\n::\n ",{"title":181,"description":1832},"tT5wB9gZI_Bn582Lx2j36qSiVNa529PgAoQ7ZvH7KrY",[1841,1842],{"title":177,"path":178,"stem":179,"children":-1},{"title":187,"path":188,"stem":189,"children":-1},{"id":851,"title":181,"body":1844,"description":1832,"extension":1833,"icon":1834,"meta":2561,"module":1836,"navigation":8,"path":182,"rawbody":1837,"seo":2562,"stem":183,"__hash__":1839},{"type":853,"value":1845,"toc":2549},[1846,1848,1850,1866,1868,1904,1906,1910,1914,1918,1920,1922,1926,1930,1934,1936,2014,2016,2092,2094,2096,2102,2106,2108,2110,2124,2126,2130,2134,2136,2180,2182,2226,2228,2272,2280,2288,2290,2304,2308,2312,2314,2316,2318,2402,2404,2452,2454,2528,2530,2532,2547],[856,1847,858],{},[856,1849,861],{},[863,1851,1852,1854,1856,1860,1862,1864],{},[866,1853,868],{},[866,1855,871],{},[866,1857,874,1858],{},[876,1859,878],{"href":178},[866,1861,881],{},[866,1863,884],{},[866,1865,887],{},[856,1867,890],{},[863,1869,1870,1874,1878,1882,1886,1890,1896,1900],{},[866,1871,1872,899],{},[896,1873,898],{},[866,1875,1876,905],{},[896,1877,904],{},[866,1879,1880,911],{},[896,1881,910],{},[866,1883,1884,917],{},[896,1885,916],{},[866,1887,1888,923],{},[896,1889,922],{},[866,1891,1892,929,1894,933],{},[896,1893,928],{},[896,1895,932],{},[866,1897,1898,939],{},[896,1899,938],{},[866,1901,1902,945],{},[896,1903,944],{},[856,1905,948],{},[856,1907,951,1908,955],{},[896,1909,954],{},[957,1911,1912],{},[856,1913,961],{},[963,1915,1916],{},[856,1917,967],{},[969,1919],{},[972,1921,51],{"id":974},[976,1923,979,1924],{"id":978},[896,1925,954],{},[856,1927,979,1928,986],{},[896,1929,954],{},[856,1931,989,1932,994],{},[991,1933,993],{},[976,1935,998],{"id":997},[1000,1937,1938],{"className":1002,"code":1003,"language":1004,"meta":1005,"style":1005},[896,1939,1940,1950,1960,1970,1980,1990,2000],{"__ignoreMap":1005},[1009,1941,1942,1944,1946,1948],{"class":1011,"line":1012},[1009,1943,1016],{"class":1015},[1009,1945,1019],{"class":1015},[1009,1947,1023],{"class":1022},[1009,1949,1027],{"class":1026},[1009,1951,1952,1954,1956,1958],{"class":1011,"line":1030},[1009,1953,1034],{"class":1033},[1009,1955,1038],{"class":1037},[1009,1957,1042],{"class":1041},[1009,1959,1045],{"class":1026},[1009,1961,1962,1964,1966,1968],{"class":1011,"line":1048},[1009,1963,1051],{"class":1033},[1009,1965,1038],{"class":1037},[1009,1967,1042],{"class":1041},[1009,1969,1045],{"class":1026},[1009,1971,1972,1974,1976,1978],{"class":1011,"line":1060},[1009,1973,1063],{"class":1033},[1009,1975,1038],{"class":1037},[1009,1977,1068],{"class":1041},[1009,1979,1045],{"class":1026},[1009,1981,1982,1984,1986,1988],{"class":1011,"line":1073},[1009,1983,1076],{"class":1033},[1009,1985,1038],{"class":1037},[1009,1987,1068],{"class":1041},[1009,1989,1045],{"class":1026},[1009,1991,1992,1994,1996,1998],{"class":1011,"line":1085},[1009,1993,1088],{"class":1033},[1009,1995,1038],{"class":1037},[1009,1997,1093],{"class":1041},[1009,1999,1045],{"class":1026},[1009,2001,2002,2004,2006,2008,2010,2012],{"class":1011,"line":1098},[1009,2003,1101],{"class":1026},[1009,2005,1038],{"class":1037},[1009,2007,1106],{"class":1041},[1009,2009,1109],{"class":1026},[1009,2011,1113],{"class":1112},[1009,2013,1116],{"class":1026},[976,2015,1120],{"id":1119},[1122,2017,2018,2028],{},[1125,2019,2020],{},[1128,2021,2022,2024,2026],{},[1131,2023,1133],{},[1131,2025,1136],{},[1131,2027,1139],{},[1141,2029,2030,2042,2054,2066,2078],{},[1128,2031,2032,2036,2040],{},[1146,2033,2034],{},[896,2035,1150],{},[1146,2037,2038],{},[896,2039,1155],{},[1146,2041,1158],{},[1128,2043,2044,2048,2052],{},[1146,2045,2046],{},[896,2047,1165],{},[1146,2049,2050],{},[896,2051,1155],{},[1146,2053,1172],{},[1128,2055,2056,2060,2064],{},[1146,2057,2058],{},[896,2059,1179],{},[1146,2061,2062],{},[896,2063,1184],{},[1146,2065,1187],{},[1128,2067,2068,2072,2076],{},[1146,2069,2070],{},[896,2071,1194],{},[1146,2073,2074],{},[896,2075,1184],{},[1146,2077,1201],{},[1128,2079,2080,2084,2088],{},[1146,2081,2082],{},[896,2083,1208],{},[1146,2085,2086],{},[896,2087,1213],{},[1146,2089,1216,2090,1220],{},[896,2091,1219],{},[976,2093,1224],{"id":1223},[856,2095,1227],{},[863,2097,2098,2100],{},[866,2099,1232],{},[866,2101,1235],{},[856,2103,1238,2104,1242],{},[896,2105,1241],{},[976,2107,1246],{"id":1245},[856,2109,1249],{},[863,2111,2112,2114,2118,2120,2122],{},[866,2113,1254],{},[866,2115,1257,2116,1261],{},[991,2117,1260],{},[866,2119,1264],{},[866,2121,1267],{},[866,2123,1270],{},[976,2125,1274],{"id":1273},[856,2127,2128,1279],{},[896,2129,954],{},[856,2131,1282,2132,1285],{},[896,2133,954],{},[856,2135,1288],{},[1000,2137,2138],{"className":1002,"code":1291,"language":1004,"meta":1005,"style":1005},[896,2139,2140,2144,2152,2166,2176],{"__ignoreMap":1005},[1009,2141,2142],{"class":1011,"line":1012},[1009,2143,1298],{"class":1026},[1009,2145,2146,2148,2150],{"class":1011,"line":1030},[1009,2147,1303],{"class":1026},[1009,2149,1307],{"class":1306},[1009,2151,1045],{"class":1026},[1009,2153,2154,2156,2158,2160,2162,2164],{"class":1011,"line":1048},[1009,2155,1314],{"class":1026},[1009,2157,1318],{"class":1317},[1009,2159,1321],{"class":1022},[1009,2161,1324],{"class":1026},[1009,2163,1327],{"class":1022},[1009,2165,1330],{"class":1026},[1009,2167,2168,2170,2172,2174],{"class":1011,"line":1060},[1009,2169,1335],{"class":1026},[1009,2171,1339],{"class":1338},[1009,2173,1343],{"class":1342},[1009,2175,1346],{"class":1338},[1009,2177,2178],{"class":1011,"line":1073},[1009,2179,1351],{"class":1026},[856,2181,1354],{},[1000,2183,2184],{"className":1002,"code":1357,"language":1004,"meta":1005,"style":1005},[896,2185,2186,2190,2198,2212,2222],{"__ignoreMap":1005},[1009,2187,2188],{"class":1011,"line":1012},[1009,2189,1298],{"class":1026},[1009,2191,2192,2194,2196],{"class":1011,"line":1030},[1009,2193,1368],{"class":1026},[1009,2195,1307],{"class":1306},[1009,2197,1045],{"class":1026},[1009,2199,2200,2202,2204,2206,2208,2210],{"class":1011,"line":1048},[1009,2201,1377],{"class":1026},[1009,2203,1318],{"class":1317},[1009,2205,1321],{"class":1022},[1009,2207,1324],{"class":1026},[1009,2209,1327],{"class":1022},[1009,2211,1330],{"class":1026},[1009,2213,2214,2216,2218,2220],{"class":1011,"line":1060},[1009,2215,1392],{"class":1026},[1009,2217,1339],{"class":1338},[1009,2219,1397],{"class":1342},[1009,2221,1346],{"class":1338},[1009,2223,2224],{"class":1011,"line":1073},[1009,2225,1351],{"class":1026},[856,2227,1406],{},[1000,2229,2230],{"className":1002,"code":1409,"language":1004,"meta":1005,"style":1005},[896,2231,2232,2236,2244,2258,2268],{"__ignoreMap":1005},[1009,2233,2234],{"class":1011,"line":1012},[1009,2235,1298],{"class":1026},[1009,2237,2238,2240,2242],{"class":1011,"line":1030},[1009,2239,1303],{"class":1026},[1009,2241,1307],{"class":1306},[1009,2243,1045],{"class":1026},[1009,2245,2246,2248,2250,2252,2254,2256],{"class":1011,"line":1048},[1009,2247,1314],{"class":1026},[1009,2249,1318],{"class":1317},[1009,2251,1321],{"class":1022},[1009,2253,1324],{"class":1026},[1009,2255,1327],{"class":1022},[1009,2257,1330],{"class":1026},[1009,2259,2260,2262,2264,2266],{"class":1011,"line":1060},[1009,2261,1335],{"class":1026},[1009,2263,1339],{"class":1338},[1009,2265,1446],{"class":1342},[1009,2267,1346],{"class":1338},[1009,2269,2270],{"class":1011,"line":1073},[1009,2271,1351],{"class":1026},[963,2273,2274],{},[856,2275,1457,2276,1461,2278,1465],{},[876,2277,1460],{"href":132},[991,2279,1464],{},[1467,2281,2282],{},[856,2283,979,2284,1473,2286,1477],{},[896,2285,1179],{},[876,2287,1476],{"href":174},[972,2289,1481],{"id":1480},[856,2291,1484,2292,1488,2294,1492,2296,1498,2300,1501,2302,1505],{},[876,2293,1487],{"href":92},[876,2295,1491],{"href":88},[876,2297,2298],{"href":84},[896,2299,1497],{},[876,2301,123],{"href":124},[876,2303,1504],{"href":96},[856,2305,1508,2306,1512],{},[876,2307,1511],{"href":78},[856,2309,1515,2310,1519],{},[896,2311,1518],{},[856,2313,1522],{},[856,2315,1525],{},[856,2317,1528],{},[1000,2319,2320],{"className":1531,"code":1532,"language":1533,"meta":1005,"style":1005},[896,2321,2322,2334,2342,2346,2350,2364,2382,2398],{"__ignoreMap":1005},[1009,2323,2324,2326,2328,2330,2332],{"class":1011,"line":1012},[1009,2325,1540],{"class":1015},[1009,2327,1543],{"class":1026},[1009,2329,1547],{"class":1546},[1009,2331,1550],{"class":1546},[1009,2333,1553],{"class":1342},[1009,2335,2336,2338,2340],{"class":1011,"line":1030},[1009,2337,1559],{"class":1558},[1009,2339,1038],{"class":1015},[1009,2341,1564],{"class":1342},[1009,2343,2344],{"class":1011,"line":1048},[1009,2345,1569],{"emptyLinePlaceholder":8},[1009,2347,2348],{"class":1011,"line":1060},[1009,2349,1298],{"class":1026},[1009,2351,2352,2354,2356,2358,2360,2362],{"class":1011,"line":1073},[1009,2353,1579],{"class":1578},[1009,2355,1583],{"class":1582},[1009,2357,1586],{"class":1578},[1009,2359,1038],{"class":1037},[1009,2361,1591],{"class":1306},[1009,2363,1045],{"class":1026},[1009,2365,2366,2368,2370,2372,2374,2376,2378,2380],{"class":1011,"line":1085},[1009,2367,1579],{"class":1578},[1009,2369,1600],{"class":1582},[1009,2371,1586],{"class":1578},[1009,2373,1038],{"class":1037},[1009,2375,1607],{"class":1338},[1009,2377,1610],{"class":1342},[1009,2379,1586],{"class":1338},[1009,2381,1045],{"class":1026},[1009,2383,2384,2386,2388,2390,2392,2394,2396],{"class":1011,"line":1098},[1009,2385,1579],{"class":1578},[1009,2387,1621],{"class":1582},[1009,2389,1586],{"class":1578},[1009,2391,1038],{"class":1037},[1009,2393,1607],{"class":1338},[1009,2395,1397],{"class":1342},[1009,2397,1632],{"class":1338},[1009,2399,2400],{"class":1011,"line":1635},[1009,2401,1351],{"class":1026},[856,2403,1640],{},[1000,2405,2406],{"className":1531,"code":1643,"language":1533,"meta":1005,"style":1005},[896,2407,2408,2420,2428,2432,2436,2448],{"__ignoreMap":1005},[1009,2409,2410,2412,2414,2416,2418],{"class":1011,"line":1012},[1009,2411,1540],{"class":1015},[1009,2413,1543],{"class":1026},[1009,2415,1547],{"class":1546},[1009,2417,1656],{"class":1546},[1009,2419,1553],{"class":1342},[1009,2421,2422,2424,2426],{"class":1011,"line":1030},[1009,2423,1559],{"class":1558},[1009,2425,1038],{"class":1015},[1009,2427,1564],{"class":1342},[1009,2429,2430],{"class":1011,"line":1048},[1009,2431,1569],{"emptyLinePlaceholder":8},[1009,2433,2434],{"class":1011,"line":1060},[1009,2435,1298],{"class":1026},[1009,2437,2438,2440,2442,2444,2446],{"class":1011,"line":1073},[1009,2439,1607],{"class":1578},[1009,2441,1681],{"class":1582},[1009,2443,1586],{"class":1578},[1009,2445,1038],{"class":1037},[1009,2447,1688],{"class":1306},[1009,2449,2450],{"class":1011,"line":1085},[1009,2451,1351],{"class":1026},[856,2453,1695],{},[1000,2455,2456],{"className":1531,"code":1698,"language":1533,"meta":1005,"style":1005},[896,2457,2458,2468,2476,2484,2488,2506,2524],{"__ignoreMap":1005},[1009,2459,2460,2462,2464,2466],{"class":1011,"line":1012},[1009,2461,1540],{"class":1015},[1009,2463,1543],{"class":1026},[1009,2465,1547],{"class":1546},[1009,2467,1711],{"class":1546},[1009,2469,2470,2472,2474],{"class":1011,"line":1030},[1009,2471,1559],{"class":1558},[1009,2473,1038],{"class":1015},[1009,2475,1564],{"class":1342},[1009,2477,2478,2480,2482],{"class":1011,"line":1048},[1009,2479,1724],{"class":1558},[1009,2481,1038],{"class":1015},[1009,2483,1729],{"class":1342},[1009,2485,2486],{"class":1011,"line":1060},[1009,2487,1298],{"class":1026},[1009,2489,2490,2492,2494,2496,2498,2500,2502,2504],{"class":1011,"line":1073},[1009,2491,1579],{"class":1578},[1009,2493,1740],{"class":1582},[1009,2495,1586],{"class":1578},[1009,2497,1038],{"class":1037},[1009,2499,1607],{"class":1338},[1009,2501,1749],{"class":1342},[1009,2503,1586],{"class":1338},[1009,2505,1045],{"class":1026},[1009,2507,2508,2510,2512,2514,2516,2518,2520,2522],{"class":1011,"line":1085},[1009,2509,1579],{"class":1578},[1009,2511,1760],{"class":1582},[1009,2513,1586],{"class":1578},[1009,2515,1038],{"class":1037},[1009,2517,1607],{"class":1338},[1009,2519,1155],{"class":1342},[1009,2521,1586],{"class":1338},[1009,2523,1045],{"class":1026},[1009,2525,2526],{"class":1011,"line":1098},[1009,2527,1351],{"class":1026},[969,2529],{},[972,2531,1782],{"id":1781},[1784,2533,2535,2537,2539,2541,2543,2545],{"className":2534},[1787],[1789,2536],{"description":1791,"icon":1792,"title":1793,"to":188},[1789,2538],{"description":1796,"icon":1797,"title":191,"to":192},[1789,2540],{"description":1800,"icon":1801,"title":195,"to":196},[1789,2542],{"description":1804,"icon":1805,"title":199,"to":200},[1789,2544],{"description":1808,"icon":1809,"title":1810,"to":204},[1789,2546],{"description":1813,"icon":1814,"title":207,"to":208},[1816,2548,1818],{},{"title":1005,"searchDepth":1030,"depth":1030,"links":2550},[2551,2559,2560],{"id":974,"depth":1030,"text":51,"children":2552},[2553,2554,2555,2556,2557,2558],{"id":978,"depth":1048,"text":1824},{"id":997,"depth":1048,"text":998},{"id":1119,"depth":1048,"text":1120},{"id":1223,"depth":1048,"text":1224},{"id":1245,"depth":1048,"text":1246},{"id":1273,"depth":1048,"text":1274},{"id":1480,"depth":1030,"text":1481},{"id":1781,"depth":1030,"text":1782},{},{"title":181,"description":1832},1780436286064]