1<!DOCTYPE html><html lang="en" dir="ltr" data-theme="dark" data-has-toc data-has-sidebar class="astro-bguv2lll"> <head>
1<script data-domain="kinde.com" src="https://kinde.com/js/script.tagged-events.js" defer></script>
1<meta charset="utf-8"/><meta name="viewport" content="width=device-width, initial-scale=1"/><title>Use Kinde without an SDK - Kinde docs</title><link rel="canonical" href="https://docs.kinde.com/developer-tools/about/using-kinde-without-an-sdk/"/><link rel="sitemap" href="/sitemap-index.xml"/><link/><link rel="shortcut icon" href="/favicon.svg" type="image/svg+xml"/><meta name="generator" content="Astro v5.7.2"/><meta name="generator" content="Starlight v0.30.3"/><meta property="og:title" content="Use Kinde without an SDK"/><meta property="og:type" content="article"/><meta property="og:url" content="https://docs.kinde.com/developer-tools/about/using-kinde-without-an-sdk/"/><meta property="og:locale" content="en"/><meta property="og:description" content="Build Kinde auth without an SDK using OAuth 2.0 and OpenID Connectâcode flow, PKCE, tokens, and route protection"/><meta property="og:site_name" content="Kinde docs"/><meta name="twitter:card" content="summary_large_image"/><meta name="description" content="Build Kinde auth without an SDK using OAuth 2.0 and OpenID Connectâcode flow, PKCE, tokens, and route protection"/><meta property="og:image" content="https://docs.kinde.com/developer-tools/about/using-kinde-without-an-sdk/og-image.png"><meta name="ai-summary" content="Guide to integrating Kinde authentication in any language or framework without an official SDK, using OAuth 2.0 and OpenID Connect. A nine-step quickstart covers creating a Kinde application, configuring callback URLs and auth methods, discovering OpenID endpoints, and implementing either the Authorization Code Flow for backend apps or Authorization Code Flow with PKCE for SPAs and mobile clients. It walks through generating state and nonce values, building authorization URLs, validating callbacks, exchanging codes for tokens, and decoding the id_token while verifying the nonce claim. Further sections cover two-layer route protection with frontend expiry checks and backend RS256 JWT verification against JWKS, silent access token refresh, sign-out via the logout endpoint, and self-serve portal links via the Account API. Includes grant type guidance, OAuth scopes, and a full request parameter reference covering state, nonce, prompt, login_hint, org_code, audience, and more. FAQs explain why Implicit Flow is unsupported and when to use the userinfo endpoint. Intended for developers building custom OAuth integrations."><meta name="keywords" content="authorization code flow, PKCE, nonce, token exchange, JWT verification, refresh token, OpenID Connect, route protection"><meta name="description" content="Build Kinde auth without an SDK using OAuth 2.0 and OpenID Connectâcode flow, PKCE, tokens, and route protection"><meta name="sdk" content><meta name="languages" content="javascript"><meta name="audience" content="developers"><meta name="complexity" content="advanced">
1<script>(function(){const apiKey = "sk_fa161c50ccf1a71b7cbe3822c3a2d1d16c1fa5dcaec4438dd05c82d6bc7044ca"; 2 3 // Hall Analytics Client-Side Tracking 4 (function() { 5 'use strict'; 6 7 const HALL_API_KEY = apiKey; 8 9 if (!HALL_API_KEY) { 10 return; 11 } 12 13 // Track page view when component loads 14 function trackPageView() { 15 const path = window.location.pathname + window.location.search; 16 const method = 'GET'; 17 const timestamp = Date.now(); 18 19 // Get IP from headers (will be client IP) 20 const requestHeaders = { 21 'User-Agent': navigator.userAgent, 22 'Host': window.location.host, 23 'Referer': document.referrer, 24 'Accept-Language': navigator.language, 25 'Accept': 'text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,*/*;q=0.8', 26 ...(navigator.userAgentData ? { 27 'Sec-Ch-Ua-Mobile': navigator.userAgentData.mobile ? '?1' : '?0', 28 'Sec-Ch-Ua-Platform': `"${navigator.userAgentData.platform}"` 29 } : {}) 30 }; 31 32 const analyticsData = { 33 request_path: path, 34 request_method: method, 35 request_ip: '127.0.0.1', // Client-side can't get real IP 36 request_headers: requestHeaders, 37 request_timestamp: timestamp 38 }; 39 40 // Send to Hall Analytics 41 fetch('https://analytics.usehall.com/visit', { 42 method: 'POST', 43 headers: { 44 'Content-Type': 'application/json', 45 'Authorization': `Bearer ${HALL_API_KEY}`, 46 }, 47 body: JSON.stringify(analyticsData), 48 }) 49 .then(response => { 50 if (!response.ok) { 51 console.error('[Hall Analytics] Failed to track:', response.status); 52 } 53 }) 54 .catch(error => { 55 console.error('[Hall Analytics] Network error:', error); 56 }); 57 } 58 59 // Track initial page load 60 if (document.readyState === 'loading') { 61 document.addEventListener('DOMContentLoaded', trackPageView); 62 } else { 63 trackPageView(); 64 } 65 66 // Store observers for potential cleanup 67 const observers = []; 68 69 // Also track when body becomes available (fallback) 70 if (!document.body) { 71 const bodyObserver = new MutationObserver(() => { 72 if (document.body) { 73 bodyObserver.disconnect(); 74 trackPageView(); 75 } 76 }); 77 observers.push(bodyObserver); 78 bodyObserver.observe(document.documentElement, { 79 childList: true, 80 subtree: true 81 }); 82 } 83 84 // Track navigation (for SPA-like behavior) - only if document.body exists 85 if (document.body) { 86 let currentPath = window.location.pathname; 87 const observer = new MutationObserver(() => { 88 if (window.location.pathname !== currentPath) { 89 currentPath = window.location.pathname; 90 setTimeout(trackPageView, 100); // Small delay to ensure new page is loaded 91 } 92 }); 93 observers.push(observer); 94 95 observer.observe(document.body, { 96 childList: true, 97 subtree: true 98 }); 99 } 100 101 // Cleanup on page unload 102 window.addEventListener('beforeunload', () => { 103 observers.forEach(observer => observer.disconnect()); 104 }); 105 106 })(); 107 })();</script>
107<script> 108 window.StarlightThemeProvider = (() => { 109 const storedTheme = 110 typeof localStorage !== 'undefined' && localStorage.getItem('starlight-theme'); 111 const theme = 112 storedTheme || 113 (window.matchMedia('(prefers-color-scheme: light)').matches ? 'light' : 'dark'); 114 document.documentElement.dataset.theme = theme === 'light' ? 'light' : 'dark'; 115 return { 116 updatePickers(theme = storedTheme || 'auto') { 117 document.querySelectorAll('starlight-theme-select').forEach((picker) => { 118 const select = picker.querySelector('select'); 119 if (select) select.value = theme; 120 /** @type {HTMLTemplateElement | null} */ 121 const tmpl = document.querySelector(`#theme-icons`); 122 const newIcon = tmpl && tmpl.content.querySelector('.' + theme); 123 if (newIcon) { 124 const oldIcon = picker.querySelector('svg.label-icon'); 125 if (oldIcon) { 126 oldIcon.replaceChildren(...newIcon.cloneNode(true).childNodes); 127 } 128 } 129 }); 130 }, 131 }; 132 })(); 133</script>
133<template id="theme-icons"><svg aria-hidden="true" class="light astro-c6vsoqas" width="16" height="16" viewBox="0 0 24 24" fill="currentColor" style="--sl-icon-size: 1em;"><path d="M5 12a1 1 0 0 0-1-1H3a1 1 0 0 0 0 2h1a1 1 0 0 0 1-1Zm.64 5-.71.71a1 1 0 0 0 0 1.41 1 1 0 0 0 1.41 0l.71-.71A1 1 0 0 0 5.64 17ZM12 5a1 1 0 0 0 1-1V3a1 1 0 0 0-2 0v1a1 1 0 0 0 1 1Zm5.66 2.34a1 1 0 0 0 .7-.29l.71-.71a1 1 0 1 0-1.41-1.41l-.66.71a1 1 0 0 0 0 1.41 1 1 0 0 0 .66.29Zm-12-.29a1 1 0 0 0 1.41 0 1 1 0 0 0 0-1.41l-.71-.71a1.004 1.004 0 1 0-1.43 1.41l.73.71ZM21 11h-1a1 1 0 0 0 0 2h1a1 1 0 0 0 0-2Zm-2.64 6A1 1 0 0 0 17 18.36l.71.71a1 1 0 0 0 1.41 0 1 1 0 0 0 0-1.41l-.76-.66ZM12 6.5a5.5 5.5 0 1 0 5.5 5.5A5.51 5.51 0 0 0 12 6.5Zm0 9a3.5 3.5 0 1 1 0-7 3.5 3.5 0 0 1 0 7Zm0 3.5a1 1 0 0 0-1 1v1a1 1 0 0 0 2 0v-1a1 1 0 0 0-1-1Z"/></svg> <svg aria-hidden="true" class="dark astro-c6vsoqas" width="16" height="16" viewBox="0 0 24 24" fill="currentColor" style="--sl-icon-size: 1em;"><path d="M21.64 13a1 1 0 0 0-1.05-.14 8.049 8.049 0 0 1-3.37.73 8.15 8.15 0 0 1-8.14-8.1 8.59 8.59 0 0 1 .25-2A1 1 0 0 0 8 2.36a10.14 10.14 0 1 0 14 11.69 1 1 0 0 0-.36-1.05Zm-9.5 6.69A8.14 8.14 0 0 1 7.08 5.22v.27a10.15 10.15 0 0 0 10.14 10.14 9.784 9.784 0 0 0 2.1-.22 8.11 8.11 0 0 1-7.18 4.32v-.04Z"/></svg> <svg aria-hidden="true" class="auto astro-c6vsoqas" width="16" height="16" viewBox="0 0 24 24" fill="currentColor" style="--sl-icon-size: 1em;"><path d="M21 14h-1V7a3 3 0 0 0-3-3H7a3 3 0 0 0-3 3v7H3a1 1 0 0 0-1 1v2a3 3 0 0 0 3 3h14a3 3 0 0 0 3-3v-2a1 1 0 0 0-1-1ZM6 7a1 1 0 0 1 1-1h10a1 1 0 0 1 1 1v7H6V7Zm14 10a1 1 0 0 1-1 1H5a1 1 0 0 1-1-1v-1h16v1Z"/></svg> </template><link rel="stylesheet" href="/_astro/index.D__p2TQP.css"> 134<style>:root{--sl-badge-default-border: var(--sl-color-accent);--sl-badge-default-bg: var(--sl-color-accent-low);--sl-badge-default-text: #fff;--sl-badge-note-border: var(--sl-color-blue);--sl-badge-note-bg: var(--sl-color-blue-low);--sl-badge-note-text: #fff;--sl-badge-danger-border: var(--sl-color-red);--sl-badge-danger-bg: var(--sl-color-red-low);--sl-badge-danger-text: #fff;--sl-badge-success-border: var(--sl-color-green);--sl-badge-success-bg: var(--sl-color-green-low);--sl-badge-success-text: #fff;--sl-badge-caution-border: var(--sl-color-orange);--sl-badge-caution-bg: var(--sl-color-orange-low);--sl-badge-caution-text: #fff;--sl-badge-tip-border: var(--sl-color-purple);--sl-badge-tip-bg: var(--sl-color-purple-low);--sl-badge-tip-text: #fff}[data-theme=light]:root{--sl-badge-default-bg: var(--sl-color-accent-high);--sl-badge-note-bg: var(--sl-color-blue-high);--sl-badge-danger-bg: var(--sl-color-red-high);--sl-badge-success-bg: var(--sl-color-green-high);--sl-badge-caution-bg: var(--sl-color-orange-high);--sl-badge-tip-bg: var(--sl-color-purple-high)}.sl-badge:where(.astro-avdet4wd){display:inline-block;border:1px solid var(--sl-color-border-badge);border-radius:.25rem;font-family:var(--sl-font-system-mono);line-height:normal;color:var(--sl-color-text-badge);background-color:var(--sl-color-bg-badge);overflow-wrap:anywhere}.sidebar-content .sl-badge:where(.astro-avdet4wd){line-height:1;font-size:var(--sl-text-xs);padding:.125rem .375rem}.sidebar-content a[aria-current=page]>.sl-badge:where(.astro-avdet4wd){--sl-color-bg-badge: transparent;--sl-color-border-badge: currentColor;color:inherit}.default:where(.astro-avdet4wd){--sl-color-bg-badge: var(--sl-badge-default-bg);--sl-color-border-badge: var(--sl-badge-default-border);--sl-color-text-badge: var(--sl-badge-default-text)}.note:where(.astro-avdet4wd){--sl-color-bg-badge: var(--sl-badge-note-bg);--sl-color-border-badge: var(--sl-badge-note-border);--sl-color-text-badge: var(--sl-badge-note-text)}.danger:where(.astro-avdet4wd){--sl-color-bg-badge: var(--sl-badge-danger-bg);--sl-color-border-badge: var(--sl-badge-danger-border);--sl-color-text-badge: var(--sl-badge-danger-text)}.success:where(.astro-avdet4wd){--sl-color-bg-badge: var(--sl-badge-success-bg);--sl-color-border-badge: var(--sl-badge-success-border);--sl-color-text-badge: var(--sl-badge-success-text)}.tip:where(.astro-avdet4wd){--sl-color-bg-badge: var(--sl-badge-tip-bg);--sl-color-border-badge: var(--sl-badge-tip-border);--sl-color-text-badge: var(--sl-badge-tip-text)}.caution:where(.astro-avdet4wd){--sl-color-bg-badge: var(--sl-badge-caution-bg);--sl-color-border-badge: var(--sl-badge-caution-border);--sl-color-text-badge: var(--sl-badge-caution-text)}.small:where(.astro-avdet4wd){font-size:var(--sl-text-xs);padding:.125rem .25rem}.medium:where(.astro-avdet4wd){font-size:var(--sl-text-sm);padding:.175rem .35rem}.large:where(.astro-avdet4wd){font-size:var(--sl-text-base);padding:.225rem .45rem}.sl-markdown-content :is(h1,h2,h3,h4,h5,h6) .sl-badge:where(.astro-avdet4wd){vertical-align:middle} 135</style> 136<link rel="stylesheet" href="/_astro/Button_astro_astro_type_style_index_0_lang.DthZtrkf.css"> 137<style>svg:where(.astro-c6vsoqas){color:var(--sl-icon-color);font-size:var(--sl-icon-size, 1em);width:1em;height:1em} 138starlight-tabs:where(.astro-esqgolmp){display:block}.tablist-wrapper:where(.astro-esqgolmp){overflow-x:auto}:where(.astro-esqgolmp)[role=tablist]{display:flex;list-style:none;border-bottom:2px solid var(--sl-color-gray-5);padding:0}.tab:where(.astro-esqgolmp){margin-bottom:-2px}.tab:where(.astro-esqgolmp)>:where(.astro-esqgolmp)[role=tab]{display:flex;align-items:center;gap:.5rem;padding:0 1.25rem;text-decoration:none;border-bottom:2px solid var(--sl-color-gray-5);color:var(--sl-color-gray-3);outline-offset:var(--sl-outline-offset-inside);overflow-wrap:initial}.tab:where(.astro-esqgolmp) :where(.astro-esqgolmp)[role=tab][aria-selected=true]{color:var(--sl-color-white);border-color:var(--sl-color-text-accent);font-weight:600}.tablist-wrapper:where(.astro-esqgolmp)~[role=tabpanel]{margin-top:1rem} 139.sl-steps{--bullet-size: calc(var(--sl-line-height) * 1rem);--bullet-margin: .375rem;list-style:none;counter-reset:steps-counter var(--sl-steps-start, 0);padding-inline-start:0}.sl-steps>li{counter-increment:steps-counter;position:relative;padding-inline-start:calc(var(--bullet-size) + 1rem);padding-bottom:1px;min-height:calc(var(--bullet-size) + var(--bullet-margin))}.sl-steps>li+li{margin-top:0}.sl-steps>li:before{content:counter(steps-counter);position:absolute;top:0;inset-inline-start:0;width:var(--bullet-size);height:var(--bullet-size);line-height:var(--bullet-size);font-size:var(--sl-text-xs);font-weight:600;text-align:center;color:var(--sl-color-white);background-color:var(--sl-color-gray-6);border-radius:99rem;box-shadow:inset 0 0 0 1px var(--sl-color-gray-5)}.sl-steps>li:after{--guide-width: 1px;content:"";position:absolute;top:calc(var(--bullet-size) + var(--bullet-margin));bottom:var(--bullet-margin);inset-inline-start:calc((var(--bullet-size) - var(--guide-width)) / 2);width:var(--guide-width);background-color:var(--sl-color-hairline-light)}.sl-steps>li>:first-child{--lh: calc(1em * var(--sl-line-height));--shift-y: calc(.5 * (var(--bullet-size) - var(--lh)));
139transform:translateY(var(--shift-y));margin-bottom:var(--shift-y)}.sl-steps>li>:first-child:where(h1,h2,h3,h4,h5,h6){--lh: calc(1em * var(--sl-line-height-headings))}@supports (--prop: 1lh){.sl-steps>li>:first-child{--lh: 1lh}} 140starlight-file-tree:where(.astro-p67cqifm){--x-space: 1.5rem;--y-space: .125rem;--y-pad: 0;display:block;border:1px solid var(--sl-color-gray-5);padding:1rem;background-color:var(--sl-color-gray-6);font-size:var(--sl-text-xs);font-family:var(--__sl-font-mono);overflow-x:auto}starlight-file-tree:where(.astro-p67cqifm) .directory>details{border:0;padding:0;padding-inline-start:var(--x-space);background:transparent}starlight-file-tree:where(.astro-p67cqifm) .directory>details>summary{margin-inline-start:calc(-1 * var(--x-space));border:0;padding:var(--y-pad) .625rem;font-weight:400;color:var(--sl-color-white);max-width:100%}starlight-file-tree:where(.astro-p67cqifm) .directory>details>summary::marker,starlight-file-tree:where(.astro-p67cqifm) .directory>details>summary::-webkit-details-marker{color:var(--sl-color-gray-3)}starlight-file-tree:where(.astro-p67cqifm) .directory>details>summary:hover,starlight-file-tree:where(.astro-p67cqifm) .directory>details>summary:hover .tree-icon{cursor:pointer;color:var(--sl-color-text-accent);fill:var(--sl-color-text-accent)}starlight-file-tree:where(.astro-p67cqifm) .directory>details>summary:hover~ul{border-color:var(--sl-color-gray-4)}starlight-file-tree:where(.astro-p67cqifm) .directory>details>summary:hover .highlight .tree-icon{fill:var(--sl-color-text-invert)}starlight-file-tree:where(.astro-p67cqifm) ul{margin-inline-start:.5rem;border-inline-start:1px solid var(--sl-color-gray-5);padding:0;padding-inline-start:.125rem;list-style:none}starlight-file-tree:where(.astro-p67cqifm)>ul{margin:0;border:0;padding:0}starlight-file-tree:where(.astro-p67cqifm) li{margin:var(--y-space) 0;padding:var(--y-pad) 0}starlight-file-tree:where(.astro-p67cqifm) .file{margin-inline-start:calc(var(--x-space) - .125rem);color:var(--sl-color-white)}starlight-file-tree:where(.astro-p67cqifm) .tree-entry{display:inline-flex;align-items:flex-start;flex-wrap:wrap;max-width:calc(100% - 1rem)}@media (min-width: 30em){starlight-file-tree:where(.astro-p67cqifm) .tree-entry{flex-wrap:nowrap}}starlight-file-tree:where(.astro-p67cqifm) .tree-entry>:first-child{flex-shrink:0}starlight-file-tree:where(.astro-p67cqifm) .empty{color:var(--sl-color-gray-3);padding-inline-start:.375rem}starlight-file-tree:where(.astro-p67cqifm) .comment{color:var(--sl-color-gray-3);padding-inline-start:1.625rem;max-width:24rem;min-width:12rem}starlight-file-tree:where(.astro-p67cqifm) .highlight{display:inline-block;border-radius:.25rem;padding-inline-end:.5rem;color:var(--sl-color-text-invert);background-color:var(--sl-color-text-accent)}starlight-file-tree:where(.astro-p67cqifm) svg{display:inline;fill:var(--sl-color-gray-3);vertical-align:middle;margin-inline:.25rem .375rem;width:.875rem;height:.875rem}starlight-file-tree:where(.astro-p67cqifm) .highlight svg.tree-icon{fill:var(--sl-color-text-invert)} 141.sl-link-button:where(.astro-xwgiixxa){align-items:center;border:1px solid transparent;border-radius:999rem;display:inline-flex;font-size:var(--sl-text-sm);gap:.5em;line-height:1.1875;outline-offset:.25rem;padding:.4375rem 1.125rem;text-decoration:none}.sl-link-button:where(.astro-xwgiixxa).primary{background:var(--sl-color-text-accent);border-color:var(--sl-color-text-accent);color:var(--sl-color-black)}.sl-link-button:where(.astro-xwgiixxa).primary:hover{color:var(--sl-color-black)}.sl-link-button:where(.astro-xwgiixxa).secondary{border-color:inherit;color:var(--sl-color-white)}.sl-link-button:where(.astro-xwgiixxa).minimal{color:var(--sl-color-white);padding-inline:0}.sl-link-button:where(.astro-xwgiixxa) svg{flex-shrink:0}@media (min-width: 50rem){.sl-link-button:where(.astro-xwgiixxa){font-size:var(--sl-text-base);padding:.9375rem 1.25rem}}.sl-markdown-content .sl-link-button:where(.astro-xwgiixxa){margin-inline-end:1rem}.sl-markdown-content .sl-link-button:where(.astro-xwgiixxa):not(:where(p *)){margin-block:1rem} 142</style><style>.note-body .expressive-code{margin-top:1rem}.note-body>*+*{margin-top:1rem}.c-aside--info:where(.astro-duqfclob){--tw-bg-opacity: 1;background-color:rgb(235 242 255 / var(--tw-bg-opacity, 1));--tw-text-opacity: 1;color:rgb(0 45 128 / var(--tw-text-opacity, 1))}.c-aside--info:where(.astro-duqfclob):is([data-theme=dark] *){background-color:#002d8066;--tw-text-opacity: 1;color:rgb(235 242 255 / var(--tw-text-opacity, 1))}.c-aside--warning:where(.astro-duqfclob){--tw-bg-opacity: 1;background-color:rgb(255 244 219 / var(--tw-bg-opacity, 1));--tw-text-opacity: 1;color:rgb(149 104 14 / var(--tw-text-opacity, 1))}.c-aside--warning:where(.astro-duqfclob):is([data-theme=dark] *){background-color:#95680e66;--tw-text-opacity: 1;color:rgb(255 244 219 / var(--tw-text-opacity, 1))}.c-aside--danger:where(.astro-duqfclob){--tw-bg-opacity: 1;background-color:rgb(255 235 235 / var(--tw-bg-opacity, 1));--tw-text-opacity: 1;color:rgb(128 0 0 / var(--tw-text-opacity, 1))}.c-aside--danger:where(.astro-duqfclob):is([data-theme=dark] *){background-color:#80000066;--tw-text-opacity: 1;color:rgb(255 235 235 / var(--tw-text-opacity, 1))}.c-aside--upgrade:where(.astro-duqfclob){--tw-bg-opacity: 1;background-color:rgb(244 229 255 / var(--tw-bg-opacity, 1));--tw-text-opacity: 1;color:rgb(144 61 209 / var(--tw-text-opacity, 1))}.c-aside--upgrade:where(.astro-duqfclob):is([data-theme=dark] *){background-color:#903dd166;--tw-text-opacity: 1;color:rgb(244 229 255 / var(--tw-text-opacity, 1))}.c-aside:where(.astro-duqfclob) code{border-radius:.25rem;padding:.2em .4em;font-size:.875rem;line-height:1.25rem}.c-aside--info:where(.astro-duqfclob) code{background-color:#002d800d;--tw-text-opacity: 1;color:rgb(0 45 128 / var(--tw-text-opacity, 1))}[data-theme=dark] .c-aside--info code{background-color:#002d8099;--tw-text-opacity: 1;color:rgb(255 255 255 / var(--tw-text-opacity, 1))}.c-aside--warning:where(.astro-duqfclob) code{background-color:#95680e0d;--tw-text-opacity: 1;color:rgb(149 104 14 / var(--tw-text-opacity, 1))}[data-theme=dark] .c-aside--warning code{background-color:#95680e66;--tw-text-opacity: 1;color:rgb(255 255 255 / var(--tw-text-opacity, 1))}.c-aside--danger:where(.astro-duqfclob) code{background-color:#8000000d;--tw-text-opacity: 1;color:rgb(128 0 0 / var(--tw-text-opacity, 1))}[data-theme=dark] .c-aside--danger code{background-color:#80000099;--tw-text-opacity: 1;color:rgb(255 255 255 / var(--tw-text-opacity, 1))}.c-aside--upgrade:where(.astro-duqfclob) code{background-color:#903dd10d;--tw-text-opacity: 1;color:rgb(144 61 209 / var(--tw-text-opacity, 1))}.c-aside--upgrade:where(.astro-duqfclob) code:is([data-theme=dark] *){--tw-bg-opacity: 1;background-color:rgb(244 229 255 / var(--tw-bg-opacity, 1))}[data-theme=dark] .c-aside--upgrade code{background-color:#903dd166;--tw-text-opacity: 1;color:rgb(255 255 255 / var(--tw-text-opacity, 1))} 143</style><style>.c-file-tree starlight-file-tree{border-radius:.5rem;border-style:none;--tw-bg-opacity: 1;background-color:rgb(245 245 245 / var(--tw-bg-opacity, 1))}[data-theme=dark] .c-file-tree starlight-file-tree{border-radius:.5rem;border-style:none;--tw-bg-opacity: 1;background-color:rgb(15 15 15 / var(--tw-bg-opacity, 1))}.c-file-tree starlight-file-tree .directory>details>summary:hover,.c-file-tree starlight-file-tree .directory>details>summary:hover svg{fill:#000;--tw-text-opacity: 1;color:rgb(0 0 0 / var(--tw-text-opacity, 1))}[data-theme=dark] .c-file-tree starlight-file-tree .directory>details>summary:hover,[data-theme=dark] .c-file-tree starlight-file-tree .directory>details>summary:hover svg{fill:#fff;--tw-text-opacity: 1;color:rgb(255 255 255 / var(--tw-text-opacity, 1))}.c-file-tree starlight-file-tree .tree-entry .highlight{--tw-bg-opacity: 1;background-color:rgb(15 15 15 / var(--tw-bg-opacity, 1))} 144</style><style>.c-sdk-selector:where(.astro-fz6kupvs){position:relative;display:block}.c-sdk-selector__grid:where(.astro-fz6kupvs){margin-top:1rem;display:flex;flex-wrap:wrap;gap:1rem}@media (min-width: 768px){.c-sdk-selector__grid:where(.astro-fz6kupvs){margin-top:3rem}}.c-sdk-selector__grid--fixed-height:where(.astro-fz6kupvs){max-height:175px;overflow-y:auto;overscroll-behavior-y:contain;padding-bottom:1.25rem;-webkit-mask:linear-gradient(0deg,transparent,white 25%);mask:linear-gradient(0deg,transparent,white 25%)}#tab-megamenu-sdk-tabs-all .focus:after{--tw-content: "test";content:var(--tw-content)}.c-sdk-selector__no-sdk:where(.astro-fz6kupvs){margin-top:3.5rem;display:flex;flex-direction:column;gap:1.5rem}.c-sdk-selector__no-sdk-btn-wrapper:where(.astro-fz6kupvs){display:flex;flex-direction:column;gap:1rem}@media (min-width: 768px){.c-sdk-selector__no-sdk-btn-wrapper:where(.astro-fz6kupvs){flex-direction:row}} 145</style><style>.c-tab:where(.astro-nblbwwxt)[role=tab]{position:relative;display:flex;max-width:100%;cursor:pointer;align-items:center;justify-content:center;overflow:hidden;border-width:0px;--tw-bg-opacity: 1;background-color:rgb(255 255 255 / var(--tw-bg-opacity, 1));padding-top:.75rem;padding-bottom:.75rem;padding-left:0;padding-right:0;text-align:start;font-size:.875rem;line-height:1.25rem;--tw-text-opacity: 1;color:rgb(15 15 15 / var(--tw-text-opacity, 1))}.c-tab:where(.astro-nblbwwxt)[role=tab]:is([data-theme=dark] *){background-color:transparent;--tw-text-opacity: 1;color:rgb(255 255 255 / var(--tw-text-opacity, 1))}@media (min-width: 768px){.c-tab:where(.astro-nblbwwxt)[role=tab]{font-size:1rem;line-height:1.5rem}}.c-tab:where(.astro-nblbwwxt)[role=tab]:not(:last-child){margin-right:1.5rem}.c-tab:where(.astro-nblbwwxt)[role=tab][aria-selected=true]{border-width:0px;font-weight:500}.c-tab:where(.astro-nblbwwxt)[role=tab][aria-selected=false]{font-weight:400;--tw-text-opacity: 1;color:rgb(99 99 99 / var(--tw-text-opacity, 1))}.c-tab:where(.astro-nblbwwxt)[role=tab][aria-selected=false]:is([data-theme=dark] *){--tw-text-opacity: 1;color:rgb(201 201 201 / var(--tw-text-opacity, 1))}.c-tab:where(.astro-nblbwwxt)[role=tab][aria-selected=true]:after{position:absolute;bottom:0;height:2px;width:100%;--tw-bg-opacity: 1;background-color:rgb(15 15 15 / var(--tw-bg-opacity, 1));--tw-content: "";content:var(--tw-content)}:root[data-theme=dark] .c-tab:where(.astro-nblbwwxt)[role=tab][aria-selected=true]:after{content:var(--tw-content);--tw-bg-opacity: 1;background-color:rgb(255 255 255 / var(--tw-bg-opacity, 1))}.c-tab:where(.astro-nblbwwxt)[role=tab] .focus:where(.astro-nblbwwxt):hover{--tw-text-opacity: 1;color:rgb(15 15 15 / var(--tw-text-opacity, 1))}.c-tab:where(.astro-nblbwwxt)[role=tab] .focus:where(.astro-nblbwwxt):hover:is([data-theme=dark] *){--tw-text-opacity: 1;color:rgb(255 255 255 / var(--tw-text-opacity, 1))} 146</style><style>.c-tab-content:where(.astro-dvcjir2h)[role=tabpanel]{width:100%}@media (min-width: 768px){.c-tab-content:where(.astro-dvcjir2h)[role=tabpanel]{margin-top:-1.5rem}}.c-tab-content:where(.astro-dvcjir2h)[role=tabpanel].is-hidden{display:none} 147</style><style>.c-tablist:where(.astro-632fd37m)[role=tablist]{position:relative;z-index:10;display:flex;width:100%;flex-wrap:wrap;--tw-border-opacity: 1;border-color:rgb(235 235 235 / var(--tw-border-opacity, 1))}@media (min-width: 640px){.c-tablist:where(.astro-632fd37m)[role=tablist]{flex-wrap:nowrap}}.c-tablist:where(.astro-632fd37m)[role=tablist].c-tablist--is-sticky{--position: sticky;top:var(--header-container-height);position:sticky;--tw-bg-opacity: 1;background-color:rgb(255 255 255 / var(--tw-bg-opacity, 1))}.c-tablist:where(.astro-632fd37m)[role=tablist].c-tablist--no-border{border-bottom-width:0px} 148</style></head> <body class="astro-bguv2lll"> <a href="#_top" class="astro-7q3lir66">Skip to content</a> <div class="page sl-flex bg-white dark:bg-black template-doc astro-jcdooet4"> <header class="header border-b-[1px] border-b-kinde-grey-50 bg-white/70 backdrop-blur-lg dark:border-b-kinde-grey-900 dark:bg-black/90 astro-jcdooet4"> <div class="header sl-flex border-none astro-asm5mr6a"> <div class="title-wrapper sl-flex astro-asm5mr6a"> <div class="flex"> <div class="flex items-end gap-3"> <a href="https://kinde.com" class="site-title sl-flex"> <svg width="65" height="21" aria-hidden="true" class="flex dark:hidden" data-icon="kinde-logo">
148 <symbol id="ai:local:kinde-logo" viewBox="0 0 423.335 137.71"><path fill="currentColor" d="m72.301 135.385-51.24-65.486v65.486H0V1.163h21.061v63.561L70.365 1.163h24.739L43.729 66.339l55.046 69.046zm32.144 0v-96.63h19.898v96.63zm9.949-111.806c-6.665 0-11.886-5.136-11.886-11.692C102.508 5.221 107.729 0 114.394 0s11.693 5.11 11.693 11.887c0 6.557-5.136 11.692-11.693 11.692m86.938 111.806V80.094c0-14.67-9.751-25.317-23.186-25.317-13.766 0-23.38 10.411-23.38 25.317v55.291h-19.898v-96.63h14.681l4.253 11.851h.693l.971-1.292c3.242-4.457 13.044-12.885 26.942-12.885 23.104 0 38.627 16.925 38.627 42.115v56.841zm71.57 2.325c-24.919 0-44.44-22.244-44.44-50.641s19.521-50.641 44.44-50.641c14.787 0 25.17 9.125 27.105 12.256a16 16 0 0 1 1.154 1.987h1.127V1.163h19.898v134.222h-14.678l-4.221-12.045h-.765l-.931 1.289c-2.501 3.394-13.14 13.081-28.689 13.081m2.326-82.934c-15.427 0-27.061 13.883-27.061 32.293s11.634 32.294 27.061 32.294 27.062-13.884 27.062-32.294-11.634-32.293-27.062-32.293m102.311 82.934c-26.875 0-47.928-22.244-47.928-50.641 0-27.924 21.414-50.641 47.734-50.641 25.789 0 45.991 21.308 45.991 48.51 0 3.575-.372 7.167-1.003 9.754h-72.965l.152.836c2.738 15.061 13.4 24.416 27.825 24.416 12.197 0 18.639-6.294 21.489-10.27h20.676c-5.871 14.09-21.923 28.035-41.971 28.035Zm-.194-83.516c-13.924 0-25.106 10.046-27.825 24.997l-.152.836h54.774l-.131-.821c-2.394-14.96-13.11-25.012-26.666-25.012"/></symbol><use href="#ai:local:kinde-logo"></use> </svg> <svg width="65" height="21" aria-hidden="true" class="hidden dark:flex" data-icon="kinde-logo-dark"> <symbol id="ai:local:kinde-logo-dark" viewBox="0 0 406.43 136.437"><path fill="currentColor" d="M94.796 134.326H72.344l-54.69-66.012v66.012H0V0h17.654v64.093L70.425 0h21.108L37.035 65.437l57.76 68.89Zm2.495-121.47c0-6.141 4.605-10.361 10.362-10.361 5.949 0 10.554 4.221 10.554 10.361 0 5.949-4.605 10.555-10.554 10.555-5.757 0-10.362-4.605-10.362-10.555m2.111 121.47V37.804h16.503v96.522zm27.44 0V37.804h12.281l3.646 12.089h.959c3.646-5.565 13.433-14.2 27.633-14.2 22.26 0 38.763 16.695 38.763 42.408v56.226h-16.695V78.678c0-16.887-10.362-27.441-24.562-27.441-14.968 0-25.522 10.555-25.522 27.441v55.649h-16.503Zm90.381-48.357c0-29.552 20.341-50.276 44.52-50.276 15.352 0 26.481 9.979 29.168 13.816h.959V0h16.503v134.326h-12.281l-3.646-12.089h-.959c-2.878 3.838-14.008 14.199-29.744 14.199-24.179 0-44.52-20.916-44.52-50.468Zm74.647 0c0-20.725-13.433-34.733-29.168-34.733-15.543 0-28.976 14.009-28.976 34.733 0 20.917 13.433 34.925 28.976 34.925 15.735 0 29.168-14.008 29.168-34.925m113.792 7.292h-73.304c2.495 17.463 14.008 28.017 29.936 28.017 11.514 0 18.998-5.181 23.795-12.856h17.079c-5.757 14.584-21.108 28.016-41.065 28.016-26.098 0-46.63-21.107-46.63-50.468 0-28.593 21.108-50.276 46.438-50.276s44.52 20.916 44.52 47.974c0 4.03-.192 7.292-.768 9.595Zm-73.495-13.625h58.144c-1.919-16.887-13.241-28.783-28.4-28.783-14.584 0-27.249 11.321-29.744 28.783"/></symbol><use href="#ai:local:kinde-logo-dark"></use> </svg> <span class="sr-only">Visit Kindeâs marketing website</span></a> <a href="/" class="mb-[-1px] font-medium leading-[1] text-black no-underline underline-offset-4 hover:underline dark:text-white"><span class="sr-only">Kinde</span> Docs</a> </div> </div> </div> <div class="flex flex-1 items-center justify-end astro-asm5mr6a"> <div class="sl-hidden md:sl-flex right-group justify-end astro-asm5mr6a"> <nav class="astro-asm5mr6a"> <ul class="flex list-none items-center divide-x dark:divide-kinde-grey-800 astro-asm5mr6a"> <li class="astro-asm5mr6a"> <a class="px-3 py-2 text-sm font-medium text-kinde-grey-900 no-underline hover:underline-offset-[6px] lg:px-6 lg:text-base dark:text-white astro-asm5mr6a" href="/developer-tools/about/our-sdks/">SDKs</a> </li> <li class="astro-asm5mr6a"> <a class="px-3 py-2 text-sm font-medium text-kinde-grey-900 no-underline hover:underline-offset-[6px] lg:px-6 lg:text-base dark:text-white astro-asm5mr6a" href="/kinde-apis/">APIs</a> </li> <li class="astro-asm5mr6a"> <a class="px-3 py-2 text-sm font-medium text-kinde-grey-900 no-underline hover:underline-offset-[6px] lg:px-6 lg:text-base dark:text-white astro-asm5mr6a" href="https://app.kinde.com/admin">Sign in</a> </li> <li class="astro-asm5mr6a"> <div class="sl-flex social-icons gap-1 border-r border-kinde-grey-100 pl-3 pr-2 lg:gap-4 lg:pl-6 dark:border-kinde-grey-800 astro-asm5mr6a"> <a href="https://github.com/kinde-oss" rel="me" class="sl-flex astro-byvskjtp" target="_blank"><span class="sr-only astro-byvskjtp">GitHub</span><svg aria-hidden="true" class="astro-byvskjtp astro-c6vsoqas" width="16" height="16" viewB
148ox="0 0 24 24" fill="currentColor" style="--sl-icon-size: 1em;"><path d="M12 .3a12 12 0 0 0-3.8 23.38c.6.12.83-.26.83-.57L9 21.07c-3.34.72-4.04-1.61-4.04-1.61-.55-1.39-1.34-1.76-1.34-1.76-1.08-.74.09-.73.09-.73 1.2.09 1.83 1.24 1.83 1.24 1.08 1.83 2.81 1.3 3.5 1 .1-.78.42-1.31.76-1.61-2.67-.3-5.47-1.33-5.47-5.93 0-1.31.47-2.38 1.24-3.22-.14-.3-.54-1.52.1-3.18 0 0 1-.32 3.3 1.23a11.5 11.5 0 0 1 6 0c2.28-1.55 3.29-1.23 3.29-1.23.64 1.66.24 2.88.12 3.18a4.65 4.65 0 0 1 1.23 3.22c0 4.61-2.8 5.63-5.48 5.92.42.36.81 1.1.81 2.22l-.01 3.29c0 .31.2.69.82.57A12 12 0 0 0 12 .3Z"/></svg> </a> </div> </li> </ul> </nav> </div> <div class="relative flex items-center justify-center px-3 astro-3oz44m6z"> <label class="sr-only astro-3oz44m6z" id="picker-label">Theme</label> <button type="button" id="picker" aria-haspopup="listbox" aria-expanded="false" aria-labelledby="picker-label" aria-controls="theme-list" class="flex cursor-pointer items-center bg-transparent hover:opacity-75 astro-3oz44m6z"> <svg width="24" height="24" class="text-kinde-grey-900 dark:hidden dark:text-white astro-3oz44m6z" data-icon="sun"> <symbol id="ai:local:sun" viewBox="0 0 24 24"><g fill="none" stroke="currentColor" stroke-linecap="round" stroke-linejoin="round" stroke-width="2"><path stroke="none" d="M0 0h24v24H0z"/><circle cx="12" cy="12" r="4"/><path d="M3 12h1m8-9v1m8 8h1m-9 8v1M5.6 5.6l.7.7m12.1-.7-.7.7m0 11.4.7.7m-12.1-.7-.7.7"/></g></symbol><use href="#ai:local:sun"></use> </svg> <svg width="24" height="24" class="hidden text-kinde-grey-900 dark:inline dark:text-white astro-3oz44m6z" data-icon="moon"> <symbol id="ai:local:moon" viewBox="0 0 24 24"><path fill="currentColor" d="m17.75 4.09-2.53 1.94.91 3.06-2.63-1.81-2.63 1.81.91-3.06-2.53-1.94L12.44 4l1.06-3 1.06 3zm3.5 6.91-1.64 1.25.59 1.98-1.7-1.17-1.7 1.17.59-1.98L15.75 11l2.06-.05L18.5 9l.69 1.95zm-2.28 4.95c.83-.08 1.72 1.1 1.19 1.85-.32.45-.66.87-1.08 1.27C15.17 23 8.84 23 4.94 19.07c-3.91-3.9-3.91-10.24 0-14.14.4-.4.82-.76 1.27-1.08.75-.53 1.93.36 1.85 1.19-.27 2.86.69 5.83 2.89 8.02a9.96 9.96 0 0 0 8.02 2.89m-1.64 2.02a12.08 12.08 0 0 1-7.8-3.47c-2.17-2.19-3.33-5-3.49-7.82-2.81 3.14-2.7 7.96.31 10.98 3.02 3.01 7.84 3.12 10.98.31"/></symbol><use href="#ai:local:moon"></use> </svg> </button> <ul class="dark:highlight-white/5 absolute top-full z-50 mt-6 hidden w-36 list-none overflow-hidden rounded-lg border-[1px] bg-white p-3 text-sm font-medium text-black ring-1 ring-kinde-grey-900/10 lg:left-0 dark:border-kinde-grey-800 dark:bg-kinde-grey-900 dark:text-white dark:ring-0 dark:ring-kinde-grey-100 astro-3oz44m6z" aria-labelledby="picker" aria-orientation="vertical" id="theme-list" role="menu" tabindex="-1"> <li id="light-theme" role="menuitem" data-theme-option="light" class="astro-3oz44m6z"> <button class="flex w-full cursor-pointer rounded-md bg-transparent px-3 py-2 hover:bg-kinde-grey-50 dark:bg-kinde-grey-900 dark:hover:bg-black astro-3oz44m6z" type="button">Light</button> </li><li id="dark-theme" role="menuitem" data-theme-option="dark" class="astro-3oz44m6z"> <button class="flex w-full cursor-pointer rounded-md bg-transparent px-3 py-2 hover:bg-kinde-grey-50 dark:bg-kinde-grey-900 dark:hover:bg-black astro-3oz44m6z" type="button">Dark</button> </li><li id="system-theme" role="menuitem" data-theme-option="system" class="group astro-3oz44m6z"> <button class="flex w-full cursor-pointer rounded-md bg-transparent px-3 py-2 hover:bg-kinde-grey-50 dark:bg-kinde-grey-900 dark:hover:bg-black astro-3oz44m6z" type="button">System</button> </li> </ul> </div>
148<script> 149 const picker = document.querySelector("#picker"); 150 const themeList = document.querySelector("#theme-list"); 151 const themeOptions = document.querySelectorAll("[data-theme-option]"); 152 153 function closePicker() { 154 themeList.classList.add("hidden"); 155 picker.setAttribute("aria-expanded", "false"); 156 } 157 158 function setThemeColor(color) { 159 // Select the theme-color meta tag 160 let metaThemeColor = document.querySelector('meta[name="theme-color"]'); 161 162 // If it doesn't exist, create it 163 if (!metaThemeColor) { 164 metaThemeColor = document.createElement('meta'); 165 metaThemeColor.name = "theme-color"; 166 document.head.appendChild(metaThemeColor); 167 } 168 169 // Update the content attribute to the desired color 170 metaThemeColor.setAttribute('content', color); 171} 172 173 function applyTheme(theme) { 174 document.body.classList.remove("dark-mode"); 175 document.body.classList.remove("light-mode"); 176 document.documentElement.setAttribute("data-theme", theme); 177 localStorage.setItem("theme", theme); 178 theme === "dark" ? localStorage.setItem("isDark", true) : localStorage.setItem("isDark", false); 179 180 if (theme === "light") { 181 document.documentElement.setAttribute("data-theme", "light"); 182 document.body.classList.add("light-mode"); 183 setThemeColor('#ffffff'); 184 } else if (theme === "dark") { 185 document.documentElement.setAttribute("data-theme", "dark"); 186 document.body.classList.add("dark-mode"); 187 setThemeColor('#000000'); 188 } else { 189 systemThemeUpdate(); 190 } 191 192 themeList.setAttribute("aria-activedescendant", `theme-${theme}`); 193 194 themeOptions.forEach((option) => { 195 if (option.dataset.themeOption === theme) { 196 option.setAttribute("aria-selected", "true"); 197 } else { 198 option.setAttribute("aria-selected", "false"); 199 } 200 }); 201 202 themeList.classList.add("hidden"); 203 picker.setAttribute("aria-expanded", "false"); 204 } 205 206 function systemThemeUpdate() { 207 const systemTheme = window.matchMedia("(prefers-color-scheme: dark)").matches 208 ? "dark" 209 : "light"; 210 211 document.body.classList.remove("light-mode"); 212 document.body.classList.remove("dark-mode"); 213 214 if (systemTheme === "dark") { 215 document.documentElement.setAttribute("data-theme", "dark"); 216 217 document.body.classList.add("dark-mode"); 218 setThemeColor('#000000'); 219 localStorage.setItem("isDark", true); 220 } else { 221 document.documentElement.setAttribute("data-theme", "light"); 222 223 document.body.classList.add("light-mode"); 224 setThemeColor('#ffffff'); 225 localStorage.removeItem("isDark"); 226 } 227 } 228 229 document.getElementById("light-theme").addEventListener("click", () => applyTheme("light")); 230 document.getElementById("dark-theme").addEventListener("click", () => applyTheme("dark")); 231 document.getElementById("system-theme").addEventListener("click", () => applyTheme("system")); 232 233 // Apply the saved or system theme on load 234 const savedTheme = localStorage.getItem("theme") || "system"; 235 applyTheme(savedTheme); 236 237 // Listen for system theme changes 238 window.matchMedia("(prefers-color-scheme: dark)").addEventListener("change", systemThemeUpdate); 239 240 picker.addEventListener("click", (e) => { 241 if (picker.getAttribute("aria-expanded") === "false") { 242 picker.setAttribute("aria-expanded", "true"); 243 } else { 244 picker.setAttribute("aria-expanded", "false"); 245 } 246 themeList.classList.toggle("hidden"); 247 }); 248 249 themeList.addEventListener("blur", () => { 250 closePicker(); 251 }); 252</script>
252 <!-- <ThemePicker /> --> </div> <div class="w-12 lg:w-[164px] xl:w-[236px] astro-asm5mr6a"> <button class="flex w-full items-center justify-start gap-2 rounded-lg border-kinde-grey-100 bg-transparent p-3 hover:cursor-pointer lg:border-[1px]" kui-trigger="search" aria-label="Search docs"> <svg width="20" height="20" class="stroke-2 lg:stroke-1" data-icon="search"> <symbol id="ai:local:search" viewBox="0 0 20 20"><path fill="none" stroke="currentColor" stroke-linecap="round" stroke-linejoin="round" d="m14.386 14.386 4.088 4.088zA7.533 7.533 0 1 1 3.733 3.733a7.533 7.533 0 0 1 10.653 10.653" class="text-kinde-grey-700 dark:text-white"/></symbol><use href="#ai:local:search"></use> </svg> <span class="hidden leading-[1] text-kinde-grey-700 lg:block dark:text-white">Search docs</span> </button> </div> </div> </header> <nav class="sidebar astro-jcdooet4" aria-label="Main"> <starlight-menu-button class="astro-jif73yzw"> <button aria-expanded="false" aria-label="Menu" aria-controls="starlight__sidebar" class="sl-flex md:sl-hidden astro-jif73yzw"> <svg aria-hidden="true" class="astro-jif73yzw astro-c6vsoqas" width="16" height="16" viewBox="0 0 24 24" fill="currentColor" style="--sl-icon-size: 1em;"><path d="M3 8h18a1 1 0 1 0 0-2H3a1 1 0 0 0 0 2Zm18 8H3a1 1 0 0 0 0 2h18a1 1 0 0 0 0-2Zm0-5H3a1 1 0 0 0 0 2h18a1 1 0 0 0 0-2Z"/></svg> </button> </starlight-menu-button>
252<script type="module">class s extends HTMLElement{constructor(){super(),this.btn=this.querySelector("button"),this.btn.addEventListener("click",()=>this.toggleExpanded());const t=this.closest("nav");t&&t.addEventListener("keyup",e=>this.closeOnEscape(e))}setExpanded(t){this.setAttribute("aria-expanded",String(t)),document.body.toggleAttribute("data-mobile-menu-expanded",t)}toggleExpanded(){this.setExpanded(this.getAttribute("aria-expanded")!=="true")}closeOnEscape(t){t.code==="Escape"&&(this.setExpanded(!1),this.btn.focus())}}customElements.define("starlight-menu-button",s);</script>
252 <div id="starlight__sidebar" class="sidebar-pane astro-jcdooet4"> <div class="sidebar-content sl-flex astro-jcdooet4"> <sl-sidebar-state-persist data-hash="1o5ovwf" class="astro-kku4brbg">
252<script aria-hidden="true"> 253 (() => { 254 try { 255 if (!matchMedia('(min-width: 50em)').matches) return; 256 /** @type {HTMLElement | null} */ 257 const target = document.querySelector('sl-sidebar-state-persist'); 258 const state = JSON.parse(sessionStorage.getItem('sl-sidebar-state') || '0'); 259 if (!target || !state || target.dataset.hash !== state.hash) return; 260 window._starlightScrollRestore = state.scroll; 261 customElements.define( 262 'sl-sidebar-restore', 263 class SidebarRestore extends HTMLElement { 264 connectedCallback() { 265 try { 266 const idx = parseInt(this.dataset.index || ''); 267 const details = this.closest('details'); 268 if (details && typeof state.open[idx] === 'boolean') details.open = state.open[idx]; 269 } catch {} 270 } 271 } 272 ); 273 } catch {} 274 })(); 275 </script>
275 <ul class="top-level astro-3ii7xxms"> <li class="astro-3ii7xxms"> <details class="astro-3ii7xxms"> <sl-sidebar-restore data-index="0"></sl-sidebar-restore> <summary class="astro-3ii7xxms"> <div class="group-label astro-3ii7xxms"> <span class="large astro-3ii7xxms">Get started</span> </div> <svg aria-hidden="true" class="caret astro-3ii7xxms astro-c6vsoqas" width="16" height="16" viewBox="0 0 24 24" fill="currentColor" style="--sl-icon-size: 1.25rem;"><path d="m14.83 11.29-4.24-4.24a1 1 0 1 0-1.42 1.41L12.71 12l-3.54 3.54a1 1 0 0 0 0 1.41 1 1 0 0 0 .71.29 1 1 0 0 0 .71-.29l4.24-4.24a1.002 1.002 0 0 0 0-1.42Z"/></svg> </summary> <ul class="astro-3ii7xxms"> <li class="astro-3ii7xxms"> <details open class="astro-3ii7xxms"> <sl-sidebar-restore data-index="1"></sl-sidebar-restore> <summary class="astro-3ii7xxms"> <div class="group-label astro-3ii7xxms"> <span class="large astro-3ii7xxms">Guides</span> </div> <svg aria-hidden="true" class="caret astro-3ii7xxms astro-c6vsoqas" width="16" height="16" viewBox="0 0 24 24" fill="currentColor" style="--sl-icon-size: 1.25rem;"><path d="m14.83 11.29-4.24-4.24a1 1 0 1 0-1.42 1.41L12.71 12l-3.54 3.54a1 1 0 0 0 0 1.41 1 1 0 0 0 .71.29 1 1 0 0 0 .71-.29l4.24-4.24a1.002 1.002 0 0 0 0-1.42Z"/></svg> </summary> <ul class="astro-3ii7xxms"> <li class="astro-3ii7xxms"> <a href="/get-started/guides/first-things-first/" aria-current="false" class="astro-3ii7xxms"> <span class="astro-3ii7xxms">First things first</span> </a> </li><li class="astro-3ii7xxms"> <a href="/get-started/guides/byo-code/" aria-current="false" class="astro-3ii7xxms"> <span class="astro-3ii7xxms">Add Kinde to your codebase</span> </a> </li><li class="astro-3ii7xxms"> <a href="/get-started/guides/set-up-tasks/" aria-current="false" class="astro-3ii7xxms"> <span class="astro-3ii7xxms">Common setup tasks</span> </a> </li><li class="astro-3ii7xxms"> <a href="/get-started/guides/error-codes/" aria-current="false" class="astro-3ii7xxms"> <span class="astro-3ii7xxms">Common errors and codes</span> </a> </li> </ul> </details> </li><li class="astro-3ii7xxms"> <details open class="astro-3ii7xxms"> <sl-sidebar-restore data-index="2"></sl-sidebar-restore> <summary class="astro-3ii7xxms"> <div class="group-label astro-3ii7xxms"> <span class="large astro-3ii7xxms">Learn about Kinde</span> </div> <svg aria-hidden="true" class="caret astro-3ii7xxms astro-c6vsoqas" width="16" height="16" viewBox="0 0 24 24" fill="currentColor" style="--sl-icon-size: 1.25rem;"><path d="m14.83 11.29-4.24-4.24a1 1 0 1 0-1.42 1.41L12.71 12l-3.54 3.54a1 1 0 0 0 0 1.41 1 1 0 0 0 .71.29 1 1 0 0 0 .71-.29l4.24-4.24a1.002 1.002 0 0 0 0-1.42Z"/></svg> </summary> <ul class="astro-3ii7xxms"> <li class="astro-3ii7xxms"> <a href="/get-started/learn-about-kinde/what-does-kinde-do/" aria-current="false" class="astro-3ii7xxms"> <span class="astro-3ii7xxms">What does Kinde do?</span> </a> </li><li class="astro-3ii7xxms"> <a href="/get-started/learn-about-kinde/supported-data-regions/" aria-current="false" class="astro-3ii7xxms"> <span class="astro-3ii7xxms">Supported data regions</span> </a> </li><li class="astro-3ii7xxms"> <a href="/get-started/learn-about-kinde/kinde-product-security/" aria-current="false" class="astro-3ii7xxms"> <span class="astro-3ii7xxms">Kinde product security information</span> </a> </li><li class="astro-3ii7xxms"> <a href="/get-started/learn-about-kinde/kinde-supported-browsers/" aria-current="false" class="astro-3ii7xxms"> <span class="astro-3ii7xxms">Supported browsers</span> </a> </li> </ul> </details> </li><li class="astro-3ii7xxms"> <details open class="astro-3ii7xxms"> <sl-sidebar-restore data-index="3"></sl-sidebar-restore> <summary class="astro-3ii7xxms"> <div class="group-label astro-3ii7xxms"> <span class="large astro-3ii7xxms">Switch to Kinde</span> </div> <svg aria-hidden="true" class="caret astro-3ii7xxms astro-c6vsoqas" width="16" height="16" viewBox="0 0 24 24" fill="currentColor" style="--sl-icon-size: 1.25rem;"><path d="m14.83 11.29-4.24-4.24a1 1 0 1 0-1.42 1.41L12.71 12l-3.54 3.54a1 1 0 0 0 0 1.41 1 1 0 0 0 .71.29 1 1 0 0 0 .71-.29l4.24-4.24a1.002 1.002 0 0 0 0-1.42Z"/></svg> </summary> <ul class="astro-3ii7xxms"> <li class="astro-3ii7xxms"> <a href="/get-started/switch-to-kinde/switch-to-kinde-for-user-authentication/" aria-current="false" class="astro-3ii7xxms"> <span class="astro-3ii7xxms">Migration overview</span> </a> </li><li class="astro-3ii7xxms"> <a href="/get-started/switch-to-kinde/auth0-to-kinde/" aria-current="false" class="astro-3ii7xxms"> <span class="astro-3ii7xxms">Auth0</span> </a> </li><li class="astro-3ii7xxms"> <a href="/get-started/switch-to-kinde/fusionauth-to-kinde/" aria-current="false" class="astro-3ii7xxms"> <span class="astro-3ii7xxms">FusionAuth</span> </a> </li><li class="astro-3ii7xxms"> <a href="/get-started/switch-to-kinde/clerk-to-kinde/" aria-current="false" class="astro-3ii7xxms"> <span class="astro-3ii7xxms">Clerk</span> </a> </li><li class="astro-3ii7xxms"> <a href="/get-started/switch-to-kinde/supabase-to-kinde/" aria-current="false" class="astro-3ii7xxms"> <span class="astro-3ii7xxms">Supabase</span> </a> </li><li class="astro-3ii7xxms"> <a href="/get-started/switch-to-kinde/firebase-to-kinde/" aria-current="false" class="astro-3ii7xxms"> <span class="astro-3ii7xxms">Firebase</span> </a> </li><li class="astro-3ii7xxms"> <a href="/get-started/switch-to-kinde/aws-cognito-to-kinde/" aria-current="false" class="astro-3ii7xxms"> <span class="astro-3ii7xxms">AWS Cognito</span> </a> </li><li class="astro-3ii7xxms"> <a href="/get-started/switch-to-kinde/azure-b2c-to-kinde/" aria-current="false" class="astro-3ii7xxms"> <span class="astro-3ii7xxms">Azure B2C</span> </a> </li><li class="astro-3ii7xxms"> <a href="/get-started/switch-to-kinde/aspnet-identity-to-kinde/" aria-current="false" class="astro-3ii7xxms"> <span class="astro-3ii7xxms">ASP.NET Identity</span> </a> </li><li class="astro-3ii7xxms"> <a href="/get-started/switch-to-kinde/migrate-users-bulk-import/" aria-current="false" class="astro-3ii7xxms"> <span class="astro-3ii7xxms">
275Bulk import</span> </a> </li><li class="astro-3ii7xxms"> <a href="/get-started/switch-to-kinde/create-users-with-api/" aria-current="false" class="astro-3ii7xxms"> <span class="astro-3ii7xxms">Create users with API</span> </a> </li><li class="astro-3ii7xxms"> <a href="/get-started/switch-to-kinde/drip-feed-migration/" aria-current="false" class="astro-3ii7xxms"> <span class="astro-3ii7xxms">Drip-feed migration</span> </a> </li> </ul> </details> </li><li class="astro-3ii7xxms"> <details open class="astro-3ii7xxms"> <sl-sidebar-restore data-index="4"></sl-sidebar-restore> <summary class="astro-3ii7xxms"> <div class="group-label astro-3ii7xxms"> <span class="large astro-3ii7xxms">Connect</span> </div> <svg aria-hidden="true" class="caret astro-3ii7xxms astro-c6vsoqas" width="16" height="16" viewBox="0 0 24 24" fill="currentColor" style="--sl-icon-size: 1.25rem;"><path d="m14.83 11.29-4.24-4.24a1 1 0 1 0-1.42 1.41L12.71 12l-3.54 3.54a1 1 0 0 0 0 1.41 1 1 0 0 0 .71.29 1 1 0 0 0 .71-.29l4.24-4.24a1.002 1.002 0 0 0 0-1.42Z"/></svg> </summary> <ul class="astro-3ii7xxms"> <li class="astro-3ii7xxms"> <a href="/get-started/connect/getting-app-keys/" aria-current="false" class="astro-3ii7xxms"> <span class="astro-3ii7xxms">Get app keys</span> </a> </li><li class="astro-3ii7xxms"> <a href="/get-started/connect/callback-urls/" aria-current="false" class="astro-3ii7xxms"> <span class="astro-3ii7xxms">Set callback and redirect URLs</span> </a> </li><li class="astro-3ii7xxms"> <a href="/get-started/connect/customize-email-sender/" aria-current="false" class="astro-3ii7xxms"> <span class="astro-3ii7xxms">Customize email sender</span> </a> </li> </ul> </details> </li><li class="astro-3ii7xxms"> <details open class="astro-3ii7xxms"> <sl-sidebar-restore data-index="5"></sl-sidebar-restore> <summary class="astro-3ii7xxms"> <div class="group-label astro-3ii7xxms"> <span class="large astro-3ii7xxms">APIs and SDKs</span> </div> <svg aria-hidden="true" class="caret astro-3ii7xxms astro-c6vsoqas" width="16" height="16" viewBox="0 0 24 24" fill="currentColor" style="--sl-icon-size: 1.25rem;"><path d="m14.83 11.29-4.24-4.24a1 1 0 1 0-1.42 1.41L12.71 12l-3.54 3.54a1 1 0 0 0 0 1.41 1 1 0 0 0 .71.29 1 1 0 0 0 .71-.29l4.24-4.24a1.002 1.002 0 0 0 0-1.42Z"/></svg> </summary> <ul class="astro-3ii7xxms"> <li class="astro-3ii7xxms"> <a href="/get-started/apis-and-sdks/about-kinde-apis/" aria-current="false" class="astro-3ii7xxms"> <span class="astro-3ii7xxms">About Kinde APIs</span> </a> </li> </ul> </details> </li><li class="astro-3ii7xxms"> <details open class="astro-3ii7xxms"> <sl-sidebar-restore data-index="6"></sl-sidebar-restore> <summary class="astro-3ii7xxms"> <div class="group-label astro-3ii7xxms"> <span class="large astro-3ii7xxms">Team and account</span> </div> <svg aria-hidden="true" class="caret astro-3ii7xxms astro-c6vsoqas" width="16" height="16" viewBox="0 0 24 24" fill="currentColor" style="--sl-icon-size: 1.25rem;"><path d="m14.83 11.29-4.24-4.24a1 1 0 1 0-1.42 1.41L12.71 12l-3.54 3.54a1 1 0 0 0 0 1.41 1 1 0 0 0 .71.29 1 1 0 0 0 .71-.29l4.24-4.24a1.002 1.002 0 0 0 0-1.42Z"/></svg> </summary> <ul class="astro-3ii7xxms"> <li class="astro-3ii7xxms"> <a href="/get-started/team-and-account/add-team-members/" aria-current="false" class="astro-3ii7xxms"> <span class="astro-3ii7xxms">Add team members</span> </a> </li><li class="astro-3ii7xxms"> <a href="/get-started/team-and-account/team-member-roles/" aria-current="false" class="astro-3ii7xxms"> <span class="astro-3ii7xxms">Team member roles in Kinde</span> </a> </li><li class="astro-3ii7xxms"> <a href="/get-started/team-and-account/kinde-perk-code/" aria-current="false" class="astro-3ii7xxms"> <span class="astro-3ii7xxms">
275Claim credits with Kinde perk code</span> </a> </li><li class="astro-3ii7xxms"> <a href="/get-started/team-and-account/enterprise-access-to-kinde/" aria-current="false" class="astro-3ii7xxms"> <span class="astro-3ii7xxms">Access Kinde via an enterprise connection</span> </a> </li><li class="astro-3ii7xxms"> <a href="/get-started/team-and-account/mfa-for-kinde-access/" aria-current="false" class="astro-3ii7xxms"> <span class="astro-3ii7xxms">Add MFA for accessing Kinde</span> </a> </li><li class="astro-3ii7xxms"> <a href="/get-started/team-and-account/kinde-referral-program/" aria-current="false" class="astro-3ii7xxms"> <span class="astro-3ii7xxms">Get a referral code for sharing Kinde</span> </a> </li> </ul> </details> </li> </ul> </details> </li><li class="astro-3ii7xxms"> <details class="astro-3ii7xxms"> <sl-sidebar-restore data-index="7"></sl-sidebar-restore> <summary class="astro-3ii7xxms"> <div class="group-label astro-3ii7xxms"> <span class="large astro-3ii7xxms">Build on Kinde</span> </div> <svg aria-hidden="true" class="caret astro-3ii7xxms astro-c6vsoqas" width="16" height="16" viewBox="0 0 24 24" fill="currentColor" style="--sl-icon-size: 1.25rem;"><path d="m14.83 11.29-4.24-4.24a1 1 0 1 0-1.42 1.41L12.71 12l-3.54 3.54a1 1 0 0 0 0 1.41 1 1 0 0 0 .71.29 1 1 0 0 0 .71-.29l4.24-4.24a1.002 1.002 0 0 0 0-1.42Z"/></svg> </summary> <ul class="astro-3ii7xxms"> <li class="astro-3ii7xxms"> <details open class="astro-3ii7xxms"> <sl-sidebar-restore data-index="8"></sl-sidebar-restore> <summary class="astro-3ii7xxms"> <div class="group-label astro-3ii7xxms"> <span class="large astro-3ii7xxms">Set up options</span> </div> <svg aria-hidden="true" class="caret astro-3ii7xxms astro-c6vsoqas" width="16" height="16" viewBox="0 0 24 24" fill="currentColor" style="--sl-icon-size: 1.25rem;"><path d="m14.83 11.29-4.24-4.24a1 1 0 1 0-1.42 1.41L12.71 12l-3.54 3.54a1 1 0 0 0 0 1.41 1 1 0 0 0 .71.29 1 1 0 0 0 .71-.29l4.24-4.24a1.002 1.002 0 0 0 0-1.42Z"/></svg> </summary> <ul class="astro-3ii7xxms"> <li class="astro-3ii7xxms"> <a href="/build/set-up-options/kinde-business-model/" aria-current="false" class="astro-3ii7xxms"> <span class="astro-3ii7xxms">Kinde for different business models</span> </a> </li><li class="astro-3ii7xxms"> <a href="/build/set-up-options/run-multiple-businesses/" aria-current="false" class="astro-3ii7xxms"> <span class="astro-3ii7xxms">Run multiple businesses</span> </a> </li><li class="astro-3ii7xxms"> <a href="/build/set-up-options/attack-protection/" aria-current="false" class="astro-3ii7xxms"> <span class="astro-3ii7xxms">Configure attack protection</span> </a> </li><li class="astro-3ii7xxms"> <a href="/build/set-up-options/manage-access-requests/" aria-current="false" class="astro-3ii7xxms"> <span class="astro-3ii7xxms">Set up and manage user access requests</span> </a> </li><li class="astro-3ii7xxms"> <a href="/build/set-up-options/access-policies/" aria-current="false" class="astro-3ii7xxms"> <span class="astro-3ii7xxms">Set global access policies</span> </a> </li><li class="astro-3ii7xxms"> <a href="/build/set-up-options/sync-git-code/" aria-current="false" class="astro-3ii7xxms"> <span class="astro-3ii7xxms">Manage your code in Kinde</span> </a> </li> </ul> </details> </li><li class="astro-3ii7xxms"> <details open class="astro-3ii7xxms"> <sl-sidebar-restore data-index="9"></sl-sidebar-restore> <summary class="astro-3ii7xxms"> <div class="group-label astro-3ii7xxms"> <span class="large astro-3ii7xxms">Self-service portal</span> </div> <svg aria-hidden="true" class="caret astro-3ii7xxms astro-c6vsoqas" width="16" height="16" viewBox="0 0 24 24" fill="currentColor" style="--sl-icon-size: 1.25rem;"><path d="m14.83 11.29-4.24-4.24a1 1 0 1 0-1.42 1.41L12.71 12l-3.54 3.54a1 1 0 0 0 0 1.41 1 1 0 0 0 .71.29 1 1 0 0 0 .71-.29l4.24-4.24a1.002 1.002 0 0 0 0-1.42Z"/></svg> </summary> <ul class="astro-3ii7xxms"> <li class="astro-3ii7xxms"> <a href="/build/self-service-portal/about-self-service-portal/" aria-current="false" class="astro-3ii7xxms"> <span class="astro-3ii7xxms">Customer self-service portal</span> </a> </li><li class="astro-3ii7xxms"> <a href="/build/self-service-portal/self-serve-portal-for-orgs/" aria-current="false" class="astro-3ii7xxms"> <span class="astro-3ii7xxms">
275Enable self-serve portal for orgs</span> </a> </li><li class="astro-3ii7xxms"> <a href="/build/self-service-portal/self-serve-portal-for-users/" aria-current="false" class="astro-3ii7xxms"> <span class="astro-3ii7xxms">Enable self-service portal for users</span> </a> </li> </ul> </details> </li><li class="astro-3ii7xxms"> <details open class="astro-3ii7xxms"> <sl-sidebar-restore data-index="10"></sl-sidebar-restore> <summary class="astro-3ii7xxms"> <div class="group-label astro-3ii7xxms"> <span class="large astro-3ii7xxms">Environments</span> </div> <svg aria-hidden="true" class="caret astro-3ii7xxms astro-c6vsoqas" width="16" height="16" viewBox="0 0 24 24" fill="currentColor" style="--sl-icon-size: 1.25rem;"><path d="m14.83 11.29-4.24-4.24a1 1 0 1 0-1.42 1.41L12.71 12l-3.54 3.54a1 1 0 0 0 0 1.41 1 1 0 0 0 .71.29 1 1 0 0 0 .71-.29l4.24-4.24a1.002 1.002 0 0 0 0-1.42Z"/></svg> </summary> <ul class="astro-3ii7xxms"> <li class="astro-3ii7xxms"> <a href="/build/environments/environments/" aria-current="false" class="astro-3ii7xxms"> <span class="astro-3ii7xxms">Manage environments</span> </a> </li><li class="astro-3ii7xxms"> <a href="/build/environments/production-to-live/" aria-current="false" class="astro-3ii7xxms"> <span class="astro-3ii7xxms">Go live checklist</span> </a> </li> </ul> </details> </li><li class="astro-3ii7xxms"> <details open class="astro-3ii7xxms"> <sl-sidebar-restore data-index="11"></sl-sidebar-restore> <summary class="astro-3ii7xxms"> <div class="group-label astro-3ii7xxms"> <span class="large astro-3ii7xxms">Applications</span> </div> <svg aria-hidden="true" class="caret astro-3ii7xxms astro-c6vsoqas" width="16" height="16" viewBox="0 0 24 24" fill="currentColor" style="--sl-icon-size: 1.25rem;"><path d="m14.83 11.29-4.24-4.24a1 1 0 1 0-1.42 1.41L12.71 12l-3.54 3.54a1 1 0 0 0 0 1.41 1 1 0 0 0 .71.29 1 1 0 0 0 .71-.29l4.24-4.24a1.002 1.002 0 0 0 0-1.42Z"/></svg> </summary> <ul class="astro-3ii7xxms"> <li class="astro-3ii7xxms"> <a href="/build/applications/about-applications/" aria-current="false" class="astro-3ii7xxms"> <span class="astro-3ii7xxms">Applications in Kinde</span> </a> </li><li class="astro-3ii7xxms"> <a href="/build/applications/add-and-manage-applications/" aria-current="false" class="astro-3ii7xxms"> <span class="astro-3ii7xxms">Add and manage applications</span> </a> </li><li class="astro-3ii7xxms"> <a href="/build/applications/rotate-client-secret/" aria-current="false" class="astro-3ii7xxms"> <span class="astro-3ii7xxms">Rotate client secret</span> </a> </li><li class="astro-3ii7xxms"> <a href="/build/applications/authenticating-spa/" aria-current="false" class="astro-3ii7xxms"> <span class="astro-3ii7xxms">Authenticating single-page apps (SPAs) with Kinde</span> </a> </li><li class="astro-3ii7xxms"> <a href="/build/applications/default-login-routes/" aria-current="false" class="astro-3ii7xxms"> <span class="astro-3ii7xxms">Set a default login route for an application</span> </a> </li> </ul> </details> </li><li class="astro-3ii7xxms"> <details open class="astro-3ii7xxms"> <sl-sidebar-restore data-index="12"></sl-sidebar-restore> <summary class="astro-3ii7xxms"> <div class="group-label astro-3ii7xxms"> <span class="large astro-3ii7xxms">Organizations</span> </div> <svg aria-hidden="true" class="caret astro-3ii7xxms astro-c6vsoqas" width="16" height="16" viewBox="0 0 24 24" fill="currentColor" style="--sl-icon-size: 1.25rem;"><path d="m14.83 11.29-4.24-4.24a1 1 0 1 0-1.42 1.41L12.71 12l-3.54 3.54a1 1 0 0 0 0 1.41 1 1 0 0 0 .71.29 1 1 0 0 0 .71-.29l4.24-4.24a1.002 1.002 0 0 0 0-1.42Z"/></svg> </summary> <ul class="astro-3ii7xxms"> <li class="astro-3ii7xxms"> <a href="/build/organizations/multi-tenancy-using-organizations/" aria-current="false" class="astro-3ii7xxms"> <span class="astro-3ii7xxms">About organizations</span> </a> </li><li class="astro-3ii7xxms"> <a href="/build/organizations/orgs-for-developers/" aria-current="false" class="astro-3ii7xxms"> <span class="astro-3ii7xxms">Kinde organizations for developers</span> </a> </li><li class="astro-3ii7xxms"> <a href="/build/organizations/add-and-manage-organizations/" aria-current="false" class="astro-3ii7xxms"> <span class="astro-3ii7xxms">Add and manage organizations</span> </a> </li><li class="astro-3ii7xxms"> <a href="/build/organizations/import-organizations/" aria-current="false" class="astro-3ii7xxms"> <span class="astro-3ii7xxms">Import organizations</span> </a> </li><li class="astro-3ii7xxms"> <a href="/build/organizations/allow-user-signup-org/" aria-current="false" class="astro-3ii7xxms"> <span class="astro-3ii7xxms">Manage user sign up to organizations</span> </a> </li><li class="astro-3ii7xxms"> <a href="/build/organizations/allow-org-create-on-signup/" aria-current="false" class="astro-3ii7xxms"> <span class="astro-3ii7xxms">Allow organization creation on sign up</span> </a> </li><li class="astro-3ii7xxms"> <a href="/build/organizations/organization-access-policies/" aria-current="false" class="astro-3ii7xxms"> <span class="astro-3ii7xxms">Set access policies for an organization</span> </a> </li><li class="astro-3ii7xxms"> <a href="/build/organizations/organization-m2m-applications/" aria-current="false" class="astro-3ii7xxms"> <span class="astro-3ii7xxms">Give API access to an organization using M2M</span> </a> </li><li class="astro-3ii7xxms"> <a href="/build/organizations/delete-organization/" aria-current="false" class="astro-3ii7xxms"> <span class="astro-3ii7xxms">Delete an organization</span> </a> </li><li class="astro-3ii7xxms"> <a href="/build/organizations/email-sender-organization/" aria-current="false" class="astro-3ii7xxms"> <span class="astro-3ii7xxms">Customize email sender for an organization</span> </a> </li><li class="astro-3ii7xxms"> <a href="/build/organizations/self-serve-portal-per-org/" aria-current="false" class="astro-3ii7xxms"> <span class="astro-3ii7xxms">Customize the self-serve portal for an organization</span> </a> </li> </ul> </details> </li><li class="astro-3ii7xxms"> <details open class="astro-3ii7xxms"> <sl-sidebar-restore data-index="13"></sl-sidebar-restore> <summary class="astro-3ii7xxms"> <div class="group-label astro-3ii7xxms"> <span class="large astro-3ii7xxms">Tokens</span> </div> <svg aria-hidden="true" class="caret astro-3ii7xxms astro-c6vsoqas" width="16" height="16" viewB
275ox="0 0 24 24" fill="currentColor" style="--sl-icon-size: 1.25rem;"><path d="m14.83 11.29-4.24-4.24a1 1 0 1 0-1.42 1.41L12.71 12l-3.54 3.54a1 1 0 0 0 0 1.41 1 1 0 0 0 .71.29 1 1 0 0 0 .71-.29l4.24-4.24a1.002 1.002 0 0 0 0-1.42Z"/></svg> </summary> <ul class="astro-3ii7xxms"> <li class="astro-3ii7xxms"> <a href="/build/tokens/configure-tokens/" aria-current="false" class="astro-3ii7xxms"> <span class="astro-3ii7xxms">Configure token and session expiry</span> </a> </li><li class="astro-3ii7xxms"> <a href="/build/tokens/about-access-tokens/" aria-current="false" class="astro-3ii7xxms"> <span class="astro-3ii7xxms">Access tokens</span> </a> </li><li class="astro-3ii7xxms"> <a href="/build/tokens/about-id-tokens/" aria-current="false" class="astro-3ii7xxms"> <span class="astro-3ii7xxms">ID tokens</span> </a> </li><li class="astro-3ii7xxms"> <a href="/build/tokens/refresh-tokens/" aria-current="false" class="astro-3ii7xxms"> <span class="astro-3ii7xxms">Refresh tokens</span> </a> </li><li class="astro-3ii7xxms"> <a href="/build/tokens/token-customization/" aria-current="false" class="astro-3ii7xxms"> <span class="astro-3ii7xxms">Token customization</span> </a> </li><li class="astro-3ii7xxms"> <a href="/build/tokens/token-validation-errors/" aria-current="false" class="astro-3ii7xxms"> <span class="astro-3ii7xxms">OAuth 2.0 access token validation and error codes</span> </a> </li><li class="astro-3ii7xxms"> <a href="/build/tokens/oath-scopes/" aria-current="false" class="astro-3ii7xxms"> <span class="astro-3ii7xxms">Using OAuth scopes</span> </a> </li><li class="astro-3ii7xxms"> <a href="/build/tokens/verifying-json-web-tokens/" aria-current="false" class="astro-3ii7xxms"> <span class="astro-3ii7xxms">Verifying JSON Web Tokens</span> </a> </li><li class="astro-3ii7xxms"> <a href="/build/tokens/decode-jwts/" aria-current="false" class="astro-3ii7xxms"> <span class="astro-3ii7xxms">Decoding JSON Web Tokens</span> </a> </li> </ul> </details> </li><li class="astro-3ii7xxms"> <details open class="astro-3ii7xxms"> <sl-sidebar-restore data-index="14"></sl-sidebar-restore> <summary class="astro-3ii7xxms"> <div class="group-label astro-3ii7xxms"> <span class="large astro-3ii7xxms">Env variables</span> </div> <svg aria-hidden="true" class="caret astro-3ii7xxms astro-c6vsoqas" width="16" height="16" viewBox="0 0 24 24" fill="currentColor" style="--sl-icon-size: 1.25rem;"><path d="m14.83 11.29-4.24-4.24a1 1 0 1 0-1.42 1.41L12.71 12l-3.54 3.54a1 1 0 0 0 0 1.41 1 1 0 0 0 .71.29 1 1 0 0 0 .71-.29l4.24-4.24a1.002 1.002 0 0 0 0-1.42Z"/></svg> </summary> <ul class="astro-3ii7xxms"> <li class="astro-3ii7xxms"> <a href="/build/env-variables/store-environment-variables/" aria-current="false" class="astro-3ii7xxms"> <span class="astro-3ii7xxms">Store environment variables in Kinde</span> </a> </li><li class="astro-3ii7xxms"> <a href="/build/env-variables/add-manage-env-variables/" aria-current="false" class="astro-3ii7xxms"> <span class="astro-3ii7xxms">Add and update environment variables</span> </a> </li> </ul> </details> </li><li class="astro-3ii7xxms"> <details open class="astro-3ii7xxms"> <sl-sidebar-restore data-index="15"></sl-sidebar-restore> <summary class="astro-3ii7xxms"> <div class="group-label astro-3ii7xxms"> <span class="large astro-3ii7xxms">Domain management</span> </div> <svg aria-hidden="true" class="caret astro-3ii7xxms astro-c6vsoqas" width="16" height="16" viewBox="0 0 24 24" fill="currentColor" style="--sl-icon-size: 1.25rem;"><path d="m14.83 11.29-4.24-4.24a1 1 0 1 0-1.42 1.41L12.71 12l-3.54 3.54a1 1 0 0 0 0 1.41 1 1 0 0 0 .71.29 1 1 0 0 0 .71-.29l4.24-4.24a1.002 1.002 0 0 0 0-1.42Z"/></svg> </summary> <ul class="astro-3ii7xxms"> <li class="astro-3ii7xxms"> <a href="/build/domains/pointing-your-domain/" aria-current="false" class="astro-3ii7xxms"> <span class="astro-3ii7xxms">Use your own custom domain</span> </a> </li><li class="astro-3ii7xxms"> <a href="/build/domains/organization-custom-domain/" aria-current="false" class="astro-3ii7xxms"> <span class="astro-3ii7xxms">Add a custom domain for an organization</span> </a> </li><li class="astro-3ii7xxms"> <a href="/build/domains/subdomains-for-callbacks/" aria-current="false" class="astro-3ii7xxms"> <span class="astro-3ii7xxms">Org handles and dynamic callbacks for subdomains</span> </a> </li> </ul> </details> </li> </ul> </details> </li><li class="astro-3ii7xxms"> <details open class="astro-3ii7xxms"> <sl-sidebar-restore data-index="16"></sl-sidebar-restore> <summary class="astro-3ii7xxms"> <div class="group-label astro-3ii7xxms"> <span class="large astro-3ii7xxms">SDKs and APIs</span> </div> <svg aria-hidden="true" class="caret astro-3ii7xxms astro-c6vsoqas" width="16" height="16" viewB
275ox="0 0 24 24" fill="currentColor" style="--sl-icon-size: 1.25rem;"><path d="m14.83 11.29-4.24-4.24a1 1 0 1 0-1.42 1.41L12.71 12l-3.54 3.54a1 1 0 0 0 0 1.41 1 1 0 0 0 .71.29 1 1 0 0 0 .71-.29l4.24-4.24a1.002 1.002 0 0 0 0-1.42Z"/></svg> </summary> <ul class="astro-3ii7xxms"> <li class="astro-3ii7xxms"> <details open class="astro-3ii7xxms"> <sl-sidebar-restore data-index="17"></sl-sidebar-restore> <summary class="astro-3ii7xxms"> <div class="group-label astro-3ii7xxms"> <span class="large astro-3ii7xxms">Overview</span> </div> <svg aria-hidden="true" class="caret astro-3ii7xxms astro-c6vsoqas" width="16" height="16" viewBox="0 0 24 24" fill="currentColor" style="--sl-icon-size: 1.25rem;"><path d="m14.83 11.29-4.24-4.24a1 1 0 1 0-1.42 1.41L12.71 12l-3.54 3.54a1 1 0 0 0 0 1.41 1 1 0 0 0 .71.29 1 1 0 0 0 .71-.29l4.24-4.24a1.002 1.002 0 0 0 0-1.42Z"/></svg> </summary> <ul class="astro-3ii7xxms"> <li class="astro-3ii7xxms"> <a href="/developer-tools/about/our-sdks/" aria-current="false" class="astro-3ii7xxms"> <span class="astro-3ii7xxms">Kinde SDKs</span> </a> </li><li class="astro-3ii7xxms"> <a href="/developer-tools/about/using-kinde-without-an-sdk/" aria-current="page" class="astro-3ii7xxms"> <span class="astro-3ii7xxms">Use Kinde without an SDK</span> </a> </li> </ul> </details> </li><li class="astro-3ii7xxms"> <details open class="astro-3ii7xxms"> <sl-sidebar-restore data-index="18"></sl-sidebar-restore> <summary class="astro-3ii7xxms"> <div class="group-label astro-3ii7xxms"> <span class="large astro-3ii7xxms">Front end SDKs</span> </div> <svg aria-hidden="true" class="caret astro-3ii7xxms astro-c6vsoqas" width="16" height="16" viewBox="0 0 24 24" fill="currentColor" style="--sl-icon-size: 1.25rem;"><path d="m14.83 11.29-4.24-4.24a1 1 0 1 0-1.42 1.41L12.71 12l-3.54 3.54a1 1 0 0 0 0 1.41 1 1 0 0 0 .71.29 1 1 0 0 0 .71-.29l4.24-4.24a1.002 1.002 0 0 0 0-1.42Z"/></svg> </summary> <ul class="astro-3ii7xxms"> <li class="astro-3ii7xxms"> <a href="/developer-tools/sdks/frontend/javascript-sdk/" aria-current="false" class="astro-3ii7xxms"> <span class="astro-3ii7xxms">JavaScript SDK</span> </a> </li><li class="astro-3ii7xxms"> <a href="/developer-tools/sdks/frontend/react-sdk/" aria-current="false" class="astro-3ii7xxms"> <span class="astro-3ii7xxms">React SDK</span> </a> </li><li class="astro-3ii7xxms"> <a href="https://github.com/luukhaijes/kinde-angular" class="community-sdk astro-3ii7xxms" target="_blank" rel="noopener noreferrer" class="community-sdk"> <span class="astro-3ii7xxms">Angular</span> </a> </li> </ul> </details> </li><li class="astro-3ii7xxms"> <details open class="astro-3ii7xxms"> <sl-sidebar-restore data-index="19"></sl-sidebar-restore> <summary class="astro-3ii7xxms"> <div class="group-label astro-3ii7xxms"> <span class="large astro-3ii7xxms">Back end SDKs</span> </div> <svg aria-hidden="true" class="caret astro-3ii7xxms astro-c6vsoqas" width="16" height="16" viewBox="0 0 24 24" fill="currentColor" style="--sl-icon-size: 1.25rem;"><path d="m14.83 11.29-4.24-4.24a1 1 0 1 0-1.42 1.41L12.71 12l-3.54 3.54a1 1 0 0 0 0 1.41 1 1 0 0 0 .71.29 1 1 0 0 0 .71-.29l4.24-4.24a1.002 1.002 0 0 0 0-1.42Z"/></svg> </summary> <ul class="astro-3ii7xxms"> <li class="astro-3ii7xxms"> <a href="/developer-tools/sdks/backend/elixir-sdk/" aria-current="false" class="astro-3ii7xxms"> <span class="astro-3ii7xxms">Elixir SDK</span> </a> </li><li class="astro-3ii7xxms"> <a href="/developer-tools/sdks/backend/express-sdk/" aria-current="false" class="astro-3ii7xxms"> <span class="astro-3ii7xxms">Express.js SDK</span> </a> </li><li class="astro-3ii7xxms"> <a href="/developer-tools/sdks/backend/dotnet-sdk/" aria-current="false" class="astro-3ii7xxms"> <span class="astro-3ii7xxms">.NET SDK</span> </a> </li><li class="astro-3ii7xxms"> <a href="/developer-tools/sdks/backend/go-sdk/" aria-current="false" class="astro-3ii7xxms"> <span class="astro-3ii7xxms">Go SDK</span> </a> </li><li class="astro-3ii7xxms"> <a href="/developer-tools/sdks/backend/java-sdk/" aria-current="false" class="astro-3ii7xxms"> <span class="astro-3ii7xxms">Java SDK</span> </a> </li><li class="astro-3ii7xxms"> <a href="/developer-tools/sdks/backend/nextjs-sdk/" aria-current="false" class="astro-3ii7xxms"> <span class="astro-3ii7xxms">Next.js App Router SDK</span> </a> </li><li class="astro-3ii7xxms"> <a href="/developer-tools/sdks/backend/nextjs-prev-sdk/" aria-current="false" class="astro-3ii7xxms"> <span class="astro-3ii7xxms">Next.js Pages Router SDK</span> </a> </li><li class="astro-3ii7xxms"> <a href="/developer-tools/sdks/backend/tsr-sdk/" aria-current="false" class="astro-3ii7xxms"> <span class="astro-3ii7xxms">TanStack Start React SDK</span> </a> </li><li class="astro-3ii7xxms"> <a href="/developer-tools/sdks/backend/nuxt-module/" aria-current="false" class="astro-3ii7xxms"> <span class="astro-3ii7xxms">Nuxt module</span> </a> </li><li class="astro-3ii7xxms"> <a href="/developer-tools/sdks/backend/remix-sdk/" aria-current="false" class="astro-3ii7xxms"> <span class="astro-3ii7xxms">Remix SDK</span> </a> </li><li class="astro-3ii7xxms"> <a href="/developer-tools/sdks/backend/sveltekit-sdk/" aria-current="false" class="astro-3ii7xxms"> <span class="astro-3ii7xxms">SvelteKit SDK</span> </a> </li><li class="astro-3ii7xxms"> <a href="/developer-tools/sdks/backend/nodejs-sdk/" aria-current="false" class="astro-3ii7xxms"> <span class="astro-3ii7xxms">Node.js SDK</span> </a> </li><li class="astro-3ii7xxms"> <a href="/developer-tools/sdks/backend/typescript-sdk/" aria-current="false" class="astro-3ii7xxms"> <span class="astro-3ii7xxms">TypeScript SDK</span> </a> </li><li class="astro-3ii7xxms"> <a href="/developer-tools/sdks/backend/php-sdk/" aria-current="false" class="astro-3ii7xxms"> <span class="astro-3ii7xxms">PHP SDK</span> </a> </li><li class="astro-3ii7xxms"> <a href="/developer-tools/sdks/backend/python-sdk/" aria-current="false" class="astro-3ii7xxms"> <span class="astro-3ii7xxms">Python SDK</span> </a> </li><li class="astro-3ii7xxms"> <a href="/developer-tools/sdks/backend/ruby-sdk/" aria-current="false" class="astro-3ii7xxms"> <span class="astro-3ii7xxms">Ruby SDK</span> </a> </li><li class="astro-3ii7xxms"> <a href="/developer-tools/sdks/backend/apollo-graphql/" aria-current="false" class="astro-3ii7xxms"> <span class="astro-3ii7xxms">Node/Apollo GraphQL</span> </a> </li><li class="astro-3ii7xxms"> <a href="/developer-tools/sdks/backend/node-express-graphql/" aria-current="false" class="astro-3ii7xxms"> <span class="astro-3ii7xxms">Node/Express GraphQL</span> </a> </li> </ul> </details> </li><li class="astro-3ii7xxms"> <details open class="astro-3ii7xxms"> <sl-sidebar-restore data-index="20"></sl-sidebar-restore> <summary class="astro-3ii7xxms"> <div class="group-label astro-3ii7xxms"> <span class="large astro-3ii7xxms">Native app SDKs</span> </div> <svg aria-hidden="true" class="caret astro-3ii7xxms astro-c6vsoqas" width="16" height="16" viewB
275ox="0 0 24 24" fill="currentColor" style="--sl-icon-size: 1.25rem;"><path d="m14.83 11.29-4.24-4.24a1 1 0 1 0-1.42 1.41L12.71 12l-3.54 3.54a1 1 0 0 0 0 1.41 1 1 0 0 0 .71.29 1 1 0 0 0 .71-.29l4.24-4.24a1.002 1.002 0 0 0 0-1.42Z"/></svg> </summary> <ul class="astro-3ii7xxms"> <li class="astro-3ii7xxms"> <a href="/developer-tools/sdks/native/android-sdk/" aria-current="false" class="astro-3ii7xxms"> <span class="astro-3ii7xxms">Android SDK</span> </a> </li><li class="astro-3ii7xxms"> <a href="/developer-tools/sdks/native/ios-sdk/" aria-current="false" class="astro-3ii7xxms"> <span class="astro-3ii7xxms">iOS SDK</span> </a> </li><li class="astro-3ii7xxms"> <a href="/developer-tools/sdks/native/react-native-sdk/" aria-current="false" class="astro-3ii7xxms"> <span class="astro-3ii7xxms">React Native SDK</span> </a> </li><li class="astro-3ii7xxms"> <a href="/developer-tools/sdks/native/expo/" aria-current="false" class="astro-3ii7xxms"> <span class="astro-3ii7xxms">Expo</span> </a> </li><li class="astro-3ii7xxms"> <a href="/developer-tools/sdks/native/flutter-sdk/" aria-current="false" class="astro-3ii7xxms"> <span class="astro-3ii7xxms">Flutter SDK</span> </a> </li> </ul> </details> </li><li class="astro-3ii7xxms"> <details open class="astro-3ii7xxms"> <sl-sidebar-restore data-index="21"></sl-sidebar-restore> <summary class="astro-3ii7xxms"> <div class="group-label astro-3ii7xxms"> <span class="large astro-3ii7xxms">Kinde Management API</span> </div> <svg aria-hidden="true" class="caret astro-3ii7xxms astro-c6vsoqas" width="16" height="16" viewBox="0 0 24 24" fill="currentColor" style="--sl-icon-size: 1.25rem;"><path d="m14.83 11.29-4.24-4.24a1 1 0 1 0-1.42 1.41L12.71 12l-3.54 3.54a1 1 0 0 0 0 1.41 1 1 0 0 0 .71.29 1 1 0 0 0 .71-.29l4.24-4.24a1.002 1.002 0 0 0 0-1.42Z"/></svg> </summary> <ul class="astro-3ii7xxms"> <li class="astro-3ii7xxms"> <a href="/developer-tools/kinde-api/connect-to-kinde-api/" aria-current="false" class="astro-3ii7xxms"> <span class="astro-3ii7xxms">Quickstart</span> </a> </li><li class="astro-3ii7xxms"> <a href="/developer-tools/kinde-api/access-token-for-api/" aria-current="false" class="astro-3ii7xxms"> <span class="astro-3ii7xxms">Call the API - General Guide</span> </a> </li><li class="astro-3ii7xxms"> <a href="/developer-tools/kinde-api/call-the-api-postman/" aria-current="false" class="astro-3ii7xxms"> <span class="astro-3ii7xxms">Call the API - Postman</span> </a> </li><li class="astro-3ii7xxms"> <a href="/developer-tools/kinde-api/management-api-js/" aria-current="false" class="astro-3ii7xxms"> <span class="astro-3ii7xxms">Call the API - JavaScript Backends</span> </a> </li><li class="astro-3ii7xxms"> <a href="/developer-tools/kinde-api/search-users-via-api/" aria-current="false" class="astro-3ii7xxms"> <span class="astro-3ii7xxms">Guide - Advanced User Search</span> </a> </li><li class="astro-3ii7xxms"> <a href="/developer-tools/kinde-api/about-m2m-scopes/" aria-current="false" class="astro-3ii7xxms"> <span class="astro-3ii7xxms">API Scopes</span> </a> </li><li class="astro-3ii7xxms"> <a href="/developer-tools/kinde-api/api-rate-limits/" aria-current="false" class="astro-3ii7xxms"> <span class="astro-3ii7xxms">API Rate Limits</span> </a> </li><li class="astro-3ii7xxms"> <a href="/developer-tools/kinde-api/troubleshoot-kinde-api/" aria-current="false" class="astro-3ii7xxms"> <span class="astro-3ii7xxms">Troubleshooting</span> </a> </li> </ul> </details> </li><li class="astro-3ii7xxms"> <details open class="astro-3ii7xxms"> <sl-sidebar-restore data-index="22"></sl-sidebar-restore> <summary class="astro-3ii7xxms"> <div class="group-label astro-3ii7xxms"> <span class="large astro-3ii7xxms">Account API</span> </div> <svg aria-hidden="true" class="caret astro-3ii7xxms astro-c6vsoqas" width="16" height="16" viewBox="0 0 24 24" fill="currentColor" style="--sl-icon-size: 1.25rem;"><path d="m14.83 11.29-4.24-4.24a1 1 0 1 0-1.42 1.41L12.71 12l-3.54 3.54a1 1 0 0 0 0 1.41 1 1 0 0 0 .71.29 1 1 0 0 0 .71-.29l4.24-4.24a1.002 1.002 0 0 0 0-1.42Z"/></svg> </summary> <ul class="astro-3ii7xxms"> <li class="astro-3ii7xxms">
275 <a href="/developer-tools/account-api/about-account-api/" aria-current="false" class="astro-3ii7xxms"> <span class="astro-3ii7xxms">About Kinde's Account API</span> </a> </li> </ul> </details> </li><li class="astro-3ii7xxms"> <details open class="astro-3ii7xxms"> <sl-sidebar-restore data-index="23"></sl-sidebar-restore> <summary class="astro-3ii7xxms"> <div class="group-label astro-3ii7xxms"> <span class="large astro-3ii7xxms">Special guides</span> </div> <svg aria-hidden="true" class="caret astro-3ii7xxms astro-c6vsoqas" width="16" height="16" viewBox="0 0 24 24" fill="currentColor" style="--sl-icon-size: 1.25rem;"><path d="m14.83 11.29-4.24-4.24a1 1 0 1 0-1.42 1.41L12.71 12l-3.54 3.54a1 1 0 0 0 0 1.41 1 1 0 0 0 .71.29 1 1 0 0 0 .71-.29l4.24-4.24a1.002 1.002 0 0 0 0-1.42Z"/></svg> </summary> <ul class="astro-3ii7xxms"> <li class="astro-3ii7xxms"> <a href="/developer-tools/guides/dotnet-open-id-connect/" aria-current="false" class="astro-3ii7xxms"> <span class="astro-3ii7xxms">Integrate Kinde with ASP.NET using Open ID Connect</span> </a> </li><li class="astro-3ii7xxms"> <a href="/developer-tools/guides/deploy-on-vercel/" aria-current="false" class="astro-3ii7xxms"> <span class="astro-3ii7xxms">Deploy a Kinde app on Vercel</span> </a> </li><li class="astro-3ii7xxms"> <a href="/developer-tools/guides/deploy-on-netlify/" aria-current="false" class="astro-3ii7xxms"> <span class="astro-3ii7xxms">Deploy a Kinde app on Netlify</span> </a> </li><li class="astro-3ii7xxms"> <a href="/developer-tools/guides/deploy-on-cloudflare-workers/" aria-current="false" class="astro-3ii7xxms"> <span class="astro-3ii7xxms">Deploy a Kinde app on Cloudflare Workers</span> </a> </li><li class="astro-3ii7xxms"> <a href="/developer-tools/guides/kinde-and-electron/" aria-current="false" class="astro-3ii7xxms"> <span class="astro-3ii7xxms">Kinde in Electron desktop app</span> </a> </li><li class="astro-3ii7xxms"> <a href="/developer-tools/guides/protect-fastapi-routes-with-kinde/" aria-current="false" class="astro-3ii7xxms"> <span class="astro-3ii7xxms">Protect FastAPI routes with Kinde</span> </a> </li><li class="astro-3ii7xxms"> <a href="/developer-tools/guides/code-sync-errors/" aria-current="false" class="astro-3ii7xxms"> <span class="astro-3ii7xxms">Troubleshoot code sync errors</span> </a> </li><li class="astro-3ii7xxms"> <a href="/developer-tools/guides/manage-kinde-configuration/" aria-current="false" class="astro-3ii7xxms"> <span class="astro-3ii7xxms">Kinde config as code</span> </a> </li><li class="astro-3ii7xxms"> <a href="/developer-tools/guides/kinde-permissions-react-and-backend/" aria-current="false" class="astro-3ii7xxms"> <span class="astro-3ii7xxms">Use Kinde permissions in React and any backend</span> </a> </li><li class="astro-3ii7xxms"> <a href="/developer-tools/guides/terraform-provider/" aria-current="false" class="astro-3ii7xxms"> <span class="astro-3ii7xxms">Terraform provider</span> </a> </li> </ul> </details> </li> </ul> </details> </li><li class="astro-3ii7xxms"> <details class="astro-3ii7xxms"> <sl-sidebar-restore data-index="24"></sl-sidebar-restore> <summary class="astro-3ii7xxms"> <div class="group-label astro-3ii7xxms"> <span class="large astro-3ii7xxms">Manage your APIs</span> </div> <svg aria-hidden="true" class="caret astro-3ii7xxms astro-c6vsoqas" width="16" height="16" viewBox="0 0 24 24" fill="currentColor" style="--sl-icon-size: 1.25rem;"><path d="m14.83 11.29-4.24-4.24a1 1 0 1 0-1.42 1.41L12.71 12l-3.54 3.54a1 1 0 0 0 0 1.41 1 1 0 0 0 .71.29 1 1 0 0 0 .71-.29l4.24-4.24a1.002 1.002 0 0 0 0-1.42Z"/></svg> </summary> <ul class="astro-3ii7xxms"> <li class="astro-3ii7xxms"> <details open class="astro-3ii7xxms"> <sl-sidebar-restore data-index="25"></sl-sidebar-restore> <summary class="astro-3ii7xxms"> <div class="group-label astro-3ii7xxms"> <span class="large astro-3ii7xxms">Register and manage your APIs</span> </div> <svg aria-hidden="true" class="caret astro-3ii7xxms astro-c6vsoqas" width="16" height="16" viewBox="0 0 24 24" fill="currentColor" style="--sl-icon-size: 1.25rem;"><path d="m14.83 11.29-4.24-4.24a1 1 0 1 0-1.42 1.41L12.71 12l-3.54 3.54a1 1 0 0 0 0 1.41 1 1 0 0 0 .71.29 1 1 0 0 0 .71-.29l4.24-4.24a1.002 1.002 0 0 0 0-1.42Z"/></svg> </summary> <ul class="astro-3ii7xxms"> <li class="astro-3ii7xxms"> <a href="/developer-tools/your-apis/register-manage-apis/" aria-current="false" class="astro-3ii7xxms"> <span class="astro-3ii7xxms">Register and manage APIs</span> </a> </li><li class="astro-3ii7xxms"> <a href="/developer-tools/your-apis/test-token-from-kinde/" aria-current="false" class="astro-3ii7xxms"> <span class="astro-3ii7xxms">Get a M2M token to test your APIs</span> </a> </li><li class="astro-3ii7xxms"> <a href="/developer-tools/your-apis/test-your-api-user-token/" aria-current="false" class="astro-3ii7xxms"> <span class="astro-3ii7xxms">Get a user access token to test your APIs (Postman method)</span> </a> </li><li class="astro-3ii7xxms"> <a href="/developer-tools/your-apis/protect-your-api/" aria-current="false" class="astro-3ii7xxms"> <span class="astro-3ii7xxms">Protect your API</span> </a> </li><li class="astro-3ii7xxms"> <a href="/developer-tools/your-apis/custom-api-scopes/" aria-current="false" class="astro-3ii7xxms"> <span class="astro-3ii7xxms">Secure your API using scopes</span> </a> </li><li class="astro-3ii7xxms"> <a href="/developer-tools/your-apis/access-to-your-api/" aria-current="false" class="astro-3ii7xxms"> <span class="astro-3ii7xxms">Give others access to your API</span> </a> </li><li class="astro-3ii7xxms"> <a href="/developer-tools/your-apis/api-scopes-m2m-applications/" aria-current="false" class="astro-3ii7xxms"> <span class="astro-3ii7xxms">Manage API scopes for M2M applications</span> </a> </li><li class="astro-3ii7xxms"> <a href="/developer-tools/your-apis/user-api-scopes/" aria-current="false" class="astro-3ii7xxms"> <span class="astro-3ii7xxms">Manage API scopes for users</span> </a> </li><li class="astro-3ii7xxms"> <a href="/developer-tools/your-apis/test-your-api-m2m-token/" aria-current="false" class="astro-3ii7xxms"> <span class="astro-3ii7xxms">Get a M2M access token to test your APIs (Postman method)</span> </a> </li><li class="astro-3ii7xxms"> <a href="/developer-tools/your-apis/dotnet-based-apis/" aria-current="false" class="astro-3ii7xxms"> <span class="astro-3ii7xxms">Integrate Kinde auth into .NET-based APIs</span> </a> </li> </ul> </details> </li><li class="astro-3ii7xxms"> <details open class="astro-3ii7xxms"> <sl-sidebar-restore data-index="26"></sl-sidebar-restore> <summary class="astro-3ii7xxms"> <div class="group-label astro-3ii7xxms"> <span class="large astro-3ii7xxms">About API keys</span> </div> <svg aria-hidden="true" class="caret astro-3ii7xxms astro-c6vsoqas" width="16" height="16" viewB
275ox="0 0 24 24" fill="currentColor" style="--sl-icon-size: 1.25rem;"><path d="m14.83 11.29-4.24-4.24a1 1 0 1 0-1.42 1.41L12.71 12l-3.54 3.54a1 1 0 0 0 0 1.41 1 1 0 0 0 .71.29 1 1 0 0 0 .71-.29l4.24-4.24a1.002 1.002 0 0 0 0-1.42Z"/></svg> </summary> <ul class="astro-3ii7xxms"> <li class="astro-3ii7xxms"> <a href="/manage-your-apis/about-api-keys/api-keys-overview/" aria-current="false" class="astro-3ii7xxms"> <span class="astro-3ii7xxms">API keys overview</span> </a> </li><li class="astro-3ii7xxms"> <a href="/manage-your-apis/about-api-keys/api-keys-quick-start/" aria-current="false" class="astro-3ii7xxms"> <span class="astro-3ii7xxms">API keys quick start</span> </a> </li><li class="astro-3ii7xxms"> <a href="/manage-your-apis/about-api-keys/api-key-best-practice/" aria-current="false" class="astro-3ii7xxms"> <span class="astro-3ii7xxms">API key best practices</span> </a> </li><li class="astro-3ii7xxms"> <a href="/manage-your-apis/about-api-keys/api-keys-and-ai-apps/" aria-current="false" class="astro-3ii7xxms"> <span class="astro-3ii7xxms">Using API keys for AI products</span> </a> </li><li class="astro-3ii7xxms"> <a href="/manage-your-apis/about-api-keys/ai-app-best-practice/" aria-current="false" class="astro-3ii7xxms"> <span class="astro-3ii7xxms">API best practice for AI apps</span> </a> </li><li class="astro-3ii7xxms"> <a href="/manage-your-apis/about-api-keys/organization-api-keys/" aria-current="false" class="astro-3ii7xxms"> <span class="astro-3ii7xxms">Organization-level API keys</span> </a> </li><li class="astro-3ii7xxms"> <a href="/manage-your-apis/about-api-keys/user-api-keys/" aria-current="false" class="astro-3ii7xxms"> <span class="astro-3ii7xxms">User-level API keys</span> </a> </li> </ul> </details> </li><li class="astro-3ii7xxms"> <details open class="astro-3ii7xxms"> <sl-sidebar-restore data-index="27"></sl-sidebar-restore> <summary class="astro-3ii7xxms"> <div class="group-label astro-3ii7xxms"> <span class="large astro-3ii7xxms">Add and manage API keys</span> </div> <svg aria-hidden="true" class="caret astro-3ii7xxms astro-c6vsoqas" width="16" height="16" viewBox="0 0 24 24" fill="currentColor" style="--sl-icon-size: 1.25rem;"><path d="m14.83 11.29-4.24-4.24a1 1 0 1 0-1.42 1.41L12.71 12l-3.54 3.54a1 1 0 0 0 0 1.41 1 1 0 0 0 .71.29 1 1 0 0 0 .71-.29l4.24-4.24a1.002 1.002 0 0 0 0-1.42Z"/></svg> </summary> <ul class="astro-3ii7xxms"> <li class="astro-3ii7xxms"> <a href="/manage-your-apis/add-manage-api-keys/create-an-api-key/" aria-current="false" class="astro-3ii7xxms"> <span class="astro-3ii7xxms">Create an API key</span> </a> </li><li class="astro-3ii7xxms"> <a href="/manage-your-apis/add-manage-api-keys/scopes-for-api-keys/" aria-current="false" class="astro-3ii7xxms"> <span class="astro-3ii7xxms">Scopes for API keys</span> </a> </li><li class="astro-3ii7xxms"> <a href="/manage-your-apis/add-manage-api-keys/self-serve-api-keys/" aria-current="false" class="astro-3ii7xxms"> <span class="astro-3ii7xxms">Self-serve API keys</span> </a> </li><li class="astro-3ii7xxms"> <a href="/manage-your-apis/add-manage-api-keys/verify-api-keys-in-your-api/" aria-current="false" class="astro-3ii7xxms"> <span class="astro-3ii7xxms">Verify API keys in your API</span> </a> </li><li class="astro-3ii7xxms"> <a href="/manage-your-apis/add-manage-api-keys/rotate-api-keys/" aria-current="false" class="astro-3ii7xxms"> <span class="astro-3ii7xxms">Rotate API keys</span> </a> </li><li class="astro-3ii7xxms"> <a href="/manage-your-apis/add-manage-api-keys/revoke-api-keys/" aria-current="false" class="astro-3ii7xxms"> <span class="astro-3ii7xxms">Revoke API keys</span> </a> </li> </ul> </details> </li><li class="astro-3ii7xxms"> <details open class="astro-3ii7xxms"> <sl-sidebar-restore data-index="28"></sl-sidebar-restore> <summary class="astro-3ii7xxms"> <div class="group-label astro-3ii7xxms"> <span class="large astro-3ii7xxms">Test and troubleshoot</span> </div> <svg aria-hidden="true" class="caret astro-3ii7xxms astro-c6vsoqas" width="16" height="16" viewBox="0 0 24 24" fill="currentColor" style="--sl-icon-size: 1.25rem;"><path d="m14.83 11.29-4.24-4.24a1 1 0 1 0-1.42 1.41L12.71 12l-3.54 3.54a1 1 0 0 0 0 1.41 1 1 0 0 0 .71.29 1 1 0 0 0 .71-.29l4.24-4.24a1.002 1.002 0 0 0 0-1.42Z"/></svg> </summary> <ul class="astro-3ii7xxms"> <li class="astro-3ii7xxms"> <a href="/manage-your-apis/troubleshoot-api-keys/common-api-key-errors/" aria-current="false" class="astro-3ii7xxms"> <span class="astro-3ii7xxms">Troubleshoot API key errors</span> </a> </li> </ul> </details> </li> </ul> </details> </li><li class="astro-3ii7xxms"> <details class="astro-3ii7xxms"> <sl-sidebar-restore data-index="29"></sl-sidebar-restore> <summary class="astro-3ii7xxms"> <div class="group-label astro-3ii7xxms"> <span class="large astro-3ii7xxms">MCP Servers</span> </div> <svg aria-hidden="true" class="caret astro-3ii7xxms astro-c6vsoqas" width="16" height="16" viewB
275ox="0 0 24 24" fill="currentColor" style="--sl-icon-size: 1.25rem;"><path d="m14.83 11.29-4.24-4.24a1 1 0 1 0-1.42 1.41L12.71 12l-3.54 3.54a1 1 0 0 0 0 1.41 1 1 0 0 0 .71.29 1 1 0 0 0 .71-.29l4.24-4.24a1.002 1.002 0 0 0 0-1.42Z"/></svg> </summary> <ul class="astro-3ii7xxms"> <li class="astro-3ii7xxms"> <a href="/mcp-servers/" aria-current="false" class="astro-3ii7xxms"> <span class="astro-3ii7xxms">About MCP servers</span> </a> </li><li class="astro-3ii7xxms"> <a href="/mcp-servers/add-mcp-connection/" aria-current="false" class="astro-3ii7xxms"> <span class="astro-3ii7xxms">Add a new MCP connection</span> </a> </li><li class="astro-3ii7xxms"> <a href="/mcp-servers/manage-kinde-account-with-ai-agents/" aria-current="false" class="astro-3ii7xxms"> <span class="astro-3ii7xxms">Manage Kinde account with AI agents</span> </a> </li><li class="astro-3ii7xxms"> <a href="/mcp-servers/operations-and-scopes/" aria-current="false" class="astro-3ii7xxms"> <span class="astro-3ii7xxms">Operations and Scopes for Kinde MCP server</span> </a> </li> </ul> </details> </li><li class="astro-3ii7xxms"> <details class="astro-3ii7xxms"> <sl-sidebar-restore data-index="30"></sl-sidebar-restore> <summary class="astro-3ii7xxms"> <div class="group-label astro-3ii7xxms"> <span class="large astro-3ii7xxms">Auth and access</span> </div> <svg aria-hidden="true" class="caret astro-3ii7xxms astro-c6vsoqas" width="16" height="16" viewBox="0 0 24 24" fill="currentColor" style="--sl-icon-size: 1.25rem;"><path d="m14.83 11.29-4.24-4.24a1 1 0 1 0-1.42 1.41L12.71 12l-3.54 3.54a1 1 0 0 0 0 1.41 1 1 0 0 0 .71.29 1 1 0 0 0 .71-.29l4.24-4.24a1.002 1.002 0 0 0 0-1.42Z"/></svg> </summary> <ul class="astro-3ii7xxms"> <li class="astro-3ii7xxms"> <details open class="astro-3ii7xxms"> <sl-sidebar-restore data-index="31"></sl-sidebar-restore> <summary class="astro-3ii7xxms"> <div class="group-label astro-3ii7xxms"> <span class="large astro-3ii7xxms">About authentication</span> </div> <svg aria-hidden="true" class="caret astro-3ii7xxms astro-c6vsoqas" width="16" height="16" viewBox="0 0 24 24" fill="currentColor" style="--sl-icon-size: 1.25rem;"><path d="m14.83 11.29-4.24-4.24a1 1 0 1 0-1.42 1.41L12.71 12l-3.54 3.54a1 1 0 0 0 0 1.41 1 1 0 0 0 .71.29 1 1 0 0 0 .71-.29l4.24-4.24a1.002 1.002 0 0 0 0-1.42Z"/></svg> </summary> <ul class="astro-3ii7xxms"> <li class="astro-3ii7xxms"> <a href="/authenticate/about-auth/about-authentication/" aria-current="false" class="astro-3ii7xxms"> <span class="astro-3ii7xxms">About Kinde authentication</span> </a> </li><li class="astro-3ii7xxms"> <a href="/authenticate/about-auth/configure-authentication-flows/" aria-current="false" class="astro-3ii7xxms"> <span class="astro-3ii7xxms">Configure auth flows</span> </a> </li><li class="astro-3ii7xxms"> <a href="/authenticate/about-auth/authentication-methods/" aria-current="false" class="astro-3ii7xxms"> <span class="astro-3ii7xxms">Ways to authenticate</span> </a> </li><li class="astro-3ii7xxms"> <a href="/authenticate/about-auth/identity-and-verification/" aria-current="false" class="astro-3ii7xxms"> <span class="astro-3ii7xxms">User identity and verification</span> </a> </li><li class="astro-3ii7xxms"> <a href="/authenticate/about-auth/kinde-authentication-faq/" aria-current="false" class="astro-3ii7xxms"> <span class="astro-3ii7xxms">Top questions about Kinde authentication</span> </a> </li><li class="astro-3ii7xxms"> <a href="/authenticate/about-auth/user-communication/" aria-current="false" class="astro-3ii7xxms"> <span class="astro-3ii7xxms">User communication in Kinde</span> </a> </li><li class="astro-3ii7xxms"> <a href="/authenticate/about-auth/authentication-faq/" aria-current="false" class="astro-3ii7xxms"> <span class="astro-3ii7xxms">Top questions about authentication</span> </a> </li> </ul> </details> </li><li class="astro-3ii7xxms"> <details open class="astro-3ii7xxms"> <sl-sidebar-restore data-index="32"></sl-sidebar-restore> <summary class="astro-3ii7xxms"> <div class="group-label astro-3ii7xxms"> <span class="large astro-3ii7xxms">Authentication guides</span> </div> <svg aria-hidden="true" class="caret astro-3ii7xxms astro-c6vsoqas" width="16" height="16" viewB
275ox="0 0 24 24" fill="currentColor" style="--sl-icon-size: 1.25rem;"><path d="m14.83 11.29-4.24-4.24a1 1 0 1 0-1.42 1.41L12.71 12l-3.54 3.54a1 1 0 0 0 0 1.41 1 1 0 0 0 .71.29 1 1 0 0 0 .71-.29l4.24-4.24a1.002 1.002 0 0 0 0-1.42Z"/></svg> </summary> <ul class="astro-3ii7xxms"> <li class="astro-3ii7xxms"> <a href="/authenticate/auth-guides/mixed-b2b-b2c/" aria-current="false" class="astro-3ii7xxms"> <span class="astro-3ii7xxms">Mixed auth set up for B2B and B2C</span> </a> </li><li class="astro-3ii7xxms"> <a href="/authenticate/auth-guides/pass-params-idp/" aria-current="false" class="astro-3ii7xxms"> <span class="astro-3ii7xxms">Pass parameters to identity providers</span> </a> </li><li class="astro-3ii7xxms"> <a href="/authenticate/auth-guides/enterprise-connections-identity/" aria-current="false" class="astro-3ii7xxms"> <span class="astro-3ii7xxms">Guide to enterprise auth and user identities</span> </a> </li> </ul> </details> </li><li class="astro-3ii7xxms"> <details open class="astro-3ii7xxms"> <sl-sidebar-restore data-index="33"></sl-sidebar-restore> <summary class="astro-3ii7xxms"> <div class="group-label astro-3ii7xxms"> <span class="large astro-3ii7xxms">Authentication methods</span> </div> <svg aria-hidden="true" class="caret astro-3ii7xxms astro-c6vsoqas" width="16" height="16" viewBox="0 0 24 24" fill="currentColor" style="--sl-icon-size: 1.25rem;"><path d="m14.83 11.29-4.24-4.24a1 1 0 1 0-1.42 1.41L12.71 12l-3.54 3.54a1 1 0 0 0 0 1.41 1 1 0 0 0 .71.29 1 1 0 0 0 .71-.29l4.24-4.24a1.002 1.002 0 0 0 0-1.42Z"/></svg> </summary> <ul class="astro-3ii7xxms"> <li class="astro-3ii7xxms"> <a href="/authenticate/authentication-methods/set-up-user-authentication/" aria-current="false" class="astro-3ii7xxms"> <span class="astro-3ii7xxms">Set up auth methods</span> </a> </li><li class="astro-3ii7xxms"> <a href="/authenticate/authentication-methods/email-authentication/" aria-current="false" class="astro-3ii7xxms"> <span class="astro-3ii7xxms">Email authentication</span> </a> </li><li class="astro-3ii7xxms"> <a href="/authenticate/authentication-methods/password-authentication/" aria-current="false" class="astro-3ii7xxms"> <span class="astro-3ii7xxms">Password authentication</span> </a> </li><li class="astro-3ii7xxms"> <a href="/authenticate/authentication-methods/passwordless-authentication/" aria-current="false" class="astro-3ii7xxms"> <span class="astro-3ii7xxms">Passwordless authentication</span> </a> </li><li class="astro-3ii7xxms"> <a href="/authenticate/authentication-methods/username-authentication/" aria-current="false" class="astro-3ii7xxms"> <span class="astro-3ii7xxms">
275Username authentication</span> </a> </li><li class="astro-3ii7xxms"> <a href="/authenticate/authentication-methods/phone-authentication/" aria-current="false" class="astro-3ii7xxms"> <span class="astro-3ii7xxms">Phone authentication</span> </a> </li><li class="astro-3ii7xxms"> <a href="/authenticate/authentication-methods/whatsapp-authentication/" aria-current="false" class="astro-3ii7xxms"> <span class="astro-3ii7xxms">WhatsApp authentication</span> </a> </li><li class="astro-3ii7xxms"> <a href="/authenticate/authentication-methods/passkeys/" aria-current="false" class="astro-3ii7xxms"> <span class="astro-3ii7xxms">Passkeys</span> </a> </li><li class="astro-3ii7xxms"> <a href="/authenticate/authentication-methods/use-password-and-passwordless-auth/" aria-current="false" class="astro-3ii7xxms"> <span class="astro-3ii7xxms">Use both password and passwordless auth</span> </a> </li><li class="astro-3ii7xxms"> <a href="/authenticate/authentication-methods/email-deliverability/" aria-current="false" class="astro-3ii7xxms"> <span class="astro-3ii7xxms">Email deliverability in Kinde</span> </a> </li><li class="astro-3ii7xxms"> <a href="/authenticate/authentication-methods/sms-deliverability/" aria-current="false" class="astro-3ii7xxms"> <span class="astro-3ii7xxms">SMS deliverability in Kinde</span> </a> </li> </ul> </details> </li><li class="astro-3ii7xxms"> <details open class="astro-3ii7xxms"> <sl-sidebar-restore data-index="34"></sl-sidebar-restore> <summary class="astro-3ii7xxms"> <div class="group-label astro-3ii7xxms"> <span class="large astro-3ii7xxms">Manage authentication</span> </div> <svg aria-hidden="true" class="caret astro-3ii7xxms astro-c6vsoqas" width="16" height="16" viewBox="0 0 24 24" fill="currentColor" style="--sl-icon-size: 1.25rem;"><path d="m14.83 11.29-4.24-4.24a1 1 0 1 0-1.42 1.41L12.71 12l-3.54 3.54a1 1 0 0 0 0 1.41 1 1 0 0 0 .71.29 1 1 0 0 0 .71-.29l4.24-4.24a1.002 1.002 0 0 0 0-1.42Z"/></svg> </summary> <ul class="astro-3ii7xxms"> <li class="astro-3ii7xxms"> <a href="/authenticate/manage-authentication/user-auth-applications/" aria-current="false" class="astro-3ii7xxms"> <span class="astro-3ii7xxms">Authenticated sessions across multiple applications</span> </a> </li><li class="astro-3ii7xxms"> <a href="/authenticate/manage-authentication/manage-authentication-applications/" aria-current="false" class="astro-3ii7xxms"> <span class="astro-3ii7xxms">Change authentication for an application</span> </a> </li><li class="astro-3ii7xxms"> <a href="/authenticate/manage-authentication/organization-auth-experience/" aria-current="false" class="astro-3ii7xxms"> <span class="astro-3ii7xxms">Set custom authentication per organization</span> </a> </li><li class="astro-3ii7xxms"> <a href="/authenticate/manage-authentication/navigate-between-organizations/" aria-current="false" class="astro-3ii7xxms"> <span class="astro-3ii7xxms">Build a switch to navigate between organizations</span> </a> </li><li class="astro-3ii7xxms"> <a href="/authenticate/manage-authentication/sign-in-to-last-org/" aria-current="false" class="astro-3ii7xxms"> <span class="astro-3ii7xxms">Sign users in to last organization</span> </a> </li><li class="astro-3ii7xxms"> <a href="/authenticate/manage-authentication/sync-with-kinde/" aria-current="false" class="astro-3ii7xxms"> <span class="astro-3ii7xxms">Keep your product in sync with Kinde</span> </a> </li><li class="astro-3ii7xxms"> <a href="/authenticate/manage-authentication/session-management/" aria-current="false" class="astro-3ii7xxms"> <span class="astro-3ii7xxms">Session management</span> </a> </li><li class="astro-3ii7xxms"> <a href="/authenticate/manage-authentication/session-management-per-organization/" aria-current="false" class="astro-3ii7xxms"> <span class="astro-3ii7xxms">Session management per organization</span> </a> </li> </ul> </details> </li><li class="astro-3ii7xxms"> <details open class="astro-3ii7xxms"> <sl-sidebar-restore data-index="35"></sl-sidebar-restore> <summary class="astro-3ii7xxms"> <div class="group-label astro-3ii7xxms"> <span class="large astro-3ii7xxms">Custom configurations</span> </div> <svg aria-hidden="true" class="caret astro-3ii7xxms astro-c6vsoqas" width="16" height="16" viewB
275ox="0 0 24 24" fill="currentColor" style="--sl-icon-size: 1.25rem;"><path d="m14.83 11.29-4.24-4.24a1 1 0 1 0-1.42 1.41L12.71 12l-3.54 3.54a1 1 0 0 0 0 1.41 1 1 0 0 0 .71.29 1 1 0 0 0 .71-.29l4.24-4.24a1.002 1.002 0 0 0 0-1.42Z"/></svg> </summary> <ul class="astro-3ii7xxms"> <li class="astro-3ii7xxms"> <a href="/authenticate/custom-configurations/authentication-experience/" aria-current="false" class="astro-3ii7xxms"> <span class="astro-3ii7xxms">Manage the authentication experience</span> </a> </li><li class="astro-3ii7xxms"> <a href="/authenticate/custom-configurations/disable-sign-up/" aria-current="false" class="astro-3ii7xxms"> <span class="astro-3ii7xxms">Disable self-sign up</span> </a> </li><li class="astro-3ii7xxms"> <a href="/authenticate/custom-configurations/custom-authentication-pages/" aria-current="false" class="astro-3ii7xxms"> <span class="astro-3ii7xxms">Use custom sign-up and sign-in screens with Kinde</span> </a> </li><li class="astro-3ii7xxms"> <a href="/authenticate/custom-configurations/prepopulate-identity-sign-in/" aria-current="false" class="astro-3ii7xxms"> <span class="astro-3ii7xxms">Pre-populate user identity on sign in</span> </a> </li><li class="astro-3ii7xxms"> <a href="/authenticate/custom-configurations/invited-user-experience/" aria-current="false" class="astro-3ii7xxms"> <span class="astro-3ii7xxms">Invited user sign-up experience</span> </a> </li><li class="astro-3ii7xxms"> <a href="/authenticate/custom-configurations/advanced-organization/" aria-current="false" class="astro-3ii7xxms"> <span class="astro-3ii7xxms">Manage organization-level auth features</span> </a> </li><li class="astro-3ii7xxms"> <a href="/authenticate/custom-configurations/redirect-users/" aria-current="false" class="astro-3ii7xxms"> <span class="astro-3ii7xxms">Redirect users</span> </a> </li><li class="astro-3ii7xxms"> <a href="/authenticate/custom-configurations/static-ip/" aria-current="false" class="astro-3ii7xxms"> <span class="astro-3ii7xxms">Static IP</span> </a> </li><li class="astro-3ii7xxms"> <a href="/authenticate/custom-configurations/custom-oauth2-connection/" aria-current="false" class="astro-3ii7xxms"> <span class="astro-3ii7xxms">Custom OAuth 2.0 connections</span> </a> </li><li class="astro-3ii7xxms"> <a href="/authenticate/custom-configurations/proxy-your-kinde-auth-pages-through-cloudflare/" aria-current="false" class="astro-3ii7xxms"> <span class="astro-3ii7xxms">Proxy your Kinde auth pages through Cloudflare</span> </a> </li> </ul> </details> </li><li class="astro-3ii7xxms"> <details open class="astro-3ii7xxms"> <sl-sidebar-restore data-index="36"></sl-sidebar-restore> <summary class="astro-3ii7xxms"> <div class="group-label astro-3ii7xxms"> <span class="large astro-3ii7xxms">Enterprise connections</span> </div> <svg aria-hidden="true" class="caret astro-3ii7xxms astro-c6vsoqas" width="16" height="16" viewBox="0 0 24 24" fill="currentColor" style="--sl-icon-size: 1.25rem;"><path d="m14.83 11.29-4.24-4.24a1 1 0 1 0-1.42 1.41L12.71 12l-3.54 3.54a1 1 0 0 0 0 1.41 1 1 0 0 0 .71.29 1 1 0 0 0 .71-.29l4.24-4.24a1.002 1.002 0 0 0 0-1.42Z"/></svg> </summary> <ul class="astro-3ii7xxms"> <li class="astro-3ii7xxms"> <a href="/authenticate/enterprise-connections/about-enterprise-connections/" aria-current="false" class="astro-3ii7xxms"> <span class="astro-3ii7xxms">Manage enterprise connections</span> </a> </li><li class="astro-3ii7xxms"> <a href="/authenticate/enterprise-connections/provision-users-enterprise/" aria-current="false" class="astro-3ii7xxms"> <span class="astro-3ii7xxms">Provisioning users for enterprise connections</span> </a> </li><li class="astro-3ii7xxms"> <a href="/authenticate/enterprise-connections/enterprise-connections-b2b/" aria-current="false" class="astro-3ii7xxms"> <span class="astro-3ii7xxms">Enterprise connections for B2B</span> </a> </li><li class="astro-3ii7xxms"> <a href="/authenticate/enterprise-connections/home-realm-discovery/" aria-current="false" class="astro-3ii7xxms"> <span class="astro-3ii7xxms">Home realm or IdP discovery</span> </a> </li><li class="astro-3ii7xxms"> <a href="/authenticate/enterprise-connections/mapping-users-enterprise/" aria-current="false" class="astro-3ii7xxms"> <span class="astro-3ii7xxms">Mapping and syncing users for enterprise auth</span> </a> </li><li class="astro-3ii7xxms"> <a href="/authenticate/enterprise-connections/migrate-users-to-e
275nterprise-identity/" aria-current="false" class="astro-3ii7xxms"> <span class="astro-3ii7xxms">Migrating users from email identity to enterprise identity</span> </a> </li><li class="astro-3ii7xxms"> <a href="/authenticate/enterprise-connections/azure/" aria-current="false" class="astro-3ii7xxms"> <span class="astro-3ii7xxms">Microsoft Entra ID enterprise connection (OAuth 2.0, WS-Fed)</span> </a> </li><li class="astro-3ii7xxms"> <a href="/authenticate/enterprise-connections/entra-id-saml/" aria-current="false" class="astro-3ii7xxms"> <span class="astro-3ii7xxms">Microsoft Entra ID enterprise connection (SAML)</span> </a> </li><li class="astro-3ii7xxms"> <a href="/authenticate/enterprise-connections/cloudflare-saml/" aria-current="false" class="astro-3ii7xxms"> <span class="astro-3ii7xxms">Cloudflare enterprise connection (SAML)</span> </a> </li><li class="astro-3ii7xxms"> <a href="/authenticate/enterprise-connections/custom-saml-google-workspace/" aria-current="false" class="astro-3ii7xxms"> <span class="astro-3ii7xxms">Google Workspace enterprise connection (SAML)</span> </a> </li><li class="astro-3ii7xxms"> <a href="/authenticate/enterprise-connections/lastpass-sso/" aria-current="false" class="astro-3ii7xxms"> <span class="astro-3ii7xxms">LastPass enterprise connection (SAML)</span> </a> </li><li class="astro-3ii7xxms"> <a href="/authenticate/enterprise-connections/okta-saml-connection/" aria-current="false" class="astro-3ii7xxms"> <span class="astro-3ii7xxms">Okta enterprise connection (SAML)</span> </a> </li><li class="astro-3ii7xxms"> <a href="/authenticate/enterprise-connections/custom-saml/" aria-current="false" class="astro-3ii7xxms"> <span class="astro-3ii7xxms">Custom SAML enterprise connection</span> </a> </li><li class="astro-3ii7xxms"> <a href="/authenticate/enterprise-connections/advanced-saml-configurations/" aria-current="false" class="astro-3ii7xxms"> <span class="astro-3ii7xxms">Advanced SAML configurations</span> </a> </li><li class="astro-3ii7xxms"> <a href="/authenticate/enterprise-connections/idp-initiated-saml-sso/" aria-current="false" class="astro-3ii7xxms"> <span class="astro-3ii7xxms">IdP-initiated SAML SSO</span> </a> </li><li class="astro-3ii7xxms"> <a href="/authenticate/enterprise-connections/refresh-saml-certificate/" aria-current="false" class="astro-3ii7xxms"> <span class="astro-3ii7xxms">Refresh SAML certificate</span> </a> </li> </ul> </details> </li><li class="astro-3ii7xxms"> <details open class="astro-3ii7xxms"> <sl-sidebar-restore data-index="37"></sl-sidebar-restore> <summary class="astro-3ii7xxms"> <div class="group-label astro-3ii7xxms"> <span class="large astro-3ii7xxms">Self-serve SSO</span> </div> <svg aria-hidden="true" class="caret astro-3ii7xxms astro-c6vsoqas" width="16" height="16" viewBox="0 0 24 24" fill="currentColor" style="--sl-icon-size: 1.25rem;"><path d="m14.83 11.29-4.24-4.24a1 1 0 1 0-1.42 1.41L12.71 12l-3.54 3.54a1 1 0 0 0 0 1.41 1 1 0 0 0 .71.29 1 1 0 0 0 .71-.29l4.24-4.24a1.002 1.002 0 0 0 0-1.42Z"/></svg> </summary> <ul class="astro-3ii7xxms"> <li class="astro-3ii7xxms"> <a href="/authenticate/self-serve-sso/add-sso-self-serve/" aria-current="false" class="astro-3ii7xxms"> <span class="astro-3ii7xxms">Add SSO connection via self-serve portal</span> </a> </li><li class="astro-3ii7xxms"> <a href="/authenticate/self-serve-sso/manage-self-serve-connections/" aria-current="false" class="astro-3ii7xxms"> <span class="astro-3ii7xxms">Manage SSO connections added by customers</span> </a> </li><li class="astro-3ii7xxms"> <a href="/authenticate/self-serve-sso/self-manage-sso-per-org/" aria-current="false" class="astro-3ii7xxms"> <span class="astro-3ii7xxms">Switch on SSO self-management per organization</span> </a> </li> </ul> </details> </li><li class="astro-3ii7xxms"> <details open class="astro-3ii7xxms"> <sl-sidebar-restore data-index="38"></sl-sidebar-restore> <summary class="astro-3ii7xxms"> <div class="group-label astro-3ii7xxms"> <span class="large astro-3ii7xxms">Multi-factor auth</span> </div> <svg aria-hidden="true" class="caret astro-3ii7xxms astro-c6vsoqas" width="16" height="16" viewB
275ox="0 0 24 24" fill="currentColor" style="--sl-icon-size: 1.25rem;"><path d="m14.83 11.29-4.24-4.24a1 1 0 1 0-1.42 1.41L12.71 12l-3.54 3.54a1 1 0 0 0 0 1.41 1 1 0 0 0 .71.29 1 1 0 0 0 .71-.29l4.24-4.24a1.002 1.002 0 0 0 0-1.42Z"/></svg> </summary> <ul class="astro-3ii7xxms"> <li class="astro-3ii7xxms"> <a href="/authenticate/multi-factor-auth/about-multi-factor-authentication/" aria-current="false" class="astro-3ii7xxms"> <span class="astro-3ii7xxms">About multi-factor authentication</span> </a> </li><li class="astro-3ii7xxms"> <a href="/authenticate/multi-factor-auth/enable-multi-factor-authentication/" aria-current="false" class="astro-3ii7xxms"> <span class="astro-3ii7xxms">Enable multi-factor authentication</span> </a> </li><li class="astro-3ii7xxms"> <a href="/authenticate/multi-factor-auth/mfa-per-org/" aria-current="false" class="astro-3ii7xxms"> <span class="astro-3ii7xxms">Set multi-factor authentication for an organization</span> </a> </li> </ul> </details> </li><li class="astro-3ii7xxms"> <details open class="astro-3ii7xxms"> <sl-sidebar-restore data-index="39"></sl-sidebar-restore> <summary class="astro-3ii7xxms"> <div class="group-label astro-3ii7xxms"> <span class="large astro-3ii7xxms">Social connections</span> </div> <svg aria-hidden="true" class="caret astro-3ii7xxms astro-c6vsoqas" width="16" height="16" viewBox="0 0 24 24" fill="currentColor" style="--sl-icon-size: 1.25rem;"><path d="m14.83 11.29-4.24-4.24a1 1 0 1 0-1.42 1.41L12.71 12l-3.54 3.54a1 1 0 0 0 0 1.41 1 1 0 0 0 .71.29 1 1 0 0 0 .71-.29l4.24-4.24a1.002 1.002 0 0 0 0-1.42Z"/></svg> </summary> <ul class="astro-3ii7xxms"> <li class="astro-3ii7xxms"> <a href="/authenticate/social-sign-in/add-social-sign-in/" aria-current="false" class="astro-3ii7xxms"> <span class="astro-3ii7xxms">Add and manage social connections</span> </a> </li><li class="astro-3ii7xxms"> <a href="/authenticate/social-sign-in/apple/" aria-current="false" class="astro-3ii7xxms"> <span class="astro-3ii7xxms">Apple social sign in</span> </a> </li><li class="astro-3ii7xxms"> <a href="/authenticate/social-sign-in/bitbucket-sso/" aria-current="false" class="astro-3ii7xxms"> <span class="astro-3ii7xxms">Bitbucket social sign in</span> </a> </li><li class="astro-3ii7xxms"> <a href="/authenticate/social-sign-in/clever/" aria-current="false" class="astro-3ii7xxms"> <span class="astro-3ii7xxms">Clever social sign in</span> </a> </li><li class="astro-3ii7xxms"> <a href="/authenticate/social-sign-in/discord/" aria-current="false" class="astro-3ii7xxms"> <span class="astro-3ii7xxms">Discord social sign in</span> </a> </li><li class="astro-3ii7xxms"> <a href="/authenticate/social-sign-in/facebook/" aria-current="false" class="astro-3ii7xxms"> <span class="astro-3ii7xxms">Facebook social sign in</span> </a> </li><li class="astro-3ii7xxms"> <a href="/authenticate/social-sign-in/github/" aria-current="false" class="astro-3ii7xxms"> <span class="astro-3ii7xxms">GitHub social sign in</span> </a> </li><li class="astro-3ii7xxms"> <a href="/authenticate/social-sign-in/gitlab/" aria-current="false" class="astro-3ii7xxms"> <span class="astro-3ii7xxms">GitLab social sign in</span> </a> </li><li class="astro-3ii7xxms"> <a href="/authenticate/social-sign-in/google/" aria-current="false" class="astro-3ii7xxms"> <span class="astro-3ii7xxms">Google social sign in</span> </a> </li><li class="astro-3ii7xxms"> <a href="/authenticate/social-sign-in/linkedin/" aria-current="false" class="astro-3ii7xxms"> <span class="astro-3ii7xxms">LinkedIn social sign in</span> </a> </li><li class="astro-3ii7xxms"> <a href="/authenticate/social-sign-in/microsoft-sso/" aria-current="false" class="astro-3ii7xxms"> <span class="astro-3ii7xxms">Microsoft social sign in</span> </a> </li><li class="astro-3ii7xxms"> <a href="/authenticate/social-sign-in/roblox-sso/" aria-current="false" class="astro-3ii7xxms"> <span class="astro-3ii7xxms">Roblox social sign in</span> </a> </li><li class="astro-3ii7xxms"> <a href="/authenticate/social-sign-in/slack/" aria-current="false" class="astro-3ii7xxms"> <span class="astro-3ii7xxms">Slack social sign in</span> </a> </li><li class="astro-3ii7xxms"> <a href="/authenticate/social-sign-in/twitch/" aria-current="false" class="astro-3ii7xxms"> <span class="astro-3ii7xxms">Twitch social sign in</span> </a> </li><li class="astro-3ii7xxms"> <a href="/authenticate/social-sign-in/twitter/" aria-current="false" class="astro-3ii7xxms"> <span class="astro-3ii7xxms">X (formerly Twitter) social sign in</span> </a> </li><li class="astro-3ii7xxms"> <a href="/authenticate/social-sign-in/xero-sso/" aria-current="false" class="astro-3ii7xxms"> <span class="astro-3ii7xxms">Xero social sign in</span> </a> </li> </ul> </details> </li><li class="astro-3ii7xxms"> <details open class="astro-3ii7xxms"> <sl-sidebar-restore data-index="40"></sl-sidebar-restore> <summary class="astro-3ii7xxms"> <div class="group-label astro-3ii7xxms"> <span class="large astro-3ii7xxms">Device authorization flow</span> </div> <svg aria-hidden="true" class="caret astro-3ii7xxms astro-c6vsoqas" width="16" height="16" viewB
275ox="0 0 24 24" fill="currentColor" style="--sl-icon-size: 1.25rem;"><path d="m14.83 11.29-4.24-4.24a1 1 0 1 0-1.42 1.41L12.71 12l-3.54 3.54a1 1 0 0 0 0 1.41 1 1 0 0 0 .71.29 1 1 0 0 0 .71-.29l4.24-4.24a1.002 1.002 0 0 0 0-1.42Z"/></svg> </summary> <ul class="astro-3ii7xxms"> <li class="astro-3ii7xxms"> <a href="/authenticate/device-authorization-flow/quick-start/" aria-current="false" class="astro-3ii7xxms"> <span class="astro-3ii7xxms">Quick start</span> </a> </li><li class="astro-3ii7xxms"> <a href="/authenticate/device-authorization-flow/overview/" aria-current="false" class="astro-3ii7xxms"> <span class="astro-3ii7xxms">About the device authorization flow</span> </a> </li><li class="astro-3ii7xxms"> <a href="/authenticate/device-authorization-flow/api-calls/" aria-current="false" class="astro-3ii7xxms"> <span class="astro-3ii7xxms">Call your API using device authorization flow</span> </a> </li><li class="astro-3ii7xxms"> <a href="/authenticate/device-authorization-flow/troubleshooting/" aria-current="false" class="astro-3ii7xxms"> <span class="astro-3ii7xxms">Troubleshooting device authorization</span> </a> </li> </ul> </details> </li> </ul> </details> </li><li class="astro-3ii7xxms"> <details class="astro-3ii7xxms"> <sl-sidebar-restore data-index="41"></sl-sidebar-restore> <summary class="astro-3ii7xxms"> <div class="group-label astro-3ii7xxms"> <span class="large astro-3ii7xxms">Workforce identity</span> </div> <svg aria-hidden="true" class="caret astro-3ii7xxms astro-c6vsoqas" width="16" height="16" viewBox="0 0 24 24" fill="currentColor" style="--sl-icon-size: 1.25rem;"><path d="m14.83 11.29-4.24-4.24a1 1 0 1 0-1.42 1.41L12.71 12l-3.54 3.54a1 1 0 0 0 0 1.41 1 1 0 0 0 .71.29 1 1 0 0 0 .71-.29l4.24-4.24a1.002 1.002 0 0 0 0-1.42Z"/></svg> </summary> <ul class="astro-3ii7xxms"> <li class="astro-3ii7xxms"> <a href="/workforce-identity/" aria-current="false" class="astro-3ii7xxms"> <span class="astro-3ii7xxms">About workforce identity</span> </a> </li><li class="astro-3ii7xxms"> <a href="/workforce-identity/add-saml-application/" aria-current="false" class="astro-3ii7xxms"> <span class="astro-3ii7xxms">Add a SAML application</span> </a> </li> </ul> </details> </li><li class="astro-3ii7xxms"> <details class="astro-3ii7xxms"> <sl-sidebar-restore data-index="42"></sl-sidebar-restore> <summary class="astro-3ii7xxms"> <div class="group-label astro-3ii7xxms"> <span class="large astro-3ii7xxms">Testing</span> </div> <svg aria-hidden="true" class="caret astro-3ii7xxms astro-c6vsoqas" width="16" height="16" viewBox="0 0 24 24" fill="currentColor" style="--sl-icon-size: 1.25rem;"><path d="m14.83 11.29-4.24-4.24a1 1 0 1 0-1.42 1.41L12.71 12l-3.54 3.54a1 1 0 0 0 0 1.41 1 1 0 0 0 .71.29 1 1 0 0 0 .71-.29l4.24-4.24a1.002 1.002 0 0 0 0-1.42Z"/></svg> </summary> <ul class="astro-3ii7xxms"> <li class="astro-3ii7xxms"> <a href="/testing/" aria-current="false" class="astro-3ii7xxms"> <span class="astro-3ii7xxms">Overview</span> </a> </li><li class="astro-3ii7xxms"> <a href="/testing/setup-test-user-environment/" aria-current="false" class="astro-3ii7xxms"> <span class="astro-3ii7xxms">Setup test user and environment</span> </a> </li><li class="astro-3ii7xxms"> <a href="/testing/testing-authentication-flows/" aria-current="false" class="astro-3ii7xxms"> <span class="astro-3ii7xxms">Testing authentication flows</span> </a> </li><li class="astro-3ii7xxms"> <a href="/testing/testing-passwordless-flows/" aria-current="false" class="astro-3ii7xxms"> <span class="astro-3ii7xxms">Testing passwordless flows</span> </a> </li><li class="astro-3ii7xxms"> <a href="/testing/testing-authenticated-features/" aria-current="false" class="astro-3ii7xxms"> <span class="astro-3ii7xxms">Testing authenticated features</span> </a> </li><li class="astro-3ii7xxms"> <a href="/testing/testing-backend-apis/" aria-current="false" class="astro-3ii7xxms"> <span class="astro-3ii7xxms">Testing backend APIs</span> </a> </li><li class="astro-3ii7xxms"> <a href="/testing/test-backend-apis-jest/" aria-current="false" class="astro-3ii7xxms"> <span class="astro-3ii7xxms">Test backend APIs with Jest</span> </a> </li><li class="astro-3ii7xxms"> <details class="astro-3ii7xxms"> <sl-sidebar-restore data-index="43"></sl-sidebar-restore> <summary class="astro-3ii7xxms"> <div class="group-label astro-3ii7xxms"> <span class="large astro-3ii7xxms">Cypress</span> </div> <svg aria-hidden="true" class="caret astro-3ii7xxms astro-c6vsoqas" width="16" height="16" viewB
275ox="0 0 24 24" fill="currentColor" style="--sl-icon-size: 1.25rem;"><path d="m14.83 11.29-4.24-4.24a1 1 0 1 0-1.42 1.41L12.71 12l-3.54 3.54a1 1 0 0 0 0 1.41 1 1 0 0 0 .71.29 1 1 0 0 0 .71-.29l4.24-4.24a1.002 1.002 0 0 0 0-1.42Z"/></svg> </summary> <ul class="astro-3ii7xxms"> <li class="astro-3ii7xxms"> <a href="/testing/cypress/" aria-current="false" class="astro-3ii7xxms"> <span class="astro-3ii7xxms">Setup Cypress</span> </a> </li><li class="astro-3ii7xxms"> <a href="/testing/cypress/test-auth-flows/" aria-current="false" class="astro-3ii7xxms"> <span class="astro-3ii7xxms">Test authentication flows</span> </a> </li><li class="astro-3ii7xxms"> <a href="/testing/cypress/test-passwordless-flows/" aria-current="false" class="astro-3ii7xxms"> <span class="astro-3ii7xxms">Test passwordless flows</span> </a> </li><li class="astro-3ii7xxms"> <a href="/testing/cypress/test-auth-features/" aria-current="false" class="astro-3ii7xxms"> <span class="astro-3ii7xxms">Test authenticated features</span> </a> </li><li class="astro-3ii7xxms"> <a href="/testing/cypress/test-backend-apis/" aria-current="false" class="astro-3ii7xxms"> <span class="astro-3ii7xxms">Test backend APIs</span> </a> </li> </ul> </details> </li><li class="astro-3ii7xxms"> <details class="astro-3ii7xxms"> <sl-sidebar-restore data-index="44"></sl-sidebar-restore> <summary class="astro-3ii7xxms"> <div class="group-label astro-3ii7xxms"> <span class="large astro-3ii7xxms">Playwright</span> </div> <svg aria-hidden="true" class="caret astro-3ii7xxms astro-c6vsoqas" width="16" height="16" viewBox="0 0 24 24" fill="currentColor" style="--sl-icon-size: 1.25rem;"><path d="m14.83 11.29-4.24-4.24a1 1 0 1 0-1.42 1.41L12.71 12l-3.54 3.54a1 1 0 0 0 0 1.41 1 1 0 0 0 .71.29 1 1 0 0 0 .71-.29l4.24-4.24a1.002 1.002 0 0 0 0-1.42Z"/></svg> </summary> <ul class="astro-3ii7xxms"> <li class="astro-3ii7xxms"> <a href="/testing/playwright/" aria-current="false" class="astro-3ii7xxms"> <span class="astro-3ii7xxms">Setup Playwright</span> </a> </li><li class="astro-3ii7xxms"> <a href="/testing/playwright/test-auth-flows/" aria-current="false" class="astro-3ii7xxms"> <span class="astro-3ii7xxms">Test authentication flows</span> </a> </li><li class="astro-3ii7xxms"> <a href="/testing/playwright/test-passwordless-flows/" aria-current="false" class="astro-3ii7xxms"> <span class="astro-3ii7xxms">Test passwordless flows</span> </a> </li><li class="astro-3ii7xxms"> <a href="/testing/playwright/test-auth-features/" aria-current="false" class="astro-3ii7xxms"> <span class="astro-3ii7xxms">Test authenticated features</span> </a> </li><li class="astro-3ii7xxms"> <a href="/testing/playwright/test-backend-apis/" aria-current="false" class="astro-3ii7xxms"> <span class="astro-3ii7xxms">Test backend APIs</span> </a> </li> </ul> </details> </li> </ul> </details> </li><li class="astro-3ii7xxms"> <details class="astro-3ii7xxms"> <sl-sidebar-restore data-index="45"></sl-sidebar-restore> <summary class="astro-3ii7xxms"> <div class="group-label astro-3ii7xxms"> <span class="large astro-3ii7xxms">Billing</span> </div> <svg aria-hidden="true" class="caret astro-3ii7xxms astro-c6vsoqas" width="16" height="16" viewBox="0 0 24 24" fill="currentColor" style="--sl-icon-size: 1.25rem;"><path d="m14.83 11.29-4.24-4.24a1 1 0 1 0-1.42 1.41L12.71 12l-3.54 3.54a1 1 0 0 0 0 1.41 1 1 0 0 0 .71.29 1 1 0 0 0 .71-.29l4.24-4.24a1.002 1.002 0 0 0 0-1.42Z"/></svg> </summary> <ul class="astro-3ii7xxms"> <li class="astro-3ii7xxms"> <details open class="astro-3ii7xxms"> <sl-sidebar-restore data-index="46"></sl-sidebar-restore> <summary class="astro-3ii7xxms"> <div class="group-label astro-3ii7xxms"> <span class="large astro-3ii7xxms">About billing</span> </div> <svg aria-hidden="true" class="caret astro-3ii7xxms astro-c6vsoqas" width="16" height="16" viewBox="0 0 24 24" fill="currentColor" style="--sl-icon-size: 1.25rem;"><path d="m14.83 11.29-4.24-4.24a1 1 0 1 0-1.42 1.41L12.71 12l-3.54 3.54a1 1 0 0 0 0 1.41 1 1 0 0 0 .71.29 1 1 0 0 0 .71-.29l4.24-4.24a1.002 1.002 0 0 0 0-1.42Z"/></svg> </summary> <ul class="astro-3ii7xxms"> <li class="astro-3ii7xxms"> <a href="/billing/about-billing/about-billing/" aria-current="false" class="astro-3ii7xxms"> <span class="astro-3ii7xxms">About billing</span> </a> </li><li class="astro-3ii7xxms"> <a href="/billing/about-billing/billing-faq/" aria-current="false" class="astro-3ii7xxms"> <span class="astro-3ii7xxms">Billing FAQ</span> </a> </li><li class="astro-3ii7xxms"> <a href="/billing/about-billing/kinde-billing-model/" aria-current="false" class="astro-3ii7xxms"> <span class="astro-3ii7xxms">The Kinde billing model</span> </a> </li><li class="astro-3ii7xxms"> <a href="/billing/about-billing/billing-concepts-terms/" aria-current="false" class="astro-3ii7xxms"> <span class="astro-3ii7xxms">Billing concepts</span> </a> </li><li class="astro-3ii7xxms"> <a href="/billing/about-billing/kinde-billing-faqs/" aria-current="false" class="astro-3ii7xxms"> <span class="astro-3ii7xxms">Top questions about Kinde billing</span> </a> </li> </ul> </details> </li><li class="astro-3ii7xxms"> <details open class="astro-3ii7xxms"> <sl-sidebar-restore data-index="47"></sl-sidebar-restore> <summary class="astro-3ii7xxms"> <div class="group-label astro-3ii7xxms"> <span class="large astro-3ii7xxms">Get started</span> </div> <svg aria-hidden="true" class="caret astro-3ii7xxms astro-c6vsoqas" width="16" height="16" viewB
275ox="0 0 24 24" fill="currentColor" style="--sl-icon-size: 1.25rem;"><path d="m14.83 11.29-4.24-4.24a1 1 0 1 0-1.42 1.41L12.71 12l-3.54 3.54a1 1 0 0 0 0 1.41 1 1 0 0 0 .71.29 1 1 0 0 0 .71-.29l4.24-4.24a1.002 1.002 0 0 0 0-1.42Z"/></svg> </summary> <ul class="astro-3ii7xxms"> <li class="astro-3ii7xxms"> <a href="/billing/get-started/setup-overview/" aria-current="false" class="astro-3ii7xxms"> <span class="astro-3ii7xxms">Setup overview</span> </a> </li><li class="astro-3ii7xxms"> <a href="/billing/get-started/add-billing-role/" aria-current="false" class="astro-3ii7xxms"> <span class="astro-3ii7xxms">Step 1 Add billing role (B2B)</span> </a> </li><li class="astro-3ii7xxms"> <a href="/billing/get-started/connect-to-stripe/" aria-current="false" class="astro-3ii7xxms"> <span class="astro-3ii7xxms">Step 2 Connect to Stripe and set policies</span> </a> </li><li class="astro-3ii7xxms"> <a href="/billing/get-started/default-billing-currency/" aria-current="false" class="astro-3ii7xxms"> <span class="astro-3ii7xxms">Step 3 Set default billing currency</span> </a> </li><li class="astro-3ii7xxms"> <a href="/billing/get-started/build-plans/" aria-current="false" class="astro-3ii7xxms"> <span class="astro-3ii7xxms">Step 4 Build plans</span> </a> </li><li class="astro-3ii7xxms"> <a href="/billing/get-started/publish-plans/" aria-current="false" class="astro-3ii7xxms"> <span class="astro-3ii7xxms">Step 5 Publish plans</span> </a> </li><li class="astro-3ii7xxms"> <a href="/billing/get-started/add-pricing-table/" aria-current="false" class="astro-3ii7xxms"> <span class="astro-3ii7xxms">Step 6 Create pricing table (optional)</span> </a> </li><li class="astro-3ii7xxms"> <a href="/billing/get-started/self-serve-portal-setup/" aria-current="false" class="astro-3ii7xxms"> <span class="astro-3ii7xxms">Step 7 Set up self-serve portal (optional)</span> </a> </li> </ul> </details> </li><li class="astro-3ii7xxms"> <details open class="astro-3ii7xxms"> <sl-sidebar-restore data-index="48"></sl-sidebar-restore> <summary class="astro-3ii7xxms"> <div class="group-label astro-3ii7xxms"> <span class="large astro-3ii7xxms">Manage plans</span> </div> <svg aria-hidden="true" class="caret astro-3ii7xxms astro-c6vsoqas" width="16" height="16" viewBox="0 0 24 24" fill="currentColor" style="--sl-icon-size: 1.25rem;"><path d="m14.83 11.29-4.24-4.24a1 1 0 1 0-1.42 1.41L12.71 12l-3.54 3.54a1 1 0 0 0 0 1.41 1 1 0 0 0 .71.29 1 1 0 0 0 .71-.29l4.24-4.24a1.002 1.002 0 0 0 0-1.42Z"/></svg> </summary> <ul class="astro-3ii7xxms"> <li class="astro-3ii7xxms"> <a href="/billing/manage-plans/about-plans/" aria-current="false" class="astro-3ii7xxms"> <span class="astro-3ii7xxms">About plans</span> </a> </li><li class="astro-3ii7xxms"> <a href="/billing/manage-plans/create-plans/" aria-current="false" class="astro-3ii7xxms"> <span class="astro-3ii7xxms">Create plans</span> </a> </li><li class="astro-3ii7xxms"> <a href="/billing/manage-plans/upgrade-downgrade-plans/" aria-current="false" class="astro-3ii7xxms"> <span class="astro-3ii7xxms">Plan upgrade and downgrade policies</span> </a> </li><li class="astro-3ii7xxms"> <a href="/billing/manage-plans/cancel-plans/" aria-current="false" class="astro-3ii7xxms"> <span class="astro-3ii7xxms">Cancel a subscription</span> </a> </li><li class="astro-3ii7xxms"> <a href="/billing/manage-plans/add-manage-plan-groups/" aria-current="false" class="astro-3ii7xxms"> <span class="astro-3ii7xxms">Add and manage plan groups</span> </a> </li> </ul> </details> </li><li class="astro-3ii7xxms"> <details open class="astro-3ii7xxms"> <sl-sidebar-restore data-index="49"></sl-sidebar-restore> <summary class="astro-3ii7xxms"> <div class="group-label astro-3ii7xxms"> <span class="large astro-3ii7xxms">Payment management</span> </div> <svg aria-hidden="true" class="caret astro-3ii7xxms astro-c6vsoqas" width="16" height="16" viewBox="0 0 24 24" fill="currentColor" style="--sl-icon-size: 1.25rem;"><path d="m14.83 11.29-4.24-4.24a1 1 0 1 0-1.42 1.41L12.71 12l-3.54 3.54a1 1 0 0 0 0 1.41 1 1 0 0 0 .71.29 1 1 0 0 0 .71-.29l4.24-4.24a1.002 1.002 0 0 0 0-1.42Z"/></svg> </summary> <ul class="astro-3ii7xxms"> <li class="astro-3ii7xxms"> <a href="/billing/payment-management/payment-processor/" aria-current="false" class="astro-3ii7xxms"> <span class="astro-3ii7xxms">Connect payment processor (Stripe)</span> </a> </li><li class="astro-3ii7xxms"> <a href="/billing/payment-management/manage-stripe-connection/" aria-current="false" class="astro-3ii7xxms"> <span class="astro-3ii7xxms">Manage Stripe connection</span> </a> </li> </ul> </details> </li><li class="astro-3ii7xxms"> <details open class="astro-3ii7xxms"> <sl-sidebar-restore data-index="50"></sl-sidebar-restore> <summary class="astro-3ii7xxms"> <div class="group-label astro-3ii7xxms"> <span class="large astro-3ii7xxms">Subscription management</span> </div> <svg aria-hidden="true" class="caret astro-3ii7xxms astro-c6vsoqas" width="16" height="16" viewB
275ox="0 0 24 24" fill="currentColor" style="--sl-icon-size: 1.25rem;"><path d="m14.83 11.29-4.24-4.24a1 1 0 1 0-1.42 1.41L12.71 12l-3.54 3.54a1 1 0 0 0 0 1.41 1 1 0 0 0 .71.29 1 1 0 0 0 .71-.29l4.24-4.24a1.002 1.002 0 0 0 0-1.42Z"/></svg> </summary> <ul class="astro-3ii7xxms"> <li class="astro-3ii7xxms"> <a href="/billing/manage-subscribers/upgrade-downgrade-methods/" aria-current="false" class="astro-3ii7xxms"> <span class="astro-3ii7xxms">Subscription upgrade and downgrade methods</span> </a> </li><li class="astro-3ii7xxms"> <a href="/billing/manage-subscribers/add-metered-usage/" aria-current="false" class="astro-3ii7xxms"> <span class="astro-3ii7xxms">Add metered usage for a customer via API</span> </a> </li><li class="astro-3ii7xxms"> <a href="/billing/manage-subscribers/manage-customer-activity-webhooks/" aria-current="false" class="astro-3ii7xxms"> <span class="astro-3ii7xxms">Respond to customer activity using webhooks</span> </a> </li> </ul> </details> </li><li class="astro-3ii7xxms"> <details open class="astro-3ii7xxms"> <sl-sidebar-restore data-index="51"></sl-sidebar-restore> <summary class="astro-3ii7xxms"> <div class="group-label astro-3ii7xxms"> <span class="large astro-3ii7xxms">Pricing</span> </div> <svg aria-hidden="true" class="caret astro-3ii7xxms astro-c6vsoqas" width="16" height="16" viewBox="0 0 24 24" fill="currentColor" style="--sl-icon-size: 1.25rem;"><path d="m14.83 11.29-4.24-4.24a1 1 0 1 0-1.42 1.41L12.71 12l-3.54 3.54a1 1 0 0 0 0 1.41 1 1 0 0 0 .71.29 1 1 0 0 0 .71-.29l4.24-4.24a1.002 1.002 0 0 0 0-1.42Z"/></svg> </summary> <ul class="astro-3ii7xxms"> <li class="astro-3ii7xxms"> <a href="/billing/pricing/pricing-models/" aria-current="false" class="astro-3ii7xxms"> <span class="astro-3ii7xxms">Pricing models</span> </a> </li> </ul> </details> </li><li class="astro-3ii7xxms"> <details open class="astro-3ii7xxms"> <sl-sidebar-restore data-index="52"></sl-sidebar-restore> <summary class="astro-3ii7xxms"> <div class="group-label astro-3ii7xxms"> <span class="large astro-3ii7xxms">Billing user experience</span> </div> <svg aria-hidden="true" class="caret astro-3ii7xxms astro-c6vsoqas" width="16" height="16" viewBox="0 0 24 24" fill="currentColor" style="--sl-icon-size: 1.25rem;"><path d="m14.83 11.29-4.24-4.24a1 1 0 1 0-1.42 1.41L12.71 12l-3.54 3.54a1 1 0 0 0 0 1.41 1 1 0 0 0 .71.29 1 1 0 0 0 .71-.29l4.24-4.24a1.002 1.002 0 0 0 0-1.42Z"/></svg> </summary> <ul class="astro-3ii7xxms"> <li class="astro-3ii7xxms"> <a href="/billing/billing-user-experience/plan-selection/" aria-current="false" class="astro-3ii7xxms"> <span class="astro-3ii7xxms">Build a pricing table</span> </a> </li><li class="astro-3ii7xxms"> <a href="/billing/billing-user-experience/customize-billing-pages/" aria-current="false" class="astro-3ii7xxms"> <span class="astro-3ii7xxms">Customize the plan sign-up experience</span> </a> </li><li class="astro-3ii7xxms"> <a href="/billing/billing-user-experience/add-billing-to-url-sdk/" aria-current="false" class="astro-3ii7xxms"> <span class="astro-3ii7xxms">Update code and URLs for billing</span> </a> </li><li class="astro-3ii7xxms"> <a href="/billing/billing-user-experience/pricing-table-display/" aria-current="false" class="astro-3ii7xxms"> <span class="astro-3ii7xxms">Pricing table display defaults</span> </a> </li><li class="astro-3ii7xxms"> <a href="/billing/billing-user-experience/free-trials/" aria-current="false" class="astro-3ii7xxms"> <span class="astro-3ii7xxms">Offer a free trial</span> </a> </li> </ul> </details> </li> </ul> </details> </li><li class="astro-3ii7xxms"> <details class="astro-3ii7xxms"> <sl-sidebar-restore data-index="53"></sl-sidebar-restore> <summary class="astro-3ii7xxms"> <div class="group-label astro-3ii7xxms"> <span class="large astro-3ii7xxms">Design</span> </div> <svg aria-hidden="true" class="caret astro-3ii7xxms astro-c6vsoqas" width="16" height="16" viewBox="0 0 24 24" fill="currentColor" style="--sl-icon-size: 1.25rem;"><path d="m14.83 11.29-4.24-4.24a1 1 0 1 0-1.42 1.41L12.71 12l-3.54 3.54a1 1 0 0 0 0 1.41 1 1 0 0 0 .71.29 1 1 0 0 0 .71-.29l4.24-4.24a1.002 1.002 0 0 0 0-1.42Z"/></svg> </summary> <ul class="astro-3ii7xxms"> <li class="astro-3ii7xxms"> <details open class="astro-3ii7xxms"> <sl-sidebar-restore data-index="54"></sl-sidebar-restore> <summary class="astro-3ii7xxms"> <div class="group-label astro-3ii7xxms"> <span class="large astro-3ii7xxms">Brand</span> </div> <svg aria-hidden="true" class="caret astro-3ii7xxms astro-c6vsoqas" width="16" height="16" viewB
275ox="0 0 24 24" fill="currentColor" style="--sl-icon-size: 1.25rem;"><path d="m14.83 11.29-4.24-4.24a1 1 0 1 0-1.42 1.41L12.71 12l-3.54 3.54a1 1 0 0 0 0 1.41 1 1 0 0 0 .71.29 1 1 0 0 0 .71-.29l4.24-4.24a1.002 1.002 0 0 0 0-1.42Z"/></svg> </summary> <ul class="astro-3ii7xxms"> <li class="astro-3ii7xxms"> <a href="/design/brand/global-brand-defaults/" aria-current="false" class="astro-3ii7xxms"> <span class="astro-3ii7xxms">Set global brand defaults</span> </a> </li><li class="astro-3ii7xxms"> <a href="/design/brand/apply-branding-for-an-organization/" aria-current="false" class="astro-3ii7xxms"> <span class="astro-3ii7xxms">Set unique branding for orgs</span> </a> </li><li class="astro-3ii7xxms"> <a href="/design/brand/link-to-homepage/" aria-current="false" class="astro-3ii7xxms"> <span class="astro-3ii7xxms">Add a logo and make it clickable</span> </a> </li><li class="astro-3ii7xxms"> <a href="/design/brand/remove-kinde-branding/" aria-current="false" class="astro-3ii7xxms"> <span class="astro-3ii7xxms">Remove "Powered by Kinde" attribution</span> </a> </li> </ul> </details> </li><li class="astro-3ii7xxms"> <details open class="astro-3ii7xxms"> <sl-sidebar-restore data-index="55"></sl-sidebar-restore> <summary class="astro-3ii7xxms"> <div class="group-label astro-3ii7xxms"> <span class="large astro-3ii7xxms">Page layout</span> </div> <svg aria-hidden="true" class="caret astro-3ii7xxms astro-c6vsoqas" width="16" height="16" viewBox="0 0 24 24" fill="currentColor" style="--sl-icon-size: 1.25rem;"><path d="m14.83 11.29-4.24-4.24a1 1 0 1 0-1.42 1.41L12.71 12l-3.54 3.54a1 1 0 0 0 0 1.41 1 1 0 0 0 .71.29 1 1 0 0 0 .71-.29l4.24-4.24a1.002 1.002 0 0 0 0-1.42Z"/></svg> </summary> <ul class="astro-3ii7xxms"> <li class="astro-3ii7xxms"> <a href="/design/pages/page-layout/" aria-current="false" class="astro-3ii7xxms"> <span class="astro-3ii7xxms">Manage page layouts</span> </a> </li><li class="astro-3ii7xxms"> <a href="/design/pages/set-up-the-request-access-page/" aria-current="false" class="astro-3ii7xxms"> <span class="astro-3ii7xxms">Set up the request access page</span> </a> </li><li class="astro-3ii7xxms"> <a href="/design/pages/subscription-form/" aria-current="false" class="astro-3ii7xxms"> <span class="astro-3ii7xxms">Set up a subscription form</span> </a> </li><li class="astro-3ii7xxms"> <a href="/design/pages/marketing-consent/" aria-current="false" class="astro-3ii7xxms"> <span class="astro-3ii7xxms">User consent for marketing on sign up</span> </a> </li> </ul> </details> </li><li class="astro-3ii7xxms"> <details open class="astro-3ii7xxms"> <sl-sidebar-restore data-index="56"></sl-sidebar-restore> <summary class="astro-3ii7xxms"> <div class="group-label astro-3ii7xxms"> <span class="large astro-3ii7xxms">Content</span> </div> <svg aria-hidden="true" class="caret astro-3ii7xxms astro-c6vsoqas" width="16" height="16" viewBox="0 0 24 24" fill="currentColor" style="--sl-icon-size: 1.25rem;"><path d="m14.83 11.29-4.24-4.24a1 1 0 1 0-1.42 1.41L12.71 12l-3.54 3.54a1 1 0 0 0 0 1.41 1 1 0 0 0 .71.29 1 1 0 0 0 .71-.29l4.24-4.24a1.002 1.002 0 0 0 0-1.42Z"/></svg> </summary> <ul class="astro-3ii7xxms"> <li class="astro-3ii7xxms"> <a href="/design/content-customization/how-content-is-managed/" aria-current="false" class="astro-3ii7xxms"> <span class="astro-3ii7xxms">How content is managed in Kinde</span> </a> </li><li class="astro-3ii7xxms"> <a href="/design/content-customization/update-auth-page-content/" aria-current="false" class="astro-3ii7xxms"> <span class="astro-3ii7xxms">Update page content</span> </a> </li><li class="astro-3ii7xxms"> <a href="/design/content-customization/set-language-for-pages/" aria-current="false" class="astro-3ii7xxms"> <span class="astro-3ii7xxms">Manage languages on user facing pages</span> </a> </li><li class="astro-3ii7xxms"> <a href="/design/content-customization/email-content/" aria-current="false" class="astro-3ii7xxms"> <span class="astro-3ii7xxms">Customize email content</span> </a> </li> </ul> </details> </li><li class="astro-3ii7xxms"> <details open class="astro-3ii7xxms"> <sl-sidebar-restore data-index="57"></sl-sidebar-restore> <summary class="astro-3ii7xxms"> <div class="group-label astro-3ii7xxms"> <span class="large astro-3ii7xxms">
275Customize with code</span> </div> <svg aria-hidden="true" class="caret astro-3ii7xxms astro-c6vsoqas" width="16" height="16" viewBox="0 0 24 24" fill="currentColor" style="--sl-icon-size: 1.25rem;"><path d="m14.83 11.29-4.24-4.24a1 1 0 1 0-1.42 1.41L12.71 12l-3.54 3.54a1 1 0 0 0 0 1.41 1 1 0 0 0 .71.29 1 1 0 0 0 .71-.29l4.24-4.24a1.002 1.002 0 0 0 0-1.42Z"/></svg> </summary> <ul class="astro-3ii7xxms"> <li class="astro-3ii7xxms"> <a href="/design/customize-with-code/quick-start-guide/" aria-current="false" class="astro-3ii7xxms"> <span class="astro-3ii7xxms">Quick start guide</span> </a> </li><li class="astro-3ii7xxms"> <a href="/design/customize-with-code/customize-with-css-html/" aria-current="false" class="astro-3ii7xxms"> <span class="astro-3ii7xxms">Customize designs with code</span> </a> </li><li class="astro-3ii7xxms"> <a href="/design/customize-with-code/connect-repo/" aria-current="false" class="astro-3ii7xxms"> <span class="astro-3ii7xxms">Connect your repo for custom pages</span> </a> </li><li class="astro-3ii7xxms"> <a href="/design/customize-with-code/kinde-widget/" aria-current="false" class="astro-3ii7xxms"> <span class="astro-3ii7xxms">Working with the Kinde widget</span> </a> </li><li class="astro-3ii7xxms"> <a href="/design/customize-with-code/understand-page-design/" aria-current="false" class="astro-3ii7xxms"> <span class="astro-3ii7xxms">Understand Kinde page customization</span> </a> </li><li class="astro-3ii7xxms"> <a href="/design/customize-with-code/switch-connection/" aria-current="false" class="astro-3ii7xxms"> <span class="astro-3ii7xxms">Add a connection switcher</span> </a> </li><li class="astro-3ii7xxms"> <a href="/design/customize-with-code/inspect-design-devtools/" aria-current="false" class="astro-3ii7xxms"> <span class="astro-3ii7xxms">Design inspection with DevTools</span> </a> </li><li class="astro-3ii7xxms"> <a href="/design/customize-with-code/manage-design-assets/" aria-current="false" class="astro-3ii7xxms"> <span class="astro-3ii7xxms">Manage assets</span> </a> </li><li class="astro-3ii7xxms"> <a href="/design/customize-with-code/styling-with-css/" aria-current="false" class="astro-3ii7xxms"> <span class="astro-3ii7xxms">Styling with CSS</span> </a> </li><li class="astro-3ii7xxms"> <a href="/design/customize-with-code/style-with-style-hooks/" aria-current="false" class="astro-3ii7xxms"> <span class="astro-3ii7xxms">Style with style hooks</span> </a> </li><li class="astro-3ii7xxms"> <a href="/design/customize-with-code/pages-packages/" aria-current="false" class="astro-3ii7xxms"> <span class="astro-3ii7xxms">Libraries and packages for pages</span> </a> </li><li class="astro-3ii7xxms"> <a href="/design/customize-with-code/page-rendering/" aria-current="false" class="astro-3ii7xxms"> <span class="astro-3ii7xxms">Page rendering</span> </a> </li><li class="astro-3ii7xxms"> <a href="/design/customize-with-code/pages-and-kinde-api/" aria-current="false" class="astro-3ii7xxms"> <span class="astro-3ii7xxms">Pages and the Kinde Management API</span> </a> </li><li class="astro-3ii7xxms"> <a href="/design/customize-with-code/manage-custom-code-deployment/" aria-current="false" class="astro-3ii7xxms"> <span class="astro-3ii7xxms">Manage custom code deployments</span> </a> </li><li class="astro-3ii7xxms"> <a href="/design/customize-with-code/custom-code-logs/" aria-current="false" class="astro-3ii7xxms"> <span class="astro-3ii7xxms">Review custom code logs</span> </a> </li><li class="astro-3ii7xxms"> <a href="/design/customize-with-code/preview-custom-design/" aria-current="false" class="astro-3ii7xxms"> <span class="astro-3ii7xxms">Preview custom code</span> </a> </li><li class="astro-3ii7xxms"> <a href="/design/customize-with-code/custom-ui-examples/" aria-current="false" class="astro-3ii7xxms"> <span class="astro-3ii7xxms">Custom UI examples</span> </a> </li><li class="astro-3ii7xxms"> <a href="/design/customize-with-code/custom-styling-per-application/" aria-current="false" class="astro-3ii7xxms"> <span class="astro-3ii7xxms">Apply custom styling per application</span> </a> </li> </ul> </details> </li> </ul> </details> </li><li class="astro-3ii7xxms"> <details class="astro-3ii7xxms"> <sl-sidebar-restore data-index="58"></sl-sidebar-restore> <summary class="astro-3ii7xxms"> <div class="group-label astro-3ii7xxms"> <span class="large astro-3ii7xxms">Workflows</span> </div> <svg aria-hidden="true" class="caret astro-3ii7xxms astro-c6vsoqas" width="16" height="16" viewB
275ox="0 0 24 24" fill="currentColor" style="--sl-icon-size: 1.25rem;"><path d="m14.83 11.29-4.24-4.24a1 1 0 1 0-1.42 1.41L12.71 12l-3.54 3.54a1 1 0 0 0 0 1.41 1 1 0 0 0 .71.29 1 1 0 0 0 .71-.29l4.24-4.24a1.002 1.002 0 0 0 0-1.42Z"/></svg> </summary> <ul class="astro-3ii7xxms"> <li class="astro-3ii7xxms"> <details open class="astro-3ii7xxms"> <sl-sidebar-restore data-index="59"></sl-sidebar-restore> <summary class="astro-3ii7xxms"> <div class="group-label astro-3ii7xxms"> <span class="large astro-3ii7xxms">About workflows</span> </div> <svg aria-hidden="true" class="caret astro-3ii7xxms astro-c6vsoqas" width="16" height="16" viewBox="0 0 24 24" fill="currentColor" style="--sl-icon-size: 1.25rem;"><path d="m14.83 11.29-4.24-4.24a1 1 0 1 0-1.42 1.41L12.71 12l-3.54 3.54a1 1 0 0 0 0 1.41 1 1 0 0 0 .71.29 1 1 0 0 0 .71-.29l4.24-4.24a1.002 1.002 0 0 0 0-1.42Z"/></svg> </summary> <ul class="astro-3ii7xxms"> <li class="astro-3ii7xxms"> <a href="/workflows/about-workflows/" aria-current="false" class="astro-3ii7xxms"> <span class="astro-3ii7xxms">About workflows</span> </a> </li> </ul> </details> </li><li class="astro-3ii7xxms"> <details open class="astro-3ii7xxms"> <sl-sidebar-restore data-index="60"></sl-sidebar-restore> <summary class="astro-3ii7xxms"> <div class="group-label astro-3ii7xxms"> <span class="large astro-3ii7xxms">Getting started</span> </div> <svg aria-hidden="true" class="caret astro-3ii7xxms astro-c6vsoqas" width="16" height="16" viewBox="0 0 24 24" fill="currentColor" style="--sl-icon-size: 1.25rem;"><path d="m14.83 11.29-4.24-4.24a1 1 0 1 0-1.42 1.41L12.71 12l-3.54 3.54a1 1 0 0 0 0 1.41 1 1 0 0 0 .71.29 1 1 0 0 0 .71-.29l4.24-4.24a1.002 1.002 0 0 0 0-1.42Z"/></svg> </summary> <ul class="astro-3ii7xxms"> <li class="astro-3ii7xxms"> <a href="/workflows/getting-started/quick-start-guide/" aria-current="false" class="astro-3ii7xxms"> <span class="astro-3ii7xxms">Workflow quickstart guide</span> </a> </li><li class="astro-3ii7xxms"> <a href="/workflows/getting-started/project-structure/" aria-current="false" class="astro-3ii7xxms"> <span class="astro-3ii7xxms">Project structure</span> </a> </li><li class="astro-3ii7xxms"> <a href="/workflows/getting-started/workflow-files/" aria-current="false" class="astro-3ii7xxms"> <span class="astro-3ii7xxms">Workflow files</span> </a> </li><li class="astro-3ii7xxms"> <a href="/workflows/getting-started/connect-repo-for-workflows/" aria-current="false" class="astro-3ii7xxms"> <span class="astro-3ii7xxms">Connect your workflows repo and branch</span> </a> </li><li class="astro-3ii7xxms"> <a href="/workflows/getting-started/infrastructure-package/" aria-current="false" class="astro-3ii7xxms"> <span class="astro-3ii7xxms">Infrastructure package</span> </a> </li><li class="astro-3ii7xxms"> <a href="/workflows/getting-started/workflow-examples/" aria-current="false" class="astro-3ii7xxms"> <span class="astro-3ii7xxms">Workflow examples</span> </a> </li> </ul> </details> </li><li class="astro-3ii7xxms"> <details open class="astro-3ii7xxms"> <sl-sidebar-restore data-index="61"></sl-sidebar-restore> <summary class="astro-3ii7xxms"> <div class="group-label astro-3ii7xxms"> <span class="large astro-3ii7xxms">Workflow tutorials</span> </div> <svg aria-hidden="true" class="caret astro-3ii7xxms astro-c6vsoqas" width="16" height="16" viewBox="0 0 24 24" fill="currentColor" style="--sl-icon-size: 1.25rem;"><path d="m14.83 11.29-4.24-4.24a1 1 0 1 0-1.42 1.41L12.71 12l-3.54 3.54a1 1 0 0 0 0 1.41 1 1 0 0 0 .71.29 1 1 0 0 0 .71-.29l4.24-4.24a1.002 1.002 0 0 0 0-1.42Z"/></svg> </summary> <ul class="astro-3ii7xxms"> <li class="astro-3ii7xxms"> <a href="/workflows/workflow-tutorials/customize-token-with-workflow/" aria-current="false" class="astro-3ii7xxms"> <span class="astro-3ii7xxms">Tutorial - Customize tokens using workflows</span> </a> </li><li class="astro-3ii7xxms"> <a href="/workflows/workflow-tutorials/fetch-third-party-data/" aria-current="false" class="astro-3ii7xxms"> <span class="astro-3ii7xxms">Tutorial - Fetch third party data in workflows</span> </a> </li><li class="astro-3ii7xxms"> <a href="/workflows/workflow-tutorials/custom-password-validation-check/" aria-current="false" class="astro-3ii7xxms"> <span class="astro-3ii7xxms">Tutorial - Password validation check</span> </a> </li><li class="astro-3ii7xxms"> <a href="/workflows/workflow-tutorials/drip-feed-migration/" aria-current="false" class="astro-3ii7xxms"> <span class="astro-3ii7xxms">Tutorial - Drip-feed user migration</span> </a> </li><li class="astro-3ii7xxms"> <a href="/workflows/workflow-tutorials/m2m-apps-and-token-management/" aria-current="false" class="astro-3ii7xxms"> <span class="astro-3ii7xxms">Tutorial - M2M apps and token management</span> </a> </li><li class="astro-3ii7xxms"> <a href="/workflows/workflow-tutorials/check-plan-change-eligibility/" aria-current="false" class="astro-3ii7xxms"> <span class="astro-3ii7xxms">Tutorial - Check plan change eligibility</span> </a> </li><li class="astro-3ii7xxms"> <a href="/workflows/workflow-tutorials/check-plan-cancellation-eligibility/" aria-current="false" class="astro-3ii7xxms"> <span class="astro-3ii7xxms">Tutorial - Check plan cancellation eligibility</span> </a> </li> </ul> </details> </li><li class="astro-3ii7xxms"> <details open class="astro-3ii7xxms"> <sl-sidebar-restore data-index="62"></sl-sidebar-restore> <summary class="astro-3ii7xxms"> <div class="group-label astro-3ii7xxms"> <span class="large astro-3ii7xxms">Configuration</span> </div> <svg aria-hidden="true" class="caret astro-3ii7xxms astro-c6vsoqas" width="16" height="16" viewB
275ox="0 0 24 24" fill="currentColor" style="--sl-icon-size: 1.25rem;"><path d="m14.83 11.29-4.24-4.24a1 1 0 1 0-1.42 1.41L12.71 12l-3.54 3.54a1 1 0 0 0 0 1.41 1 1 0 0 0 .71.29 1 1 0 0 0 .71-.29l4.24-4.24a1.002 1.002 0 0 0 0-1.42Z"/></svg> </summary> <ul class="astro-3ii7xxms"> <li class="astro-3ii7xxms"> <a href="/workflows/configuration/bindings/" aria-current="false" class="astro-3ii7xxms"> <span class="astro-3ii7xxms">Bindings</span> </a> </li><li class="astro-3ii7xxms"> <a href="/workflows/configuration/dependencies/" aria-current="false" class="astro-3ii7xxms"> <span class="astro-3ii7xxms">Dependencies</span> </a> </li><li class="astro-3ii7xxms"> <a href="/workflows/configuration/environment-variables-and-secrets/" aria-current="false" class="astro-3ii7xxms"> <span class="astro-3ii7xxms">Environment variables and secrets</span> </a> </li><li class="astro-3ii7xxms"> <a href="/workflows/configuration/kinde-json/" aria-current="false" class="astro-3ii7xxms"> <span class="astro-3ii7xxms">kinde.json</span> </a> </li><li class="astro-3ii7xxms"> <a href="/workflows/configuration/workflow-settings/" aria-current="false" class="astro-3ii7xxms"> <span class="astro-3ii7xxms">Workflow settings</span> </a> </li> </ul> </details> </li><li class="astro-3ii7xxms"> <details open class="astro-3ii7xxms"> <sl-sidebar-restore data-index="63"></sl-sidebar-restore> <summary class="astro-3ii7xxms"> <div class="group-label astro-3ii7xxms"> <span class="large astro-3ii7xxms">Bindings</span> </div> <svg aria-hidden="true" class="caret astro-3ii7xxms astro-c6vsoqas" width="16" height="16" viewBox="0 0 24 24" fill="currentColor" style="--sl-icon-size: 1.25rem;"><path d="m14.83 11.29-4.24-4.24a1 1 0 1 0-1.42 1.41L12.71 12l-3.54 3.54a1 1 0 0 0 0 1.41 1 1 0 0 0 .71.29 1 1 0 0 0 .71-.29l4.24-4.24a1.002 1.002 0 0 0 0-1.42Z"/></svg> </summary> <ul class="astro-3ii7xxms"> <li class="astro-3ii7xxms"> <a href="/workflows/bindings/" aria-current="false" class="astro-3ii7xxms"> <span class="astro-3ii7xxms">Bindings overview</span> </a> </li><li class="astro-3ii7xxms"> <a href="/workflows/bindings/access-token-binding/" aria-current="false" class="astro-3ii7xxms"> <span class="astro-3ii7xxms">kinde.accessToken</span> </a> </li><li class="astro-3ii7xxms"> <a href="/workflows/bindings/auth-binding/" aria-current="false" class="astro-3ii7xxms"> <span class="astro-3ii7xxms">kinde.auth</span> </a> </li><li class="astro-3ii7xxms"> <a href="/workflows/bindings/env-binding/" aria-current="false" class="astro-3ii7xxms"> <span class="astro-3ii7xxms">kinde.env</span> </a> </li><li class="astro-3ii7xxms"> <a href="/workflows/bindings/fetch-binding/" aria-current="false" class="astro-3ii7xxms"> <span class="astro-3ii7xxms">kinde.fetch</span> </a> </li><li class="astro-3ii7xxms"> <a href="/workflows/bindings/id-token-binding/" aria-current="false" class="astro-3ii7xxms"> <span class="astro-3ii7xxms">kinde.idToken</span> </a> </li><li class="astro-3ii7xxms"> <a href="/workflows/bindings/m2m-token-binding/" aria-current="false" class="astro-3ii7xxms"> <span class="astro-3ii7xxms">kinde.m2mToken</span> </a> </li><li class="astro-3ii7xxms"> <a href="/workflows/bindings/mfa-binding/" aria-current="false" class="astro-3ii7xxms"> <span class="astro-3ii7xxms">kinde.mfa</span> </a> </li><li class="astro-3ii7xxms"> <a href="/workflows/bindings/plan-binding/" aria-current="false" class="astro-3ii7xxms"> <span class="astro-3ii7xxms">kinde.plan</span> </a> </li><li class="astro-3ii7xxms"> <a href="/workflows/bindings/secure-fetch-binding/" aria-current="false" class="astro-3ii7xxms"> <span class="astro-3ii7xxms">kinde.secureFetch</span> </a> </li><li class="astro-3ii7xxms"> <a href="/workflows/bindings/url-binding/" aria-current="false" class="astro-3ii7xxms"> <span class="astro-3ii7xxms">url</span> </a> </li> </ul> </details> </li><li class="astro-3ii7xxms"> <details open class="astro-3ii7xxms"> <sl-sidebar-restore data-index="64"></sl-sidebar-restore> <summary class="astro-3ii7xxms"> <div class="group-label astro-3ii7xxms"> <span class="large astro-3ii7xxms">Triggers</span> </div> <svg aria-hidden="true" class="caret astro-3ii7xxms astro-c6vsoqas" width="16" height="16" viewB
275ox="0 0 24 24" fill="currentColor" style="--sl-icon-size: 1.25rem;"><path d="m14.83 11.29-4.24-4.24a1 1 0 1 0-1.42 1.41L12.71 12l-3.54 3.54a1 1 0 0 0 0 1.41 1 1 0 0 0 .71.29 1 1 0 0 0 .71-.29l4.24-4.24a1.002 1.002 0 0 0 0-1.42Z"/></svg> </summary> <ul class="astro-3ii7xxms"> <li class="astro-3ii7xxms"> <a href="/workflows/example-workflows/pre-user-registration-workflow/" aria-current="false" class="astro-3ii7xxms"> <span class="astro-3ii7xxms">User pre-registration workflow</span> </a> </li><li class="astro-3ii7xxms"> <a href="/workflows/example-workflows/workflow-user-post-auth/" aria-current="false" class="astro-3ii7xxms"> <span class="astro-3ii7xxms">User post-authentication workflow</span> </a> </li><li class="astro-3ii7xxms"> <a href="/workflows/example-workflows/user-token-generation/" aria-current="false" class="astro-3ii7xxms"> <span class="astro-3ii7xxms">User token generation workflow</span> </a> </li><li class="astro-3ii7xxms"> <a href="/workflows/example-workflows/plan-cancellation-request-workflow/" aria-current="false" class="astro-3ii7xxms"> <span class="astro-3ii7xxms">Plan cancellation request workflow</span> </a> </li><li class="astro-3ii7xxms"> <a href="/workflows/example-workflows/plan-selection-workflow/" aria-current="false" class="astro-3ii7xxms"> <span class="astro-3ii7xxms">Plan selection workflow</span> </a> </li><li class="astro-3ii7xxms"> <a href="/workflows/example-workflows/new-password-provided-workflow/" aria-current="false" class="astro-3ii7xxms"> <span class="astro-3ii7xxms">New password provided workflow</span> </a> </li><li class="astro-3ii7xxms"> <a href="/workflows/example-workflows/m2m-token-generation-workflow/" aria-current="false" class="astro-3ii7xxms"> <span class="astro-3ii7xxms">M2M token generation workflow</span> </a> </li><li class="astro-3ii7xxms"> <a href="/workflows/example-workflows/pre-mfa-workflow/" aria-current="false" class="astro-3ii7xxms"> <span class="astro-3ii7xxms">Pre-MFA workflow</span> </a> </li><li class="astro-3ii7xxms"> <a href="/workflows/example-workflows/existing-password-provided-workflow/" aria-current="false" class="astro-3ii7xxms"> <span class="astro-3ii7xxms">Existing password provided workflow</span> </a> </li> </ul> </details> </li><li class="astro-3ii7xxms"> <details open class="astro-3ii7xxms"> <sl-sidebar-restore data-index="65"></sl-sidebar-restore> <summary class="astro-3ii7xxms"> <div class="group-label astro-3ii7xxms"> <span class="large astro-3ii7xxms">Manage workflows</span> </div> <svg aria-hidden="true" class="caret astro-3ii7xxms astro-c6vsoqas" width="16" height="16" viewBox="0 0 24 24" fill="currentColor" style="--sl-icon-size: 1.25rem;"><path d="m14.83 11.29-4.24-4.24a1 1 0 1 0-1.42 1.41L12.71 12l-3.54 3.54a1 1 0 0 0 0 1.41 1 1 0 0 0 .71.29 1 1 0 0 0 .71-.29l4.24-4.24a1.002 1.002 0 0 0 0-1.42Z"/></svg> </summary> <ul class="astro-3ii7xxms"> <li class="astro-3ii7xxms"> <a href="/workflows/manage-workflows/create-workflow/" aria-current="false" class="astro-3ii7xxms"> <span class="astro-3ii7xxms">Create a workflow</span> </a> </li><li class="astro-3ii7xxms"> <a href="/workflows/manage-workflows/manage-code-and-deployments/" aria-current="false" class="astro-3ii7xxms"> <span class="astro-3ii7xxms">Manage code and deployments</span> </a> </li><li class="astro-3ii7xxms"> <a href="/workflows/manage-workflows/encrypt-decrypt-workflows/" aria-current="false" class="astro-3ii7xxms"> <span class="astro-3ii7xxms">Workflow encryption key</span> </a> </li><li class="astro-3ii7xxms"> <a href="/workflows/manage-workflows/deactivate-delete-workflow/" aria-current="false" class="astro-3ii7xxms"> <span class="astro-3ii7xxms">Deactivate or delete a workflow</span> </a> </li><li class="astro-3ii7xxms"> <a href="/workflows/manage-workflows/disconnect-git-repo-for-workflows/" aria-current="false" class="astro-3ii7xxms"> <span class="astro-3ii7xxms">Disconnect Git repo for workflows</span> </a> </li> </ul> </details> </li><li class="astro-3ii7xxms"> <details open class="astro-3ii7xxms"> <sl-sidebar-restore data-index="66"></sl-sidebar-restore> <summary class="astro-3ii7xxms"> <div class="group-label astro-3ii7xxms"> <span class="large astro-3ii7xxms">Testing</span> </div> <svg aria-hidden="true" class="caret astro-3ii7xxms astro-c6vsoqas" width="16" height="16" viewB
275ox="0 0 24 24" fill="currentColor" style="--sl-icon-size: 1.25rem;"><path d="m14.83 11.29-4.24-4.24a1 1 0 1 0-1.42 1.41L12.71 12l-3.54 3.54a1 1 0 0 0 0 1.41 1 1 0 0 0 .71.29 1 1 0 0 0 .71-.29l4.24-4.24a1.002 1.002 0 0 0 0-1.42Z"/></svg> </summary> <ul class="astro-3ii7xxms"> <li class="astro-3ii7xxms"> <a href="/workflows/testing/" aria-current="false" class="astro-3ii7xxms"> <span class="astro-3ii7xxms">Testing workflows</span> </a> </li><li class="astro-3ii7xxms"> <a href="/workflows/testing/preview-workflows/" aria-current="false" class="astro-3ii7xxms"> <span class="astro-3ii7xxms">Preview workflows</span> </a> </li> </ul> </details> </li><li class="astro-3ii7xxms"> <details open class="astro-3ii7xxms"> <sl-sidebar-restore data-index="67"></sl-sidebar-restore> <summary class="astro-3ii7xxms"> <div class="group-label astro-3ii7xxms"> <span class="large astro-3ii7xxms">Observability</span> </div> <svg aria-hidden="true" class="caret astro-3ii7xxms astro-c6vsoqas" width="16" height="16" viewBox="0 0 24 24" fill="currentColor" style="--sl-icon-size: 1.25rem;"><path d="m14.83 11.29-4.24-4.24a1 1 0 1 0-1.42 1.41L12.71 12l-3.54 3.54a1 1 0 0 0 0 1.41 1 1 0 0 0 .71.29 1 1 0 0 0 .71-.29l4.24-4.24a1.002 1.002 0 0 0 0-1.42Z"/></svg> </summary> <ul class="astro-3ii7xxms"> <li class="astro-3ii7xxms"> <a href="/workflows/observability/workflow-build-logs/" aria-current="false" class="astro-3ii7xxms"> <span class="astro-3ii7xxms">Workflow build logs</span> </a> </li><li class="astro-3ii7xxms"> <a href="/workflows/observability/workflow-logs/" aria-current="false" class="astro-3ii7xxms"> <span class="astro-3ii7xxms">Workflow logs</span> </a> </li><li class="astro-3ii7xxms"> <a href="/workflows/observability/workflow-runtime-logs/" aria-current="false" class="astro-3ii7xxms"> <span class="astro-3ii7xxms">Workflow runtime logs</span> </a> </li><li class="astro-3ii7xxms"> <a href="/workflows/observability/workflow-sync-logs/" aria-current="false" class="astro-3ii7xxms"> <span class="astro-3ii7xxms">Workflow sync logs</span> </a> </li> </ul> </details> </li> </ul> </details> </li><li class="astro-3ii7xxms"> <details class="astro-3ii7xxms"> <sl-sidebar-restore data-index="68"></sl-sidebar-restore> <summary class="astro-3ii7xxms"> <div class="group-label astro-3ii7xxms"> <span class="large astro-3ii7xxms">Properties</span> </div> <svg aria-hidden="true" class="caret astro-3ii7xxms astro-c6vsoqas" width="16" height="16" viewBox="0 0 24 24" fill="currentColor" style="--sl-icon-size: 1.25rem;"><path d="m14.83 11.29-4.24-4.24a1 1 0 1 0-1.42 1.41L12.71 12l-3.54 3.54a1 1 0 0 0 0 1.41 1 1 0 0 0 .71.29 1 1 0 0 0 .71-.29l4.24-4.24a1.002 1.002 0 0 0 0-1.42Z"/></svg> </summary> <ul class="astro-3ii7xxms"> <li class="astro-3ii7xxms"> <details open class="astro-3ii7xxms"> <sl-sidebar-restore data-index="69"></sl-sidebar-restore> <summary class="astro-3ii7xxms"> <div class="group-label astro-3ii7xxms"> <span class="large astro-3ii7xxms">About properties</span> </div> <svg aria-hidden="true" class="caret astro-3ii7xxms astro-c6vsoqas" width="16" height="16" viewBox="0 0 24 24" fill="currentColor" style="--sl-icon-size: 1.25rem;"><path d="m14.83 11.29-4.24-4.24a1 1 0 1 0-1.42 1.41L12.71 12l-3.54 3.54a1 1 0 0 0 0 1.41 1 1 0 0 0 .71.29 1 1 0 0 0 .71-.29l4.24-4.24a1.002 1.002 0 0 0 0-1.42Z"/></svg> </summary> <ul class="astro-3ii7xxms"> <li class="astro-3ii7xxms"> <a href="/properties/about-properties/" aria-current="false" class="astro-3ii7xxms"> <span class="astro-3ii7xxms">Custom claims and data with properties</span> </a> </li><li class="astro-3ii7xxms"> <a href="/properties/about-properties/organization-properties/" aria-current="false" class="astro-3ii7xxms"> <span class="astro-3ii7xxms">Add custom data for orgs</span> </a> </li><li class="astro-3ii7xxms"> <a href="/properties/about-properties/application-properties/" aria-current="false" class="astro-3ii7xxms"> <span class="astro-3ii7xxms">View and edit application properties</span> </a> </li> </ul> </details> </li><li class="astro-3ii7xxms"> <details open class="astro-3ii7xxms"> <sl-sidebar-restore data-index="70"></sl-sidebar-restore> <summary class="astro-3ii7xxms"> <div class="group-label astro-3ii7xxms"> <span class="large astro-3ii7xxms">Work with properties</span> </div> <svg aria-hidden="true" class="caret astro-3ii7xxms astro-c6vsoqas" width="16" height="16" viewB
275ox="0 0 24 24" fill="currentColor" style="--sl-icon-size: 1.25rem;"><path d="m14.83 11.29-4.24-4.24a1 1 0 1 0-1.42 1.41L12.71 12l-3.54 3.54a1 1 0 0 0 0 1.41 1 1 0 0 0 .71.29 1 1 0 0 0 .71-.29l4.24-4.24a1.002 1.002 0 0 0 0-1.42Z"/></svg> </summary> <ul class="astro-3ii7xxms"> <li class="astro-3ii7xxms"> <a href="/properties/work-with-properties/manage-properties/" aria-current="false" class="astro-3ii7xxms"> <span class="astro-3ii7xxms">Add and manage custom data with properties</span> </a> </li><li class="astro-3ii7xxms"> <a href="/properties/work-with-properties/properties-in-tokens/" aria-current="false" class="astro-3ii7xxms"> <span class="astro-3ii7xxms">Customize tokens using properties</span> </a> </li><li class="astro-3ii7xxms"> <a href="/properties/work-with-properties/property-groups/" aria-current="false" class="astro-3ii7xxms"> <span class="astro-3ii7xxms">Add and manage property categories</span> </a> </li><li class="astro-3ii7xxms"> <a href="/properties/work-with-properties/view-user-properties/" aria-current="false" class="astro-3ii7xxms"> <span class="astro-3ii7xxms">Edit custom data for users via properties</span> </a> </li><li class="astro-3ii7xxms"> <a href="/properties/work-with-properties/marketing-tags-properties/" aria-current="false" class="astro-3ii7xxms"> <span class="astro-3ii7xxms">Add marketing tags using properties</span> </a> </li> </ul> </details> </li> </ul> </details> </li><li class="astro-3ii7xxms"> <details class="astro-3ii7xxms"> <sl-sidebar-restore data-index="71"></sl-sidebar-restore> <summary class="astro-3ii7xxms"> <div class="group-label astro-3ii7xxms"> <span class="large astro-3ii7xxms">Machine-to-Machine (M2M)</span> </div> <svg aria-hidden="true" class="caret astro-3ii7xxms astro-c6vsoqas" width="16" height="16" viewBox="0 0 24 24" fill="currentColor" style="--sl-icon-size: 1.25rem;"><path d="m14.83 11.29-4.24-4.24a1 1 0 1 0-1.42 1.41L12.71 12l-3.54 3.54a1 1 0 0 0 0 1.41 1 1 0 0 0 .71.29 1 1 0 0 0 .71-.29l4.24-4.24a1.002 1.002 0 0 0 0-1.42Z"/></svg> </summary> <ul class="astro-3ii7xxms"> <li class="astro-3ii7xxms"> <details open class="astro-3ii7xxms"> <sl-sidebar-restore data-index="72"></sl-sidebar-restore> <summary class="astro-3ii7xxms"> <div class="group-label astro-3ii7xxms"> <span class="large astro-3ii7xxms">Overview</span> </div> <svg aria-hidden="true" class="caret astro-3ii7xxms astro-c6vsoqas" width="16" height="16" viewBox="0 0 24 24" fill="currentColor" style="--sl-icon-size: 1.25rem;"><path d="m14.83 11.29-4.24-4.24a1 1 0 1 0-1.42 1.41L12.71 12l-3.54 3.54a1 1 0 0 0 0 1.41 1 1 0 0 0 .71.29 1 1 0 0 0 .71-.29l4.24-4.24a1.002 1.002 0 0 0 0-1.42Z"/></svg> </summary> <ul class="astro-3ii7xxms"> <li class="astro-3ii7xxms"> <a href="/machine-to-machine-applications/about-m2m/" aria-current="false" class="astro-3ii7xxms"> <span class="astro-3ii7xxms">M2M overview</span> </a> </li><li class="astro-3ii7xxms"> <a href="/machine-to-machine-applications/about-m2m/m2m-quick-start-guide/" aria-current="false" class="astro-3ii7xxms"> <span class="astro-3ii7xxms">M2M quick start</span> </a> </li><li class="astro-3ii7xxms"> <a href="/machine-to-machine-applications/about-m2m/authenticate-with-m2m/" aria-current="false" class="astro-3ii7xxms"> <span class="astro-3ii7xxms">Authenticate with M2M applications</span> </a> </li><li class="astro-3ii7xxms"> <a href="/machine-to-machine-applications/about-m2m/token-structure-and-claims-for-m2m-applications/" aria-current="false" class="astro-3ii7xxms"> <span class="astro-3ii7xxms">Token structure and claims</span> </a> </li><li class="astro-3ii7xxms"> <a href="/machine-to-machine-applications/about-m2m/m2m-faqs/" aria-current="false" class="astro-3ii7xxms"> <span class="astro-3ii7xxms">Top questions about M2M applications</span> </a> </li> </ul> </details> </li><li class="astro-3ii7xxms"> <details open class="astro-3ii7xxms"> <sl-sidebar-restore data-index="73"></sl-sidebar-restore> <summary class="astro-3ii7xxms"> <div class="group-label astro-3ii7xxms"> <span class="large astro-3ii7xxms">M2M application setup</span> </div> <svg aria-hidden="true" class="caret astro-3ii7xxms astro-c6vsoqas" width="16" height="16" viewB
275ox="0 0 24 24" fill="currentColor" style="--sl-icon-size: 1.25rem;"><path d="m14.83 11.29-4.24-4.24a1 1 0 1 0-1.42 1.41L12.71 12l-3.54 3.54a1 1 0 0 0 0 1.41 1 1 0 0 0 .71.29 1 1 0 0 0 .71-.29l4.24-4.24a1.002 1.002 0 0 0 0-1.42Z"/></svg> </summary> <ul class="astro-3ii7xxms"> <li class="astro-3ii7xxms"> <a href="/machine-to-machine-applications/m2m-application-setup/create-an-m2m-application/" aria-current="false" class="astro-3ii7xxms"> <span class="astro-3ii7xxms">Create an M2M application</span> </a> </li><li class="astro-3ii7xxms"> <a href="/machine-to-machine-applications/m2m-application-setup/scopes-for-m2m-applications/" aria-current="false" class="astro-3ii7xxms"> <span class="astro-3ii7xxms">M2M application API scopes</span> </a> </li><li class="astro-3ii7xxms"> <a href="/machine-to-machine-applications/m2m-application-setup/add-metadata-to-an-m2m-application-with-properties/" aria-current="false" class="astro-3ii7xxms"> <span class="astro-3ii7xxms">Add metadata to an M2M app using properties</span> </a> </li><li class="astro-3ii7xxms"> <a href="/machine-to-machine-applications/m2m-application-setup/add-feature-flags-to-m2m-applications/" aria-current="false" class="astro-3ii7xxms"> <span class="astro-3ii7xxms">Assign feature flags for use in M2M tokens</span> </a> </li> </ul> </details> </li><li class="astro-3ii7xxms"> <details open class="astro-3ii7xxms"> <sl-sidebar-restore data-index="74"></sl-sidebar-restore> <summary class="astro-3ii7xxms"> <div class="group-label astro-3ii7xxms"> <span class="large astro-3ii7xxms">Organization-scoped M2M apps</span> </div> <svg aria-hidden="true" class="caret astro-3ii7xxms astro-c6vsoqas" width="16" height="16" viewBox="0 0 24 24" fill="currentColor" style="--sl-icon-size: 1.25rem;"><path d="m14.83 11.29-4.24-4.24a1 1 0 1 0-1.42 1.41L12.71 12l-3.54 3.54a1 1 0 0 0 0 1.41 1 1 0 0 0 .71.29 1 1 0 0 0 .71-.29l4.24-4.24a1.002 1.002 0 0 0 0-1.42Z"/></svg> </summary> <ul class="astro-3ii7xxms"> <li class="astro-3ii7xxms"> <a href="/machine-to-machine-applications/organization-scoped-m2m-apps/m2m-applications-for-organizations/" aria-current="false" class="astro-3ii7xxms"> <span class="astro-3ii7xxms">M2M apps scoped to organizations</span> </a> </li><li class="astro-3ii7xxms"> <a href="/machine-to-machine-applications/organization-scoped-m2m-apps/enforce-org-m2m-access-in-your-api/" aria-current="false" class="astro-3ii7xxms"> <span class="astro-3ii7xxms">Enforce org access in your API using M2M tokens</span> </a> </li><li class="astro-3ii7xxms"> <a href="/machine-to-machine-applications/organization-scoped-m2m-apps/using-m2m-apps-for-ai-applications/" aria-current="false" class="astro-3ii7xxms"> <span class="astro-3ii7xxms">Using M2M apps for AI applications</span> </a> </li> </ul> </details> </li><li class="astro-3ii7xxms"> <details open class="astro-3ii7xxms"> <sl-sidebar-restore data-index="75"></sl-sidebar-restore> <summary class="astro-3ii7xxms"> <div class="group-label astro-3ii7xxms"> <span class="large astro-3ii7xxms">M2M token customization</span> </div> <svg aria-hidden="true" class="caret astro-3ii7xxms astro-c6vsoqas" width="16" height="16" viewBox="0 0 24 24" fill="currentColor" style="--sl-icon-size: 1.25rem;"><path d="m14.83 11.29-4.24-4.24a1 1 0 1 0-1.42 1.41L12.71 12l-3.54 3.54a1 1 0 0 0 0 1.41 1 1 0 0 0 .71.29 1 1 0 0 0 .71-.29l4.24-4.24a1.002 1.002 0 0 0 0-1.42Z"/></svg> </summary> <ul class="astro-3ii7xxms"> <li class="astro-3ii7xxms"> <a href="/machine-to-machine-applications/m2m-token-customization/customize-m2m-tokens/" aria-current="false" class="astro-3ii7xxms"> <span class="astro-3ii7xxms">Customize the claims of an M2M token</span> </a> </li> </ul> </details> </li><li class="astro-3ii7xxms"> <details open class="astro-3ii7xxms"> <sl-sidebar-restore data-index="76"></sl-sidebar-restore> <summary class="astro-3ii7xxms"> <div class="group-label astro-3ii7xxms"> <span class="large astro-3ii7xxms">Automation</span> </div> <svg aria-hidden="true" class="caret astro-3ii7xxms astro-c6vsoqas" width="16" height="16" viewBox="0 0 24 24" fill="currentColor" style="--sl-icon-size: 1.25rem;"><path d="m14.83 11.29-4.24-4.24a1 1 0 1 0-1.42 1.41L12.71 12l-3.54 3.54a1 1 0 0 0 0 1.41 1 1 0 0 0 .71.29 1 1 0 0 0 .71-.29l4.24-4.24a1.002 1.002 0 0 0 0-1.42Z"/></svg> </summary> <ul class="astro-3ii7xxms"> <li class="astro-3ii7xxms"> <a href="/machine-to-machine-applications/m2m-workflow-automation/m2m-workflow/" aria-current="false" class="astro-3ii7xxms"> <span class="astro-3ii7xxms">Trigger workflows when an M2M token is generated</span> </a> </li> </ul> </details> </li><li class="astro-3ii7xxms"> <details open class="astro-3ii7xxms"> <sl-sidebar-restore data-index="77"></sl-sidebar-restore> <summary class="astro-3ii7xxms"> <div class="group-label astro-3ii7xxms"> <span class="large astro-3ii7xxms">Troubleshooting</span> </div> <svg aria-hidden="true" class="caret astro-3ii7xxms astro-c6vsoqas" width="16" height="16" viewB
275ox="0 0 24 24" fill="currentColor" style="--sl-icon-size: 1.25rem;"><path d="m14.83 11.29-4.24-4.24a1 1 0 1 0-1.42 1.41L12.71 12l-3.54 3.54a1 1 0 0 0 0 1.41 1 1 0 0 0 .71.29 1 1 0 0 0 .71-.29l4.24-4.24a1.002 1.002 0 0 0 0-1.42Z"/></svg> </summary> <ul class="astro-3ii7xxms"> <li class="astro-3ii7xxms"> <a href="/machine-to-machine-applications/troubleshooting-m2m/troubleshoot-m2m-token-errors/" aria-current="false" class="astro-3ii7xxms"> <span class="astro-3ii7xxms">Troubleshoot M2M token errors</span> </a> </li> </ul> </details> </li> </ul> </details> </li><li class="astro-3ii7xxms"> <details class="astro-3ii7xxms"> <sl-sidebar-restore data-index="78"></sl-sidebar-restore> <summary class="astro-3ii7xxms"> <div class="group-label astro-3ii7xxms"> <span class="large astro-3ii7xxms">Manage users</span> </div> <svg aria-hidden="true" class="caret astro-3ii7xxms astro-c6vsoqas" width="16" height="16" viewBox="0 0 24 24" fill="currentColor" style="--sl-icon-size: 1.25rem;"><path d="m14.83 11.29-4.24-4.24a1 1 0 1 0-1.42 1.41L12.71 12l-3.54 3.54a1 1 0 0 0 0 1.41 1 1 0 0 0 .71.29 1 1 0 0 0 .71-.29l4.24-4.24a1.002 1.002 0 0 0 0-1.42Z"/></svg> </summary> <ul class="astro-3ii7xxms"> <li class="astro-3ii7xxms"> <details open class="astro-3ii7xxms"> <sl-sidebar-restore data-index="79"></sl-sidebar-restore> <summary class="astro-3ii7xxms"> <div class="group-label astro-3ii7xxms"> <span class="large astro-3ii7xxms">Overview</span> </div> <svg aria-hidden="true" class="caret astro-3ii7xxms astro-c6vsoqas" width="16" height="16" viewBox="0 0 24 24" fill="currentColor" style="--sl-icon-size: 1.25rem;"><path d="m14.83 11.29-4.24-4.24a1 1 0 1 0-1.42 1.41L12.71 12l-3.54 3.54a1 1 0 0 0 0 1.41 1 1 0 0 0 .71.29 1 1 0 0 0 .71-.29l4.24-4.24a1.002 1.002 0 0 0 0-1.42Z"/></svg> </summary> <ul class="astro-3ii7xxms"> <li class="astro-3ii7xxms"> <a href="/manage-users/about/" aria-current="false" class="astro-3ii7xxms"> <span class="astro-3ii7xxms">About user management</span> </a> </li><li class="astro-3ii7xxms"> <a href="/manage-users/about/manage-users-across-organizations/" aria-current="false" class="astro-3ii7xxms"> <span class="astro-3ii7xxms">Manage users across organizations</span> </a> </li> </ul> </details> </li><li class="astro-3ii7xxms"> <details open class="astro-3ii7xxms"> <sl-sidebar-restore data-index="80"></sl-sidebar-restore> <summary class="astro-3ii7xxms"> <div class="group-label astro-3ii7xxms"> <span class="large astro-3ii7xxms">Add and edit</span> </div> <svg aria-hidden="true" class="caret astro-3ii7xxms astro-c6vsoqas" width="16" height="16" viewBox="0 0 24 24" fill="currentColor" style="--sl-icon-size: 1.25rem;"><path d="m14.83 11.29-4.24-4.24a1 1 0 1 0-1.42 1.41L12.71 12l-3.54 3.54a1 1 0 0 0 0 1.41 1 1 0 0 0 .71.29 1 1 0 0 0 .71-.29l4.24-4.24a1.002 1.002 0 0 0 0-1.42Z"/></svg> </summary> <ul class="astro-3ii7xxms"> <li class="astro-3ii7xxms"> <a href="/manage-users/add-and-edit/add-and-edit-users/" aria-current="false" class="astro-3ii7xxms"> <span class="astro-3ii7xxms">Manually add and edit users</span> </a> </li><li class="astro-3ii7xxms"> <a href="/manage-users/add-and-edit/add-manage-user-identities/" aria-current="false" class="astro-3ii7xxms"> <span class="astro-3ii7xxms">Add and manage user identities</span> </a> </li><li class="astro-3ii7xxms"> <a href="/manage-users/add-and-edit/import-users-in-bulk/" aria-current="false" class="astro-3ii7xxms"> <span class="astro-3ii7xxms">Import users via CSV or JSON</span> </a> </li><li class="astro-3ii7xxms"> <a href="/manage-users/add-and-edit/import-users-from-auth0/" aria-current="false" class="astro-3ii7xxms"> <span class="astro-3ii7xxms">Import users in bulk from Auth0</span> </a> </li><li class="astro-3ii7xxms"> <a href="/manage-users/add-and-edit/troubleshoot-user-import-errors/" aria-current="false" class="astro-3ii7xxms"> <span class="astro-3ii7xxms">Troubleshoot user import errors</span> </a> </li><li class="astro-3ii7xxms"> <a href="/manage-users/add-and-edit/manage-subscribers/" aria-current="false" class="astro-3ii7xxms"> <span class="astro-3ii7xxms">Manage subscribers</span> </a> </li><li class="astro-3ii7xxms"> <a href="/manage-users/add-and-edit/move-users/" aria-current="false" class="astro-3ii7xxms"> <span class="astro-3ii7xxms">Move users between Kinde environments and businesses</span> </a> </li><li class="astro-3ii7xxms"> <a href="/manage-users/add-and-edit/send-invitations-webhook/" aria-current="false" class="astro-3ii7xxms"> <span class="astro-3ii7xxms">Send user invitations with webhooks</span> </a> </li> </ul> </details> </li><li class="astro-3ii7xxms"> <details open class="astro-3ii7xxms"> <sl-sidebar-restore data-index="81"></sl-sidebar-restore> <summary class="astro-3ii7xxms"> <div class="group-label astro-3ii7xxms"> <span class="large astro-3ii7xxms">Access control</span> </div> <svg aria-hidden="true" class="caret astro-3ii7xxms astro-c6vsoqas" width="16" height="16" viewB
275ox="0 0 24 24" fill="currentColor" style="--sl-icon-size: 1.25rem;"><path d="m14.83 11.29-4.24-4.24a1 1 0 1 0-1.42 1.41L12.71 12l-3.54 3.54a1 1 0 0 0 0 1.41 1 1 0 0 0 .71.29 1 1 0 0 0 .71-.29l4.24-4.24a1.002 1.002 0 0 0 0-1.42Z"/></svg> </summary> <ul class="astro-3ii7xxms"> <li class="astro-3ii7xxms"> <a href="/manage-users/access-control/delete-or-suspend-users/" aria-current="false" class="astro-3ii7xxms"> <span class="astro-3ii7xxms">Delete or suspend users</span> </a> </li><li class="astro-3ii7xxms"> <a href="/manage-users/access-control/reset-user-password/" aria-current="false" class="astro-3ii7xxms"> <span class="astro-3ii7xxms">Reset a user's password</span> </a> </li><li class="astro-3ii7xxms"> <a href="/manage-users/access-control/set-temporary-password/" aria-current="false" class="astro-3ii7xxms"> <span class="astro-3ii7xxms">Set temporary password</span> </a> </li><li class="astro-3ii7xxms"> <a href="/manage-users/access-control/reset-multi-factor-authentication-for-a-user/" aria-current="false" class="astro-3ii7xxms"> <span class="astro-3ii7xxms">Reset multi-factor authentication for a user</span> </a> </li> </ul> </details> </li><li class="astro-3ii7xxms"> <details open class="astro-3ii7xxms"> <sl-sidebar-restore data-index="82"></sl-sidebar-restore> <summary class="astro-3ii7xxms"> <div class="group-label astro-3ii7xxms"> <span class="large astro-3ii7xxms">Roles and permissions</span> </div> <svg aria-hidden="true" class="caret astro-3ii7xxms astro-c6vsoqas" width="16" height="16" viewBox="0 0 24 24" fill="currentColor" style="--sl-icon-size: 1.25rem;"><path d="m14.83 11.29-4.24-4.24a1 1 0 1 0-1.42 1.41L12.71 12l-3.54 3.54a1 1 0 0 0 0 1.41 1 1 0 0 0 .71.29 1 1 0 0 0 .71-.29l4.24-4.24a1.002 1.002 0 0 0 0-1.42Z"/></svg> </summary> <ul class="astro-3ii7xxms"> <li class="astro-3ii7xxms"> <a href="/manage-users/roles-and-permissions/user-permissions/" aria-current="false" class="astro-3ii7xxms"> <span class="astro-3ii7xxms">Define user permissions</span> </a> </li><li class="astro-3ii7xxms"> <a href="/manage-users/roles-and-permissions/user-roles/" aria-current="false" class="astro-3ii7xxms"> <span class="astro-3ii7xxms">Manage user roles</span> </a> </li><li class="astro-3ii7xxms"> <a href="/manage-users/roles-and-permissions/apply-roles-and-permissions-to-users/" aria-current="false" class="astro-3ii7xxms"> <span class="astro-3ii7xxms">Apply roles and permissions to users</span> </a> </li><li class="astro-3ii7xxms"> <a href="/manage-users/roles-and-permissions/default-user-roles/" aria-current="false" class="astro-3ii7xxms"> <span class="astro-3ii7xxms">Set default user roles</span> </a> </li> </ul> </details> </li><li class="astro-3ii7xxms"> <details open class="astro-3ii7xxms"> <sl-sidebar-restore data-index="83"></sl-sidebar-restore> <summary class="astro-3ii7xxms"> <div class="group-label astro-3ii7xxms"> <span class="large astro-3ii7xxms">View activity</span> </div> <svg aria-hidden="true" class="caret astro-3ii7xxms astro-c6vsoqas" width="16" height="16" viewBox="0 0 24 24" fill="currentColor" style="--sl-icon-size: 1.25rem;"><path d="m14.83 11.29-4.24-4.24a1 1 0 1 0-1.42 1.41L12.71 12l-3.54 3.54a1 1 0 0 0 0 1.41 1 1 0 0 0 .71.29 1 1 0 0 0 .71-.29l4.24-4.24a1.002 1.002 0 0 0 0-1.42Z"/></svg> </summary> <ul class="astro-3ii7xxms"> <li class="astro-3ii7xxms"> <a href="/manage-users/view-activity/view-audit-log/" aria-current="false" class="astro-3ii7xxms"> <span class="astro-3ii7xxms">View audit log</span> </a> </li><li class="astro-3ii7xxms"> <a href="/manage-users/view-activity/view-user-activity/" aria-current="false" class="astro-3ii7xxms"> <span class="astro-3ii7xxms">Audit log</span> </a> </li><li class="astro-3ii7xxms"> <a href="/manage-users/view-activity/third-party-tracking/" aria-current="false" class="astro-3ii7xxms"> <span class="astro-3ii7xxms">Third-party tracking scripts</span> </a> </li><li class="astro-3ii7xxms"> <a href="/manage-users/view-activity/track-user-sign-in-with-google-analytics/" aria-current="false" class="astro-3ii7xxms"> <span class="astro-3ii7xxms">Google Analytics</span> </a> </li><li class="astro-3ii7xxms"> <a href="/manage-users/view-activity/hotjar/" aria-current="false" class="astro-3ii7xxms"> <span class="astro-3ii7xxms">Hotjar</span> </a> </li><li class="astro-3ii7xxms"> <a href="/manage-users/view-activity/contentsquare/" aria-current="false" class="astro-3ii7xxms"> <span class="astro-3ii7xxms">Contentsquare</span> </a> </li> </ul> </details> </li> </ul> </details> </li><li class="astro-3ii7xxms"> <details class="astro-3ii7xxms"> <sl-sidebar-restore data-index="84"></sl-sidebar-restore> <summary class="astro-3ii7xxms"> <div class="group-label astro-3ii7xxms"> <span class="large astro-3ii7xxms">Features and releases</span> </div> <svg aria-hidden="true" class="caret astro-3ii7xxms astro-c6vsoqas" width="16" height="16" viewB
275ox="0 0 24 24" fill="currentColor" style="--sl-icon-size: 1.25rem;"><path d="m14.83 11.29-4.24-4.24a1 1 0 1 0-1.42 1.41L12.71 12l-3.54 3.54a1 1 0 0 0 0 1.41 1 1 0 0 0 .71.29 1 1 0 0 0 .71-.29l4.24-4.24a1.002 1.002 0 0 0 0-1.42Z"/></svg> </summary> <ul class="astro-3ii7xxms"> <li class="astro-3ii7xxms"> <details open class="astro-3ii7xxms"> <sl-sidebar-restore data-index="85"></sl-sidebar-restore> <summary class="astro-3ii7xxms"> <div class="group-label astro-3ii7xxms"> <span class="large astro-3ii7xxms">About</span> </div> <svg aria-hidden="true" class="caret astro-3ii7xxms astro-c6vsoqas" width="16" height="16" viewBox="0 0 24 24" fill="currentColor" style="--sl-icon-size: 1.25rem;"><path d="m14.83 11.29-4.24-4.24a1 1 0 1 0-1.42 1.41L12.71 12l-3.54 3.54a1 1 0 0 0 0 1.41 1 1 0 0 0 .71.29 1 1 0 0 0 .71-.29l4.24-4.24a1.002 1.002 0 0 0 0-1.42Z"/></svg> </summary> <ul class="astro-3ii7xxms"> <li class="astro-3ii7xxms"> <a href="/releases/about/about-feature-flags/" aria-current="false" class="astro-3ii7xxms"> <span class="astro-3ii7xxms">About feature flags</span> </a> </li> </ul> </details> </li><li class="astro-3ii7xxms"> <details open class="astro-3ii7xxms"> <sl-sidebar-restore data-index="86"></sl-sidebar-restore> <summary class="astro-3ii7xxms"> <div class="group-label astro-3ii7xxms"> <span class="large astro-3ii7xxms">Guides</span> </div> <svg aria-hidden="true" class="caret astro-3ii7xxms astro-c6vsoqas" width="16" height="16" viewBox="0 0 24 24" fill="currentColor" style="--sl-icon-size: 1.25rem;"><path d="m14.83 11.29-4.24-4.24a1 1 0 1 0-1.42 1.41L12.71 12l-3.54 3.54a1 1 0 0 0 0 1.41 1 1 0 0 0 .71.29 1 1 0 0 0 .71-.29l4.24-4.24a1.002 1.002 0 0 0 0-1.42Z"/></svg> </summary> <ul class="astro-3ii7xxms"> <li class="astro-3ii7xxms"> <a href="/releases/guides/guide-to-app-store-approvals/" aria-current="false" class="astro-3ii7xxms"> <span class="astro-3ii7xxms">Guide to app store reviews</span> </a> </li> </ul> </details> </li><li class="astro-3ii7xxms"> <details open class="astro-3ii7xxms"> <sl-sidebar-restore data-index="87"></sl-sidebar-restore> <summary class="astro-3ii7xxms"> <div class="group-label astro-3ii7xxms"> <span class="large astro-3ii7xxms">Feature flags</span> </div> <svg aria-hidden="true" class="caret astro-3ii7xxms astro-c6vsoqas" width="16" height="16" viewBox="0 0 24 24" fill="currentColor" style="--sl-icon-size: 1.25rem;"><path d="m14.83 11.29-4.24-4.24a1 1 0 1 0-1.42 1.41L12.71 12l-3.54 3.54a1 1 0 0 0 0 1.41 1 1 0 0 0 .71.29 1 1 0 0 0 .71-.29l4.24-4.24a1.002 1.002 0 0 0 0-1.42Z"/></svg> </summary> <ul class="astro-3ii7xxms"> <li class="astro-3ii7xxms"> <a href="/releases/feature-flags/add-feature-flag/" aria-current="false" class="astro-3ii7xxms"> <span class="astro-3ii7xxms">Add a feature flag in Kinde</span> </a> </li><li class="astro-3ii7xxms"> <a href="/releases/feature-flags/manage-feature-flags/" aria-current="false" class="astro-3ii7xxms"> <span class="astro-3ii7xxms">Manage feature flags</span> </a> </li><li class="astro-3ii7xxms"> <a href="/releases/feature-flags/edit-feature-flag/" aria-current="false" class="astro-3ii7xxms"> <span class="astro-3ii7xxms">Override feature flag values</span> </a> </li><li class="astro-3ii7xxms"> <a href="/releases/feature-flags/manage-feature-flags-api/" aria-current="false" class="astro-3ii7xxms"> <span class="astro-3ii7xxms">Manage feature flags through the Kinde API</span> </a> </li> </ul> </details> </li> </ul> </details> </li><li class="astro-3ii7xxms"> <details class="astro-3ii7xxms"> <sl-sidebar-restore data-index="88"></sl-sidebar-restore> <summary class="astro-3ii7xxms"> <div class="group-label astro-3ii7xxms"> <span class="large astro-3ii7xxms">Integrations</span> </div> <svg aria-hidden="true" class="caret astro-3ii7xxms astro-c6vsoqas" width="16" height="16" viewBox="0 0 24 24" fill="currentColor" style="--sl-icon-size: 1.25rem;"><path d="m14.83 11.29-4.24-4.24a1 1 0 1 0-1.42 1.41L12.71 12l-3.54 3.54a1 1 0 0 0 0 1.41 1 1 0 0 0 .71.29 1 1 0 0 0 .71-.29l4.24-4.24a1.002 1.002 0 0 0 0-1.42Z"/></svg> </summary> <ul class="astro-3ii7xxms"> <li class="astro-3ii7xxms"> <details open class="astro-3ii7xxms"> <sl-sidebar-restore data-index="89"></sl-sidebar-restore> <summary class="astro-3ii7xxms"> <div class="group-label astro-3ii7xxms"> <span class="large astro-3ii7xxms">Connected apps</span> </div> <svg aria-hidden="true" class="caret astro-3ii7xxms astro-c6vsoqas" width="16" height="16" viewB
275ox="0 0 24 24" fill="currentColor" style="--sl-icon-size: 1.25rem;"><path d="m14.83 11.29-4.24-4.24a1 1 0 1 0-1.42 1.41L12.71 12l-3.54 3.54a1 1 0 0 0 0 1.41 1 1 0 0 0 .71.29 1 1 0 0 0 .71-.29l4.24-4.24a1.002 1.002 0 0 0 0-1.42Z"/></svg> </summary> <ul class="astro-3ii7xxms"> <li class="astro-3ii7xxms"> <a href="/integrate/connected-apps/add-connected-apps/" aria-current="false" class="astro-3ii7xxms"> <span class="astro-3ii7xxms">Add connected apps</span> </a> </li><li class="astro-3ii7xxms"> <a href="/integrate/connected-apps/google-drive-connected-app/" aria-current="false" class="astro-3ii7xxms"> <span class="astro-3ii7xxms">Google Drive connected app</span> </a> </li><li class="astro-3ii7xxms"> <a href="/integrate/connected-apps/github-connected-app/" aria-current="false" class="astro-3ii7xxms"> <span class="astro-3ii7xxms">GitHub connected app</span> </a> </li><li class="astro-3ii7xxms"> <a href="/integrate/connected-apps/gitlab-connected-app/" aria-current="false" class="astro-3ii7xxms"> <span class="astro-3ii7xxms">GitLab connected app</span> </a> </li><li class="astro-3ii7xxms"> <a href="/integrate/connected-apps/patreon-connected-app/" aria-current="false" class="astro-3ii7xxms"> <span class="astro-3ii7xxms">Patreon connected app</span> </a> </li><li class="astro-3ii7xxms"> <a href="/integrate/connected-apps/discord-connected-app/" aria-current="false" class="astro-3ii7xxms"> <span class="astro-3ii7xxms">Discord connected app</span> </a> </li><li class="astro-3ii7xxms"> <a href="/integrate/connected-apps/microsoft-365-connected-app/" aria-current="false" class="astro-3ii7xxms"> <span class="astro-3ii7xxms">Microsoft 365 connected app</span> </a> </li> </ul> </details> </li><li class="astro-3ii7xxms"> <details open class="astro-3ii7xxms"> <sl-sidebar-restore data-index="90"></sl-sidebar-restore> <summary class="astro-3ii7xxms"> <div class="group-label astro-3ii7xxms"> <span class="large astro-3ii7xxms">Webhooks</span> </div> <svg aria-hidden="true" class="caret astro-3ii7xxms astro-c6vsoqas" width="16" height="16" viewBox="0 0 24 24" fill="currentColor" style="--sl-icon-size: 1.25rem;"><path d="m14.83 11.29-4.24-4.24a1 1 0 1 0-1.42 1.41L12.71 12l-3.54 3.54a1 1 0 0 0 0 1.41 1 1 0 0 0 .71.29 1 1 0 0 0 .71-.29l4.24-4.24a1.002 1.002 0 0 0 0-1.42Z"/></svg> </summary> <ul class="astro-3ii7xxms"> <li class="astro-3ii7xxms"> <a href="/integrate/webhooks/about-webhooks/" aria-current="false" class="astro-3ii7xxms"> <span class="astro-3ii7xxms">About webhooks</span> </a> </li><li class="astro-3ii7xxms"> <a href="/integrate/webhooks/add-manage-webhooks/" aria-current="false" class="astro-3ii7xxms"> <span class="astro-3ii7xxms">Add and manage webhooks</span> </a> </li><li class="astro-3ii7xxms"> <a href="/integrate/webhooks/webhooks-nextjs/" aria-current="false" class="astro-3ii7xxms"> <span class="astro-3ii7xxms">Set up webhooks using Next.js</span> </a> </li><li class="astro-3ii7xxms"> <a href="/integrate/webhooks/zapier-event-hooks/" aria-current="false" class="astro-3ii7xxms"> <span class="astro-3ii7xxms">Connect Zapier to Kinde</span> </a> </li> </ul> </details> </li><li class="astro-3ii7xxms"> <details open class="astro-3ii7xxms"> <sl-sidebar-restore data-index="91"></sl-sidebar-restore> <summary class="astro-3ii7xxms"> <div class="group-label astro-3ii7xxms"> <span class="large astro-3ii7xxms">Third-party tools</span> </div> <svg aria-hidden="true" class="caret astro-3ii7xxms astro-c6vsoqas" width="16" height="16" viewBox="0 0 24 24" fill="currentColor" style="--sl-icon-size: 1.25rem;"><path d="m14.83 11.29-4.24-4.24a1 1 0 1 0-1.42 1.41L12.71 12l-3.54 3.54a1 1 0 0 0 0 1.41 1 1 0 0 0 .71.29 1 1 0 0 0 .71-.29l4.24-4.24a1.002 1.002 0 0 0 0-1.42Z"/></svg> </summary> <ul class="astro-3ii7xxms"> <li class="astro-3ii7xxms"> <a href="/integrate/third-party-tools/kinde-edge-workers/" aria-current="false" class="astro-3ii7xxms"> <span class="astro-3ii7xxms">Kinde and edge worker services</span> </a> </li><li class="astro-3ii7xxms"> <a href="/integrate/third-party-tools/cloudflare-zero-trust/" aria-current="false" class="astro-3ii7xxms"> <span class="astro-3ii7xxms">Cloudflare One (Zero Trust)</span> </a> </li><li class="astro-3ii7xxms"> <a href="/integrate/third-party-tools/verifying-jwts-cloudflare-workers/" aria-current="false" class="astro-3ii7xxms"> <span class="astro-3ii7xxms">Verifying JWTs in Cloudflare Workers</span> </a> </li><li class="astro-3ii7xxms"> <a href="/integrate/third-party-tools/kinde-wordpress/" aria-current="false" class="astro-3ii7xxms"> <span class="astro-3ii7xxms">Kinde and WordPress</span> </a> </li><li class="astro-3ii7xxms"> <a href="/integrate/third-party-tools/kinde-shopify/" aria-current="false" class="astro-3ii7xxms"> <span class="astro-3ii7xxms">Kinde and Shopify</span> </a> </li><li class="astro-3ii7xxms"> <a href="/integrate/third-party-tools/marketing-campaign-tracking/" aria-current="false" class="astro-3ii7xxms"> <span class="astro-3ii7xxms">Marketing campaign tracking with Kinde</span> </a> </li><li class="astro-3ii7xxms"> <a href="/integrate/third-party-tools/kinde-bravo-studio/" aria-current="false" class="astro-3ii7xxms"> <span class="astro-3ii7xxms">Kinde and Bravo Studio</span> </a> </li><li class="astro-3ii7xxms"> <a href="/integrate/third-party-tools/kinde-firebase/" aria-current="false" class="astro-3ii7xxms"> <span class="astro-3ii7xxms">Kinde and Firebase</span> </a> </li><li class="astro-3ii7xxms"> <a href="/integrate/third-party-tools/kinde-supabase/" aria-current="false" class="astro-3ii7xxms"> <span class="astro-3ii7xxms">Kinde and Supabase</span> </a> </li><li class="astro-3ii7xxms"> <a href="/integrate/third-party-tools/kinde-supabase-todo-app/" aria-current="false" class="astro-3ii7xxms"> <span class="astro-3ii7xxms">Create a to-do app with Kinde and Supabase</span> </a> </li><li class="astro-3ii7xxms"> <a href="/integrate/third-party-tools/kinde-and-convex/" aria-current="false" class="astro-3ii7xxms"> <span class="astro-3ii7xxms">Integrate Convex with Kinde</span> </a> </li><li class="astro-3ii7xxms"> <a href="/integrate/third-party-tools/kinde-hasura/" aria-current="false" class="astro-3ii7xxms"> <span class="astro-3ii7xxms">Kinde and Hasura</span> </a> </li><li class="astro-3ii7xxms"> <a href="/integrate/third-party-tools/trustpath-fraud-protection/" aria-current="false" class="astro-3ii7xxms"> <span class="astro-3ii7xxms">Integrate fraud detection with TrustPath</span> </a> </li><li class="astro-3ii7xxms"> <a href="/integrate/third-party-tools/kinde-convex-app/" aria-current="false" class="astro-3ii7xxms"> <span class="astro-3ii7xxms">
275Build a real-time message board with Kinde and Convex</span> </a> </li><li class="astro-3ii7xxms"> <a href="/integrate/third-party-tools/kinde-nextjs-prisma/" aria-current="false" class="astro-3ii7xxms"> <span class="astro-3ii7xxms">Set up a Next.js app with Prisma ORM and Kinde</span> </a> </li><li class="astro-3ii7xxms"> <a href="/integrate/third-party-tools/kinde-nextjs-drizzle/" aria-current="false" class="astro-3ii7xxms"> <span class="astro-3ii7xxms">Set up a Next.js app with Drizzle ORM and Kinde</span> </a> </li><li class="astro-3ii7xxms"> <a href="/integrate/third-party-tools/kinde-resend-custom-smtp/" aria-current="false" class="astro-3ii7xxms"> <span class="astro-3ii7xxms">Kinde and Resend for custom SMTP</span> </a> </li><li class="astro-3ii7xxms"> <a href="/integrate/third-party-tools/kinde-mailgun-email-delivery/" aria-current="false" class="astro-3ii7xxms"> <span class="astro-3ii7xxms">Kinde and Mailgun for email delivery</span> </a> </li><li class="astro-3ii7xxms"> <a href="/integrate/third-party-tools/kinde-loops/" aria-current="false" class="astro-3ii7xxms"> <span class="astro-3ii7xxms">Connect Loops to Kinde (via Zapier)</span> </a> </li> </ul> </details> </li> </ul> </details> </li><li class="astro-3ii7xxms"> <details class="astro-3ii7xxms"> <sl-sidebar-restore data-index="92"></sl-sidebar-restore> <summary class="astro-3ii7xxms"> <div class="group-label astro-3ii7xxms"> <span class="large astro-3ii7xxms">Manage your account</span> </div> <svg aria-hidden="true" class="caret astro-3ii7xxms astro-c6vsoqas" width="16" height="16" viewBox="0 0 24 24" fill="currentColor" style="--sl-icon-size: 1.25rem;"><path d="m14.83 11.29-4.24-4.24a1 1 0 1 0-1.42 1.41L12.71 12l-3.54 3.54a1 1 0 0 0 0 1.41 1 1 0 0 0 .71.29 1 1 0 0 0 .71-.29l4.24-4.24a1.002 1.002 0 0 0 0-1.42Z"/></svg> </summary> <ul class="astro-3ii7xxms"> <li class="astro-3ii7xxms"> <details open class="astro-3ii7xxms"> <sl-sidebar-restore data-index="93"></sl-sidebar-restore> <summary class="astro-3ii7xxms"> <div class="group-label astro-3ii7xxms"> <span class="large astro-3ii7xxms">Profile and plan</span> </div> <svg aria-hidden="true" class="caret astro-3ii7xxms astro-c6vsoqas" width="16" height="16" viewBox="0 0 24 24" fill="currentColor" style="--sl-icon-size: 1.25rem;"><path d="m14.83 11.29-4.24-4.24a1 1 0 1 0-1.42 1.41L12.71 12l-3.54 3.54a1 1 0 0 0 0 1.41 1 1 0 0 0 .71.29 1 1 0 0 0 .71-.29l4.24-4.24a1.002 1.002 0 0 0 0-1.42Z"/></svg> </summary> <ul class="astro-3ii7xxms"> <li class="astro-3ii7xxms"> <a href="/manage-your-account/profile-and-plan/view-kinde-plan/" aria-current="false" class="astro-3ii7xxms"> <span class="astro-3ii7xxms">View your Kinde plan</span> </a> </li><li class="astro-3ii7xxms"> <a href="/manage-your-account/profile-and-plan/change-kinde-plan/" aria-current="false" class="astro-3ii7xxms"> <span class="astro-3ii7xxms">Change your Kinde plan</span> </a> </li><li class="astro-3ii7xxms"> <a href="/manage-your-account/profile-and-plan/update-kinde-payment/" aria-current="false" class="astro-3ii7xxms"> <span class="astro-3ii7xxms">Add or update payment details</span> </a> </li><li class="astro-3ii7xxms"> <a href="/manage-your-account/profile-and-plan/update-billing-details/" aria-current="false" class="astro-3ii7xxms"> <span class="astro-3ii7xxms">Update billing details for your Kinde account</span> </a> </li> </ul> </details> </li><li class="astro-3ii7xxms"> <details open class="astro-3ii7xxms"> <sl-sidebar-restore data-index="94"></sl-sidebar-restore> <summary class="astro-3ii7xxms"> <div class="group-label astro-3ii7xxms"> <span class="large astro-3ii7xxms">Your data</span> </div> <svg aria-hidden="true" class="caret astro-3ii7xxms astro-c6vsoqas" width="16" height="16" viewBox="0 0 24 24" fill="currentColor" style="--sl-icon-size: 1.25rem;"><path d="m14.83 11.29-4.24-4.24a1 1 0 1 0-1.42 1.41L12.71 12l-3.54 3.54a1 1 0 0 0 0 1.41 1 1 0 0 0 .71.29 1 1 0 0 0 .71-.29l4.24-4.24a1.002 1.002 0 0 0 0-1.42Z"/></svg> </summary> <ul class="astro-3ii7xxms"> <li class="astro-3ii7xxms"> <a href="/manage-your-account/your-data/kinde-domains/" aria-current="false" class="astro-3ii7xxms"> <span class="astro-3ii7xxms">About your Kinde domain</span> </a> </li><li class="astro-3ii7xxms"> <a href="/manage-your-account/your-data/check-your-mau/" aria-current="false" class="astro-3ii7xxms"> <span class="astro-3ii7xxms">Check your MAU and MAO</span> </a> </li><li class="astro-3ii7xxms"> <a href="/manage-your-account/your-data/exporting-data/" aria-current="false" class="astro-3ii7xxms"> <span class="astro-3ii7xxms">Export your data</span> </a> </li><li class="astro-3ii7xxms"> <a href="/manage-your-account/your-data/delete-business/" aria-current="false" class="astro-3ii7xxms"> <span class="astro-3ii7xxms">Delete your Kinde business</span> </a> </li><li class="astro-3ii7xxms"> <a href="/manage-your-account/your-data/closing-your-account/" aria-current="false" class="astro-3ii7xxms"> <span class="astro-3ii7xxms">Close your Kinde account</span> </a> </li> </ul> </details> </li><li class="astro-3ii7xxms"> <details open class="astro-3ii7xxms"> <sl-sidebar-restore data-index="95"></sl-sidebar-restore> <summary class="astro-3ii7xxms"> <div class="group-label astro-3ii7xxms"> <span class="large astro-3ii7xxms">Business information</span> </div> <svg aria-hidden="true" class="caret astro-3ii7xxms astro-c6vsoqas" width="16" height="16" viewB
275ox="0 0 24 24" fill="currentColor" style="--sl-icon-size: 1.25rem;"><path d="m14.83 11.29-4.24-4.24a1 1 0 1 0-1.42 1.41L12.71 12l-3.54 3.54a1 1 0 0 0 0 1.41 1 1 0 0 0 .71.29 1 1 0 0 0 .71-.29l4.24-4.24a1.002 1.002 0 0 0 0-1.42Z"/></svg> </summary> <ul class="astro-3ii7xxms"> <li class="astro-3ii7xxms"> <a href="/manage-your-account/business-information/update-your-details/" aria-current="false" class="astro-3ii7xxms"> <span class="astro-3ii7xxms">Update your business details</span> </a> </li><li class="astro-3ii7xxms"> <a href="/manage-your-account/business-information/change-business-owner/" aria-current="false" class="astro-3ii7xxms"> <span class="astro-3ii7xxms">Change the Owner of your Kinde business</span> </a> </li><li class="astro-3ii7xxms"> <a href="/manage-your-account/business-information/policies-terms/" aria-current="false" class="astro-3ii7xxms"> <span class="astro-3ii7xxms">Add Terms of use and Privacy policy URLs</span> </a> </li> </ul> </details> </li> </ul> </details> </li><li class="astro-3ii7xxms"> <details class="astro-3ii7xxms"> <sl-sidebar-restore data-index="96"></sl-sidebar-restore> <summary class="astro-3ii7xxms"> <div class="group-label astro-3ii7xxms"> <span class="large astro-3ii7xxms">Trust center</span> </div> <svg aria-hidden="true" class="caret astro-3ii7xxms astro-c6vsoqas" width="16" height="16" viewBox="0 0 24 24" fill="currentColor" style="--sl-icon-size: 1.25rem;"><path d="m14.83 11.29-4.24-4.24a1 1 0 1 0-1.42 1.41L12.71 12l-3.54 3.54a1 1 0 0 0 0 1.41 1 1 0 0 0 .71.29 1 1 0 0 0 .71-.29l4.24-4.24a1.002 1.002 0 0 0 0-1.42Z"/></svg> </summary> <ul class="astro-3ii7xxms"> <li class="astro-3ii7xxms"> <details open class="astro-3ii7xxms"> <sl-sidebar-restore data-index="97"></sl-sidebar-restore> <summary class="astro-3ii7xxms"> <div class="group-label astro-3ii7xxms"> <span class="large astro-3ii7xxms">Privacy and compliance</span> </div> <svg aria-hidden="true" class="caret astro-3ii7xxms astro-c6vsoqas" width="16" height="16" viewBox="0 0 24 24" fill="currentColor" style="--sl-icon-size: 1.25rem;"><path d="m14.83 11.29-4.24-4.24a1 1 0 1 0-1.42 1.41L12.71 12l-3.54 3.54a1 1 0 0 0 0 1.41 1 1 0 0 0 .71.29 1 1 0 0 0 .71-.29l4.24-4.24a1.002 1.002 0 0 0 0-1.42Z"/></svg> </summary> <ul class="astro-3ii7xxms"> <li class="astro-3ii7xxms"> <a href="/trust-center/privacy-and-compliance/compliance/" aria-current="false" class="astro-3ii7xxms"> <span class="astro-3ii7xxms">Compliance</span> </a> </li><li class="astro-3ii7xxms"> <a href="/trust-center/privacy-and-compliance/privacy-policy/" aria-current="false" class="astro-3ii7xxms"> <span class="astro-3ii7xxms">Our privacy policy</span> </a> </li><li class="astro-3ii7xxms"> <a href="/trust-center/privacy-and-compliance/gdpr/" aria-current="false" class="astro-3ii7xxms"> <span class="astro-3ii7xxms">General data protection regulation (GDPR)</span> </a> </li><li class="astro-3ii7xxms"> <a href="/trust-center/privacy-and-compliance/sub-processors/" aria-current="false" class="astro-3ii7xxms"> <span class="astro-3ii7xxms">Sub-processors</span> </a> </li><li class="astro-3ii7xxms"> <a href="/trust-center/privacy-and-compliance/sub-processors-interactive/" aria-current="false" class="astro-3ii7xxms"> <span class="astro-3ii7xxms">Sub-processors - Interactive</span> </a> </li> </ul> </details> </li><li class="astro-3ii7xxms"> <details open class="astro-3ii7xxms"> <sl-sidebar-restore data-index="98"></sl-sidebar-restore> <summary class="astro-3ii7xxms"> <div class="group-label astro-3ii7xxms"> <span class="large astro-3ii7xxms">Agreements</span> </div> <svg aria-hidden="true" class="caret astro-3ii7xxms astro-c6vsoqas" width="16" height="16" viewBox="0 0 24 24" fill="currentColor" style="--sl-icon-size: 1.25rem;"><path d="m14.83 11.29-4.24-4.24a1 1 0 1 0-1.42 1.41L12.71 12l-3.54 3.54a1 1 0 0 0 0 1.41 1 1 0 0 0 .71.29 1 1 0 0 0 .71-.29l4.24-4.24a1.002 1.002 0 0 0 0-1.42Z"/></svg> </summary> <ul class="astro-3ii7xxms"> <li class="astro-3ii7xxms"> <a href="/trust-center/agreements/terms-of-service/" aria-current="false" class="astro-3ii7xxms"> <span class="astro-3ii7xxms">Terms of Service</span> </a> </li><li class="astro-3ii7xxms"> <a href="/trust-center/agreements/end-user-licence-agreement/" aria-current="false" class="astro-3ii7xxms"> <span class="astro-3ii7xxms">End User Licence Agreement</span> </a> </li> </ul> </details> </li><li class="astro-3ii7xxms"> <details open class="astro-3ii7xxms"> <sl-sidebar-restore data-index="99"></sl-sidebar-restore> <summary class="astro-3ii7xxms"> <div class="group-label astro-3ii7xxms"> <span class="large astro-3ii7xxms">Security</span> </div> <svg aria-hidden="true" class="caret astro-3ii7xxms astro-c6vsoqas" width="16" height="16" viewB
275ox="0 0 24 24" fill="currentColor" style="--sl-icon-size: 1.25rem;"><path d="m14.83 11.29-4.24-4.24a1 1 0 1 0-1.42 1.41L12.71 12l-3.54 3.54a1 1 0 0 0 0 1.41 1 1 0 0 0 .71.29 1 1 0 0 0 .71-.29l4.24-4.24a1.002 1.002 0 0 0 0-1.42Z"/></svg> </summary> <ul class="astro-3ii7xxms"> <li class="astro-3ii7xxms"> <a href="/trust-center/security/security-at-kinde/" aria-current="false" class="astro-3ii7xxms"> <span class="astro-3ii7xxms">Security at Kinde</span> </a> </li><li class="astro-3ii7xxms"> <a href="/trust-center/security/security-wall-of-fame/" aria-current="false" class="astro-3ii7xxms"> <span class="astro-3ii7xxms">Security wall of fame</span> </a> </li><li class="astro-3ii7xxms"> <a href="/trust-center/security/vulnerability-disclosure-policy/" aria-current="false" class="astro-3ii7xxms"> <span class="astro-3ii7xxms">Vulnerability disclosure policy</span> </a> </li> </ul> </details> </li><li class="astro-3ii7xxms"> <details open class="astro-3ii7xxms"> <sl-sidebar-restore data-index="100"></sl-sidebar-restore> <summary class="astro-3ii7xxms"> <div class="group-label astro-3ii7xxms"> <span class="large astro-3ii7xxms">Kinde performance</span> </div> <svg aria-hidden="true" class="caret astro-3ii7xxms astro-c6vsoqas" width="16" height="16" viewBox="0 0 24 24" fill="currentColor" style="--sl-icon-size: 1.25rem;"><path d="m14.83 11.29-4.24-4.24a1 1 0 1 0-1.42 1.41L12.71 12l-3.54 3.54a1 1 0 0 0 0 1.41 1 1 0 0 0 .71.29 1 1 0 0 0 .71-.29l4.24-4.24a1.002 1.002 0 0 0 0-1.42Z"/></svg> </summary> <ul class="astro-3ii7xxms"> <li class="astro-3ii7xxms"> <a href="/trust-center/kinde-performance/service-status/" aria-current="false" class="astro-3ii7xxms"> <span class="astro-3ii7xxms">Kinde services status</span> </a> </li> </ul> </details> </li> </ul> </details> </li> </ul>
275<script aria-hidden="true"> 276 (() => { 277 const scroller = document.getElementById('starlight__sidebar'); 278 if (!window._starlightScrollRestore || !scroller) return; 279 scroller.scrollTop = window._starlightScrollRestore; 280 delete window._starlightScrollRestore; 281 })(); 282 </script>
282 </sl-sidebar-state-persist> <div class="md:sl-hidden"> <div class="mobile-preferences sl-flex astro-dngfpm3a"> <div class="sl-flex social-icons astro-dngfpm3a"> <a href="https://github.com/kinde-oss" rel="me" class="sl-flex astro-byvskjtp" target="_blank"><span class="sr-only astro-byvskjtp">GitHub</span><svg aria-hidden="true" class="astro-byvskjtp astro-c6vsoqas" width="16" height="16" viewBox="0 0 24 24" fill="currentColor" style="--sl-icon-size: 1em;"><path d="M12 .3a12 12 0 0 0-3.8 23.38c.6.12.83-.26.83-.57L9 21.07c-3.34.72-4.04-1.61-4.04-1.61-.55-1.39-1.34-1.76-1.34-1.76-1.08-.74.09-.73.09-.73 1.2.09 1.83 1.24 1.83 1.24 1.08 1.83 2.81 1.3 3.5 1 .1-.78.42-1.31.76-1.61-2.67-.3-5.47-1.33-5.47-5.93 0-1.31.47-2.38 1.24-3.22-.14-.3-.54-1.52.1-3.18 0 0 1-.32 3.3 1.23a11.5 11.5 0 0 1 6 0c2.28-1.55 3.29-1.23 3.29-1.23.64 1.66.24 2.88.12 3.18a4.65 4.65 0 0 1 1.23 3.22c0 4.61-2.8 5.63-5.48 5.92.42.36.81 1.1.81 2.22l-.01 3.29c0 .31.2.69.82.57A12 12 0 0 0 12 .3Z"/></svg> </a> </div> <!-- <ThemeSelect {...Astro.props} /> -->
282<script type="module">class s extends HTMLElement{constructor(){super();const e=this.querySelector("select");e&&(e.addEventListener("change",t=>{t.currentTarget instanceof HTMLSelectElement&&(window.location.pathname=t.currentTarget.value)}),window.addEventListener("pageshow",t=>{if(!t.persisted)return;const n=e.querySelector("option[selected]")?.index;n!==e.selectedIndex&&(e.selectedIndex=n??0)}))}}customElements.define("starlight-lang-select",s);</script>
282 </div> </div> </div> </div> </nav> <div class="main-frame astro-jcdooet4">
282<script type="module">const a=document.getElementById("starlight__sidebar"),n=a?.querySelector("sl-sidebar-state-persist"),o="sl-sidebar-state",i=()=>{let t=[];const e=n?.dataset.hash||"";try{const s=sessionStorage.getItem(o),r=JSON.parse(s||"{}");Array.isArray(r.open)&&r.hash===e&&(t=r.open)}catch{}return{hash:e,open:t,scroll:a?.scrollTop||0}},c=t=>{try{sessionStorage.setItem(o,JSON.stringify(t))}catch{}},d=()=>c(i()),l=(t,e)=>{const s=i();s.open[e]=t,c(s)};n?.addEventListener("click",t=>{if(!(t.target instanceof Element))return;const e=t.target.closest("summary")?.closest("details");if(!e)return;const s=e.querySelector("sl-sidebar-restore"),r=parseInt(s?.dataset.index||"");isNaN(r)||l(!e.open,r)});addEventListener("visibilitychange",()=>{document.visibilityState==="hidden"&&d()});addEventListener("pageHide",d);</script>
282 <div class="lg:sl-flex astro-67yu43on"> <aside class="right-sidebar-container astro-67yu43on"> <div class="right-sidebar astro-67yu43on"> <div class="lg:sl-hidden astro-ivmbnssm"><mobile-starlight-toc data-min-h="2" data-max-h="3" class="astro-doynk5tl"><nav aria-labelledby="starlight__on-this-page--mobile" class="astro-doynk5tl"><details id="starlight__mobile-toc" class="astro-doynk5tl"><summary id="starlight__on-this-page--mobile" class="sl-flex astro-doynk5tl"><div class="toggle sl-flex astro-doynk5tl">On this page<svg aria-hidden="true" class="caret astro-doynk5tl astro-c6vsoqas" width="16" height="16" viewBox="0 0 24 24" fill="currentColor" style="--sl-icon-size: 1rem;"><path d="m14.83 11.29-4.24-4.24a1 1 0 1 0-1.42 1.41L12.71 12l-3.54 3.54a1 1 0 0 0 0 1.41 1 1 0 0 0 .71.29 1 1 0 0 0 .71-.29l4.24-4.24a1.002 1.002 0 0 0 0-1.42Z"/></svg> </div><span class="display-current astro-doynk5tl"></span></summary><div class="dropdown astro-doynk5tl"><ul class="isMobile astro-g2bywc46" style="--depth: 0;"> <li class="astro-g2bywc46" style="--depth: 0;"> <a href="#_top" class="astro-g2bywc46" style="--depth: 0;"> <span class="astro-g2bywc46" style="--depth: 0;">Overview</span> </a> </li><li class="astro-g2bywc46" style="--depth: 0;"> <a href="#what-you-need" class="astro-g2bywc46" style="--depth: 0;"> <span class="astro-g2bywc46" style="--depth: 0;">What you need</span> </a> </li><li class="astro-g2bywc46" style="--depth: 0;"> <a href="#quickstart" class="astro-g2bywc46" style="--depth: 0;"> <span class="astro-g2bywc46" style="--depth: 0;">Quickstart</span> </a> <ul class="isMobile astro-g2bywc46" style="--depth: 1;"> <li class="astro-g2bywc46" style="--depth: 1;"> <a href="#1-create-a-kinde-application" class="astro-g2bywc46" style="--depth: 1;"> <span class="astro-g2bywc46" style="--depth: 1;">1. Create a Kinde application</span> </a> </li><li class="astro-g2bywc46" style="--depth: 1;"> <a href="#2-get-your-app-keys" class="astro-g2bywc46" style="--depth: 1;"> <span class="astro-g2bywc46" style="--depth: 1;">2. Get your app keys</span> </a> </li><li class="astro-g2bywc46" style="--depth: 1;"> <a href="#3-add-a-callback-url" class="astro-g2bywc46" style="--depth: 1;"> <span class="astro-g2bywc46" style="--depth: 1;">3. Add a callback URL</span> </a> </li><li class="astro-g2bywc46" style="--depth: 1;"> <a href="#4-set-authentication-methods" class="astro-g2bywc46" style="--depth: 1;"> <span class="astro-g2bywc46" style="--depth: 1;">4. Set authentication methods</span> </a> </li><li class="astro-g2bywc46" style="--depth: 1;"> <a href="#5-get-the-openid-endpoints" class="astro-g2bywc46" style="--depth: 1;"> <span class="astro-g2bywc46" style="--depth: 1;">5. Get the OpenID endpoints</span> </a> </li><li class="astro-g2bywc46" style="--depth: 1;"> <a href="#6-create-the-authorization-request" class="astro-g2bywc46" style="--depth: 1;"> <span class="astro-g2bywc46" style="--depth: 1;">6. Create the authorization request</span> </a> </li><li class="astro-g2bywc46" style="--depth: 1;"> <a href="#7-handle-the-callback" class="astro-g2bywc46" style="--depth: 1;"> <span class="astro-g2bywc46" style="--depth: 1;">7. Handle the callback</span> </a> </li><li class="astro-g2bywc46" style="--depth: 1;"> <a href="#8-display-user-information" class="astro-g2bywc46" style="--depth: 1;"> <span class="astro-g2bywc46" style="--depth: 1;">8. Display user information</span> </a> </li><li class="astro-g2bywc46" style="--depth: 1;"> <a href="#9-test-user-registration" class="astro-g2bywc46" style="--depth: 1;"> <span class="astro-g2bywc46" style="--depth: 1;">9. Test user registration</span> </a> </li> </ul> </li><li class="astro-g2bywc46" style="--depth: 0;"> <a href="#authentication" class="astro-g2bywc46" style="--depth: 0;"> <span class="astro-g2bywc46" style="--depth: 0;">Authentication</span> </a> <ul class="isMobile astro-g2bywc46" style="--depth: 1;"> <li class="astro-g2bywc46" style="--depth: 1;"> <a href="#create-a-sign-in-or-sign-up-link" class="astro-g2bywc46" style="--depth: 1;"> <span class="astro-g2bywc46" style="--depth: 1;">Create a sign in or sign up link</span> </a> </li><li class="astro-g2bywc46" style="--depth: 1;"> <a href="#handle-successful-auth-for-desktop-and-mobile-apps" class="astro-g2bywc46" style="--depth: 1;"> <span class="astro-g2bywc46" style="--depth: 1;">Handle successful auth for desktop and mobile apps</span> </a> </li><li class="astro-g2bywc46" style="--depth: 1;"> <a href="#protect-a-route-with-auth" class="astro-g2bywc46" style="--depth: 1;"> <span class="astro-g2bywc46" style="--depth: 1;">Protect a route with auth</span> </a> </li><li class="astro-g2bywc46" style="--depth: 1;"> <a href="#validate-the-access-token" class="astro-g2bywc46" style="--depth: 1;"> <span class="astro-g2bywc46" style="--depth: 1;">Validate the access token</span> </a> </li><li class="astro-g2bywc46" style="--depth: 1;"> <a href="#kinde-self-serve-portal-link" class="astro-g2bywc46" style="--depth: 1;"> <span class="astro-g2bywc46" style="--depth: 1;">Kinde self-serve portal link</span> </a> </li><li class="astro-g2bywc46" style="--depth: 1;"> <a href="#sign-out-your-users" class="astro-g2bywc46" style="--depth: 1;"> <span class="astro-g2bywc46" style="--depth: 1;">Sign out your users</span> </a> </li> </ul> </li><li class="astro-g2bywc46" style="--depth: 0;"> <a href="#supported-grant-types-in-kinde" class="astro-g2bywc46" style="--depth: 0;"> <span class="astro-g2bywc46" style="--depth: 0;">Supported grant types in Kinde</span> </a> <ul class="isMobile astro-g2bywc46" style="--depth: 1;"> <li class="astro-g2bywc46" style="--depth: 1;"> <a href="#authorization-code-flow" class="astro-g2bywc46" style="--depth: 1;"> <span class="astro-g2bywc46" style="--depth: 1;">Authorization Code Flow</span> </a> </li><li class="astro-g2bywc46" style="--depth: 1;"> <a href="#pkce-extension" class="astro-g2bywc46" style="--depth: 1;"> <span class="astro-g2bywc46" style="--depth: 1;">PKCE extension</span> </a> </li><li class="astro-g2bywc46" style="--depth: 1;"> <a href="#implicit-flow-not-recommended" class="astro-g2bywc46" style="--depth: 1;"> <span class="astro-g2bywc46" style="--depth: 1;">Implicit flow (Not recommended)</span> </a> </li> </ul> </li><li class="astro-g2bywc46" style="--depth: 0;"> <a href="#oauth-20-scopes-for-kinde" class="astro-g2bywc46" style="--depth: 0;"> <span class="astro-g2bywc46" style="--depth: 0;">OAuth 2.0 scopes for Kinde</span> </a> <ul class="isMobile astro-g2bywc46" style="--depth: 1;"> <li class="astro-g2bywc46" style="--depth: 1;"> <a href="#openid" class="astro-g2bywc46" style="--depth: 1;"> <span class="astro-g2bywc46" style="--depth: 1;">openid</span> </a> </li><li class="astro-g2bywc46" style="--depth: 1;"> <a href="#email" class="astro-g2bywc46" style="--depth: 1;"> <span class="astro-g2bywc46" style="--depth: 1;">email</span> </a> </li><li class="astro-g2bywc46" style="--depth: 1;"> <a href="#profile" class="astro-g2bywc46" style="--depth: 1;"> <span class="astro-g2bywc46" style="--depth: 1;">profile</span> </a> </li><li class="astro-g2bywc46" style="--depth: 1;"> <a href="#offline" class="astro-g2bywc46" style="--depth: 1;"> <span class="astro-g2bywc46" style="--depth: 1;">offline</span> </a> </li><li class="astro-g2bywc46" style="--depth: 1;"> <a href="#phone" class="astro-g2bywc46" style="--depth: 1;"> <span class="astro-g2bywc46" style="--depth: 1;">phone</span> </a> </li><li class="astro-g2bywc46" style="--depth: 1;"> <a href="#address" class="astro-g2bywc46" style="--depth: 1;"> <span class="astro-g2bywc46" style="--depth: 1;">address</span> </a> </li> </ul> </li><li class="astro-g2bywc46" style="--depth: 0;"> <a href="#request-parameters" class="astro-g2bywc46" style="--depth: 0;"> <span class="astro-g2bywc46" style="--depth: 0;">Request parameters</span> </a> <ul class="isMobile astro-g2bywc46" style="--depth: 1;"> <li class="astro-g2bywc46" style="--depth: 1;"> <a href="#response_type" class="astro-g2bywc46" style="--depth: 1;"> <span class="astro-g2bywc46" style="--depth: 1;">response_type</span> </a> </li><li class="astro-g2bywc46" style="--depth: 1;"> <a href="#client_id" class="astro-g2bywc46" style="--depth: 1;"> <span class="astro-g2bywc46" style="--depth: 1;">client_id</span> </a> </li><li class="astro-g2bywc46" style="--depth: 1;"> <a href="#redirect_uri" class="astro-g2bywc46" style="--depth: 1;"> <span class="astro-g2bywc46" style="--depth: 1;">redirect_uri</span> </a> </li><li class="astro-g2bywc46" style="--depth: 1;"> <a href="#scope" class="astro-g2bywc46" style="--depth: 1;"> <span class="astro-g2bywc46" style="--depth: 1;">scope</span> </a> </li><li class="astro-g2bywc46" style="--depth: 1;"> <a href="#state" class="astro-g2bywc46" style="--depth: 1;"> <span class="astro-g2bywc46" style="--depth: 1;">state</span> </a> </li><li class="astro-g2bywc46" style="--depth: 1;"> <a href="#nonce" class="astro-g2bywc46" style="--depth: 1;"> <span class="astro-g2bywc46" style="--depth: 1;">nonce</span> </a> </li><li class="astro-g2bywc46" style="--depth: 1;"> <a href="#code_challenge" class="astro-g2bywc46" style="--depth: 1;"> <span class="astro-g2bywc46" style="--depth: 1;">code_challenge</span> </a> </li><li class="astro-g2bywc46" style="--depth: 1;"> <a href="#code_challenge_method" class="astro-g2bywc46" style="--depth: 1;"> <span class="astro-g2bywc46" style="--depth: 1;">code_challenge_method</span> </a> </li><li class="astro-g2bywc46" style="--depth: 1;"> <a href="#prompt" class="astro-g2bywc46" style="--depth: 1;"> <span class="astro-g2bywc46" style="--depth: 1;">prompt</span> </a> </li><li class="astro-g2bywc46" style="--depth: 1;"> <a href="#login_hint" class="astro-g2bywc46" style="--depth: 1;"> <span class="astro-g2bywc46" style="--depth: 1;">login_hint</span> </a> </li><li class="astro-g2bywc46" style="--depth: 1;"> <a href="#org_code" class="astro-g2bywc46" style="--depth: 1;"> <span class="astro-g2bywc46" style="--depth: 1;">
282org_code</span> </a> </li><li class="astro-g2bywc46" style="--depth: 1;"> <a href="#is_create_org" class="astro-g2bywc46" style="--depth: 1;"> <span class="astro-g2bywc46" style="--depth: 1;">is_create_org</span> </a> </li><li class="astro-g2bywc46" style="--depth: 1;"> <a href="#org_name" class="astro-g2bywc46" style="--depth: 1;"> <span class="astro-g2bywc46" style="--depth: 1;">org_name</span> </a> </li><li class="astro-g2bywc46" style="--depth: 1;"> <a href="#audience" class="astro-g2bywc46" style="--depth: 1;"> <span class="astro-g2bywc46" style="--depth: 1;">audience</span> </a> </li><li class="astro-g2bywc46" style="--depth: 1;"> <a href="#has_success_page" class="astro-g2bywc46" style="--depth: 1;"> <span class="astro-g2bywc46" style="--depth: 1;">has_success_page</span> </a> </li><li class="astro-g2bywc46" style="--depth: 1;"> <a href="#lang" class="astro-g2bywc46" style="--depth: 1;"> <span class="astro-g2bywc46" style="--depth: 1;">lang</span> </a> </li><li class="astro-g2bywc46" style="--depth: 1;"> <a href="#connection_id" class="astro-g2bywc46" style="--depth: 1;"> <span class="astro-g2bywc46" style="--depth: 1;">connection_id</span> </a> </li><li class="astro-g2bywc46" style="--depth: 1;"> <a href="#supports_reauth" class="astro-g2bywc46" style="--depth: 1;"> <span class="astro-g2bywc46" style="--depth: 1;">supports_reauth</span> </a> </li><li class="astro-g2bywc46" style="--depth: 1;"> <a href="#reauth_state" class="astro-g2bywc46" style="--depth: 1;"> <span class="astro-g2bywc46" style="--depth: 1;">reauth_state</span> </a> </li><li class="astro-g2bywc46" style="--depth: 1;"> <a href="#deploy_id" class="astro-g2bywc46" style="--depth: 1;"> <span class="astro-g2bywc46" style="--depth: 1;">deploy_id</span> </a> </li><li class="astro-g2bywc46" style="--depth: 1;"> <a href="#plan_interest" class="astro-g2bywc46" style="--depth: 1;"> <span class="astro-g2bywc46" style="--depth: 1;">plan_interest</span> </a> </li><li class="astro-g2bywc46" style="--depth: 1;"> <a href="#pricing_table_key" class="astro-g2bywc46" style="--depth: 1;"> <span class="astro-g2bywc46" style="--depth: 1;">pricing_table_key</span> </a> </li><li class="astro-g2bywc46" style="--depth: 1;"> <a href="#start_page-deprecated" class="astro-g2bywc46" style="--depth: 1;"> <span class="astro-g2bywc46" style="--depth: 1;">start_page (deprecated)</span> </a> </li> </ul> </li><li class="astro-g2bywc46" style="--depth: 0;"> <a href="#faqs" class="astro-g2bywc46" style="--depth: 0;"> <span class="astro-g2bywc46" style="--depth: 0;">FAQs</span> </a> <ul class="isMobile astro-g2bywc46" style="--depth: 1;"> <li class="astro-g2bywc46" style="--depth: 1;"> <a href="#when-should-i-use-the-userinfo-endpoint-instead-of-decoding-the-id_token" class="astro-g2bywc46" style="--depth: 1;"> <span class="astro-g2bywc46" style="--depth: 1;">When should I use the userinfo endpoint instead of decoding the id_token?</span> </a> </li> </ul> </li> </ul> </div></details></nav></mobile-starlight-toc>
282<script type="module" src="/_astro/MobileTableOfContents.astro_astro_type_script_index_0_lang.C181hMzK.js"></script>
282</div><div class="right-sidebar-panel sl-hidden lg:sl-block astro-ivmbnssm"><div class="sl-container astro-ivmbnssm"><aside class="contribution-guides not-content astro-t7t3bc52"> <a href="/contribute/" class="contribution-guides__item astro-t7t3bc52"> <svg width="16" height="16" class="astro-t7t3bc52" data-icon="book"> <symbol id="ai:local:book" viewBox="0 0 24 24"><path fill="currentColor" fill-rule="evenodd" d="M7.5 2.25A3.75 3.75 0 0 0 3.75 6v12q0 .13.009.259-.009.12-.009.241A3.25 3.25 0 0 0 7 21.75h12.5a.75.75 0 0 0 .75-.75V3a.75.75 0 0 0-.75-.75zm11.25 13V3.75H7.5A2.25 2.25 0 0 0 5.25 6v9.76A3.24 3.24 0 0 1 7 15.25zm-11.25 5a2.25 2.25 0 0 1-2.234-1.984A1.75 1.75 0 0 1 7 16.75h11.75v3.5z" clip-rule="evenodd"/></symbol><use href="#ai:local:book"></use> </svg> <span class="astro-t7t3bc52">Contribute</span> </a> <a href="https://chat.openai.com/?q=Can%20you%20summarize%20this%20page%3A%20https%3A%2F%2Fdocs.kinde.com%2Fdeveloper-tools%2Fabout%2Fusing-kinde-without-an-sdk%2F" target="_blank" rel="noopener noreferrer" class="contribution-guides__item plausible-event-name=Open+with+ChatGPT plausible-event-url=/developer-tools/about/using-kinde-without-an-sdk/ astro-t7t3bc52"> <svg width="16" height="16" class="astro-t7t3bc52" data-icon="talk-1"> <symbol id="ai:local:talk-1" viewBox="0 0 32 32"><path fill="currentColor" fill-rule="evenodd" d="M6.667 6.333a.333.333 0 0 0-.334.334v12c0 .184.15.333.334.333H10a1 1 0 0 1 1 1v3.586l4.293-4.293A1 1 0 0 1 16 19h9.333c.184 0 .334-.15.334-.333v-12a.333.333 0 0 0-.334-.334zm-2.334.334a2.333 2.333 0 0 1 2.334-2.334h18.666a2.333 2.333 0 0 1 2.334 2.334v12A2.333 2.333 0 0 1 25.333 21h-8.919l-5.707 5.707A1 1 0 0 1 9 26v-5H6.667a2.333 2.333 0 0 1-2.334-2.333z" clip-rule="evenodd"/></symbol><use href="#ai:local:talk-1"></use> </svg> <span class="astro-t7t3bc52">Open with ChatGPT</span> </a> <button id="copy-markdown-button" class="contribution-guides__item plausible-event-name=Copy+for+AI plausible-event-url=/developer-tools/about/using-kinde-without-an-sdk/ astro-t7t3bc52" data-markdown="Kinde is designed to help founders and developers build SaaS products by providing software infrastructure like authentication, feature flags, user management, and more. 283 284We support connecting to Kinde through [our SDKs](/developer-tools/about/our-sdks/), but everything we build follows the OAuth 2.0 standard, so you can integrate Kinde into any language or framework without an SDK. 285 286## What you need 287 288- A [Kinde](/get-started/guides/first-things-first/) account with **Admin** or **Engineer** access (Sign up for free) 289- Knowledge of programming languages and OAuth 2.0 290 291## Quickstart 292 293### 1. Create a Kinde application 294 2951. Sign in to your Kinde dashboard and select **Add application** 2962. Enter a name for the application (e.g., âMy Appâ) 2973. Select an application type: 298 - **Back-end web**: for server-rendered or full-stack apps 299 - **Front-end and mobile**: for JavaScript-based single-page applications (SPAs) or mobile apps 300 3014. Select **Other** 3025. Select **Save**. 303 304### 2. Get your app keys 305 3061. In your app settings page, select **Details** 3072. Copy your app keys: 308 309 - **Custom domain**: if you have configured a [custom domain](/build/domains/pointing-your-domain/) 310 - **Domain**: your Kinde domain (use it if you don't have a custom domain) 311 - **Client ID**: a unique identifier for your app 312 - **Client secret**: (only for back-end apps) 313 314 You will need these keys to connect your codebase with Kinde. 315 316### 3. Add a callback URL 317 3181. In your app's **Details** page, scroll down to the **Callback URLs** section 3192. Add the following URLs: 320 - Allowed callback URLs (e.g., `http://localhost:3000/auth/callback`) 321 - Allowed logout redirect URLs (e.g., `http://localhost:3000`) 322 323 You can add more than one callback URL per line. 324 325 <Aside title="About callback URLs"> 326 Authorization servers require the callback URL to be registered ahead of time to prevent abuse. Whatever path you use for your callback URL, it must be registered with Kinde. The logout redirect URL is where Kinde redirects users after they sign out â typically your app's homepage. 327 </Aside> 3283. Select **Save** 329 330### 4. Set authentication methods 331 3321. In your app's settings page, go to **Authentication** 3332. Enable the authentication methods you want your users to sign in with (e.g., Google, Apple, SSO, etc.) 3343. Select **Save** 335 336### 5. Get the OpenID endpoints 337 338These are the OpenID endpoints for Kinde, found at: 339 340`<YOUR_DOMAIN>/.well-known/openid-configuration` 341 342<Aside> 343Replace `<YOUR_DOMAIN>` with either your custom domain (e.g., `https://auth.yourbusiness.com`) or your Kinde domain (e.g., `https://your_business.kinde.com`) 344</Aside> 345 346- Authorization endpoint: `<YOUR_DOMAIN>/oauth2/auth` 347- Token endpoint: `<YOUR_DOMAIN>/oauth2/token` 348- Userinfo endpoint: `<YOUR_DOMAIN>/oauth2/v2/user_profile` 349- Logout endpoint: `<YOUR_DOMAIN>/logout` 350 351**Other endpoints:** 352 353- JWKS URI: `<YOUR_DOMAIN>/.well-known/jwks` 354- Revocation endpoint: `<YOUR_DOMAIN>/oauth2/revoke` 355- Introspection endpoint: `<YOUR_DOMAIN>/oauth2/introspect` 356 357### 6. Create the authorization request 358 3591. Your user clicks a button to sign in or sign up in your app. 360 361 362<Tabs syncKey="auth-flow"> 363 <TabItem label="Backend application"> 364 2. In your app, generate a random `state` value and a `nonce`: 365 366 ```js title="Node.js example"
367 import crypto from 'node:crypto'; 368 369 const state = crypto.randomBytes(32).toString('hex'); 370 const nonce = crypto.randomBytes(32).toString('hex'); 371 ``` 372 373 Store `state` and `nonce` in your server-side session â you will need them when the user returns to the callback URL. 374 375 3. Send the user to Kinde's authorization endpoint with the `state` and `nonce` parameters included in the URL: 376 377 ```http 378 GET <YOUR_DOMAIN>/oauth2/auth 379 ?response_type=code 380 &client_id=<your_kinde_client_id> 381 &redirect_uri=<your_app_redirect_url> 382 &scope=openid%20profile%20email 383 &state=<your_random_state_value_min_8_characters> 384 &nonce=<your_random_nonce_value> 385 ``` 386 </TabItem> 387 <TabItem label="SPAs and mobile apps"> 388 2. In your app, generate a random `state` value, a `nonce`, a `code_verifier`, and derive a `code_challenge` from it: 389 390 ```js title="Browser JavaScript example" 391 function base64UrlEncode(buffer) { 392 const bytes = new Uint8Array(buffer); 393 let binary = ''; 394 for (const byte of bytes) { 395 binary += String.fromCharCode(byte); 396 } 397 return btoa(binary) 398 .replace(/\+/g, '-') 399 .replace(/\//g, '_') 400 .replace(/=+$/, ''); 401 } 402 403 const stateBytes = new Uint8Array(32); 404 crypto.getRandomValues(stateBytes); 405 const state = Array.from(stateBytes, (b) => 406 b.toString(16).padStart(2, '0') 407 ).join(''); 408 409 const nonceBytes = new Uint8Array(32); 410 crypto.getRandomValues(nonceBytes); 411 const nonce = Array.from(nonceBytes, (b) => 412 b.toString(16).padStart(2, '0') 413 ).join(''); 414 415 // 64 random bytes, base64url-encoded = 86-char code_verifier 416 const verifierBytes = new Uint8Array(64); 417 crypto.getRandomValues(verifierBytes); 418 const codeVerifier = base64UrlEncode(verifierBytes); 419 420 // SHA-256 hash of the verifier, base64url-encoded = code_challenge 421 const digest = await crypto.subtle.digest( 422 'SHA-256', 423 new TextEncoder().encode(codeVerifier) 424 ); 425 const codeChallenge = base64UrlEncode(digest); 426 ``` 427 428 Store `state`, `nonce`, and `code_verifier` in `sessionStorage` (for SPAs) and secure device storage (Keychain/Keystore) for mobile appsâ you will need them when the user returns to the callback URL. 429 430 3. Send the user to Kinde's authorization endpoint with the `state`, `nonce`, and PKCE parameters included in the URL: 431 432 ```http 433 GET <YOUR_DOMAIN>/oauth2/auth 434 ?response_type=code 435 &client_id=<your_kinde_client_id> 436 &redirect_uri=<your_app_redirect_url> 437 &scope=openid%20profile%20email 438 &state=<your_random_state_value_min_8_characters> 439 &nonce=<your_random_nonce_value> 440 &code_challenge=<code_challenge> 441 &code_challenge_method=S256 442 ``` 443 </TabItem> 444</Tabs> 445 <Aside> 446 The `redirect_uri` is your app's callback URL and must be registered with Kinde. 447 </Aside> 448 4494. The user is redirected to the Kinde sign in page and authenticates with their credentials (email/password, social login, SSO, etc.). 450 451### 7. Handle the callback 452 4531. Kinde redirects the user back to your `redirect_uri` with an authorization `code` and the original `state` value as query parameters: 454 455 ```text 456 https://your-app.com/auth/callback 457 ?code=<AUTHORIZATION_CODE> 458 &state=<your_random_state_value_min_8_characters> 459 ``` 460 4612. Validate that the returned `state` matches the one you generated in the previous step to prevent CSRF attacks. 462 463<Tabs syncKey="auth-flow"> 464 <TabItem label="Backend application"> 465 3. Exchange the authorization `code` for tokens by making a POST request to the Kinde token endpoint: 466 467 ```http 468 POST <YOUR_DOMAIN>/oauth2/token 469 Content-Type: application/x-www-form-urlencoded 470 471 grant_type=authorization_code 472 &code=<AUTHORIZATION_CODE> 473 &redirect_uri=<your_app_redirect_url> 474 &client_id=<your_kinde_client_id> 475 &client_secret=<your_kinde_client_secret> 476 ``` 477 </TabItem> 478 <TabItem label="SPAs and mobile apps"> 479 3. Exchange the authorization `code` for tokens by making a POST request to the Kinde token endpoint with the `code_verifier` â no `client_secret` needed: 480 481 ```http 482 POST <YOUR_DOMAIN>/oauth2/token 483 Content-Type: application/x-www-form-urlencoded 484 485 grant_type=authorization_code 486 &code=<AUTHORIZATION_CODE> 487 &redirect_uri=<your_app_redirect_url> 488 &client_id=<your_kinde_client_id> 489 &code_verifier=<code_verifier> 490 ``` 491 </TabItem> 492</Tabs> 493 4944. Kinde returns the tokens in the response body (same for both flows): 495 496 ```jsonc 497 { 498 "access_token": "...", 499 "id_token": "...", 500 "refresh_token": "..." // only if the "offline" scope was requested 501 } 502 ``` 503 504### 8. Display user information 505
5061. Redirect the user to a protected page in your app 5072. Decode the `id_token` with any standard [JWT library](https://www.jwt.io/libraries), or if you are using JavaScript, use the [Kinde JavaScript library](/build/tokens/decode-jwts/). Validate that the `nonce` claim matches the value you stored earlier to prevent replay attacks. 5083. Use the decoded claims to display in your app: 509 510 ```json 511 { 512 "sub": "kp_7a4b2c...", 513 "given_name": "Jane", 514 "family_name": "Doe", 515 "email": "[email protected]", 516 "picture": "https://gravatar.com/...", 517 "nonce": "<your_random_nonce_value>", 518 "iat": 1716800000, 519 "exp": 1716886400 520 } 521 ``` 522 523Alternatively, you can call the userinfo endpoint, passing the `access_token` as a Bearer token. This always returns an up-to-date version of the user's profile. See [When should I use the userinfo endpoint instead of decoding the `id_token`?](#when-should-i-use-the-userinfo-endpoint-instead-of-decoding-the-id_token) for more details. 524 525### 9. Test user registration 526 527Complete the registration flow in your app and verify that you can sign in to a protected page (e.g., a dashboard). 528 5291. Go to your Kinde dashboard and select **Users** 5302. You should see the new user's details in the list. 531 532## Authentication 533 534### Create a sign in or sign up link 535 536The following link redirects the user to the Kinde sign-in page by default: 537 538 ```http 539 GET <YOUR_DOMAIN>/oauth2/auth 540 ?response_type=code 541 &client_id=<your_kinde_client_id> 542 &redirect_uri=<your_app_redirect_url> 543 &scope=openid%20profile%20email 544 &state=<your_random_state_value_min_8_characters> 545 &nonce=<your_random_nonce_value> 546 ``` 547 548To send the user to the sign-up page instead, add `prompt=create` to the URL: 549 550 ```http 551 GET <YOUR_DOMAIN>/oauth2/auth 552 ?response_type=code 553 &client_id=<your_kinde_client_id> 554 &redirect_uri=<your_app_redirect_url> 555 &scope=openid%20profile%20email 556 &state=<your_random_state_value_min_8_characters> 557 &nonce=<your_random_nonce_value> 558 &prompt=create 559 ``` 560 561### Handle successful auth for desktop and mobile apps 562 563If you offer mobile and desktop apps alongside a browser-based version, you'll need to handle the post-authentication browser state. Rather than leaving a hanging screen, you can show users a success page. To do this, add the [`has_success_page`](/developer-tools/about/using-kinde-without-an-sdk/#has_success_page) parameter to the authorization URL. 564 565### Protect a route with auth 566 567Route protection works at two layers. Both are required â the frontend layer is UX, the backend layer is the real security gate. 568 569**Layer 1: Frontend â redirect unauthenticated users** 570 571Before rendering a protected page or screen, check that you have a valid, non-expired access token. If not, redirect to the Kinde authorization endpoint: 572 573```js 574function isTokenExpired(token) { 575 // JWT payloads are base64url-encoded; convert to standard base64 before decoding 576 const base64Url = token.split('.')[1]; 577 const base64 = base64Url.replace(/-/g, '+').replace(/_/g, '/'); 578 const { exp } = JSON.parse(atob(base64)); 579 return Date.now() >= exp * 1000; 580} 581 582// Run this check on every protected page load 583if (!accessToken || isTokenExpired(accessToken)) { 584 window.location.href = 585 '<YOUR_DOMAIN>/oauth2/auth?response_type=code&client_id=<CLIENT_ID>&...'; 586} 587``` 588 589<Aside type="warning"> 590Never rely on the frontend check alone. A user can bypass client-side redirects and call your API directly. The backend must always verify the token independently. 591</Aside> 592 593**Layer 2: Backend â verify the token on every request** 594 595Your server must validate the access token on every call to a protected endpoint. Send the token in the `Authorization` header: 596 597```http 598GET /api/protected-resource 599Authorization: Bearer <access_token> 600``` 601 602On the server, verify the token before returning any data: 603 604```js 605// Pseudocode â pattern is the same in Node, Python, Go, etc. 606function protectedRoute(req, res, next) { 607 const token = req.headers.authorization?.replace('Bearer ', ''); 608 if (!token) return res.status(401).json({ error: 'Unauthorized' }); 609 610 try { 611 const payload = verifyJWT(token, { 612 jwksUri: '<YOUR_DOMAIN>/.well-known/jwks', 613 issuer: '<YOUR_DOMAIN>', 614 }); 615 req.user = payload; // access sub, org_code, scp, permissions 616 next(); 617 } catch { 618 return res.status(401).json({ error: 'Invalid or expired token' }); 619 } 620} 621``` 622 623See [Validate the access token](#validate-the-access-token) below for the full list of claims to check. 624
625**Using claims for authorization** 626 627Once the token is verified, use the claims inside it to make access decisions: 628 629| Claim | Use for | 630| --- | --- | 631| `sub` | Identify the user â link to your own database records | 632| `scp` | Check the user has the required OAuth scopes | 633| `permissions` | Fine-grained access control (e.g. `read:reports`) | 634| `org_code` | Multi-tenant apps â confirm the user belongs to the right organization | 635 636**Handling token expiry** 637 638By default, access tokens expire after 24 hours. If you requested the `offline` scope, use the refresh token to get a new access token silently â without sending the user through the login flow again: 639 640<Tabs syncKey="auth-flow"> 641 <TabItem label="Backend application"> 642 ```http 643 POST <YOUR_DOMAIN>/oauth2/token 644 Content-Type: application/x-www-form-urlencoded 645 646 grant_type=refresh_token 647 &client_id=<CLIENT_ID> 648 &client_secret=<CLIENT_SECRET> 649 &refresh_token=<REFRESH_TOKEN> 650 ``` 651 </TabItem> 652 <TabItem label="SPAs and mobile apps"> 653 ```http 654 POST <YOUR_DOMAIN>/oauth2/token 655 Content-Type: application/x-www-form-urlencoded 656 657 grant_type=refresh_token 658 &client_id=<CLIENT_ID> 659 &refresh_token=<REFRESH_TOKEN> 660 ``` 661 </TabItem> 662</Tabs> 663 664If no refresh token is available (i.e. `offline` scope was not requested), redirect the user to sign in again. 665 666### Validate the access token 667 668Always verify the `access_token` signature on your server before trusting any request. Kinde signs tokens with RS256 and publishes its public keys at the JWKS endpoint: 669 670```text 671<YOUR_DOMAIN>/.well-known/jwks 672``` 673 674Most JWT libraries accept a JWKS URL directly â point your library at this URL and it will fetch and cache the correct public key automatically. 675 676As part of verification, validate the following claims: 677 678| Claim | Expected value | 679| --- | --- | 680| `iss` | `<YOUR_DOMAIN>` | 681| `aud` | Your API audience if configured | 682| `exp` | Must be in the future | 683| `iat` | Must be in the past | 684 685Reject any token that fails signature verification or has an unexpected claim value. 686 687### Kinde self-serve portal link 688 689Call the Kinde Account API with the logged-in user's access token to generate a self-serve portal link for the user: 690 691```javascript title="JavaScript example" 692const response = await fetch("<YOUR_DOMAIN>/account_api/v1/portal_link", { 693 headers: { 694 Authorization: `Bearer ${userAccessToken}` 695 } 696}); 697const data = await response.json(); 698window.location = data.url; 699``` 700 701Optional parameters: 702 703- `subnav` â specify the portal section to open (e.g., `organization_details`, `profile`). 704- `return_url` â where to redirect the user after exiting the portal. 705 706See: [Self-serve portal for users](/build/self-service-portal/self-serve-portal-for-users/). 707 708### Sign out your users 709 710To sign a user out: 711 7121. Clear any session or token storage in your app 7132. Redirect them to the Kinde logout endpoint with your logout URL: 714 715 ```text 716 <YOUR_DOMAIN>/logout?redirect=<your_logout_url> 717 ``` 718 719 This ends their Kinde session. They will need to authenticate again to receive new tokens. 720 721To register a logout URL, go to **Settings > Applications > [Your app] > View details**, then add it to the **Allowed logout redirect URLs** field. 722 723## Supported grant types in Kinde 724 725### Authorization Code Flow 726 727The Authorization Code Flow is the standard way to sign users in when your app runs on a server you control. Instead of returning tokens directly in the browser, Kinde redirects the user back to your app with a short-lived authorization `code`. Your server then exchanges that code for tokens by making a secure back-channel request to Kinde's token endpoint, including your `client_secret`. This two-step design keeps tokens off the URL and out of the browser â the authorization code is useless on its own without your secret. Use this flow for server-rendered web applications, traditional back-end web apps, and any client that can store a `client_secret` securely on the server. 728 729### PKCE extension 730 731The Authorization Code Flow with PKCE (Proof Key for Code Exchange) works the same way, but replaces the `client_secret` with a one-time cryptographic proof. Before redirecting the user to Kinde, your app generates a random `code_verifier` and sends a hashed version (`code_challenge`) in the authorization request. When exchanging the authorization code for tokens, your app sends the original `code_verifier` instead of a secret. Kinde verifies they match, proving that the same app that started the login is completing it. This matters because single-page apps (SPAs) and mobile apps are "public clients" â their code runs on the user's device, so a `client_secret` could be extracted and abused. PKCE gives you the security of the authorization code flow without needing a secret. Use PKCE for SPAs, native mobile apps, desktop apps, and any client that cannot keep a `client_secret` confidential. 732 733### Implicit flow (Not recommended) 734 735The Implicit Flow was originally created for browser-based apps that couldn't keep a secret â it returned the `access_token` directly in the URL fragment after login. That convenience came at a serious cost: tokens in URL fragments can leak through browser history, referrer headers, and server logs. The OAuth 2.0 Security Best Current Practice ([RFC 9700](https://datatracker.ietf.org/doc/html/rfc9700#name-implicit-grant)) now explicitly recommends against using the Implicit Flow for any new application. 736 737**What to use instead:** The Authorization Code Flow with PKCE is the correct choice for all public clients â including single-page apps and mobile apps â regardless of whether they can store a client secret. PKCE (Proof Key for Code Exchange) solves the same problem the Implicit Flow was trying to address, without the token-in-URL security exposure. 738 739If you are migrating an existing app from the Implicit Flow, replace the flow type `token` with `code` and add the `code_challenge` and `code_challenge_method` parameters to your authorization request. No client secret is required. 740 741## OAuth 2.0 scopes for Kinde 742 743The following scopes can be requested from Kinde. 744 745### `openid` 746
747Requests an `id_token` that contains information about the authenticated user. 748 749### `email` 750 751Requests the `email` and `email_verified` claims in the `id_token`. 752 753### `profile` 754 755Requests profile details as part of the `id_token`, including given name, family name, and picture. 756 757### `offline` 758 759Requests a `refresh_token` that can be used to silently refresh the `access_token` when it expires. 760 761 <Aside type="warning" title="Use offline, not offline_access"> 762 763 Kinde uses `offline` to request a refresh token. The OIDC specification defines this scope as `offline_access`, but Kinde does not support `offline_access` â using it will not return a refresh token and will not produce an error. Make sure to use `offline` exactly. 764 765 </Aside> 766 767### `phone` 768 769Requests the `phone_number` and `phone_number_verified` claims in the `id_token`. 770 771### `address` 772 773Requests the `address` claim in the `id_token`. 774 775## **Request parameters** 776 777There are a few useful additional parameters that Kinde supports in the authorization URL. 778 779### `response_type` 780 781Should always be `code`. Kinde does not support the Implicit Flow â see [Does Kinde support the Implicit Flow?](#does-kinde-support-the-implicit-flow) for details. 782 783Type: `string` 784 785Required: Yes 786 787### `client_id` 788 789The unique ID of your application in Kinde. 790 791Type: `string` 792 793Required: Yes 794 795### `redirect_uri` 796 797The URL that the user will be returned to after authentication. 798 799Type: `string` 800 801Required: Yes 802 803### `scope` 804 805The scopes to be requested from Kinde. Scopes include `openid`, `profile`, `email`, `offline`. 806 807Type: `string` 808 809Required: No 810 811Recommended: `openid profile email` 812 813<Aside> 814Kinde uses `offline` to request a refresh token in place of the OIDC specification's `offline_access` scope. 815</Aside> 816 817### `state` 818 819Kinde will return this to your app so you can validate it came from us and prevent CSRF attacks. 820 821Type: `string` 822 823Required: Yes (min 8 characters) 824 825You can also use the `state` parameter to store additional information about the user or the authentication flow. 826 827### `nonce` 828 829A single-use value included in the signed `id_token` to prevent replay attacks. 830 831Type: `string` 832 833Required: No (but recommended) 834 835### `code_challenge` 836 837A base64url-encoded SHA-256 hash of the code verifier. 838 839Type: `string` 840 841Required: for public clients (e.g., SPAs and mobile apps) 842 843### `code_challenge_method` 844 845Should always be `S256`. This tells Kinde that the code challenge was generated using SHA-256. 846 847Type: `string` 848 849Required: For PKCE 850 851### `prompt` 852 853Accepts `login`, `create`, `consent`, `select_account`, or `none` to control which page users land on. By default, users are directed to the sign-in page. 854 855If you use `none`, Kinde will not show authentication screens to the user. 856 857- If the user has an active SSO session, this will redirect them to the callback URL where the token exchange can occur. 858- If the user does NOT have an active SSO session, this will redirect them to the callback URL with the following error: 859 860 ```http 861 302 <YOUR_CALLBACK_URL>? 862 error=login_required& 863 error_description=User+authentication+is+required& 864 state=YOUR_STATE 865 ``` 866 867Type: `string` 868 869Required: No 870 871### `login_hint` 872 873When your project knows which user it is trying to authenticate, it can provide their email in this parameter as a hint to Kinde. Passing this hint pre-fills the email box on the sign-up and sign-in screens. 874 875Type: `string` 876 877Required: No 878 879### `org_code` 880 881For multi-tenant or platform apps, tell Kinde which organization a user is trying to sign in or sign up to. 882 883Type: `string` 884 885Required: No 886 887### `is_create_org` 888 889Set to `true` to create a new organization for the user during sign-up. 890 891Type: `boolean` 892 893Required: No 894 895### `org_name` 896 897If `is_create_org` is `true`, you can optionally include the name of the organization to create. 898 899Type: `string` 900 901Required: No 902 903### `audience` 904 905The `audience` claim for the JWT. This can be used to protect your APIs and resource servers. 906 907Type: `string` 908 909Required: No 910 911### `has_success_page` 912 913Shows a success page at the end of the authentication flow. Useful when the callback URL opens a native app rather than a web page. 914 915Type: `boolean` 916 917Required: No 918 919### `lang` 920 921Sets the UI language for the authentication screens. 922 923Type: `string` 924 925Required: No 926 927### `connection_id` 928 929The connection ID for the authentication method, used when implementing [custom sign-up and sign-in pages](/authenticate/custom-configurations/custom-authentication-pages/). 930 931Type: `string` 932 933Required: When using custom sign-up and sign-in pages 934 935### `supports_reauth` 936 937When set to `true`, the user's state is encrypted and returned to the application when they access an expired link. 938 939Type: `boolean` 940 941Required: No 942 943### `reauth_state` 944 945When `supports_reauth` is `true` and authentication fails, the user's state is returned alongside the error. Pass this value back to the authorization flow to resume where the user left off. 946 947Type: `string` 948 949Required: No 950 951### `deploy_id` 952 953The ID of a workflow deployment to test. When set, a password will be requested on login. 954 955Type: `string` 956 957Required: No 958 959### `plan_interest` 960 961Indicates the plan the user has expressed interest in. 962 963Type: `string` 964 965Required: No 966 967### `pricing_table_key` 968 969Defines which pricing table to display in the billing flow. 970 971Type: `string` 972 973Required: No 974 975### `start_page` (deprecated) 976 977Accepts `login` or `registration`. Use `prompt` instead. 978 979Type: `string` 980 981Required: No 982 983## FAQs 984 985### When should I use the userinfo endpoint instead of decoding the `id_token`? 986 987Decoding the `id_token` is usually the fastest approach â it requires no extra network request. However, there are three situations where calling the userinfo endpoint is the right choice: 988 989- **You need up-to-date profile data.** The `id_token` is a snapshot frozen at login time. If the user updates their name, email, or avatar in Kinde after they've authenticated, the `id_token` stays stale until they get a new one. The userinfo endpoint queries Kinde live and always returns current data. 990- **Your backend only has the `access_token`.** The `id_token` is typically held by the frontend. If your server needs to look up the authenticated user's profile, it can call the userinfo endpoint using the `access_token` from the request header â without needing the frontend to forward the `id_token` separately. 991- **You didn't request the `openid` scope.** Without `openid`, no `id_token` is issued. The userinfo endpoint still works as long as you hold a valid `access_token`. 992 993In all other cases, prefer decoding the `id_token` â it's faster and requires no round trip to Kinde. 994 995To call the userinfo endpoint, pass the `access_token` as a Bearer token: 996 997```http 998GET https://<YOUR_DOMAIN>/oauth2/v2/user_profile 999Authorization: Bearer <access_token> 1000``` 1001 1002The response returns the user's current profile fields: 1003 1004```json 1005{ 1006 "sub": "kp_7a4b2c...", 1007 "given_name": "Jane", 1008 "family_name": "Doe", 1009 "email": "[email protected]", 1010 "picture": "https://gravatar.com/..." 1011} 1012``` 1013 1014<Aside> 1015The fields returned depend on the scopes that were granted. `email` and `email_verified` require the `email` scope. `given_name`, `family_name`, and `picture` require the `profile` scope. 1016</Aside>"> <svg width="16" height="16" class="astro-t7t3bc52" data-icon="sparkle"> <symbol id="ai:local:sparkle" viewBox="0 0 24 24"><g fill="none" stroke="currentColor" stroke-width="1.5"><path stroke-linejoin="round" d="m10.25 4.5 1.856 5.644L17.75 12l-5.644 1.856L10.25 19.5l-1.856-5.644L2.75 12l5.644-1.856z"/><path stroke-linecap="round" d="M18.5 2.75v5.5M15.75 5.5h5.5M18.5 15.75v5.5m-2.75-2.75h5.5"/></g></symbol><use href="#ai:local:sparkle"></use> </svg> <span class="astro-t7t3bc52">Copy for AI</span> </button> </aside>
1016<script type="module">document.getElementById("copy-markdown-button")?.addEventListener("click",async function(){try{const n=this.getAttribute("data-markdown");if(!n){console.error("No markdown content available");return}const i=`# ${document.querySelector("h1")?.textContent||"Kinde Documentation"} 1017 1018Source: ${window.location.href} 1019 1020${n} 1021 1022--- 1023*This content was copied from the Kinde documentation page. You can use this markdown content with any AI LLM to get help with this documentation.*`;await navigator.clipboard.writeText(i);const o=this.querySelector("span");if(o){const d=o.textContent;o.textContent="Markdown copied!";const e=document.createElement("div");e.style.cssText=` 1024 position: fixed; 1025 top: 20px; 1026 right: 20px; 1027 background: #10b981; 1028 color: white; 1029 padding: 12px 16px; 1030 border-radius: 8px; 1031 font-size: 14px; 1032 z-index: 10000; 1033 max-width: 300px; 1034 box-shadow: 0 4px 12px rgba(0,0,0,0.15); 1035 `,e.innerHTML=` 1036 <div style="font-weight: 600; margin-bottom: 4px;">Markdown copied to clipboard!</div> 1037 <div style="font-size: 12px;">You can now paste this into any AI LLM.</div> 1038 `,document.body.appendChild(e),setTimeout(()=>{e.parentNode&&e.parentNode.removeChild(e)},4e3),setTimeout(()=>{o&&(o.textContent=d)},3e3)}}catch(n){console.error("Error copying markdown:",n);const t=document.createElement("div");t.style.cssText=` 1039 position: fixed; 1040 top: 20px; 1041 right: 20px; 1042 background: #ef4444; 1043 color: white; 1044 padding: 12px 16px; 1045 border-radius: 8px; 1046 font-size: 14px; 1047 z-index: 10000; 1048 max-width: 300px; 1049 box-shadow: 0 4px 12px rgba(0,0,0,0.15); 1050 `,t.innerHTML=` 1051 <div style="font-weight: 600; margin-bottom: 4px;">Error copying markdown</div> 1052 <div style="font-size: 12px;">Please try again.</div> 1053 `,document.body.appendChild(t),setTimeout(()=>{t.parentNode&&t.parentNode.removeChild(t)},4e3)}});</script>
1053<starlight-toc data-min-h="2" data-max-h="3"><nav aria-labelledby="starlight__on-this-page"><h2 id="starlight__on-this-page">On this page</h2><ul class="astro-g2bywc46" style="--depth: 0;"> <li class="astro-g2bywc46" style="--depth: 0;"> <a href="#_top" class="astro-g2bywc46" style="--depth: 0;"> <span class="astro-g2bywc46" style="--depth: 0;">Overview</span> </a> </li><li class="astro-g2bywc46" style="--depth: 0;"> <a href="#what-you-need" class="astro-g2bywc46" style="--depth: 0;"> <span class="astro-g2bywc46" style="--depth: 0;">What you need</span> </a> </li><li class="astro-g2bywc46" style="--depth: 0;"> <a href="#quickstart" class="astro-g2bywc46" style="--depth: 0;"> <span class="astro-g2bywc46" style="--depth: 0;">Quickstart</span> </a> <ul class="astro-g2bywc46" style="--depth: 1;"> <li class="astro-g2bywc46" style="--depth: 1;"> <a href="#1-create-a-kinde-application" class="astro-g2bywc46" style="--depth: 1;"> <span class="astro-g2bywc46" style="--depth: 1;">1. Create a Kinde application</span> </a> </li><li class="astro-g2bywc46" style="--depth: 1;"> <a href="#2-get-your-app-keys" class="astro-g2bywc46" style="--depth: 1;"> <span class="astro-g2bywc46" style="--depth: 1;">2. Get your app keys</span> </a> </li><li class="astro-g2bywc46" style="--depth: 1;"> <a href="#3-add-a-callback-url" class="astro-g2bywc46" style="--depth: 1;"> <span class="astro-g2bywc46" style="--depth: 1;">3. Add a callback URL</span> </a> </li><li class="astro-g2bywc46" style="--depth: 1;"> <a href="#4-set-authentication-methods" class="astro-g2bywc46" style="--depth: 1;"> <span class="astro-g2bywc46" style="--depth: 1;">4. Set authentication methods</span> </a> </li><li class="astro-g2bywc46" style="--depth: 1;"> <a href="#5-get-the-openid-endpoints" class="astro-g2bywc46" style="--depth: 1;"> <span class="astro-g2bywc46" style="--depth: 1;">5. Get the OpenID endpoints</span> </a> </li><li class="astro-g2bywc46" style="--depth: 1;"> <a href="#6-create-the-authorization-request" class="astro-g2bywc46" style="--depth: 1;"> <span class="astro-g2bywc46" style="--depth: 1;">6. Create the authorization request</span> </a> </li><li class="astro-g2bywc46" style="--depth: 1;"> <a href="#7-handle-the-callback" class="astro-g2bywc46" style="--depth: 1;"> <span class="astro-g2bywc46" style="--depth: 1;">7. Handle the callback</span> </a> </li><li class="astro-g2bywc46" style="--depth: 1;"> <a href="#8-display-user-information" class="astro-g2bywc46" style="--depth: 1;"> <span class="astro-g2bywc46" style="--depth: 1;">8. Display user information</span> </a> </li><li class="astro-g2bywc46" style="--depth: 1;"> <a href="#9-test-user-registration" class="astro-g2bywc46" style="--depth: 1;"> <span class="astro-g2bywc46" style="--depth: 1;">9. Test user registration</span> </a> </li> </ul> </li><li class="astro-g2bywc46" style="--depth: 0;"> <a href="#authentication" class="astro-g2bywc46" style="--depth: 0;"> <span class="astro-g2bywc46" style="--depth: 0;">Authentication</span> </a> <ul class="astro-g2bywc46" style="--depth: 1;"> <li class="astro-g2bywc46" style="--depth: 1;"> <a href="#create-a-sign-in-or-sign-up-link" class="astro-g2bywc46" style="--depth: 1;"> <span class="astro-g2bywc46" style="--depth: 1;">Create a sign in or sign up link</span> </a> </li><li class="astro-g2bywc46" style="--depth: 1;"> <a href="#handle-successful-auth-for-desktop-and-mobile-apps" class="astro-g2bywc46" style="--depth: 1;"> <span class="astro-g2bywc46" style="--depth: 1;">Handle successful auth for desktop and mobile apps</span> </a> </li><li class="astro-g2bywc46" style="--depth: 1;"> <a href="#protect-a-route-with-auth" class="astro-g2bywc46" style="--depth: 1;"> <span class="astro-g2bywc46" style="--depth: 1;">Protect a route with auth</span> </a> </li><li class="astro-g2bywc46" style="--depth: 1;"> <a href="#validate-the-access-token" class="astro-g2bywc46" style="--depth: 1;"> <span class="astro-g2bywc46" style="--depth: 1;">Validate the access token</span> </a> </li><li class="astro-g2bywc46" style="--depth: 1;"> <a href="#kinde-self-serve-portal-link" class="astro-g2bywc46" style="--depth: 1;"> <span class="astro-g2bywc46" style="--depth: 1;">Kinde self-serve portal link</span> </a> </li><li class="astro-g2bywc46" style="--depth: 1;"> <a href="#sign-out-your-users" class="astro-g2bywc46" style="--depth: 1;"> <span class="astro-g2bywc46" style="--depth: 1;">Sign out your users</span> </a> </li> </ul> </li><li class="astro-g2bywc46" style="--depth: 0;"> <a href="#supported-grant-types-in-kinde" class="astro-g2bywc46" style="--depth: 0;"> <span class="astro-g2bywc46" style="--depth: 0;">Supported grant types in Kinde</span> </a> <ul class="astro-g2bywc46" style="--depth: 1;"> <li class="astro-g2bywc46" style="--depth: 1;"> <a href="#authorization-code-flow" class="astro-g2bywc46" style="--depth: 1;"> <span class="astro-g2bywc46" style="--depth: 1;">Authorization Code Flow</span> </a> </li><li class="astro-g2bywc46" style="--depth: 1;"> <a href="#pkce-extension" class="astro-g2bywc46" style="--depth: 1;"> <span class="astro-g2bywc46" style="--depth: 1;">PKCE extension</span> </a> </li><li class="astro-g2bywc46" style="--depth: 1;"> <a href="#implicit-flow-not-recommended" class="astro-g2bywc46" style="--depth: 1;"> <span class="astro-g2bywc46" style="--depth: 1;">Implicit flow (Not recommended)</span> </a> </li> </ul> </li><li class="astro-g2bywc46" style="--depth: 0;"> <a href="#oauth-20-scopes-for-kinde" class="astro-g2bywc46" style="--depth: 0;"> <span class="astro-g2bywc46" style="--depth: 0;">OAuth 2.0 scopes for Kinde</span> </a> <ul class="astro-g2bywc46" style="--depth: 1;"> <li class="astro-g2bywc46" style="--depth: 1;"> <a href="#openid" class="astro-g2bywc46" style="--depth: 1;"> <span class="astro-g2bywc46" style="--depth: 1;">openid</span> </a> </li><li class="astro-g2bywc46" style="--depth: 1;"> <a href="#email" class="astro-g2bywc46" style="--depth: 1;"> <span class="astro-g2bywc46" style="--depth: 1;">email</span> </a> </li><li class="astro-g2bywc46" style="--depth: 1;"> <a href="#profile" class="astro-g2bywc46" style="--depth: 1;"> <span class="astro-g2bywc46" style="--depth: 1;">profile</span> </a> </li><li class="astro-g2bywc46" style="--depth: 1;"> <a href="#offline" class="astro-g2bywc46" style="--depth: 1;"> <span class="astro-g2bywc46" style="--depth: 1;">offline</span> </a> </li><li class="astro-g2bywc46" style="--depth: 1;"> <a href="#phone" class="astro-g2bywc46" style="--depth: 1;"> <span class="astro-g2bywc46" style="--depth: 1;">phone</span> </a> </li><li class="astro-g2bywc46" style="--depth: 1;"> <a href="#address" class="astro-g2bywc46" style="--depth: 1;"> <span class="astro-g2bywc46" style="--depth: 1;">address</span> </a> </li> </ul> </li><li class="astro-g2bywc46" style="--depth: 0;"> <a href="#request-parameters" class="astro-g2bywc46" style="--depth: 0;"> <span class="astro-g2bywc46" style="--depth: 0;">Request parameters</span> </a> <ul class="astro-g2bywc46" style="--depth: 1;"> <li class="astro-g2bywc46" style="--depth: 1;"> <a href="#response_type" class="astro-g2bywc46" style="--depth: 1;"> <span class="astro-g2bywc46" style="--depth: 1;">response_type</span> </a> </li><li class="astro-g2bywc46" style="--depth: 1;"> <a href="#client_id" class="astro-g2bywc46" style="--depth: 1;"> <span class="astro-g2bywc46" style="--depth: 1;">client_id</span> </a> </li><li class="astro-g2bywc46" style="--depth: 1;"> <a href="#redirect_uri" class="astro-g2bywc46" style="--depth: 1;"> <span class="astro-g2bywc46" style="--depth: 1;">redirect_uri</span> </a> </li><li class="astro-g2bywc46" style="--depth: 1;"> <a href="#scope" class="astro-g2bywc46" style="--depth: 1;"> <span class="astro-g2bywc46" style="--depth: 1;">scope</span> </a> </li><li class="astro-g2bywc46" style="--depth: 1;"> <a href="#state" class="astro-g2bywc46" style="--depth: 1;"> <span class="astro-g2bywc46" style="--depth: 1;">state</span> </a> </li><li class="astro-g2bywc46" style="--depth: 1;"> <a href="#nonce" class="astro-g2bywc46" style="--depth: 1;"> <span class="astro-g2bywc46" style="--depth: 1;">nonce</span> </a> </li><li class="astro-g2bywc46" style="--depth: 1;"> <a href="#code_challenge" class="astro-g2bywc46" style="--depth: 1;"> <span class="astro-g2bywc46" style="--depth: 1;">code_challenge</span> </a> </li><li class="astro-g2bywc46" style="--depth: 1;"> <a href="#code_challenge_method" class="astro-g2bywc46" style="--depth: 1;"> <span class="astro-g2bywc46" style="--depth: 1;">code_challenge_method</span> </a> </li><li class="astro-g2bywc46" style="--depth: 1;"> <a href="#prompt" class="astro-g2bywc46" style="--depth: 1;"> <span class="astro-g2bywc46" style="--depth: 1;">prompt</span> </a> </li><li class="astro-g2bywc46" style="--depth: 1;"> <a href="#login_hint" class="astro-g2bywc46" style="--depth: 1;"> <span class="astro-g2bywc46" style="--depth: 1;">login_hint</span> </a> </li><li class="astro-g2bywc46" style="--depth: 1;"> <a href="#org_code" class="astro-g2bywc46" style="--depth: 1;"> <span class="astro-g2bywc46" style="--depth: 1;">
1053org_code</span> </a> </li><li class="astro-g2bywc46" style="--depth: 1;"> <a href="#is_create_org" class="astro-g2bywc46" style="--depth: 1;"> <span class="astro-g2bywc46" style="--depth: 1;">is_create_org</span> </a> </li><li class="astro-g2bywc46" style="--depth: 1;"> <a href="#org_name" class="astro-g2bywc46" style="--depth: 1;"> <span class="astro-g2bywc46" style="--depth: 1;">org_name</span> </a> </li><li class="astro-g2bywc46" style="--depth: 1;"> <a href="#audience" class="astro-g2bywc46" style="--depth: 1;"> <span class="astro-g2bywc46" style="--depth: 1;">audience</span> </a> </li><li class="astro-g2bywc46" style="--depth: 1;"> <a href="#has_success_page" class="astro-g2bywc46" style="--depth: 1;"> <span class="astro-g2bywc46" style="--depth: 1;">has_success_page</span> </a> </li><li class="astro-g2bywc46" style="--depth: 1;"> <a href="#lang" class="astro-g2bywc46" style="--depth: 1;"> <span class="astro-g2bywc46" style="--depth: 1;">lang</span> </a> </li><li class="astro-g2bywc46" style="--depth: 1;"> <a href="#connection_id" class="astro-g2bywc46" style="--depth: 1;"> <span class="astro-g2bywc46" style="--depth: 1;">connection_id</span> </a> </li><li class="astro-g2bywc46" style="--depth: 1;"> <a href="#supports_reauth" class="astro-g2bywc46" style="--depth: 1;"> <span class="astro-g2bywc46" style="--depth: 1;">supports_reauth</span> </a> </li><li class="astro-g2bywc46" style="--depth: 1;"> <a href="#reauth_state" class="astro-g2bywc46" style="--depth: 1;"> <span class="astro-g2bywc46" style="--depth: 1;">reauth_state</span> </a> </li><li class="astro-g2bywc46" style="--depth: 1;"> <a href="#deploy_id" class="astro-g2bywc46" style="--depth: 1;"> <span class="astro-g2bywc46" style="--depth: 1;">deploy_id</span> </a> </li><li class="astro-g2bywc46" style="--depth: 1;"> <a href="#plan_interest" class="astro-g2bywc46" style="--depth: 1;"> <span class="astro-g2bywc46" style="--depth: 1;">plan_interest</span> </a> </li><li class="astro-g2bywc46" style="--depth: 1;"> <a href="#pricing_table_key" class="astro-g2bywc46" style="--depth: 1;"> <span class="astro-g2bywc46" style="--depth: 1;">pricing_table_key</span> </a> </li><li class="astro-g2bywc46" style="--depth: 1;"> <a href="#start_page-deprecated" class="astro-g2bywc46" style="--depth: 1;"> <span class="astro-g2bywc46" style="--depth: 1;">start_page (deprecated)</span> </a> </li> </ul> </li><li class="astro-g2bywc46" style="--depth: 0;"> <a href="#faqs" class="astro-g2bywc46" style="--depth: 0;"> <span class="astro-g2bywc46" style="--depth: 0;">FAQs</span> </a> <ul class="astro-g2bywc46" style="--depth: 1;"> <li class="astro-g2bywc46" style="--depth: 1;"> <a href="#when-should-i-use-the-userinfo-endpoint-instead-of-decoding-the-id_token" class="astro-g2bywc46" style="--depth: 1;"> <span class="astro-g2bywc46" style="--depth: 1;">When should I use the userinfo endpoint instead of decoding the id_token?</span> </a> </li> </ul> </li> </ul> </nav></starlight-toc>
1053<script type="module" src="/_astro/TableOfContents.astro_astro_type_script_index_0_lang.CKWWgpjV.js"></script>
1053</div></div> </div> </aside> <div class="main-pane astro-67yu43on"> <main data-pagefind-body="true" lang="en" dir="ltr" class="astro-bguv2lll"> <div class="content-panel astro-7nkwcw3z"> <div class="sl-container astro-7nkwcw3z"> <div class="c-breadcrumb"><ul class="flex list-none items-center p-0 text-sm text-zinc-500 dark:text-zinc-400"> 1054 <li>SDKs and APIs</li> 1055 <li class="before:px-2 before:content-['/']">Overview</li> 1056 </ul><span hidden id="docsearch-lvl0">SDKs and APIs / Overview</span></div><h1 id="_top" class="astro-j6tvhyss">Use Kinde without an SDK</h1> </div> </div> <div class="content-panel astro-7nkwcw3z"> <div class="sl-container astro-7nkwcw3z"> <div class="sl-markdown-content"> <p>Kinde is designed to help founders and developers build SaaS products by providing software infrastructure like authentication, feature flags, user management, and more.</p> 1057<p>We support connecting to Kinde through <a href="/developer-tools/about/our-sdks/">our SDKs</a>, but everything we build follows the OAuth 2.0 standard, so you can integrate Kinde into any language or framework without an SDK.</p> 1058<div tabindex="-1" class="rehype-heading-wrapper flex items-center relative w-auto rehype-level-h2"><h2 id="what-you-need">What you need</h2><a class="rehype-anchor-link inline-flex h-6 items-center justify-center min-w-8 hover:opacity-100" href="#what-you-need"><span aria-hidden="true" class="rehype-anchor-icon"><svg width="16" height="16" version="1.1" viewBox="0 0 16 16" xlmns="http://www.w3.org/2000/svg"><path fill-rule="evenodd" fill="currentcolor" d="M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z"></path></svg></span><span is:raw="true" class="sr-only">Link to this section</span></a></div> 1059<ul> 1060<li>A <a href="/get-started/guides/first-things-first/">Kinde</a> account with <strong>Admin</strong> or <strong>Engineer</strong> access (Sign up for free)</li> 1061<li>Knowledge of programming languages and OAuth 2.0</li> 1062</ul> 1063<div tabindex="-1" class="rehype-heading-wrapper flex items-center relative w-auto rehype-level-h2"><h2 id="quickstart">Quickstart</h2><a class="rehype-anchor-link inline-flex h-6 items-center justify-center min-w-8 hover:opacity-100" href="#quickstart"><span aria-hidden="true" class="rehype-anchor-icon"><svg width="16" height="16" version="1.1" viewBox="0 0 16 16" xlmns="http://www.w3.org/2000/svg"><path fill-rule="evenodd" fill="currentcolor" d="M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z"></path></svg></span><span is:raw="true" class="sr-only">Link to this section</span></a></div> 1064<div tabindex="-1" class="rehype-heading-wrapper flex items-center relative w-auto rehype-level-h3"><h3 id="1-create-a-kinde-application">1. Create a Kinde application</h3><a class="rehype-anchor-link inline-flex h-6 items-center justify-center min-w-8 hover:opacity-100" href="#1-create-a-kinde-application"><span aria-hidden="true" class="rehype-anchor-icon"><svg width="16" height="16" version="1.1" viewBox="0 0 16 16" xlmns="http://www.w3.org/2000/svg"><path fill-rule="evenodd" fill="currentcolor" d="M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z"></path></svg></span><span is:raw="true" class="sr-only">Link to this section</span></a></div> 1065<ol> 1066<li> 1067<p>Sign in to your Kinde dashboard and select <strong>Add application</strong></p> 1068</li> 1069<li> 1070<p>Enter a name for the application (e.g., âMy Appâ)</p> 1071</li> 1072<li> 1073<p>Select an application type:</p> 1074<ul> 1075<li><strong>Back-end web</strong>: for server-rendered or full-stack apps</li> 1076<li><strong>Front-end and mobile</strong>: for JavaScript-based single-page applications (SPAs) or mobile apps</li> 1077</ul> 1078</li> 1079<li> 1080<p>Select <strong>Other</strong></p> 1081</li> 1082<li> 1083<p>Select <strong>Save</strong>.</p> 1084</li> 1085</ol> 1086<div tabindex="-1" class="rehype-heading-wrapper flex items-center relative w-auto rehype-level-h3">
1086<h3 id="2-get-your-app-keys">2. Get your app keys</h3><a class="rehype-anchor-link inline-flex h-6 items-center justify-center min-w-8 hover:opacity-100" href="#2-get-your-app-keys"><span aria-hidden="true" class="rehype-anchor-icon"><svg width="16" height="16" version="1.1" viewBox="0 0 16 16" xlmns="http://www.w3.org/2000/svg"><path fill-rule="evenodd" fill="currentcolor" d="M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z"></path></svg></span><span is:raw="true" class="sr-only">Link to this section</span></a></div> 1087<ol> 1088<li> 1089<p>In your app settings page, select <strong>Details</strong></p> 1090</li> 1091<li> 1092<p>Copy your app keys:</p> 1093<ul> 1094<li><strong>Custom domain</strong>: if you have configured a <a href="/build/domains/pointing-your-domain/">custom domain</a></li> 1095<li><strong>Domain</strong>: your Kinde domain (use it if you donât have a custom domain)</li> 1096<li><strong>Client ID</strong>: a unique identifier for your app</li> 1097<li><strong>Client secret</strong>: (only for back-end apps)</li> 1098</ul> 1099<p>You will need these keys to connect your codebase with Kinde.</p> 1100</li> 1101</ol> 1102<div tabindex="-1" class="rehype-heading-wrapper flex items-center relative w-auto rehype-level-h3"><h3 id="3-add-a-callback-url">3. Add a callback URL</h3><a class="rehype-anchor-link inline-flex h-6 items-center justify-center min-w-8 hover:opacity-100" href="#3-add-a-callback-url"><span aria-hidden="true" class="rehype-anchor-icon"><svg width="16" height="16" version="1.1" viewBox="0 0 16 16" xlmns="http://www.w3.org/2000/svg"><path fill-rule="evenodd" fill="currentcolor" d="M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z"></path></svg></span><span is:raw="true" class="sr-only">Link to this section</span></a></div> 1103<ol> 1104<li> 1105<p>In your appâs <strong>Details</strong> page, scroll down to the <strong>Callback URLs</strong> section</p> 1106</li> 1107<li> 1108<p>Add the following URLs:</p> 1109<ul> 1110<li>Allowed callback URLs (e.g., <code dir="auto">http://localhost:3000/auth/callback</code>)</li> 1111<li>Allowed logout redirect URLs (e.g., <code dir="auto">http://localhost:3000</code>)</li> 1112</ul> 1113<p>You can add more than one callback URL per line.</p> 1114<aside aria-label="About callback URLs" class="c-aside not-content p-6 rounded-lg flex flex-col md:flex-row gap-4 items-start c-aside--info astro-duqfclob"> <div class="note-header flex items-center astro-duqfclob"> <svg width="24" height="24" class="astro-duqfclob" data-icon="info"> <symbol id="ai:local:info" viewBox="0 0 24 24"><path fill="currentColor" fill-rule="evenodd" d="M12 3.75a8.25 8.25 0 1 0 0 16.5 8.25 8.25 0 0 0 0-16.5M2.25 12c0-5.385 4.365-9.75 9.75-9.75s9.75 4.365 9.75 9.75-4.365 9.75-9.75 9.75S2.25 17.385 2.25 12m10.875-4a1.125 1.125 0 1 1-2.25 0 1.125 1.125 0 0 1 2.25 0M13 17a.75.75 0 0 0 0-1.5h-.25v-4.25a.75.75 0 0 0-.75-.75h-1a.75.75 0 0 0 0 1.5h.25v4.25c0 .414.336.75.75.75z" clip-rule="evenodd"/></symbol><use href="#ai:local:info"></use> </svg> </div> <div class="flex flex-col gap-3 astro-duqfclob"> <div class="note-title text-base font-medium astro-duqfclob"> About callback URLs </div> <div class="note-body astro-duqfclob"> <p>Authorization servers require the callback URL to be registered ahead of time to prevent abuse. Whatever path you use for your callback URL, it must be registered with Kinde. The logout redirect URL is where Kinde redirects users after they sign out â typically your appâs homepage.</p> </div> </div> </aside> 1115</li> 1116<li> 1117<p>Select <strong>Save</strong></p> 1118</li> 1119</ol> 1120<div tabindex="-1" class="rehype-heading-wrapper flex items-center relative w-auto rehype-level-h3"><h3 id="4-set-authentication-methods">4. Set authentication methods</h3>
1120<a class="rehype-anchor-link inline-flex h-6 items-center justify-center min-w-8 hover:opacity-100" href="#4-set-authentication-methods"><span aria-hidden="true" class="rehype-anchor-icon"><svg width="16" height="16" version="1.1" viewBox="0 0 16 16" xlmns="http://www.w3.org/2000/svg"><path fill-rule="evenodd" fill="currentcolor" d="M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z"></path></svg></span><span is:raw="true" class="sr-only">Link to this section</span></a></div> 1121<ol> 1122<li>In your appâs settings page, go to <strong>Authentication</strong></li> 1123<li>Enable the authentication methods you want your users to sign in with (e.g., Google, Apple, SSO, etc.)</li> 1124<li>Select <strong>Save</strong></li> 1125</ol> 1126<div tabindex="-1" class="rehype-heading-wrapper flex items-center relative w-auto rehype-level-h3"><h3 id="5-get-the-openid-endpoints">5. Get the OpenID endpoints</h3><a class="rehype-anchor-link inline-flex h-6 items-center justify-center min-w-8 hover:opacity-100" href="#5-get-the-openid-endpoints"><span aria-hidden="true" class="rehype-anchor-icon"><svg width="16" height="16" version="1.1" viewBox="0 0 16 16" xlmns="http://www.w3.org/2000/svg"><path fill-rule="evenodd" fill="currentcolor" d="M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z"></path></svg></span><span is:raw="true" class="sr-only">Link to this section</span></a></div> 1127<p>These are the OpenID endpoints for Kinde, found at:</p> 1128<p><code dir="auto"><YOUR_DOMAIN>/.well-known/openid-configuration</code></p> 1129<aside aria-label="INFO" class="c-aside not-content p-6 rounded-lg flex flex-col md:flex-row gap-4 items-start c-aside--info astro-duqfclob"> <div class="note-header flex items-center astro-duqfclob"> <svg width="24" height="24" viewBox="0 0 24 24" class="astro-duqfclob" data-icon="info"> <use href="#ai:local:info"></use> </svg> </div> <div class="flex flex-col astro-duqfclob"> <div class="note-title text-base font-medium astro-duqfclob"> <div aria-hidden="true" class="astro-duqfclob"></div> </div> <div class="note-body astro-duqfclob"> <p>Replace <code dir="auto"><YOUR_DOMAIN></code> with either your custom domain (e.g., <code dir="auto">https://auth.yourbusiness.com</code>) or your Kinde domain (e.g., <code dir="auto">https://your_business.kinde.com</code>)</p> </div> </div> </aside> 1130<ul> 1131<li>Authorization endpoint: <code dir="auto"><YOUR_DOMAIN>/oauth2/auth</code></li> 1132<li>Token endpoint: <code dir="auto"><YOUR_DOMAIN>/oauth2/token</code></li> 1133<li>Userinfo endpoint: <code dir="auto"><YOUR_DOMAIN>/oauth2/v2/user_profile</code></li> 1134<li>Logout endpoint: <code dir="auto"><YOUR_DOMAIN>/logout</code></li> 1135</ul> 1136<p><strong>Other endpoints:</strong></p> 1137<ul> 1138<li>JWKS URI: <code dir="auto"><YOUR_DOMAIN>/.well-known/jwks</code></li> 1139<li>Revocation endpoint: <code dir="auto"><YOUR_DOMAIN>/oauth2/revoke</code></li> 1140<li>Introspection endpoint: <code dir="auto"><YOUR_DOMAIN>/oauth2/introspect</code></li> 1141</ul> 1142<div tabindex="-1" class="rehype-heading-wrapper flex items-center relative w-auto rehype-level-h3"><h3 id="6-create-the-authorization-request">6. Create the authorization request</h3><a class="rehype-anchor-link inline-flex h-6 items-center justify-center min-w-8 hover:opacity-100" href="#6-create-the-authorization-request"><span aria-hidden="true" class="rehype-anchor-icon"><svg width="16" height="16" version="1.1" viewBox="0 0 16 16" xlmns="http://www.w3.org/2000/svg"><path fill-rule="evenodd" fill="currentcolor" d="M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z"></path></svg></span><span is:raw="true" class="sr-only">Link to this section</span></a></div> 1143<ol> 1144<li>Your user clicks a button to sign in or sign up in your app.</li> 1145</ol> 1146<starlight-tabs data-sync-key="auth-flow" class="astro-esqgolmp"> <div class="tablist-wrapper not-content astro-esqgolmp"> <ul role="tablist" class="astro-esqgolmp"> <li role="presentation" class="tab astro-esqgolmp"> <a role="tab" href="#tab-panel-48" id="tab-48" aria-selected="true" tabindex="0" class="astro-esqgolmp"> Backend application </a> </li><li role="presentation" class="tab astro-esqgolmp"> <a role="tab" href="#tab-panel-49" id="tab-49" aria-selected="false" tabindex="-1" class="astro-esqgolmp"> SPAs and mobile apps </a> </li> </ul> </div> <div id="tab-panel-48" aria-labelledby="tab-48" role="tabpanel"> <ol start="2"> 1147<li> 1148<p>In your app, generate a random <code dir="auto">state</code> value and a <code dir="auto">nonce</code>:</p> 1149<div class="expressive-code"><link rel="stylesheet" href="/_astro/ec.qfwaj.css">
1149<script type="module" src="/_astro/ec.8zarh.js"></script>
1149<figure class="frame has-title not-content"><figcaption class="header"><span class="title">Node.js example</span></figcaption><pre data-language="js"><code><div class="ec-line"><div class="code"><span style="--0:#F97583;--1:#256F74;--1fs:italic">import</span><span style="--0:#B392F0;--1:#5A676D"> crypto </span><span style="--0:#F97583;--1:#256F74;--1fs:italic">from</span><span style="--0:#B392F0;--1:#5A676D"> </span><span style="--0:#FFAB70;--1:#256F74">'</span><span style="--0:#FFAB70;--1:#566D35">node:crypto</span><span style="--0:#FFAB70;--1:#256F74">'</span><span style="--0:#B392F0;--1:#256F74">;</span></div></div><div class="ec-line"><div class="code"> 1150</div></div><div class="ec-line"><div class="code"><span style="--0:#F97583;--1:#9039C9">const</span><span style="--1:#5A676D"><span style="--0:#B392F0"> </span><span style="--0:#79B8FF">state</span><span style="--0:#B392F0"> </span></span><span style="--0:#F97583;--1:#256F74">=</span><span style="--1:#5A676D"><span style="--0:#B392F0"> </span><span style="--0:#79B8FF">crypto</span></span><span style="--0:#B392F0;--1:#256F74">.</span><span style="--0:#B392F0;--1:#4C6690">randomBytes</span><span style="--0:#B392F0;--1:#5A676D">(</span><span style="--0:#F8F8F8;--1:#A64930">32</span><span style="--0:#B392F0;--1:#5A676D">)</span><span style="--0:#B392F0;--1:#256F74">.</span><span style="--0:#B392F0;--1:#4C6690">toString</span><span style="--0:#B392F0;--1:#5A676D">(</span><span style="--0:#FFAB70;--1:#256F74">'</span><span style="--0:#FFAB70;--1:#566D35">hex</span><span style="--0:#FFAB70;--1:#256F74">'</span><span style="--0:#B392F0;--1:#5A676D">)</span><span style="--0:#B392F0;--1:#256F74">;</span></div></div><div class="ec-line"><div class="code"><span style="--0:#F97583;--1:#9039C9">const</span><span style="--1:#5A676D"><span style="--0:#B392F0"> </span><span style="--0:#79B8FF">nonce</span><span style="--0:#B392F0"> </span></span><span style="--0:#F97583;--1:#256F74">=</span><span style="--1:#5A676D"><span style="--0:#B392F0"> </span><span style="--0:#79B8FF">crypto</span></span><span style="--0:#B392F0;--1:#256F74">.</span><span style="--0:#B392F0;--1:#4C6690">randomBytes</span><span style="--0:#B392F0;--1:#5A676D">(</span><span style="--0:#F8F8F8;--1:#A64930">32</span><span style="--0:#B392F0;--1:#5A676D">)</span><span style="--0:#B392F0;--1:#256F74">.</span><span style="--0:#B392F0;--1:#4C6690">toString</span><span style="--0:#B392F0;--1:#5A676D">(</span><span style="--0:#FFAB70;--1:#256F74">'</span><span style="--0:#FFAB70;--1:#566D35">hex</span><span style="--0:#FFAB70;--1:#256F74">'</span><span style="--0:#B392F0;--1:#5A676D">)</span><span style="--0:#B392F0;--1:#256F74">;</span></div></div></code></pre><div class="copy"><button title="Copy to clipboard" data-copied="Copied!" data-code="import crypto from 'node:crypto';��const state = crypto.randomBytes(32).toString('hex');�const nonce = crypto.randomBytes(32).toString('hex');"><div></div></button></div></figure></div> 1151<p>Store <code dir="auto">state</code> and <code dir="auto">nonce</code> in your server-side session â you will need them when the user returns to the callback URL.</p> 1152</li> 1153<li> 1154<p>Send the user to Kindeâs authorization endpoint with the <code dir="auto">state</code> and <code dir="auto">nonce</code> parameters included in the URL:</p> 1155<div class="expressive-code"><figure class="frame not-content"><figcaption class="header"></figcaption><pre data-language="http"><code><div class="ec-line"><div class="code"><span style="--0:#F97583;--1:#256F74;--1fs:italic">GET</span><span style="--0:#B392F0;--1:#5A676D"> <YOUR_DOMAIN>/oauth2/auth</span></div></div><div class="ec-line"><div class="code"><span style="--0:#F97583;--1:#256F74">?</span><span style="--0:#B392F0;--1:#5A676D">response_type=</span><span style="--0:#9DB1C5;--1:#566D35">code</span></div></div><div class="ec-line"><div class="code"><span style="--0:#F97583;--1:#256F74">&</span><span style="--0:#B392F0;--1:#5A676D">client_id=</span><span style="--0:#9DB1C5;--1:#566D35"><your_kinde_client_id></span></div></div><div class="ec-line"><div class="code"><span style="--0:#F97583;--1:#256F74">&</span><span style="--0:#B392F0;--1:#5A676D">redirect_uri=</span><span style="--0:#9DB1C5;--1:#566D35"><your_app_redirect_url></span></div></div><div class="ec-line"><div class="code"><span style="--0:#F97583;--1:#256F74">&</span><span style="--0:#B392F0;--1:#5A676D">scope=</span><span style="--0:#9DB1C5;--1:#566D35">openid%20profile%20email</span></div></div><div class="ec-line"><div class="code"><span style="--0:#F97583;--1:#256F74">&</span><span style="--0:#B392F0;--1:#5A676D">state=</span><span style="--0:#9DB1C5;--1:#566D35"><your_random_state_value_min_8_characters></span></div></div><div class="ec-line"><div class="code"><span style="--0:#F97583;--1:#256F74">&</span><span style="--0:#B392F0;--1:#5A676D">nonce=</span><span style="--0:#9DB1C5;--1:#566D35"><your_random_nonce_value></span></div></div></code></pre><div class="copy"><button title="Copy to clipboard" data-copied="Copied!" data-code="GET <YOUR_DOMAIN>/oauth2/auth�?response_type=code�&client_id=<your_kinde_client_id>�&redirect_uri=<your_app_redirect_url>�&scope=openid%20profile%20email�&state=<your_random_state_value_min_8_characters>�&nonce=<your_random_nonce_value>"><div></div></button></div></figure></div> 1156</li> 1157</ol> </div><div id="tab-panel-49" aria-labelledby="tab-49" role="tabpanel" hidden> <ol start="2"> 1158<li> 1159<p>In your app, generate a random <code dir="auto">state</code> value, a <code dir="auto">nonce</code>, a <code dir="auto">code_verifier</code>, and derive a <code dir="auto">code_challenge</code> from it:</p> 1160<div class="expressive-code"><figure class="frame has-title not-content"><figcaption class="header"><span class="title">Browser JavaScript example</span></figcaption><pre data-language="js"><code><div class="ec-line"><div class="code"><span style="--0:#F97583;--1:#9039C9">function</span><span style="--0:#B392F0;--1:#5A676D"> </span><span style="--0:#B392F0;--1:#4C6690">base64UrlEncode</span><span style="--0:#B392F0;--1:#256F74">(</span><span style="--0:#B392F0;--1:#5A676D;--1fs:italic">buffer</span><span style="--0:#B392F0;--1:#256F74">)</span><span style="--0:#B392F0;--1:#5A676D"> </span><span style="--0:#B392F0;--1:#256F74">{</span></div></div><div class="ec-line"><div class="code"><span class="indent"> </span><span style="--0:#F97583;--1:#9039C9">const</span><span style="--0:#B392F0;--1:#BE2F2C"> </span><span style="--0:#79B8FF;--1:#5A676D">bytes</span><span style="--0:#B392F0;--1:#BE2F2C"> </span><span style="--0:#F97583;--1:#256F74">=</span><span style="--0:#B392F0;--1:#BE2F2C"> </span><span style="--0:#F97583;--1:#256F74">new</span><span style="--0:#B392F0;--1:#BE2F2C"> </span><span style="--0:#B392F0;--1:#4C6690">Uint8Array</span><span style="--0:#B392F0;--1:#BE2F2C">(</span><span style="--0:#B392F0;--1:#5A676D">buffer</span><span style="--0:#B392F0;--1:#BE2F2C">)</span><span style="--0:#B392F0;--1:#256F74">;</span></div></div><div class="ec-line"><div class="code"><span class="indent"> </span><span style="--0:#F97583;--1:#9039C9">let</span><span style="--0:#B392F0;--1:#BE2F2C"> </span><span style="--0:#B392F0;--1:#5A676D">binary</span><span style="--0:#B392F0;--1:#BE2F2C"> </span><span style="--0:#F97583;--1:#256F74">=</span><span style="--0:#B392F0;--1:#BE2F2C"> </span><span style="--0:#FFAB70;--1:#256F74">''</span><span style="--0:#B392F0;--1:#256F74">;</span></div></div><div class="ec-line"><div class="code"><span class="indent"> </span><span style="--0:#F97583;--1:#256F74;--1fs:italic">for</span><span style="--0:#B392F0;--1:#BE2F2C"> (</span><span style="--0:#F97583;--1:#9039C9">const</span><span style="--0:#B392F0;--1:#BE2F2C"> </span><span style="--0:#79B8FF;--1:#5A676D">byte</span><span style="--0:#B392F0;--1:#BE2F2C"> </span><span style="--0:#F97583;--1:#256F74">of</span><span style="--0:#B392F0;--1:#BE2F2C"> </span><span style="--0:#B392F0;--1:#5A676D">bytes</span><span style="--0:#B392F0;--1:#BE2F2C">) </span><span style="--0:#B392F0;--1:#256F74">{</span></div></div><div class="ec-line"><div class="code"><span class="indent"><span style="--0:#B392F0"> </span></span><span style="--0:#B392F0;--1:#5A676D">binary</span><span style="--0:#B392F0;--1:#BE2F2C"> </span><span style="--0:#F97583;--1:#256F74">+=</span><span style="--0:#B392F0;--1:#BE2F2C"> </span><span style="--0:#79B8FF;--1:#5A676D">String</span><span style="--0:#B392F0;--1:#256F74">.</span><span style="--0:#B392F0;--1:#4C6690">
1160fromCharCode</span><span style="--0:#B392F0;--1:#BE2F2C">(</span><span style="--0:#B392F0;--1:#5A676D">byte</span><span style="--0:#B392F0;--1:#BE2F2C">)</span><span style="--0:#B392F0;--1:#256F74">;</span></div></div><div class="ec-line"><div class="code"><span class="indent"><span style="--0:#B392F0"> </span></span><span style="--0:#B392F0;--1:#256F74">}</span></div></div><div class="ec-line"><div class="code"><span class="indent"> </span><span style="--0:#F97583;--1:#256F74;--1fs:italic">return</span><span style="--0:#B392F0;--1:#BE2F2C"> </span><span style="--0:#B392F0;--1:#4C6690">btoa</span><span style="--0:#B392F0;--1:#BE2F2C">(</span><span style="--0:#B392F0;--1:#5A676D">binary</span><span style="--0:#B392F0;--1:#BE2F2C">)</span></div></div><div class="ec-line"><div class="code"><span class="indent"><span style="--0:#B392F0"> </span></span><span style="--0:#B392F0;--1:#256F74">.</span><span style="--0:#B392F0;--1:#4C6690">replace</span><span style="--0:#B392F0;--1:#BE2F2C">(</span><span style="--0:#FFAB70;--1:#256F74">/</span><span style="--0:#FFAB70;--1:#5A676D">\+</span><span style="--0:#FFAB70;--1:#256F74">/</span><span style="--0:#F97583;--1:#A64930">g</span><span style="--0:#BBBBBB;--1:#256F74">,</span><span style="--0:#B392F0;--1:#BE2F2C"> </span><span style="--0:#FFAB70;--1:#256F74">'</span><span style="--0:#FFAB70;--1:#566D35">-</span><span style="--0:#FFAB70;--1:#256F74">'</span><span style="--0:#B392F0;--1:#BE2F2C">)</span></div></div><div class="ec-line"><div class="code"><span class="indent"><span style="--0:#B392F0"> </span></span><span style="--0:#B392F0;--1:#256F74">.</span><span style="--0:#B392F0;--1:#4C6690">replace</span><span style="--0:#B392F0;--1:#BE2F2C">(</span><span style="--0:#FFAB70;--1:#256F74">/</span><span style="--0:#FFAB70;--1:#5A676D">\/</span><span style="--0:#FFAB70;--1:#256F74">/</span><span style="--0:#F97583;--1:#A64930">g</span><span style="--0:#BBBBBB;--1:#256F74">,</span><span style="--0:#B392F0;--1:#BE2F2C"> </span><span style="--0:#FFAB70;--1:#256F74">'</span><span style="--0:#FFAB70;--1:#566D35">_</span><span style="--0:#FFAB70;--1:#256F74">'</span><span style="--0:#B392F0;--1:#BE2F2C">)</span></div></div><div class="ec-line"><div class="code"><span class="indent"><span style="--0:#B392F0"> </span></span><span style="--0:#B392F0;--1:#256F74">.</span><span style="--0:#B392F0;--1:#4C6690">replace</span><span style="--0:#B392F0;--1:#BE2F2C">(</span><span style="--0:#FFAB70;--1:#256F74">/</span><span style="--0:#FFAB70;--1:#566D35">=</span><span style="--0:#F97583;--1:#256F74">+</span><span style="--0:#F97583;--1:#256F74;--1fs:italic">$</span><span style="--0:#FFAB70;--1:#256F74">/</span><span style="--0:#BBBBBB;--1:#256F74">,</span><span style="--0:#B392F0;--1:#BE2F2C"> </span><span style="--0:#FFAB70;--1:#256F74">''</span><span style="--0:#B392F0;--1:#BE2F2C">)</span><span style="--0:#B392F0;--1:#256F74">;</span></div></div><div class="ec-line"><div class="code"><span style="--0:#B392F0;--1:#256F74">}</span></div></div><div class="ec-line"><div class="code"> 1161</div></div><div class="ec-line"><div class="code"><span style="--0:#F97583;--1:#9039C9">const</span><span style="--1:#5A676D"><span style="--0:#B392F0"> </span><span style="--0:#79B8FF">stateBytes</span><span style="--0:#B392F0"> </span></span><span style="--0:#F97583;--1:#256F74">=</span><span style="--0:#B392F0;--1:#5A676D"> </span><span style="--0:#F97583;--1:#256F74">new</span><span style="--0:#B392F0;--1:#5A676D"> </span><span style="--0:#B392F0;--1:#4C6690">Uint8Array</span><span style="--0:#B392F0;--1:#5A676D">(</span><span style="--0:#F8F8F8;--1:#A64930">32</span><span style="--0:#B392F0;--1:#5A676D">)</span><span style="--0:#B392F0;--1:#256F74">;</span></div></div><div class="ec-line"><div class="code"><span style="--0:#79B8FF;--1:#5A676D">crypto</span><span style="--0:#B392F0;--1:#256F74">.</span><span style="--0:#B392F0;--1:#4C6690">getRandomValues</span><span style="--0:#B392F0;--1:#5A676D">(stateBytes)</span><span style="--0:#B392F0;--1:#256F74">;</span></div></div><div class="ec-line"><div class="code"><span style="--0:#F97583;--1:#9039C9">const</span><span style="--1:#5A676D"><span style="--0:#B392F0"> </span><span style="--0:#79B8FF">state</span><span style="--0:#B392F0"> </span></span><span style="--0:#F97583;--1:#256F74">=</span><span style="--1:#5A676D"><span style="--0:#B392F0"> </span><span style="--0:#79B8FF">Array</span></span><span style="--0:#B392F0;--1:#256F74">.</span><span style="--0:#B392F0;--1:#4C6690">from</span><span style="--0:#B392F0;--1:#5A676D">(stateBytes</span><span style="--0:#BBBBBB;--1:#256F74">,</span><span style="--0:#B392F0;--1:#5A676D"> </span><span style="--0:#B392F0;--1:#256F74">(</span><span style="--0:#B392F0;--1:#5A676D;--1fs:italic">b</span><span style="--0:#B392F0;--1:#256F74">)</span><span style="--0:#B392F0;--1:#5A676D"> </span><span style="--0:#F97583;--1:#9039C9">=></span></div></div><div class="ec-line"><div class="code"><span class="indent"><span style="--1:#5A676D"> </span></span><span style="--0:#79B8FF;--1:#5A676D">b</span><span style="--0:#B392F0;--1:#256F74">.</span><span style="--0:#B392F0;--1:#4C6690">toString</span><span style="--0:#B392F0;--1:#5A676D">(</span><span style="--0:#F8F8F8;--1:#A64930">16</span><span style="--0:#B392F0;--1:#5A676D">)</span><span style="--0:#B392F0;--1:#256F74">.</span><span style="--0:#B392F0;--1:#4C6690">padStart</span><span style="--0:#B392F0;--1:#5A676D">(</span><span style="--0:#F8F8F8;--1:#A64930">2</span><span style="--0:#BBBBBB;--1:#256F74">,</span><span style="--0:#B392F0;--1:#5A676D"> </span><span style="--0:#FFAB70;--1:#256F74">'</span><span style="--0:#FFAB70;--1:#566D35">0</span><span style="--0:#FFAB70;--1:#256F74">'</span><span style="--0:#B392F0;--1:#5A676D">)</span></div></div><div class="ec-line"><div class="code"><span style="--0:#B392F0;--1:#5A676D">)</span><span style="--0:#B392F0;--1:#256F74">.</span><span style="--0:#B392F0;--1:#4C6690">join</span><span style="--0:#B392F0;--1:#5A676D">(</span><span style="--0:#FFAB70;--1:#256F74">''</span><span style="--0:#B392F0;--1:#5A676D">)</span><span style="--0:#B392F0;--1:#256F74">;</span></div></div><div class="ec-line"><div class="code"> 1162</div></div><div class="ec-line"><div class="code"><span style="--0:#F97583;--1:#9039C9">const</span><span style="--1:#5A676D"><span style="--0:#B392F0"> </span><span style="--0:#79B8FF">nonceBytes</span><span style="--0:#B392F0"> </span></span><span style="--0:#F97583;--1:#256F74">=</span><span style="--0:#B392F0;--1:#5A676D"> </span><span style="--0:#F97583;--1:#256F74">new</span><span style="--0:#B392F0;--1:#5A676D"> </span><span style="--0:#B392F0;--1:#4C6690">Uint8Array</span><span style="--0:#B392F0;--1:#5A676D">(</span><span style="--0:#F8F8F8;--1:#A64930">32</span><span style="--0:#B392F0;--1:#5A676D">)</span><span style="--0:#B392F0;--1:#256F74">;</span></div></div><div class="ec-line"><div class="code"><span style="--0:#79B8FF;--1:#5A676D">crypto</span><span style="--0:#B392F0;--1:#256F74">.</span><span style="--0:#B392F0;--1:#4C6690">getRandomValues</span><span style="--0:#B392F0;--1:#5A676D">(nonceBytes)</span><span style="--0:#B392F0;--1:#256F74">;</span></div></div><div class="ec-line"><div class="code"><span style="--0:#F97583;--1:#9039C9">const</span><span style="--1:#5A676D"><span style="--0:#B392F0"> </span><span style="--0:#79B8FF">nonce</span><span style="--0:#B392F0"> </span></span><span style="--0:#F97583;--1:#256F74">=</span><span style="--1:#5A676D"><span style="--0:#B392F0"> </span><span style="--0:#79B8FF">Array</span></span><span style="--0:#B392F0;--1:#256F74">.</span><span style="--0:#B392F0;--1:#4C6690">from</span><span style="--0:#B392F0;--1:#5A676D">(nonceBytes</span><span style="--0:#BBBBBB;--1:#256F74">,</span><span style="--0:#B392F0;--1:#5A676D"> </span><span style="--0:#B392F0;--1:#256F74">(</span><span style="--0:#B392F0;--1:#5A676D;--1fs:italic">b</span><span style="--0:#B392F0;--1:#256F74">)</span><span style="--0:#B392F0;--1:#5A676D"> </span><span style="--0:#F97583;--1:#9039C9">=></span></div></div><div class="ec-line"><div class="code"><span class="indent"><span style="--1:#5A676D"> </span></span><span style="--0:#79B8FF;--1:#5A676D">b</span><span style="--0:#B392F0;--1:#256F74">.</span><span style="--0:#B392F0;--1:#4C6690">toString</span><span style="--0:#B392F0;--1:#5A676D">(</span><span style="--0:#F8F8F8;--1:#A64930">16</span><span style="--0:#B392F0;--1:#5A676D">)</span><span style="--0:#B392F0;--1:#256F74">.</span><span style="--0:#B392F0;--1:#4C6690">padStart</span><span style="--0:#B392F0;--1:#5A676D">(</span><span style="--0:#F8F8F8;--1:#A64930">2</span><span style="--0:#BBBBBB;--1:#256F74">,</span><span style="--0:#B392F0;--1:#5A676D"> </span><span style="--0:#FFAB70;--1:#256F74">'</span><span style="--0:#FFAB70;--1:#566D35">0</span><span style="--0:#FFAB70;--1:#256F74">'</span><span style="--0:#B392F0;--1:#5A676D">)</span></div></div><div class="ec-line"><div class="code"><span style="--0:#B392F0;--1:#5A676D">)</span><span style="--0:#B392F0;--1:#256F74">.</span><span style="--0:#B392F0;--1:#4C6690">join</span><span style="--0:#B392F0;--1:#5A676D">(</span><span style="--0:#FFAB70;--1:#256F74">''</span><span style="--0:#B392F0;--1:#5A676D">)</span><span style="--0:#B392F0;--1:#256F74">;</span></div></div><div class="ec-line"><div class="code"> 1163</div></div><div class="ec-line"><div class="code"><span style="--0:#90969D;--1:#5A676D;--1fs:italic">// 64 random bytes, base64url-encoded = 86-char code_verifier</span></div></div><div class="ec-line"><div class="code"><span style="--0:#F97583;--1:#9039C9">const</span><span style="--1:#5A676D"><span style="--0:#B392F0"> </span><span style="--0:#79B8FF">verifierBytes</span><span style="--0:#B392F0"> </span></span><span style="--0:#F97583;--1:#256F74">=</span><span style="--0:#B392F0;--1:#5A676D"> </span><span style="--0:#F97583;--1:#256F74">new</span><span style="--0:#B392F0;--1:#5A676D"> </span><span style="--0:#B392F0;--1:#4C6690">Uint8Array</span><span style="--0:#B392F0;--1:#5A676D">(</span><span style="--0:#F8F8F8;--1:#A64930">64</span><span style="--0:#B392F0;--1:#5A676D">)</span><span style="--0:#B392F0;--1:#256F74">;</span></div></div><div class="ec-line"><div class="code"><span style="--0:#79B8FF;--1:#5A676D">crypto</span><span style="--0:#B392F0;--1:#256F74">.</span><span style="--0:#B392F0;--1:#4C6690">getRandomValues</span><span style="--0:#B392F0;--1:#5A676D">(verifierBytes)</span><span style="--0:#B392F0;--1:#256F74">;</span></div></div><div class="ec-line"><div class="code"><span style="--0:#F97583;--1:#9039C9">const</span><span style="--1:#5A676D"><span style="--0:#B392F0"> </span><span style="--0:#79B8FF">codeVerifier</span><span style="--0:#B392F0"> </span></span><span style="--0:#F97583;--1:#256F74">=</span><span style="--0:#B392F0;--1:#5A676D"> </span><span style="--0:#B392F0;--1:#4C6690">base64UrlEncode</span><span style="--0:#B392F0;--1:#5A676D">(verifierBytes)</span><span style="--0:#B392F0;--1:#256F74">;</span></div></div><div class="ec-line"><div class="code"> 1164</div></div><div class="ec-line"><div class="code"><span style="--0:#90969D;--1:#5A676D;--1fs:italic">// SHA-256 hash of the verifier, base64url-encoded = code_challenge</span></div></div><div class="ec-line"><div class="code"><span style="--0:#F97583;--1:#9039C9">const</span><span style="--1:#5A676D"><span style="--0:#B392F0"> </span><span style="--0:#79B8FF">digest</span><span style="--0:#B392F0"> </span></span><span style="--0:#F97583;--1:#256F74">=</span><span style="--0:#B392F0;--1:#5A676D"> </span><span style="--0:#F97583;--1:#256F74;--1fs:italic">await</span><span style="--1:#5A676D"><span style="--0:#B392F0"> </span><span style="--0:#79B8FF">crypto</span></span><span style="--0:#B392F0;--1:#256F74">.</span><span style="--0:#79B8FF;--1:#5A676D">subtle</span><span style="--0:#B392F0;--1:#256F74">.</span><span style="--0:#B392F0;--1:#4C6690">digest</span><span style="--0:#B392F0;--1:#5A676D">(</span></div></div><div class="ec-line"><div class="code"><span class="indent"> </span><span style="--0:#FFAB70;--1:#256F74">'</span><span style="--0:#FFAB70;--1:#566D35">SHA-256</span><span style="--0:#FFAB70;--1:#256F74">'</span><span style="--0:#BBBBBB;--1:#256F74">,</span></div></div><div class="ec-line"><div class="code"><span class="indent"> </span><span style="--0:#F97583;--1:#256F74">new</span><span style="--0:#B392F0;--1:#5A676D"> </span><span style="--0:#B392F0;--1:#4C6690">TextEncoder</span><span style="--0:#B392F0;--1:#5A676D">()</span><span style="--0:#B392F0;--1:#256F74">.</span><span style="--0:#B392F0;--1:#4C6690">encode</span><span style="--0:#B392F0;--1:#5A676D">(codeVerifier)</span></div></div><div class="ec-line"><div class="code"><span style="--0:#B392F0;--1:#5A676D">)</span><span style="--0:#B392F0;--1:#256F74">;</span></div></div><div class="ec-line"><div class="code"><span style="--0:#F97583;--1:#9039C9">const</span><span style="--1:#5A676D"><span style="--0:#B392F0"> </span><span style="--0:#79B8FF">codeChallenge</span><span style="--0:#B392F0"> </span></span><span style="--0:#F97583;--1:#256F74">=</span><span style="--0:#B392F0;--1:#5A676D"> </span><span style="--0:#B392F0;--1:#4C6690">base64UrlEncode</span><span style="--0:#B392F0;--1:#5A676D">(digest)</span><span style="--0:#B392F0;--1:#256F74">;</span></div></div></code></pre><div class="copy"><button title="Copy to clipboard" data-copied="Copied!" data-code="function base64UrlEncode(buffer) {� const bytes = new Uint8Array(buffer);� let binary = '';
1164� for (const byte of bytes) {� binary += String.fromCharCode(byte);� }� return btoa(binary)� .replace(/\+/g, '-')� .replace(/\//g, '_')� .replace(/=+$/, '');�}��const stateBytes = new Uint8Array(32);�crypto.getRandomValues(stateBytes);�const state = Array.from(stateBytes, (b) =>� b.toString(16).padStart(2, '0')�).join('');��const nonceBytes = new Uint8Array(32);�crypto.getRandomValues(nonceBytes);�const nonce = Array.from(nonceBytes, (b) =>� b.toString(16).padStart(2, '0')�).join('');��// 64 random bytes, base64url-encoded = 86-char code_verifier�const verifierBytes = new Uint8Array(64);�crypto.getRandomValues(verifierBytes);�const codeVerifier = base64UrlEncode(verifierBytes);��// SHA-256 hash of the verifier, base64url-encoded = code_challenge�const digest = await crypto.subtle.digest(� 'SHA-256',� new TextEncoder().encode(codeVerifier)�);�const codeChallenge = base64UrlEncode(digest);"><div></div></button></div></figure></div> 1165<p>Store <code dir="auto">state</code>, <code dir="auto">nonce</code>, and <code dir="auto">code_verifier</code> in <code dir="auto">sessionStorage</code> (for SPAs) and secure device storage (Keychain/Keystore) for mobile appsâ you will need them when the user returns to the callback URL.</p> 1166</li> 1167<li> 1168<p>Send the user to Kindeâs authorization endpoint with the <code dir="auto">state</code>, <code dir="auto">nonce</code>, and PKCE parameters included in the URL:</p> 1169<div class="expressive-code"><figure class="frame not-content"><figcaption class="header"></figcaption><pre data-language="http"><code><div class="ec-line"><div class="code"><span style="--0:#F97583;--1:#256F74;--1fs:italic">GET</span><span style="--0:#B392F0;--1:#5A676D"> <YOUR_DOMAIN>/oauth2/auth</span></div></div><div class="ec-line"><div class="code"><span style="--0:#F97583;--1:#256F74">?</span><span style="--0:#B392F0;--1:#5A676D">response_type=</span><span style="--0:#9DB1C5;--1:#566D35">code</span></div></div><div class="ec-line"><div class="code"><span style="--0:#F97583;--1:#256F74">&</span><span style="--0:#B392F0;--1:#5A676D">client_id=</span><span style="--0:#9DB1C5;--1:#566D35"><your_kinde_client_id></span></div></div><div class="ec-line"><div class="code"><span style="--0:#F97583;--1:#256F74">&</span><span style="--0:#B392F0;--1:#5A676D">redirect_uri=</span><span style="--0:#9DB1C5;--1:#566D35"><your_app_redirect_url></span></div></div><div class="ec-line"><div class="code"><span style="--0:#F97583;--1:#256F74">&</span><span style="--0:#B392F0;--1:#5A676D">scope=</span><span style="--0:#9DB1C5;--1:#566D35">openid%20profile%20email</span></div></div><div class="ec-line"><div class="code"><span style="--0:#F97583;--1:#256F74">&</span><span style="--0:#B392F0;--1:#5A676D">state=</span><span style="--0:#9DB1C5;--1:#566D35"><your_random_state_value_min_8_characters></span></div></div><div class="ec-line"><div class="code"><span style="--0:#F97583;--1:#256F74">&</span><span style="--0:#B392F0;--1:#5A676D">nonce=</span><span style="--0:#9DB1C5;--1:#566D35"><your_random_nonce_value></span></div></div><div class="ec-line"><div class="code"><span style="--0:#F97583;--1:#256F74">&</span><span style="--0:#B392F0;--1:#5A676D">code_challenge=</span><span style="--0:#9DB1C5;--1:#566D35"><code_challenge></span></div></div><div class="ec-line"><div class="code"><span style="--0:#F97583;--1:#256F74">&</span><span style="--0:#B392F0;--1:#5A676D">code_challenge_method=</span><span style="--0:#9DB1C5;--1:#566D35">S256</span></div></div></code></pre><div class="copy"><button title="Copy to clipboard" data-copied="Copied!" data-code="GET <YOUR_DOMAIN>/oauth2/auth�?response_type=code�&client_id=<your_kinde_client_id>�&redirect_uri=<your_app_redirect_url>�&scope=openid%20profile%20email�&state=<your_random_state_value_min_8_characters>�&nonce=<your_random_nonce_value>�&code_challenge=<code_challenge>�&code_challenge_method=S256"><div></div></button></div></figure></div> 1170</li> 1171</ol> </div> <starlight-tabs-restore class="astro-esqgolmp"></starlight-tabs-restore> </starlight-tabs> 1172<aside aria-label="INFO" class="c-aside not-content p-6 rounded-lg flex flex-col md:flex-row gap-4 items-start c-aside--info astro-duqfclob"> <div class="note-header flex items-center astro-duqfclob"> <svg width="24" height="24" viewBox="0 0 24 24" class="astro-duqfclob" data-icon="info"> <use href="#ai:local:info"></use> </svg> </div> <div class="flex flex-col astro-duqfclob"> <div class="note-title text-base font-medium astro-duqfclob"> <div aria-hidden="true" class="astro-duqfclob"></div> </div> <div class="note-body astro-duqfclob"> <p>The <code dir="auto">redirect_uri</code> is your appâs callback URL and must be registered with Kinde.</p> </div> </div> </aside> 1173<ol start="4"> 1174<li>The user is redirected to the Kinde sign in page and authenticates with their credentials (email/password, social login, SSO, etc.).</li> 1175</ol> 1176<div tabindex="-1" class="rehype-heading-wrapper flex items-center relative w-auto rehype-level-h3"><h3 id="7-handle-the-callback">7. Handle the callback</h3>
1176<a class="rehype-anchor-link inline-flex h-6 items-center justify-center min-w-8 hover:opacity-100" href="#7-handle-the-callback"><span aria-hidden="true" class="rehype-anchor-icon"><svg width="16" height="16" version="1.1" viewBox="0 0 16 16" xlmns="http://www.w3.org/2000/svg"><path fill-rule="evenodd" fill="currentcolor" d="M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z"></path></svg></span><span is:raw="true" class="sr-only">Link to this section</span></a></div> 1177<ol> 1178<li> 1179<p>Kinde redirects the user back to your <code dir="auto">redirect_uri</code> with an authorization <code dir="auto">code</code> and the original <code dir="auto">state</code> value as query parameters:</p> 1180<div class="expressive-code"><figure class="frame not-content"><figcaption class="header"></figcaption><pre data-language="text"><code><div class="ec-line"><div class="code"><span style="--0:#bbbbbb;--1:#5a676d">https://your-app.com/auth/callback</span></div></div><div class="ec-line"><div class="code"><span style="--0:#bbbbbb;--1:#5a676d">?code=<AUTHORIZATION_CODE></span></div></div><div class="ec-line"><div class="code"><span style="--0:#bbbbbb;--1:#5a676d">&state=<your_random_state_value_min_8_characters></span></div></div></code></pre><div class="copy"><button title="Copy to clipboard" data-copied="Copied!" data-code="https://your-app.com/auth/callback�?code=<AUTHORIZATION_CODE>�&state=<your_random_state_value_min_8_characters>"><div></div></button></div></figure></div> 1181</li> 1182<li> 1183<p>Validate that the returned <code dir="auto">state</code> matches the one you generated in the previous step to prevent CSRF attacks.</p> 1184</li> 1185</ol> 1186<starlight-tabs data-sync-key="auth-flow" class="astro-esqgolmp"> <div class="tablist-wrapper not-content astro-esqgolmp"> <ul role="tablist" class="astro-esqgolmp"> <li role="presentation" class="tab astro-esqgolmp"> <a role="tab" href="#tab-panel-46" id="tab-46" aria-selected="true" tabindex="0" class="astro-esqgolmp"> Backend application </a> </li><li role="presentation" class="tab astro-esqgolmp"> <a role="tab" href="#tab-panel-47" id="tab-47" aria-selected="false" tabindex="-1" class="astro-esqgolmp"> SPAs and mobile apps </a> </li> </ul> </div> <div id="tab-panel-46" aria-labelledby="tab-46" role="tabpanel"> <ol start="3"> 1187<li> 1188<p>Exchange the authorization <code dir="auto">code</code> for tokens by making a POST request to the Kinde token endpoint:</p> 1189<div class="expressive-code"><figure class="frame not-content"><figcaption class="header"></figcaption><pre data-language="http"><code><div class="ec-line"><div class="code"><span style="--0:#F97583;--1:#256F74;--1fs:italic">POST</span><span style="--0:#B392F0;--1:#5A676D"> <YOUR_DOMAIN>/oauth2/token</span></div></div><div class="ec-line"><div class="code"><span style="--0:#FFAB70;--1:#BE2F2C">Content-Type</span><span style="--0:#F97583;--1:#A64930">:</span><span style="--0:#B392F0;--1:#5A676D"> </span><span style="--0:#9DB1C5;--1:#566D35">application/x-www-form-urlencoded</span></div></div><div class="ec-line"><div class="code"> 1190</div></div><div class="ec-line"><div class="code"><span style="--0:#B392F0;--1:#5A676D">grant_type=authorization_code</span></div></div><div class="ec-line"><div class="code"><span style="--0:#F97583;--1:#256F74">&</span><span style="--0:#B392F0;--1:#5A676D">code=</span><span style="--0:#9DB1C5;--1:#566D35"><AUTHORIZATION_CODE></span></div></div><div class="ec-line"><div class="code"><span style="--0:#F97583;--1:#256F74">&</span><span style="--0:#B392F0;--1:#5A676D">redirect_uri=</span><span style="--0:#9DB1C5;--1:#566D35"><your_app_redirect_url></span></div></div><div class="ec-line"><div class="code"><span style="--0:#F97583;--1:#256F74">&</span><span style="--0:#B392F0;--1:#5A676D">client_id=</span><span style="--0:#9DB1C5;--1:#566D35"><your_kinde_client_id></span></div></div><div class="ec-line"><div class="code"><span style="--0:#F97583;--1:#256F74">&</span><span style="--0:#B392F0;--1:#5A676D">client_secret=</span><span style="--0:#9DB1C5;--1:#566D35"><your_kinde_client_secret></span></div></div></code></pre><div class="copy"><button title="Copy to clipboard" data-copied="Copied!" data-code="POST <YOUR_DOMAIN>/oauth2/token�Content-Type: application/x-www-form-urlencoded��grant_type=authorization_code�&code=<AUTHORIZATION_CODE>�&redirect_uri=<your_app_redirect_url>�&client_id=<your_kinde_client_id>�&client_secret=<your_kinde_client_secret>"><div></div></button></div></figure></div> 1191</li> 1192</ol> </div><div id="tab-panel-47" aria-labelledby="tab-47" role="tabpanel" hidden> <ol start="3"> 1193<li> 1194<p>Exchange the authorization <code dir="auto">code</code> for tokens by making a POST request to the Kinde token endpoint with the <code dir="auto">code_verifier</code> â no <code dir="auto">client_secret</code> needed:</p> 1195<div class="expressive-code"><figure class="frame not-content"><figcaption class="header"></figcaption><pre data-language="http"><code><div class="ec-line"><div class="code"><span style="--0:#F97583;--1:#256F74;--1fs:italic">POST</span><span style="--0:#B392F0;--1:#5A676D"> <YOUR_DOMAIN>/oauth2/token</span></div></div><div class="ec-line"><div class="code"><span style="--0:#FFAB70;--1:#BE2F2C">Content-Type</span><span style="--0:#F97583;--1:#A64930">:</span><span style="--0:#B392F0;--1:#5A676D"> </span><span style="--0:#9DB1C5;--1:#566D35">application/x-www-form-urlencoded</span></div></div><div class="ec-line"><div class="code"> 1196</div></div><div class="ec-line"><div class="code"><span style="--0:#B392F0;--1:#5A676D">
1196grant_type=authorization_code</span></div></div><div class="ec-line"><div class="code"><span style="--0:#F97583;--1:#256F74">&</span><span style="--0:#B392F0;--1:#5A676D">code=</span><span style="--0:#9DB1C5;--1:#566D35"><AUTHORIZATION_CODE></span></div></div><div class="ec-line"><div class="code"><span style="--0:#F97583;--1:#256F74">&</span><span style="--0:#B392F0;--1:#5A676D">redirect_uri=</span><span style="--0:#9DB1C5;--1:#566D35"><your_app_redirect_url></span></div></div><div class="ec-line"><div class="code"><span style="--0:#F97583;--1:#256F74">&</span><span style="--0:#B392F0;--1:#5A676D">client_id=</span><span style="--0:#9DB1C5;--1:#566D35"><your_kinde_client_id></span></div></div><div class="ec-line"><div class="code"><span style="--0:#F97583;--1:#256F74">&</span><span style="--0:#B392F0;--1:#5A676D">code_verifier=</span><span style="--0:#9DB1C5;--1:#566D35"><code_verifier></span></div></div></code></pre><div class="copy"><button title="Copy to clipboard" data-copied="Copied!" data-code="POST <YOUR_DOMAIN>/oauth2/token�Content-Type: application/x-www-form-urlencoded��grant_type=authorization_code�&code=<AUTHORIZATION_CODE>�&redirect_uri=<your_app_redirect_url>�&client_id=<your_kinde_client_id>�&code_verifier=<code_verifier>"><div></div></button></div></figure></div> 1197</li> 1198</ol> </div> <starlight-tabs-restore class="astro-esqgolmp"></starlight-tabs-restore> </starlight-tabs> 1199<ol start="4"> 1200<li> 1201<p>Kinde returns the tokens in the response body (same for both flows):</p> 1202<div class="expressive-code"><figure class="frame not-content"><figcaption class="header"></figcaption><pre data-language="jsonc"><code><div class="ec-line"><div class="code"><span style="--0:#B392F0;--1:#256F74">{</span></div></div><div class="ec-line"><div class="code"><span class="indent"> </span><span style="--0:#F8F8F8;--1:#256F74">"</span><span style="--0:#F8F8F8;--1:#9039C9">access_token</span><span style="--0:#F8F8F8;--1:#256F74">"</span><span style="--0:#BBBBBB;--1:#256F74">:</span><span style="--0:#B392F0;--1:#5A676D"> </span><span style="--0:#FFAB70;--1:#256F74">"</span><span style="--0:#FFAB70;--1:#566D35">...</span><span style="--0:#FFAB70;--1:#256F74">"</span><span style="--0:#BBBBBB;--1:#256F74">,</span></div></div><div class="ec-line"><div class="code"><span class="indent"> </span><span style="--0:#F8F8F8;--1:#256F74">"</span><span style="--0:#F8F8F8;--1:#9039C9">id_token</span><span style="--0:#F8F8F8;--1:#256F74">"</span><span style="--0:#BBBBBB;--1:#256F74">:</span><span style="--0:#B392F0;--1:#5A676D"> </span><span style="--0:#FFAB70;--1:#256F74">"</span><span style="--0:#FFAB70;--1:#566D35">...</span><span style="--0:#FFAB70;--1:#256F74">"</span><span style="--0:#BBBBBB;--1:#256F74">,</span></div></div><div class="ec-line"><div class="code"><span class="indent"> </span><span style="--0:#F8F8F8;--1:#256F74">"</span><span style="--0:#F8F8F8;--1:#9039C9">refresh_token</span><span style="--0:#F8F8F8;--1:#256F74">"</span><span style="--0:#BBBBBB;--1:#256F74">:</span><span style="--0:#B392F0;--1:#5A676D"> </span><span style="--0:#FFAB70;--1:#256F74">"</span><span style="--0:#FFAB70;--1:#566D35">...</span><span style="--0:#FFAB70;--1:#256F74">"</span><span style="--0:#B392F0;--1:#5A676D"> </span><span style="--0:#90969D;--1:#5A676D;--1fs:italic">// only if the "offline" scope was requested</span></div></div><div class="ec-line"><div class="code"><span style="--0:#B392F0;--1:#256F74">}</span></div></div></code></pre><div class="copy"><button title="Copy to clipboard" data-copied="Copied!" data-code="{� "access_token": "...",� "id_token": "...",� "refresh_token": "..." // only if the "offline" scope was requested�}"><div></div></button></div></figure></div> 1203</li> 1204</ol> 1205<div tabindex="-1" class="rehype-heading-wrapper flex items-center relative w-auto rehype-level-h3"><h3 id="8-display-user-information">8. Display user information</h3>
1205<a class="rehype-anchor-link inline-flex h-6 items-center justify-center min-w-8 hover:opacity-100" href="#8-display-user-information"><span aria-hidden="true" class="rehype-anchor-icon"><svg width="16" height="16" version="1.1" viewBox="0 0 16 16" xlmns="http://www.w3.org/2000/svg"><path fill-rule="evenodd" fill="currentcolor" d="M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z"></path></svg></span><span is:raw="true" class="sr-only">Link to this section</span></a></div> 1206<ol> 1207<li> 1208<p>Redirect the user to a protected page in your app</p> 1209</li> 1210<li> 1211<p>Decode the <code dir="auto">id_token</code> with any standard <a href="https://www.jwt.io/libraries" target="_blank" rel="noopener noreferrer">JWT library</a>, or if you are using JavaScript, use the <a href="/build/tokens/decode-jwts/">Kinde JavaScript library</a>. Validate that the <code dir="auto">nonce</code> claim matches the value you stored earlier to prevent replay attacks.</p> 1212</li> 1213<li> 1214<p>Use the decoded claims to display in your app:</p> 1215<div class="expressive-code"><figure class="frame not-content"><figcaption class="header"></figcaption><pre data-language="json"><code><div class="ec-line"><div class="code"><span style="--0:#B392F0;--1:#256F74">{</span></div></div><div class="ec-line"><div class="code"><span class="indent"> </span><span style="--0:#F8F8F8;--1:#256F74">"</span><span style="--0:#F8F8F8;--1:#9039C9">sub</span><span style="--0:#F8F8F8;--1:#256F74">"</span><span style="--0:#BBBBBB;--1:#256F74">:</span><span style="--0:#B392F0;--1:#5A676D"> </span><span style="--0:#FFAB70;--1:#256F74">"</span><span style="--0:#FFAB70;--1:#566D35">kp_7a4b2c...</span><span style="--0:#FFAB70;--1:#256F74">"</span><span style="--0:#BBBBBB;--1:#256F74">,</span></div></div><div class="ec-line"><div class="code"><span class="indent"> </span><span style="--0:#F8F8F8;--1:#256F74">"</span><span style="--0:#F8F8F8;--1:#9039C9">given_name</span><span style="--0:#F8F8F8;--1:#256F74">"</span><span style="--0:#BBBBBB;--1:#256F74">:</span><span style="--0:#B392F0;--1:#5A676D"> </span><span style="--0:#FFAB70;--1:#256F74">"</span><span style="--0:#FFAB70;--1:#566D35">Jane</span><span style="--0:#FFAB70;--1:#256F74">"</span><span style="--0:#BBBBBB;--1:#256F74">,</span></div></div><div class="ec-line"><div class="code"><span class="indent"> </span><span style="--0:#F8F8F8;--1:#256F74">"</span><span style="--0:#F8F8F8;--1:#9039C9">family_name</span><span style="--0:#F8F8F8;--1:#256F74">"</span><span style="--0:#BBBBBB;--1:#256F74">:</span><span style="--0:#B392F0;--1:#5A676D"> </span><span style="--0:#FFAB70;--1:#256F74">"</span><span style="--0:#FFAB70;--1:#566D35">Doe</span><span style="--0:#FFAB70;--1:#256F74">"</span><span style="--0:#BBBBBB;--1:#256F74">,</span></div></div><div class="ec-line"><div class="code"><span class="indent"> </span><span style="--0:#F8F8F8;--1:#256F74">"</span><span style="--0:#F8F8F8;--1:#9039C9">email</span><span style="--0:#F8F8F8;--1:#256F74">"</span><span style="--0:#BBBBBB;--1:#256F74">:</span><span style="--0:#B392F0;--1:#5A676D"> </span><span style="--0:#FFAB70;--1:#256F74">"</span><span style="--0:#FFAB70;--1:#566D35">[email protected]</span><span style="--0:#FFAB70;--1:#256F74">"</span><span style="--0:#BBBBBB;--1:#256F74">,</span></div></div><div class="ec-line"><div class="code"><span class="indent"> </span><span style="--0:#F8F8F8;--1:#256F74">"</span><span style="--0:#F8F8F8;--1:#9039C9">picture</span><span style="--0:#F8F8F8;--1:#256F74">"</span><span style="--0:#BBBBBB;--1:#256F74">:</span><span style="--0:#B392F0;--1:#5A676D"> </span><span style="--0:#FFAB70;--1:#256F74">"</span><span style="--0:#FFAB70;--1:#566D35">https://gravatar.com/...</span><span style="--0:#FFAB70;--1:#256F74">"</span><span style="--0:#BBBBBB;--1:#256F74">,</span></div></div><div class="ec-line"><div class="code"><span class="indent"> </span><span style="--0:#F8F8F8;--1:#256F74">"</span><span style="--0:#F8F8F8;--1:#9039C9">nonce</span><span style="--0:#F8F8F8;--1:#256F74">"</span><span style="--0:#BBBBBB;--1:#256F74">:</span><span style="--0:#B392F0;--1:#5A676D"> </span><span style="--0:#FFAB70;--1:#256F74">"</span><span style="--0:#FFAB70;--1:#566D35"><your_random_nonce_value></span><span style="--0:#FFAB70;--1:#256F74">"</span><span style="--0:#BBBBBB;--1:#256F74">,</span></div></div><div class="ec-line"><div class="code"><span class="indent"> </span><span style="--0:#F8F8F8;--1:#256F74">"</span><span style="--0:#F8F8F8;--1:#9039C9">iat</span><span style="--0:#F8F8F8;--1:#256F74">"</span><span style="--0:#BBBBBB;--1:#256F74">:</span><span style="--0:#B392F0;--1:#5A676D"> </span><span style="--0:#F8F8F8;--1:#A64930">1716800000</span><span style="--0:#BBBBBB;--1:#256F74">,</span></div></div><div class="ec-line"><div class="code"><span class="indent"> </span><span style="--0:#F8F8F8;--1:#256F74">"</span><span style="--0:#F8F8F8;--1:#9039C9">exp</span><span style="--0:#F8F8F8;--1:#256F74">"</span><span style="--0:#BBBBBB;--1:#256F74">:</span><span style="--0:#B392F0;--1:#5A676D"> </span><span style="--0:#F8F8F8;--1:#A64930">1716886400</span></div></div><div class="ec-line"><div class="code"><span style="--0:#B392F0;--1:#256F74">}</span></div></div></code></pre><div class="copy"><button title="Copy to clipboard" data-copied="Copied!" data-code="{� "sub": "kp_7a4b2c...",� "given_name": "Jane",� "family_name": "Doe",� "email": "[email protected]",� "picture": "https://gravatar.com/...",� "nonce": "<your_random_nonce_value>",� "iat": 1716800000,� "exp": 1716886400�}"><div></div></button></div></figure></div> 1216</li> 1217</ol> 1218<p>Alternatively, you can call the userinfo endpoint, passing the <code dir="auto">access_token</code> as a Bearer token. This always returns an up-to-date version of the userâs profile. See <a href="#when-should-i-use-the-userinfo-endpoint-instead-of-decoding-the-id_token">When should I use the userinfo endpoint instead of decoding the <code dir="auto">id_token</code>?</a> for more details.</p> 1219<div tabindex="-1" class="rehype-heading-wrapper flex items-center relative w-auto rehype-level-h3"><h3 id="9-test-user-registration">9. Test user registration</h3>
1219<a class="rehype-anchor-link inline-flex h-6 items-center justify-center min-w-8 hover:opacity-100" href="#9-test-user-registration"><span aria-hidden="true" class="rehype-anchor-icon"><svg width="16" height="16" version="1.1" viewBox="0 0 16 16" xlmns="http://www.w3.org/2000/svg"><path fill-rule="evenodd" fill="currentcolor" d="M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z"></path></svg></span><span is:raw="true" class="sr-only">Link to this section</span></a></div> 1220<p>Complete the registration flow in your app and verify that you can sign in to a protected page (e.g., a dashboard).</p> 1221<ol> 1222<li>Go to your Kinde dashboard and select <strong>Users</strong></li> 1223<li>You should see the new userâs details in the list.</li> 1224</ol> 1225<div tabindex="-1" class="rehype-heading-wrapper flex items-center relative w-auto rehype-level-h2"><h2 id="authentication">Authentication</h2><a class="rehype-anchor-link inline-flex h-6 items-center justify-center min-w-8 hover:opacity-100" href="#authentication"><span aria-hidden="true" class="rehype-anchor-icon"><svg width="16" height="16" version="1.1" viewBox="0 0 16 16" xlmns="http://www.w3.org/2000/svg"><path fill-rule="evenodd" fill="currentcolor" d="M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z"></path></svg></span><span is:raw="true" class="sr-only">Link to this section</span></a></div> 1226<div tabindex="-1" class="rehype-heading-wrapper flex items-center relative w-auto rehype-level-h3"><h3 id="create-a-sign-in-or-sign-up-link">Create a sign in or sign up link</h3><a class="rehype-anchor-link inline-flex h-6 items-center justify-center min-w-8 hover:opacity-100" href="#create-a-sign-in-or-sign-up-link"><span aria-hidden="true" class="rehype-anchor-icon"><svg width="16" height="16" version="1.1" viewBox="0 0 16 16" xlmns="http://www.w3.org/2000/svg"><path fill-rule="evenodd" fill="currentcolor" d="M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z"></path></svg></span><span is:raw="true" class="sr-only">Link to this section</span></a></div> 1227<p>The following link redirects the user to the Kinde sign-in page by default:</p> 1228<div class="expressive-code"><figure class="frame not-content"><figcaption class="header"></figcaption><pre data-language="http"><code><div class="ec-line"><div class="code"><span style="--0:#F97583;--1:#256F74;--1fs:italic">GET</span><span style="--0:#B392F0;--1:#5A676D"> <YOUR_DOMAIN>/oauth2/auth</span></div></div><div class="ec-line"><div class="code"><span style="--0:#F97583;--1:#256F74">?</span><span style="--0:#B392F0;--1:#5A676D">response_type=</span><span style="--0:#9DB1C5;--1:#566D35">code</span></div></div><div class="ec-line"><div class="code"><span style="--0:#F97583;--1:#256F74">&</span><span style="--0:#B392F0;--1:#5A676D">client_id=</span><span style="--0:#9DB1C5;--1:#566D35"><your_kinde_client_id></span></div></div><div class="ec-line"><div class="code"><span style="--0:#F97583;--1:#256F74">&</span><span style="--0:#B392F0;--1:#5A676D">redirect_uri=</span><span style="--0:#9DB1C5;--1:#566D35"><your_app_redirect_url></span></div></div><div class="ec-line"><div class="code"><span style="--0:#F97583;--1:#256F74">&</span><span style="--0:#B392F0;--1:#5A676D">scope=</span><span style="--0:#9DB1C5;--1:#566D35">openid%20profile%20email</span></div></div><div class="ec-line"><div class="code"><span style="--0:#F97583;--1:#256F74">&</span><span style="--0:#B392F0;--1:#5A676D">state=</span><span style="--0:#9DB1C5;--1:#566D35"><your_random_state_value_min_8_characters></span></div></div><div class="ec-line"><div class="code"><span style="--0:#F97583;--1:#256F74">&</span><span style="--0:#B392F0;--1:#5A676D">nonce=</span><span style="--0:#9DB1C5;--1:#566D35"><your_random_nonce_value></span></div></div></code></pre><div class="copy"><button title="Copy to clipboard" data-copied="Copied!" data-code="GET <YOUR_DOMAIN>/oauth2/auth�?response_type=code�&client_id=<your_kinde_client_id>�&redirect_uri=<your_app_redirect_url>�&scope=openid%20profile%20email�&state=<your_random_state_value_min_8_characters>�&nonce=<your_random_nonce_value>"><div></div></button></div></figure></div> 1229<p>To send the user to the sign-up page instead, add <code dir="auto">prompt=create</code> to the URL:</p> 1230<div class="expressive-code"><figure class="frame not-content"><figcaption class="header"></figcaption><pre data-language="http"><code><div class="ec-line"><div class="code"><span style="--0:#F97583;--1:#256F74;--1fs:italic">
1230GET</span><span style="--0:#B392F0;--1:#5A676D"> <YOUR_DOMAIN>/oauth2/auth</span></div></div><div class="ec-line"><div class="code"><span style="--0:#F97583;--1:#256F74">?</span><span style="--0:#B392F0;--1:#5A676D">response_type=</span><span style="--0:#9DB1C5;--1:#566D35">code</span></div></div><div class="ec-line"><div class="code"><span style="--0:#F97583;--1:#256F74">&</span><span style="--0:#B392F0;--1:#5A676D">client_id=</span><span style="--0:#9DB1C5;--1:#566D35"><your_kinde_client_id></span></div></div><div class="ec-line"><div class="code"><span style="--0:#F97583;--1:#256F74">&</span><span style="--0:#B392F0;--1:#5A676D">redirect_uri=</span><span style="--0:#9DB1C5;--1:#566D35"><your_app_redirect_url></span></div></div><div class="ec-line"><div class="code"><span style="--0:#F97583;--1:#256F74">&</span><span style="--0:#B392F0;--1:#5A676D">scope=</span><span style="--0:#9DB1C5;--1:#566D35">openid%20profile%20email</span></div></div><div class="ec-line"><div class="code"><span style="--0:#F97583;--1:#256F74">&</span><span style="--0:#B392F0;--1:#5A676D">state=</span><span style="--0:#9DB1C5;--1:#566D35"><your_random_state_value_min_8_characters></span></div></div><div class="ec-line"><div class="code"><span style="--0:#F97583;--1:#256F74">&</span><span style="--0:#B392F0;--1:#5A676D">nonce=</span><span style="--0:#9DB1C5;--1:#566D35"><your_random_nonce_value></span></div></div><div class="ec-line"><div class="code"><span style="--0:#F97583;--1:#256F74">&</span><span style="--0:#B392F0;--1:#5A676D">prompt=</span><span style="--0:#9DB1C5;--1:#566D35">create</span></div></div></code></pre><div class="copy"><button title="Copy to clipboard" data-copied="Copied!" data-code="GET <YOUR_DOMAIN>/oauth2/auth�?response_type=code�&client_id=<your_kinde_client_id>�&redirect_uri=<your_app_redirect_url>�&scope=openid%20profile%20email�&state=<your_random_state_value_min_8_characters>�&nonce=<your_random_nonce_value>�&prompt=create"><div></div></button></div></figure></div> 1231<div tabindex="-1" class="rehype-heading-wrapper flex items-center relative w-auto rehype-level-h3"><h3 id="handle-successful-auth-for-desktop-and-mobile-apps">Handle successful auth for desktop and mobile apps</h3><a class="rehype-anchor-link inline-flex h-6 items-center justify-center min-w-8 hover:opacity-100" href="#handle-successful-auth-for-desktop-and-mobile-apps"><span aria-hidden="true" class="rehype-anchor-icon"><svg width="16" height="16" version="1.1" viewBox="0 0 16 16" xlmns="http://www.w3.org/2000/svg"><path fill-rule="evenodd" fill="currentcolor" d="M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z"></path></svg></span><span is:raw="true" class="sr-only">Link to this section</span></a></div> 1232<p>If you offer mobile and desktop apps alongside a browser-based version, youâll need to handle the post-authentication browser state. Rather than leaving a hanging screen, you can show users a success page. To do this, add the <a href="/developer-tools/about/using-kinde-without-an-sdk/#has_success_page"><code dir="auto">has_success_page</code></a> parameter to the authorization URL.</p> 1233<div tabindex="-1" class="rehype-heading-wrapper flex items-center relative w-auto rehype-level-h3"><h3 id="protect-a-route-with-auth">Protect a route with auth</h3><a class="rehype-anchor-link inline-flex h-6 items-center justify-center min-w-8 hover:opacity-100" href="#protect-a-route-with-auth"><span aria-hidden="true" class="rehype-anchor-icon"><svg width="16" height="16" version="1.1" viewBox="0 0 16 16" xlmns="http://www.w3.org/2000/svg"><path fill-rule="evenodd" fill="currentcolor" d="M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z"></path></svg></span><span is:raw="true" class="sr-only">Link to this section</span></a></div> 1234<p>Route protection works at two layers. Both are required â the frontend layer is UX, the backend layer is the real security gate.</p> 1235<p><strong>Layer 1: Frontend â redirect unauthenticated users</strong></p> 1236<p>Before rendering a protected page or screen, check that you have a valid, non-expired access token. If not, redirect to the Kinde authorization endpoint:</p> 1237<div class="expressive-code"><figure class="frame not-content"><figcaption class="header"></figcaption><pre data-language="js"><code><div class="ec-line"><div class="code"><span style="--0:#F97583;--1:#9039C9">function</span><span style="--0:#B392F0;--1:#5A676D"> </span><span style="--0:#B392F0;--1:#4C6690">isTokenExpired</span><span style="--0:#B392F0;--1:#256F74">(</span><span style="--0:#B392F0;--1:#5A676D;--1fs:italic">token</span><span style="--0:#B392F0;--1:#256F74">)</span><span style="--0:#B392F0;--1:#5A676D"> </span><span style="--0:#B392F0;--1:#256F74">{</span></div></div><div class="ec-line"><div class="code"><span class="indent"> </span><span style="--0:#90969D;--1:#5A676D;--1fs:italic">// JWT payloads are base64url-encoded; convert to standard base64 before decoding</span></div></div><div class="ec-line"><div class="code"><span class="indent"> </span><span style="--0:#F97583;--1:#9039C9">const</span><span style="--0:#B392F0;--1:#BE2F2C"> </span><span style="--0:#79B8FF;--1:#5A676D">base64Url</span><span style="--0:#B392F0;--1:#BE2F2C"> </span><span style="--0:#F97583;--1:#256F74">=</span><span style="--0:#B392F0;--1:#BE2F2C"> </span><span style="--0:#79B8FF;--1:#5A676D">token</span><span style="--0:#B392F0;--1:#256F74">.</span><span style="--0:#B392F0;--1:#4C6690">split</span><span style="--0:#B392F0;--1:#BE2F2C">(</span><span style="--0:#FFAB70;--1:#256F74">'</span><span style="--0:#FFAB70;--1:#566D35">.</span><span style="--0:#FFAB70;--1:#256F74">'</span><span style="--0:#B392F0;--1:#BE2F2C">)[</span><span style="--0:#F8F8F8;--1:#A64930">1</span><span style="--0:#B392F0;--1:#BE2F2C">]</span><span style="--0:#B392F0;--1:#256F74">;</span></div></div><div class="ec-line"><div class="code"><span class="indent"> </span><span style="--0:#F97583;--1:#9039C9">const</span><span style="--0:#B392F0;--1:#BE2F2C"> </span><span style="--0:#79B8FF;--1:#5A676D">base64</span><span style="--0:#B392F0;--1:#BE2F2C"> </span><span style="--0:#F97583;--1:#256F74">=</span><span style="--0:#B392F0;--1:#BE2F2C"> </span><span style="--0:#79B8FF;--1:#5A676D">base64Url</span><span style="--0:#B392F0;--1:#256F74">.</span><span style="--0:#B392F0;--1:#4C6690">replace</span><span style="--0:#B392F0;--1:#BE2F2C">(</span><span style="--0:#FFAB70;--1:#256F74">/</span><span style="--0:#FFAB70;--1:#566D35">-</span><span style="--0:#FFAB70;--1:#256F74">/</span><span style="--0:#F97583;--1:#A64930">g</span><span style="--0:#BBBBBB;--1:#256F74">,</span><span style="--0:#B392F0;--1:#BE2F2C"> </span><span style="--0:#FFAB70;--1:#256F74">'</span><span style="--0:#FFAB70;--1:#566D35">+</span><span style="--0:#FFAB70;--1:#256F74">'</span><span style="--0:#B392F0;--1:#BE2F2C">)</span><span style="--0:#B392F0;--1:#256F74">.</span><span style="--0:#B392F0;--1:#4C6690">replace</span><span style="--0:#B392F0;--1:#BE2F2C">(</span><span style="--0:#FFAB70;--1:#256F74">/</span><span style="--0:#FFAB70;--1:#566D35">_</span><span style="--0:#FFAB70;--1:#256F74">/</span><span style="--0:#F97583;--1:#A64930">g</span><span style="--0:#BBBBBB;--1:#256F74">,</span><span style="--0:#B392F0;--1:#BE2F2C"> </span><span style="--0:#FFAB70;--1:#256F74">'</span><span style="--0:#FFAB70;--1:#566D35">/</span><span style="--0:#FFAB70;--1:#256F74">'</span><span style="--0:#B392F0;--1:#BE2F2C">)</span><span style="--0:#B392F0;--1:#256F74">;</span></div></div><div class="ec-line"><div class="code"><span class="indent"> </span><span style="--0:#F97583;--1:#9039C9">const</span><span style="--0:#B392F0;--1:#BE2F2C"> </span><span style="--0:#B392F0;--1:#256F74">{</span><span style="--0:#B392F0;--1:#BE2F2C"> </span><span style="--0:#79B8FF;--1:#5A676D">exp</span><span style="--0:#B392F0;--1:#BE2F2C"> </span><span style="--0:#B392F0;--1:#256F74">}</span><span style="--0:#B392F0;--1:#BE2F2C"> </span><span style="--0:#F97583;--1:#256F74">=</span><span style="--0:#B392F0;--1:#BE2F2C"> </span><span style="--0:#79B8FF;--1:#5A676D">JSON</span><span style="--0:#B392F0;--1:#256F74">.</span><span style="--0:#B392F0;--1:#4C6690">parse</span><span style="--0:#B392F0;--1:#BE2F2C">(</span><span style="--0:#B392F0;--1:#4C6690">atob</span><span style="--0:#B392F0;--1:#BE2F2C">(</span><span style="--0:#B392F0;--1:#5A676D">base64</span><span style="--0:#B392F0;--1:#BE2F2C">))</span><span style="--0:#B392F0;--1:#256F74">;</span></div></div><div class="ec-line"><div class="code"><span class="indent"> </span><span style="--0:#F97583;--1:#256F74;--1fs:italic">return</span><span style="--0:#B392F0;--1:#BE2F2C"> </span><span style="--0:#79B8FF;--1:#5A676D">Date</span><span style="--0:#B392F0;--1:#256F74">.</span><span style="--0:#B392F0;--1:#4C6690">now</span><span style="--0:#B392F0;--1:#BE2F2C">() </span><span style="--0:#F97583;--1:#256F74">>=</span><span style="--0:#B392F0;--1:#BE2F2C"> </span><span style="--0:#B392F0;--1:#5A676D">exp</span><span style="--0:#B392F0;--1:#BE2F2C"> </span><span style="--0:#F97583;--1:#256F74">*</span><span style="--0:#B392F0;--1:#BE2F2C"> </span><span style="--0:#F8F8F8;--1:#A64930">1000</span><span style="--0:#B392F0;--1:#256F74">;</span></div></div><div class="ec-line"><div class="code"><span style="--0:#B392F0;--1:#256F74">}</span></div></div><div class="ec-line"><div class="code"> 1238</div></div><div class="ec-line"><div class="code"><span style="--0:#90969D;--1:#5A676D;--1fs:italic">// Run this check on every protected page load</span></div></div><div class="ec-line"><div class="code"><span style="--0:#F97583;--1:#256F74;--1fs:italic">if</span><span style="--0:#B392F0;--1:#5A676D"> (</span><span style="--0:#F97583;--1:#256F74">!</span><span style="--0:#B392F0;--1:#5A676D">
1238accessToken </span><span style="--0:#F97583;--1:#256F74">||</span><span style="--0:#B392F0;--1:#5A676D"> </span><span style="--0:#B392F0;--1:#4C6690">isTokenExpired</span><span style="--0:#B392F0;--1:#5A676D">(accessToken)) </span><span style="--0:#B392F0;--1:#256F74">{</span></div></div><div class="ec-line"><div class="code"><span class="indent"> </span><span style="--0:#79B8FF;--1:#5A676D">window</span><span style="--0:#B392F0;--1:#256F74">.</span><span style="--0:#79B8FF;--1:#5A676D">location</span><span style="--0:#B392F0;--1:#256F74">.</span><span style="--0:#B392F0;--1:#5A676D">href</span><span style="--0:#B392F0;--1:#BE2F2C"> </span><span style="--0:#F97583;--1:#256F74">=</span></div></div><div class="ec-line"><div class="code"><span class="indent"> </span><span style="--0:#FFAB70;--1:#256F74">'</span><span style="--0:#FFAB70;--1:#566D35"><YOUR_DOMAIN>/oauth2/auth?response_type=code&client_id=<CLIENT_ID>&...</span><span style="--0:#FFAB70;--1:#256F74">'</span><span style="--0:#B392F0;--1:#256F74">;</span></div></div><div class="ec-line"><div class="code"><span style="--0:#B392F0;--1:#256F74">}</span></div></div></code></pre><div class="copy"><button title="Copy to clipboard" data-copied="Copied!" data-code="function isTokenExpired(token) {� // JWT payloads are base64url-encoded; convert to standard base64 before decoding� const base64Url = token.split('.')[1];� const base64 = base64Url.replace(/-/g, '+').replace(/_/g, '/');� const { exp } = JSON.parse(atob(base64));� return Date.now() >= exp * 1000;�}��// Run this check on every protected page load�if (!accessToken || isTokenExpired(accessToken)) {� window.location.href =� '<YOUR_DOMAIN>/oauth2/auth?response_type=code&client_id=<CLIENT_ID>&...';�}"><div></div></button></div></figure></div> 1239<aside aria-label="WARNING" class="c-aside not-content p-6 rounded-lg flex flex-col md:flex-row gap-4 items-start c-aside--warning astro-duqfclob"> <div class="note-header flex items-center astro-duqfclob"> <svg width="24" height="24" class="astro-duqfclob" data-icon="alert-triangle"> <symbol id="ai:local:alert-triangle" viewBox="0 0 24 24"><path fill="currentColor" fill-rule="evenodd" d="M12 2.25a2.24 2.24 0 0 0-1.944 1.126v.001l-8.25 14.248A2.25 2.25 0 0 0 3.748 21h16.506a2.25 2.25 0 0 0 1.94-3.376L13.945 3.377l-.001-.001A2.24 2.24 0 0 0 12 2.25m-.372 1.6a.74.74 0 0 1 1.015.273l8.251 14.252a.75.75 0 0 1-.646 1.125H3.752a.75.75 0 0 1-.646-1.125l8.25-14.25.001-.002a.74.74 0 0 1 .271-.273M12 8.5a.75.75 0 0 1 .75.75v4a.75.75 0 0 1-1.5 0v-4A.75.75 0 0 1 12 8.5m1.125 7.875a1.125 1.125 0 1 1-2.25 0 1.125 1.125 0 0 1 2.25 0" clip-rule="evenodd"/></symbol><use href="#ai:local:alert-triangle"></use> </svg> </div> <div class="flex flex-col astro-duqfclob"> <div class="note-title text-base font-medium astro-duqfclob"> <div aria-hidden="true" class="astro-duqfclob"></div> </div> <div class="note-body astro-duqfclob"> <p>Never rely on the frontend check alone. A user can bypass client-side redirects and call your API directly. The backend must always verify the token independently.</p> </div> </div> </aside> 1240<p><strong>Layer 2: Backend â verify the token on every request</strong></p> 1241<p>Your server must validate the access token on every call to a protected endpoint. Send the token in the <code dir="auto">Authorization</code> header:</p> 1242<div class="expressive-code"><figure class="frame not-content"><figcaption class="header"></figcaption><pre data-language="http"><code><div class="ec-line"><div class="code"><span style="--0:#F97583;--1:#256F74;--1fs:italic">GET</span><span style="--0:#B392F0;--1:#5A676D"> /api/protected-resource</span></div></div><div class="ec-line"><div class="code"><span style="--0:#FFAB70;--1:#BE2F2C">Authorization</span><span style="--0:#F97583;--1:#A64930">:</span><span style="--0:#B392F0;--1:#5A676D"> </span><span style="--0:#9DB1C5;--1:#566D35">Bearer <access_token></span></div></div></code></pre><div class="copy"><button title="Copy to clipboard" data-copied="Copied!" data-code="GET /api/protected-resource�Authorization: Bearer <access_token>"><div></div></button></div></figure></div> 1243<p>On the server, verify the token before returning any data:</p> 1244<div class="expressive-code"><figure class="frame not-content"><figcaption class="header"></figcaption><pre data-language="js"><code><div class="ec-line"><div class="code"><span style="--0:#90969D;--1:#5A676D;--1fs:italic">// Pseudocode â pattern is the same in Node, Python, Go, etc.</span></div></div><div class="ec-line"><div class="code"><span style="--0:#F97583;--1:#9039C9">function</span><span style="--0:#B392F0;--1:#5A676D"> </span><span style="--0:#B392F0;--1:#4C6690">protectedRoute</span><span style="--0:#B392F0;--1:#256F74">(</span><span style="--0:#B392F0;--1:#5A676D;--1fs:italic">
1244req</span><span style="--0:#BBBBBB;--1:#256F74">,</span><span style="--0:#B392F0;--1:#5A676D"> </span><span style="--0:#B392F0;--1:#5A676D;--1fs:italic">res</span><span style="--0:#BBBBBB;--1:#256F74">,</span><span style="--0:#B392F0;--1:#5A676D"> </span><span style="--0:#B392F0;--1:#5A676D;--1fs:italic">next</span><span style="--0:#B392F0;--1:#256F74">)</span><span style="--0:#B392F0;--1:#5A676D"> </span><span style="--0:#B392F0;--1:#256F74">{</span></div></div><div class="ec-line"><div class="code"><span class="indent"> </span><span style="--0:#F97583;--1:#9039C9">const</span><span style="--0:#B392F0;--1:#BE2F2C"> </span><span style="--0:#79B8FF;--1:#5A676D">token</span><span style="--0:#B392F0;--1:#BE2F2C"> </span><span style="--0:#F97583;--1:#256F74">=</span><span style="--0:#B392F0;--1:#BE2F2C"> </span><span style="--0:#79B8FF;--1:#5A676D">req</span><span style="--0:#B392F0;--1:#256F74">.</span><span style="--0:#79B8FF;--1:#5A676D">headers</span><span style="--0:#B392F0;--1:#256F74">.</span><span style="--0:#79B8FF;--1:#5A676D">authorization</span><span style="--0:#B392F0;--1:#256F74">?.</span><span style="--0:#B392F0;--1:#4C6690">replace</span><span style="--0:#B392F0;--1:#BE2F2C">(</span><span style="--0:#FFAB70;--1:#256F74">'</span><span style="--0:#FFAB70;--1:#566D35">Bearer </span><span style="--0:#FFAB70;--1:#256F74">'</span><span style="--0:#BBBBBB;--1:#256F74">,</span><span style="--0:#B392F0;--1:#BE2F2C"> </span><span style="--0:#FFAB70;--1:#256F74">''</span><span style="--0:#B392F0;--1:#BE2F2C">)</span><span style="--0:#B392F0;--1:#256F74">;</span></div></div><div class="ec-line"><div class="code"><span class="indent"> </span><span style="--0:#F97583;--1:#256F74;--1fs:italic">if</span><span style="--0:#B392F0;--1:#BE2F2C"> (</span><span style="--0:#F97583;--1:#256F74">!</span><span style="--0:#B392F0;--1:#5A676D">token</span><span style="--0:#B392F0;--1:#BE2F2C">) </span><span style="--0:#F97583;--1:#256F74;--1fs:italic">return</span><span style="--0:#B392F0;--1:#BE2F2C"> </span><span style="--0:#79B8FF;--1:#5A676D">res</span><span style="--0:#B392F0;--1:#256F74">.</span><span style="--0:#B392F0;--1:#4C6690">status</span><span style="--0:#B392F0;--1:#BE2F2C">(</span><span style="--0:#F8F8F8;--1:#A64930">401</span><span style="--0:#B392F0;--1:#BE2F2C">)</span><span style="--0:#B392F0;--1:#256F74">.</span><span style="--0:#B392F0;--1:#4C6690">json</span><span style="--0:#B392F0;--1:#BE2F2C">(</span><span style="--0:#B392F0;--1:#256F74">{</span><span style="--0:#B392F0;--1:#BE2F2C"> error</span><span style="--0:#F97583;--1:#256F74">:</span><span style="--0:#B392F0;--1:#BE2F2C"> </span><span style="--0:#FFAB70;--1:#256F74">'</span><span style="--0:#FFAB70;--1:#566D35">Unauthorized</span><span style="--0:#FFAB70;--1:#256F74">'</span><span style="--0:#B392F0;--1:#BE2F2C"> </span><span style="--0:#B392F0;--1:#256F74">}</span><span style="--0:#B392F0;--1:#BE2F2C">)</span><span style="--0:#B392F0;--1:#256F74">;</span></div></div><div class="ec-line"><div class="code"> 1245</div></div><div class="ec-line"><div class="code"><span class="indent"> </span><span style="--0:#F97583;--1:#256F74;--1fs:italic">try</span><span style="--0:#B392F0;--1:#BE2F2C"> </span><span style="--0:#B392F0;--1:#256F74">{</span></div></div><div class="ec-line"><div class="code"><span class="indent"> </span><span style="--0:#F97583;--1:#9039C9">const</span><span style="--0:#B392F0;--1:#BE2F2C"> </span><span style="--0:#79B8FF;--1:#5A676D">payload</span><span style="--0:#B392F0;--1:#BE2F2C"> </span><span style="--0:#F97583;--1:#256F74">=</span><span style="--0:#B392F0;--1:#BE2F2C"> </span><span style="--0:#B392F0;--1:#4C6690">verifyJWT</span><span style="--0:#B392F0;--1:#BE2F2C">(</span><span style="--0:#B392F0;--1:#5A676D">token</span><span style="--0:#BBBBBB;--1:#256F74">,</span><span style="--0:#B392F0;--1:#BE2F2C"> </span><span style="--0:#B392F0;--1:#256F74">{</span></div></div><div class="ec-line"><div class="code"><span class="indent"><span style="--0:#B392F0;--1:#BE2F2C"> </span></span><span style="--0:#B392F0;--1:#BE2F2C">jwksUri</span><span style="--0:#F97583;--1:#256F74">:</span><span style="--0:#B392F0;--1:#BE2F2C"> </span><span style="--0:#FFAB70;--1:#256F74">'</span><span style="--0:#FFAB70;--1:#566D35"><YOUR_DOMAIN>/.well-known/jwks</span><span style="--0:#FFAB70;--1:#256F74">'</span><span style="--0:#BBBBBB;--1:#256F74">,</span></div></div><div class="ec-line"><div class="code"><span class="indent"><span style="--0:#B392F0;--1:#BE2F2C"> </span></span><span style="--0:#B392F0;--1:#BE2F2C">issuer</span><span style="--0:#F97583;--1:#256F74">:</span><span style="--0:#B392F0;--1:#BE2F2C"> </span><span style="--0:#FFAB70;--1:#256F74">'</span><span style="--0:#FFAB70;--1:#566D35"><YOUR_DOMAIN></span><span style="--0:#FFAB70;--1:#256F74">'</span><span style="--0:#BBBBBB;--1:#256F74">,</span></div></div><div class="ec-line"><div class="code"><span class="indent"><span style="--0:#B392F0"> </span></span><span style="--0:#B392F0;--1:#256F74">}</span><span style="--0:#B392F0;--1:#BE2F2C">)</span><span style="--0:#B392F0;--1:#256F74">;</span></div></div><div class="ec-line"><div class="code"><span class="indent"> </span><span style="--0:#79B8FF;--1:#5A676D">req</span><span style="--0:#B392F0;--1:#256F74">.</span><span style="--0:#B392F0;--1:#5A676D">user</span><span style="--0:#B392F0;--1:#BE2F2C"> </span><span style="--0:#F97583;--1:#256F74">=</span><span style="--0:#B392F0;--1:#BE2F2C"> </span><span style="--0:#B392F0;--1:#5A676D">payload</span><span style="--0:#B392F0;--1:#256F74">;</span><span style="--0:#B392F0;--1:#BE2F2C"> </span><span style="--0:#90969D;--1:#5A676D;--1fs:italic">// access sub, org_code, scp, permissions</span></div></div><div class="ec-line"><div class="code"><span class="indent"><span style="--0:#B392F0"> </span></span><span style="--0:#B392F0;--1:#4C6690">next</span><span style="--0:#B392F0;--1:#BE2F2C">()</span><span style="--0:#B392F0;--1:#256F74">;</span></div></div><div class="ec-line"><div class="code"><span class="indent"><span style="--0:#B392F0"> </span></span><span style="--0:#B392F0;--1:#256F74">}</span><span style="--0:#B392F0;--1:#BE2F2C"> </span><span style="--0:#F97583;--1:#256F74;--1fs:italic">catch</span><span style="--0:#B392F0;--1:#BE2F2C"> </span><span style="--0:#B392F0;--1:#256F74">{</span></div></div><div class="ec-line"><div class="code"><span class="indent"> </span><span style="--0:#F97583;--1:#256F74;--1fs:italic">return</span><span style="--0:#B392F0;--1:#BE2F2C"> </span><span style="--0:#79B8FF;--1:#5A676D">res</span><span style="--0:#B392F0;--1:#256F74">.</span><span style="--0:#B392F0;--1:#4C6690">status</span><span style="--0:#B392F0;--1:#BE2F2C">(</span><span style="--0:#F8F8F8;--1:#A64930">401</span><span style="--0:#B392F0;--1:#BE2F2C">)</span><span style="--0:#B392F0;--1:#256F74">.</span><span style="--0:#B392F0;--1:#4C6690">json</span><span style="--0:#B392F0;--1:#BE2F2C">(</span><span style="--0:#B392F0;--1:#256F74">{</span><span style="--0:#B392F0;--1:#BE2F2C"> error</span><span style="--0:#F97583;--1:#256F74">:</span><span style="--0:#B392F0;--1:#BE2F2C"> </span><span style="--0:#FFAB70;--1:#256F74">'</span><span style="--0:#FFAB70;--1:#566D35">Invalid or expired token</span><span style="--0:#FFAB70;--1:#256F74">'</span><span style="--0:#B392F0;--1:#BE2F2C"> </span><span style="--0:#B392F0;--1:#256F74">}</span><span style="--0:#B392F0;--1:#BE2F2C">)</span><span style="--0:#B392F0;--1:#256F74">;</span></div></div><div class="ec-line"><div class="code"><span class="indent"><span style="--0:#B392F0"> </span></span><span style="--0:#B392F0;--1:#256F74">}</span></div></div><div class="ec-line"><div class="code"><span style="--0:#B392F0;--1:#256F74">}</span></div></div></code></pre><div class="copy"><button title="Copy to clipboard" data-copied="Copied!" data-code="// Pseudocode â pattern is the same in Node, Python, Go, etc.�function protectedRoute(req, res, next) {� const token = req.headers.authorization?.replace('Bearer ', '');� if (!token) return res.status(401).json({ error: 'Unauthorized' });�� try {� const payload = verifyJWT(token, {� jwksUri: '<YOUR_DOMAIN>/.well-known/jwks',� issuer: '<YOUR_DOMAIN>',� });� req.user = payload; // access sub, org_code, scp, permissions� next();� } catch {� return res.status(401).json({ error: 'Invalid or expired token' });� }�}"><div></div></button></div></figure></div> 1246<p>See <a href="#validate-the-access-token">Validate the access token</a> below for the full list of claims to check.</p> 1247<p><strong>Using claims for authorization</strong></p> 1248<p>Once the token is verified, use the claims inside it to make access decisions:</p> 1249 1250 1251 1252 1253 1254 1255 1256 1257 1258 1259 1260 1261 1262 1263 1264 1265 1266 1267 1268 1269 1270 1271 1272 1273 1274<div class="table-wrapper"><table><thead><tr><th class="table-2-cols">Claim</th><th class="table-2-cols">Use for</th></tr></thead><tbody><tr><td class="table-2-cols"><code dir="auto">sub</code></td><td class="table-2-cols">Identify the user â link to your own database records</td></tr><tr><td class="table-2-cols"><code dir="auto">scp</code></td><td class="table-2-cols">Check the user has the required OAuth scopes</td></tr><tr><td class="table-2-cols"><code dir="auto">permissions</code></td><td class="table-2-cols">Fine-grained access control (e.g. <code dir="auto">read:reports</code>)</td></tr><tr><td class="table-2-cols"><code dir="auto">
1274org_code</code></td><td class="table-2-cols">Multi-tenant apps â confirm the user belongs to the right organization</td></tr></tbody></table></div> 1275<p><strong>Handling token expiry</strong></p> 1276<p>By default, access tokens expire after 24 hours. If you requested the <code dir="auto">offline</code> scope, use the refresh token to get a new access token silently â without sending the user through the login flow again:</p>
1277<script> 1278(() => { 1279 class StarlightTabsRestore extends HTMLElement { 1280 connectedCallback() { 1281 const starlightTabs = this.closest('starlight-tabs'); 1282 if (!(starlightTabs instanceof HTMLElement) || typeof localStorage === 'undefined') return; 1283 const syncKey = starlightTabs.dataset.syncKey; 1284 if (!syncKey) return; 1285 const label = localStorage.getItem(`starlight-synced-tabs__${syncKey}`); 1286 if (!label) return; 1287 const tabs = [...starlightTabs?.querySelectorAll('[role="tab"]')]; 1288 const tabIndexToRestore = tabs.findIndex( 1289 (tab) => tab instanceof HTMLAnchorElement && tab.textContent?.trim() === label 1290 ); 1291 const panels = starlightTabs?.querySelectorAll(':scope > [role="tabpanel"]'); 1292 const newTab = tabs[tabIndexToRestore]; 1293 const newPanel = panels[tabIndexToRestore]; 1294 if (tabIndexToRestore < 1 || !newTab || !newPanel) return; 1295 tabs[0]?.setAttribute('aria-selected', 'false'); 1296 tabs[0]?.setAttribute('tabindex', '-1'); 1297 panels?.[0]?.setAttribute('hidden', 'true'); 1298 newTab.removeAttribute('tabindex'); 1299 newTab.setAttribute('aria-selected', 'true'); 1300 newPanel.removeAttribute('hidden'); 1301 } 1302 } 1303 customElements.define('starlight-tabs-restore', StarlightTabsRestore); 1304})() 1305</script>
1305<starlight-tabs data-sync-key="auth-flow" class="astro-esqgolmp"> <div class="tablist-wrapper not-content astro-esqgolmp"> <ul role="tablist" class="astro-esqgolmp"> <li role="presentation" class="tab astro-esqgolmp"> <a role="tab" href="#tab-panel-44" id="tab-44" aria-selected="true" tabindex="0" class="astro-esqgolmp"> Backend application </a> </li><li role="presentation" class="tab astro-esqgolmp"> <a role="tab" href="#tab-panel-45" id="tab-45" aria-selected="false" tabindex="-1" class="astro-esqgolmp"> SPAs and mobile apps </a> </li> </ul> </div> <div id="tab-panel-44" aria-labelledby="tab-44" role="tabpanel"> <div class="expressive-code"><figure class="frame not-content"><figcaption class="header"></figcaption><pre data-language="http"><code><div class="ec-line"><div class="code"><span style="--0:#F97583;--1:#256F74;--1fs:italic">POST</span><span style="--0:#B392F0;--1:#5A676D"> <YOUR_DOMAIN>/oauth2/token</span></div></div><div class="ec-line"><div class="code"><span style="--0:#FFAB70;--1:#BE2F2C">Content-Type</span><span style="--0:#F97583;--1:#A64930">:</span><span style="--0:#B392F0;--1:#5A676D"> </span><span style="--0:#9DB1C5;--1:#566D35">application/x-www-form-urlencoded</span></div></div><div class="ec-line"><div class="code"> 1306</div></div><div class="ec-line"><div class="code"><span style="--0:#B392F0;--1:#5A676D">grant_type=refresh_token</span></div></div><div class="ec-line"><div class="code"><span style="--0:#F97583;--1:#256F74">&</span><span style="--0:#B392F0;--1:#5A676D">client_id=</span><span style="--0:#9DB1C5;--1:#566D35"><CLIENT_ID></span></div></div><div class="ec-line"><div class="code"><span style="--0:#F97583;--1:#256F74">&</span><span style="--0:#B392F0;--1:#5A676D">client_secret=</span><span style="--0:#9DB1C5;--1:#566D35"><CLIENT_SECRET></span></div></div><div class="ec-line"><div class="code"><span style="--0:#F97583;--1:#256F74">&</span><span style="--0:#B392F0;--1:#5A676D">refresh_token=</span><span style="--0:#9DB1C5;--1:#566D35"><REFRESH_TOKEN></span></div></div></code></pre><div class="copy"><button title="Copy to clipboard" data-copied="Copied!" data-code="POST <YOUR_DOMAIN>/oauth2/token�Content-Type: application/x-www-form-urlencoded��grant_type=refresh_token�&client_id=<CLIENT_ID>�&client_secret=<CLIENT_SECRET>�&refresh_token=<REFRESH_TOKEN>"><div></div></button></div></figure></div> </div><div id="tab-panel-45" aria-labelledby="tab-45" role="tabpanel" hidden> <div class="expressive-code"><figure class="frame not-content"><figcaption class="header"></figcaption><pre data-language="http"><code><div class="ec-line"><div class="code"><span style="--0:#F97583;--1:#256F74;--1fs:italic">POST</span><span style="--0:#B392F0;--1:#5A676D"> <YOUR_DOMAIN>/oauth2/token</span></div></div><div class="ec-line"><div class="code"><span style="--0:#FFAB70;--1:#BE2F2C">Content-Type</span><span style="--0:#F97583;--1:#A64930">:</span><span style="--0:#B392F0;--1:#5A676D"> </span><span style="--0:#9DB1C5;--1:#566D35">application/x-www-form-urlencoded</span></div></div><div class="ec-line"><div class="code"> 1307</div></div><div class="ec-line"><div class="code"><span style="--0:#B392F0;--1:#5A676D">grant_type=refresh_token</span></div></div><div class="ec-line"><div class="code"><span style="--0:#F97583;--1:#256F74">&</span><span style="--0:#B392F0;--1:#5A676D">client_id=</span><span style="--0:#9DB1C5;--1:#566D35"><CLIENT_ID></span></div></div><div class="ec-line"><div class="code"><span style="--0:#F97583;--1:#256F74">&</span><span style="--0:#B392F0;--1:#5A676D">refresh_token=</span><span style="--0:#9DB1C5;--1:#566D35"><REFRESH_TOKEN></span></div></div></code></pre><div class="copy"><button title="Copy to clipboard" data-copied="Copied!" data-code="POST <YOUR_DOMAIN>/oauth2/token�Content-Type: application/x-www-form-urlencoded��grant_type=refresh_token�&client_id=<CLIENT_ID>�&refresh_token=<REFRESH_TOKEN>"><div></div></button></div></figure></div> </div> <starlight-tabs-restore class="astro-esqgolmp"></starlight-tabs-restore> </starlight-tabs>
1307<script type="module">class r extends HTMLElement{static#e=new Map;#t;#n="starlight-synced-tabs__";constructor(){super();const t=this.querySelector('[role="tablist"]');if(this.tabs=[...t.querySelectorAll('[role="tab"]')],this.panels=[...this.querySelectorAll(':scope > [role="tabpanel"]')],this.#t=this.dataset.syncKey,this.#t){const i=r.#e.get(this.#t)??[];i.push(this),r.#e.set(this.#t,i)}this.tabs.forEach((i,c)=>{i.addEventListener("click",e=>{e.preventDefault();const n=t.querySelector('[aria-selected="true"]');e.currentTarget!==n&&this.switchTab(e.currentTarget,c)}),i.addEventListener("keydown",e=>{const n=this.tabs.indexOf(e.currentTarget),s=e.key==="ArrowLeft"?n-1:e.key==="ArrowRight"?n+1:e.key==="Home"?0:e.key==="End"?this.tabs.length-1:null;s!==null&&this.tabs[s]&&(e.preventDefault(),this.switchTab(this.tabs[s],s))})})}switchTab(t,i,c=!0){if(!t)return;const e=c?this.getBoundingClientRect().top:0;this.tabs.forEach(s=>{s.setAttribute("aria-selected","false"),s.setAttribute("tabindex","-1")}),this.panels.forEach(s=>{s.hidden=!0});const n=this.panels[i];n&&(n.hidden=!1),t.removeAttribute("tabindex"),t.setAttribute("aria-selected","true"),c&&
1307(t.focus(),r.#r(this,t),window.scrollTo({top:window.scrollY+(this.getBoundingClientRect().top-e)}))}#i(t){!this.#t||typeof localStorage>"u"||localStorage.setItem(this.#n+this.#t,t)}static#r(t,i){const c=t.#t,e=r.#s(i);if(!c||!e)return;const n=r.#e.get(c);if(n){for(const s of n){if(s===t)continue;const a=s.tabs.findIndex(o=>r.#s(o)===e);a!==-1&&s.switchTab(s.tabs[a],a,!1)}t.#i(e)}}static#s(t){return t.textContent?.trim()}}customElements.define("starlight-tabs",r);</script>
1307 1308<p>If no refresh token is available (i.e. <code dir="auto">offline</code> scope was not requested), redirect the user to sign in again.</p> 1309<div tabindex="-1" class="rehype-heading-wrapper flex items-center relative w-auto rehype-level-h3"><h3 id="validate-the-access-token">Validate the access token</h3><a class="rehype-anchor-link inline-flex h-6 items-center justify-center min-w-8 hover:opacity-100" href="#validate-the-access-token"><span aria-hidden="true" class="rehype-anchor-icon"><svg width="16" height="16" version="1.1" viewBox="0 0 16 16" xlmns="http://www.w3.org/2000/svg"><path fill-rule="evenodd" fill="currentcolor" d="M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z"></path></svg></span><span is:raw="true" class="sr-only">Link to this section</span></a></div> 1310<p>Always verify the <code dir="auto">access_token</code> signature on your server before trusting any request. Kinde signs tokens with RS256 and publishes its public keys at the JWKS endpoint:</p> 1311<div class="expressive-code"><figure class="frame not-content"><figcaption class="header"></figcaption><pre data-language="text"><code><div class="ec-line"><div class="code"><span style="--0:#bbbbbb;--1:#5a676d"><YOUR_DOMAIN>/.well-known/jwks</span></div></div></code></pre><div class="copy"><button title="Copy to clipboard" data-copied="Copied!" data-code="<YOUR_DOMAIN>/.well-known/jwks"><div></div></button></div></figure></div> 1312<p>Most JWT libraries accept a JWKS URL directly â point your library at this URL and it will fetch and cache the correct public key automatically.</p> 1313<p>As part of verification, validate the following claims:</p> 1314 1315 1316 1317 1318 1319 1320 1321 1322 1323 1324 1325 1326 1327 1328 1329 1330 1331 1332 1333 1334 1335 1336 1337 1338 1339<div class="table-wrapper"><table><thead><tr><th class="table-2-cols">Claim</th><th class="table-2-cols">Expected value</th></tr></thead><tbody><tr><td class="table-2-cols"><code dir="auto">iss</code></td><td class="table-2-cols"><code dir="auto"><YOUR_DOMAIN></code></td></tr><tr><td class="table-2-cols"><code dir="auto">aud</code></td><td class="table-2-cols">Your API audience if configured</td></tr><tr><td class="table-2-cols"><code dir="auto">exp</code></td><td class="table-2-cols">Must be in the future</td></tr><tr><td class="table-2-cols"><code dir="auto">iat</code></td><td class="table-2-cols">Must be in the past</td></tr></tbody></table></div> 1340<p>Reject any token that fails signature verification or has an unexpected claim value.</p> 1341<div tabindex="-1" class="rehype-heading-wrapper flex items-center relative w-auto rehype-level-h3"><h3 id="kinde-self-serve-portal-link">Kinde self-serve portal link</h3><a class="rehype-anchor-link inline-flex h-6 items-center justify-center min-w-8 hover:opacity-100" href="#kinde-self-serve-portal-link"><span aria-hidden="true" class="rehype-anchor-icon"><svg width="16" height="16" version="1.1" viewBox="0 0 16 16" xlmns="http://www.w3.org/2000/svg"><path fill-rule="evenodd" fill="currentcolor" d="M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z"></path></svg></span><span is:raw="true" class="sr-only">Link to this section</span></a></div> 1342<p>Call the Kinde Account API with the logged-in userâs access token to generate a self-serve portal link for the user:</p> 1343<div class="expressive-code"><figure class="frame has-title not-content"><figcaption class="header"><span class="title">JavaScript example</span></figcaption><pre data-language="javascript"><code><div class="ec-line"><div class="code"><span style="--0:#F97583;--1:#9039C9">const</span><span style="--1:#5A676D"><span style="--0:#B392F0"> </span><span style="--0:#79B8FF">response</span><span style="--0:#B392F0"> </span></span><span style="--0:#F97583;--1:#256F74">=</span><span style="--0:#B392F0;--1:#5A676D"> </span><span style="--0:#F97583;--1:#256F74;--1fs:italic">await</span><span style="--0:#B392F0;--1:#5A676D"> </span><span style="--0:#B392F0;--1:#4C6690">fetch</span><span style="--0:#B392F0;--1:#5A676D">(</span><span style="--0:#FFAB70;--1:#256F74">"</span><span style="--0:#FFAB70;--1:#566D35"><YOUR_DOMAIN>/account_api/v1/portal_link</span><span style="--0:#FFAB70;--1:#256F74">"</span><span style="--0:#BBBBBB;--1:#256F74">,</span><span style="--0:#B392F0;--1:#5A676D"> </span><span style="--0:#B392F0;--1:#256F74">{</span></div></div><div class="ec-line"><div class="code"><span class="indent"><span style="--0:#B392F0"> </span></span><span style="--0:#B392F0;--1:#BE2F2C">headers</span><span style="--0:#F97583;--1:#256F74">:</span><span style="--0:#B392F0;--1:#5A676D"> </span><span style="--0:#B392F0;--1:#256F74">{</span></div></div><div class="ec-line"><div class="code"><span class="indent"><span style="--0:#B392F0"> </span></span><span style="--0:#B392F0;--1:#BE2F2C">Authorization</span><span style="--0:#F97583;--1:#256F74">:</span><span style="--0:#B392F0;--1:#5A676D"> </span><span style="--0:#FFAB70;--1:#256F74">`</span><span style="--0:#FFAB70;--1:#566D35">Bearer </span><span style="--0:#F97583;--1:#256F74">${</span><span style="--0:#B392F0;--1:#5A676D">userAccessToken</span><span style="--1:#256F74"><span style="--0:#F97583">}</span><span style="--0:#FFAB70">`</span></span></div></div><div class="ec-line"><div class="code"><span class="indent"><span style="--0:#B392F0"> </span></span><span style="--0:#B392F0;--1:#256F74">}</span></div></div><div class="ec-line"><div class="code"><span style="--0:#B392F0;--1:#256F74">}</span><span style="--0:#B392F0;--1:#5A676D">)</span><span style="--0:#B392F0;--1:#256F74">;</span></div></div><div class="ec-line"><div class="code"><span style="--0:#F97583;--1:#9039C9">const</span><span style="--1:#5A676D"><span style="--0:#B392F0"> </span><span style="--0:#79B8FF">data</span><span style="--0:#B392F0"> </span></span><span style="--0:#F97583;--1:#256F74">=</span><span style="--0:#B392F0;--1:#5A676D"> </span><span style="--0:#F97583;--1:#256F74;--1fs:italic">await</span><span style="--1:#5A676D"><span style="--0:#B392F0"> </span><span style="--0:#79B8FF">response</span></span><span style="--0:#B392F0;--1:#256F74">.</span><span style="--0:#B392F0;--1:#4C6690">json</span><span style="--0:#B392F0;--1:#5A676D">()</span><span style="--0:#B392F0;--1:#256F74">;</span></div></div><div class="ec-line"><div class="code"><span style="--0:#79B8FF;--1:#5A676D">window</span><span style="--0:#B392F0;--1:#256F74">.</span><span style="--0:#B392F0;--1:#5A676D">location </span><span style="--0:#F97583;--1:#256F74">=</span><span style="--1:#5A676D"><span style="--0:#B392F0"> </span><span style="--0:#79B8FF">data</span></span><span style="--0:#B392F0;--1:#256F74">.</span><span style="--0:#B392F0;--1:#5A676D">url</span><span style="--0:#B392F0;--1:#256F74">;</span></div></div></code></pre><div class="copy"><button title="Copy to clipboard" data-copied="Copied!" data-code="const response = await fetch("<YOUR_DOMAIN>/account_api/v1/portal_link", {� headers: {� Authorization: `Bearer ${userAccessToken}`� }�});�const data = await response.json();�window.location = data.url;"><div></div></button></div></figure></div> 1344<p>Optional parameters:</p> 1345<ul> 1346<li><code dir="auto">subnav</code> â specify the portal section to open (e.g., <code dir="auto">organization_details</code>, <code dir="auto">profile</code>).</li> 1347<li><code dir="auto">return_url</code> â where to redirect the user after exiting the portal.</li> 1348</ul> 1349<p>See: <a href="/build/self-service-portal/self-serve-portal-for-users/">Self-serve portal for users</a>.</p> 1350<div tabindex="-1" class="rehype-heading-wrapper flex items-center relative w-auto rehype-level-h3"><h3 id="sign-out-your-users">Sign out your users</h3>
1350<a class="rehype-anchor-link inline-flex h-6 items-center justify-center min-w-8 hover:opacity-100" href="#sign-out-your-users"><span aria-hidden="true" class="rehype-anchor-icon"><svg width="16" height="16" version="1.1" viewBox="0 0 16 16" xlmns="http://www.w3.org/2000/svg"><path fill-rule="evenodd" fill="currentcolor" d="M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z"></path></svg></span><span is:raw="true" class="sr-only">Link to this section</span></a></div> 1351<p>To sign a user out:</p> 1352<ol> 1353<li> 1354<p>Clear any session or token storage in your app</p> 1355</li> 1356<li> 1357<p>Redirect them to the Kinde logout endpoint with your logout URL:</p> 1358<div class="expressive-code"><figure class="frame not-content"><figcaption class="header"></figcaption><pre data-language="text"><code><div class="ec-line"><div class="code"><span style="--0:#bbbbbb;--1:#5a676d"><YOUR_DOMAIN>/logout?redirect=<your_logout_url></span></div></div></code></pre><div class="copy"><button title="Copy to clipboard" data-copied="Copied!" data-code="<YOUR_DOMAIN>/logout?redirect=<your_logout_url>"><div></div></button></div></figure></div> 1359<p>This ends their Kinde session. They will need to authenticate again to receive new tokens.</p> 1360</li> 1361</ol> 1362<p>To register a logout URL, go to <strong>Settings > Applications > [Your app] > View details</strong>, then add it to the <strong>Allowed logout redirect URLs</strong> field.</p> 1363<div tabindex="-1" class="rehype-heading-wrapper flex items-center relative w-auto rehype-level-h2"><h2 id="supported-grant-types-in-kinde">Supported grant types in Kinde</h2><a class="rehype-anchor-link inline-flex h-6 items-center justify-center min-w-8 hover:opacity-100" href="#supported-grant-types-in-kinde"><span aria-hidden="true" class="rehype-anchor-icon"><svg width="16" height="16" version="1.1" viewBox="0 0 16 16" xlmns="http://www.w3.org/2000/svg"><path fill-rule="evenodd" fill="currentcolor" d="M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z"></path></svg></span><span is:raw="true" class="sr-only">Link to this section</span></a></div> 1364<div tabindex="-1" class="rehype-heading-wrapper flex items-center relative w-auto rehype-level-h3"><h3 id="authorization-code-flow">Authorization Code Flow</h3><a class="rehype-anchor-link inline-flex h-6 items-center justify-center min-w-8 hover:opacity-100" href="#authorization-code-flow"><span aria-hidden="true" class="rehype-anchor-icon"><svg width="16" height="16" version="1.1" viewBox="0 0 16 16" xlmns="http://www.w3.org/2000/svg"><path fill-rule="evenodd" fill="currentcolor" d="M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z"></path></svg></span><span is:raw="true" class="sr-only">Link to this section</span></a></div> 1365<p>The Authorization Code Flow is the standard way to sign users in when your app runs on a server you control. Instead of returning tokens directly in the browser, Kinde redirects the user back to your app with a short-lived authorization <code dir="auto">code</code>. Your server then exchanges that code for tokens by making a secure back-channel request to Kindeâs token endpoint, including your <code dir="auto">client_secret</code>. This two-step design keeps tokens off the URL and out of the browser â the authorization code is useless on its own without your secret. Use this flow for server-rendered web applications, traditional back-end web apps, and any client that can store a <code dir="auto">client_secret</code> securely on the server.</p> 1366<div tabindex="-1" class="rehype-heading-wrapper flex items-center relative w-auto rehype-level-h3"><h3 id="pkce-extension">PKCE extension</h3>
1366<a class="rehype-anchor-link inline-flex h-6 items-center justify-center min-w-8 hover:opacity-100" href="#pkce-extension"><span aria-hidden="true" class="rehype-anchor-icon"><svg width="16" height="16" version="1.1" viewBox="0 0 16 16" xlmns="http://www.w3.org/2000/svg"><path fill-rule="evenodd" fill="currentcolor" d="M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z"></path></svg></span><span is:raw="true" class="sr-only">Link to this section</span></a></div> 1367<p>The Authorization Code Flow with PKCE (Proof Key for Code Exchange) works the same way, but replaces the <code dir="auto">client_secret</code> with a one-time cryptographic proof. Before redirecting the user to Kinde, your app generates a random <code dir="auto">code_verifier</code> and sends a hashed version (<code dir="auto">code_challenge</code>) in the authorization request. When exchanging the authorization code for tokens, your app sends the original <code dir="auto">code_verifier</code> instead of a secret. Kinde verifies they match, proving that the same app that started the login is completing it. This matters because single-page apps (SPAs) and mobile apps are âpublic clientsâ â their code runs on the userâs device, so a <code dir="auto">client_secret</code> could be extracted and abused. PKCE gives you the security of the authorization code flow without needing a secret. Use PKCE for SPAs, native mobile apps, desktop apps, and any client that cannot keep a <code dir="auto">client_secret</code> confidential.</p> 1368<div tabindex="-1" class="rehype-heading-wrapper flex items-center relative w-auto rehype-level-h3"><h3 id="implicit-flow-not-recommended">Implicit flow (Not recommended)</h3><a class="rehype-anchor-link inline-flex h-6 items-center justify-center min-w-8 hover:opacity-100" href="#implicit-flow-not-recommended"><span aria-hidden="true" class="rehype-anchor-icon"><svg width="16" height="16" version="1.1" viewBox="0 0 16 16" xlmns="http://www.w3.org/2000/svg"><path fill-rule="evenodd" fill="currentcolor" d="M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z"></path></svg></span><span is:raw="true" class="sr-only">Link to this section</span></a></div> 1369<p>The Implicit Flow was originally created for browser-based apps that couldnât keep a secret â it returned the <code dir="auto">access_token</code> directly in the URL fragment after login. That convenience came at a serious cost: tokens in URL fragments can leak through browser history, referrer headers, and server logs. The OAuth 2.0 Security Best Current Practice (<a href="https://datatracker.ietf.org/doc/html/rfc9700#name-implicit-grant" target="_blank" rel="noopener noreferrer">RFC 9700</a>) now explicitly recommends against using the Implicit Flow for any new application.</p> 1370<p><strong>What to use instead:</strong> The Authorization Code Flow with PKCE is the correct choice for all public clients â including single-page apps and mobile apps â regardless of whether they can store a client secret. PKCE (Proof Key for Code Exchange) solves the same problem the Implicit Flow was trying to address, without the token-in-URL security exposure.</p> 1371<p>If you are migrating an existing app from the Implicit Flow, replace the flow type <code dir="auto">token</code> with <code dir="auto">code</code> and add the <code dir="auto">code_challenge</code> and <code dir="auto">code_challenge_method</code> parameters to your authorization request. No client secret is required.</p> 1372<div tabindex="-1" class="rehype-heading-wrapper flex items-center relative w-auto rehype-level-h2"><h2 id="oauth-20-scopes-for-kinde">OAuth 2.0 scopes for Kinde</h2>
1372<a class="rehype-anchor-link inline-flex h-6 items-center justify-center min-w-8 hover:opacity-100" href="#oauth-20-scopes-for-kinde"><span aria-hidden="true" class="rehype-anchor-icon"><svg width="16" height="16" version="1.1" viewBox="0 0 16 16" xlmns="http://www.w3.org/2000/svg"><path fill-rule="evenodd" fill="currentcolor" d="M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z"></path></svg></span><span is:raw="true" class="sr-only">Link to this section</span></a></div> 1373<p>The following scopes can be requested from Kinde.</p> 1374<div tabindex="-1" class="rehype-heading-wrapper flex items-center relative w-auto rehype-level-h3 rehype-with-code"><h3 id="openid"><code dir="auto">openid</code></h3><a class="rehype-anchor-link inline-flex h-6 items-center justify-center min-w-8 hover:opacity-100" href="#openid"><span aria-hidden="true" class="rehype-anchor-icon"><svg width="16" height="16" version="1.1" viewBox="0 0 16 16" xlmns="http://www.w3.org/2000/svg"><path fill-rule="evenodd" fill="currentcolor" d="M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z"></path></svg></span><span is:raw="true" class="sr-only">Link to this section</span></a></div> 1375<p>Requests an <code dir="auto">id_token</code> that contains information about the authenticated user.</p> 1376<div tabindex="-1" class="rehype-heading-wrapper flex items-center relative w-auto rehype-level-h3 rehype-with-code"><h3 id="email"><code dir="auto">email</code></h3><a class="rehype-anchor-link inline-flex h-6 items-center justify-center min-w-8 hover:opacity-100" href="#email"><span aria-hidden="true" class="rehype-anchor-icon"><svg width="16" height="16" version="1.1" viewBox="0 0 16 16" xlmns="http://www.w3.org/2000/svg"><path fill-rule="evenodd" fill="currentcolor" d="M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z"></path></svg></span><span is:raw="true" class="sr-only">Link to this section</span></a></div> 1377<p>Requests the <code dir="auto">email</code> and <code dir="auto">email_verified</code> claims in the <code dir="auto">id_token</code>.</p> 1378<div tabindex="-1" class="rehype-heading-wrapper flex items-center relative w-auto rehype-level-h3 rehype-with-code"><h3 id="profile"><code dir="auto">profile</code></h3><a class="rehype-anchor-link inline-flex h-6 items-center justify-center min-w-8 hover:opacity-100" href="#profile"><span aria-hidden="true" class="rehype-anchor-icon"><svg width="16" height="16" version="1.1" viewBox="0 0 16 16" xlmns="http://www.w3.org/2000/svg"><path fill-rule="evenodd" fill="currentcolor" d="M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z"></path></svg></span><span is:raw="true" class="sr-only">Link to this section</span></a></div> 1379<p>Requests profile details as part of the <code dir="auto">id_token</code>, including given name, family name, and picture.</p> 1380<div tabindex="-1" class="rehype-heading-wrapper flex items-center relative w-auto rehype-level-h3 rehype-with-code"><h3 id="offline"><code dir="auto">offline</code></h3>
1380<a class="rehype-anchor-link inline-flex h-6 items-center justify-center min-w-8 hover:opacity-100" href="#offline"><span aria-hidden="true" class="rehype-anchor-icon"><svg width="16" height="16" version="1.1" viewBox="0 0 16 16" xlmns="http://www.w3.org/2000/svg"><path fill-rule="evenodd" fill="currentcolor" d="M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z"></path></svg></span><span is:raw="true" class="sr-only">Link to this section</span></a></div> 1381<p>Requests a <code dir="auto">refresh_token</code> that can be used to silently refresh the <code dir="auto">access_token</code> when it expires.</p> 1382<aside aria-label="Use offline, not offline_access" class="c-aside not-content p-6 rounded-lg flex flex-col md:flex-row gap-4 items-start c-aside--warning astro-duqfclob"> <div class="note-header flex items-center astro-duqfclob"> <svg width="24" height="24" viewBox="0 0 24 24" class="astro-duqfclob" data-icon="alert-triangle"> <use href="#ai:local:alert-triangle"></use> </svg> </div> <div class="flex flex-col gap-3 astro-duqfclob"> <div class="note-title text-base font-medium astro-duqfclob"> Use offline, not offline_access </div> <div class="note-body astro-duqfclob"> <p>Kinde uses <code dir="auto">offline</code> to request a refresh token. The OIDC specification defines this scope as <code dir="auto">offline_access</code>, but Kinde does not support <code dir="auto">offline_access</code> â using it will not return a refresh token and will not produce an error. Make sure to use <code dir="auto">offline</code> exactly.</p> </div> </div> </aside> 1383<div tabindex="-1" class="rehype-heading-wrapper flex items-center relative w-auto rehype-level-h3 rehype-with-code"><h3 id="phone"><code dir="auto">phone</code></h3><a class="rehype-anchor-link inline-flex h-6 items-center justify-center min-w-8 hover:opacity-100" href="#phone"><span aria-hidden="true" class="rehype-anchor-icon"><svg width="16" height="16" version="1.1" viewBox="0 0 16 16" xlmns="http://www.w3.org/2000/svg"><path fill-rule="evenodd" fill="currentcolor" d="M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z"></path></svg></span><span is:raw="true" class="sr-only">Link to this section</span></a></div> 1384<p>Requests the <code dir="auto">phone_number</code> and <code dir="auto">phone_number_verified</code> claims in the <code dir="auto">id_token</code>.</p> 1385<div tabindex="-1" class="rehype-heading-wrapper flex items-center relative w-auto rehype-level-h3 rehype-with-code"><h3 id="address"><code dir="auto">address</code></h3><a class="rehype-anchor-link inline-flex h-6 items-center justify-center min-w-8 hover:opacity-100" href="#address"><span aria-hidden="true" class="rehype-anchor-icon"><svg width="16" height="16" version="1.1" viewBox="0 0 16 16" xlmns="http://www.w3.org/2000/svg"><path fill-rule="evenodd" fill="currentcolor" d="M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z"></path></svg></span><span is:raw="true" class="sr-only">Link to this section</span></a></div> 1386<p>Requests the <code dir="auto">address</code> claim in the <code dir="auto">id_token</code>.</p> 1387<div tabindex="-1" class="rehype-heading-wrapper flex items-center relative w-auto rehype-level-h2"><h2 id="request-parameters"><strong>Request parameters</strong></h2>
1387<a class="rehype-anchor-link inline-flex h-6 items-center justify-center min-w-8 hover:opacity-100" href="#request-parameters"><span aria-hidden="true" class="rehype-anchor-icon"><svg width="16" height="16" version="1.1" viewBox="0 0 16 16" xlmns="http://www.w3.org/2000/svg"><path fill-rule="evenodd" fill="currentcolor" d="M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z"></path></svg></span><span is:raw="true" class="sr-only">Link to this section</span></a></div> 1388<p>There are a few useful additional parameters that Kinde supports in the authorization URL.</p> 1389<div tabindex="-1" class="rehype-heading-wrapper flex items-center relative w-auto rehype-level-h3 rehype-with-code"><h3 id="response_type"><code dir="auto">response_type</code></h3><a class="rehype-anchor-link inline-flex h-6 items-center justify-center min-w-8 hover:opacity-100" href="#response_type"><span aria-hidden="true" class="rehype-anchor-icon"><svg width="16" height="16" version="1.1" viewBox="0 0 16 16" xlmns="http://www.w3.org/2000/svg"><path fill-rule="evenodd" fill="currentcolor" d="M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z"></path></svg></span><span is:raw="true" class="sr-only">Link to this section</span></a></div> 1390<p>Should always be <code dir="auto">code</code>. Kinde does not support the Implicit Flow â see <a href="#does-kinde-support-the-implicit-flow">Does Kinde support the Implicit Flow?</a> for details.</p> 1391<p>Type: <code dir="auto">string</code></p> 1392<p>Required: Yes</p> 1393<div tabindex="-1" class="rehype-heading-wrapper flex items-center relative w-auto rehype-level-h3 rehype-with-code"><h3 id="client_id"><code dir="auto">client_id</code></h3><a class="rehype-anchor-link inline-flex h-6 items-center justify-center min-w-8 hover:opacity-100" href="#client_id"><span aria-hidden="true" class="rehype-anchor-icon"><svg width="16" height="16" version="1.1" viewBox="0 0 16 16" xlmns="http://www.w3.org/2000/svg"><path fill-rule="evenodd" fill="currentcolor" d="M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z"></path></svg></span><span is:raw="true" class="sr-only">Link to this section</span></a></div> 1394<p>The unique ID of your application in Kinde.</p> 1395<p>Type: <code dir="auto">string</code></p> 1396<p>Required: Yes</p> 1397<div tabindex="-1" class="rehype-heading-wrapper flex items-center relative w-auto rehype-level-h3 rehype-with-code"><h3 id="redirect_uri"><code dir="auto">redirect_uri</code></h3><a class="rehype-anchor-link inline-flex h-6 items-center justify-center min-w-8 hover:opacity-100" href="#redirect_uri"><span aria-hidden="true" class="rehype-anchor-icon"><svg width="16" height="16" version="1.1" viewBox="0 0 16 16" xlmns="http://www.w3.org/2000/svg"><path fill-rule="evenodd" fill="currentcolor" d="M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z"></path></svg></span><span is:raw="true" class="sr-only">Link to this section</span></a></div> 1398<p>The URL that the user will be returned to after authentication.</p> 1399<p>Type: <code dir="auto">string</code></p> 1400<p>Required: Yes</p> 1401<div tabindex="-1" class="rehype-heading-wrapper flex items-center relative w-auto rehype-level-h3 rehype-with-code"><h3 id="scope"><code dir="auto">scope</code></h3>
1401<a class="rehype-anchor-link inline-flex h-6 items-center justify-center min-w-8 hover:opacity-100" href="#scope"><span aria-hidden="true" class="rehype-anchor-icon"><svg width="16" height="16" version="1.1" viewBox="0 0 16 16" xlmns="http://www.w3.org/2000/svg"><path fill-rule="evenodd" fill="currentcolor" d="M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z"></path></svg></span><span is:raw="true" class="sr-only">Link to this section</span></a></div> 1402<p>The scopes to be requested from Kinde. Scopes include <code dir="auto">openid</code>, <code dir="auto">profile</code>, <code dir="auto">email</code>, <code dir="auto">offline</code>.</p> 1403<p>Type: <code dir="auto">string</code></p> 1404<p>Required: No</p> 1405<p>Recommended: <code dir="auto">openid profile email</code></p> 1406<aside aria-label="INFO" class="c-aside not-content p-6 rounded-lg flex flex-col md:flex-row gap-4 items-start c-aside--info astro-duqfclob"> <div class="note-header flex items-center astro-duqfclob"> <svg width="24" height="24" viewBox="0 0 24 24" class="astro-duqfclob" data-icon="info"> <use href="#ai:local:info"></use> </svg> </div> <div class="flex flex-col astro-duqfclob"> <div class="note-title text-base font-medium astro-duqfclob"> <div aria-hidden="true" class="astro-duqfclob"></div> </div> <div class="note-body astro-duqfclob"> <p>Kinde uses <code dir="auto">offline</code> to request a refresh token in place of the OIDC specificationâs <code dir="auto">offline_access</code> scope.</p> </div> </div> </aside> 1407<div tabindex="-1" class="rehype-heading-wrapper flex items-center relative w-auto rehype-level-h3 rehype-with-code"><h3 id="state"><code dir="auto">state</code></h3><a class="rehype-anchor-link inline-flex h-6 items-center justify-center min-w-8 hover:opacity-100" href="#state"><span aria-hidden="true" class="rehype-anchor-icon"><svg width="16" height="16" version="1.1" viewBox="0 0 16 16" xlmns="http://www.w3.org/2000/svg"><path fill-rule="evenodd" fill="currentcolor" d="M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z"></path></svg></span><span is:raw="true" class="sr-only">Link to this section</span></a></div> 1408<p>Kinde will return this to your app so you can validate it came from us and prevent CSRF attacks.</p> 1409<p>Type: <code dir="auto">string</code></p> 1410<p>Required: Yes (min 8 characters)</p> 1411<p>You can also use the <code dir="auto">state</code> parameter to store additional information about the user or the authentication flow.</p> 1412<div tabindex="-1" class="rehype-heading-wrapper flex items-center relative w-auto rehype-level-h3 rehype-with-code"><h3 id="nonce"><code dir="auto">nonce</code></h3><a class="rehype-anchor-link inline-flex h-6 items-center justify-center min-w-8 hover:opacity-100" href="#nonce"><span aria-hidden="true" class="rehype-anchor-icon"><svg width="16" height="16" version="1.1" viewBox="0 0 16 16" xlmns="http://www.w3.org/2000/svg"><path fill-rule="evenodd" fill="currentcolor" d="M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z"></path></svg></span><span is:raw="true" class="sr-only">Link to this section</span></a></div> 1413<p>A single-use value included in the signed <code dir="auto">id_token</code> to prevent replay attacks.</p> 1414<p>Type: <code dir="auto">string</code></p> 1415<p>Required: No (but recommended)</p> 1416<div tabindex="-1" class="rehype-heading-wrapper flex items-center relative w-auto rehype-level-h3 rehype-with-code"><h3 id="code_challenge"><code dir="auto">code_challenge</code></h3>
1416<a class="rehype-anchor-link inline-flex h-6 items-center justify-center min-w-8 hover:opacity-100" href="#code_challenge"><span aria-hidden="true" class="rehype-anchor-icon"><svg width="16" height="16" version="1.1" viewBox="0 0 16 16" xlmns="http://www.w3.org/2000/svg"><path fill-rule="evenodd" fill="currentcolor" d="M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z"></path></svg></span><span is:raw="true" class="sr-only">Link to this section</span></a></div> 1417<p>A base64url-encoded SHA-256 hash of the code verifier.</p> 1418<p>Type: <code dir="auto">string</code></p> 1419<p>Required: for public clients (e.g., SPAs and mobile apps)</p> 1420<div tabindex="-1" class="rehype-heading-wrapper flex items-center relative w-auto rehype-level-h3 rehype-with-code"><h3 id="code_challenge_method"><code dir="auto">code_challenge_method</code></h3><a class="rehype-anchor-link inline-flex h-6 items-center justify-center min-w-8 hover:opacity-100" href="#code_challenge_method"><span aria-hidden="true" class="rehype-anchor-icon"><svg width="16" height="16" version="1.1" viewBox="0 0 16 16" xlmns="http://www.w3.org/2000/svg"><path fill-rule="evenodd" fill="currentcolor" d="M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z"></path></svg></span><span is:raw="true" class="sr-only">Link to this section</span></a></div> 1421<p>Should always be <code dir="auto">S256</code>. This tells Kinde that the code challenge was generated using SHA-256.</p> 1422<p>Type: <code dir="auto">string</code></p> 1423<p>Required: For PKCE</p> 1424<div tabindex="-1" class="rehype-heading-wrapper flex items-center relative w-auto rehype-level-h3 rehype-with-code"><h3 id="prompt"><code dir="auto">prompt</code></h3><a class="rehype-anchor-link inline-flex h-6 items-center justify-center min-w-8 hover:opacity-100" href="#prompt"><span aria-hidden="true" class="rehype-anchor-icon"><svg width="16" height="16" version="1.1" viewBox="0 0 16 16" xlmns="http://www.w3.org/2000/svg"><path fill-rule="evenodd" fill="currentcolor" d="M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z"></path></svg></span><span is:raw="true" class="sr-only">Link to this section</span></a></div> 1425<p>Accepts <code dir="auto">login</code>, <code dir="auto">create</code>, <code dir="auto">consent</code>, <code dir="auto">select_account</code>, or <code dir="auto">none</code> to control which page users land on. By default, users are directed to the sign-in page.</p> 1426<p>If you use <code dir="auto">none</code>, Kinde will not show authentication screens to the user.</p> 1427<ul> 1428<li> 1429<p>If the user has an active SSO session, this will redirect them to the callback URL where the token exchange can occur.</p> 1430</li> 1431<li> 1432<p>If the user does NOT have an active SSO session, this will redirect them to the callback URL with the following error:</p> 1433<div class="expressive-code"><figure class="frame not-content"><figcaption class="header"></figcaption><pre data-language="http"><code><div class="ec-line"><div class="code"><span style="--0:#B392F0;--1:#5A676D">302 <YOUR_CALLBACK_URL>?</span></div></div><div class="ec-line"><div class="code"><span style="--0:#B392F0;--1:#5A676D">error=login_required&</span></div></div><div class="ec-line"><div class="code"><span style="--0:#B392F0;--1:#5A676D">error_description=User+authentication+is+required&</span></div></div><div class="ec-line"><div class="code"><span style="--0:#B392F0;--1:#5A676D">state=YOUR_STATE</span></div></div></code></pre><div class="copy"><button title="Copy to clipboard" data-copied="Copied!" data-code="302 <YOUR_CALLBACK_URL>?�error=login_required&�error_description=User+authentication+is+required&�state=YOUR_STATE"><div></div></button></div></figure></div> 1434</li> 1435</ul> 1436<p>Type: <code dir="auto">string</code></p> 1437<p>Required: No</p> 1438<div tabindex="-1" class="rehype-heading-wrapper flex items-center relative w-auto rehype-level-h3 rehype-with-code"><h3 id="login_hint"><code dir="auto">login_hint</code></h3>
1438<a class="rehype-anchor-link inline-flex h-6 items-center justify-center min-w-8 hover:opacity-100" href="#login_hint"><span aria-hidden="true" class="rehype-anchor-icon"><svg width="16" height="16" version="1.1" viewBox="0 0 16 16" xlmns="http://www.w3.org/2000/svg"><path fill-rule="evenodd" fill="currentcolor" d="M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z"></path></svg></span><span is:raw="true" class="sr-only">Link to this section</span></a></div> 1439<p>When your project knows which user it is trying to authenticate, it can provide their email in this parameter as a hint to Kinde. Passing this hint pre-fills the email box on the sign-up and sign-in screens.</p> 1440<p>Type: <code dir="auto">string</code></p> 1441<p>Required: No</p> 1442<div tabindex="-1" class="rehype-heading-wrapper flex items-center relative w-auto rehype-level-h3 rehype-with-code"><h3 id="org_code"><code dir="auto">
1442org_code</code></h3><a class="rehype-anchor-link inline-flex h-6 items-center justify-center min-w-8 hover:opacity-100" href="#org_code"><span aria-hidden="true" class="rehype-anchor-icon"><svg width="16" height="16" version="1.1" viewBox="0 0 16 16" xlmns="http://www.w3.org/2000/svg"><path fill-rule="evenodd" fill="currentcolor" d="M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z"></path></svg></span><span is:raw="true" class="sr-only">Link to this section</span></a></div> 1443<p>For multi-tenant or platform apps, tell Kinde which organization a user is trying to sign in or sign up to.</p> 1444<p>Type: <code dir="auto">string</code></p> 1445<p>Required: No</p> 1446<div tabindex="-1" class="rehype-heading-wrapper flex items-center relative w-auto rehype-level-h3 rehype-with-code"><h3 id="is_create_org"><code dir="auto">is_create_org</code></h3><a class="rehype-anchor-link inline-flex h-6 items-center justify-center min-w-8 hover:opacity-100" href="#is_create_org"><span aria-hidden="true" class="rehype-anchor-icon"><svg width="16" height="16" version="1.1" viewBox="0 0 16 16" xlmns="http://www.w3.org/2000/svg"><path fill-rule="evenodd" fill="currentcolor" d="M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z"></path></svg></span><span is:raw="true" class="sr-only">Link to this section</span></a></div> 1447<p>Set to <code dir="auto">true</code> to create a new organization for the user during sign-up.</p> 1448<p>Type: <code dir="auto">boolean</code></p> 1449<p>Required: No</p> 1450<div tabindex="-1" class="rehype-heading-wrapper flex items-center relative w-auto rehype-level-h3 rehype-with-code"><h3 id="org_name"><code dir="auto">org_name</code></h3><a class="rehype-anchor-link inline-flex h-6 items-center justify-center min-w-8 hover:opacity-100" href="#org_name"><span aria-hidden="true" class="rehype-anchor-icon"><svg width="16" height="16" version="1.1" viewBox="0 0 16 16" xlmns="http://www.w3.org/2000/svg"><path fill-rule="evenodd" fill="currentcolor" d="M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z"></path></svg></span><span is:raw="true" class="sr-only">Link to this section</span></a></div> 1451<p>If <code dir="auto">is_create_org</code> is <code dir="auto">true</code>, you can optionally include the name of the organization to create.</p> 1452<p>Type: <code dir="auto">string</code></p> 1453<p>Required: No</p> 1454<div tabindex="-1" class="rehype-heading-wrapper flex items-center relative w-auto rehype-level-h3 rehype-with-code"><h3 id="audience"><code dir="auto">audience</code></h3><a class="rehype-anchor-link inline-flex h-6 items-center justify-center min-w-8 hover:opacity-100" href="#audience"><span aria-hidden="true" class="rehype-anchor-icon"><svg width="16" height="16" version="1.1" viewBox="0 0 16 16" xlmns="http://www.w3.org/2000/svg"><path fill-rule="evenodd" fill="currentcolor" d="M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z"></path></svg></span><span is:raw="true" class="sr-only">Link to this section</span></a></div> 1455<p>The <code dir="auto">audience</code> claim for the JWT. This can be used to protect your APIs and resource servers.</p> 1456<p>Type: <code dir="auto">string</code></p> 1457<p>Required: No</p> 1458<div tabindex="-1" class="rehype-heading-wrapper flex items-center relative w-auto rehype-level-h3 rehype-with-code"><h3 id="has_success_page"><code dir="auto">has_success_page</code></h3>
1458<a class="rehype-anchor-link inline-flex h-6 items-center justify-center min-w-8 hover:opacity-100" href="#has_success_page"><span aria-hidden="true" class="rehype-anchor-icon"><svg width="16" height="16" version="1.1" viewBox="0 0 16 16" xlmns="http://www.w3.org/2000/svg"><path fill-rule="evenodd" fill="currentcolor" d="M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z"></path></svg></span><span is:raw="true" class="sr-only">Link to this section</span></a></div> 1459<p>Shows a success page at the end of the authentication flow. Useful when the callback URL opens a native app rather than a web page.</p> 1460<p>Type: <code dir="auto">boolean</code></p> 1461<p>Required: No</p> 1462<div tabindex="-1" class="rehype-heading-wrapper flex items-center relative w-auto rehype-level-h3 rehype-with-code"><h3 id="lang"><code dir="auto">lang</code></h3><a class="rehype-anchor-link inline-flex h-6 items-center justify-center min-w-8 hover:opacity-100" href="#lang"><span aria-hidden="true" class="rehype-anchor-icon"><svg width="16" height="16" version="1.1" viewBox="0 0 16 16" xlmns="http://www.w3.org/2000/svg"><path fill-rule="evenodd" fill="currentcolor" d="M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z"></path></svg></span><span is:raw="true" class="sr-only">Link to this section</span></a></div> 1463<p>Sets the UI language for the authentication screens.</p> 1464<p>Type: <code dir="auto">string</code></p> 1465<p>Required: No</p> 1466<div tabindex="-1" class="rehype-heading-wrapper flex items-center relative w-auto rehype-level-h3 rehype-with-code"><h3 id="connection_id"><code dir="auto">connection_id</code></h3><a class="rehype-anchor-link inline-flex h-6 items-center justify-center min-w-8 hover:opacity-100" href="#connection_id"><span aria-hidden="true" class="rehype-anchor-icon"><svg width="16" height="16" version="1.1" viewBox="0 0 16 16" xlmns="http://www.w3.org/2000/svg"><path fill-rule="evenodd" fill="currentcolor" d="M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z"></path></svg></span><span is:raw="true" class="sr-only">Link to this section</span></a></div> 1467<p>The connection ID for the authentication method, used when implementing <a href="/authenticate/custom-configurations/custom-authentication-pages/">custom sign-up and sign-in pages</a>.</p> 1468<p>Type: <code dir="auto">string</code></p> 1469<p>Required: When using custom sign-up and sign-in pages</p> 1470<div tabindex="-1" class="rehype-heading-wrapper flex items-center relative w-auto rehype-level-h3 rehype-with-code"><h3 id="supports_reauth"><code dir="auto">supports_reauth</code></h3><a class="rehype-anchor-link inline-flex h-6 items-center justify-center min-w-8 hover:opacity-100" href="#supports_reauth"><span aria-hidden="true" class="rehype-anchor-icon"><svg width="16" height="16" version="1.1" viewBox="0 0 16 16" xlmns="http://www.w3.org/2000/svg"><path fill-rule="evenodd" fill="currentcolor" d="M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z"></path></svg></span><span is:raw="true" class="sr-only">Link to this section</span></a></div> 1471<p>When set to <code dir="auto">true</code>, the userâs state is encrypted and returned to the application when they access an expired link.</p> 1472<p>Type: <code dir="auto">boolean</code></p> 1473<p>Required: No</p> 1474<div tabindex="-1" class="rehype-heading-wrapper flex items-center relative w-auto rehype-level-h3 rehype-with-code"><h3 id="reauth_state"><code dir="auto">reauth_state</code></h3>
1474<a class="rehype-anchor-link inline-flex h-6 items-center justify-center min-w-8 hover:opacity-100" href="#reauth_state"><span aria-hidden="true" class="rehype-anchor-icon"><svg width="16" height="16" version="1.1" viewBox="0 0 16 16" xlmns="http://www.w3.org/2000/svg"><path fill-rule="evenodd" fill="currentcolor" d="M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z"></path></svg></span><span is:raw="true" class="sr-only">Link to this section</span></a></div> 1475<p>When <code dir="auto">supports_reauth</code> is <code dir="auto">true</code> and authentication fails, the userâs state is returned alongside the error. Pass this value back to the authorization flow to resume where the user left off.</p> 1476<p>Type: <code dir="auto">string</code></p> 1477<p>Required: No</p> 1478<div tabindex="-1" class="rehype-heading-wrapper flex items-center relative w-auto rehype-level-h3 rehype-with-code"><h3 id="deploy_id"><code dir="auto">deploy_id</code></h3><a class="rehype-anchor-link inline-flex h-6 items-center justify-center min-w-8 hover:opacity-100" href="#deploy_id"><span aria-hidden="true" class="rehype-anchor-icon"><svg width="16" height="16" version="1.1" viewBox="0 0 16 16" xlmns="http://www.w3.org/2000/svg"><path fill-rule="evenodd" fill="currentcolor" d="M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z"></path></svg></span><span is:raw="true" class="sr-only">Link to this section</span></a></div> 1479<p>The ID of a workflow deployment to test. When set, a password will be requested on login.</p> 1480<p>Type: <code dir="auto">string</code></p> 1481<p>Required: No</p> 1482<div tabindex="-1" class="rehype-heading-wrapper flex items-center relative w-auto rehype-level-h3 rehype-with-code"><h3 id="plan_interest"><code dir="auto">plan_interest</code></h3><a class="rehype-anchor-link inline-flex h-6 items-center justify-center min-w-8 hover:opacity-100" href="#plan_interest"><span aria-hidden="true" class="rehype-anchor-icon"><svg width="16" height="16" version="1.1" viewBox="0 0 16 16" xlmns="http://www.w3.org/2000/svg"><path fill-rule="evenodd" fill="currentcolor" d="M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z"></path></svg></span><span is:raw="true" class="sr-only">Link to this section</span></a></div> 1483<p>Indicates the plan the user has expressed interest in.</p> 1484<p>Type: <code dir="auto">string</code></p> 1485<p>Required: No</p> 1486<div tabindex="-1" class="rehype-heading-wrapper flex items-center relative w-auto rehype-level-h3 rehype-with-code"><h3 id="pricing_table_key"><code dir="auto">pricing_table_key</code></h3><a class="rehype-anchor-link inline-flex h-6 items-center justify-center min-w-8 hover:opacity-100" href="#pricing_table_key"><span aria-hidden="true" class="rehype-anchor-icon"><svg width="16" height="16" version="1.1" viewBox="0 0 16 16" xlmns="http://www.w3.org/2000/svg"><path fill-rule="evenodd" fill="currentcolor" d="M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z"></path></svg></span><span is:raw="true" class="sr-only">Link to this section</span></a></div> 1487<p>Defines which pricing table to display in the billing flow.</p> 1488<p>Type: <code dir="auto">string</code></p> 1489<p>Required: No</p> 1490<div tabindex="-1" class="rehype-heading-wrapper flex items-center relative w-auto rehype-level-h3 rehype-with-code"><h3 id="start_page-deprecated"><code dir="auto">start_page</code> (deprecated)</h3>
1490<a class="rehype-anchor-link inline-flex h-6 items-center justify-center min-w-8 hover:opacity-100" href="#start_page-deprecated"><span aria-hidden="true" class="rehype-anchor-icon"><svg width="16" height="16" version="1.1" viewBox="0 0 16 16" xlmns="http://www.w3.org/2000/svg"><path fill-rule="evenodd" fill="currentcolor" d="M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z"></path></svg></span><span is:raw="true" class="sr-only">Link to this section</span></a></div> 1491<p>Accepts <code dir="auto">login</code> or <code dir="auto">registration</code>. Use <code dir="auto">prompt</code> instead.</p> 1492<p>Type: <code dir="auto">string</code></p> 1493<p>Required: No</p> 1494<div tabindex="-1" class="rehype-heading-wrapper flex items-center relative w-auto rehype-level-h2"><h2 id="faqs">FAQs</h2><a class="rehype-anchor-link inline-flex h-6 items-center justify-center min-w-8 hover:opacity-100" href="#faqs"><span aria-hidden="true" class="rehype-anchor-icon"><svg width="16" height="16" version="1.1" viewBox="0 0 16 16" xlmns="http://www.w3.org/2000/svg"><path fill-rule="evenodd" fill="currentcolor" d="M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z"></path></svg></span><span is:raw="true" class="sr-only">Link to this section</span></a></div> 1495<div tabindex="-1" class="rehype-heading-wrapper flex items-center relative w-auto rehype-level-h3 rehype-with-code"><h3 id="when-should-i-use-the-userinfo-endpoint-instead-of-decoding-the-id_token">When should I use the userinfo endpoint instead of decoding the <code dir="auto">id_token</code>?</h3><a class="rehype-anchor-link inline-flex h-6 items-center justify-center min-w-8 hover:opacity-100" href="#when-should-i-use-the-userinfo-endpoint-instead-of-decoding-the-id_token"><span aria-hidden="true" class="rehype-anchor-icon"><svg width="16" height="16" version="1.1" viewBox="0 0 16 16" xlmns="http://www.w3.org/2000/svg"><path fill-rule="evenodd" fill="currentcolor" d="M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z"></path></svg></span><span is:raw="true" class="sr-only">Link to this section</span></a></div> 1496<p>Decoding the <code dir="auto">id_token</code> is usually the fastest approach â it requires no extra network request. However, there are three situations where calling the userinfo endpoint is the right choice:</p> 1497<ul> 1498<li><strong>You need up-to-date profile data.</strong> The <code dir="auto">id_token</code> is a snapshot frozen at login time. If the user updates their name, email, or avatar in Kinde after theyâve authenticated, the <code dir="auto">id_token</code> stays stale until they get a new one. The userinfo endpoint queries Kinde live and always returns current data.</li> 1499<li><strong>Your backend only has the <code dir="auto">access_token</code>.</strong> The <code dir="auto">id_token</code> is typically held by the frontend. If your server needs to look up the authenticated userâs profile, it can call the userinfo endpoint using the <code dir="auto">access_token</code> from the request header â without needing the frontend to forward the <code dir="auto">id_token</code> separately.</li> 1500<li><strong>You didnât request the <code dir="auto">openid</code> scope.</strong> Without <code dir="auto">openid</code>, no <code dir="auto">id_token</code> is issued. The userinfo endpoint still works as long as you hold a valid <code dir="auto">access_token</code>.</li> 1501</ul> 1502<p>In all other cases, prefer decoding the <code dir="auto">id_token</code> â itâs faster and requires no round trip to Kinde.</p> 1503<p>To call the userinfo endpoint, pass the <code dir="auto">access_token</code> as a Bearer token:</p> 1504<div class="expressive-code"><figure class="frame not-content"><figcaption class="header"></figcaption><pre data-language="http"><code><div class="ec-line"><div class="code"><span style="--0:#F97583;--1:#256F74;--1fs:italic">
1504GET</span><span style="--0:#B392F0;--1:#5A676D"> https://<YOUR_DOMAIN>/oauth2/v2/user_profile</span></div></div><div class="ec-line"><div class="code"><span style="--0:#FFAB70;--1:#BE2F2C">Authorization</span><span style="--0:#F97583;--1:#A64930">:</span><span style="--0:#B392F0;--1:#5A676D"> </span><span style="--0:#9DB1C5;--1:#566D35">Bearer <access_token></span></div></div></code></pre><div class="copy"><button title="Copy to clipboard" data-copied="Copied!" data-code="GET https://<YOUR_DOMAIN>/oauth2/v2/user_profile�Authorization: Bearer <access_token>"><div></div></button></div></figure></div> 1505<p>The response returns the userâs current profile fields:</p> 1506<div class="expressive-code"><figure class="frame not-content"><figcaption class="header"></figcaption><pre data-language="json"><code><div class="ec-line"><div class="code"><span style="--0:#B392F0;--1:#256F74">{</span></div></div><div class="ec-line"><div class="code"><span class="indent"> </span><span style="--0:#F8F8F8;--1:#256F74">"</span><span style="--0:#F8F8F8;--1:#9039C9">sub</span><span style="--0:#F8F8F8;--1:#256F74">"</span><span style="--0:#BBBBBB;--1:#256F74">:</span><span style="--0:#B392F0;--1:#5A676D"> </span><span style="--0:#FFAB70;--1:#256F74">"</span><span style="--0:#FFAB70;--1:#566D35">kp_7a4b2c...</span><span style="--0:#FFAB70;--1:#256F74">"</span><span style="--0:#BBBBBB;--1:#256F74">,</span></div></div><div class="ec-line"><div class="code"><span class="indent"> </span><span style="--0:#F8F8F8;--1:#256F74">"</span><span style="--0:#F8F8F8;--1:#9039C9">given_name</span><span style="--0:#F8F8F8;--1:#256F74">"</span><span style="--0:#BBBBBB;--1:#256F74">:</span><span style="--0:#B392F0;--1:#5A676D"> </span><span style="--0:#FFAB70;--1:#256F74">"</span><span style="--0:#FFAB70;--1:#566D35">Jane</span><span style="--0:#FFAB70;--1:#256F74">"</span><span style="--0:#BBBBBB;--1:#256F74">,</span></div></div><div class="ec-line"><div class="code"><span class="indent"> </span><span style="--0:#F8F8F8;--1:#256F74">"</span><span style="--0:#F8F8F8;--1:#9039C9">family_name</span><span style="--0:#F8F8F8;--1:#256F74">"</span><span style="--0:#BBBBBB;--1:#256F74">:</span><span style="--0:#B392F0;--1:#5A676D"> </span><span style="--0:#FFAB70;--1:#256F74">"</span><span style="--0:#FFAB70;--1:#566D35">Doe</span><span style="--0:#FFAB70;--1:#256F74">"</span><span style="--0:#BBBBBB;--1:#256F74">,</span></div></div><div class="ec-line"><div class="code"><span class="indent"> </span><span style="--0:#F8F8F8;--1:#256F74">"</span><span style="--0:#F8F8F8;--1:#9039C9">email</span><span style="--0:#F8F8F8;--1:#256F74">"</span><span style="--0:#BBBBBB;--1:#256F74">:</span><span style="--0:#B392F0;--1:#5A676D"> </span><span style="--0:#FFAB70;--1:#256F74">"</span><span style="--0:#FFAB70;--1:#566D35">[email protected]</span><span style="--0:#FFAB70;--1:#256F74">"</span><span style="--0:#BBBBBB;--1:#256F74">,</span></div></div><div class="ec-line"><div class="code"><span class="indent"> </span><span style="--0:#F8F8F8;--1:#256F74">"</span><span style="--0:#F8F8F8;--1:#9039C9">picture</span><span style="--0:#F8F8F8;--1:#256F74">"</span><span style="--0:#BBBBBB;--1:#256F74">:</span><span style="--0:#B392F0;--1:#5A676D"> </span><span style="--0:#FFAB70;--1:#256F74">"</span><span style="--0:#FFAB70;--1:#566D35">https://gravatar.com/...</span><span style="--0:#FFAB70;--1:#256F74">"</span></div></div><div class="ec-line"><div class="code"><span style="--0:#B392F0;--1:#256F74">}</span></div></div></code></pre><div class="copy"><button title="Copy to clipboard" data-copied="Copied!" data-code="{� "sub": "kp_7a4b2c...",� "given_name": "Jane",� "family_name": "Doe",� "email": "[email protected]",� "picture": "https://gravatar.com/..."�}"><div></div></button></div></figure></div> 1507<aside aria-label="INFO" class="c-aside not-content p-6 rounded-lg flex flex-col md:flex-row gap-4 items-start c-aside--info astro-duqfclob"> <div class="note-header flex items-center astro-duqfclob"> <svg width="24" height="24" viewBox="0 0 24 24" class="astro-duqfclob" data-icon="info"> <use href="#ai:local:info"></use> </svg> </div> <div class="flex flex-col astro-duqfclob"> <div class="note-title text-base font-medium astro-duqfclob"> <div aria-hidden="true" class="astro-duqfclob"></div> </div> <div class="note-body astro-duqfclob"> <p>The fields returned depend on the scopes that were granted. <code dir="auto">email</code> and <code dir="auto">email_verified</code> require the <code dir="auto">email</code> scope. <code dir="auto">given_name</code>, <code dir="auto">family_name</code>, and <code dir="auto">picture</code> require the <code dir="auto">profile</code> scope.</p> </div> </div> </aside> </div> <section><aside class="c-article-feedback astro-6eb3m7cw" aria-labelledby="c-article-feedback__message"> <h2 class="astro-6eb3m7cw"> <span aria-live="polite" aria-atomic="true" id="c-article-feedback__message" class="js-article-feedback__message c-article-feedback__message astro-6eb3m7cw">Was this page helpful?</span> </h2> <div class="js-article-feedback__buttons-wrapper c-article-feedback__buttons-wrapper astro-6eb3m7cw"> <button class="js-article-feedback__button c-article-feedback__button plausible-event-name=Docs+positive+feedback plausible-event-url=/developer-tools/about/using-kinde-without-an-sdk/ astro-6eb3m7cw"> <span class="sr-only astro-6eb3m7cw">Yes</span> <svg width="24" height="24" viewBox="0 0 16 16" role="none" aria-hidden="true" class="astro-6eb3m7cw" data-icon="thumbs-up"> <path fill="none" stroke="#2B2B2B" stroke-linecap="round" stroke-linejoin="round" stroke-width="1.5" d="M4.667 14.667h-2a1.334 1.334 0 0 1-1.334-1.334V8.667a1.333 1.333 0 0 1 1.334-1.334h2M9.333 6V3.333a2 2 0 0 0-2-2l-2.666 6v7.334h7.52a1.33 1.33 0 0 0 1.333-1.134l.92-6A1.333 1.333 0 0 0 13.107 6z"/> </svg> </button> <button class="js-article-feedback__button c-article-feedback__button plausible-event-name=Docs+negative+feedback plausible-event-url=/developer-tools/about/using-kinde-without-an-sdk/ astro-6eb3m7cw"> <span class="sr-only astro-6eb3m7cw">No</span> <svg width="24" height="24" viewBox="0 0 16 16" role="none" aria-hidden="true" class="astro-6eb3m7cw" data-icon="thumbs-down"> <path fill="none" stroke="#2B2B2B" stroke-linecap="round" stroke-linejoin="round" stroke-width="1.5" d="M11.333 1.333h1.78a1.54 1.54 0 0 1 1.554 1.334v4.666a1.54 1.54 0 0 1-1.554 1.334h-1.78M6.667 10v2.667a2 2 0 0 0 2 2l2.666-6V1.333h-7.52A1.33 1.33 0 0 0 2.48 2.467l-.92 6A1.333 1.333 0 0 0 2.893 10z"/> </svg> </button> </div> </aside>
1507<script type="module">(()=>{const e=document.querySelector(".js-article-feedback__message"),t=document.querySelector(".js-article-feedback__buttons-wrapper");document.querySelectorAll(".js-article-feedback__button").forEach(c=>c.addEventListener("click",()=>{t.classList.add("hidden"),e.textContent="Thanks for your feedback!"}))})();</script>
1507<div class="c-docs-resources astro-2zkmu4eg"> <div class="astro-2zkmu4eg"> <h2 class="mb-4 text-2xl font-medium dark:text-white astro-2zkmu4eg">Related articles</h2> <ul class="c-docs-resources__related-articles astro-2zkmu4eg"> <li class="c-docs-resources__related-articles-list-item astro-2zkmu4eg"> <a class="absolute inset-0 flex h-full items-center no-underline transition duration-200 hover:no-underline hover:opacity-75 astro-2zkmu4eg" href="/developer-tools/about/our-sdks/"> <article class="c-docs-resources__related-article astro-2zkmu4eg"> <h3 class="text-base font-medium text-kinde-grey-900 dark:text-white astro-2zkmu4eg"> Kinde SDKs </h3> <p class="text-xs text-kinde-grey-600 dark:text-kinde-grey-300 astro-2zkmu4eg"> SDKs and APIs </p> </article> </a> </li><li class="c-docs-resources__related-articles-list-item astro-2zkmu4eg"> <a class="absolute inset-0 flex h-full items-center no-underline transition duration-200 hover:no-underline hover:opacity-75 astro-2zkmu4eg" href="/get-started/apis-and-sdks/about-kinde-apis/"> <article class="c-docs-resources__related-article astro-2zkmu4eg"> <h3 class="text-base font-medium text-kinde-grey-900 dark:text-white astro-2zkmu4eg"> About Kinde APIs </h3> <p class="text-xs text-kinde-grey-600 dark:text-kinde-grey-300 astro-2zkmu4eg"> Get started </p> </article> </a> </li><li class="c-docs-resources__related-articles-list-item astro-2zkmu4eg"> <a class="absolute inset-0 flex h-full items-center no-underline transition duration-200 hover:no-underline hover:opacity-75 astro-2zkmu4eg" href="/build/tokens/refresh-tokens/"> <article class="c-docs-resources__related-article astro-2zkmu4eg"> <h3 class="text-base font-medium text-kinde-grey-900 dark:text-white astro-2zkmu4eg"> Refresh tokens </h3> <p class="text-xs text-kinde-grey-600 dark:text-kinde-grey-300 astro-2zkmu4eg"> Build on Kinde </p> </article> </a> </li> </ul> </div> </div> </section><footer class="sl-flex astro-3yyafb3n"> <div class="meta sl-flex astro-3yyafb3n"> <a href="https://github.com/kinde-oss/documentation/edit/main/src/content/docs/developer-tools/about/using-kinde-without-an-sdk.mdx" class="sl-flex astro-eez2twj6"><svg aria-hidden="true" class="astro-eez2twj6 astro-c6vsoqas" width="16" height="16" viewBox="0 0 24 24" fill="currentColor" style="--sl-icon-size: 1.2em;"><path d="M22 7.24a1 1 0 0 0-.29-.71l-4.24-4.24a1 1 0 0 0-1.1-.22 1 1 0 0 0-.32.22l-2.83 2.83L2.29 16.05a1 1 0 0 0-.29.71V21a1 1 0 0 0 1 1h4.24a1 1 0 0 0 .76-.29l10.87-10.93L21.71 8c.1-.1.17-.2.22-.33a1 1 0 0 0 0-.24v-.14l.07-.05ZM6.83 20H4v-2.83l9.93-9.93 2.83 2.83L6.83 20ZM18.17 8.66l-2.83-2.83 1.42-1.41 2.82 2.82-1.41 1.42Z"/></svg> Edit page</a> </div> <div class="pagination-links astro-nv7agv4z" dir="ltr"> <a href="/developer-tools/about/our-sdks/" rel="prev" class="astro-nv7agv4z"> <span class="link-label astro-nv7agv4z">Previous</span> <span class="link-title-wrapper astro-nv7agv4z"> <svg width="24" height="24" class="dark:text-white astro-nv7agv4z" data-icon="arrow-left"> <symbol id="ai:local:arrow-left" viewBox="0 0 24 24"><g fill="currentColor" fill-rule="evenodd" clip-rule="evenodd"><path d="M10.53 5.47a.75.75 0 0 1 0 1.06L5.06 12l5.47 5.47a.75.75 0 1 1-1.06 1.06l-6-6a.75.75 0 0 1 0-1.06l6-6a.75.75 0 0 1 1.06 0"/><path d="M3.25 12a.75.75 0 0 1 .75-.75h16a.75.75 0 0 1 0 1.5H4a.75.75 0 0 1-.75-.75"/></g></symbol><use href="#ai:local:arrow-left"></use> </svg> <span class="link-title astro-nv7agv4z">Kinde SDKs</span> </span> </a> <a href="/developer-tools/sdks/frontend/javascript-sdk/" rel="next" class="astro-nv7agv4z"> <span class="link-label astro-nv7agv4z">Next</span> <span class="link-title-wrapper astro-nv7agv4z"> <span class="link-title astro-nv7agv4z">JavaScript SDK</span> <svg width="24" height="24" class="dark:text-white astro-nv7agv4z" data-icon="arrow-right"> <symbol id="ai:local:arrow-right" viewBox="0 0 24 24"><path fill="currentColor" fill-rule="evenodd" d="M14.53 5.47a.75.75 0 0 0-1.06 1.06l4.72 4.72H4a.75.75 0 0 0 0 1.5h14.19l-4.72 4.72a.75.75 0 1 0 1.06 1.06l5.995-5.994a.8.8 0 0 0 .13-.171l.01-.016a.75.75 0 0 0-.14-.885z" clip-rule="evenodd"/></symbol><use href="#ai:local:arrow-right"></use> </svg> </span> </a> </div> </footer> <section class="c-footer-cards not-content"> <h2 class="sr-only">Useful links</h2> <ul class="grid grid-cols-1 gap-6 p-0 md:grid-cols-2">
1507 <li class="flex flex-col gap-4 rounded-2xl p-12 bg-kinde-grey-50 dark:bg-kinde-grey-900"> <svg width="32" height="32" data-icon="team-four"> <symbol id="ai:local:team-four" viewBox="0 0 32 32"><path fill="currentColor" fill-rule="evenodd" d="M7.333 7.667a2.667 2.667 0 1 1 5.334 0 2.667 2.667 0 0 1-5.334 0M10 3a4.667 4.667 0 0 0-3.228 8.037 7.77 7.77 0 0 0-3.662 3.514 1 1 0 0 0 1.78.91A5.73 5.73 0 0 1 10 12.334a5.73 5.73 0 0 1 5.105 3.12.998.998 0 0 0 1.79 0A5.73 5.73 0 0 1 22 12.332c2.227 0 4.16 1.27 5.11 3.129a1 1 0 1 0 1.78-.91 7.77 7.77 0 0 0-3.662-3.515 4.667 4.667 0 1 0-6.455 0A7.8 7.8 0 0 0 16 13.187a7.8 7.8 0 0 0-2.772-2.15A4.667 4.667 0 0 0 10 3m0 14.667A2.667 2.667 0 1 0 10 23a2.667 2.667 0 0 0 0-5.333m-4.667 2.666a4.667 4.667 0 1 1 7.895 3.37A7.8 7.8 0 0 1 16 25.854a7.76 7.76 0 0 1 2.772-2.15 4.667 4.667 0 1 1 6.455 0 7.77 7.77 0 0 1 3.663 3.515 1 1 0 0 1-1.78.91A5.73 5.73 0 0 0 22 25a5.73 5.73 0 0 0-5.105 3.12.997.997 0 0 1-1.295.47 1 1 0 0 1-.495-.47A5.73 5.73 0 0 0 10 25a5.73 5.73 0 0 0-5.11 3.128 1 1 0 0 1-1.78-.91 7.77 7.77 0 0 1 3.662-3.514 4.65 4.65 0 0 1-1.439-3.37M22 5a2.667 2.667 0 1 0 0 5.333A2.667 2.667 0 0 0 22 5m0 12.667A2.667 2.667 0 1 0 22 23a2.667 2.667 0 0 0 0-5.333" clip-rule="evenodd"/></symbol><use href="#ai:local:team-four"></use> </svg> <h3 class="text-2xl font-medium leading-[1.33] tracking-[-0.02em]">Join the community</h3> <p class="text-kinde-grey-800 dark:text-white">Get support from the Kinde team and expert users in the Kinde community</p> <p class="mt-2 font-medium">Join via <a target='_blank' rel='noopener noreferrer' href='https://join.slack.com/t/thekindecommunity/shared_invite/zt-2k5i0aeet-d6Z_2qYphcNCpj0bFa4oCg'>Slack</a> or <a href='https://discord.gg/wHX6j7wG5d' target='_blank' rel='noopener noreferrer'>Discord</a></p> </li>
1507<li class="flex flex-col gap-4 rounded-2xl p-12 bg-kinde-grey-50 dark:bg-kinde-grey-900"> <svg width="32" height="32" data-icon="help-circle"> <symbol id="ai:local:help-circle" viewBox="0 0 33 32"><path fill="currentColor" fill-rule="evenodd" d="M16.667 5c-6.075 0-11 4.925-11 11s4.925 11 11 11 11-4.925 11-11-4.925-11-11-11m-13 11c0-7.18 5.82-13 13-13s13 5.82 13 13-5.82 13-13 13-13-5.82-13-13m13.019-5.667c-1.015 0-1.88.648-2.201 1.556a1 1 0 0 1-1.886-.667 4.335 4.335 0 0 1 8.42 1.445c0 1.911-1.474 2.877-2.52 3.47a1.57 1.57 0 0 0-.813 1.373V18a1 1 0 1 1-2 0v-.49a3.57 3.57 0 0 1 1.827-3.112c1.06-.601 1.506-1.056 1.506-1.731a2.333 2.333 0 0 0-2.333-2.334m-.02 13.334a1.5 1.5 0 1 0 0-3 1.5 1.5 0 0 0 0 3" clip-rule="evenodd"/></symbol><use href="#ai:local:help-circle"></use> </svg> <h3 class="text-2xl font-medium leading-[1.33] tracking-[-0.02em]">Contact support</h3> <p class="text-kinde-grey-800 dark:text-white">Chat to support through the Kinde help widget, or send a question via email</p> <p class="mt-2 font-medium"><a href='mailto:[email protected]' target='_blank' rel='noopener noreferrer'>Send an email</a></p> </li> </ul> </section><dialog class="c-image-zoom-dialog js-image-zoom-dialog fixed inset-0 m-0 h-full min-h-full min-w-full cursor-zoom-out bg-transparent p-0 astro-bttvf4pe"> <div class="c-image-zoom-dialog__wrapper flex h-full w-full flex-col items-center justify-center p-5 md:p-10 astro-bttvf4pe"> <header class="astro-bttvf4pe"> <button autofocus class="c-image-zoom-dialog__close-button js-image-zoom-dialog__close-button absolute right-5 top-5 z-10 rounded-xl border-none px-4 py-2 md:right-10 md:top-10 dark:bg-kinde-grey-900/75 astro-bttvf4pe">Close</button> </header> <div class="c-image-zoom-dialog__image-wrapper max-h-full max-w-[1440px] astro-bttvf4pe"> <img class="c-image-zoom-dialog__zoomed-image js-image-zoom-dialog__zoomed-image mx-auto max-h-full max-w-full origin-center scale-90 opacity-0 astro-bttvf4pe"> </div> </div> </dialog>
1507<script nonce="2726c7f26c">(function(){const contentSelector = ".sl-markdown-content"; 1508 1509 (() => { 1510 const parentSelector = document.querySelector(contentSelector); 1511 const zoomableImages = parentSelector.querySelectorAll("img"); 1512 const zoomDialog = document.querySelector(".js-image-zoom-dialog"); 1513 const zoomedImage = document.querySelector(".js-image-zoom-dialog__zoomed-image"); 1514 const closeButton = document.querySelector(".js-image-zoom-dialog__close-button"); 1515 1516 zoomableImages.forEach((img) => { 1517 if (img.parentNode.tagName === "PICTURE") return; 1518 1519 img.style.borderRadius = ".25rem"; 1520 1521 // Create 'button' to wrap the images 1522 const imageButton = document.createElement("button"); 1523 imageButton.setAttribute("aria-label", "Zoom in image"); 1524 imageButton.style.borderRadius = ".5rem"; 1525 imageButton.style.overflow = "hidden"; 1526 imageButton.style.cursor = "zoom-in"; 1527 imageButton.style.padding = ".75rem"; 1528 imageButton.classList.add("bg-kinde-grey-50", "dark:bg-kinde-grey-800"); 1529 1530 // imageButton.parentElement.style.padding = "1rem"; 1531 1532 imageButton.addEventListener("click", () => { 1533 zoomDialog.showModal(); 1534 zoomedImage.src = img.src; 1535 closeButton.focus(); 1536 }); 1537 1538 // Wrap image with the newly created 'button' 1539 const parent = img.parentNode; 1540 1541 parent?.insertBefore(imageButton, img); 1542 imageButton.appendChild(img); 1543 }); 1544 1545 // Add 2 ways of closing the dialog: by clicking the close button and the dialog itself. 1546 closeButton.addEventListener("click", () => { 1547 zoomDialog.close(); 1548 }); 1549 1550 zoomDialog.addEventListener("click", () => { 1551 zoomDialog.close(); 1552 }); 1553 1554 // When the dialog closes, reset the image src. 1555 zoomDialog.addEventListener("close", () => { 1556 zoomedImage.src = ""; 1557 }); 1558 })(); 1559})();</script>
1559<script type="module" src="/_astro/Inkeep.astro_astro_type_script_index_0_lang.B5uHjjfu.js"></script>
1559<script> 1560 // This will make sure the current page link in the right sidebar will be in view even when the navigation started via a search result link or a referrer other than the docs. It will also ensure that the main topic details element is open. 1561 const isReferredFromInternalLink = document.referrer.includes(window.location.origin); 1562 1563 if (!isReferredFromInternalLink) { 1564 const currentLinkMainTopicDetailsEl = document.querySelector( 1565 '#starlight__sidebar details:has(a[aria-current="page"])' 1566 ); 1567 const currentPageLink = document.querySelector('#starlight__sidebar a[aria-current="page"]'); 1568 1569 if (currentPageLink) { 1570 currentLinkMainTopicDetailsEl.setAttribute("open", "true"); 1571 currentPageLink.scrollIntoView({ 1572 behavior: "instant", 1573 block: "center" 1574 }); 1575 } 1576 } 1577</script>
1577<script> 1578 // This will ensure we don't loose utm tags when navigating between our sites and hs meetings 1579 const searchParams = new URLSearchParams(window.location.search); 1580 1581 // List of domains we want to transfer the utm tags to 1582 const domainsToDecorate = [ 1583 window.location.origin, 1584 "https://kinde.com", 1585 "https://app.kinde.com", 1586 "https://meetings.hubspot.com" 1587 ]; 1588 // We are specific about what tags we need to track. Any tags not included here will be ignored. 1589 const queryParams = ["utm_source", "utm_medium", "utm_campaign", "utm_term", "utm_content"]; 1590 1591 const appendQueryParams = (url, collectedQueryParams) => { 1592 const delimeter = url.indexOf("?") === -1 ? "?" : "&"; 1593 return url + delimeter + collectedQueryParams.join("&"); 1594 }; 1595 1596 // Collect all valid query params 1597 const collectedQueryParams = queryParams.reduce((collectedParams, paramName) => { 1598 const paramValue = searchParams.get(paramName); 1599 if (paramValue) { 1600 collectedParams.push(paramName + "=" + paramValue); 1601 } 1602 return collectedParams; 1603 }, []); 1604 1605 // If we have valid query params collected, then get all the links that include our domains to decorate 1606 if (collectedQueryParams.length) { 1607 const links = document.querySelectorAll("a"); 1608 1609 links.forEach((link) => { 1610 domainsToDecorate.forEach((domain) => { 1611 if (link.href.indexOf(domain) > -1 && link.href.indexOf("#") === -1) { 1612 link.href = appendQueryParams(link.href, collectedQueryParams); 1613 } 1614 }); 1615 }); 1616 } 1617</script>
1617 </div> </div> </main> </div> </div> </div> <div class="c-help-widget astro-um6wvnws"> <div id="c-help-widget__modal" hidden aria-hidden="true" class="c-help-widget__modal js-help-widget__modal astro-um6wvnws" tabindex="-1"> <div class="c-help-widget__modal-greeting astro-um6wvnws">Need a hand?</div> <div class="c-help-widget__modal-content-wrapper astro-um6wvnws"> <div class="c-help-widget__modal-suggestions-wrapper astro-um6wvnws"> <div class="c-help-widget__modal-search-wrapper astro-um6wvnws"> <button class="flex w-full items-center justify-start gap-2 rounded-lg border-[1px] border-kinde-grey-100 bg-transparent px-4 py-3 hover:cursor-pointer astro-um6wvnws" kui-trigger="search"> <svg width="20" height="20" viewBox="0 0 20 20" class="astro-um6wvnws" data-icon="search"> <use href="#ai:local:search"></use> </svg> <span class="text-kinde-grey-700 dark:text-white astro-um6wvnws">Search docs</span> </button> </div> </div> <div class="c-help-widget__modal-suggestions-wrapper astro-um6wvnws"> <div class="px-6 astro-um6wvnws"> <ul class="c-help-widget__modal-default-links-list list-none p-0 astro-um6wvnws"> <li class="c-help-widget__modal-default-links-list-item astro-um6wvnws"> <a class="text-sm font-medium text-kinde-grey-900 no-underline underline-offset-[0.3em] hover:underline dark:text-white astro-um6wvnws" href="/" target="_self"> Browse the docs </a> </li><li class="c-help-widget__modal-default-links-list-item astro-um6wvnws"> <a class="text-sm font-medium text-kinde-grey-900 no-underline underline-offset-[0.3em] hover:underline dark:text-white astro-um6wvnws" href="https://updates.kinde.com" target="_blank"> See whatâs new </a> </li><li class="c-help-widget__modal-default-links-list-item astro-um6wvnws"> <a class="text-sm font-medium text-kinde-grey-900 no-underline underline-offset-[0.3em] hover:underline dark:text-white astro-um6wvnws" href="https://kinde.com/guides/" target="_self"> View our guides </a> </li><li class="c-help-widget__modal-default-links-list-item astro-um6wvnws"> <a class="text-sm font-medium text-kinde-grey-900 no-underline underline-offset-[0.3em] hover:underline dark:text-white astro-um6wvnws" href="https://kinde.com/blog/" target="_self"> Read our blog </a> </li><li class="c-help-widget__modal-default-links-list-item astro-um6wvnws"> <a class="text-sm font-medium text-kinde-grey-900 no-underline underline-offset-[0.3em] hover:underline dark:text-white astro-um6wvnws" href="https://kinde-21631392.hs-sites.com/en-au/feature-request" target="_blank"> Request a feature </a> </li><li class="c-help-widget__modal-default-links-list-item astro-um6wvnws"> <a class="text-sm font-medium text-kinde-grey-900 no-underline underline-offset-[0.3em] hover:underline dark:text-white astro-um6wvnws" href="https://status.kinde.com/" target="_blank"> System status </a> </li> </ul> </div> </div> </div> <div class="c-help-widget__modal-ctas astro-um6wvnws"> <div class="astro-um6wvnws"> <div class="c-help-widget__modal-suggestions-title astro-um6wvnws">Join our communities</div> <div class="c-help-widget__modal-ctas-wrapper astro-um6wvnws"> <a href="https://discord.gg/wHX6j7wG5d" target="_blank" rel="noopener noreferrer" title="Join our Discord community" class="c-button c-button--secondary c-button--full-width c-button--is-icon-only c-button--align-center astro-vnzlvqnm"><svg width="20" height="20" class="invert-1 astro-vnzlvqnm" data-icon="discord"> <symbol id="ai:local:discord" viewBox="0 0 32 32"><path fill="#5865F2" d="M27.108 6.031A26.5 26.5 0 0 0 20.506 4a18 18 0 0 0-.846 1.72 24.6 24.6 0 0 0-7.327 0A18 18 0 0 0 11.488 4 26.7 26.7 0 0 0 4.88 6.036C.703 12.218-.43 18.246.136 24.188a26.6 26.6 0 0 0 8.097 4.065 19.6 19.6 0 0 0 1.735-2.796 17 17 0 0 1-2.731-1.304c.229-.166.453-.337.67-.503a19.02 19.02 0 0 0 16.188 0c.219.178.443.35.67.503-.873.515-1.788.952-2.736 1.306a19.4 19.4 0 0 0 1.734 2.794 26.5 26.5 0 0 0 8.102-4.062c.664-6.892-1.135-12.864-4.757-18.16M10.685 20.534c-1.578 0-2.882-1.433-2.882-3.194 0-1.762 1.258-3.207 2.877-3.207s2.912 1.445 2.884 3.207c-.027 1.761-1.27 3.194-2.88 3.194Zm10.631 0c-1.58 0-2.88-1.433-2.88-3.194 0-1.762 1.26-3.207 2.88-3.207 1.621 0 2.905 1.445 2.877 3.207s-1.268 3.194-2.877 3.194"/></symbol><use href="#ai:local:discord"></use> </svg><span class="c-button__inner astro-vnzlvqnm"> <span class="c-button__label sr-only astro-vnzlvqnm">Join the Kinde Discord community </span> </span> </a> <a href="https://join.slack.com/t/thekindecommunity/shared_invite/zt-2k5i0aeet-d6
1617Z_2qYphcNCpj0bFa4oCg" target="_blank" rel="noopener noreferrer" title="Join our Slack community" class="c-button c-button--secondary c-button--full-width c-button--is-icon-only c-button--align-center astro-vnzlvqnm"><svg width="20" height="20" class="invert-1 astro-vnzlvqnm" data-icon="slack"> <symbol id="ai:local:slack" viewBox="0 0 32 32"><path fill="#E01E5A" d="M7.908 19.7a2.94 2.94 0 0 1-2.943 2.943 2.94 2.94 0 0 1-2.943-2.942 2.94 2.94 0 0 1 2.943-2.943h2.943v2.943Zm1.471 0a2.94 2.94 0 0 1 2.943-2.942 2.94 2.94 0 0 1 2.942 2.943v7.356A2.94 2.94 0 0 1 12.322 30a2.94 2.94 0 0 1-2.943-2.943v-7.356Z"/><path fill="#36C5F0" d="M12.322 7.885a2.94 2.94 0 0 1-2.943-2.942A2.94 2.94 0 0 1 12.322 2a2.94 2.94 0 0 1 2.942 2.943v2.942zm0 1.494a2.94 2.94 0 0 1 2.942 2.943 2.94 2.94 0 0 1-2.942 2.942h-7.38A2.94 2.94 0 0 1 2 12.322a2.94 2.94 0 0 1 2.943-2.943z"/><path fill="#2EB67D" d="M24.115 12.322a2.94 2.94 0 0 1 2.942-2.943A2.94 2.94 0 0 1 30 12.322a2.94 2.94 0 0 1-2.943 2.942h-2.942zm-1.472 0a2.94 2.94 0 0 1-2.942 2.942 2.94 2.94 0 0 1-2.943-2.942v-7.38A2.94 2.94 0 0 1 19.701 2a2.94 2.94 0 0 1 2.942 2.943z"/><path fill="#ECB22E" d="M19.7 24.115a2.94 2.94 0 0 1 2.943 2.942A2.94 2.94 0 0 1 19.701 30a2.94 2.94 0 0 1-2.943-2.943v-2.942h2.943Zm0-1.472a2.94 2.94 0 0 1-2.942-2.942 2.94 2.94 0 0 1 2.943-2.943h7.379a2.94 2.94 0 0 1 2.942 2.943 2.94 2.94 0 0 1-2.942 2.942z"/></symbol><use href="#ai:local:slack"></use> </svg><span class="c-button__inner astro-vnzlvqnm"> <span class="c-button__label sr-only astro-vnzlvqnm">Join the Kinde Slack community </span> </span> </a> </div> </div> <a class="c-chat-launcher not-content items-center bg-kinde-grey-900 rounded-full bottom-5 text-white flex w-[60px] justify-center fixed right-5 z-[1] c-chat-launcher--help-widget astro-od7j23vk" kui-chat-launcher="true" href="https://chat.kinde.com" target="_blank" rel="noopener noreferrer"> <span class="c-chat-launcher--help-widget__inner-wrapper pointer-events-none inline-flex w-[274px] items-center justify-center astro-od7j23vk"> <div class="flex items-center gap-2 astro-od7j23vk"> <svg width="24" height="24" class="astro-od7j23vk" data-icon="kinde-talk-2"> <symbol id="ai:local:kinde-talk-2" viewBox="0 0 24 24"><path fill="#fff" fill-rule="evenodd" d="M4 3.75a.25.25 0 0 1 .25-.25h11.5a.25.25 0 0 1 .25.25v8a.25.25 0 0 1-.25.25h-4.5a.75.75 0 0 0-.53.22L7.5 15.44v-2.69a.75.75 0 0 0-.75-.75h-2.5a.25.25 0 0 1-.25-.25zM4.25 2A1.75 1.75 0 0 0 2.5 3.75v8c0 .966.784 1.75 1.75 1.75H6v3.75a.75.75 0 0 0 1.28.53l4.28-4.28h4.19a1.75 1.75 0 0 0 1.75-1.75v-8A1.75 1.75 0 0 0 15.75 2zm15.5 4a.75.75 0 0 0 0 1.5h1a.25.25 0 0 1 .25.25v8a.25.25 0 0 1-.25.25h-2.5a.75.75 0 0 0-.75.75v2.69l-3.22-3.22a.75.75 0 0 0-.53-.22H12.5a.75.75 0 0 0 0 1.5h.94l4.28 4.28a.75.75 0 0 0 1.28-.53V17.5h1.75a1.75 1.75 0 0 0 1.75-1.75v-8A1.75 1.75 0 0 0 20.75 6z" clip-rule="evenodd"/></symbol><use href="#ai:local:kinde-talk-2"></use> </svg> <span class="c-chat-launcher--help-widget__label font-medium text-white astro-od7j23vk"> 1618Chat with support now 1619</span> </div> </span> </a>
1619<script> 1620 const DOM = { 1621 trigger: document.querySelector('[kui-chat-launcher="true"]') 1622 }; 1623 const openChatPopup = (e) => { 1624 e.preventDefault(); 1625 let windowObjectReference; 1626 /* if the pointer to the window object in memory does not exist 1627 or if such pointer exists but the window was closed */ 1628 if (windowObjectReference == null || windowObjectReference.closed) { 1629 windowObjectReference = window.open( 1630 e.target, 1631 "kindeChatPopup", 1632 "width=350,height=600,status=1" 1633 ); 1634 /* then create it. The new window will be created and 1635 will be brought on top of any other window. */ 1636 } else { 1637 windowObjectReference.focus(); 1638 /* else the window reference must exist and the window 1639 is not closed; therefore, we can bring it back on top of any other 1640 window with the focus() method. There would be no need to re-create 1641 the window or to reload the referenced resource. */ 1642 } 1643 }; 1644 DOM.trigger.addEventListener("click", openChatPopup); 1645</script>
1645 </div> </div> <button aria-controls="c-help-widget__modal" aria-haspopup="true" aria-expanded="false" class="c-help-widget__button js-help-widget__button astro-um6wvnws" type="button"> <svg width="24" height="1em" viewBox="0 0 33 32" role="none" aria-hidden="true" class="astro-um6wvnws" data-icon="help-circle"> <use href="#ai:local:help-circle"></use> </svg> Help 1646</button> </div>
1646<script> 1647 (() => { 1648 const widgetButton = document.querySelector(".js-help-widget__button"); 1649 const widgetModal = document.querySelector(".js-help-widget__modal"); 1650 1651 const toggle = (e) => { 1652 e.stopPropagation(); 1653 1654 if (!e.target.closest(".is-active")) { 1655 widgetModal?.toggleAttribute("hidden"); 1656 widgetModal?.classList.toggle("is-active"); 1657 1658 const isModalHidden = widgetModal?.hasAttribute("hidden") ? "true" : "false"; 1659 const isButtonExpanded = isModalHidden === "true" ? "false" : "true"; 1660 1661 widgetModal?.setAttribute("aria-hidden", isModalHidden); 1662 widgetButton?.setAttribute("aria-expanded", isButtonExpanded); 1663 1664 // For setting focus to the modal when it is active to allow for keyboard navigation properly 1665 if (isModalHidden === "false") { 1666 widgetModal?.focus(); 1667 } 1668 1669 if (widgetModal?.contains(document.activeElement) === false) { 1670 } 1671 // For handling clicking outside 1672 widgetModal?.classList.contains("is-active") 1673 ? document.addEventListener("click", toggle) 1674 : document.removeEventListener("click", toggle); 1675 } 1676 }; 1677 1678 // Manage closing modal on 'ESC' and returning focus to button 1679 document.addEventListener("keydown", function (e) { 1680 const closeHelpWidgetModal = () => { 1681 widgetModal?.classList.remove("is-active"); 1682 widgetModal?.setAttribute("hidden", "true"); 1683 widgetModal?.setAttribute("aria-hidden", "true"); 1684 widgetButton?.setAttribute("aria-expanded", "false"); 1685 document.removeEventListener("click", toggle); 1686 widgetButton?.focus(); 1687 }; 1688 1689 if (e.key === "Escape" && widgetModal?.classList.contains("is-active")) { 1690 closeHelpWidgetModal(); 1691 } 1692 }); 1693 1694 widgetButton?.addEventListener("click", toggle); 1695 })(); 1696</script>
1696 </div> </body></html>
Line numbers count LF bytes from the start of the resource, as the search results do. Vendor segments are library code the classifier recognised; they are stored but not indexed. Bytes are shown as Latin1 characters, one per byte.