[{"data":1,"prerenderedAt":3315},["ShallowReactive",2],{"navLinks":3,"sidebar_docs_navigation_\u002Fdocs\u002Fiam":64,"navigation":257,"navLinks_footer":837,"\u002Fdocs\u002Fiam\u002Fessentials\u002Fapi\u002Fmanagement\u002Frevocation_page":850,"\u002Fdocs\u002Fiam\u002Fessentials\u002Fapi\u002Fmanagement\u002Frevocation_surround":2239,"\u002Fdocs\u002Fiam\u002Fessentials\u002Fapi\u002Fmanagement\u002Frevocation":2242},{"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":191,"body":852,"description":2231,"extension":2232,"icon":2233,"meta":2234,"module":2235,"navigation":8,"path":192,"rawbody":2236,"seo":2237,"stem":193,"__hash__":2238},"docs\u002Fdocs\u002Fiam\u002F01.essentials\u002F21.api\u002F02.management\u002F01.revocation.md",{"type":853,"value":854,"toc":2222},"minimark",[855,873,876,883,889,892,927,936,941,944,949,960,1137,1140,1231,1238,1284,1287,1335,1340,1343,1488,1492,1548,1554,1563,1569,1578,1638,1651,1663,1666,1670,1673,1682,1754,1757,1909,1912,1915,2004,2025,2113,2122,2126,2129,2173,2177,2180,2184,2187,2218],[856,857,858,859,863,864,867,868,872],"p",{},"Revocation permanently invalidates an API token by setting its ",[860,861,862],"code",{},"valid"," field to\n",[860,865,866],{},"0"," in the database. After that happens, the\n",[869,870,871],"a",{"href":178},"verification process"," rejects the key,\nand the token can no longer be used for machine-to-machine access.",[856,874,875],{},"The IAM service keeps revoked token rows instead of deleting them during the\nstandard revoke flow. This gives you a stable way to disable leaked, rotated,\nor no longer needed tokens while preserving their metadata for later auditing.",[856,877,878,879,882],{},"The direct library function ",[860,880,881],{},"revokeApiKey"," is idempotent. If the\nprovided token is already invalid, missing, or does not pass verification, it\nstill returns a success payload. The route behaves differently,\nbecause it only looks up currently valid tokens before dispatching the\nrevocation.",[884,885,886],"caution",{},[856,887,888],{},"Revocation is permanent. Revoked tokens cannot be reactivated. Create a new\ntoken if you need replacement access.",[856,890,891],{},"You can revoke a token in 3 ways:",[893,894,895,902,909],"ul",{},[896,897,898,899,901],"li",{},"Directly calling ",[860,900,881],{},".",[896,903,904,905,908],{},"Using the ",[860,906,907],{},"privateActionManager"," to validate ownership before revoking.",[896,910,911,912,926],{},"Calling the ",[860,913,917,922],{"className":914,"language":915,"style":916},"language-http shiki shiki-themes light-plus light-plus dracula","http","",[918,919,921],"span",{"class":920},"sZ328","POST",[918,923,925],{"class":924},"sDd4n"," \u002Fapi\u002Fmanage\u002Frevoke"," endpoint from an\nauthenticated client.",[928,929,930],"note",{},[856,931,932,933,935],{},"Follow the ",[869,934,173],{"href":174}," docs to create\na token first before attempting to revoke it.",[937,938,940],"h2",{"id":939},"revoking-tokens","Revoking Tokens",[856,942,943],{},"You can revoke tokens either directly in the library or through the route. The direct helper focuses on the token itself, while the\nroute adds ownership validation and authenticated client protections.",[945,946,948],"h3",{"id":947},"using-the-library","Using the library",[856,950,951,952,956,957,959],{},"To revoke a token ",[953,954,955],"em",{},"directly",", you call ",[860,958,881],{},". This function hashes the\nprovided token when needed, verifies it against the stored privilege, and then\nmarks the token as invalid.",[961,962,967],"pre",{"className":963,"code":964,"filename":965,"language":966,"meta":916,"style":916},"language-ts shiki shiki-themes light-plus light-plus dracula","import { revokeApiKey } from '@riavzon\u002Fauth'\n\nconst token = 'api_1234'\nconst privilege = 'restricted'\n\nconst results = await revokeApiKey(token, privilege)\n\nif (!results.ok) {\n    console.error(results.reason)\n}\n","example.ts","ts",[860,968,969,999,1005,1027,1044,1049,1081,1086,1109,1131],{"__ignoreMap":916},[918,970,973,976,979,982,985,988,992,996],{"class":971,"line":972},"line",1,[918,974,975],{"class":920},"import",[918,977,978],{"class":924}," { ",[918,980,881],{"class":981},"sjsA6",[918,983,984],{"class":924}," } ",[918,986,987],{"class":920},"from",[918,989,991],{"class":990},"sFkSl"," '",[918,993,995],{"class":994},"sFB1V","@riavzon\u002Fauth",[918,997,998],{"class":990},"'\n",[918,1000,1002],{"class":971,"line":1001},2,[918,1003,1004],{"emptyLinePlaceholder":8},"\n",[918,1006,1008,1012,1016,1020,1022,1025],{"class":971,"line":1007},3,[918,1009,1011],{"class":1010},"sl46w","const",[918,1013,1015],{"class":1014},"s3JHE"," token",[918,1017,1019],{"class":1018},"saOXh"," =",[918,1021,991],{"class":990},[918,1023,1024],{"class":994},"api_1234",[918,1026,998],{"class":990},[918,1028,1030,1032,1035,1037,1039,1042],{"class":971,"line":1029},4,[918,1031,1011],{"class":1010},[918,1033,1034],{"class":1014}," privilege",[918,1036,1019],{"class":1018},[918,1038,991],{"class":990},[918,1040,1041],{"class":994},"restricted",[918,1043,998],{"class":990},[918,1045,1047],{"class":971,"line":1046},5,[918,1048,1004],{"emptyLinePlaceholder":8},[918,1050,1052,1054,1057,1059,1062,1066,1069,1072,1075,1078],{"class":971,"line":1051},6,[918,1053,1011],{"class":1010},[918,1055,1056],{"class":1014}," results",[918,1058,1019],{"class":1018},[918,1060,1061],{"class":920}," await",[918,1063,1065],{"class":1064},"sHOzp"," revokeApiKey",[918,1067,1068],{"class":924},"(",[918,1070,1071],{"class":981},"token",[918,1073,1074],{"class":924},", ",[918,1076,1077],{"class":981},"privilege",[918,1079,1080],{"class":924},")\n",[918,1082,1084],{"class":971,"line":1083},7,[918,1085,1004],{"emptyLinePlaceholder":8},[918,1087,1089,1092,1095,1098,1101,1103,1106],{"class":971,"line":1088},8,[918,1090,1091],{"class":920},"if",[918,1093,1094],{"class":924}," (",[918,1096,1097],{"class":1018},"!",[918,1099,1100],{"class":981},"results",[918,1102,901],{"class":924},[918,1104,1105],{"class":981},"ok",[918,1107,1108],{"class":924},") {\n",[918,1110,1112,1115,1117,1120,1122,1124,1126,1129],{"class":971,"line":1111},9,[918,1113,1114],{"class":981},"    console",[918,1116,901],{"class":924},[918,1118,1119],{"class":1064},"error",[918,1121,1068],{"class":924},[918,1123,1100],{"class":981},[918,1125,901],{"class":924},[918,1127,1128],{"class":981},"reason",[918,1130,1080],{"class":924},[918,1132,1134],{"class":971,"line":1133},10,[918,1135,1136],{"class":924},"}\n",[856,1138,1139],{},"On success you can get back one of two payloads. When the token is valid and\nthe privilege matches, the response contains the revoked token id and user id:",[961,1141,1143],{"className":963,"code":1142,"language":966,"meta":916,"style":916},"{\n    ok: true,\n    date: new Date().toISOString(),\n    data: {\n        msg: 'Token invalided successfully',\n        invalidedTokenId: 12,\n        userId: 42\n    }\n}\n",[860,1144,1145,1150,1162,1183,1188,1203,1214,1222,1227],{"__ignoreMap":916},[918,1146,1147],{"class":971,"line":972},[918,1148,1149],{"class":924},"{\n",[918,1151,1152,1155,1159],{"class":971,"line":1001},[918,1153,1154],{"class":924},"    ok: ",[918,1156,1158],{"class":1157},"sjR7W","true",[918,1160,1161],{"class":924},",\n",[918,1163,1164,1167,1171,1174,1177,1180],{"class":971,"line":1007},[918,1165,1166],{"class":924},"    date: ",[918,1168,1170],{"class":1169},"sakC6","new",[918,1172,1173],{"class":1064}," Date",[918,1175,1176],{"class":924},"().",[918,1178,1179],{"class":1064},"toISOString",[918,1181,1182],{"class":924},"(),\n",[918,1184,1185],{"class":971,"line":1029},[918,1186,1187],{"class":924},"    data: {\n",[918,1189,1190,1193,1196,1199,1201],{"class":971,"line":1046},[918,1191,1192],{"class":924},"        msg: ",[918,1194,1195],{"class":990},"'",[918,1197,1198],{"class":994},"Token invalided successfully",[918,1200,1195],{"class":990},[918,1202,1161],{"class":924},[918,1204,1205,1208,1212],{"class":971,"line":1051},[918,1206,1207],{"class":924},"        invalidedTokenId: ",[918,1209,1211],{"class":1210},"spgvN","12",[918,1213,1161],{"class":924},[918,1215,1216,1219],{"class":971,"line":1083},[918,1217,1218],{"class":924},"        userId: ",[918,1220,1221],{"class":1210},"42\n",[918,1223,1224],{"class":971,"line":1088},[918,1225,1226],{"class":924},"    }\n",[918,1228,1229],{"class":971,"line":1111},[918,1230,1136],{"class":924},[856,1232,1233,1234,1237],{},"If the token is already invalid, missing, or does not pass verification, the\nfunction still returns ",[860,1235,1236],{},"ok: true"," with a string payload:",[961,1239,1241],{"className":963,"code":1240,"language":966,"meta":916,"style":916},"{\n    ok: true,\n    date: new Date().toISOString(),\n    data: 'Token invalided successfully'\n}\n",[860,1242,1243,1247,1255,1269,1280],{"__ignoreMap":916},[918,1244,1245],{"class":971,"line":972},[918,1246,1149],{"class":924},[918,1248,1249,1251,1253],{"class":971,"line":1001},[918,1250,1154],{"class":924},[918,1252,1158],{"class":1157},[918,1254,1161],{"class":924},[918,1256,1257,1259,1261,1263,1265,1267],{"class":971,"line":1007},[918,1258,1166],{"class":924},[918,1260,1170],{"class":1169},[918,1262,1173],{"class":1064},[918,1264,1176],{"class":924},[918,1266,1179],{"class":1064},[918,1268,1182],{"class":924},[918,1270,1271,1274,1276,1278],{"class":971,"line":1029},[918,1272,1273],{"class":924},"    data: ",[918,1275,1195],{"class":990},[918,1277,1198],{"class":994},[918,1279,998],{"class":990},[918,1281,1282],{"class":971,"line":1046},[918,1283,1136],{"class":924},[856,1285,1286],{},"On error, such as a database failure, you get:",[961,1288,1290],{"className":963,"code":1289,"language":966,"meta":916,"style":916},"{\n    ok: false,\n    date: new Date().toISOString(),\n    reason: 'Error invalidating token'\n}\n",[860,1291,1292,1296,1305,1319,1331],{"__ignoreMap":916},[918,1293,1294],{"class":971,"line":972},[918,1295,1149],{"class":924},[918,1297,1298,1300,1303],{"class":971,"line":1001},[918,1299,1154],{"class":924},[918,1301,1302],{"class":1157},"false",[918,1304,1161],{"class":924},[918,1306,1307,1309,1311,1313,1315,1317],{"class":971,"line":1007},[918,1308,1166],{"class":924},[918,1310,1170],{"class":1169},[918,1312,1173],{"class":1064},[918,1314,1176],{"class":924},[918,1316,1179],{"class":1064},[918,1318,1182],{"class":924},[918,1320,1321,1324,1326,1329],{"class":971,"line":1029},[918,1322,1323],{"class":924},"    reason: ",[918,1325,1195],{"class":990},[918,1327,1328],{"class":994},"Error invalidating token",[918,1330,998],{"class":990},[918,1332,1333],{"class":971,"line":1046},[918,1334,1136],{"class":924},[1336,1337,1339],"h4",{"id":1338},"signature","Signature",[856,1341,1342],{},"The direct helper exposes the following signature:",[961,1344,1346],{"className":963,"code":1345,"language":966,"meta":916,"style":916},"export async function revokeApiKey(\n    rawKey: string,\n    providedPrivilege: 'demo' | 'restricted' | 'protected' | 'full' | 'custom',\n): Promise\u003CResults\u003C{msg: string, invalidedTokenId: number, userId: number} | string>>\n",[860,1347,1348,1364,1379,1431],{"__ignoreMap":916},[918,1349,1350,1353,1356,1359,1361],{"class":971,"line":972},[918,1351,1352],{"class":920},"export",[918,1354,1355],{"class":1010}," async",[918,1357,1358],{"class":1010}," function",[918,1360,1065],{"class":1064},[918,1362,1363],{"class":924},"(\n",[918,1365,1366,1370,1373,1377],{"class":971,"line":1001},[918,1367,1369],{"class":1368},"sygFZ","    rawKey",[918,1371,1372],{"class":1018},":",[918,1374,1376],{"class":1375},"sFs1U"," string",[918,1378,1161],{"class":924},[918,1380,1381,1384,1386,1388,1391,1393,1396,1398,1400,1402,1404,1406,1409,1411,1413,1415,1418,1420,1422,1424,1427,1429],{"class":971,"line":1007},[918,1382,1383],{"class":1368},"    providedPrivilege",[918,1385,1372],{"class":1018},[918,1387,991],{"class":990},[918,1389,1390],{"class":994},"demo",[918,1392,1195],{"class":990},[918,1394,1395],{"class":1018}," |",[918,1397,991],{"class":990},[918,1399,1041],{"class":994},[918,1401,1195],{"class":990},[918,1403,1395],{"class":1018},[918,1405,991],{"class":990},[918,1407,1408],{"class":994},"protected",[918,1410,1195],{"class":990},[918,1412,1395],{"class":1018},[918,1414,991],{"class":990},[918,1416,1417],{"class":994},"full",[918,1419,1195],{"class":990},[918,1421,1395],{"class":1018},[918,1423,991],{"class":990},[918,1425,1426],{"class":994},"custom",[918,1428,1195],{"class":990},[918,1430,1161],{"class":924},[918,1432,1433,1436,1438,1441,1444,1448,1451,1454,1456,1458,1460,1463,1465,1468,1470,1473,1475,1477,1480,1483,1485],{"class":971,"line":1029},[918,1434,1435],{"class":924},")",[918,1437,1372],{"class":1018},[918,1439,1440],{"class":1375}," Promise",[918,1442,1443],{"class":924},"\u003C",[918,1445,1447],{"class":1446},"sW-rI","Results",[918,1449,1450],{"class":924},"\u003C{",[918,1452,1453],{"class":981},"msg",[918,1455,1372],{"class":1018},[918,1457,1376],{"class":1375},[918,1459,1074],{"class":924},[918,1461,1462],{"class":981},"invalidedTokenId",[918,1464,1372],{"class":1018},[918,1466,1467],{"class":1375}," number",[918,1469,1074],{"class":924},[918,1471,1472],{"class":981},"userId",[918,1474,1372],{"class":1018},[918,1476,1467],{"class":1375},[918,1478,1479],{"class":924},"} ",[918,1481,1482],{"class":1018},"|",[918,1484,1376],{"class":1375},[918,1486,1487],{"class":924},">>\n",[1336,1489,1491],{"id":1490},"parameters","Parameters",[1493,1494,1495,1511],"table",{},[1496,1497,1498],"thead",{},[1499,1500,1501,1505,1508],"tr",{},[1502,1503,1504],"th",{},"Field",[1502,1506,1507],{},"Type",[1502,1509,1510],{},"Description",[1512,1513,1514,1533],"tbody",{},[1499,1515,1516,1522,1527],{},[1517,1518,1519],"td",{},[860,1520,1521],{},"rawKey",[1517,1523,1524],{},[860,1525,1526],{},"string",[1517,1528,1529,1530,901],{},"The token to be revoked. It can be hashed or ",[953,1531,1532],{},"Raw",[1499,1534,1535,1540,1545],{},[1517,1536,1537],{},[860,1538,1539],{},"providedPrivilege",[1517,1541,1542],{},[860,1543,1544],{},"'demo' | 'restricted' | 'protected' | 'full' | 'custom'",[1517,1546,1547],{},"The privilege assigned to the token you want to revoke.",[1549,1550,1551],"warning",{},[856,1552,1553],{},"This action should be performed by a fully authenticated client.",[884,1555,1556],{},[856,1557,1558,1559,1562],{},"This function does not require the ",[860,1560,1561],{},"publicIdentifier",", and it bypasses IP\nrestriction checks and usage counter updates during its internal verification\nstep. Only call it directly in trusted server-side code.",[1336,1564,1566,1567],{"id":1565},"with-the-privateactionmanager","With the ",[860,1568,907],{},[856,1570,1571,1572,1574,1575,1577],{},"The safest internal method is using the ",[860,1573,907],{},". This function\nchecks the ",[860,1576,1561],{},", token id, token name, user id, and current valid\nstatus before dispatching the revocation.",[961,1579,1581],{"className":963,"code":1580,"filename":965,"language":966,"meta":916,"style":916},"const revokeRes = await privateActionManager(userId, tokenId, publicIdentifier, tokenName, {\n  action: 'revoke'\n})\n",[860,1582,1583,1618,1633],{"__ignoreMap":916},[918,1584,1585,1587,1590,1592,1594,1597,1599,1601,1603,1606,1608,1610,1612,1615],{"class":971,"line":972},[918,1586,1011],{"class":1010},[918,1588,1589],{"class":1014}," revokeRes",[918,1591,1019],{"class":1018},[918,1593,1061],{"class":920},[918,1595,1596],{"class":1064}," privateActionManager",[918,1598,1068],{"class":924},[918,1600,1472],{"class":981},[918,1602,1074],{"class":924},[918,1604,1605],{"class":981},"tokenId",[918,1607,1074],{"class":924},[918,1609,1561],{"class":981},[918,1611,1074],{"class":924},[918,1613,1614],{"class":981},"tokenName",[918,1616,1617],{"class":924},", {\n",[918,1619,1620,1623,1626,1628,1631],{"class":971,"line":1001},[918,1621,1622],{"class":981},"  action",[918,1624,1372],{"class":1625},"s34zl",[918,1627,991],{"class":990},[918,1629,1630],{"class":994},"revoke",[918,1632,998],{"class":990},[918,1634,1635],{"class":971,"line":1007},[918,1636,1637],{"class":924},"})\n",[856,1639,1640,1641,1643,1644,1646,1647,901],{},"The ",[860,1642,907],{}," returns the response of ",[860,1645,881],{}," directly.\nLearn more at the\n",[869,1648,1650],{"href":1649},"\u002Fdocs\u002Fiam\u002Fessentials\u002Fapi\u002Fmanagement#the-privateactionmanager","introduction page",[928,1652,1653],{},[856,1654,1655,1656,1659,1660,1662],{},"The manager only selects rows where ",[860,1657,1658],{},"valid = 1",". Because of that, manager-based\nrevocation does not behave like the direct ",[860,1661,881],{}," call when the token\nis already revoked.",[1664,1665],"hr",{},[945,1667,1669],{"id":1668},"using-the-route","Using the route",[856,1671,1672],{},"Let's say you want to revoke a token from your authenticated client or BFF.",[856,1674,1675,1681],{},[860,1676,1677,1679],{"className":914,"language":915,"style":916},[918,1678,921],{"class":920},[918,1680,925],{"class":924}," body:",[961,1683,1686],{"className":1684,"code":1685,"language":5,"meta":916,"style":916},"language-json shiki shiki-themes light-plus light-plus dracula","{\n    \"tokenId\": 12,\n    \"publicIdentifier\": \"public_identifier\",\n    \"name\": \"the token name\"\n}\n",[860,1687,1688,1692,1711,1731,1750],{"__ignoreMap":916},[918,1689,1690],{"class":971,"line":972},[918,1691,1149],{"class":924},[918,1693,1694,1698,1701,1704,1706,1709],{"class":971,"line":1001},[918,1695,1697],{"class":1696},"saJyd","    \"",[918,1699,1605],{"class":1700},"s_W10",[918,1702,1703],{"class":1696},"\"",[918,1705,1372],{"class":1018},[918,1707,1708],{"class":1210}," 12",[918,1710,1161],{"class":924},[918,1712,1713,1715,1717,1719,1721,1724,1727,1729],{"class":971,"line":1007},[918,1714,1697],{"class":1696},[918,1716,1561],{"class":1700},[918,1718,1703],{"class":1696},[918,1720,1372],{"class":1018},[918,1722,1723],{"class":990}," \"",[918,1725,1726],{"class":994},"public_identifier",[918,1728,1703],{"class":990},[918,1730,1161],{"class":924},[918,1732,1733,1735,1738,1740,1742,1744,1747],{"class":971,"line":1029},[918,1734,1697],{"class":1696},[918,1736,1737],{"class":1700},"name",[918,1739,1703],{"class":1696},[918,1741,1372],{"class":1018},[918,1743,1723],{"class":990},[918,1745,1746],{"class":994},"the token name",[918,1748,1749],{"class":990},"\"\n",[918,1751,1752],{"class":971,"line":1046},[918,1753,1136],{"class":924},[856,1755,1756],{},"On success you will get the following response:",[961,1758,1760],{"className":914,"code":1759,"language":915,"meta":916,"style":916},"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\": \"Token invalided successfully\", \n      \"invalidedTokenId\": 12, \n      \"userId\": 42 \n   }\n}\n",[860,1761,1762,1779,1790,1794,1798,1814,1834,1848,1868,1882,1898,1904],{"__ignoreMap":916},[918,1763,1764,1767,1770,1773,1776],{"class":971,"line":972},[918,1765,1766],{"class":1010},"HTTP",[918,1768,1769],{"class":924},"\u002F",[918,1771,1772],{"class":1210},"1.1",[918,1774,1775],{"class":1210}," 200",[918,1777,1778],{"class":994}," OK\n",[918,1780,1781,1785,1787],{"class":971,"line":1001},[918,1782,1784],{"class":1783},"scd-l","Content-Type",[918,1786,1372],{"class":1010},[918,1788,1789],{"class":994}," application\u002Fjson; charset=utf-8\n",[918,1791,1792],{"class":971,"line":1007},[918,1793,1004],{"emptyLinePlaceholder":8},[918,1795,1796],{"class":971,"line":1029},[918,1797,1149],{"class":924},[918,1799,1800,1803,1805,1807,1809,1812],{"class":971,"line":1046},[918,1801,1802],{"class":1696},"  \"",[918,1804,1105],{"class":1700},[918,1806,1703],{"class":1696},[918,1808,1372],{"class":1018},[918,1810,1811],{"class":1157}," true",[918,1813,1161],{"class":924},[918,1815,1816,1818,1821,1823,1825,1827,1830,1832],{"class":971,"line":1051},[918,1817,1802],{"class":1696},[918,1819,1820],{"class":1700},"date",[918,1822,1703],{"class":1696},[918,1824,1372],{"class":1018},[918,1826,1723],{"class":990},[918,1828,1829],{"class":994},"current date",[918,1831,1703],{"class":990},[918,1833,1161],{"class":924},[918,1835,1836,1838,1841,1843,1845],{"class":971,"line":1083},[918,1837,1802],{"class":1696},[918,1839,1840],{"class":1700},"data",[918,1842,1703],{"class":1696},[918,1844,1372],{"class":1018},[918,1846,1847],{"class":924}," { \n",[918,1849,1850,1853,1855,1857,1859,1861,1863,1865],{"class":971,"line":1088},[918,1851,1852],{"class":1696},"      \"",[918,1854,1453],{"class":1700},[918,1856,1703],{"class":1696},[918,1858,1372],{"class":1018},[918,1860,1723],{"class":990},[918,1862,1198],{"class":994},[918,1864,1703],{"class":990},[918,1866,1867],{"class":924},", \n",[918,1869,1870,1872,1874,1876,1878,1880],{"class":971,"line":1111},[918,1871,1852],{"class":1696},[918,1873,1462],{"class":1700},[918,1875,1703],{"class":1696},[918,1877,1372],{"class":1018},[918,1879,1708],{"class":1210},[918,1881,1867],{"class":924},[918,1883,1884,1886,1888,1890,1892,1895],{"class":971,"line":1133},[918,1885,1852],{"class":1696},[918,1887,1472],{"class":1700},[918,1889,1703],{"class":1696},[918,1891,1372],{"class":1018},[918,1893,1894],{"class":1210}," 42",[918,1896,1897],{"class":924}," \n",[918,1899,1901],{"class":971,"line":1900},11,[918,1902,1903],{"class":924},"   }\n",[918,1905,1907],{"class":971,"line":1906},12,[918,1908,1136],{"class":924},[856,1910,1911],{},"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 it revokes an active token.",[856,1913,1914],{},"If the body does not match the schema, the route returns:",[961,1916,1918],{"className":914,"code":1917,"language":915,"meta":916,"style":916},"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",[860,1919,1920,1934,1942,1946,1950,1965,1983,2000],{"__ignoreMap":916},[918,1921,1922,1924,1926,1928,1931],{"class":971,"line":972},[918,1923,1766],{"class":1010},[918,1925,1769],{"class":924},[918,1927,1772],{"class":1210},[918,1929,1930],{"class":1210}," 400",[918,1932,1933],{"class":994}," Bad Request\n",[918,1935,1936,1938,1940],{"class":971,"line":1001},[918,1937,1784],{"class":1783},[918,1939,1372],{"class":1010},[918,1941,1789],{"class":994},[918,1943,1944],{"class":971,"line":1007},[918,1945,1004],{"emptyLinePlaceholder":8},[918,1947,1948],{"class":971,"line":1029},[918,1949,1149],{"class":924},[918,1951,1952,1954,1956,1958,1960,1963],{"class":971,"line":1046},[918,1953,1802],{"class":1696},[918,1955,1105],{"class":1700},[918,1957,1703],{"class":1696},[918,1959,1372],{"class":1018},[918,1961,1962],{"class":1157}," false",[918,1964,1161],{"class":924},[918,1966,1967,1969,1971,1973,1975,1977,1979,1981],{"class":971,"line":1051},[918,1968,1802],{"class":1696},[918,1970,1820],{"class":1700},[918,1972,1703],{"class":1696},[918,1974,1372],{"class":1018},[918,1976,1723],{"class":990},[918,1978,1829],{"class":994},[918,1980,1703],{"class":990},[918,1982,1161],{"class":924},[918,1984,1985,1987,1989,1991,1993,1995,1998],{"class":971,"line":1083},[918,1986,1802],{"class":1696},[918,1988,1128],{"class":1700},[918,1990,1703],{"class":1696},[918,1992,1372],{"class":1018},[918,1994,1723],{"class":990},[918,1996,1997],{"class":994},"Bad Request",[918,1999,1749],{"class":990},[918,2001,2002],{"class":971,"line":1088},[918,2003,1136],{"class":924},[856,2005,2006,2007,2009,2010,2013,2014,2016,2017,1074,2020,2022,2023,1372],{},"If the ",[860,2008,1561],{}," checksum is invalid, the token does not belong to the\ncurrent user, the token is already revoked, or the underlying revoke action\nfails, the route returns a ",[860,2011,2012],{},"401"," response with the reason provided by\n",[860,2015,907],{},", such as ",[860,2018,2019],{},"Invalid identity",[860,2021,1997],{},", or\n",[860,2024,1328],{},[961,2026,2028],{"className":914,"code":2027,"language":915,"meta":916,"style":916},"HTTP\u002F1.1 401 Unauthorized\nContent-Type: application\u002Fjson; charset=utf-8\n\n{\n  \"ok\": false,\n  \"date\": \"current date\",\n    \"reason\": \"reason from privateActionManager\"\n}\n",[860,2029,2030,2044,2052,2056,2060,2074,2092,2109],{"__ignoreMap":916},[918,2031,2032,2034,2036,2038,2041],{"class":971,"line":972},[918,2033,1766],{"class":1010},[918,2035,1769],{"class":924},[918,2037,1772],{"class":1210},[918,2039,2040],{"class":1210}," 401",[918,2042,2043],{"class":994}," Unauthorized\n",[918,2045,2046,2048,2050],{"class":971,"line":1001},[918,2047,1784],{"class":1783},[918,2049,1372],{"class":1010},[918,2051,1789],{"class":994},[918,2053,2054],{"class":971,"line":1007},[918,2055,1004],{"emptyLinePlaceholder":8},[918,2057,2058],{"class":971,"line":1029},[918,2059,1149],{"class":924},[918,2061,2062,2064,2066,2068,2070,2072],{"class":971,"line":1046},[918,2063,1802],{"class":1696},[918,2065,1105],{"class":1700},[918,2067,1703],{"class":1696},[918,2069,1372],{"class":1018},[918,2071,1962],{"class":1157},[918,2073,1161],{"class":924},[918,2075,2076,2078,2080,2082,2084,2086,2088,2090],{"class":971,"line":1051},[918,2077,1802],{"class":1696},[918,2079,1820],{"class":1700},[918,2081,1703],{"class":1696},[918,2083,1372],{"class":1018},[918,2085,1723],{"class":990},[918,2087,1829],{"class":994},[918,2089,1703],{"class":990},[918,2091,1161],{"class":924},[918,2093,2094,2096,2098,2100,2102,2104,2107],{"class":971,"line":1083},[918,2095,1697],{"class":1696},[918,2097,1128],{"class":1700},[918,2099,1703],{"class":1696},[918,2101,1372],{"class":1018},[918,2103,1723],{"class":990},[918,2105,2106],{"class":994},"reason from privateActionManager",[918,2108,1749],{"class":990},[918,2110,2111],{"class":971,"line":1088},[918,2112,1136],{"class":924},[928,2114,2115],{},[856,2116,2117,2118,2121],{},"Check the ",[869,2119,1650],{"href":2120},"\u002Fdocs\u002Fiam\u002Fessentials\u002Fapi\u002Fmanagement#service"," to\nsee the standard error response.",[1336,2123,2125],{"id":2124},"rate-limits","Rate Limits",[856,2127,2128],{},"The endpoint also enforces rate limits controlled under the following\nconfiguration options:",[893,2130,2131,2137],{},[896,2132,2133,2136],{},[860,2134,2135],{},"rate_limiters.apiTokensLimiters.operationRateLimits.revokeTokensLimiter"," -\nThe main limiter for the revoke endpoint. The default allows 5 revocations 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.",[896,2138,2139,2142,2143,2146,2147,2150,2156,2157,2160,2161],{},[860,2140,2141],{},"rate_limiters.apiTokensLimiters.generalUnionLimiter"," - A ",[860,2144,2145],{},"burstLimiter"," and\na ",[860,2148,2149],{},"slowLimiter",[869,2151,2155],{"href":2152,"rel":2153},"https:\u002F\u002Fgithub.com\u002Fanimir\u002Fnode-rate-limiter-flexible\u002Fwiki\u002FRateLimiterUnion",[2154],"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 ",[953,2158,2159],{},"restarted"," on successful\nrevocations.",[893,2162,2163,2168],{},[896,2164,2165,2167],{},[860,2166,2145],{}," - Will block the client for 15 minutes.",[896,2169,2170,2172],{},[860,2171,2149],{}," - Will block for 1 hour.",[937,2174,2176],{"id":2175},"configuration-reference","Configuration Reference",[856,2178,2179],{},"These configuration keys control revoke-specific throttling in the service.",[945,2181,2183],{"id":2182},"rate-limiters","Rate limiters",[856,2185,2186],{},"The revocation flow relies on the following limiter configuration:",[1493,2188,2189,2198],{},[1496,2190,2191],{},[1499,2192,2193,2196],{},[1502,2194,2195],{},"Limiter",[1502,2197,1510],{},[1512,2199,2200,2209],{},[1499,2201,2202,2206],{},[1517,2203,2204],{},[860,2205,2135],{},[1517,2207,2208],{},"The main rate limiter for the revoke endpoint",[1499,2210,2211,2215],{},[1517,2212,2213],{},[860,2214,2141],{},[1517,2216,2217],{},"General burst limiter",[2219,2220,2221],"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 .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 .spgvN, html code.shiki .spgvN{--shiki-light:#098658;--shiki-default:#098658;--shiki-dark:#BD93F9}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":916,"searchDepth":1001,"depth":1001,"links":2223},[2224,2228],{"id":939,"depth":1001,"text":940,"children":2225},[2226,2227],{"id":947,"depth":1007,"text":948},{"id":1668,"depth":1007,"text":1669},{"id":2175,"depth":1001,"text":2176,"children":2229},[2230],{"id":2182,"depth":1007,"text":2183},"How to permanently invalidate an API token.","md","i-lucide-trash-2",{},null,"---\ntitle: Revocation\ndescription: How to permanently invalidate an API token.\nicon: i-lucide-trash-2\n---\n\nRevocation permanently invalidates an API token by setting its `valid` field to\n`0` in the database. After that happens, the\n[verification process](\u002Fdocs\u002Fiam\u002Fessentials\u002Fapi\u002Fverification) rejects the key,\nand the token can no longer be used for machine-to-machine access.\n\nThe IAM service keeps revoked token rows instead of deleting them during the\nstandard revoke flow. This gives you a stable way to disable leaked, rotated,\nor no longer needed tokens while preserving their metadata for later auditing.\n\nThe direct library function `revokeApiKey` is idempotent. If the\nprovided token is already invalid, missing, or does not pass verification, it\nstill returns a success payload. The route behaves differently,\nbecause it only looks up currently valid tokens before dispatching the\nrevocation.\n\n::caution\nRevocation is permanent. Revoked tokens cannot be reactivated. Create a new\ntoken if you need replacement access.\n::\n\nYou can revoke a token in 3 ways:\n\n- Directly calling `revokeApiKey`.\n- Using the `privateActionManager` to validate ownership before revoking.\n- Calling the `POST \u002Fapi\u002Fmanage\u002Frevoke`{lang=\"http\"} endpoint from an\n    authenticated client.\n\n::note\nFollow the [Creating Tokens](\u002Fdocs\u002Fiam\u002Fessentials\u002Fapi\u002Fcreation) docs to create\na token first before attempting to revoke it.\n::\n\n## Revoking Tokens\n\nYou can revoke tokens either directly in the library or through the route. The direct helper focuses on the token itself, while the\nroute adds ownership validation and authenticated client protections.\n\n### Using the library\n\nTo revoke a token *directly*, you call `revokeApiKey`. This function hashes the\nprovided token when needed, verifies it against the stored privilege, and then\nmarks the token as invalid.\n\n```ts [example.ts]\nimport { revokeApiKey } from '@riavzon\u002Fauth'\n\nconst token = 'api_1234'\nconst privilege = 'restricted'\n\nconst results = await revokeApiKey(token, privilege)\n\nif (!results.ok) {\n    console.error(results.reason)\n}\n```\n\nOn success you can get back one of two payloads. When the token is valid and\nthe privilege matches, the response contains the revoked token id and user id:\n\n```ts\n{\n    ok: true,\n    date: new Date().toISOString(),\n    data: {\n        msg: 'Token invalided successfully',\n        invalidedTokenId: 12,\n        userId: 42\n    }\n}\n```\n\nIf the token is already invalid, missing, or does not pass verification, the\nfunction still returns `ok: true` with a string payload:\n\n```ts\n{\n    ok: true,\n    date: new Date().toISOString(),\n    data: 'Token invalided successfully'\n}\n```\n\nOn error, such as a database failure, you get:\n\n```ts\n{\n    ok: false,\n    date: new Date().toISOString(),\n    reason: 'Error invalidating token'\n}\n```\n\n#### Signature\n\nThe direct helper exposes the following signature:\n\n```ts\nexport async function revokeApiKey(\n    rawKey: string,\n    providedPrivilege: 'demo' | 'restricted' | 'protected' | 'full' | 'custom',\n): Promise\u003CResults\u003C{msg: string, invalidedTokenId: number, userId: number} | string>>\n```\n\n#### Parameters\n\n| Field | Type | Description |\n|---|---|---|\n| `rawKey` | `string` | The token to be revoked. It can be hashed or *Raw*. |\n| `providedPrivilege` | `'demo' \\| 'restricted' \\| 'protected' \\| 'full' \\| 'custom'` | The privilege assigned to the token you want to revoke. |\n\n::warning\nThis action should be performed by a fully authenticated client.\n::\n\n::caution\nThis function does not require the `publicIdentifier`, and it bypasses IP\nrestriction checks and usage counter updates during its internal verification\nstep. Only call it directly in trusted server-side code.\n::\n\n#### With the `privateActionManager`\n\nThe safest internal method is using the `privateActionManager`. This function\nchecks the `publicIdentifier`, token id, token name, user id, and current valid\nstatus before dispatching the revocation.\n\n```ts [example.ts]\nconst revokeRes = await privateActionManager(userId, tokenId, publicIdentifier, tokenName, {\n  action: 'revoke'\n})\n```\n\nThe `privateActionManager` returns the response of `revokeApiKey` 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, manager-based\nrevocation does not behave like the direct `revokeApiKey` call when the token\nis already revoked.\n::\n\n---\n\n### Using the route\n\nLet's say you want to revoke a token from your authenticated client or BFF.\n\n`POST \u002Fapi\u002Fmanage\u002Frevoke`{lang=\"http\"} body:\n\n```json\n{\n    \"tokenId\": 12,\n    \"publicIdentifier\": \"public_identifier\",\n    \"name\": \"the token name\"\n}\n```\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  \"ok\": true,\n  \"date\": \"current date\",\n  \"data\": { \n      \"msg\": \"Token invalided successfully\", \n      \"invalidedTokenId\": 12, \n      \"userId\": 42 \n   }\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 it revokes an active token.\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  \"ok\": false,\n  \"date\": \"current date\",\n  \"reason\": \"Bad Request\"\n}\n```\n\n\nIf the `publicIdentifier` checksum is invalid, the token does not belong to the\ncurrent user, the token is already revoked, or the underlying revoke action\nfails, the route returns a `401` response with the reason provided by\n`privateActionManager`, such as `Invalid identity`, `Bad Request`, or\n`Error invalidating token`:\n\n```http\nHTTP\u002F1.1 401 Unauthorized\nContent-Type: application\u002Fjson; charset=utf-8\n\n{\n  \"ok\": false,\n  \"date\": \"current date\",\n    \"reason\": \"reason from privateActionManager\"\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.revokeTokensLimiter` -\n    The main limiter for the revoke endpoint. The default allows 5 revocations in\n    a window of 10 minutes and will trigger a block for 2 hours if this limit is\n    met. Consecutive triggers in this period will block the client permanently.\n\n- `rate_limiters.apiTokensLimiters.generalUnionLimiter` - A `burstLimiter` and\n    a `slowLimiter`\n    [union limiter](https:\u002F\u002Fgithub.com\u002Fanimir\u002Fnode-rate-limiter-flexible\u002Fwiki\u002FRateLimiterUnion).\n    It enforces no more than one request per second, and only 50 per minute. No\n    consecutive triggers in this limiter are provided, and triggering it again\n    will result in a permanent ban. The limiter is *restarted* on successful\n    revocations.\n    - `burstLimiter` - Will block the client for 15 minutes.\n    - `slowLimiter` - Will block for 1 hour.\n\n\n## Configuration Reference\n\nThese configuration keys control revoke-specific throttling in the service.\n\n### Rate limiters\n\nThe revocation flow relies on the following limiter configuration:\n\n| Limiter | Description |\n|---|---|\n| `rate_limiters.apiTokensLimiters.operationRateLimits.revokeTokensLimiter` | The main rate limiter for the revoke endpoint |\n| `rate_limiters.apiTokensLimiters.generalUnionLimiter` | General burst limiter |",{"title":191,"description":2231},"gd2wKXqBTMn2RR4sxVm9dYlS3A1Xf6jViOHA5waMey4",[2240,2241],{"title":187,"path":188,"stem":189,"children":-1},{"title":195,"path":196,"stem":197,"children":-1},{"id":851,"title":191,"body":2243,"description":2231,"extension":2232,"icon":2233,"meta":3313,"module":2235,"navigation":8,"path":192,"rawbody":2236,"seo":3314,"stem":193,"__hash__":2238},{"type":853,"value":2244,"toc":3304},[2245,2253,2255,2259,2263,2265,2283,2289,2291,2293,2295,2301,2423,2425,2493,2497,2541,2543,2587,2589,2591,2707,2709,2749,2753,2759,2763,2769,2819,2827,2835,2837,2839,2841,2849,2909,2911,3041,3043,3045,3129,3143,3227,3233,3235,3237,3266,3268,3270,3272,3274,3302],[856,2246,858,2247,863,2249,867,2251,872],{},[860,2248,862],{},[860,2250,866],{},[869,2252,871],{"href":178},[856,2254,875],{},[856,2256,878,2257,882],{},[860,2258,881],{},[884,2260,2261],{},[856,2262,888],{},[856,2264,891],{},[893,2266,2267,2271,2275],{},[896,2268,898,2269,901],{},[860,2270,881],{},[896,2272,904,2273,908],{},[860,2274,907],{},[896,2276,911,2277,926],{},[860,2278,2279,2281],{"className":914,"language":915,"style":916},[918,2280,921],{"class":920},[918,2282,925],{"class":924},[928,2284,2285],{},[856,2286,932,2287,935],{},[869,2288,173],{"href":174},[937,2290,940],{"id":939},[856,2292,943],{},[945,2294,948],{"id":947},[856,2296,951,2297,956,2299,959],{},[953,2298,955],{},[860,2300,881],{},[961,2302,2303],{"className":963,"code":964,"filename":965,"language":966,"meta":916,"style":916},[860,2304,2305,2323,2327,2341,2355,2359,2381,2385,2401,2419],{"__ignoreMap":916},[918,2306,2307,2309,2311,2313,2315,2317,2319,2321],{"class":971,"line":972},[918,2308,975],{"class":920},[918,2310,978],{"class":924},[918,2312,881],{"class":981},[918,2314,984],{"class":924},[918,2316,987],{"class":920},[918,2318,991],{"class":990},[918,2320,995],{"class":994},[918,2322,998],{"class":990},[918,2324,2325],{"class":971,"line":1001},[918,2326,1004],{"emptyLinePlaceholder":8},[918,2328,2329,2331,2333,2335,2337,2339],{"class":971,"line":1007},[918,2330,1011],{"class":1010},[918,2332,1015],{"class":1014},[918,2334,1019],{"class":1018},[918,2336,991],{"class":990},[918,2338,1024],{"class":994},[918,2340,998],{"class":990},[918,2342,2343,2345,2347,2349,2351,2353],{"class":971,"line":1029},[918,2344,1011],{"class":1010},[918,2346,1034],{"class":1014},[918,2348,1019],{"class":1018},[918,2350,991],{"class":990},[918,2352,1041],{"class":994},[918,2354,998],{"class":990},[918,2356,2357],{"class":971,"line":1046},[918,2358,1004],{"emptyLinePlaceholder":8},[918,2360,2361,2363,2365,2367,2369,2371,2373,2375,2377,2379],{"class":971,"line":1051},[918,2362,1011],{"class":1010},[918,2364,1056],{"class":1014},[918,2366,1019],{"class":1018},[918,2368,1061],{"class":920},[918,2370,1065],{"class":1064},[918,2372,1068],{"class":924},[918,2374,1071],{"class":981},[918,2376,1074],{"class":924},[918,2378,1077],{"class":981},[918,2380,1080],{"class":924},[918,2382,2383],{"class":971,"line":1083},[918,2384,1004],{"emptyLinePlaceholder":8},[918,2386,2387,2389,2391,2393,2395,2397,2399],{"class":971,"line":1088},[918,2388,1091],{"class":920},[918,2390,1094],{"class":924},[918,2392,1097],{"class":1018},[918,2394,1100],{"class":981},[918,2396,901],{"class":924},[918,2398,1105],{"class":981},[918,2400,1108],{"class":924},[918,2402,2403,2405,2407,2409,2411,2413,2415,2417],{"class":971,"line":1111},[918,2404,1114],{"class":981},[918,2406,901],{"class":924},[918,2408,1119],{"class":1064},[918,2410,1068],{"class":924},[918,2412,1100],{"class":981},[918,2414,901],{"class":924},[918,2416,1128],{"class":981},[918,2418,1080],{"class":924},[918,2420,2421],{"class":971,"line":1133},[918,2422,1136],{"class":924},[856,2424,1139],{},[961,2426,2427],{"className":963,"code":1142,"language":966,"meta":916,"style":916},[860,2428,2429,2433,2441,2455,2459,2471,2479,2485,2489],{"__ignoreMap":916},[918,2430,2431],{"class":971,"line":972},[918,2432,1149],{"class":924},[918,2434,2435,2437,2439],{"class":971,"line":1001},[918,2436,1154],{"class":924},[918,2438,1158],{"class":1157},[918,2440,1161],{"class":924},[918,2442,2443,2445,2447,2449,2451,2453],{"class":971,"line":1007},[918,2444,1166],{"class":924},[918,2446,1170],{"class":1169},[918,2448,1173],{"class":1064},[918,2450,1176],{"class":924},[918,2452,1179],{"class":1064},[918,2454,1182],{"class":924},[918,2456,2457],{"class":971,"line":1029},[918,2458,1187],{"class":924},[918,2460,2461,2463,2465,2467,2469],{"class":971,"line":1046},[918,2462,1192],{"class":924},[918,2464,1195],{"class":990},[918,2466,1198],{"class":994},[918,2468,1195],{"class":990},[918,2470,1161],{"class":924},[918,2472,2473,2475,2477],{"class":971,"line":1051},[918,2474,1207],{"class":924},[918,2476,1211],{"class":1210},[918,2478,1161],{"class":924},[918,2480,2481,2483],{"class":971,"line":1083},[918,2482,1218],{"class":924},[918,2484,1221],{"class":1210},[918,2486,2487],{"class":971,"line":1088},[918,2488,1226],{"class":924},[918,2490,2491],{"class":971,"line":1111},[918,2492,1136],{"class":924},[856,2494,1233,2495,1237],{},[860,2496,1236],{},[961,2498,2499],{"className":963,"code":1240,"language":966,"meta":916,"style":916},[860,2500,2501,2505,2513,2527,2537],{"__ignoreMap":916},[918,2502,2503],{"class":971,"line":972},[918,2504,1149],{"class":924},[918,2506,2507,2509,2511],{"class":971,"line":1001},[918,2508,1154],{"class":924},[918,2510,1158],{"class":1157},[918,2512,1161],{"class":924},[918,2514,2515,2517,2519,2521,2523,2525],{"class":971,"line":1007},[918,2516,1166],{"class":924},[918,2518,1170],{"class":1169},[918,2520,1173],{"class":1064},[918,2522,1176],{"class":924},[918,2524,1179],{"class":1064},[918,2526,1182],{"class":924},[918,2528,2529,2531,2533,2535],{"class":971,"line":1029},[918,2530,1273],{"class":924},[918,2532,1195],{"class":990},[918,2534,1198],{"class":994},[918,2536,998],{"class":990},[918,2538,2539],{"class":971,"line":1046},[918,2540,1136],{"class":924},[856,2542,1286],{},[961,2544,2545],{"className":963,"code":1289,"language":966,"meta":916,"style":916},[860,2546,2547,2551,2559,2573,2583],{"__ignoreMap":916},[918,2548,2549],{"class":971,"line":972},[918,2550,1149],{"class":924},[918,2552,2553,2555,2557],{"class":971,"line":1001},[918,2554,1154],{"class":924},[918,2556,1302],{"class":1157},[918,2558,1161],{"class":924},[918,2560,2561,2563,2565,2567,2569,2571],{"class":971,"line":1007},[918,2562,1166],{"class":924},[918,2564,1170],{"class":1169},[918,2566,1173],{"class":1064},[918,2568,1176],{"class":924},[918,2570,1179],{"class":1064},[918,2572,1182],{"class":924},[918,2574,2575,2577,2579,2581],{"class":971,"line":1029},[918,2576,1323],{"class":924},[918,2578,1195],{"class":990},[918,2580,1328],{"class":994},[918,2582,998],{"class":990},[918,2584,2585],{"class":971,"line":1046},[918,2586,1136],{"class":924},[1336,2588,1339],{"id":1338},[856,2590,1342],{},[961,2592,2593],{"className":963,"code":1345,"language":966,"meta":916,"style":916},[860,2594,2595,2607,2617,2663],{"__ignoreMap":916},[918,2596,2597,2599,2601,2603,2605],{"class":971,"line":972},[918,2598,1352],{"class":920},[918,2600,1355],{"class":1010},[918,2602,1358],{"class":1010},[918,2604,1065],{"class":1064},[918,2606,1363],{"class":924},[918,2608,2609,2611,2613,2615],{"class":971,"line":1001},[918,2610,1369],{"class":1368},[918,2612,1372],{"class":1018},[918,2614,1376],{"class":1375},[918,2616,1161],{"class":924},[918,2618,2619,2621,2623,2625,2627,2629,2631,2633,2635,2637,2639,2641,2643,2645,2647,2649,2651,2653,2655,2657,2659,2661],{"class":971,"line":1007},[918,2620,1383],{"class":1368},[918,2622,1372],{"class":1018},[918,2624,991],{"class":990},[918,2626,1390],{"class":994},[918,2628,1195],{"class":990},[918,2630,1395],{"class":1018},[918,2632,991],{"class":990},[918,2634,1041],{"class":994},[918,2636,1195],{"class":990},[918,2638,1395],{"class":1018},[918,2640,991],{"class":990},[918,2642,1408],{"class":994},[918,2644,1195],{"class":990},[918,2646,1395],{"class":1018},[918,2648,991],{"class":990},[918,2650,1417],{"class":994},[918,2652,1195],{"class":990},[918,2654,1395],{"class":1018},[918,2656,991],{"class":990},[918,2658,1426],{"class":994},[918,2660,1195],{"class":990},[918,2662,1161],{"class":924},[918,2664,2665,2667,2669,2671,2673,2675,2677,2679,2681,2683,2685,2687,2689,2691,2693,2695,2697,2699,2701,2703,2705],{"class":971,"line":1029},[918,2666,1435],{"class":924},[918,2668,1372],{"class":1018},[918,2670,1440],{"class":1375},[918,2672,1443],{"class":924},[918,2674,1447],{"class":1446},[918,2676,1450],{"class":924},[918,2678,1453],{"class":981},[918,2680,1372],{"class":1018},[918,2682,1376],{"class":1375},[918,2684,1074],{"class":924},[918,2686,1462],{"class":981},[918,2688,1372],{"class":1018},[918,2690,1467],{"class":1375},[918,2692,1074],{"class":924},[918,2694,1472],{"class":981},[918,2696,1372],{"class":1018},[918,2698,1467],{"class":1375},[918,2700,1479],{"class":924},[918,2702,1482],{"class":1018},[918,2704,1376],{"class":1375},[918,2706,1487],{"class":924},[1336,2708,1491],{"id":1490},[1493,2710,2711,2721],{},[1496,2712,2713],{},[1499,2714,2715,2717,2719],{},[1502,2716,1504],{},[1502,2718,1507],{},[1502,2720,1510],{},[1512,2722,2723,2737],{},[1499,2724,2725,2729,2733],{},[1517,2726,2727],{},[860,2728,1521],{},[1517,2730,2731],{},[860,2732,1526],{},[1517,2734,1529,2735,901],{},[953,2736,1532],{},[1499,2738,2739,2743,2747],{},[1517,2740,2741],{},[860,2742,1539],{},[1517,2744,2745],{},[860,2746,1544],{},[1517,2748,1547],{},[1549,2750,2751],{},[856,2752,1553],{},[884,2754,2755],{},[856,2756,1558,2757,1562],{},[860,2758,1561],{},[1336,2760,1566,2761],{"id":1565},[860,2762,907],{},[856,2764,1571,2765,1574,2767,1577],{},[860,2766,907],{},[860,2768,1561],{},[961,2770,2771],{"className":963,"code":1580,"filename":965,"language":966,"meta":916,"style":916},[860,2772,2773,2803,2815],{"__ignoreMap":916},[918,2774,2775,2777,2779,2781,2783,2785,2787,2789,2791,2793,2795,2797,2799,2801],{"class":971,"line":972},[918,2776,1011],{"class":1010},[918,2778,1589],{"class":1014},[918,2780,1019],{"class":1018},[918,2782,1061],{"class":920},[918,2784,1596],{"class":1064},[918,2786,1068],{"class":924},[918,2788,1472],{"class":981},[918,2790,1074],{"class":924},[918,2792,1605],{"class":981},[918,2794,1074],{"class":924},[918,2796,1561],{"class":981},[918,2798,1074],{"class":924},[918,2800,1614],{"class":981},[918,2802,1617],{"class":924},[918,2804,2805,2807,2809,2811,2813],{"class":971,"line":1001},[918,2806,1622],{"class":981},[918,2808,1372],{"class":1625},[918,2810,991],{"class":990},[918,2812,1630],{"class":994},[918,2814,998],{"class":990},[918,2816,2817],{"class":971,"line":1007},[918,2818,1637],{"class":924},[856,2820,1640,2821,1643,2823,1646,2825,901],{},[860,2822,907],{},[860,2824,881],{},[869,2826,1650],{"href":1649},[928,2828,2829],{},[856,2830,1655,2831,1659,2833,1662],{},[860,2832,1658],{},[860,2834,881],{},[1664,2836],{},[945,2838,1669],{"id":1668},[856,2840,1672],{},[856,2842,2843,1681],{},[860,2844,2845,2847],{"className":914,"language":915,"style":916},[918,2846,921],{"class":920},[918,2848,925],{"class":924},[961,2850,2851],{"className":1684,"code":1685,"language":5,"meta":916,"style":916},[860,2852,2853,2857,2871,2889,2905],{"__ignoreMap":916},[918,2854,2855],{"class":971,"line":972},[918,2856,1149],{"class":924},[918,2858,2859,2861,2863,2865,2867,2869],{"class":971,"line":1001},[918,2860,1697],{"class":1696},[918,2862,1605],{"class":1700},[918,2864,1703],{"class":1696},[918,2866,1372],{"class":1018},[918,2868,1708],{"class":1210},[918,2870,1161],{"class":924},[918,2872,2873,2875,2877,2879,2881,2883,2885,2887],{"class":971,"line":1007},[918,2874,1697],{"class":1696},[918,2876,1561],{"class":1700},[918,2878,1703],{"class":1696},[918,2880,1372],{"class":1018},[918,2882,1723],{"class":990},[918,2884,1726],{"class":994},[918,2886,1703],{"class":990},[918,2888,1161],{"class":924},[918,2890,2891,2893,2895,2897,2899,2901,2903],{"class":971,"line":1029},[918,2892,1697],{"class":1696},[918,2894,1737],{"class":1700},[918,2896,1703],{"class":1696},[918,2898,1372],{"class":1018},[918,2900,1723],{"class":990},[918,2902,1746],{"class":994},[918,2904,1749],{"class":990},[918,2906,2907],{"class":971,"line":1046},[918,2908,1136],{"class":924},[856,2910,1756],{},[961,2912,2913],{"className":914,"code":1759,"language":915,"meta":916,"style":916},[860,2914,2915,2927,2935,2939,2943,2957,2975,2987,3005,3019,3033,3037],{"__ignoreMap":916},[918,2916,2917,2919,2921,2923,2925],{"class":971,"line":972},[918,2918,1766],{"class":1010},[918,2920,1769],{"class":924},[918,2922,1772],{"class":1210},[918,2924,1775],{"class":1210},[918,2926,1778],{"class":994},[918,2928,2929,2931,2933],{"class":971,"line":1001},[918,2930,1784],{"class":1783},[918,2932,1372],{"class":1010},[918,2934,1789],{"class":994},[918,2936,2937],{"class":971,"line":1007},[918,2938,1004],{"emptyLinePlaceholder":8},[918,2940,2941],{"class":971,"line":1029},[918,2942,1149],{"class":924},[918,2944,2945,2947,2949,2951,2953,2955],{"class":971,"line":1046},[918,2946,1802],{"class":1696},[918,2948,1105],{"class":1700},[918,2950,1703],{"class":1696},[918,2952,1372],{"class":1018},[918,2954,1811],{"class":1157},[918,2956,1161],{"class":924},[918,2958,2959,2961,2963,2965,2967,2969,2971,2973],{"class":971,"line":1051},[918,2960,1802],{"class":1696},[918,2962,1820],{"class":1700},[918,2964,1703],{"class":1696},[918,2966,1372],{"class":1018},[918,2968,1723],{"class":990},[918,2970,1829],{"class":994},[918,2972,1703],{"class":990},[918,2974,1161],{"class":924},[918,2976,2977,2979,2981,2983,2985],{"class":971,"line":1083},[918,2978,1802],{"class":1696},[918,2980,1840],{"class":1700},[918,2982,1703],{"class":1696},[918,2984,1372],{"class":1018},[918,2986,1847],{"class":924},[918,2988,2989,2991,2993,2995,2997,2999,3001,3003],{"class":971,"line":1088},[918,2990,1852],{"class":1696},[918,2992,1453],{"class":1700},[918,2994,1703],{"class":1696},[918,2996,1372],{"class":1018},[918,2998,1723],{"class":990},[918,3000,1198],{"class":994},[918,3002,1703],{"class":990},[918,3004,1867],{"class":924},[918,3006,3007,3009,3011,3013,3015,3017],{"class":971,"line":1111},[918,3008,1852],{"class":1696},[918,3010,1462],{"class":1700},[918,3012,1703],{"class":1696},[918,3014,1372],{"class":1018},[918,3016,1708],{"class":1210},[918,3018,1867],{"class":924},[918,3020,3021,3023,3025,3027,3029,3031],{"class":971,"line":1133},[918,3022,1852],{"class":1696},[918,3024,1472],{"class":1700},[918,3026,1703],{"class":1696},[918,3028,1372],{"class":1018},[918,3030,1894],{"class":1210},[918,3032,1897],{"class":924},[918,3034,3035],{"class":971,"line":1900},[918,3036,1903],{"class":924},[918,3038,3039],{"class":971,"line":1906},[918,3040,1136],{"class":924},[856,3042,1911],{},[856,3044,1914],{},[961,3046,3047],{"className":914,"code":1917,"language":915,"meta":916,"style":916},[860,3048,3049,3061,3069,3073,3077,3091,3109,3125],{"__ignoreMap":916},[918,3050,3051,3053,3055,3057,3059],{"class":971,"line":972},[918,3052,1766],{"class":1010},[918,3054,1769],{"class":924},[918,3056,1772],{"class":1210},[918,3058,1930],{"class":1210},[918,3060,1933],{"class":994},[918,3062,3063,3065,3067],{"class":971,"line":1001},[918,3064,1784],{"class":1783},[918,3066,1372],{"class":1010},[918,3068,1789],{"class":994},[918,3070,3071],{"class":971,"line":1007},[918,3072,1004],{"emptyLinePlaceholder":8},[918,3074,3075],{"class":971,"line":1029},[918,3076,1149],{"class":924},[918,3078,3079,3081,3083,3085,3087,3089],{"class":971,"line":1046},[918,3080,1802],{"class":1696},[918,3082,1105],{"class":1700},[918,3084,1703],{"class":1696},[918,3086,1372],{"class":1018},[918,3088,1962],{"class":1157},[918,3090,1161],{"class":924},[918,3092,3093,3095,3097,3099,3101,3103,3105,3107],{"class":971,"line":1051},[918,3094,1802],{"class":1696},[918,3096,1820],{"class":1700},[918,3098,1703],{"class":1696},[918,3100,1372],{"class":1018},[918,3102,1723],{"class":990},[918,3104,1829],{"class":994},[918,3106,1703],{"class":990},[918,3108,1161],{"class":924},[918,3110,3111,3113,3115,3117,3119,3121,3123],{"class":971,"line":1083},[918,3112,1802],{"class":1696},[918,3114,1128],{"class":1700},[918,3116,1703],{"class":1696},[918,3118,1372],{"class":1018},[918,3120,1723],{"class":990},[918,3122,1997],{"class":994},[918,3124,1749],{"class":990},[918,3126,3127],{"class":971,"line":1088},[918,3128,1136],{"class":924},[856,3130,2006,3131,2009,3133,2013,3135,2016,3137,1074,3139,2022,3141,1372],{},[860,3132,1561],{},[860,3134,2012],{},[860,3136,907],{},[860,3138,2019],{},[860,3140,1997],{},[860,3142,1328],{},[961,3144,3145],{"className":914,"code":2027,"language":915,"meta":916,"style":916},[860,3146,3147,3159,3167,3171,3175,3189,3207,3223],{"__ignoreMap":916},[918,3148,3149,3151,3153,3155,3157],{"class":971,"line":972},[918,3150,1766],{"class":1010},[918,3152,1769],{"class":924},[918,3154,1772],{"class":1210},[918,3156,2040],{"class":1210},[918,3158,2043],{"class":994},[918,3160,3161,3163,3165],{"class":971,"line":1001},[918,3162,1784],{"class":1783},[918,3164,1372],{"class":1010},[918,3166,1789],{"class":994},[918,3168,3169],{"class":971,"line":1007},[918,3170,1004],{"emptyLinePlaceholder":8},[918,3172,3173],{"class":971,"line":1029},[918,3174,1149],{"class":924},[918,3176,3177,3179,3181,3183,3185,3187],{"class":971,"line":1046},[918,3178,1802],{"class":1696},[918,3180,1105],{"class":1700},[918,3182,1703],{"class":1696},[918,3184,1372],{"class":1018},[918,3186,1962],{"class":1157},[918,3188,1161],{"class":924},[918,3190,3191,3193,3195,3197,3199,3201,3203,3205],{"class":971,"line":1051},[918,3192,1802],{"class":1696},[918,3194,1820],{"class":1700},[918,3196,1703],{"class":1696},[918,3198,1372],{"class":1018},[918,3200,1723],{"class":990},[918,3202,1829],{"class":994},[918,3204,1703],{"class":990},[918,3206,1161],{"class":924},[918,3208,3209,3211,3213,3215,3217,3219,3221],{"class":971,"line":1083},[918,3210,1697],{"class":1696},[918,3212,1128],{"class":1700},[918,3214,1703],{"class":1696},[918,3216,1372],{"class":1018},[918,3218,1723],{"class":990},[918,3220,2106],{"class":994},[918,3222,1749],{"class":990},[918,3224,3225],{"class":971,"line":1088},[918,3226,1136],{"class":924},[928,3228,3229],{},[856,3230,2117,3231,2121],{},[869,3232,1650],{"href":2120},[1336,3234,2125],{"id":2124},[856,3236,2128],{},[893,3238,3239,3243],{},[896,3240,3241,2136],{},[860,3242,2135],{},[896,3244,3245,2142,3247,2146,3249,3251,2156,3254,2160,3256],{},[860,3246,2141],{},[860,3248,2145],{},[860,3250,2149],{},[869,3252,2155],{"href":2152,"rel":3253},[2154],[953,3255,2159],{},[893,3257,3258,3262],{},[896,3259,3260,2167],{},[860,3261,2145],{},[896,3263,3264,2172],{},[860,3265,2149],{},[937,3267,2176],{"id":2175},[856,3269,2179],{},[945,3271,2183],{"id":2182},[856,3273,2186],{},[1493,3275,3276,3284],{},[1496,3277,3278],{},[1499,3279,3280,3282],{},[1502,3281,2195],{},[1502,3283,1510],{},[1512,3285,3286,3294],{},[1499,3287,3288,3292],{},[1517,3289,3290],{},[860,3291,2135],{},[1517,3293,2208],{},[1499,3295,3296,3300],{},[1517,3297,3298],{},[860,3299,2141],{},[1517,3301,2217],{},[2219,3303,2221],{},{"title":916,"searchDepth":1001,"depth":1001,"links":3305},[3306,3310],{"id":939,"depth":1001,"text":940,"children":3307},[3308,3309],{"id":947,"depth":1007,"text":948},{"id":1668,"depth":1007,"text":1669},{"id":2175,"depth":1001,"text":2176,"children":3311},[3312],{"id":2182,"depth":1007,"text":2183},{},{"title":191,"description":2231},1780436286339]