[{"data":1,"prerenderedAt":2442},["ShallowReactive",2],{"navLinks":3,"sidebar_docs_navigation_\u002Fdocs\u002Fauth-h3client":64,"navigation":217,"navLinks_footer":829,"\u002Fdocs\u002Fauth-h3client\u002Fmfa\u002Fpassword-reset_page":842,"\u002Fdocs\u002Fauth-h3client\u002Fmfa\u002Fpassword-reset_surround":1772,"\u002Fdocs\u002Fauth-h3client\u002Fmfa\u002Fpassword-reset":1775},{"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":20,"path":22,"stem":70,"children":71},"docs\u002Fauth-h3client\u002Findex",[72,73,82,119,145,167,170,191,195],{"title":20,"path":22,"stem":70},{"title":14,"path":74,"stem":75,"children":76},"\u002Fdocs\u002Fauth-h3client\u002Fgetting-started","docs\u002Fauth-h3client\u002F00.getting-started\u002Findex",[77,78],{"title":14,"path":74,"stem":75},{"title":79,"path":80,"stem":81},"Nuxt Module","\u002Fdocs\u002Fauth-h3client\u002Fgetting-started\u002Fnuxt","docs\u002Fauth-h3client\u002F00.getting-started\u002F00.nuxt",{"title":83,"path":84,"stem":85,"children":86},"Essentials","\u002Fdocs\u002Fauth-h3client\u002Fessentials","docs\u002Fauth-h3client\u002F01.essentials\u002Findex",[87,88,92,96,100,104,108,111,115],{"title":83,"path":84,"stem":85},{"title":89,"path":90,"stem":91},"Session Management","\u002Fdocs\u002Fauth-h3client\u002Fessentials\u002Fsession","docs\u002Fauth-h3client\u002F01.essentials\u002F00.session",{"title":93,"path":94,"stem":95},"Route Protection","\u002Fdocs\u002Fauth-h3client\u002Fessentials\u002Froute-protection","docs\u002Fauth-h3client\u002F01.essentials\u002F01.route-protection",{"title":97,"path":98,"stem":99},"CSRF Protection","\u002Fdocs\u002Fauth-h3client\u002Fessentials\u002Fcsrf","docs\u002Fauth-h3client\u002F01.essentials\u002F02.csrf",{"title":101,"path":102,"stem":103},"Auth Flows","\u002Fdocs\u002Fauth-h3client\u002Fessentials\u002Fauth-flows","docs\u002Fauth-h3client\u002F01.essentials\u002F03.auth-flows",{"title":105,"path":106,"stem":107},"OAuth and OIDC","\u002Fdocs\u002Fauth-h3client\u002Fessentials\u002Foauth","docs\u002Fauth-h3client\u002F01.essentials\u002F04.oauth",{"title":33,"path":109,"stem":110},"\u002Fdocs\u002Fauth-h3client\u002Fessentials\u002Fbot-detection","docs\u002Fauth-h3client\u002F01.essentials\u002F05.bot-detection",{"title":112,"path":113,"stem":114},"Cookies","\u002Fdocs\u002Fauth-h3client\u002Fessentials\u002Fcookies","docs\u002Fauth-h3client\u002F01.essentials\u002F06.cookies",{"title":116,"path":117,"stem":118},"Logging","\u002Fdocs\u002Fauth-h3client\u002Fessentials\u002Flogging","docs\u002Fauth-h3client\u002F01.essentials\u002F07.logging",{"title":120,"path":121,"stem":122,"children":123},"MFA","\u002Fdocs\u002Fauth-h3client\u002Fmfa","docs\u002Fauth-h3client\u002F02.mfa\u002Findex",[124,125,129,133,137,141],{"title":120,"path":121,"stem":122},{"title":126,"path":127,"stem":128},"Built-in MFA","\u002Fdocs\u002Fauth-h3client\u002Fmfa\u002Fbuilt-in-flow","docs\u002Fauth-h3client\u002F02.mfa\u002F01.built-in-flow",{"title":130,"path":131,"stem":132},"Password Reset","\u002Fdocs\u002Fauth-h3client\u002Fmfa\u002Fpassword-reset","docs\u002Fauth-h3client\u002F02.mfa\u002F02.password-reset",{"title":134,"path":135,"stem":136},"Email Change","\u002Fdocs\u002Fauth-h3client\u002Fmfa\u002Femail-change","docs\u002Fauth-h3client\u002F02.mfa\u002F03.email-change",{"title":138,"path":139,"stem":140},"Custom MFA Flow","\u002Fdocs\u002Fauth-h3client\u002Fmfa\u002Fcustom-flow","docs\u002Fauth-h3client\u002F02.mfa\u002F04.custom-flow",{"title":142,"path":143,"stem":144},"Client-Side MFA","\u002Fdocs\u002Fauth-h3client\u002Fmfa\u002Fclient-side","docs\u002Fauth-h3client\u002F02.mfa\u002F05.client-side",{"title":146,"path":147,"stem":148,"children":149},"Client-side","\u002Fdocs\u002Fauth-h3client\u002Fclient","docs\u002Fauth-h3client\u002F03.client\u002Findex",[150,151,155,159,163],{"title":146,"path":147,"stem":148},{"title":152,"path":153,"stem":154},"useAuthData","\u002Fdocs\u002Fauth-h3client\u002Fclient\u002Fuse-auth-data","docs\u002Fauth-h3client\u002F03.client\u002F00.use-auth-data",{"title":156,"path":157,"stem":158},"useMagicLink","\u002Fdocs\u002Fauth-h3client\u002Fclient\u002Fuse-magic-link","docs\u002Fauth-h3client\u002F03.client\u002F01.use-magic-link",{"title":160,"path":161,"stem":162},"executeRequest","\u002Fdocs\u002Fauth-h3client\u002Fclient\u002Fexecute-request","docs\u002Fauth-h3client\u002F03.client\u002F02.execute-request",{"title":164,"path":165,"stem":166},"getCsrfToken","\u002Fdocs\u002Fauth-h3client\u002Fclient\u002Fget-csrf-token","docs\u002Fauth-h3client\u002F03.client\u002F03.get-csrf-token",{"title":38,"path":168,"stem":169},"\u002Fdocs\u002Fauth-h3client\u002Fsecurity","docs\u002Fauth-h3client\u002F04.security",{"title":171,"path":172,"stem":173,"children":174,"page":53},"Guides","\u002Fdocs\u002Fauth-h3client\u002Fguides","docs\u002Fauth-h3client\u002F05.guides",[175,179,183,187],{"title":176,"path":177,"stem":178},"H3 and Nitro Setup","\u002Fdocs\u002Fauth-h3client\u002Fguides\u002Fh3-nitro","docs\u002Fauth-h3client\u002F05.guides\u002F00.h3-nitro",{"title":180,"path":181,"stem":182},"HMAC Inter-service Auth","\u002Fdocs\u002Fauth-h3client\u002Fguides\u002Fhmac","docs\u002Fauth-h3client\u002F05.guides\u002Fhmac",{"title":184,"path":185,"stem":186},"Image Upload","\u002Fdocs\u002Fauth-h3client\u002Fguides\u002Fimage-upload","docs\u002Fauth-h3client\u002F05.guides\u002Fimage-upload",{"title":188,"path":189,"stem":190},"mTLS Configuration","\u002Fdocs\u002Fauth-h3client\u002Fguides\u002Fmtls","docs\u002Fauth-h3client\u002F05.guides\u002Fmtls",{"title":192,"path":193,"stem":194},"Configuration","\u002Fdocs\u002Fauth-h3client\u002Fconfiguration","docs\u002Fauth-h3client\u002F06.configuration",{"title":196,"path":197,"stem":198,"children":199},"API Reference","\u002Fdocs\u002Fauth-h3client\u002Fapi","docs\u002Fauth-h3client\u002F07.api\u002Findex",[200,201,205,209,213],{"title":196,"path":197,"stem":198},{"title":202,"path":203,"stem":204},"Routes Reference","\u002Fdocs\u002Fauth-h3client\u002Fapi\u002Fcontrollers","docs\u002Fauth-h3client\u002F07.api\u002F00.controllers",{"title":206,"path":207,"stem":208},"Middleware Reference","\u002Fdocs\u002Fauth-h3client\u002Fapi\u002Fmiddleware","docs\u002Fauth-h3client\u002F07.api\u002F01.middleware",{"title":210,"path":211,"stem":212},"Client-side Reference","\u002Fdocs\u002Fauth-h3client\u002Fapi\u002Fcomposables","docs\u002Fauth-h3client\u002F07.api\u002F02.composables",{"title":214,"path":215,"stem":216},"Utilities","\u002Fdocs\u002Fauth-h3client\u002Fapi\u002Futilities","docs\u002Fauth-h3client\u002F07.api\u002F03.utilities",[218],{"title":9,"path":66,"stem":67,"children":219,"page":53},[220,268,386,391,569,636],{"title":20,"path":22,"stem":70,"children":221},[222,223,227,238,246,253,254,260,261],{"title":20,"path":22,"stem":70},{"title":14,"path":74,"stem":75,"children":224},[225,226],{"title":14,"path":74,"stem":75},{"title":79,"path":80,"stem":81},{"title":83,"path":84,"stem":85,"children":228},[229,230,231,232,233,234,235,236,237],{"title":83,"path":84,"stem":85},{"title":89,"path":90,"stem":91},{"title":93,"path":94,"stem":95},{"title":97,"path":98,"stem":99},{"title":101,"path":102,"stem":103},{"title":105,"path":106,"stem":107},{"title":33,"path":109,"stem":110},{"title":112,"path":113,"stem":114},{"title":116,"path":117,"stem":118},{"title":120,"path":121,"stem":122,"children":239},[240,241,242,243,244,245],{"title":120,"path":121,"stem":122},{"title":126,"path":127,"stem":128},{"title":130,"path":131,"stem":132},{"title":134,"path":135,"stem":136},{"title":138,"path":139,"stem":140},{"title":142,"path":143,"stem":144},{"title":146,"path":147,"stem":148,"children":247},[248,249,250,251,252],{"title":146,"path":147,"stem":148},{"title":152,"path":153,"stem":154},{"title":156,"path":157,"stem":158},{"title":160,"path":161,"stem":162},{"title":164,"path":165,"stem":166},{"title":38,"path":168,"stem":169},{"title":171,"path":172,"stem":173,"children":255,"page":53},[256,257,258,259],{"title":176,"path":177,"stem":178},{"title":180,"path":181,"stem":182},{"title":184,"path":185,"stem":186},{"title":188,"path":189,"stem":190},{"title":192,"path":193,"stem":194},{"title":196,"path":197,"stem":198,"children":262},[263,264,265,266,267],{"title":196,"path":197,"stem":198},{"title":202,"path":203,"stem":204},{"title":206,"path":207,"stem":208},{"title":210,"path":211,"stem":212},{"title":214,"path":215,"stem":216},{"title":269,"path":35,"stem":270,"children":271},"Bot Detector","docs\u002Fbot-detection\u002Findex",[272,273,276,280,284,303,377,380,383],{"title":269,"path":35,"stem":270},{"title":14,"path":274,"stem":275},"\u002Fdocs\u002Fbot-detection\u002Fgetting-started","docs\u002Fbot-detection\u002F00.getting-started",{"title":277,"path":278,"stem":279},"CLI","\u002Fdocs\u002Fbot-detection\u002Fcli","docs\u002Fbot-detection\u002F01.cli",{"title":281,"path":282,"stem":283},"Data Sources","\u002Fdocs\u002Fbot-detection\u002Fdata-sources","docs\u002Fbot-detection\u002F02.data-sources",{"title":171,"path":285,"stem":286,"children":287,"page":53},"\u002Fdocs\u002Fbot-detection\u002Fguides","docs\u002Fbot-detection\u002F03.guides",[288,292,296,299],{"title":289,"path":290,"stem":291},"Custom Checkers","\u002Fdocs\u002Fbot-detection\u002Fguides\u002Fcustom","docs\u002Fbot-detection\u002F03.guides\u002FCUSTOM",{"title":293,"path":294,"stem":295},"Scheduling Database Generation","\u002Fdocs\u002Fbot-detection\u002Fguides\u002Fgenerate","docs\u002Fbot-detection\u002F03.guides\u002FGENERATE",{"title":116,"path":297,"stem":298},"\u002Fdocs\u002Fbot-detection\u002Fguides\u002Flogging","docs\u002Fbot-detection\u002F03.guides\u002FLOGGING",{"title":300,"path":301,"stem":302},"Score Modes and Reputation Healing","\u002Fdocs\u002Fbot-detection\u002Fguides\u002Fscore","docs\u002Fbot-detection\u002F03.guides\u002FSCORE",{"title":304,"path":305,"stem":306,"children":307},"Checkers","\u002Fdocs\u002Fbot-detection\u002Fcheckers","docs\u002Fbot-detection\u002F04.checkers\u002Findex",[308,309,313,317,321,325,329,333,337,341,345,349,353,357,361,365,369,373],{"title":304,"path":305,"stem":306},{"title":310,"path":311,"stem":312},"IP Validation","\u002Fdocs\u002Fbot-detection\u002Fcheckers\u002Fip-validation","docs\u002Fbot-detection\u002F04.checkers\u002F01.ip-validation",{"title":314,"path":315,"stem":316},"Good \u002F Bad Bot Verification","\u002Fdocs\u002Fbot-detection\u002Fcheckers\u002Fgood-bots","docs\u002Fbot-detection\u002F04.checkers\u002F02.good-bots",{"title":318,"path":319,"stem":320},"Browser & Device Fingerprint","\u002Fdocs\u002Fbot-detection\u002Fcheckers\u002Fbrowser-device","docs\u002Fbot-detection\u002F04.checkers\u002F03.browser-device",{"title":322,"path":323,"stem":324},"Locale Map","\u002Fdocs\u002Fbot-detection\u002Fcheckers\u002Flocale-map","docs\u002Fbot-detection\u002F04.checkers\u002F04.locale-map",{"title":326,"path":327,"stem":328},"Known Threats","\u002Fdocs\u002Fbot-detection\u002Fcheckers\u002Fknown-threats","docs\u002Fbot-detection\u002F04.checkers\u002F05.known-threats",{"title":330,"path":331,"stem":332},"ASN Classification","\u002Fdocs\u002Fbot-detection\u002Fcheckers\u002Fasn-classification","docs\u002Fbot-detection\u002F04.checkers\u002F06.asn-classification",{"title":334,"path":335,"stem":336},"Tor Analysis","\u002Fdocs\u002Fbot-detection\u002Fcheckers\u002Ftor-analysis","docs\u002Fbot-detection\u002F04.checkers\u002F07.tor-analysis",{"title":338,"path":339,"stem":340},"Timezone Consistency","\u002Fdocs\u002Fbot-detection\u002Fcheckers\u002Ftimezone-consistency","docs\u002Fbot-detection\u002F04.checkers\u002F08.timezone-consistency",{"title":342,"path":343,"stem":344},"Honeypot","\u002Fdocs\u002Fbot-detection\u002Fcheckers\u002Fhoneypot","docs\u002Fbot-detection\u002F04.checkers\u002F09.honeypot",{"title":346,"path":347,"stem":348},"Known Bad IPs","\u002Fdocs\u002Fbot-detection\u002Fcheckers\u002Fknown-bad-ips","docs\u002Fbot-detection\u002F04.checkers\u002F10.known-bad-ips",{"title":350,"path":351,"stem":352},"Behavior Rate","\u002Fdocs\u002Fbot-detection\u002Fcheckers\u002Fbehavior-rate","docs\u002Fbot-detection\u002F04.checkers\u002F11.behavior-rate",{"title":354,"path":355,"stem":356},"Proxy \u002F ISP \u002F Cookie","\u002Fdocs\u002Fbot-detection\u002Fcheckers\u002Fproxy-isp-cookies","docs\u002Fbot-detection\u002F04.checkers\u002F12.proxy-isp-cookies",{"title":358,"path":359,"stem":360},"Session Coherence","\u002Fdocs\u002Fbot-detection\u002Fcheckers\u002Fsession-coherence","docs\u002Fbot-detection\u002F04.checkers\u002F13.session-coherence",{"title":362,"path":363,"stem":364},"Velocity Fingerprint","\u002Fdocs\u002Fbot-detection\u002Fcheckers\u002Fvelocity-fingerprint","docs\u002Fbot-detection\u002F04.checkers\u002F14.velocity-fingerprint",{"title":366,"path":367,"stem":368},"UA & Header Analysis","\u002Fdocs\u002Fbot-detection\u002Fcheckers\u002Fua-header","docs\u002Fbot-detection\u002F04.checkers\u002F15.ua-header",{"title":370,"path":371,"stem":372},"Geolocation","\u002Fdocs\u002Fbot-detection\u002Fcheckers\u002Fgeolocation","docs\u002Fbot-detection\u002F04.checkers\u002F16.geolocation",{"title":374,"path":375,"stem":376},"Known Bad User-Agents","\u002Fdocs\u002Fbot-detection\u002Fcheckers\u002Fknown-bad-ua","docs\u002Fbot-detection\u002F04.checkers\u002F17.known-bad-ua",{"title":38,"path":378,"stem":379},"\u002Fdocs\u002Fbot-detection\u002Fsecurity","docs\u002Fbot-detection\u002F04.security",{"title":196,"path":381,"stem":382},"\u002Fdocs\u002Fbot-detection\u002Fapi","docs\u002Fbot-detection\u002F05.api",{"title":192,"path":384,"stem":385},"\u002Fdocs\u002Fbot-detection\u002Fconfiguration","docs\u002Fbot-detection\u002F06.configuration",{"title":387,"path":11,"stem":388,"children":389},"Introduction","docs\u002Fgetting-started\u002Findex",[390],{"title":387,"path":11,"stem":388},{"title":27,"path":29,"stem":392,"children":393},"docs\u002Fiam\u002Findex",[394,395,398,533,536,552,555],{"title":27,"path":29,"stem":392},{"title":14,"path":396,"stem":397},"\u002Fdocs\u002Fiam\u002Fgetting-started","docs\u002Fiam\u002F00.getting-started",{"title":83,"path":399,"stem":400,"children":401},"\u002Fdocs\u002Fiam\u002Fessentials","docs\u002Fiam\u002F01.essentials\u002Findex",[402,403,407,411,415,419,423,427,431,435,439,443,446,450,454,458,462,465,469,473,476,480,483],{"title":83,"path":399,"stem":400},{"title":404,"path":405,"stem":406},"Tokens","\u002Fdocs\u002Fiam\u002Fessentials\u002Ftokens","docs\u002Fiam\u002F01.essentials\u002F00.tokens",{"title":408,"path":409,"stem":410},"Access Tokens","\u002Fdocs\u002Fiam\u002Fessentials\u002Faccess-tokens","docs\u002Fiam\u002F01.essentials\u002F01.access-tokens",{"title":412,"path":413,"stem":414},"Refresh Tokens","\u002Fdocs\u002Fiam\u002Fessentials\u002Frefresh-tokens","docs\u002Fiam\u002F01.essentials\u002F02.refresh-tokens",{"title":416,"path":417,"stem":418},"Anomaly Detection","\u002Fdocs\u002Fiam\u002Fessentials\u002Fanomalies","docs\u002Fiam\u002F01.essentials\u002F03.anomalies",{"title":420,"path":421,"stem":422},"Signup","\u002Fdocs\u002Fiam\u002Fessentials\u002Fsignup","docs\u002Fiam\u002F01.essentials\u002F04.signup",{"title":424,"path":425,"stem":426},"Login","\u002Fdocs\u002Fiam\u002Fessentials\u002Flogin","docs\u002Fiam\u002F01.essentials\u002F05.login",{"title":428,"path":429,"stem":430},"Logout","\u002Fdocs\u002Fiam\u002Fessentials\u002Flogout","docs\u002Fiam\u002F01.essentials\u002F06.logout",{"title":432,"path":433,"stem":434},"OAuth","\u002Fdocs\u002Fiam\u002Fessentials\u002Foauth","docs\u002Fiam\u002F01.essentials\u002F07.oauth",{"title":436,"path":437,"stem":438},"Magic Links","\u002Fdocs\u002Fiam\u002Fessentials\u002Fmagic-links","docs\u002Fiam\u002F01.essentials\u002F08.magic-links",{"title":440,"path":441,"stem":442},"Emails","\u002Fdocs\u002Fiam\u002Fessentials\u002Femails","docs\u002Fiam\u002F01.essentials\u002F09.emails",{"title":120,"path":444,"stem":445},"\u002Fdocs\u002Fiam\u002Fessentials\u002Fmfa","docs\u002Fiam\u002F01.essentials\u002F10.mfa",{"title":447,"path":448,"stem":449},"Fingerprinting","\u002Fdocs\u002Fiam\u002Fessentials\u002Ffingerprinting","docs\u002Fiam\u002F01.essentials\u002F11.fingerprinting",{"title":451,"path":452,"stem":453},"Backend for Frontend","\u002Fdocs\u002Fiam\u002Fessentials\u002Fbff","docs\u002Fiam\u002F01.essentials\u002F12.bff",{"title":455,"path":456,"stem":457},"HMAC Authentication","\u002Fdocs\u002Fiam\u002Fessentials\u002Fhmac","docs\u002Fiam\u002F01.essentials\u002F13.hmac",{"title":459,"path":460,"stem":461},"XSS Protection","\u002Fdocs\u002Fiam\u002Fessentials\u002Fxss","docs\u002Fiam\u002F01.essentials\u002F14.xss",{"title":116,"path":463,"stem":464},"\u002Fdocs\u002Fiam\u002Fessentials\u002Flogging","docs\u002Fiam\u002F01.essentials\u002F15.logging",{"title":466,"path":467,"stem":468},"Rate Limiting","\u002Fdocs\u002Fiam\u002Fessentials\u002Frate-limiting","docs\u002Fiam\u002F01.essentials\u002F16.rate-limiting",{"title":470,"path":471,"stem":472},"Database","\u002Fdocs\u002Fiam\u002Fessentials\u002Fdatabase","docs\u002Fiam\u002F01.essentials\u002F17.database",{"title":112,"path":474,"stem":475},"\u002Fdocs\u002Fiam\u002Fessentials\u002Fcookies","docs\u002Fiam\u002F01.essentials\u002F18.cookies",{"title":477,"path":478,"stem":479},"Service Startup","\u002Fdocs\u002Fiam\u002Fessentials\u002Fservice","docs\u002Fiam\u002F01.essentials\u002F19.service",{"title":130,"path":481,"stem":482},"\u002Fdocs\u002Fiam\u002Fessentials\u002Fpassword-reset","docs\u002Fiam\u002F01.essentials\u002F20.password-reset",{"title":484,"path":485,"stem":486,"children":487},"API Tokens","\u002Fdocs\u002Fiam\u002Fessentials\u002Fapi","docs\u002Fiam\u002F01.essentials\u002F21.api\u002Findex",[488,489,493,497,527,530],{"title":484,"path":485,"stem":486},{"title":490,"path":491,"stem":492},"Creating Tokens","\u002Fdocs\u002Fiam\u002Fessentials\u002Fapi\u002Fcreation","docs\u002Fiam\u002F01.essentials\u002F21.api\u002F00.creation",{"title":494,"path":495,"stem":496},"Verifying Tokens","\u002Fdocs\u002Fiam\u002Fessentials\u002Fapi\u002Fverification","docs\u002Fiam\u002F01.essentials\u002F21.api\u002F01.verification",{"title":498,"path":499,"stem":500,"children":501},"Manage Tokens","\u002Fdocs\u002Fiam\u002Fessentials\u002Fapi\u002Fmanagement","docs\u002Fiam\u002F01.essentials\u002F21.api\u002F02.management\u002Findex",[502,503,507,511,515,519,523],{"title":498,"path":499,"stem":500},{"title":504,"path":505,"stem":506},"Privileges","\u002Fdocs\u002Fiam\u002Fessentials\u002Fapi\u002Fmanagement\u002Fprivilege","docs\u002Fiam\u002F01.essentials\u002F21.api\u002F02.management\u002F00.privilege",{"title":508,"path":509,"stem":510},"Revocation","\u002Fdocs\u002Fiam\u002Fessentials\u002Fapi\u002Fmanagement\u002Frevocation","docs\u002Fiam\u002F01.essentials\u002F21.api\u002F02.management\u002F01.revocation",{"title":512,"path":513,"stem":514},"Rotation","\u002Fdocs\u002Fiam\u002Fessentials\u002Fapi\u002Fmanagement\u002Frotation","docs\u002Fiam\u002F01.essentials\u002F21.api\u002F02.management\u002F02.rotation",{"title":516,"path":517,"stem":518},"IP Restriction","\u002Fdocs\u002Fiam\u002Fessentials\u002Fapi\u002Fmanagement\u002Fip-updates","docs\u002Fiam\u002F01.essentials\u002F21.api\u002F02.management\u002F03.ip-updates",{"title":520,"path":521,"stem":522},"Metadata","\u002Fdocs\u002Fiam\u002Fessentials\u002Fapi\u002Fmanagement\u002Fmetadata","docs\u002Fiam\u002F01.essentials\u002F21.api\u002F02.management\u002F04.metadata",{"title":524,"path":525,"stem":526},"Token Listing","\u002Fdocs\u002Fiam\u002Fessentials\u002Fapi\u002Fmanagement\u002Flist","docs\u002Fiam\u002F01.essentials\u002F21.api\u002F02.management\u002F05.list",{"title":466,"path":528,"stem":529},"\u002Fdocs\u002Fiam\u002Fessentials\u002Fapi\u002Frate-limiting","docs\u002Fiam\u002F01.essentials\u002F21.api\u002F03.rate-limiting",{"title":38,"path":531,"stem":532},"\u002Fdocs\u002Fiam\u002Fessentials\u002Fapi\u002Fsecurity","docs\u002Fiam\u002F01.essentials\u002F21.api\u002F04.security",{"title":38,"path":534,"stem":535},"\u002Fdocs\u002Fiam\u002Fsecurity","docs\u002Fiam\u002F02.security",{"title":171,"path":537,"stem":538,"children":539,"page":53},"\u002Fdocs\u002Fiam\u002Fguides","docs\u002Fiam\u002F03.guides",[540,544,548],{"title":541,"path":542,"stem":543},"Deployment","\u002Fdocs\u002Fiam\u002Fguides\u002Fdeployment","docs\u002Fiam\u002F03.guides\u002Fdeployment",{"title":545,"path":546,"stem":547},"Operation Scripts","\u002Fdocs\u002Fiam\u002Fguides\u002Foperation-scripts","docs\u002Fiam\u002F03.guides\u002Foperation-scripts",{"title":549,"path":550,"stem":551},"Role-Based Access Control","\u002Fdocs\u002Fiam\u002Fguides\u002Frbac","docs\u002Fiam\u002F03.guides\u002Frbac",{"title":192,"path":553,"stem":554},"\u002Fdocs\u002Fiam\u002Fconfiguration","docs\u002Fiam\u002F04.configuration",{"title":556,"path":557,"stem":558,"children":559,"page":53},"Api","\u002Fdocs\u002Fiam\u002Fapi","docs\u002Fiam\u002F05.API",[560,563,566],{"title":196,"path":561,"stem":562},"\u002Fdocs\u002Fiam\u002Fapi\u002Fapi","docs\u002Fiam\u002F05.API\u002F00.api",{"title":206,"path":564,"stem":565},"\u002Fdocs\u002Fiam\u002Fapi\u002Fmiddlewares","docs\u002Fiam\u002F05.API\u002F02.middlewares",{"title":202,"path":567,"stem":568},"\u002Fdocs\u002Fiam\u002Fapi\u002Froutes","docs\u002Fiam\u002F05.API\u002F03.routes",{"title":40,"path":42,"stem":570,"children":571},"docs\u002Fshield-base\u002Findex",[572,573,576,580,621,625,629,633],{"title":40,"path":42,"stem":570},{"title":14,"path":574,"stem":575},"\u002Fdocs\u002Fshield-base\u002Fgetting-started","docs\u002Fshield-base\u002F00.getting-started",{"title":577,"path":578,"stem":579},"CLI Reference","\u002Fdocs\u002Fshield-base\u002Fcli","docs\u002Fshield-base\u002F01.cli",{"title":281,"path":581,"stem":582,"children":583},"\u002Fdocs\u002Fshield-base\u002Fdata-sources","docs\u002Fshield-base\u002F02.data-sources\u002Findex",[584,585,589,593,597,601,605,609,613,617],{"title":281,"path":581,"stem":582},{"title":586,"path":587,"stem":588},"BGP \u002F ASN","\u002Fdocs\u002Fshield-base\u002Fdata-sources\u002Fbgp","docs\u002Fshield-base\u002F02.data-sources\u002Fbgp",{"title":590,"path":591,"stem":592},"City Geolocation","\u002Fdocs\u002Fshield-base\u002Fdata-sources\u002Fcity","docs\u002Fshield-base\u002F02.data-sources\u002Fcity",{"title":594,"path":595,"stem":596},"Country Geolocation","\u002Fdocs\u002Fshield-base\u002Fdata-sources\u002Fcountry","docs\u002Fshield-base\u002F02.data-sources\u002Fcountry",{"title":598,"path":599,"stem":600},"Verified Crawlers","\u002Fdocs\u002Fshield-base\u002Fdata-sources\u002Fcrawlers","docs\u002Fshield-base\u002F02.data-sources\u002Fcrawlers",{"title":602,"path":603,"stem":604},"Disposable Emails","\u002Fdocs\u002Fshield-base\u002Fdata-sources\u002Femail","docs\u002Fshield-base\u002F02.data-sources\u002Femail",{"title":606,"path":607,"stem":608},"FireHOL Threat Intelligence","\u002Fdocs\u002Fshield-base\u002Fdata-sources\u002Ffirehol","docs\u002Fshield-base\u002F02.data-sources\u002Ffirehol",{"title":610,"path":611,"stem":612},"Proxy Detection","\u002Fdocs\u002Fshield-base\u002Fdata-sources\u002Fproxy","docs\u002Fshield-base\u002F02.data-sources\u002Fproxy",{"title":614,"path":615,"stem":616},"Tor Nodes","\u002Fdocs\u002Fshield-base\u002Fdata-sources\u002Ftor","docs\u002Fshield-base\u002F02.data-sources\u002Ftor",{"title":618,"path":619,"stem":620},"Suspicious User-Agents","\u002Fdocs\u002Fshield-base\u002Fdata-sources\u002Fuseragent","docs\u002Fshield-base\u002F02.data-sources\u002Fuseragent",{"title":622,"path":623,"stem":624},"Programmatic Usage","\u002Fdocs\u002Fshield-base\u002Fusage","docs\u002Fshield-base\u002F03.usage",{"title":626,"path":627,"stem":628},"Custom Data Sources","\u002Fdocs\u002Fshield-base\u002Fcustom-data-sources","docs\u002Fshield-base\u002F04.custom-data-sources",{"title":630,"path":631,"stem":632},"TypeScript Types","\u002Fdocs\u002Fshield-base\u002Ftypes","docs\u002Fshield-base\u002F05.types",{"title":196,"path":634,"stem":635},"\u002Fdocs\u002Fshield-base\u002Fapi","docs\u002Fshield-base\u002F06.api",{"title":214,"path":48,"stem":637,"children":638},"docs\u002Futils\u002Findex",[639,640,657,690,787],{"title":214,"path":48,"stem":637},{"title":641,"path":642,"stem":643,"children":644,"page":53},"Eslint","\u002Fdocs\u002Futils\u002Feslint","docs\u002Futils\u002Feslint",[645,649,653],{"title":646,"path":647,"stem":648},"React Config","\u002Fdocs\u002Futils\u002Feslint\u002Freact","docs\u002Futils\u002Feslint\u002Freact",{"title":650,"path":651,"stem":652},"TypeScript Config","\u002Fdocs\u002Futils\u002Feslint\u002Ftypescript","docs\u002Futils\u002Feslint\u002Ftypescript",{"title":654,"path":655,"stem":656},"Vue Config","\u002Fdocs\u002Futils\u002Feslint\u002Fvue","docs\u002Futils\u002Feslint\u002Fvue",{"title":658,"path":659,"stem":660,"children":661,"page":53},"Server","\u002Fdocs\u002Futils\u002Fserver","docs\u002Futils\u002Fserver",[662,666,670,674,678,682,686],{"title":663,"path":664,"stem":665},"Encryption","\u002Fdocs\u002Futils\u002Fserver\u002Fencryption","docs\u002Futils\u002Fserver\u002Fencryption",{"title":667,"path":668,"stem":669},"Path Resolver","\u002Fdocs\u002Futils\u002Fserver\u002Fpathresolver","docs\u002Futils\u002Fserver\u002FpathResolver",{"title":671,"path":672,"stem":673},"File Replacements","\u002Fdocs\u002Futils\u002Fserver\u002Freplace","docs\u002Futils\u002Fserver\u002Freplace",{"title":675,"path":676,"stem":677},"run","\u002Fdocs\u002Futils\u002Fserver\u002Frun","docs\u002Futils\u002Fserver\u002Frun",{"title":679,"path":680,"stem":681},"scheduleTask","\u002Fdocs\u002Futils\u002Fserver\u002Fscheduletask","docs\u002Futils\u002Fserver\u002FscheduleTask",{"title":683,"path":684,"stem":685},"spawnRun","\u002Fdocs\u002Futils\u002Fserver\u002Fspawnrun","docs\u002Futils\u002Fserver\u002FspawnRun",{"title":687,"path":688,"stem":689},"uploadCsv","\u002Fdocs\u002Futils\u002Fserver\u002Fuploadcsv","docs\u002Futils\u002Fserver\u002FuploadCsv",{"title":691,"path":692,"stem":693,"children":694,"page":53},"Shared","\u002Fdocs\u002Futils\u002Fshared","docs\u002Futils\u002Fshared",[695,699,703,707,711,715,719,723,727,731,735,739,743,747,751,755,759,763,767,771,775,779,783],{"title":696,"path":697,"stem":698},"BatchQueue","\u002Fdocs\u002Futils\u002Fshared\u002Fbatchqueue","docs\u002Futils\u002Fshared\u002FbatchQueue",{"title":700,"path":701,"stem":702},"capitalize","\u002Fdocs\u002Futils\u002Fshared\u002Fcapitalize","docs\u002Futils\u002Fshared\u002Fcapitalize",{"title":704,"path":705,"stem":706},"chunkProcess","\u002Fdocs\u002Futils\u002Fshared\u002Fchunkprocess","docs\u002Futils\u002Fshared\u002FchunkProcess",{"title":708,"path":709,"stem":710},"cleanObject","\u002Fdocs\u002Futils\u002Fshared\u002Fcleanobject","docs\u002Futils\u002Fshared\u002FcleanObject",{"title":712,"path":713,"stem":714},"createConfigManager","\u002Fdocs\u002Futils\u002Fshared\u002Fconfigurationdefiner","docs\u002Futils\u002Fshared\u002FconfigurationDefiner",{"title":716,"path":717,"stem":718},"debounce","\u002Fdocs\u002Futils\u002Fshared\u002Fdebounce","docs\u002Futils\u002Fshared\u002Fdebounce",{"title":720,"path":721,"stem":722},"ensureArray","\u002Fdocs\u002Futils\u002Fshared\u002Fensurearray","docs\u002Futils\u002Fshared\u002FensureArray",{"title":724,"path":725,"stem":726},"fetchWithRetry","\u002Fdocs\u002Futils\u002Fshared\u002Ffetchwithretry","docs\u002Futils\u002Fshared\u002FfetchWithRetry",{"title":728,"path":729,"stem":730},"filterEmptyValues","\u002Fdocs\u002Futils\u002Fshared\u002Ffilteremptyvalues","docs\u002Futils\u002Fshared\u002FfilterEmptyValues",{"title":732,"path":733,"stem":734},"findStringsInObject","\u002Fdocs\u002Futils\u002Fshared\u002Ffindobjectvalues","docs\u002Futils\u002Fshared\u002FfindObjectValues",{"title":736,"path":737,"stem":738},"fisherYatesShuffle","\u002Fdocs\u002Futils\u002Fshared\u002Ffisheryatesshuffle","docs\u002Futils\u002Fshared\u002FfisherYatesShuffle",{"title":740,"path":741,"stem":742},"getRandomImage","\u002Fdocs\u002Futils\u002Fshared\u002Fgetrandomimage","docs\u002Futils\u002Fshared\u002FgetRandomImage",{"title":744,"path":745,"stem":746},"isObjectHasValues","\u002Fdocs\u002Futils\u002Fshared\u002Fisobjecthasvalues","docs\u002Futils\u002Fshared\u002FisObjectHasValues",{"title":748,"path":749,"stem":750},"isAsyncOrPromise","\u002Fdocs\u002Futils\u002Fshared\u002Fispromise","docs\u002Futils\u002Fshared\u002FisPromise",{"title":752,"path":753,"stem":754},"MiniCache","\u002Fdocs\u002Futils\u002Fshared\u002Fminicache","docs\u002Futils\u002Fshared\u002FminiCache",{"title":756,"path":757,"stem":758},"parseCookies","\u002Fdocs\u002Futils\u002Fshared\u002Fparserawcookies","docs\u002Futils\u002Fshared\u002FparseRawCookies",{"title":760,"path":761,"stem":762},"safeAction","\u002Fdocs\u002Futils\u002Fshared\u002Fpromiselocker","docs\u002Futils\u002Fshared\u002FpromiseLocker",{"title":764,"path":765,"stem":766},"Random","\u002Fdocs\u002Futils\u002Fshared\u002Frandom","docs\u002Futils\u002Fshared\u002Frandom",{"title":768,"path":769,"stem":770},"range","\u002Fdocs\u002Futils\u002Fshared\u002Frange","docs\u002Futils\u002Fshared\u002Frange",{"title":772,"path":773,"stem":774},"rateLimiters","\u002Fdocs\u002Futils\u002Fshared\u002Fratelimiters","docs\u002Futils\u002Fshared\u002FrateLimiters",{"title":776,"path":777,"stem":778},"safeObjectMerge","\u002Fdocs\u002Futils\u002Fshared\u002Fsafemerge","docs\u002Futils\u002Fshared\u002FsafeMerge",{"title":780,"path":781,"stem":782},"textTruncation","\u002Fdocs\u002Futils\u002Fshared\u002Ftexttruncation","docs\u002Futils\u002Fshared\u002FtextTruncation",{"title":784,"path":785,"stem":786},"validateZodSchema","\u002Fdocs\u002Futils\u002Fshared\u002Fvalidatezodschema","docs\u002Futils\u002Fshared\u002FvalidateZodSchema",{"title":788,"path":789,"stem":790,"children":791},"Utility Types","\u002Fdocs\u002Futils\u002Ftypes","docs\u002Futils\u002Ftypes\u002Findex",[792,793,797,801,805,809,813,817,821,825],{"title":788,"path":789,"stem":790},{"title":794,"path":795,"stem":796},"Brand","\u002Fdocs\u002Futils\u002Ftypes\u002Fbrand","docs\u002Futils\u002Ftypes\u002FBrand",{"title":798,"path":799,"stem":800},"DeepPartial","\u002Fdocs\u002Futils\u002Ftypes\u002Fdeeppartial","docs\u002Futils\u002Ftypes\u002FDeepPartial",{"title":802,"path":803,"stem":804},"Merge","\u002Fdocs\u002Futils\u002Ftypes\u002Fmerge","docs\u002Futils\u002Ftypes\u002FMerge",{"title":806,"path":807,"stem":808},"NonNullable","\u002Fdocs\u002Futils\u002Ftypes\u002Fnonnullable","docs\u002Futils\u002Ftypes\u002FNonNullable",{"title":810,"path":811,"stem":812},"Prettify","\u002Fdocs\u002Futils\u002Ftypes\u002Fprettify","docs\u002Futils\u002Ftypes\u002FPrettify",{"title":814,"path":815,"stem":816},"PromiseType","\u002Fdocs\u002Futils\u002Ftypes\u002Fpromisetype","docs\u002Futils\u002Ftypes\u002FPromiseType",{"title":818,"path":819,"stem":820},"RequireKeys","\u002Fdocs\u002Futils\u002Ftypes\u002Frequirekeys","docs\u002Futils\u002Ftypes\u002FRequireKeys",{"title":822,"path":823,"stem":824},"StandardResponse","\u002Fdocs\u002Futils\u002Ftypes\u002Fstandardresponse","docs\u002Futils\u002Ftypes\u002FStandardResponse",{"title":826,"path":827,"stem":828},"ValueOf","\u002Fdocs\u002Futils\u002Ftypes\u002Fvalueof","docs\u002Futils\u002Ftypes\u002FValueOf",{"id":4,"extension":5,"links":830,"meta":841,"stem":62,"__hash__":63},[831,839,840],{"nested":8,"label":9,"icon":10,"to":11,"children":832},[833,834,835,836,837,838],{"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":843,"title":130,"body":844,"description":1765,"extension":1766,"icon":21,"meta":1767,"module":1768,"navigation":8,"path":131,"rawbody":1769,"seo":1770,"stem":132,"__hash__":1771},"docs\u002Fdocs\u002Fauth-h3client\u002F02.mfa\u002F02.password-reset.md",{"type":845,"value":846,"toc":1754},"minimark",[847,851,859,862,867,873,1078,1090,1097,1175,1177,1181,1192,1201,1228,1231,1235,1276,1278,1282,1313,1316,1337,1340,1460,1463,1469,1471,1475,1482,1485,1519,1522,1554,1557,1560,1624,1626,1630,1644,1650,1729,1744,1750],[848,849,850],"p",{},"The password reset flow allows users to change their password when they have forgotten it. It follows a three-step magic link pattern: the user requests a reset, clicks the link in their email, and submits a new password along with the 7-digit verification code.",[848,852,853,854,858],{},"All three routes are registered by ",[855,856,857],"code",{},"magicLinksRouter"," and require no custom server code.",[860,861],"hr",{},[863,864,866],"h2",{"id":865},"route-registration","Route registration",[848,868,869,870,872],{},"Call ",[855,871,857],{}," with your router or app instance during startup.",[874,875,876,993],"code-group",{},[877,878,884],"pre",{"className":879,"code":880,"filename":881,"language":882,"meta":883,"style":883},"language-ts shiki shiki-themes light-plus light-plus dracula","import { createRouter } from 'h3'\nimport { magicLinksRouter } from 'auth-h3client\u002Fv1'\n\nconst router = createRouter()\nmagicLinksRouter(router, 'api')\n","H3 v1","ts","",[855,885,886,920,940,946,968],{"__ignoreMap":883},[887,888,891,895,899,903,906,909,913,917],"span",{"class":889,"line":890},"line",1,[887,892,894],{"class":893},"sZ328","import",[887,896,898],{"class":897},"sDd4n"," { ",[887,900,902],{"class":901},"sjsA6","createRouter",[887,904,905],{"class":897}," } ",[887,907,908],{"class":893},"from",[887,910,912],{"class":911},"sFkSl"," '",[887,914,916],{"class":915},"sFB1V","h3",[887,918,919],{"class":911},"'\n",[887,921,923,925,927,929,931,933,935,938],{"class":889,"line":922},2,[887,924,894],{"class":893},[887,926,898],{"class":897},[887,928,857],{"class":901},[887,930,905],{"class":897},[887,932,908],{"class":893},[887,934,912],{"class":911},[887,936,937],{"class":915},"auth-h3client\u002Fv1",[887,939,919],{"class":911},[887,941,943],{"class":889,"line":942},3,[887,944,945],{"emptyLinePlaceholder":8},"\n",[887,947,949,953,957,961,965],{"class":889,"line":948},4,[887,950,952],{"class":951},"sl46w","const",[887,954,956],{"class":955},"s3JHE"," router",[887,958,960],{"class":959},"saOXh"," =",[887,962,964],{"class":963},"sHOzp"," createRouter",[887,966,967],{"class":897},"()\n",[887,969,971,973,976,979,982,985,988,990],{"class":889,"line":970},5,[887,972,857],{"class":963},[887,974,975],{"class":897},"(",[887,977,978],{"class":901},"router",[887,980,981],{"class":897},", ",[887,983,984],{"class":911},"'",[887,986,987],{"class":915},"api",[887,989,984],{"class":911},[887,991,992],{"class":897},")\n",[877,994,997],{"className":879,"code":995,"filename":996,"language":882,"meta":883,"style":883},"import { H3 } from 'h3'\nimport { magicLinksRouter } from 'auth-h3client\u002Fv2'\n\nconst app = new H3()\nmagicLinksRouter(app, 'api')\n","H3 v2",[855,998,999,1018,1037,1041,1059],{"__ignoreMap":883},[887,1000,1001,1003,1005,1008,1010,1012,1014,1016],{"class":889,"line":890},[887,1002,894],{"class":893},[887,1004,898],{"class":897},[887,1006,1007],{"class":901},"H3",[887,1009,905],{"class":897},[887,1011,908],{"class":893},[887,1013,912],{"class":911},[887,1015,916],{"class":915},[887,1017,919],{"class":911},[887,1019,1020,1022,1024,1026,1028,1030,1032,1035],{"class":889,"line":922},[887,1021,894],{"class":893},[887,1023,898],{"class":897},[887,1025,857],{"class":901},[887,1027,905],{"class":897},[887,1029,908],{"class":893},[887,1031,912],{"class":911},[887,1033,1034],{"class":915},"auth-h3client\u002Fv2",[887,1036,919],{"class":911},[887,1038,1039],{"class":889,"line":942},[887,1040,945],{"emptyLinePlaceholder":8},[887,1042,1043,1045,1048,1050,1054,1057],{"class":889,"line":948},[887,1044,952],{"class":951},[887,1046,1047],{"class":955}," app",[887,1049,960],{"class":959},[887,1051,1053],{"class":1052},"sakC6"," new",[887,1055,1056],{"class":963}," H3",[887,1058,967],{"class":897},[887,1060,1061,1063,1065,1068,1070,1072,1074,1076],{"class":889,"line":970},[887,1062,857],{"class":963},[887,1064,975],{"class":897},[887,1066,1067],{"class":901},"app",[887,1069,981],{"class":897},[887,1071,984],{"class":911},[887,1073,987],{"class":915},[887,1075,984],{"class":911},[887,1077,992],{"class":897},[848,1079,1080,1081,1084,1085,1089],{},"When using the Nuxt module, all magic link routes are registered automatically by ",[855,1082,1083],{},"defineAuthConfiguration"," in your Nitro plugin. See the ",[1086,1087,1088],"a",{"href":80},"Nuxt Module setup"," for details.",[848,1091,1092,1093,1096],{},"With the ",[855,1094,1095],{},"'api'"," prefix, the following routes are registered:",[1098,1099,1100,1119],"table",{},[1101,1102,1103],"thead",{},[1104,1105,1106,1110,1113,1116],"tr",{},[1107,1108,1109],"th",{},"Method",[1107,1111,1112],{},"Path",[1107,1114,1115],{},"Handler",[1107,1117,1118],{},"Purpose",[1120,1121,1122,1141,1159],"tbody",{},[1104,1123,1124,1128,1133,1138],{},[1125,1126,1127],"td",{},"POST",[1125,1129,1130],{},[855,1131,1132],{},"\u002Fapi\u002Fauth\u002Fpassword-reset",[1125,1134,1135],{},[855,1136,1137],{},"restartPasswordHandler",[1125,1139,1140],{},"Sends the reset email",[1104,1142,1143,1146,1151,1156],{},[1125,1144,1145],{},"GET",[1125,1147,1148],{},[855,1149,1150],{},"\u002Fapi\u002Fauth\u002Freset-password",[1125,1152,1153],{},[855,1154,1155],{},"verifyTempPasswordLink",[1125,1157,1158],{},"Validates the magic link",[1104,1160,1161,1163,1167,1172],{},[1125,1162,1127],{},[1125,1164,1165],{},[855,1166,1150],{},[1125,1168,1169],{},[855,1170,1171],{},"sendNewPasswordHandler",[1125,1173,1174],{},"Submits the new password with the verification code",[860,1176],{},[863,1178,1180],{"id":1179},"step-1-request-a-reset","Step 1: request a reset",[848,1182,1183,1184,1187,1188,1191],{},"The user submits their email address to ",[855,1185,1186],{},"POST \u002Fapi\u002Fauth\u002Fpassword-reset",". The route applies CSRF verification, ",[855,1189,1190],{},"Content-Type: application\u002Fjson"," validation, and a 1 KB body limit before the handler runs.",[848,1193,1194,1195,1200],{},"The handler proxies the email to the IAM ",[1086,1196,1197],{"href":481},[855,1198,1199],{},"\u002Fauth\u002Fforgot-password"," endpoint. The IAM service:",[1202,1203,1204,1208,1215,1218,1221],"ol",{},[1205,1206,1207],"li",{},"Looks up the user by email.",[1205,1209,1210,1211,1214],{},"Generates a magic link JWT with ",[855,1212,1213],{},"purpose: \"PASSWORD_RESET\""," and a 20-minute TTL.",[1205,1216,1217],{},"Generates a 7-digit verification code.",[1205,1219,1220],{},"Sends both to the user's email address.",[1205,1222,1223,1224,1227],{},"Returns a generic success message regardless of whether the email exists, to prevent ",[1086,1225,1226],{"href":481},"email enumeration",".",[848,1229,1230],{},"The gateway forwards the response to the client. The frontend should show a \"check your email\" message.",[916,1232,1234],{"id":1233},"error-responses","Error responses",[1098,1236,1237,1247],{},[1101,1238,1239],{},[1104,1240,1241,1244],{},[1107,1242,1243],{},"IAM status",[1107,1245,1246],{},"Gateway response",[1120,1248,1249,1257,1269],{},[1104,1250,1251,1254],{},[1125,1252,1253],{},"200",[1125,1255,1256],{},"200 with success message",[1104,1258,1259,1262],{},[1125,1260,1261],{},"429",[1125,1263,1264,1265,1268],{},"429 with ",[855,1266,1267],{},"Retry-After"," header",[1104,1270,1271,1274],{},[1125,1272,1273],{},"500",[1125,1275,1273],{},[860,1277],{},[863,1279,1281],{"id":1280},"step-2-verify-the-link","Step 2: verify the link",[848,1283,1284,1285,1289,1290,981,1293,981,1296,981,1299,1302,1303,1305,1306,1309,1310,1312],{},"When the user clicks the magic link in their email, the ",[1086,1286,1288],{"href":1287},"\u002Fdocs\u002Fauth-h3client\u002Fmfa\u002Fclient-side#bounce-route","bounce route"," redirects them to your frontend verification page with query parameters (",[855,1291,1292],{},"token",[855,1294,1295],{},"random",[855,1297,1298],{},"reason",[855,1300,1301],{},"visitor","). The frontend code then needs to detect that the ",[855,1304,1298],{}," is ",[855,1307,1308],{},"\"PASSWORD_RESET\""," and sends a GET request to ",[855,1311,1150],{}," with those parameters, and all cookies identifiers.",[848,1314,1315],{},"The handler:",[1202,1317,1318,1324,1334],{},[1205,1319,1320,1321,1227],{},"Sets ",[855,1322,1323],{},"Cache-Control: no-store",[1205,1325,1326,1327,1330,1331,1333],{},"Validates the ",[855,1328,1329],{},"canary_id"," cookie and ",[855,1332,1292],{}," query parameter.",[1205,1335,1336],{},"Proxies the request to the IAM service to verify the link signature and expiry.",[848,1338,1339],{},"On success, the handler returns the verification result from the IAM service:",[877,1341,1344],{"className":1342,"code":1343,"language":5,"meta":883,"style":883},"language-json shiki shiki-themes light-plus light-plus dracula","{\n  \"ok\": true,\n  \"date\": \"2026-04-12T10:00:00.000Z\",\n  \"data\": {\n    \"reason\": \"PASSWORD_RESET\",\n    \"link\": \"Password Reset\"\n  }\n}\n",[855,1345,1346,1351,1374,1395,1409,1429,1448,1454],{"__ignoreMap":883},[887,1347,1348],{"class":889,"line":890},[887,1349,1350],{"class":897},"{\n",[887,1352,1353,1357,1361,1364,1367,1371],{"class":889,"line":922},[887,1354,1356],{"class":1355},"saJyd","  \"",[887,1358,1360],{"class":1359},"s_W10","ok",[887,1362,1363],{"class":1355},"\"",[887,1365,1366],{"class":959},":",[887,1368,1370],{"class":1369},"sjR7W"," true",[887,1372,1373],{"class":897},",\n",[887,1375,1376,1378,1381,1383,1385,1388,1391,1393],{"class":889,"line":942},[887,1377,1356],{"class":1355},[887,1379,1380],{"class":1359},"date",[887,1382,1363],{"class":1355},[887,1384,1366],{"class":959},[887,1386,1387],{"class":911}," \"",[887,1389,1390],{"class":915},"2026-04-12T10:00:00.000Z",[887,1392,1363],{"class":911},[887,1394,1373],{"class":897},[887,1396,1397,1399,1402,1404,1406],{"class":889,"line":948},[887,1398,1356],{"class":1355},[887,1400,1401],{"class":1359},"data",[887,1403,1363],{"class":1355},[887,1405,1366],{"class":959},[887,1407,1408],{"class":897}," {\n",[887,1410,1411,1414,1416,1418,1420,1422,1425,1427],{"class":889,"line":970},[887,1412,1413],{"class":1355},"    \"",[887,1415,1298],{"class":1359},[887,1417,1363],{"class":1355},[887,1419,1366],{"class":959},[887,1421,1387],{"class":911},[887,1423,1424],{"class":915},"PASSWORD_RESET",[887,1426,1363],{"class":911},[887,1428,1373],{"class":897},[887,1430,1432,1434,1437,1439,1441,1443,1445],{"class":889,"line":1431},6,[887,1433,1413],{"class":1355},[887,1435,1436],{"class":1359},"link",[887,1438,1363],{"class":1355},[887,1440,1366],{"class":959},[887,1442,1387],{"class":911},[887,1444,130],{"class":915},[887,1446,1447],{"class":911},"\"\n",[887,1449,1451],{"class":889,"line":1450},7,[887,1452,1453],{"class":897},"  }\n",[887,1455,1457],{"class":889,"line":1456},8,[887,1458,1459],{"class":897},"}\n",[848,1461,1462],{},"If the link is invalid or expired, the handler returns a 404 error response.",[848,1464,1465,1466,1468],{},"The ",[855,1467,156],{}," composable takes care of sending the GET request with the right parameters.",[860,1470],{},[863,1472,1474],{"id":1473},"step-3-submit-the-new-password","Step 3: submit the new password",[848,1476,1477,1478,1481],{},"The user enters a new password and the 7-digit code from their email. The frontend submits both to ",[855,1479,1480],{},"POST \u002Fapi\u002Fauth\u002Freset-password"," with the magic link query parameters.",[848,1483,1484],{},"The route middleware stack:",[1202,1486,1487,1494,1504,1513],{},[1205,1488,1489,1493],{},[1490,1491,1492],"strong",{},"Link verification",": re-validates the magic link parameters.",[1205,1495,1496,1499,1500,1503],{},[1490,1497,1498],{},"CSRF verification",": validates the ",[855,1501,1502],{},"X-CSRF-Token"," header.",[1205,1505,1506,1509,1510,1227],{},[1490,1507,1508],{},"Content-Type",": requires ",[855,1511,1512],{},"application\u002Fjson",[1205,1514,1515,1518],{},[1490,1516,1517],{},"Body limit",": 1 KB maximum.",[848,1520,1521],{},"The handler proxies the new password and verification code to the IAM service, which:",[1202,1523,1524,1532,1535,1545,1548,1551],{},[1205,1525,1526,1527,1305,1530,1227],{},"Validates the magic link JWT and ensures ",[855,1528,1529],{},"purpose",[855,1531,1424],{},[1205,1533,1534],{},"Verifies the 7-digit code.",[1205,1536,1537,1538,1544],{},"Checks the new password against the ",[1086,1539,1543],{"href":1540,"rel":1541},"https:\u002F\u002Fhaveibeenpwned.com\u002F",[1542],"nofollow","Have I Been Pwned"," API.",[1205,1546,1547],{},"Hashes the new password with Argon2 and updates the database.",[1205,1549,1550],{},"Sends a security notification email.",[1205,1552,1553],{},"Returns success.",[848,1555,1556],{},"The password must meet the same policy enforced by the IAM service: at least 12 characters with one uppercase letter, one lowercase letter, one digit, and one special character.",[916,1558,1234],{"id":1559},"error-responses-1",[1098,1561,1562,1573],{},[1101,1563,1564],{},[1104,1565,1566,1568,1570],{},[1107,1567,1243],{},[1107,1569,1246],{},[1107,1571,1572],{},"Meaning",[1120,1574,1575,1584,1594,1604,1615],{},[1104,1576,1577,1579,1581],{},[1125,1578,1253],{},[1125,1580,1253],{},[1125,1582,1583],{},"Password updated",[1104,1585,1586,1589,1591],{},[1125,1587,1588],{},"400",[1125,1590,1588],{},[1125,1592,1593],{},"Invalid code, weak password, or validation error",[1104,1595,1596,1599,1601],{},[1125,1597,1598],{},"404",[1125,1600,1598],{},[1125,1602,1603],{},"Invalid or expired link",[1104,1605,1606,1608,1612],{},[1125,1607,1261],{},[1125,1609,1264,1610],{},[855,1611,1267],{},[1125,1613,1614],{},"Rate limited",[1104,1616,1617,1619,1621],{},[1125,1618,1273],{},[1125,1620,1273],{},[1125,1622,1623],{},"Server error",[860,1625],{},[863,1627,1629],{"id":1628},"client-side-integration","Client-side integration",[848,1631,1465,1632,1634,1635,1637,1638,1640,1641,1643],{},[855,1633,156],{}," composable handles routing automatically. When the ",[855,1636,1298],{}," query parameter is ",[855,1639,1424],{},", it sends the GET request to ",[855,1642,1150],{}," and returns the verified data.",[848,1645,1646,1647,1649],{},"Your verification page checks the returned ",[855,1648,1298],{}," and renders the password reset form:",[877,1651,1655],{"className":1652,"code":1653,"language":1654,"meta":883,"style":883},"language-vue shiki shiki-themes light-plus light-plus dracula","\u003Cscript setup lang=\"ts\">\nconst data = await useMagicLink()\n\n\u002F\u002F data.reason === 'PASSWORD_RESET'\n\u002F\u002F Render password reset form with code input\n\u003C\u002Fscript>\n","vue",[855,1656,1657,1688,1705,1709,1715,1720],{"__ignoreMap":883},[887,1658,1659,1663,1667,1671,1674,1677,1680,1683,1685],{"class":889,"line":890},[887,1660,1662],{"class":1661},"spX-7","\u003C",[887,1664,1666],{"class":1665},"scd-l","script",[887,1668,1670],{"class":1669},"sAY9V"," setup",[887,1672,1673],{"class":1669}," lang",[887,1675,1676],{"class":959},"=",[887,1678,1363],{"class":1679},"seisi",[887,1681,882],{"class":1682},"sKKzR",[887,1684,1363],{"class":1679},[887,1686,1687],{"class":1661},">\n",[887,1689,1690,1692,1695,1697,1700,1703],{"class":889,"line":922},[887,1691,952],{"class":951},[887,1693,1694],{"class":955}," data",[887,1696,960],{"class":959},[887,1698,1699],{"class":893}," await",[887,1701,1702],{"class":963}," useMagicLink",[887,1704,967],{"class":897},[887,1706,1707],{"class":889,"line":942},[887,1708,945],{"emptyLinePlaceholder":8},[887,1710,1711],{"class":889,"line":948},[887,1712,1714],{"class":1713},"sghk6","\u002F\u002F data.reason === 'PASSWORD_RESET'\n",[887,1716,1717],{"class":889,"line":970},[887,1718,1719],{"class":1713},"\u002F\u002F Render password reset form with code input\n",[887,1721,1722,1725,1727],{"class":889,"line":1431},[887,1723,1724],{"class":1661},"\u003C\u002F",[887,1726,1666],{"class":1665},[887,1728,1687],{"class":1661},[848,1730,1731,1732,1734,1735,981,1737,981,1739,981,1741,1743],{},"The form submits both the new password and the 7-digit code to ",[855,1733,1480],{},", passing the original query parameters (",[855,1736,1292],{},[855,1738,1295],{},[855,1740,1298],{},[855,1742,1301],{},") as query string values.",[848,1745,1746,1747,1749],{},"See ",[1086,1748,142],{"href":143}," for the full page implementation pattern.",[1751,1752,1753],"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 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 .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 .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 .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 .sjR7W, html code.shiki .sjR7W{--shiki-light:#0000FF;--shiki-default:#0000FF;--shiki-dark:#BD93F9}html pre.shiki code .spX-7, html code.shiki .spX-7{--shiki-light:#800000;--shiki-default:#800000;--shiki-dark:#F8F8F2}html pre.shiki code .scd-l, html code.shiki .scd-l{--shiki-light:#800000;--shiki-default:#800000;--shiki-dark:#FF79C6}html pre.shiki code .sAY9V, html code.shiki .sAY9V{--shiki-light:#E50000;--shiki-light-font-style:inherit;--shiki-default:#E50000;--shiki-default-font-style:inherit;--shiki-dark:#50FA7B;--shiki-dark-font-style:italic}html pre.shiki code .seisi, html code.shiki .seisi{--shiki-light:#0000FF;--shiki-default:#0000FF;--shiki-dark:#E9F284}html pre.shiki code .sKKzR, html code.shiki .sKKzR{--shiki-light:#0000FF;--shiki-default:#0000FF;--shiki-dark:#F1FA8C}html pre.shiki code .sghk6, html code.shiki .sghk6{--shiki-light:#008000;--shiki-default:#008000;--shiki-dark:#6272A4}",{"title":883,"searchDepth":922,"depth":922,"links":1755},[1756,1757,1760,1761,1764],{"id":865,"depth":922,"text":866},{"id":1179,"depth":922,"text":1180,"children":1758},[1759],{"id":1233,"depth":942,"text":1234},{"id":1280,"depth":922,"text":1281},{"id":1473,"depth":922,"text":1474,"children":1762},[1763],{"id":1559,"depth":942,"text":1234},{"id":1628,"depth":922,"text":1629},"The three-step password reset flow using magic links, from initiation through link verification to new password submission.","md",{},null,"---\ntitle: Password Reset\ndescription: The three-step password reset flow using magic links, from initiation through link verification to new password submission.\nicon: i-lucide-key-round\n---\n\nThe password reset flow allows users to change their password when they have forgotten it. It follows a three-step magic link pattern: the user requests a reset, clicks the link in their email, and submits a new password along with the 7-digit verification code.\n\nAll three routes are registered by `magicLinksRouter` and require no custom server code.\n\n---\n\n## Route registration\n\nCall `magicLinksRouter` with your router or app instance during startup.\n\n::code-group\n\n```ts [H3 v1]\nimport { createRouter } from 'h3'\nimport { magicLinksRouter } from 'auth-h3client\u002Fv1'\n\nconst router = createRouter()\nmagicLinksRouter(router, 'api')\n```\n\n```ts [H3 v2]\nimport { H3 } from 'h3'\nimport { magicLinksRouter } from 'auth-h3client\u002Fv2'\n\nconst app = new H3()\nmagicLinksRouter(app, 'api')\n```\n\n::\n\nWhen using the Nuxt module, all magic link routes are registered automatically by `defineAuthConfiguration` in your Nitro plugin. See the [Nuxt Module setup](\u002Fdocs\u002Fauth-h3client\u002Fgetting-started\u002Fnuxt) for details.\n\nWith the `'api'` prefix, the following routes are registered:\n\n| Method | Path | Handler | Purpose |\n|---|---|---|---|\n| POST | `\u002Fapi\u002Fauth\u002Fpassword-reset` | `restartPasswordHandler` | Sends the reset email |\n| GET | `\u002Fapi\u002Fauth\u002Freset-password` | `verifyTempPasswordLink` | Validates the magic link |\n| POST | `\u002Fapi\u002Fauth\u002Freset-password` | `sendNewPasswordHandler` | Submits the new password with the verification code |\n\n---\n\n## Step 1: request a reset\n\nThe user submits their email address to `POST \u002Fapi\u002Fauth\u002Fpassword-reset`. The route applies CSRF verification, `Content-Type: application\u002Fjson` validation, and a 1 KB body limit before the handler runs.\n\nThe handler proxies the email to the IAM [`\u002Fauth\u002Fforgot-password`](\u002Fdocs\u002Fiam\u002Fessentials\u002Fpassword-reset) endpoint. The IAM service:\n\n1. Looks up the user by email.\n2. Generates a magic link JWT with `purpose: \"PASSWORD_RESET\"` and a 20-minute TTL.\n3. Generates a 7-digit verification code.\n4. Sends both to the user's email address.\n5. Returns a generic success message regardless of whether the email exists, to prevent [email enumeration](\u002Fdocs\u002Fiam\u002Fessentials\u002Fpassword-reset).\n\nThe gateway forwards the response to the client. The frontend should show a \"check your email\" message.\n\n### Error responses\n\n| IAM status | Gateway response |\n|---|---|\n| 200 | 200 with success message |\n| 429 | 429 with `Retry-After` header |\n| 500 | 500 |\n\n---\n\n## Step 2: verify the link\n\nWhen the user clicks the magic link in their email, the [bounce route](\u002Fdocs\u002Fauth-h3client\u002Fmfa\u002Fclient-side#bounce-route) redirects them to your frontend verification page with query parameters (`token`, `random`, `reason`, `visitor`). The frontend code then needs to detect that the `reason` is `\"PASSWORD_RESET\"` and sends a GET request to `\u002Fapi\u002Fauth\u002Freset-password` with those parameters, and all cookies identifiers.\n\nThe handler:\n\n1. Sets `Cache-Control: no-store`.\n2. Validates the `canary_id` cookie and `token` query parameter.\n3. Proxies the request to the IAM service to verify the link signature and expiry.\n\nOn success, the handler returns the verification result from the IAM service:\n\n```json\n{\n  \"ok\": true,\n  \"date\": \"2026-04-12T10:00:00.000Z\",\n  \"data\": {\n    \"reason\": \"PASSWORD_RESET\",\n    \"link\": \"Password Reset\"\n  }\n}\n```\n\nIf the link is invalid or expired, the handler returns a 404 error response.\n\n\nThe `useMagicLink` composable takes care of sending the GET request with the right parameters.\n\n---\n\n## Step 3: submit the new password\n\nThe user enters a new password and the 7-digit code from their email. The frontend submits both to `POST \u002Fapi\u002Fauth\u002Freset-password` with the magic link query parameters.\n\nThe route middleware stack:\n\n1. **Link verification**: re-validates the magic link parameters.\n2. **CSRF verification**: validates the `X-CSRF-Token` header.\n3. **Content-Type**: requires `application\u002Fjson`.\n4. **Body limit**: 1 KB maximum.\n\nThe handler proxies the new password and verification code to the IAM service, which:\n\n1. Validates the magic link JWT and ensures `purpose` is `PASSWORD_RESET`.\n2. Verifies the 7-digit code.\n3. Checks the new password against the [Have I Been Pwned](https:\u002F\u002Fhaveibeenpwned.com\u002F) API.\n4. Hashes the new password with Argon2 and updates the database.\n5. Sends a security notification email.\n6. Returns success.\n\nThe password must meet the same policy enforced by the IAM service: at least 12 characters with one uppercase letter, one lowercase letter, one digit, and one special character.\n\n### Error responses\n\n| IAM status | Gateway response | Meaning |\n|---|---|---|\n| 200 | 200 | Password updated |\n| 400 | 400 | Invalid code, weak password, or validation error |\n| 404 | 404 | Invalid or expired link |\n| 429 | 429 with `Retry-After` | Rate limited |\n| 500 | 500 | Server error |\n\n---\n\n## Client-side integration\n\nThe `useMagicLink` composable handles routing automatically. When the `reason` query parameter is `PASSWORD_RESET`, it sends the GET request to `\u002Fapi\u002Fauth\u002Freset-password` and returns the verified data.\n\nYour verification page checks the returned `reason` and renders the password reset form:\n\n```vue\n\u003Cscript setup lang=\"ts\">\nconst data = await useMagicLink()\n\n\u002F\u002F data.reason === 'PASSWORD_RESET'\n\u002F\u002F Render password reset form with code input\n\u003C\u002Fscript>\n```\n\nThe form submits both the new password and the 7-digit code to `POST \u002Fapi\u002Fauth\u002Freset-password`, passing the original query parameters (`token`, `random`, `reason`, `visitor`) as query string values.\n\nSee [Client-Side MFA](\u002Fdocs\u002Fauth-h3client\u002Fmfa\u002Fclient-side) for the full page implementation pattern.\n",{"title":130,"description":1765},"cd2QsGCDyj-05Ta3ZVHV5iyxicdmJkRg1e_3Gt5FJj4",[1773,1774],{"title":126,"path":127,"stem":128,"children":-1},{"title":134,"path":135,"stem":136,"children":-1},{"id":843,"title":130,"body":1776,"description":1765,"extension":1766,"icon":21,"meta":2440,"module":1768,"navigation":8,"path":131,"rawbody":1769,"seo":2441,"stem":132,"__hash__":1771},{"type":845,"value":1777,"toc":2429},[1778,1780,1784,1786,1788,1792,1944,1950,1954,2012,2014,2016,2022,2028,2044,2046,2048,2080,2082,2084,2102,2104,2118,2120,2214,2216,2220,2222,2224,2228,2230,2252,2254,2275,2277,2279,2335,2337,2339,2349,2353,2411,2423,2427],[848,1779,850],{},[848,1781,853,1782,858],{},[855,1783,857],{},[860,1785],{},[863,1787,866],{"id":865},[848,1789,869,1790,872],{},[855,1791,857],{},[874,1793,1794,1868],{},[877,1795,1796],{"className":879,"code":880,"filename":881,"language":882,"meta":883,"style":883},[855,1797,1798,1816,1834,1838,1850],{"__ignoreMap":883},[887,1799,1800,1802,1804,1806,1808,1810,1812,1814],{"class":889,"line":890},[887,1801,894],{"class":893},[887,1803,898],{"class":897},[887,1805,902],{"class":901},[887,1807,905],{"class":897},[887,1809,908],{"class":893},[887,1811,912],{"class":911},[887,1813,916],{"class":915},[887,1815,919],{"class":911},[887,1817,1818,1820,1822,1824,1826,1828,1830,1832],{"class":889,"line":922},[887,1819,894],{"class":893},[887,1821,898],{"class":897},[887,1823,857],{"class":901},[887,1825,905],{"class":897},[887,1827,908],{"class":893},[887,1829,912],{"class":911},[887,1831,937],{"class":915},[887,1833,919],{"class":911},[887,1835,1836],{"class":889,"line":942},[887,1837,945],{"emptyLinePlaceholder":8},[887,1839,1840,1842,1844,1846,1848],{"class":889,"line":948},[887,1841,952],{"class":951},[887,1843,956],{"class":955},[887,1845,960],{"class":959},[887,1847,964],{"class":963},[887,1849,967],{"class":897},[887,1851,1852,1854,1856,1858,1860,1862,1864,1866],{"class":889,"line":970},[887,1853,857],{"class":963},[887,1855,975],{"class":897},[887,1857,978],{"class":901},[887,1859,981],{"class":897},[887,1861,984],{"class":911},[887,1863,987],{"class":915},[887,1865,984],{"class":911},[887,1867,992],{"class":897},[877,1869,1870],{"className":879,"code":995,"filename":996,"language":882,"meta":883,"style":883},[855,1871,1872,1890,1908,1912,1926],{"__ignoreMap":883},[887,1873,1874,1876,1878,1880,1882,1884,1886,1888],{"class":889,"line":890},[887,1875,894],{"class":893},[887,1877,898],{"class":897},[887,1879,1007],{"class":901},[887,1881,905],{"class":897},[887,1883,908],{"class":893},[887,1885,912],{"class":911},[887,1887,916],{"class":915},[887,1889,919],{"class":911},[887,1891,1892,1894,1896,1898,1900,1902,1904,1906],{"class":889,"line":922},[887,1893,894],{"class":893},[887,1895,898],{"class":897},[887,1897,857],{"class":901},[887,1899,905],{"class":897},[887,1901,908],{"class":893},[887,1903,912],{"class":911},[887,1905,1034],{"class":915},[887,1907,919],{"class":911},[887,1909,1910],{"class":889,"line":942},[887,1911,945],{"emptyLinePlaceholder":8},[887,1913,1914,1916,1918,1920,1922,1924],{"class":889,"line":948},[887,1915,952],{"class":951},[887,1917,1047],{"class":955},[887,1919,960],{"class":959},[887,1921,1053],{"class":1052},[887,1923,1056],{"class":963},[887,1925,967],{"class":897},[887,1927,1928,1930,1932,1934,1936,1938,1940,1942],{"class":889,"line":970},[887,1929,857],{"class":963},[887,1931,975],{"class":897},[887,1933,1067],{"class":901},[887,1935,981],{"class":897},[887,1937,984],{"class":911},[887,1939,987],{"class":915},[887,1941,984],{"class":911},[887,1943,992],{"class":897},[848,1945,1080,1946,1084,1948,1089],{},[855,1947,1083],{},[1086,1949,1088],{"href":80},[848,1951,1092,1952,1096],{},[855,1953,1095],{},[1098,1955,1956,1968],{},[1101,1957,1958],{},[1104,1959,1960,1962,1964,1966],{},[1107,1961,1109],{},[1107,1963,1112],{},[1107,1965,1115],{},[1107,1967,1118],{},[1120,1969,1970,1984,1998],{},[1104,1971,1972,1974,1978,1982],{},[1125,1973,1127],{},[1125,1975,1976],{},[855,1977,1132],{},[1125,1979,1980],{},[855,1981,1137],{},[1125,1983,1140],{},[1104,1985,1986,1988,1992,1996],{},[1125,1987,1145],{},[1125,1989,1990],{},[855,1991,1150],{},[1125,1993,1994],{},[855,1995,1155],{},[1125,1997,1158],{},[1104,1999,2000,2002,2006,2010],{},[1125,2001,1127],{},[1125,2003,2004],{},[855,2005,1150],{},[1125,2007,2008],{},[855,2009,1171],{},[1125,2011,1174],{},[860,2013],{},[863,2015,1180],{"id":1179},[848,2017,1183,2018,1187,2020,1191],{},[855,2019,1186],{},[855,2021,1190],{},[848,2023,1194,2024,1200],{},[1086,2025,2026],{"href":481},[855,2027,1199],{},[1202,2029,2030,2032,2036,2038,2040],{},[1205,2031,1207],{},[1205,2033,1210,2034,1214],{},[855,2035,1213],{},[1205,2037,1217],{},[1205,2039,1220],{},[1205,2041,1223,2042,1227],{},[1086,2043,1226],{"href":481},[848,2045,1230],{},[916,2047,1234],{"id":1233},[1098,2049,2050,2058],{},[1101,2051,2052],{},[1104,2053,2054,2056],{},[1107,2055,1243],{},[1107,2057,1246],{},[1120,2059,2060,2066,2074],{},[1104,2061,2062,2064],{},[1125,2063,1253],{},[1125,2065,1256],{},[1104,2067,2068,2070],{},[1125,2069,1261],{},[1125,2071,1264,2072,1268],{},[855,2073,1267],{},[1104,2075,2076,2078],{},[1125,2077,1273],{},[1125,2079,1273],{},[860,2081],{},[863,2083,1281],{"id":1280},[848,2085,1284,2086,1289,2088,981,2090,981,2092,981,2094,1302,2096,1305,2098,1309,2100,1312],{},[1086,2087,1288],{"href":1287},[855,2089,1292],{},[855,2091,1295],{},[855,2093,1298],{},[855,2095,1301],{},[855,2097,1298],{},[855,2099,1308],{},[855,2101,1150],{},[848,2103,1315],{},[1202,2105,2106,2110,2116],{},[1205,2107,1320,2108,1227],{},[855,2109,1323],{},[1205,2111,1326,2112,1330,2114,1333],{},[855,2113,1329],{},[855,2115,1292],{},[1205,2117,1336],{},[848,2119,1339],{},[877,2121,2122],{"className":1342,"code":1343,"language":5,"meta":883,"style":883},[855,2123,2124,2128,2142,2160,2172,2190,2206,2210],{"__ignoreMap":883},[887,2125,2126],{"class":889,"line":890},[887,2127,1350],{"class":897},[887,2129,2130,2132,2134,2136,2138,2140],{"class":889,"line":922},[887,2131,1356],{"class":1355},[887,2133,1360],{"class":1359},[887,2135,1363],{"class":1355},[887,2137,1366],{"class":959},[887,2139,1370],{"class":1369},[887,2141,1373],{"class":897},[887,2143,2144,2146,2148,2150,2152,2154,2156,2158],{"class":889,"line":942},[887,2145,1356],{"class":1355},[887,2147,1380],{"class":1359},[887,2149,1363],{"class":1355},[887,2151,1366],{"class":959},[887,2153,1387],{"class":911},[887,2155,1390],{"class":915},[887,2157,1363],{"class":911},[887,2159,1373],{"class":897},[887,2161,2162,2164,2166,2168,2170],{"class":889,"line":948},[887,2163,1356],{"class":1355},[887,2165,1401],{"class":1359},[887,2167,1363],{"class":1355},[887,2169,1366],{"class":959},[887,2171,1408],{"class":897},[887,2173,2174,2176,2178,2180,2182,2184,2186,2188],{"class":889,"line":970},[887,2175,1413],{"class":1355},[887,2177,1298],{"class":1359},[887,2179,1363],{"class":1355},[887,2181,1366],{"class":959},[887,2183,1387],{"class":911},[887,2185,1424],{"class":915},[887,2187,1363],{"class":911},[887,2189,1373],{"class":897},[887,2191,2192,2194,2196,2198,2200,2202,2204],{"class":889,"line":1431},[887,2193,1413],{"class":1355},[887,2195,1436],{"class":1359},[887,2197,1363],{"class":1355},[887,2199,1366],{"class":959},[887,2201,1387],{"class":911},[887,2203,130],{"class":915},[887,2205,1447],{"class":911},[887,2207,2208],{"class":889,"line":1450},[887,2209,1453],{"class":897},[887,2211,2212],{"class":889,"line":1456},[887,2213,1459],{"class":897},[848,2215,1462],{},[848,2217,1465,2218,1468],{},[855,2219,156],{},[860,2221],{},[863,2223,1474],{"id":1473},[848,2225,1477,2226,1481],{},[855,2227,1480],{},[848,2229,1484],{},[1202,2231,2232,2236,2242,2248],{},[1205,2233,2234,1493],{},[1490,2235,1492],{},[1205,2237,2238,1499,2240,1503],{},[1490,2239,1498],{},[855,2241,1502],{},[1205,2243,2244,1509,2246,1227],{},[1490,2245,1508],{},[855,2247,1512],{},[1205,2249,2250,1518],{},[1490,2251,1517],{},[848,2253,1521],{},[1202,2255,2256,2262,2264,2269,2271,2273],{},[1205,2257,1526,2258,1305,2260,1227],{},[855,2259,1529],{},[855,2261,1424],{},[1205,2263,1534],{},[1205,2265,1537,2266,1544],{},[1086,2267,1543],{"href":1540,"rel":2268},[1542],[1205,2270,1547],{},[1205,2272,1550],{},[1205,2274,1553],{},[848,2276,1556],{},[916,2278,1234],{"id":1559},[1098,2280,2281,2291],{},[1101,2282,2283],{},[1104,2284,2285,2287,2289],{},[1107,2286,1243],{},[1107,2288,1246],{},[1107,2290,1572],{},[1120,2292,2293,2301,2309,2317,2327],{},[1104,2294,2295,2297,2299],{},[1125,2296,1253],{},[1125,2298,1253],{},[1125,2300,1583],{},[1104,2302,2303,2305,2307],{},[1125,2304,1588],{},[1125,2306,1588],{},[1125,2308,1593],{},[1104,2310,2311,2313,2315],{},[1125,2312,1598],{},[1125,2314,1598],{},[1125,2316,1603],{},[1104,2318,2319,2321,2325],{},[1125,2320,1261],{},[1125,2322,1264,2323],{},[855,2324,1267],{},[1125,2326,1614],{},[1104,2328,2329,2331,2333],{},[1125,2330,1273],{},[1125,2332,1273],{},[1125,2334,1623],{},[860,2336],{},[863,2338,1629],{"id":1628},[848,2340,1465,2341,1634,2343,1637,2345,1640,2347,1643],{},[855,2342,156],{},[855,2344,1298],{},[855,2346,1424],{},[855,2348,1150],{},[848,2350,1646,2351,1649],{},[855,2352,1298],{},[877,2354,2355],{"className":1652,"code":1653,"language":1654,"meta":883,"style":883},[855,2356,2357,2377,2391,2395,2399,2403],{"__ignoreMap":883},[887,2358,2359,2361,2363,2365,2367,2369,2371,2373,2375],{"class":889,"line":890},[887,2360,1662],{"class":1661},[887,2362,1666],{"class":1665},[887,2364,1670],{"class":1669},[887,2366,1673],{"class":1669},[887,2368,1676],{"class":959},[887,2370,1363],{"class":1679},[887,2372,882],{"class":1682},[887,2374,1363],{"class":1679},[887,2376,1687],{"class":1661},[887,2378,2379,2381,2383,2385,2387,2389],{"class":889,"line":922},[887,2380,952],{"class":951},[887,2382,1694],{"class":955},[887,2384,960],{"class":959},[887,2386,1699],{"class":893},[887,2388,1702],{"class":963},[887,2390,967],{"class":897},[887,2392,2393],{"class":889,"line":942},[887,2394,945],{"emptyLinePlaceholder":8},[887,2396,2397],{"class":889,"line":948},[887,2398,1714],{"class":1713},[887,2400,2401],{"class":889,"line":970},[887,2402,1719],{"class":1713},[887,2404,2405,2407,2409],{"class":889,"line":1431},[887,2406,1724],{"class":1661},[887,2408,1666],{"class":1665},[887,2410,1687],{"class":1661},[848,2412,1731,2413,1734,2415,981,2417,981,2419,981,2421,1743],{},[855,2414,1480],{},[855,2416,1292],{},[855,2418,1295],{},[855,2420,1298],{},[855,2422,1301],{},[848,2424,1746,2425,1749],{},[1086,2426,142],{"href":143},[1751,2428,1753],{},{"title":883,"searchDepth":922,"depth":922,"links":2430},[2431,2432,2435,2436,2439],{"id":865,"depth":922,"text":866},{"id":1179,"depth":922,"text":1180,"children":2433},[2434],{"id":1233,"depth":942,"text":1234},{"id":1280,"depth":922,"text":1281},{"id":1473,"depth":922,"text":1474,"children":2437},[2438],{"id":1559,"depth":942,"text":1234},{"id":1628,"depth":922,"text":1629},{},{"title":130,"description":1765},1780436291742]