Set up user authentication to control access to pages and API references using password, OAuth, JWT, or Mintlify-managed private access.
Listen to this pageabout 12 min
Private authentication for your Mintlify organization is available on all plans.Password authentication requires a Pro or Enterprise plan.OAuth and JWT authentication require an Enterprise plan.
Authentication requires users to sign in before accessing your content.You can configure full authentication for all pages or partial authentication where some pages are public and others require authentication.Authentication is only available for sites hosted on a custom domain or Mintlify subdomain. For example, docs.example.com or example.mintlify.site. Authentication is not supported for sites with a custom subpath. For example, example.com/docs.To identify visitors while keeping pages public, use personalization. Personalization supports custom subpaths and can prefill API playground inputs without requiring visitors to authenticate before viewing a page.
Password authentication provides access control only and does not support user-specific features like group-based access control or API playground prefilling.
You host your documentation at docs.foo.com and you need basic access control without tracking individual users. You want to prevent public access while keeping setup simple.Create a strong password in your dashboard. Share credentials with authorized users.
After you save, your site redeploys. When it finishes deploying, anyone who visits your site must sign in to your Mintlify organization to access your content.
You host your documentation at docs.foo.com and your entire team has access to your dashboard. You want to restrict access to team members only.Enable private authentication in your dashboard settings.Verify team access by checking that all team members are active in your organization.
Scopes (optional): Permissions to request. Copy the entire scope string (for example, for a scope like provider.users.docs, copy the complete provider.users.docs). Use multiple scopes if you need different access levels.
Additional authorization parameters (optional): Additional query parameters to add to the initial authorization request.
Token URL: Your OAuth token exchange endpoint.
Info API URL (optional): Endpoint on your server that Mintlify calls to retrieve user info. Use this field for group-based access control. If omitted, the OAuth flow only verifies identity.
Logout URL (optional): The native logout URL for your OAuth provider. When users log out, Mintlify validates the logout redirect against this configured URL for security. The redirect only succeeds if it exactly matches the configured logoutUrl. If you do not configure a logout URL, users redirect to /login. Mintlify redirects users with a GET request and does not append query parameters. Include any parameters (for example, returnTo) directly in the URL.
Click Save.
After you configure your OAuth settings, your site redeploys. When it finishes deploying, anyone who visits your site must sign in to your OAuth provider to access your content.
Add the redirect URL as an authorized redirect URL for your OAuth server.
3
Create your user info endpoint for group access (optional).
To enable group-based access control, create an API endpoint that:
Responds to GET requests.
Accepts an Authorization: Bearer <access_token> header for authentication.
Returns user data in the User format. See User data format for more information.
Mintlify calls this endpoint with the OAuth access token to retrieve user information. No additional query parameters are sent.Add this endpoint URL to the Info API URL field in your Access settings.
If your identity provider includes group membership in the ID token or access token, you can use those claims instead of an Info API URL. This option is available for OAuth configurations that use a client secret.When configuring OAuth token claims for your project, use values such as:
source: Selects id_token or access_token. If you select id_token, include the openid scope in your OAuth scopes.
groupsClaim: Identifies the token claim that contains groups. Defaults to groups.
groupsDelimiter: An optional delimiter from 1 to 4 characters. Mintlify uses it only to split string claim values. If the delimiter can be part of a group name, omit groupsDelimiter.
For example, with "groups": "general,client" and groupsDelimiter set to ",", Mintlify uses general and client as separate groups.Mintlify trims whitespace around each group and ignores empty segments. Without groupsDelimiter, the complete string is a single group. Array claims are always one group per string item and are not split.
You host your documentation at docs.foo.com and you have an existing OAuth server at auth.foo.com that supports the Authorization Code Flow.Configure your OAuth server details in your dashboard:
Control session length with the expiresAt field in your user info response. This is a Unix timestamp (seconds since epoch) indicating when the session should expire. See User data format for more details.
Configure your OAuth server to allow redirects to your callback URL.
To offer more than one login flow, click Add login URL and enter a display name and URL for each option. You can configure up to 10 login URLs.
Click Save.
Click Generate new key.
Store your key securely where your backend can access it.
After you generate a private key, your site redeploys. When it finishes deploying, anyone who visits your site must sign in to your JWT authentication system to access your content.
2
Integrate Mintlify authentication into your login flow.
Modify your existing login flow to include these steps after user authentication:
Create a JWT containing the authenticated user’s info in the User format. See User data format for more information.
Sign the JWT with your secret key, using the EdDSA algorithm.
Create a redirect URL back to the /login/jwt-callback path of your docs, including the JWT as the hash.
When JWT authentication has one login URL, unauthenticated visitors redirect to it automatically. With two or more named login URLs, visitors first see a selection page and then continue to the selected login flow. Mintlify forwards the validated redirect parameter so the visitor returns to the documentation page they originally requested.
Multiple login URLs are available for full and partial JWT authentication. JWT personalization accepts one login URL because it identifies visitors without requiring a login before they can view public content.
You host your documentation at docs.foo.com with an existing authentication system at foo.com. You want to extend your login flow to grant access to the docs while keeping your docs separate from your dashboard (or you don’t have a dashboard).Create a login endpoint at https://foo.com/docs-login that extends your existing authentication.After verifying user credentials:
Generate a JWT with user data in Mintlify’s format.
Sign the JWT and redirect to https://docs.foo.com/login/jwt-callback#{SIGNED_JWT}.
import * as jose from 'jose';import { Request, Response } from 'express';const TWO_WEEKS_IN_MS = 1000 * 60 * 60 * 24 * 7 * 2;const DOCS_HOST = 'docs.example.com';const signingKey = await jose.importPKCS8(process.env.MINTLIFY_PRIVATE_KEY, 'EdDSA');export async function handleRequest(req: Request, res: Response) { const user = { host: DOCS_HOST, // Must match your docs URL expiresAt: Math.floor((Date.now() + TWO_WEEKS_IN_MS) / 1000), // 2 week session expiration groups: res.locals.user.groups, apiPlaygroundInputs: { header: { "Authorization": `Bearer ${res.locals.user.apiKey}`, }, }, }; const jwt = await new jose.SignJWT(user) .setProtectedHeader({ alg: 'EdDSA' }) .setExpirationTime('10 s') // 10 second JWT expiration .sign(signingKey); return res.redirect(`https://${DOCS_HOST}/login/jwt-callback#${jwt}`);}
When using authentication, all pages require authentication to access by default. You can make specific pages viewable without authentication at the page or group level with the public property.
When you use OAuth or JWT authentication, you can restrict specific pages to certain user groups. This is useful when you want different users to see different content based on their role or attributes.Manage groups through user data passed during authentication. See User data format for details.
Specify which groups can access specific pages using the groups property in frontmatter.
Example page restricted to the admin group
---title: "Admin dashboard"groups: ["admin"]---
Users must belong to at least one of the listed groups to access the page. If a user tries to access a page without the required group, they’ll receive a 404 error.
When using OAuth or JWT authentication or standalone personalization, your system returns user data that controls session length, group membership, and content personalization.
Required for JWT authentication. The hostname of your documentation site. The string must exactly match the domain where you deploy your documentation. Mintlify validates that the JWT’s host matches the requesting host to prevent token reuse across different sites.
Session expiration time in seconds since epoch. When the current time passes this value, Mintlify expires the stored user data. The visitor must authenticate again or repeat the identification flow to refresh it.
For JWT: This differs from the JWT’s exp claim, which determines when a JWT is considered invalid. Set the JWT exp claim to a short duration (10 seconds or less) for security. Use expiresAt for the actual session length (hours to weeks).
List of groups the user belongs to. With authentication, pages with matching groups in their frontmatter are accessible to this user. With standalone personalization, groups control page and content visibility but do not restrict access to a page’s direct URL.Example: A user with groups: ["admin", "engineering"] matches content tagged with either the admin or engineering groups.
Prefills API playground fields with user-specific values. When a user authenticates, these values populate the corresponding input fields in the API playground. Users can override prefilled values, and their overrides persist in local storage.Mintlify applies only values that match the current endpoint’s security scheme.
{"docsConfig":{"theme":"luma","$schema":"https://mintlify.com/docs.json","name":"Mintlify","description":"Mintlify is a platform for building and hosting documentation websites. It provides a set of tools and services for maintaining documentation and making it accessible to AI agents.","colors":{"primary":"#166E3F","light":"#26BD6C","dark":"#166E3F"},"logo":{"light":"https://mintcdn.com/mintlify/ZmWpbGQa5yv5AElR/logo/light.svg?fit=max\u0026auto=format\u0026n=ZmWpbGQa5yv5AElR\u0026q=85\u0026s=094e41f7b58b2cab0a6faa2bab2828e0","dark":"https://mintcdn.com/mintlify/ZmWpbGQa5yv5AElR/logo/dark.svg?fit=max\u0026auto=format\u0026n=ZmWpbGQa5yv5AElR\u0026q=85\u0026s=a7088b08f6fc6783eb007b3de67d4c39","href":"https://mintlify.com/docs"},"favicon":{"light":"https://mintcdn.com/mintlify/HKyBg3pjnkyq1if1/favicon.ico?fit=max\u0026auto=format\u0026n=HKyBg3pjnkyq1if1\u0026q=85\u0026s=6f16cb0842f8e4b4ba8a05671aa661f9","dark":"https://mintcdn.com/mintlify/HKyBg3pjnkyq1if1/favicon.ico?fit=max\u0026auto=format\u0026n=HKyBg3pjnkyq1if1\u0026q=85\u0026s=6f16cb0842f8e4b4ba8a05671aa661f9"},"api":{"mdx":{"auth":{"method":"bearer"}}},"navbar":{"links":[{"href":"https://mintlify.com/contact/sales","label":"Talk to us"}],"primary":{"type":"button","label":"Get started","href":"https://mintlify.com/start"}},"footer":{"socials":{"x":"https://x.com/mintlify","linkedin":"https://www.linkedin.com/company/mintlify","github":"https://github.com/mintlify"},"links":[{"header":"Explore","items":[{"label":"Startups","href":"https://www.mintlify.com/startups"},{"label":"Enterprise","href":"https://www.mintlify.com/enterprise"},{"label":"OSS program","href":"https://www.mintlify.com/oss-program"},{"label":"Switch","href":"https://www.mintlify.com/switch"}]},{"header":"Resources","items":[{"label":"Customers","href":"https://mintlify.com/customers"},{"label":"Blog","href":"https://mintlify.com/blog"},{"label":"Pricing","href":"https://www.mintlify.com/pricing"},{"label":"Roadmap","href":"https://mintlify.com/roadmap"},{"label":"Contact support","href":"https://www.mintlify.com/docs/contact-support"},{"label":"Feature requests","href":"https://github.com/orgs/mintlify/discussions/categories/feature-requests"},{"label":"Status","href":"https://www.mintlify.com/docs/status"}]},{"header":"Company","items":[{"label":"Careers","href":"https://mintlify.com/careers"},{"label":"Wall of love","href":"https://www.mintlify.com/wall-of-love"}]},{"header":"Legal","items":[{"label":"Privacy policy","href":"https://mintlify.com/legal/privacy"},{"label":"Terms of Service","href":"https://mintlify.com/legal/terms"},{"label":"Security","href":"https://security.mintlify.com/?_gl=1*ascm4x*_gcl_au*NTU1ODkzNjQ0LjE3NTQ5Mjg4NzIuMTgzMDQ5NTExMS4xNzU3NTQwMDk1LjE3NTc1NDAwOTQ."}]}]},"seo":{"metatags":{"canonical":"https://www.mintlify.com/docs","google-site-verification":"YRuJgIxsRnMkiRTYTo_tEsJSFyIE3AraEiukTbeV4Ag","og:locale":"en_US","twitter:site":"@mintlify"}},"icons":{"library":"lucide"},"integrations":{"ga4":{"measurementId":"G-RCYWHL7EQ7"},"posthog":{"apiKey":"phc_eNuN6Ojnk9O7uWfC17z12AK85fNR0BY6IiGVy0Gfwzw"}},"contextual":{"options":["copy","download-spec","chatgpt","claude","add-mcp","cursor","vscode"],"display":"header"},"thumbnails":{"background":"https://mintcdn.com/mintlify/1C69LFnpEoJWo8v_/images/thumbnail/background.svg?fit=max\u0026auto=format\u0026n=1C69LFnpEoJWo8v_\u0026q=85\u0026s=7d512e195072d81cd711997430fc3034"},"interaction":{"drilldown":false},"styling":{"latex":true},"navigation":{"languages":[{"language":"en","href":""},{"language":"fr","href":"fr"},{"language":"es","href":"es"},{"language":"zh","href":"zh"}]}},"deployment":{"deploymentMetadataValue":{"subdomain":"mintlify","hasAudioNarration":true,"actualSubdomain":"mintlify","customDomains":["www.mintlify.com","mintlify.com"],"gitSource":{"type":"github","owner":"mintlify","repo":"docs","deployBranch":"main","contentDirectory":"","isPrivate":false,"mountPath":"","label":""},"chroma":{"liveDeploymentHistoryId":"6abafb36a3593986621b26cb","collectionId":"f6a36cbe-9c6e-4d20-9d79-8697ac2b1c98","schemaVersion":"v3","latestBuiltDeploymentHistoryId":"6abafb36a3593986621b26cb"},"feedback":{"thumbs":true,"edits":false,"issues":false,"contextualFeedback":{"allowEmail":false},"agentFeedback":true},"entitlements":{"AI_CHAT":{"status":"ENABLED"},"REMOVE_BRANDING":{"status":"DISABLED"},"CONTEXTUAL_FEEDBACK":{"status":"ENABLED"},"CODE_SNIPPET_FEEDBACK":{"status":"ENABLED","enabled":"ENABLED"},"WEB_MCP":{"status":"ENABLED"},"NARRATION":{"status":"ENABLED"}},"buildId":"6abafb36a3593986621b26cb","clientVersion":"0.0.3708","searchFilterCounts":[{"language":"en","tag":"Documentation","count":168},{"language":"es","tag":"Documentación","count":168},{"language":"fr","tag":"Documentation","count":168},{"language":"zh","tag":"文档","count":168},{"language":"en","tag":"Manage your site","count":48},{"language":"es","tag":"Administra tu sitio","count":48},{"language":"fr","tag":"Gérer votre site","count":48},{"language":"zh","tag":"管理站点","count":48},{"language":"en","tag":"Create content","count":47},{"language":"es","tag":"Crear contenido","count":47},{"language":"fr","tag":"Créer du contenu","count":47},{"language":"zh","tag":"创建内容","count":47},{"language":"en","tag":"Help center","count":46},{"language":"es","tag":"Centro de ayuda","count":42},{"language":"fr","tag":"Centre d'aide","count":42},{"language":"zh","tag":"帮助中心","count":42},{"language":"en","tag":"Analytics","count":32},{"language":"en","tag":"Learn","count":31},{"language":"en","tag":"Guides","count":31},{"language":"es","tag":"Aprender","count":31},{"language":"es","tag":"Guías","count":31},{"language":"fr","tag":"Apprendre","count":31},{"language":"fr","tag":"Guides","count":31},{"language":"zh","tag":"学习","count":31},{"language":"zh","tag":"指南","count":31},{"language":"en","tag":"Components","count":28},{"language":"es","tag":"Componentes","count":28},{"language":"fr","tag":"Composants","count":28},{"language":"zh","tag":"组件","count":28},{"language":"en","tag":"API reference","count":27},{"language":"es","tag":"Referencia de la API","count":27},{"language":"fr","tag":"Référence de l’API","count":27},{"language":"zh","tag":"API 参考文档","count":26},{"language":"es","tag":"Analytics","count":24},{"language":"fr","tag":"Analytics","count":24},{"language":"en","tag":"Integrations","count":20},{"language":"es","tag":"Integraciones","count":20},{"language":"fr","tag":"Intégrations","count":20},{"language":"zh","tag":"集成","count":20},{"language":"zh","tag":"Analytics","count":16}],"searchSettings":{"maxResults":11,"isFiltersEnabled":false,"showContentSnippets":false}},"assistantConfig":{"enableAskAiButton":false,"enableStarterQuestions":true,"enableContextualStarterQuestions":false,"enableAskAiSearchBar":true,"deflection":{"enabled":false,"type":"link","email":"support@mintlify.com"}},"hasChatPermissions":true,"hasWebMcpPermissions":true,"toggles":[{"name":"assistant-autopilot-suggestions","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"dashboard-editor-theseus","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"LinearAgent","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"kill-isr","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"assistant-bash","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"assistant-captcha-server","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"related-pages","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"assistant-captcha-client","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"use-workflow","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"selectively-prewarm","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"agent-mintlify-slack","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"editor-v7-file-tree","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"agent-integrations-settings","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"mcp-feedback-tool","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"automations-pr-grouping","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"custom-prefix","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"analytics-v7","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"composio-triggers","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"user-flows-analytics","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"no-publish-flow","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"llms-txt-v2","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"pause-universal-search-reconcile","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"snapshot-serving-live","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"editor-private-pages","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"github-push-net-diff","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"stripTemperatureMiddleware","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"per-site-search-delta","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"support-platform-pylon-zendesk","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"editor-branches-v2-autocommit","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"editor-branches-v2","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"slash-docs-auth","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"snapshot-serving","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"instant-rollback","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"granular-notifications-server","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"granular-notifications","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"editor-private-page-search","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"automations-fable","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"fixed-ai-action-pricing","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"automation-resolve-merge-conflict","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"scoped-publishing","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"mintql","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"page-level-analytics","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"teamspace","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"editor-page-mentions","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"byok-sep-25","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"vite-origin","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"assistant-v5","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false}],"starterQuestions":[{"_id":"68e7dee07dc8f0c555b3c34b","deploymentId":"62de06d6290794c75c20155e","questionText":"What is the contextual menu?","status":"active","generatedBy":"manual","createdAt":"2025-10-09T16:12:16.120Z","updatedAt":"2025-10-09T16:12:16.120Z","__v":0}],"privacy":{"consentBanner":{"categories":["necessary","measurement","marketing"],"enabled":true}},"isAtlas":false},"customCss":[{"filePath":"fonts.css","content":"@import url(https://fonts.googleapis.com/css2?family=Inter:ital,opsz,wght@0,14..32,100..900;1,14..32,100..900\u0026display=swap);:root{--font-inter:\"Inter\", -apple-system, BlinkMacSystemFont, \"Segoe UI\", \"Roboto\",\n \"Oxygen\", \"Ubuntu\", \"Cantarell\", \"Fira Sans\", \"Droid Sans\", \"Helvetica Neue\",\n sans-serif}body{font-feature-settings:normal;font-variant-numeric:normal;font-variant-ligatures:normal}.font-inter,body{font-family:var(--font-inter)}.italic,em,i{font-style:italic;font-synthesis:none}div,h1,h2,h3,h4,h5,h6,p,span{font-feature-settings:\"ss01\" 0,\"ss02\" 0,\"ss03\" 0;font-variant-alternates:normal}"},{"filePath":"playground.css","content":"@keyframes assistant-playground-spin{to{transform:rotate(360deg)}}html[data-current-path$=\"/assistant/widget\"] [data-assistant-playground-layout]{--assistant-playground-frame:#f8f8f8;--assistant-playground-surface:#fcfcfc;--assistant-playground-text-strong:#171717;--assistant-playground-text-default:#6f6f6f;--assistant-playground-text-weak:#8f8f8f;--assistant-playground-stroke:rgba(0, 0, 0, 0.07);--assistant-playground-switch:#147d6f;width:min(100%,720px);margin:1.5rem auto;font-family:var(--font-inter),Inter,ui-sans-serif,system-ui,sans-serif}html.dark[data-current-path$=\"/assistant/widget\"] [data-assistant-playground-layout]{--assistant-playground-frame:#1c1c1c;--assistant-playground-surface:#242424;--assistant-playground-text-strong:#f5f5f5;--assistant-playground-text-default:#b8b8b8;--assistant-playground-text-weak:#8f8f8f;--assistant-playground-stroke:rgba(255, 255, 255, 0.12)}html[data-current-path$=\"/assistant/widget\"] .assistant-playground-frame{position:relative;height:720px;overflow:hidden;border-radius:8px;background:var(--assistant-playground-frame);box-shadow:0 0 0 1px var(--assistant-playground-stroke)}html[data-current-path$=\"/assistant/widget\"] .assistant-playground-toolbar{position:absolute;z-index:4;top:10px;left:10px;display:flex;align-items:center;gap:8px}html[data-current-path$=\"/assistant/widget\"] .assistant-playground-toolbar__button{display:inline-flex;height:28px;align-items:center;justify-content:center;overflow:hidden;border:0;border-radius:6px;background:var(--assistant-playground-surface);color:var(--assistant-playground-text-strong);box-shadow:0 4px 2px rgba(0,0,0,.04),0 1px 1px rgba(0,0,0,.08),0 1px 1px rgba(0,0,0,.04),0 0 0 1px var(--assistant-playground-stroke);cursor:pointer}html[data-current-path$=\"/assistant/widget\"] .assistant-playground-toolbar__button:hover{background:color-mix(in srgb,var(--assistant-playground-surface),var(--assistant-playground-text-strong) 4%)}html[data-current-path$=\"/assistant/widget\"] .assistant-playground-accent[data-keyboard-focus=true],html[data-current-path$=\"/assistant/widget\"] .assistant-playground-code__tabs button:focus-visible,html[data-current-path$=\"/assistant/widget\"] .assistant-playground-field__control:focus-visible,html[data-current-path$=\"/assistant/widget\"] .assistant-playground-switch:has(.assistant-playground-switch__input:focus-visible),html[data-current-path$=\"/assistant/widget\"] .assistant-playground-toolbar__button:focus-visible{outline:2px solid #006adc;outline-offset:2px}html[data-current-path$=\"/assistant/widget\"] .assistant-playground-toolbar__button--labeled{gap:2px;padding:4px 8px;font-size:13px;font-weight:500;line-height:20px;letter-spacing:-.013px}html[data-current-path$=\"/assistant/widget\"] .assistant-playground-toolbar__button--labeled>span{padding-inline:4px}html[data-current-path$=\"/assistant/widget\"] .assistant-playground-toolbar__button--icon{width:28px;padding:6px}html[data-current-path$=\"/assistant/widget\"] .assistant-playground-toolbar__button svg{width:16px;height:16px;color:var(--assistant-playground-text-default);opacity:1}html[data-current-path$=\"/assistant/widget\"] .theme-icon__fill-wrap,html[data-current-path$=\"/assistant/widget\"] .theme-icon__ring-wrap{transform-origin:0 0;transition-property:transform;transition-duration:.5s;transition-timing-function:cubic-bezier(.45,.05,.25,1)}html[data-current-path$=\"/assistant/widget\"] .theme-icon--dark .theme-icon__ring-wrap{transform:rotate(180deg)}html[data-current-path$=\"/assistant/widget\"] .theme-icon--dark .theme-icon__fill-wrap{transform:scaleX(-1)}html[data-current-path$=\"/assistant/widget\"] .assistant-playground-preview{position:absolute;inset:0;width:100%;height:100%}html[data-current-path$=\"/assistant/widget\"] .assistant-playground-preview>div:has(>iframe[title=\"Live Assistant Widget preview\"]){width:100%;height:100%}html[data-current-path$=\"/assistant/widget\"] .assistant-playground-preview iframe[title=\"Live Assistant Widget preview\"]{display:block;width:100%;height:100%!important;aspect-ratio:auto!important;border:0;background:var(--assistant-playground-frame);color-scheme:light dark}html.dark[data-current-path$=\"/assistant/widget\"] .assistant-playground-preview iframe[title=\"Live Assistant Widget preview\"]{color-scheme:dark}html[data-current-path$=\"/assistant/widget\"] .assistant-playground-preview__status{position:absolute;inset:0;z-index:2;display:flex;align-items:center;justify-content:center;gap:8px;padding:20px;color:var(--assistant-playground-text-default);font-size:12px;line-height:18px;text-align:center;pointer-events:none}html[data-current-path$=\"/assistant/widget\"] .assistant-playground-preview__spinner{width:16px;height:16px;flex:0 0 auto;border:1.5px solid #d4d4d4;border-top-color:var(--assistant-playground-text-default);border-radius:50%;animation:assistant-playground-spin 700ms linear infinite}@media (prefers-reduced-motion:reduce){html[data-current-path$=\"/assistant/widget\"] .assistant-playground-frame{transition:none}html[data-current-path$=\"/assistant/widget\"] .assistant-playground-preview__spinner{animation:none}html[data-current-path$=\"/assistant/widget\"] .theme-icon__fill-wrap,html[data-current-path$=\"/assistant/widget\"] .theme-icon__ring-wrap{transition:none}}html[data-current-path$=\"/assistant/widget\"] .assistant-playground-customizer{position:absolute;z-index:3;top:50px;left:10px;width:min(307px,calc(100% - 20px));overflow:visible;padding:6px;border-radius:6px;background:var(--assistant-playground-surface);color:var(--assistant-playground-text-strong);box-shadow:0 4px 2px rgba(0,0,0,.04),0 1px 1px rgba(0,0,0,.08),0 1px 1px rgba(0,0,0,.04),0 0 0 1px var(--assistant-playground-stroke)}html[data-current-path$=\"/assistant/widget\"] .assistant-playground-customizer[hidden]{display:none}html[data-current-path$=\"/assistant/widget\"] .assistant-playground-customizer__section{display:flex;flex-direction:column;gap:1px}html[data-current-path$=\"/assistant/widget\"] .assistant-playground-customizer__heading{display:flex;min-height:28px;align-items:center;padding:4px 8px;color:var(--assistant-playground-text-weak);font-size:13px;font-weight:400;line-height:20px;letter-spacing:-.013px}html[data-current-path$=\"/assistant/widget\"] .assistant-playground-field{display:flex;min-height:40px;align-items:center;gap:20px;padding:6px 8px;font-size:14px;font-weight:400;line-height:20px;letter-spacing:-.014px}html[data-current-path$=\"/assistant/widget\"] .assistant-playground-field__label{width:91px;flex:0 0 91px;color:var(--assistant-playground-text-strong)}html[data-current-path$=\"/assistant/widget\"] .assistant-playground-accent,html[data-current-path$=\"/assistant/widget\"] .assistant-playground-select{width:168px;min-width:0;flex:1 1 auto}html[data-current-path$=\"/assistant/widget\"] .assistant-playground-accent,html[data-current-path$=\"/assistant/widget\"] .assistant-playground-field__control{height:28px;border:0;border-radius:6px;background:var(--assistant-playground-surface);color:var(--assistant-playground-text-default);box-shadow:0 1px 1px rgba(0,0,0,.1),0 0 0 1px var(--assistant-playground-stroke);font:inherit}html[data-current-path$=\"/assistant/widget\"] .assistant-playground-select{position:relative}html[data-current-path$=\"/assistant/widget\"] .assistant-playground-select[data-open=true]{z-index:6}html[data-current-path$=\"/assistant/widget\"] .assistant-playground-field__control,html[data-current-path$=\"/assistant/widget\"] .assistant-playground-select__options button{display:flex;width:100%;align-items:center;justify-content:space-between;gap:8px;padding:4px 9px;text-align:left;cursor:pointer}html[data-current-path$=\"/assistant/widget\"] .assistant-playground-select__chevron{display:block;width:16px;height:16px;flex:0 0 16px;color:var(--assistant-playground-text-default);opacity:1}html[data-current-path$=\"/assistant/widget\"] .assistant-playground-select__end{display:flex;align-items:center;gap:6px}html[data-current-path$=\"/assistant/widget\"] .assistant-playground-select__detail{color:var(--assistant-playground-text-weak);font-size:12px;font-variant-numeric:tabular-nums;line-height:16px;white-space:nowrap}html[data-current-path$=\"/assistant/widget\"] .assistant-playground-select__options{position:absolute;z-index:7;top:calc(100% + 4px);left:0;display:flex;width:100%;flex-direction:column;gap:1px;padding:3px;border-radius:6px;background:var(--assistant-playground-surface);box-shadow:0 8px 24px rgba(0,0,0,.12),0 1px 2px rgba(0,0,0,.08),0 0 0 1px var(--assistant-playground-stroke)}html[data-current-path$=\"/assistant/widget\"] .assistant-playground-select__options button{min-height:28px;gap:12px;padding:4px 7px;border:0;border-radius:4px;background:0 0;color:var(--assistant-playground-text-default);font:inherit}html[data-current-path$=\"/assistant/widget\"] .assistant-playground-select__options button:hover,html[data-current-path$=\"/assistant/widget\"] .assistant-playground-select__options button[data-active=true]{background:color-mix(in srgb,var(--assistant-playground-surface),var(--assistant-playground-text-strong) 6%);color:var(--assistant-playground-text-strong)}html[data-current-path$=\"/assistant/widget\"] .assistant-playground-accent{position:relative;display:flex;align-items:center;gap:6px;padding:4px 8px}html[data-current-path$=\"/assistant/widget\"] .assistant-playground-accent__input{position:absolute;inset:0;width:100%;height:100%;cursor:pointer;opacity:0}html[data-current-path$=\"/assistant/widget\"] .assistant-playground-accent__swatch{width:14px;height:14px;flex:0 0 14px;border-radius:2px;box-shadow:0 0 0 1px var(--assistant-playground-surface),0 0 0 2px rgba(0,0,0,.1)}html[data-current-path$=\"/assistant/widget\"] .assistant-playground-customizer__divider{display:flex;height:12px;align-items:center;margin-inline:-6px;color:var(--assistant-playground-stroke)}html[data-current-path$=\"/assistant/widget\"] .assistant-playground-customizer__divider svg{display:block;width:100%;height:1px;flex:0 0 auto;overflow:visible}html[data-current-path$=\"/assistant/widget\"] .assistant-playground-hook{display:flex;min-height:74px;align-items:flex-start;gap:28px;padding:6px 8px;cursor:pointer}html[data-current-path$=\"/assistant/widget\"] .assistant-playground-hook__copy{display:flex;min-width:0;flex:1 1 auto;flex-direction:column;gap:2px;font-size:14px;font-weight:400;line-height:20px;letter-spacing:-.014px}html[data-current-path$=\"/assistant/widget\"] .assistant-playground-hook__label{color:var(--assistant-playground-text-strong)}html[data-current-path$=\"/assistant/widget\"] .assistant-playground-hook__description{color:var(--assistant-playground-text-default)}html[data-current-path$=\"/assistant/widget\"] .assistant-playground-switch{position:relative;display:flex;width:26px;height:18px;flex:0 0 26px;justify-content:flex-start;overflow:hidden;padding:1px;border-radius:3px;background:#d7d7d7;box-shadow:inset 0 1px 1px rgba(0,0,0,.1),inset 0 2px 4px rgba(0,0,0,.08),inset 0 .2px 0 .5px rgba(0,0,0,.08);transition:background 120ms ease}html[data-current-path$=\"/assistant/widget\"] .assistant-playground-switch[data-checked=true]{justify-content:flex-end;background:var(--assistant-playground-switch)}html[data-current-path$=\"/assistant/widget\"] .assistant-playground-switch__input{position:absolute;width:1px;height:1px;overflow:hidden;clip:rect(0 0 0 0);clip-path:inset(50%);white-space:nowrap}html[data-current-path$=\"/assistant/widget\"] .assistant-playground-switch__knob{width:12px;height:16px;border-radius:2px;background:#fcfcfc;box-shadow:0 0 0 .5px rgba(0,0,0,.05),0 2px 2px rgba(0,0,0,.04),0 1px 1px rgba(0,0,0,.12)}html[data-current-path$=\"/assistant/widget\"] .assistant-playground-code{margin-top:24px}html[data-current-path$=\"/assistant/widget\"] .assistant-playground-code__header{display:flex;align-items:center;justify-content:space-between;gap:16px;margin-bottom:12px}html[data-current-path$=\"/assistant/widget\"] .assistant-playground-code__title{color:var(--assistant-playground-text-strong);font-size:14px;font-weight:500;line-height:20px}html[data-current-path$=\"/assistant/widget\"] .assistant-playground-code__description{margin-top:2px;color:var(--assistant-playground-text-default);font-size:14px;line-height:20px}html[data-current-path$=\"/assistant/widget\"] .assistant-playground-code__tabs{display:inline-flex;gap:2px;padding:3px;border-radius:8px;background:var(--assistant-playground-frame);box-shadow:0 0 0 1px var(--assistant-playground-stroke)}html[data-current-path$=\"/assistant/widget\"] .assistant-playground-code__tabs button{min-height:28px;padding:4px 10px;border:0;border-radius:6px;background:0 0;color:var(--assistant-playground-text-default);font-size:13px;font-weight:500;line-height:20px;cursor:pointer}html[data-current-path$=\"/assistant/widget\"] .assistant-playground-code__tabs button[data-active=true]{background:var(--assistant-playground-surface);color:var(--assistant-playground-text-strong);box-shadow:0 1px 1px rgba(0,0,0,.08),0 0 0 1px var(--assistant-playground-stroke)}html[data-current-path$=\"/assistant/widget\"] .assistant-playground-children{margin-top:32px}@media (max-width:540px){html[data-current-path$=\"/assistant/widget\"] .assistant-playground-frame[data-customize-open=true] .assistant-playground-preview{visibility:hidden}html[data-current-path$=\"/assistant/widget\"] .assistant-playground-customizer{max-height:475px;overflow-y:auto}html[data-current-path$=\"/assistant/widget\"] .assistant-playground-code__header{align-items:flex-start;flex-direction:column}}html[data-current-path$=\"/assistant/widget-preview\"] #assistant-entry,html[data-current-path$=\"/assistant/widget-preview\"] #assistant-entry-mobile,html[data-current-path$=\"/assistant/widget-preview\"] #banner,html[data-current-path$=\"/assistant/widget-preview\"] #footer,html[data-current-path$=\"/assistant/widget-preview\"] #mobile-nav,html[data-current-path$=\"/assistant/widget-preview\"] #navbar,html[data-current-path$=\"/assistant/widget-preview\"] #navbar-transition,html[data-current-path$=\"/assistant/widget-preview\"] #sidebar,html[data-current-path$=\"/assistant/widget-preview\"] [aria-label=\"Preview Widget Menu\"],html[data-current-path$=\"/assistant/widget-preview\"] [aria-label=\"Preview Widget\"]{display:none!important}html[data-current-path$=\"/assistant/widget-preview\"],html[data-current-path$=\"/assistant/widget-preview\"] body{width:100%;height:100%;margin:0;overflow:hidden!important;background:#f8f8f8!important}html.dark[data-current-path$=\"/assistant/widget-preview\"],html.dark[data-current-path$=\"/assistant/widget-preview\"] body{background:#1c1c1c!important}"}],"page":{"pagePath":"deploy/authentication-setup","slug":"/deploy/authentication-setup","pageMetadata":{"title":"Authentication setup","description":"Set up user authentication to control access to pages and API references using password, OAuth, JWT, or Mintlify-managed private access.","keywords":["authentication","auth","OAuth","JWT","password","private"],"href":"/deploy/authentication-setup"},"description":{"compiledSource":"\"use strict\";\nconst {jsx: _jsx} = arguments[0];\nconst {useMDXComponents: _provideComponents} = arguments[0];\nfunction _createMdxContent(props) {\n const _components = {\n p: \"p\",\n ..._provideComponents(),\n ...props.components\n };\n return _jsx(_components.p, {\n children: \"Set up user authentication to control access to pages and API references using password, OAuth, JWT, or Mintlify-managed private access.\"\n });\n}\nfunction MDXContent(props = {}) {\n const {wrapper: MDXLayout} = {\n ..._provideComponents(),\n ...props.components\n };\n return MDXLayout ? _jsx(MDXLayout, {\n ...props,\n children: _jsx(_createMdxContent, {\n ...props\n })\n }) : _createMdxContent(props);\n}\nreturn {\n default: MDXContent\n};\n","frontmatter":{},"scope":{}},"pageType":"default","mdx":{"mdxSource":{"compiledSource":"\"use strict\";const{Fragment:_Fragment,jsx:_jsx,jsxs:_jsxs}=arguments[0];const{useMDXComponents:_provideComponents}=arguments[0];function _createMdxContent(props){const _components={a:`a`,code:`code`,li:`li`,ol:`ol`,p:`p`,pre:`pre`,span:`span`,strong:`strong`,tbody:`tbody`,td:`td`,th:`th`,thead:`thead`,tr:`tr`,ul:`ul`,..._provideComponents(),...props.components},{CodeBlock,CodeGroup,Expandable,Heading,Info,Note,ParamField,Step,Steps,Tab,Table,Tabs,Warning}=_components;if(!CodeBlock)_missingMdxReference(`CodeBlock`,true);if(!CodeGroup)_missingMdxReference(`CodeGroup`,true);if(!Expandable)_missingMdxReference(`Expandable`,true);if(!Heading)_missingMdxReference(`Heading`,true);if(!Info)_missingMdxReference(`Info`,true);if(!Note)_missingMdxReference(`Note`,true);if(!ParamField)_missingMdxReference(`ParamField`,true);if(!Step)_missingMdxReference(`Step`,true);if(!Steps)_missingMdxReference(`Steps`,true);if(!Tab)_missingMdxReference(`Tab`,true);if(!Table)_missingMdxReference(`Table`,true);if(!Tabs)_missingMdxReference(`Tabs`,true);if(!Warning)_missingMdxReference(`Warning`,true);return _jsxs(_Fragment,{children:[_jsxs(Info,{children:[_jsx(_components.p,{children:`Private authentication for your Mintlify organization is available on all plans.`}),_jsxs(_components.p,{children:[`Password authentication requires a `,_jsx(_components.a,{href:`https://mintlify.com/pricing?ref=authentication`,children:`Pro or Enterprise plan`}),`.`]}),_jsxs(_components.p,{children:[`OAuth and JWT authentication require an `,_jsx(_components.a,{href:`https://mintlify.com/pricing?ref=authentication`,children:`Enterprise plan`}),`.`]})]}),`\n`,_jsx(_components.p,{children:`Authentication requires users to sign in before accessing your content.`}),`\n`,_jsx(_components.p,{children:`You can configure full authentication for all pages or partial authentication where some pages are public and others require authentication.`}),`\n`,_jsxs(_components.p,{children:[`Authentication is only available for sites hosted on a custom domain or Mintlify subdomain. For example, `,_jsx(_components.code,{children:`docs.example.com`}),` or `,_jsx(_components.code,{children:`example.mintlify.site`}),`. Authentication is `,_jsx(_components.strong,{children:`not supported`}),` for sites with a `,_jsx(_components.a,{href:`/deploy/docs-subpath`,children:`custom subpath`}),`. For example, `,_jsx(_components.code,{children:`example.com/docs`}),`.`]}),`\n`,_jsxs(_components.p,{children:[`To identify visitors while keeping pages public, use `,_jsx(_components.a,{href:`/create/personalization`,children:`personalization`}),`. Personalization supports custom subpaths and can prefill API playground inputs without requiring visitors to authenticate before viewing a page.`]}),`\n`,_jsx(Heading,{level:`2`,id:`choose-an-authentication-method`,children:`Choose an authentication method`}),`\n`,_jsxs(_components.p,{children:[`Use this comparison to pick the method that fits your use case. See `,_jsx(_components.a,{href:`#feature-availability`,children:`Feature availability`}),` for how each method interacts with other Mintlify features.`]}),`\n`,_jsxs(Table,{children:[_jsx(_components.thead,{children:_jsxs(_components.tr,{children:[_jsx(_components.th,{style:{textAlign:`left`},children:`Method`}),_jsx(_components.th,{style:{textAlign:`left`},children:`Best for`}),_jsx(_components.th,{style:{textAlign:`left`},children:`Plan`}),_jsx(_components.th,{style:{textAlign:`center`},children:`Group-based access`}),_jsx(_components.th,{style:{textAlign:`center`},children:`API playground prefill`}),_jsx(_components.th,{style:{textAlign:`center`},children:`Personalization`})]})}),_jsxs(_components.tbody,{children:[_jsxs(_components.tr,{children:[_jsx(_components.td,{style:{textAlign:`left`},children:`Password`}),_jsx(_components.td,{style:{textAlign:`left`},children:`Simple shared access with no per-user tracking`}),_jsx(_components.td,{style:{textAlign:`left`},children:`Pro or Enterprise`}),_jsx(_components.td,{style:{textAlign:`center`},children:`No`}),_jsx(_components.td,{style:{textAlign:`center`},children:`No`}),_jsx(_components.td,{style:{textAlign:`center`},children:`No`})]}),_jsxs(_components.tr,{children:[_jsx(_components.td,{style:{textAlign:`left`},children:`Private authentication`}),_jsx(_components.td,{style:{textAlign:`left`},children:`Internal site for members of your Mintlify organization`}),_jsx(_components.td,{style:{textAlign:`left`},children:`All plans`}),_jsx(_components.td,{style:{textAlign:`center`},children:`No`}),_jsx(_components.td,{style:{textAlign:`center`},children:`No`}),_jsx(_components.td,{style:{textAlign:`center`},children:`No`})]}),_jsxs(_components.tr,{children:[_jsx(_components.td,{style:{textAlign:`left`},children:`OAuth 2.0`}),_jsx(_components.td,{style:{textAlign:`left`},children:`Existing identity provider or SSO with per-user sessions`}),_jsx(_components.td,{style:{textAlign:`left`},children:`Enterprise`}),_jsx(_components.td,{style:{textAlign:`center`},children:`Yes`}),_jsx(_components.td,{style:{textAlign:`center`},children:`Yes`}),_jsx(_components.td,{style:{textAlign:`center`},children:`Yes`})]}),_jsxs(_components.tr,{children:[_jsx(_components.td,{style:{textAlign:`left`},children:`JWT`}),_jsx(_components.td,{style:{textAlign:`left`},children:`Custom auth backend or embedded content behind your own login`}),_jsx(_components.td,{style:{textAlign:`left`},children:`Enterprise`}),_jsx(_components.td,{style:{textAlign:`center`},children:`Yes`}),_jsx(_components.td,{style:{textAlign:`center`},children:`Yes`}),_jsx(_components.td,{style:{textAlign:`center`},children:`Yes`})]})]})]}),`\n`,_jsx(Heading,{level:`2`,id:`configure-authentication`,children:`Configure authentication`}),`\n`,_jsxs(Tabs,{children:[_jsxs(Tab,{title:`Password`,id:`password`,\"data-child-heading-ids\":`[\"password-prerequisites\",\"password-setup\",\"password-example\"]`,children:[_jsx(Info,{children:_jsxs(_components.p,{children:[`Password authentication provides access control only and does `,_jsx(_components.strong,{children:`not`}),` support user-specific features like group-based access control or API playground prefilling.`]})}),_jsx(Heading,{level:`3`,id:`password-prerequisites`,children:`Password prerequisites`}),_jsxs(_components.ul,{children:[`\n`,_jsx(_components.li,{children:`Your security requirements allow sharing passwords among users.`}),`\n`]}),_jsx(Heading,{level:`3`,id:`password-setup`,children:`Password setup`}),_jsxs(Steps,{children:[_jsxs(Step,{title:`Create a password.`,children:[_jsxs(_components.ol,{children:[`\n`,_jsxs(_components.li,{children:[`In your dashboard, go to `,_jsx(_components.a,{href:`https://app.mintlify.com/settings/project/authentication`,children:`Access`}),`.`]}),`\n`,_jsxs(_components.li,{children:[`Set `,_jsx(_components.strong,{children:`Visibility`}),` to `,_jsx(_components.strong,{children:`Private`}),`.`]}),`\n`,_jsxs(_components.li,{children:[`Set `,_jsx(_components.strong,{children:`Method`}),` to `,_jsx(_components.strong,{children:`Password`}),`.`]}),`\n`,_jsx(_components.li,{children:`Enter a secure password.`}),`\n`,_jsxs(_components.li,{children:[`Click `,_jsx(_components.strong,{children:`Save`}),`.`]}),`\n`]}),_jsx(_components.p,{children:`After you save, your site redeploys. When it finishes deploying, anyone who visits your site must enter the password to access your content.`})]}),_jsx(Step,{title:`Distribute access.`,children:_jsx(_components.p,{children:`Securely share the password and documentation URL with authorized users.`})})]}),_jsx(Heading,{level:`3`,id:`password-example`,children:`Password example`}),_jsxs(_components.p,{children:[`You host your documentation at `,_jsx(_components.code,{children:`docs.foo.com`}),` and you need basic access control without tracking individual users. You want to prevent public access while keeping setup simple.`]}),_jsxs(_components.p,{children:[_jsx(_components.strong,{children:`Create a strong password`}),` in your dashboard. `,_jsx(_components.strong,{children:`Share credentials`}),` with authorized users.`]})]}),_jsxs(Tab,{title:`Private authentication`,id:`private-authentication`,\"data-child-heading-ids\":`[\"private-authentication-prerequisites\",\"private-authentication-setup\",\"private-example\"]`,children:[_jsx(Heading,{level:`3`,id:`private-authentication-prerequisites`,children:`Private authentication prerequisites`}),_jsxs(_components.ul,{children:[`\n`,_jsx(_components.li,{children:`Everyone who needs to access your site must be a member of your Mintlify organization.`}),`\n`]}),_jsx(Heading,{level:`3`,id:`private-authentication-setup`,children:`Private authentication setup`}),_jsxs(Steps,{children:[_jsxs(Step,{title:`Enable private authentication.`,children:[_jsxs(_components.ol,{children:[`\n`,_jsxs(_components.li,{children:[`In your dashboard, go to `,_jsx(_components.a,{href:`https://app.mintlify.com/settings/project/authentication`,children:`Access`}),`.`]}),`\n`,_jsxs(_components.li,{children:[`Set `,_jsx(_components.strong,{children:`Visibility`}),` to `,_jsx(_components.strong,{children:`Private`}),`.`]}),`\n`,_jsxs(_components.li,{children:[`Set `,_jsx(_components.strong,{children:`Method`}),` to `,_jsx(_components.strong,{children:`Authenticated`}),`.`]}),`\n`,_jsxs(_components.li,{children:[`Click `,_jsx(_components.strong,{children:`Save`}),`.`]}),`\n`]}),_jsx(_components.p,{children:`After you save, your site redeploys. When it finishes deploying, anyone who visits your site must sign in to your Mintlify organization to access your content.`})]}),_jsx(Step,{title:`Add authorized users.`,children:_jsxs(_components.ol,{children:[`\n`,_jsxs(_components.li,{children:[`In your dashboard, go to `,_jsx(_components.a,{href:`https://app.mintlify.com/settings/organization/members`,children:`Members`}),`.`]}),`\n`,_jsx(_components.li,{children:`Add each person who should have access to your documentation.`}),`\n`,_jsx(_components.li,{children:`Assign appropriate roles based on their editing permissions.`}),`\n`]})})]}),_jsx(Heading,{level:`3`,id:`private-example`,children:`Private example`}),_jsxs(_components.p,{children:[`You host your documentation at `,_jsx(_components.code,{children:`docs.foo.com`}),` and your entire team has access to your dashboard. You want to restrict access to team members only.`]}),_jsxs(_components.p,{children:[_jsx(_components.strong,{children:`Enable private authentication`}),` in your dashboard settings.`]}),_jsxs(_components.p,{children:[_jsx(_components.strong,{children:`Verify team access`}),` by checking that all team members are active in your organization.`]})]}),_jsxs(Tab,{title:`OAuth 2.0`,id:`oauth-2-0`,\"data-child-heading-ids\":`[\"oauth-2-0-prerequisites\",\"oauth-2-0-setup\",\"use-groups-from-oauth-token-claims\",\"oauth-2-0-example\"]`,children:[_jsx(Heading,{level:`3`,id:`oauth-2-0-prerequisites`,children:`OAuth 2.0 prerequisites`}),_jsxs(_components.ul,{children:[`\n`,_jsx(_components.li,{children:`An OAuth or OIDC server that supports the Authorization Code Flow.`}),`\n`,_jsx(_components.li,{children:`Ability to create an API endpoint accessible by OAuth access tokens (optional, to enable group-based access control).`}),`\n`]}),_jsx(Heading,{level:`3`,id:`oauth-2-0-setup`,children:`OAuth 2.0 setup`}),_jsxs(Steps,{children:[_jsxs(Step,{title:`Configure your OAuth settings.`,children:[_jsxs(_components.ol,{children:[`\n`,_jsxs(_components.li,{children:[`In your dashboard, go to `,_jsx(_components.a,{href:`https://app.mintlify.com/settings/project/authentication`,children:`Access`}),`.`]}),`\n`,_jsxs(_components.li,{children:[`Set `,_jsx(_components.strong,{children:`Visibility`}),` to `,_jsx(_components.strong,{children:`Private`}),`.`]}),`\n`,_jsxs(_components.li,{children:[`Set `,_jsx(_components.strong,{children:`Method`}),` to `,_jsx(_components.strong,{children:`Custom`}),`.`]}),`\n`,_jsxs(_components.li,{children:[`Click `,_jsx(_components.strong,{children:`OAuth`}),`.`]}),`\n`,_jsx(_components.li,{children:`Configure these fields:`}),`\n`]}),_jsxs(_components.ul,{children:[`\n`,_jsxs(_components.li,{children:[_jsx(_components.strong,{children:`Authorization URL`}),`: Your OAuth endpoint.`]}),`\n`,_jsxs(_components.li,{children:[_jsx(_components.strong,{children:`Client ID`}),`: Your OAuth 2.0 client identifier.`]}),`\n`,_jsxs(_components.li,{children:[_jsx(_components.strong,{children:`Client secret`}),`: Your OAuth 2.0 client secret.`]}),`\n`,_jsxs(_components.li,{children:[_jsx(_components.strong,{children:`Scopes`}),` (optional): Permissions to request. Copy the `,_jsx(_components.strong,{children:`entire`}),` scope string (for example, for a scope like `,_jsx(_components.code,{children:`provider.users.docs`}),`, copy the complete `,_jsx(_components.code,{children:`provider.users.docs`}),`). Use multiple scopes if you need different access levels.`]}),`\n`,_jsxs(_components.li,{children:[_jsx(_components.strong,{children:`Additional authorization parameters`}),` (optional): Additional query parameters to add to the initial authorization request.`]}),`\n`,_jsxs(_components.li,{children:[_jsx(_components.strong,{children:`Token URL`}),`: Your OAuth token exchange endpoint.`]}),`\n`,_jsxs(_components.li,{children:[_jsx(_components.strong,{children:`Info API URL`}),` (optional): Endpoint on your server that Mintlify calls to retrieve user info. Use this field for group-based access control. If omitted, the OAuth flow only verifies identity.`]}),`\n`,_jsxs(_components.li,{children:[_jsx(_components.strong,{children:`Logout URL`}),` (optional): The native logout URL for your OAuth provider. When users log out, Mintlify validates the logout redirect against this configured URL for security. The redirect only succeeds if it exactly matches the configured `,_jsx(_components.code,{children:`logoutUrl`}),`. If you do not configure a logout URL, users redirect to `,_jsx(_components.code,{children:`/login`}),`. Mintlify redirects users with a `,_jsx(_components.code,{children:`GET`}),` request and does not append query parameters. Include any parameters (for example, `,_jsx(_components.code,{children:`returnTo`}),`) directly in the URL.`]}),`\n`]}),_jsxs(_components.ol,{start:`6`,children:[`\n`,_jsxs(_components.li,{children:[`Click `,_jsx(_components.strong,{children:`Save`}),`.`]}),`\n`]}),_jsx(_components.p,{children:`After you configure your OAuth settings, your site redeploys. When it finishes deploying, anyone who visits your site must sign in to your OAuth provider to access your content.`})]}),_jsx(Step,{title:`Configure your OAuth server.`,children:_jsxs(_components.ol,{children:[`\n`,_jsxs(_components.li,{children:[`Copy the `,_jsx(_components.strong,{children:`Redirect URL`}),` from your `,_jsx(_components.a,{href:`https://app.mintlify.com/settings/project/authentication`,children:`Access settings`}),`.`]}),`\n`,_jsx(_components.li,{children:`Add the redirect URL as an authorized redirect URL for your OAuth server.`}),`\n`]})}),_jsxs(Step,{title:`Create your user info endpoint for group access (optional).`,children:[_jsx(_components.p,{children:`To enable group-based access control, create an API endpoint that:`}),_jsxs(_components.ul,{children:[`\n`,_jsxs(_components.li,{children:[`Responds to `,_jsx(_components.code,{children:`GET`}),` requests.`]}),`\n`,_jsxs(_components.li,{children:[`Accepts an `,_jsx(_components.code,{children:`Authorization: Bearer \u003caccess_token>`}),` header for authentication.`]}),`\n`,_jsxs(_components.li,{children:[`Returns user data in the `,_jsx(_components.code,{children:`User`}),` format. See `,_jsx(_components.a,{href:`#user-data-format`,children:`User data format`}),` for more information.`]}),`\n`]}),_jsx(_components.p,{children:`Mintlify calls this endpoint with the OAuth access token to retrieve user information. No additional query parameters are sent.`}),_jsxs(_components.p,{children:[`Add this endpoint URL to the `,_jsx(_components.strong,{children:`Info API URL`}),` field in your `,_jsx(_components.a,{href:`https://app.mintlify.com/settings/project/authentication`,children:`Access settings`}),`.`]})]})]}),_jsx(Heading,{level:`3`,id:`use-groups-from-oauth-token-claims`,children:`Use groups from OAuth token claims`}),_jsx(_components.p,{children:`If your identity provider includes group membership in the ID token or access token, you can use those claims instead of an Info API URL. This option is available for OAuth configurations that use a client secret.`}),_jsx(_components.p,{children:`When configuring OAuth token claims for your project, use values such as:`}),_jsx(CodeBlock,{filename:``,numberOfLines:`5`,language:`json`,children:_jsx(_components.pre,{className:`shiki shiki-themes github-light-default dark-plus`,style:{backgroundColor:`#ffffff`,\"--shiki-dark-bg\":`#0B0C0E`,color:`#1f2328`,\"--shiki-dark\":`#D4D4D4`},language:`json`,children:_jsxs(_components.code,{language:`json`,numberOfLines:`5`,children:[_jsx(_components.span,{className:`line`,children:_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`{`})}),`\n`,_jsxs(_components.span,{className:`line`,children:[_jsx(_components.span,{style:{color:`#116329`,\"--shiki-dark\":`#9CDCFE`},children:` \"source\"`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`: `}),_jsx(_components.span,{style:{color:`#0A3069`,\"--shiki-dark\":`#CE9178`},children:`\"id_token\"`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`,`})]}),`\n`,_jsxs(_components.span,{className:`line`,children:[_jsx(_components.span,{style:{color:`#116329`,\"--shiki-dark\":`#9CDCFE`},children:` \"groupsClaim\"`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`: `}),_jsx(_components.span,{style:{color:`#0A3069`,\"--shiki-dark\":`#CE9178`},children:`\"groups\"`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`,`})]}),`\n`,_jsxs(_components.span,{className:`line`,children:[_jsx(_components.span,{style:{color:`#116329`,\"--shiki-dark\":`#9CDCFE`},children:` \"groupsDelimiter\"`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`: `}),_jsx(_components.span,{style:{color:`#0A3069`,\"--shiki-dark\":`#CE9178`},children:`\",\"`})]}),`\n`,_jsx(_components.span,{className:`line`,children:_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`}`})}),`\n`]})})}),_jsxs(_components.ul,{children:[`\n`,_jsxs(_components.li,{children:[_jsx(_components.code,{children:`source`}),`: Selects `,_jsx(_components.code,{children:`id_token`}),` or `,_jsx(_components.code,{children:`access_token`}),`. If you select `,_jsx(_components.code,{children:`id_token`}),`, include the `,_jsx(_components.code,{children:`openid`}),` scope in your OAuth scopes.`]}),`\n`,_jsxs(_components.li,{children:[_jsx(_components.code,{children:`groupsClaim`}),`: Identifies the token claim that contains groups. Defaults to `,_jsx(_components.code,{children:`groups`}),`.`]}),`\n`,_jsxs(_components.li,{children:[_jsx(_components.code,{children:`groupsDelimiter`}),`: An optional delimiter from 1 to 4 characters. Mintlify uses it only to split string claim values. If the delimiter can be part of a group name, omit `,_jsx(_components.code,{children:`groupsDelimiter`}),`.`]}),`\n`]}),_jsxs(_components.p,{children:[`For example, with `,_jsx(_components.code,{children:`\"groups\": \"general,client\"`}),` and `,_jsx(_components.code,{children:`groupsDelimiter`}),` set to `,_jsx(_components.code,{children:`\",\"`}),`, Mintlify uses `,_jsx(_components.code,{children:`general`}),` and `,_jsx(_components.code,{children:`client`}),` as separate groups.`]}),_jsxs(_components.p,{children:[`Mintlify trims whitespace around each group and ignores empty segments. Without `,_jsx(_components.code,{children:`groupsDelimiter`}),`, the complete string is a single group. Array claims are always one group per string item and are not split.`]}),_jsx(Heading,{level:`3`,id:`oauth-2-0-example`,children:`OAuth 2.0 example`}),_jsxs(_components.p,{children:[`You host your documentation at `,_jsx(_components.code,{children:`docs.foo.com`}),` and you have an existing OAuth server at `,_jsx(_components.code,{children:`auth.foo.com`}),` that supports the Authorization Code Flow.`]}),_jsxs(_components.p,{children:[_jsx(_components.strong,{children:`Configure your OAuth server details`}),` in your dashboard:`]}),_jsxs(_components.ul,{children:[`\n`,_jsxs(_components.li,{children:[_jsx(_components.strong,{children:`Authorization URL`}),`: `,_jsx(_components.code,{children:`https://auth.foo.com/authorization`})]}),`\n`,_jsxs(_components.li,{children:[_jsx(_components.strong,{children:`Client ID`}),`: `,_jsx(_components.code,{children:`ydybo4SD8PR73vzWWd6S0ObH`})]}),`\n`,_jsxs(_components.li,{children:[_jsx(_components.strong,{children:`Scopes`}),`: `,_jsx(_components.code,{children:`['provider.users.docs']`})]}),`\n`,_jsxs(_components.li,{children:[_jsx(_components.strong,{children:`Token URL`}),`: `,_jsx(_components.code,{children:`https://auth.foo.com/exchange`})]}),`\n`,_jsxs(_components.li,{children:[_jsx(_components.strong,{children:`Info API URL`}),`: `,_jsx(_components.code,{children:`https://api.foo.com/docs/user-info`})]}),`\n`,_jsxs(_components.li,{children:[_jsx(_components.strong,{children:`Logout URL`}),`: `,_jsx(_components.code,{children:`https://auth.foo.com/logout?returnTo=https%3A%2F%2Fdocs.foo.com`})]}),`\n`]}),_jsxs(_components.p,{children:[_jsx(_components.strong,{children:`Create a user info endpoint`}),` at `,_jsx(_components.code,{children:`api.foo.com/docs/user-info`}),`, which requires an OAuth access token with the `,_jsx(_components.code,{children:`provider.users.docs`}),` scope, and returns:`]}),_jsx(CodeBlock,{filename:``,numberOfLines:`9`,language:`json`,children:_jsx(_components.pre,{className:`shiki shiki-themes github-light-default dark-plus`,style:{backgroundColor:`#ffffff`,\"--shiki-dark-bg\":`#0B0C0E`,color:`#1f2328`,\"--shiki-dark\":`#D4D4D4`},language:`json`,children:_jsxs(_components.code,{language:`json`,numberOfLines:`9`,children:[_jsx(_components.span,{className:`line`,children:_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`{`})}),`\n`,_jsxs(_components.span,{className:`line`,children:[_jsx(_components.span,{style:{color:`#116329`,\"--shiki-dark\":`#9CDCFE`},children:` \"groups\"`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`: [`}),_jsx(_components.span,{style:{color:`#0A3069`,\"--shiki-dark\":`#CE9178`},children:`\"engineering\"`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`, `}),_jsx(_components.span,{style:{color:`#0A3069`,\"--shiki-dark\":`#CE9178`},children:`\"admin\"`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`],`})]}),`\n`,_jsxs(_components.span,{className:`line`,children:[_jsx(_components.span,{style:{color:`#116329`,\"--shiki-dark\":`#9CDCFE`},children:` \"expiresAt\"`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`: `}),_jsx(_components.span,{style:{color:`#0550AE`,\"--shiki-dark\":`#B5CEA8`},children:`1893456000`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`,`})]}),`\n`,_jsxs(_components.span,{className:`line`,children:[_jsx(_components.span,{style:{color:`#116329`,\"--shiki-dark\":`#9CDCFE`},children:` \"apiPlaygroundInputs\"`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`: {`})]}),`\n`,_jsxs(_components.span,{className:`line`,children:[_jsx(_components.span,{style:{color:`#116329`,\"--shiki-dark\":`#9CDCFE`},children:` \"header\"`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`: {`})]}),`\n`,_jsxs(_components.span,{className:`line`,children:[_jsx(_components.span,{style:{color:`#116329`,\"--shiki-dark\":`#9CDCFE`},children:` \"Authorization\"`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`: `}),_jsx(_components.span,{style:{color:`#0A3069`,\"--shiki-dark\":`#CE9178`},children:`\"Bearer user_abc123\"`})]}),`\n`,_jsx(_components.span,{className:`line`,children:_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:` }`})}),`\n`,_jsx(_components.span,{className:`line`,children:_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:` }`})}),`\n`,_jsx(_components.span,{className:`line`,children:_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`}`})}),`\n`]})})}),_jsx(Note,{children:_jsxs(_components.p,{children:[`Control session length with the `,_jsx(_components.code,{children:`expiresAt`}),` field in your user info response. This is a Unix timestamp (seconds since epoch) indicating when the session should expire. See `,_jsx(_components.a,{href:`#user-data-format`,children:`User data format`}),` for more details.`]})}),_jsxs(_components.p,{children:[_jsx(_components.strong,{children:`Configure your OAuth server to allow redirects`}),` to your callback URL.`]})]}),_jsxs(Tab,{title:`JWT`,id:`jwt`,\"data-child-heading-ids\":`[\"jwt-prerequisites\",\"jwt-setup\",\"jwt-example\",\"redirect-unauthenticated-users\"]`,children:[_jsx(Heading,{level:`3`,id:`jwt-prerequisites`,children:`JWT prerequisites`}),_jsxs(_components.ul,{children:[`\n`,_jsx(_components.li,{children:`An authentication system that can generate and sign JWTs.`}),`\n`,_jsx(_components.li,{children:`A backend service that can create redirect URLs.`}),`\n`]}),_jsx(Heading,{level:`3`,id:`jwt-setup`,children:`JWT setup`}),_jsxs(Steps,{children:[_jsxs(Step,{title:`Generate a private key.`,children:[_jsxs(_components.ol,{children:[`\n`,_jsxs(_components.li,{children:[`In your dashboard, go to `,_jsx(_components.a,{href:`https://app.mintlify.com/settings/project/authentication`,children:`Access`}),`.`]}),`\n`,_jsxs(_components.li,{children:[`Set `,_jsx(_components.strong,{children:`Visibility`}),` to `,_jsx(_components.strong,{children:`Private`}),`.`]}),`\n`,_jsxs(_components.li,{children:[`Set `,_jsx(_components.strong,{children:`Method`}),` to `,_jsx(_components.strong,{children:`Custom`}),`.`]}),`\n`,_jsxs(_components.li,{children:[`Click `,_jsx(_components.strong,{children:`JWT`}),`.`]}),`\n`,_jsx(_components.li,{children:`Enter the URL of your existing login flow.`}),`\n`,_jsxs(_components.li,{children:[`To offer more than one login flow, click `,_jsx(_components.strong,{children:`Add login URL`}),` and enter a display name and URL for each option. You can configure up to 10 login URLs.`]}),`\n`,_jsxs(_components.li,{children:[`Click `,_jsx(_components.strong,{children:`Save`}),`.`]}),`\n`,_jsxs(_components.li,{children:[`Click `,_jsx(_components.strong,{children:`Generate new key`}),`.`]}),`\n`,_jsx(_components.li,{children:`Store your key securely where your backend can access it.`}),`\n`]}),_jsx(_components.p,{children:`After you generate a private key, your site redeploys. When it finishes deploying, anyone who visits your site must sign in to your JWT authentication system to access your content.`})]}),_jsxs(Step,{title:`Integrate Mintlify authentication into your login flow.`,children:[_jsx(_components.p,{children:`Modify your existing login flow to include these steps after user authentication:`}),_jsxs(_components.ul,{children:[`\n`,_jsxs(_components.li,{children:[`Create a JWT containing the authenticated user’s info in the `,_jsx(_components.code,{children:`User`}),` format. See `,_jsx(_components.a,{href:`#user-data-format`,children:`User data format`}),` for more information.`]}),`\n`,_jsx(_components.li,{children:`Sign the JWT with your secret key, using the EdDSA algorithm.`}),`\n`,_jsxs(_components.li,{children:[`Create a redirect URL back to the `,_jsx(_components.code,{children:`/login/jwt-callback`}),` path of your docs, including the JWT as the hash.`]}),`\n`]})]})]}),_jsxs(_components.p,{children:[`When JWT authentication has one login URL, unauthenticated visitors redirect to it automatically. With two or more named login URLs, visitors first see a selection page and then continue to the selected login flow. Mintlify forwards the validated `,_jsx(_components.code,{children:`redirect`}),` parameter so the visitor returns to the documentation page they originally requested.`]}),_jsx(Note,{children:_jsxs(_components.p,{children:[`Multiple login URLs are available for full and partial JWT authentication. JWT `,_jsx(_components.a,{href:`/create/personalization`,children:`personalization`}),` accepts one login URL because it identifies visitors without requiring a login before they can view public content.`]})}),_jsx(Heading,{level:`3`,id:`jwt-example`,children:`JWT example`}),_jsxs(_components.p,{children:[`You host your documentation at `,_jsx(_components.code,{children:`docs.foo.com`}),` with an existing authentication system at `,_jsx(_components.code,{children:`foo.com`}),`. You want to extend your login flow to grant access to the docs while keeping your docs separate from your dashboard (or you don’t have a dashboard).`]}),_jsxs(_components.p,{children:[`Create a login endpoint at `,_jsx(_components.code,{children:`https://foo.com/docs-login`}),` that extends your existing authentication.`]}),_jsx(_components.p,{children:`After verifying user credentials:`}),_jsxs(_components.ul,{children:[`\n`,_jsx(_components.li,{children:`Generate a JWT with user data in Mintlify’s format.`}),`\n`,_jsxs(_components.li,{children:[`Sign the JWT and redirect to `,_jsx(_components.code,{children:`https://docs.foo.com/login/jwt-callback#{SIGNED_JWT}`}),`.`]}),`\n`]}),_jsxs(CodeGroup,{children:[_jsx(CodeBlock,{filename:`TypeScript`,numberOfLines:`27`,language:`typescript`,children:_jsx(_components.pre,{className:`shiki shiki-themes github-light-default dark-plus`,style:{backgroundColor:`#ffffff`,\"--shiki-dark-bg\":`#0B0C0E`,color:`#1f2328`,\"--shiki-dark\":`#D4D4D4`},language:`typescript`,children:_jsxs(_components.code,{language:`typescript`,numberOfLines:`27`,children:[_jsxs(_components.span,{className:`line`,children:[_jsx(_components.span,{style:{color:`#CF222E`,\"--shiki-dark\":`#C586C0`},children:`import`}),_jsx(_components.span,{style:{color:`#0550AE`,\"--shiki-dark\":`#569CD6`},children:` *`}),_jsx(_components.span,{style:{color:`#CF222E`,\"--shiki-dark\":`#C586C0`},children:` as`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#9CDCFE`},children:` jose`}),_jsx(_components.span,{style:{color:`#CF222E`,\"--shiki-dark\":`#C586C0`},children:` from`}),_jsx(_components.span,{style:{color:`#0A3069`,\"--shiki-dark\":`#CE9178`},children:` 'jose'`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`;`})]}),`\n`,_jsxs(_components.span,{className:`line`,children:[_jsx(_components.span,{style:{color:`#CF222E`,\"--shiki-dark\":`#C586C0`},children:`import`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:` { `}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#9CDCFE`},children:`Request`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`, `}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#9CDCFE`},children:`Response`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:` } `}),_jsx(_components.span,{style:{color:`#CF222E`,\"--shiki-dark\":`#C586C0`},children:`from`}),_jsx(_components.span,{style:{color:`#0A3069`,\"--shiki-dark\":`#CE9178`},children:` 'express'`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`;`})]}),`\n`,_jsx(_components.span,{className:`line`}),`\n`,_jsxs(_components.span,{className:`line`,children:[_jsx(_components.span,{style:{color:`#CF222E`,\"--shiki-dark\":`#569CD6`},children:`const`}),_jsx(_components.span,{style:{color:`#0550AE`,\"--shiki-dark\":`#4FC1FF`},children:` TWO_WEEKS_IN_MS`}),_jsx(_components.span,{style:{color:`#CF222E`,\"--shiki-dark\":`#D4D4D4`},children:` =`}),_jsx(_components.span,{style:{color:`#0550AE`,\"--shiki-dark\":`#B5CEA8`},children:` 1000`}),_jsx(_components.span,{style:{color:`#CF222E`,\"--shiki-dark\":`#D4D4D4`},children:` *`}),_jsx(_components.span,{style:{color:`#0550AE`,\"--shiki-dark\":`#B5CEA8`},children:` 60`}),_jsx(_components.span,{style:{color:`#CF222E`,\"--shiki-dark\":`#D4D4D4`},children:` *`}),_jsx(_components.span,{style:{color:`#0550AE`,\"--shiki-dark\":`#B5CEA8`},children:` 60`}),_jsx(_components.span,{style:{color:`#CF222E`,\"--shiki-dark\":`#D4D4D4`},children:` *`}),_jsx(_components.span,{style:{color:`#0550AE`,\"--shiki-dark\":`#B5CEA8`},children:` 24`}),_jsx(_components.span,{style:{color:`#CF222E`,\"--shiki-dark\":`#D4D4D4`},children:` *`}),_jsx(_components.span,{style:{color:`#0550AE`,\"--shiki-dark\":`#B5CEA8`},children:` 7`}),_jsx(_components.span,{style:{color:`#CF222E`,\"--shiki-dark\":`#D4D4D4`},children:` *`}),_jsx(_components.span,{style:{color:`#0550AE`,\"--shiki-dark\":`#B5CEA8`},children:` 2`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`;`})]}),`\n`,_jsxs(_components.span,{className:`line`,children:[_jsx(_components.span,{style:{color:`#CF222E`,\"--shiki-dark\":`#569CD6`},children:`const`}),_jsx(_components.span,{style:{color:`#0550AE`,\"--shiki-dark\":`#4FC1FF`},children:` DOCS_HOST`}),_jsx(_components.span,{style:{color:`#CF222E`,\"--shiki-dark\":`#D4D4D4`},children:` =`}),_jsx(_components.span,{style:{color:`#0A3069`,\"--shiki-dark\":`#CE9178`},children:` 'docs.example.com'`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`;`})]}),`\n`,_jsx(_components.span,{className:`line`}),`\n`,_jsxs(_components.span,{className:`line`,children:[_jsx(_components.span,{style:{color:`#CF222E`,\"--shiki-dark\":`#569CD6`},children:`const`}),_jsx(_components.span,{style:{color:`#0550AE`,\"--shiki-dark\":`#4FC1FF`},children:` signingKey`}),_jsx(_components.span,{style:{color:`#CF222E`,\"--shiki-dark\":`#D4D4D4`},children:` =`}),_jsx(_components.span,{style:{color:`#CF222E`,\"--shiki-dark\":`#C586C0`},children:` await`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#9CDCFE`},children:` jose`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`.`}),_jsx(_components.span,{style:{color:`#8250DF`,\"--shiki-dark\":`#DCDCAA`},children:`importPKCS8`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`(`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#9CDCFE`},children:`process`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`.`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#9CDCFE`},children:`env`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`.`}),_jsx(_components.span,{style:{color:`#0550AE`,\"--shiki-dark\":`#4FC1FF`},children:`MINTLIFY_PRIVATE_KEY`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`, `}),_jsx(_components.span,{style:{color:`#0A3069`,\"--shiki-dark\":`#CE9178`},children:`'EdDSA'`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`);`})]}),`\n`,_jsx(_components.span,{className:`line`}),`\n`,_jsxs(_components.span,{className:`line`,children:[_jsx(_components.span,{style:{color:`#CF222E`,\"--shiki-dark\":`#C586C0`},children:`export`}),_jsx(_components.span,{style:{color:`#CF222E`,\"--shiki-dark\":`#569CD6`},children:` async`}),_jsx(_components.span,{style:{color:`#CF222E`,\"--shiki-dark\":`#569CD6`},children:` function`}),_jsx(_components.span,{style:{color:`#8250DF`,\"--shiki-dark\":`#DCDCAA`},children:` handleRequest`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`(`}),_jsx(_components.span,{style:{color:`#953800`,\"--shiki-dark\":`#9CDCFE`},children:`req`}),_jsx(_components.span,{style:{color:`#CF222E`,\"--shiki-dark\":`#D4D4D4`},children:`:`}),_jsx(_components.span,{style:{color:`#953800`,\"--shiki-dark\":`#4EC9B0`},children:` Request`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`, `}),_jsx(_components.span,{style:{color:`#953800`,\"--shiki-dark\":`#9CDCFE`},children:`res`}),_jsx(_components.span,{style:{color:`#CF222E`,\"--shiki-dark\":`#D4D4D4`},children:`:`}),_jsx(_components.span,{style:{color:`#953800`,\"--shiki-dark\":`#4EC9B0`},children:` Response`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`) {`})]}),`\n`,_jsxs(_components.span,{className:`line`,children:[_jsx(_components.span,{style:{color:`#CF222E`,\"--shiki-dark\":`#569CD6`},children:` const`}),_jsx(_components.span,{style:{color:`#0550AE`,\"--shiki-dark\":`#4FC1FF`},children:` user`}),_jsx(_components.span,{style:{color:`#CF222E`,\"--shiki-dark\":`#D4D4D4`},children:` =`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:` {`})]}),`\n`,_jsxs(_components.span,{className:`line`,children:[_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#9CDCFE`},children:` host:`}),_jsx(_components.span,{style:{color:`#0550AE`,\"--shiki-dark\":`#4FC1FF`},children:` DOCS_HOST`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`, `}),_jsx(_components.span,{style:{color:`#6E7781`,\"--shiki-dark\":`#6A9955`},children:`// Must match your docs URL`})]}),`\n`,_jsxs(_components.span,{className:`line`,children:[_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#9CDCFE`},children:` expiresAt:`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#9CDCFE`},children:` Math`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`.`}),_jsx(_components.span,{style:{color:`#8250DF`,\"--shiki-dark\":`#DCDCAA`},children:`floor`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`((`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#9CDCFE`},children:`Date`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`.`}),_jsx(_components.span,{style:{color:`#8250DF`,\"--shiki-dark\":`#DCDCAA`},children:`now`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`() `}),_jsx(_components.span,{style:{color:`#CF222E`,\"--shiki-dark\":`#D4D4D4`},children:`+`}),_jsx(_components.span,{style:{color:`#0550AE`,\"--shiki-dark\":`#4FC1FF`},children:` TWO_WEEKS_IN_MS`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`) `}),_jsx(_components.span,{style:{color:`#CF222E`,\"--shiki-dark\":`#D4D4D4`},children:`/`}),_jsx(_components.span,{style:{color:`#0550AE`,\"--shiki-dark\":`#B5CEA8`},children:` 1000`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`), `}),_jsx(_components.span,{style:{color:`#6E7781`,\"--shiki-dark\":`#6A9955`},children:`// 2 week session expiration`})]}),`\n`,_jsxs(_components.span,{className:`line`,children:[_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#9CDCFE`},children:` groups:`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#9CDCFE`},children:` res`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`.`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#9CDCFE`},children:`locals`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`.`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#9CDCFE`},children:`user`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`.`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#9CDCFE`},children:`groups`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`,`})]}),`\n`,_jsxs(_components.span,{className:`line`,children:[_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#9CDCFE`},children:` apiPlaygroundInputs:`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:` {`})]}),`\n`,_jsxs(_components.span,{className:`line`,children:[_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#9CDCFE`},children:` header:`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:` {`})]}),`\n`,_jsxs(_components.span,{className:`line`,children:[_jsx(_components.span,{style:{color:`#0A3069`,\"--shiki-dark\":`#CE9178`},children:` \"Authorization\"`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#9CDCFE`},children:`:`}),_jsx(_components.span,{style:{color:`#0A3069`,\"--shiki-dark\":`#CE9178`},children:\" `Bearer \"}),_jsx(_components.span,{style:{color:`#0A3069`,\"--shiki-dark\":`#569CD6`},children:\"${\"}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#9CDCFE`},children:`res`}),_jsx(_components.span,{style:{color:`#0A3069`,\"--shiki-dark\":`#D4D4D4`},children:`.`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#9CDCFE`},children:`locals`}),_jsx(_components.span,{style:{color:`#0A3069`,\"--shiki-dark\":`#D4D4D4`},children:`.`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#9CDCFE`},children:`user`}),_jsx(_components.span,{style:{color:`#0A3069`,\"--shiki-dark\":`#D4D4D4`},children:`.`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#9CDCFE`},children:`apiKey`}),_jsx(_components.span,{style:{color:`#0A3069`,\"--shiki-dark\":`#569CD6`},children:`}`}),_jsx(_components.span,{style:{color:`#0A3069`,\"--shiki-dark\":`#CE9178`},children:\"`\"}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`,`})]}),`\n`,_jsx(_components.span,{className:`line`,children:_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:` },`})}),`\n`,_jsx(_components.span,{className:`line`,children:_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:` },`})}),`\n`,_jsx(_components.span,{className:`line`,children:_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:` };`})}),`\n`,_jsx(_components.span,{className:`line`}),`\n`,_jsxs(_components.span,{className:`line`,children:[_jsx(_components.span,{style:{color:`#CF222E`,\"--shiki-dark\":`#569CD6`},children:` const`}),_jsx(_components.span,{style:{color:`#0550AE`,\"--shiki-dark\":`#4FC1FF`},children:` jwt`}),_jsx(_components.span,{style:{color:`#CF222E`,\"--shiki-dark\":`#D4D4D4`},children:` =`}),_jsx(_components.span,{style:{color:`#CF222E`,\"--shiki-dark\":`#C586C0`},children:` await`}),_jsx(_components.span,{style:{color:`#CF222E`,\"--shiki-dark\":`#569CD6`},children:` new`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#9CDCFE`},children:` jose`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`.`}),_jsx(_components.span,{style:{color:`#8250DF`,\"--shiki-dark\":`#DCDCAA`},children:`SignJWT`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`(`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#9CDCFE`},children:`user`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`)`})]}),`\n`,_jsxs(_components.span,{className:`line`,children:[_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:` .`}),_jsx(_components.span,{style:{color:`#8250DF`,\"--shiki-dark\":`#DCDCAA`},children:`setProtectedHeader`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`({ `}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#9CDCFE`},children:`alg:`}),_jsx(_components.span,{style:{color:`#0A3069`,\"--shiki-dark\":`#CE9178`},children:` 'EdDSA'`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:` })`})]}),`\n`,_jsxs(_components.span,{className:`line`,children:[_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:` .`}),_jsx(_components.span,{style:{color:`#8250DF`,\"--shiki-dark\":`#DCDCAA`},children:`setExpirationTime`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`(`}),_jsx(_components.span,{style:{color:`#0A3069`,\"--shiki-dark\":`#CE9178`},children:`'10 s'`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`) `}),_jsx(_components.span,{style:{color:`#6E7781`,\"--shiki-dark\":`#6A9955`},children:`// 10 second JWT expiration`})]}),`\n`,_jsxs(_components.span,{className:`line`,children:[_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:` .`}),_jsx(_components.span,{style:{color:`#8250DF`,\"--shiki-dark\":`#DCDCAA`},children:`sign`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`(`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#9CDCFE`},children:`signingKey`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`);`})]}),`\n`,_jsx(_components.span,{className:`line`}),`\n`,_jsxs(_components.span,{className:`line`,children:[_jsx(_components.span,{style:{color:`#CF222E`,\"--shiki-dark\":`#C586C0`},children:` return`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#9CDCFE`},children:` res`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`.`}),_jsx(_components.span,{style:{color:`#8250DF`,\"--shiki-dark\":`#DCDCAA`},children:`redirect`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`(`}),_jsx(_components.span,{style:{color:`#0A3069`,\"--shiki-dark\":`#CE9178`},children:\"`https://\"}),_jsx(_components.span,{style:{color:`#0A3069`,\"--shiki-dark\":`#569CD6`},children:\"${\"}),_jsx(_components.span,{style:{color:`#0550AE`,\"--shiki-dark\":`#4FC1FF`},children:`DOCS_HOST`}),_jsx(_components.span,{style:{color:`#0A3069`,\"--shiki-dark\":`#569CD6`},children:`}`}),_jsx(_components.span,{style:{color:`#0A3069`,\"--shiki-dark\":`#CE9178`},children:`/login/jwt-callback#`}),_jsx(_components.span,{style:{color:`#0A3069`,\"--shiki-dark\":`#569CD6`},children:\"${\"}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#9CDCFE`},children:`jwt`}),_jsx(_components.span,{style:{color:`#0A3069`,\"--shiki-dark\":`#569CD6`},children:`}`}),_jsx(_components.span,{style:{color:`#0A3069`,\"--shiki-dark\":`#CE9178`},children:\"`\"}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`);`})]}),`\n`,_jsx(_components.span,{className:`line`,children:_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`}`})}),`\n`]})})}),_jsx(CodeBlock,{filename:`Python`,numberOfLines:`28`,language:`python`,children:_jsx(_components.pre,{className:`shiki shiki-themes github-light-default dark-plus`,style:{backgroundColor:`#ffffff`,\"--shiki-dark-bg\":`#0B0C0E`,color:`#1f2328`,\"--shiki-dark\":`#D4D4D4`},language:`python`,children:_jsxs(_components.code,{language:`python`,numberOfLines:`28`,children:[_jsxs(_components.span,{className:`line`,children:[_jsx(_components.span,{style:{color:`#CF222E`,\"--shiki-dark\":`#C586C0`},children:`import`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:` jwt `}),_jsx(_components.span,{style:{color:`#6E7781`,\"--shiki-dark\":`#6A9955`},children:`# pyjwt`})]}),`\n`,_jsxs(_components.span,{className:`line`,children:[_jsx(_components.span,{style:{color:`#CF222E`,\"--shiki-dark\":`#C586C0`},children:`import`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:` os`})]}),`\n`,_jsx(_components.span,{className:`line`}),`\n`,_jsxs(_components.span,{className:`line`,children:[_jsx(_components.span,{style:{color:`#CF222E`,\"--shiki-dark\":`#C586C0`},children:`from`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:` datetime `}),_jsx(_components.span,{style:{color:`#CF222E`,\"--shiki-dark\":`#C586C0`},children:`import`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:` datetime, timedelta`})]}),`\n`,_jsxs(_components.span,{className:`line`,children:[_jsx(_components.span,{style:{color:`#CF222E`,\"--shiki-dark\":`#C586C0`},children:`from`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:` fastapi.responses `}),_jsx(_components.span,{style:{color:`#CF222E`,\"--shiki-dark\":`#C586C0`},children:`import`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:` RedirectResponse`})]}),`\n`,_jsx(_components.span,{className:`line`}),`\n`,_jsxs(_components.span,{className:`line`,children:[_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`private_key `}),_jsx(_components.span,{style:{color:`#CF222E`,\"--shiki-dark\":`#D4D4D4`},children:`=`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:` os.getenv(`}),_jsx(_components.span,{style:{color:`#0550AE`,\"--shiki-dark\":`#D4D4D4`},children:`MINTLIFY_JWT_PEM_SECRET_NAME`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`, `}),_jsx(_components.span,{style:{color:`#0A3069`,\"--shiki-dark\":`#CE9178`},children:`''`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`)`})]}),`\n`,_jsxs(_components.span,{className:`line`,children:[_jsx(_components.span,{style:{color:`#0550AE`,\"--shiki-dark\":`#D4D4D4`},children:`DOCS_HOST`}),_jsx(_components.span,{style:{color:`#CF222E`,\"--shiki-dark\":`#D4D4D4`},children:` =`}),_jsx(_components.span,{style:{color:`#0A3069`,\"--shiki-dark\":`#CE9178`},children:` 'docs.example.com'`})]}),`\n`,_jsx(_components.span,{className:`line`}),`\n`,_jsxs(_components.span,{className:`line`,children:[_jsx(_components.span,{style:{color:`#8250DF`,\"--shiki-dark\":`#DCDCAA`},children:`@router.get`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`(`}),_jsx(_components.span,{style:{color:`#0A3069`,\"--shiki-dark\":`#CE9178`},children:`'/auth'`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`)`})]}),`\n`,_jsxs(_components.span,{className:`line`,children:[_jsx(_components.span,{style:{color:`#CF222E`,\"--shiki-dark\":`#569CD6`},children:`async`}),_jsx(_components.span,{style:{color:`#CF222E`,\"--shiki-dark\":`#569CD6`},children:` def`}),_jsx(_components.span,{style:{color:`#8250DF`,\"--shiki-dark\":`#DCDCAA`},children:` return_mintlify_auth_status`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`(`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#9CDCFE`},children:`current_user`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`):`})]}),`\n`,_jsxs(_components.span,{className:`line`,children:[_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:` jwt_token `}),_jsx(_components.span,{style:{color:`#CF222E`,\"--shiki-dark\":`#D4D4D4`},children:`=`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:` jwt.encode(`})]}),`\n`,_jsxs(_components.span,{className:`line`,children:[_jsx(_components.span,{style:{color:`#953800`,\"--shiki-dark\":`#9CDCFE`},children:` payload`}),_jsx(_components.span,{style:{color:`#CF222E`,\"--shiki-dark\":`#D4D4D4`},children:`=`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`{`})]}),`\n`,_jsxs(_components.span,{className:`line`,children:[_jsx(_components.span,{style:{color:`#0A3069`,\"--shiki-dark\":`#CE9178`},children:` 'host'`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`: `}),_jsx(_components.span,{style:{color:`#0550AE`,\"--shiki-dark\":`#D4D4D4`},children:`DOCS_HOST`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`, `}),_jsx(_components.span,{style:{color:`#6E7781`,\"--shiki-dark\":`#6A9955`},children:`# Must match your docs URL`})]}),`\n`,_jsxs(_components.span,{className:`line`,children:[_jsx(_components.span,{style:{color:`#0A3069`,\"--shiki-dark\":`#CE9178`},children:` 'exp'`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`: `}),_jsx(_components.span,{style:{color:`#0550AE`,\"--shiki-dark\":`#4EC9B0`},children:`int`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`((datetime.now() `}),_jsx(_components.span,{style:{color:`#CF222E`,\"--shiki-dark\":`#D4D4D4`},children:`+`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:` timedelta(`}),_jsx(_components.span,{style:{color:`#953800`,\"--shiki-dark\":`#9CDCFE`},children:`seconds`}),_jsx(_components.span,{style:{color:`#CF222E`,\"--shiki-dark\":`#D4D4D4`},children:`=`}),_jsx(_components.span,{style:{color:`#0550AE`,\"--shiki-dark\":`#B5CEA8`},children:`10`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`)).timestamp()), `}),_jsx(_components.span,{style:{color:`#6E7781`,\"--shiki-dark\":`#6A9955`},children:`# 10 second JWT expiration`})]}),`\n`,_jsxs(_components.span,{className:`line`,children:[_jsx(_components.span,{style:{color:`#0A3069`,\"--shiki-dark\":`#CE9178`},children:` 'expiresAt'`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`: `}),_jsx(_components.span,{style:{color:`#0550AE`,\"--shiki-dark\":`#4EC9B0`},children:`int`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`((datetime.now() `}),_jsx(_components.span,{style:{color:`#CF222E`,\"--shiki-dark\":`#D4D4D4`},children:`+`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:` timedelta(`}),_jsx(_components.span,{style:{color:`#953800`,\"--shiki-dark\":`#9CDCFE`},children:`weeks`}),_jsx(_components.span,{style:{color:`#CF222E`,\"--shiki-dark\":`#D4D4D4`},children:`=`}),_jsx(_components.span,{style:{color:`#0550AE`,\"--shiki-dark\":`#B5CEA8`},children:`2`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`)).timestamp()), `}),_jsx(_components.span,{style:{color:`#6E7781`,\"--shiki-dark\":`#6A9955`},children:`# 2 week session expiration`})]}),`\n`,_jsxs(_components.span,{className:`line`,children:[_jsx(_components.span,{style:{color:`#0A3069`,\"--shiki-dark\":`#CE9178`},children:` 'groups'`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`: [`}),_jsx(_components.span,{style:{color:`#0A3069`,\"--shiki-dark\":`#CE9178`},children:`'admin'`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`] `}),_jsx(_components.span,{style:{color:`#CF222E`,\"--shiki-dark\":`#C586C0`},children:`if`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:` current_user.is_admin `}),_jsx(_components.span,{style:{color:`#CF222E`,\"--shiki-dark\":`#C586C0`},children:`else`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:` [],`})]}),`\n`,_jsxs(_components.span,{className:`line`,children:[_jsx(_components.span,{style:{color:`#0A3069`,\"--shiki-dark\":`#CE9178`},children:` 'apiPlaygroundInputs'`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`: {`})]}),`\n`,_jsxs(_components.span,{className:`line`,children:[_jsx(_components.span,{style:{color:`#0A3069`,\"--shiki-dark\":`#CE9178`},children:` 'header'`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`: {`})]}),`\n`,_jsxs(_components.span,{className:`line`,children:[_jsx(_components.span,{style:{color:`#0A3069`,\"--shiki-dark\":`#CE9178`},children:` 'Authorization'`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`: `}),_jsx(_components.span,{style:{color:`#CF222E`,\"--shiki-dark\":`#569CD6`},children:`f`}),_jsx(_components.span,{style:{color:`#0A3069`,\"--shiki-dark\":`#CE9178`},children:`'Bearer `}),_jsx(_components.span,{style:{color:`#CF222E`,\"--shiki-dark\":`#569CD6`},children:`{`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`current_user.api_key`}),_jsx(_components.span,{style:{color:`#CF222E`,\"--shiki-dark\":`#569CD6`},children:`}`}),_jsx(_components.span,{style:{color:`#0A3069`,\"--shiki-dark\":`#CE9178`},children:`'`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`,`})]}),`\n`,_jsx(_components.span,{className:`line`,children:_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:` },`})}),`\n`,_jsx(_components.span,{className:`line`,children:_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:` },`})}),`\n`,_jsx(_components.span,{className:`line`,children:_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:` },`})}),`\n`,_jsxs(_components.span,{className:`line`,children:[_jsx(_components.span,{style:{color:`#953800`,\"--shiki-dark\":`#9CDCFE`},children:` key`}),_jsx(_components.span,{style:{color:`#CF222E`,\"--shiki-dark\":`#D4D4D4`},children:`=`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`private_key,`})]}),`\n`,_jsxs(_components.span,{className:`line`,children:[_jsx(_components.span,{style:{color:`#953800`,\"--shiki-dark\":`#9CDCFE`},children:` algorithm`}),_jsx(_components.span,{style:{color:`#CF222E`,\"--shiki-dark\":`#D4D4D4`},children:`=`}),_jsx(_components.span,{style:{color:`#0A3069`,\"--shiki-dark\":`#CE9178`},children:`'EdDSA'`})]}),`\n`,_jsx(_components.span,{className:`line`,children:_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:` )`})}),`\n`,_jsx(_components.span,{className:`line`}),`\n`,_jsxs(_components.span,{className:`line`,children:[_jsx(_components.span,{style:{color:`#CF222E`,\"--shiki-dark\":`#C586C0`},children:` return`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:` RedirectResponse(`}),_jsx(_components.span,{style:{color:`#953800`,\"--shiki-dark\":`#9CDCFE`},children:`url`}),_jsx(_components.span,{style:{color:`#CF222E`,\"--shiki-dark\":`#D4D4D4`},children:`=`}),_jsx(_components.span,{style:{color:`#CF222E`,\"--shiki-dark\":`#569CD6`},children:`f`}),_jsx(_components.span,{style:{color:`#0A3069`,\"--shiki-dark\":`#CE9178`},children:`'https://`}),_jsx(_components.span,{style:{color:`#CF222E`,\"--shiki-dark\":`#569CD6`},children:`{`}),_jsx(_components.span,{style:{color:`#0550AE`,\"--shiki-dark\":`#D4D4D4`},children:`DOCS_HOST`}),_jsx(_components.span,{style:{color:`#CF222E`,\"--shiki-dark\":`#569CD6`},children:`}`}),_jsx(_components.span,{style:{color:`#0A3069`,\"--shiki-dark\":`#CE9178`},children:`/login/jwt-callback#`}),_jsx(_components.span,{style:{color:`#CF222E`,\"--shiki-dark\":`#569CD6`},children:`{`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`jwt_token`}),_jsx(_components.span,{style:{color:`#CF222E`,\"--shiki-dark\":`#569CD6`},children:`}`}),_jsx(_components.span,{style:{color:`#0A3069`,\"--shiki-dark\":`#CE9178`},children:`'`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`, `}),_jsx(_components.span,{style:{color:`#953800`,\"--shiki-dark\":`#9CDCFE`},children:`status_code`}),_jsx(_components.span,{style:{color:`#CF222E`,\"--shiki-dark\":`#D4D4D4`},children:`=`}),_jsx(_components.span,{style:{color:`#0550AE`,\"--shiki-dark\":`#B5CEA8`},children:`302`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`)`})]}),`\n`]})})})]}),_jsx(Heading,{level:`3`,id:`redirect-unauthenticated-users`,children:`Redirect unauthenticated users`}),_jsx(_components.p,{children:`When an unauthenticated user tries to access a protected page, the redirect to your login URL preserves the user’s intended destination.`}),_jsxs(_components.ol,{children:[`\n`,_jsxs(_components.li,{children:[`User attempts to visit a protected page: `,_jsx(_components.code,{children:`https://docs.foo.com/quickstart`}),`.`]}),`\n`,_jsxs(_components.li,{children:[`Redirect to your login URL with a redirect query parameter: `,_jsx(_components.code,{children:`https://foo.com/docs-login?redirect=%2Fquickstart`}),`.`]}),`\n`,_jsxs(_components.li,{children:[`After authentication, redirect to `,_jsx(_components.code,{children:`https://docs.foo.com/login/jwt-callback?redirect=%2Fquickstart#{SIGNED_JWT}`}),`.`]}),`\n`,_jsx(_components.li,{children:`User lands in their original destination.`}),`\n`]})]})]}),`\n`,_jsx(Heading,{level:`2`,id:`make-pages-public`,children:`Make pages public`}),`\n`,_jsxs(_components.p,{children:[`When using authentication, all pages require authentication to access by default. You can make specific pages viewable without authentication at the page or group level with the `,_jsx(_components.code,{children:`public`}),` property.`]}),`\n`,_jsx(Heading,{level:`3`,id:`individual-pages`,children:`Individual pages`}),`\n`,_jsxs(_components.p,{children:[`To make a page public, add `,_jsx(_components.code,{children:`public: true`}),` to the page’s frontmatter.`]}),`\n`,_jsx(CodeBlock,{filename:`Public page example`,numberOfLines:`4`,language:`mdx`,children:_jsx(_components.pre,{className:`shiki shiki-themes github-light-default dark-plus`,style:{backgroundColor:`#ffffff`,\"--shiki-dark-bg\":`#0B0C0E`,color:`#1f2328`,\"--shiki-dark\":`#D4D4D4`},language:`mdx`,children:_jsxs(_components.code,{language:`mdx`,numberOfLines:`4`,children:[_jsx(_components.span,{className:`line`,children:_jsx(_components.span,{style:{color:`#0A3069`,\"--shiki-dark\":`#CE9178`},children:`---`})}),`\n`,_jsxs(_components.span,{className:`line`,children:[_jsx(_components.span,{style:{color:`#116329`,\"--shiki-dark\":`#569CD6`},children:`title`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`: `}),_jsx(_components.span,{style:{color:`#0A3069`,\"--shiki-dark\":`#CE9178`},children:`\"Public page\"`})]}),`\n`,_jsxs(_components.span,{className:`line`,children:[_jsx(_components.span,{style:{color:`#116329`,\"--shiki-dark\":`#569CD6`},children:`public`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`: `}),_jsx(_components.span,{style:{color:`#0550AE`,\"--shiki-dark\":`#569CD6`},children:`true`})]}),`\n`,_jsx(_components.span,{className:`line`,children:_jsx(_components.span,{style:{color:`#0A3069`,\"--shiki-dark\":`#CE9178`},children:`---`})}),`\n`]})})}),`\n`,_jsx(Heading,{level:`3`,id:`groups-of-pages`,children:`Groups of pages`}),`\n`,_jsxs(_components.p,{children:[`To make all pages in a group public, add `,_jsx(_components.code,{children:`\"public\": true`}),` beneath the group’s name in the `,_jsx(_components.code,{children:`navigation`}),` object of your `,_jsx(_components.code,{children:`docs.json`}),`.`]}),`\n`,_jsx(CodeBlock,{filename:`Public group example`,numberOfLines:`24`,language:`json`,children:_jsx(_components.pre,{className:`shiki shiki-themes github-light-default dark-plus`,style:{backgroundColor:`#ffffff`,\"--shiki-dark-bg\":`#0B0C0E`,color:`#1f2328`,\"--shiki-dark\":`#D4D4D4`},language:`json`,children:_jsxs(_components.code,{language:`json`,numberOfLines:`24`,children:[_jsx(_components.span,{className:`line`,children:_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`{`})}),`\n`,_jsxs(_components.span,{className:`line`,children:[_jsx(_components.span,{style:{color:`#116329`,\"--shiki-dark\":`#9CDCFE`},children:` \"navigation\"`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`: {`})]}),`\n`,_jsxs(_components.span,{className:`line`,children:[_jsx(_components.span,{style:{color:`#116329`,\"--shiki-dark\":`#9CDCFE`},children:` \"groups\"`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`: [`})]}),`\n`,_jsx(_components.span,{className:`line`,children:_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:` {`})}),`\n`,_jsxs(_components.span,{className:`line`,children:[_jsx(_components.span,{style:{color:`#116329`,\"--shiki-dark\":`#9CDCFE`},children:` \"group\"`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`: `}),_jsx(_components.span,{style:{color:`#0A3069`,\"--shiki-dark\":`#CE9178`},children:`\"Public group\"`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`,`})]}),`\n`,_jsxs(_components.span,{className:`line`,children:[_jsx(_components.span,{style:{color:`#116329`,\"--shiki-dark\":`#9CDCFE`},children:` \"public\"`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`: `}),_jsx(_components.span,{style:{color:`#0550AE`,\"--shiki-dark\":`#569CD6`},children:`true`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`,`})]}),`\n`,_jsxs(_components.span,{className:`line`,children:[_jsx(_components.span,{style:{color:`#116329`,\"--shiki-dark\":`#9CDCFE`},children:` \"icon\"`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`: `}),_jsx(_components.span,{style:{color:`#0A3069`,\"--shiki-dark\":`#CE9178`},children:`\"play\"`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`,`})]}),`\n`,_jsxs(_components.span,{className:`line`,children:[_jsx(_components.span,{style:{color:`#116329`,\"--shiki-dark\":`#9CDCFE`},children:` \"pages\"`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`: [`})]}),`\n`,_jsxs(_components.span,{className:`line`,children:[_jsx(_components.span,{style:{color:`#0A3069`,\"--shiki-dark\":`#CE9178`},children:` \"quickstart\"`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`,`})]}),`\n`,_jsxs(_components.span,{className:`line`,children:[_jsx(_components.span,{style:{color:`#0A3069`,\"--shiki-dark\":`#CE9178`},children:` \"installation\"`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`,`})]}),`\n`,_jsx(_components.span,{className:`line`,children:_jsx(_components.span,{style:{color:`#0A3069`,\"--shiki-dark\":`#CE9178`},children:` \"settings\"`})}),`\n`,_jsx(_components.span,{className:`line`,children:_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:` ]`})}),`\n`,_jsx(_components.span,{className:`line`,children:_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:` },`})}),`\n`,_jsx(_components.span,{className:`line`,children:_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:` {`})}),`\n`,_jsxs(_components.span,{className:`line`,children:[_jsx(_components.span,{style:{color:`#116329`,\"--shiki-dark\":`#9CDCFE`},children:` \"group\"`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`: `}),_jsx(_components.span,{style:{color:`#0A3069`,\"--shiki-dark\":`#CE9178`},children:`\"Private group\"`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`,`})]}),`\n`,_jsxs(_components.span,{className:`line`,children:[_jsx(_components.span,{style:{color:`#116329`,\"--shiki-dark\":`#9CDCFE`},children:` \"icon\"`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`: `}),_jsx(_components.span,{style:{color:`#0A3069`,\"--shiki-dark\":`#CE9178`},children:`\"pause\"`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`,`})]}),`\n`,_jsxs(_components.span,{className:`line`,children:[_jsx(_components.span,{style:{color:`#116329`,\"--shiki-dark\":`#9CDCFE`},children:` \"pages\"`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`: [`})]}),`\n`,_jsxs(_components.span,{className:`line`,children:[_jsx(_components.span,{style:{color:`#0A3069`,\"--shiki-dark\":`#CE9178`},children:` \"private-information\"`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`,`})]}),`\n`,_jsx(_components.span,{className:`line`,children:_jsx(_components.span,{style:{color:`#0A3069`,\"--shiki-dark\":`#CE9178`},children:` \"secret-settings\"`})}),`\n`,_jsx(_components.span,{className:`line`,children:_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:` ]`})}),`\n`,_jsx(_components.span,{className:`line`,children:_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:` }`})}),`\n`,_jsx(_components.span,{className:`line`,children:_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:` ]`})}),`\n`,_jsx(_components.span,{className:`line`,children:_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:` }`})}),`\n`,_jsx(_components.span,{className:`line`,children:_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`}`})}),`\n`]})})}),`\n`,_jsx(Heading,{level:`2`,id:`control-access-with-groups`,children:`Control access with groups`}),`\n`,_jsx(_components.p,{children:`When you use OAuth or JWT authentication, you can restrict specific pages to certain user groups. This is useful when you want different users to see different content based on their role or attributes.`}),`\n`,_jsxs(_components.p,{children:[`Manage groups through user data passed during authentication. See `,_jsx(_components.a,{href:`#user-data-format`,children:`User data format`}),` for details.`]}),`\n`,_jsx(CodeBlock,{filename:`Example user info`,numberOfLines:`4`,language:`json`,children:_jsx(_components.pre,{className:`shiki shiki-themes github-light-default dark-plus`,style:{backgroundColor:`#ffffff`,\"--shiki-dark-bg\":`#0B0C0E`,color:`#1f2328`,\"--shiki-dark\":`#D4D4D4`},language:`json`,children:_jsxs(_components.code,{language:`json`,numberOfLines:`4`,children:[_jsx(_components.span,{className:`line`,children:_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`{`})}),`\n`,_jsxs(_components.span,{className:`line`,children:[_jsx(_components.span,{style:{color:`#116329`,\"--shiki-dark\":`#9CDCFE`},children:` \"groups\"`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`: [`}),_jsx(_components.span,{style:{color:`#0A3069`,\"--shiki-dark\":`#CE9178`},children:`\"admin\"`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`, `}),_jsx(_components.span,{style:{color:`#0A3069`,\"--shiki-dark\":`#CE9178`},children:`\"beta-users\"`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`],`})]}),`\n`,_jsxs(_components.span,{className:`line`,children:[_jsx(_components.span,{style:{color:`#116329`,\"--shiki-dark\":`#9CDCFE`},children:` \"expiresAt\"`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`: `}),_jsx(_components.span,{style:{color:`#0550AE`,\"--shiki-dark\":`#B5CEA8`},children:`1893456000`})]}),`\n`,_jsx(_components.span,{className:`line`,children:_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`}`})}),`\n`]})})}),`\n`,_jsxs(_components.p,{children:[`Specify which groups can access specific pages using the `,_jsx(_components.code,{children:`groups`}),` property in frontmatter.`]}),`\n`,_jsx(CodeBlock,{filename:`Example page restricted to the admin group`,highlight:`[3]`,numberOfLines:`4`,language:`mdx`,children:_jsx(_components.pre,{className:`shiki shiki-themes github-light-default dark-plus`,style:{backgroundColor:`#ffffff`,\"--shiki-dark-bg\":`#0B0C0E`,color:`#1f2328`,\"--shiki-dark\":`#D4D4D4`},language:`mdx`,children:_jsxs(_components.code,{language:`mdx`,numberOfLines:`4`,children:[_jsx(_components.span,{className:`line`,children:_jsx(_components.span,{style:{color:`#0A3069`,\"--shiki-dark\":`#CE9178`},children:`---`})}),`\n`,_jsxs(_components.span,{className:`line`,children:[_jsx(_components.span,{style:{color:`#116329`,\"--shiki-dark\":`#569CD6`},children:`title`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`: `}),_jsx(_components.span,{style:{color:`#0A3069`,\"--shiki-dark\":`#CE9178`},children:`\"Admin dashboard\"`})]}),`\n`,_jsxs(_components.span,{className:`line line-highlight`,children:[_jsx(_components.span,{style:{color:`#116329`,\"--shiki-dark\":`#569CD6`},children:`groups`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`: [`}),_jsx(_components.span,{style:{color:`#0A3069`,\"--shiki-dark\":`#CE9178`},children:`\"admin\"`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`]`})]}),`\n`,_jsx(_components.span,{className:`line`,children:_jsx(_components.span,{style:{color:`#0A3069`,\"--shiki-dark\":`#CE9178`},children:`---`})}),`\n`]})})}),`\n`,_jsx(_components.p,{children:`Users must belong to at least one of the listed groups to access the page. If a user tries to access a page without the required group, they’ll receive a 404 error.`}),`\n`,_jsx(Heading,{level:`3`,id:`how-groups-interact-with-public-pages`,children:`How groups interact with public pages`}),`\n`,_jsxs(_components.ul,{children:[`\n`,_jsx(_components.li,{children:`All pages require authentication by default.`}),`\n`,_jsxs(_components.li,{children:[`Pages with a `,_jsx(_components.code,{children:`groups`}),` property are only accessible to authenticated users in those groups.`]}),`\n`,_jsxs(_components.li,{children:[`Pages without a `,_jsx(_components.code,{children:`groups`}),` property are accessible to all authenticated users.`]}),`\n`,_jsxs(_components.li,{children:[`Pages with `,_jsx(_components.code,{children:`public: true`}),` and no `,_jsx(_components.code,{children:`groups`}),` property are accessible to everyone.`]}),`\n`]}),`\n`,_jsxs(CodeGroup,{children:[_jsx(CodeBlock,{filename:`Public page`,numberOfLines:`4`,language:`mdx`,children:_jsx(_components.pre,{className:`shiki shiki-themes github-light-default dark-plus`,style:{backgroundColor:`#ffffff`,\"--shiki-dark-bg\":`#0B0C0E`,color:`#1f2328`,\"--shiki-dark\":`#D4D4D4`},language:`mdx`,children:_jsxs(_components.code,{language:`mdx`,numberOfLines:`4`,children:[_jsx(_components.span,{className:`line`,children:_jsx(_components.span,{style:{color:`#0A3069`,\"--shiki-dark\":`#CE9178`},children:`---`})}),`\n`,_jsxs(_components.span,{className:`line`,children:[_jsx(_components.span,{style:{color:`#116329`,\"--shiki-dark\":`#569CD6`},children:`title`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`: `}),_jsx(_components.span,{style:{color:`#0A3069`,\"--shiki-dark\":`#CE9178`},children:`\"Public guide\"`})]}),`\n`,_jsxs(_components.span,{className:`line`,children:[_jsx(_components.span,{style:{color:`#116329`,\"--shiki-dark\":`#569CD6`},children:`public`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`: `}),_jsx(_components.span,{style:{color:`#0550AE`,\"--shiki-dark\":`#569CD6`},children:`true`})]}),`\n`,_jsx(_components.span,{className:`line`,children:_jsx(_components.span,{style:{color:`#0A3069`,\"--shiki-dark\":`#CE9178`},children:`---`})}),`\n`]})})}),_jsx(CodeBlock,{filename:`Protected page`,numberOfLines:`3`,language:`mdx`,children:_jsx(_components.pre,{className:`shiki shiki-themes github-light-default dark-plus`,style:{backgroundColor:`#ffffff`,\"--shiki-dark-bg\":`#0B0C0E`,color:`#1f2328`,\"--shiki-dark\":`#D4D4D4`},language:`mdx`,children:_jsxs(_components.code,{language:`mdx`,numberOfLines:`3`,children:[_jsx(_components.span,{className:`line`,children:_jsx(_components.span,{style:{color:`#0A3069`,\"--shiki-dark\":`#CE9178`},children:`---`})}),`\n`,_jsxs(_components.span,{className:`line`,children:[_jsx(_components.span,{style:{color:`#116329`,\"--shiki-dark\":`#569CD6`},children:`title`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`: `}),_jsx(_components.span,{style:{color:`#0A3069`,\"--shiki-dark\":`#CE9178`},children:`\"API reference\"`})]}),`\n`,_jsx(_components.span,{className:`line`,children:_jsx(_components.span,{style:{color:`#0A3069`,\"--shiki-dark\":`#CE9178`},children:`---`})}),`\n`]})})}),_jsx(CodeBlock,{filename:`Protected page with groups`,numberOfLines:`4`,language:`mdx`,children:_jsx(_components.pre,{className:`shiki shiki-themes github-light-default dark-plus`,style:{backgroundColor:`#ffffff`,\"--shiki-dark-bg\":`#0B0C0E`,color:`#1f2328`,\"--shiki-dark\":`#D4D4D4`},language:`mdx`,children:_jsxs(_components.code,{language:`mdx`,numberOfLines:`4`,children:[_jsx(_components.span,{className:`line`,children:_jsx(_components.span,{style:{color:`#0A3069`,\"--shiki-dark\":`#CE9178`},children:`---`})}),`\n`,_jsxs(_components.span,{className:`line`,children:[_jsx(_components.span,{style:{color:`#116329`,\"--shiki-dark\":`#569CD6`},children:`title`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`: `}),_jsx(_components.span,{style:{color:`#0A3069`,\"--shiki-dark\":`#CE9178`},children:`\"Advanced configurations\"`})]}),`\n`,_jsxs(_components.span,{className:`line`,children:[_jsx(_components.span,{style:{color:`#116329`,\"--shiki-dark\":`#569CD6`},children:`groups`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`: [`}),_jsx(_components.span,{style:{color:`#0A3069`,\"--shiki-dark\":`#CE9178`},children:`\"pro\"`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`, `}),_jsx(_components.span,{style:{color:`#0A3069`,\"--shiki-dark\":`#CE9178`},children:`\"enterprise\"`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`]`})]}),`\n`,_jsx(_components.span,{className:`line`,children:_jsx(_components.span,{style:{color:`#0A3069`,\"--shiki-dark\":`#CE9178`},children:`---`})}),`\n`]})})})]}),`\n`,_jsx(Heading,{level:`2`,id:`user-data-format`,children:`User data format`}),`\n`,_jsxs(_components.p,{children:[`When using OAuth or JWT authentication or standalone personalization, your system returns user data that controls session length, group membership, and `,_jsx(_components.a,{href:`/create/personalization`,children:`content personalization`}),`.`]}),`\n`,_jsxs(CodeGroup,{children:[_jsx(CodeBlock,{filename:`Format`,numberOfLines:`13`,language:`tsx`,children:_jsx(_components.pre,{className:`shiki shiki-themes github-light-default dark-plus`,style:{backgroundColor:`#ffffff`,\"--shiki-dark-bg\":`#0B0C0E`,color:`#1f2328`,\"--shiki-dark\":`#D4D4D4`},language:`tsx`,children:_jsxs(_components.code,{language:`tsx`,numberOfLines:`13`,children:[_jsxs(_components.span,{className:`line`,children:[_jsx(_components.span,{style:{color:`#CF222E`,\"--shiki-dark\":`#569CD6`},children:`type`}),_jsx(_components.span,{style:{color:`#953800`,\"--shiki-dark\":`#4EC9B0`},children:` User`}),_jsx(_components.span,{style:{color:`#CF222E`,\"--shiki-dark\":`#D4D4D4`},children:` =`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:` {`})]}),`\n`,_jsxs(_components.span,{className:`line`,children:[_jsx(_components.span,{style:{color:`#953800`,\"--shiki-dark\":`#9CDCFE`},children:` host`}),_jsx(_components.span,{style:{color:`#CF222E`,\"--shiki-dark\":`#D4D4D4`},children:`?:`}),_jsx(_components.span,{style:{color:`#0550AE`,\"--shiki-dark\":`#4EC9B0`},children:` string`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`;`})]}),`\n`,_jsxs(_components.span,{className:`line`,children:[_jsx(_components.span,{style:{color:`#953800`,\"--shiki-dark\":`#9CDCFE`},children:` expiresAt`}),_jsx(_components.span,{style:{color:`#CF222E`,\"--shiki-dark\":`#D4D4D4`},children:`?:`}),_jsx(_components.span,{style:{color:`#0550AE`,\"--shiki-dark\":`#4EC9B0`},children:` number`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`;`})]}),`\n`,_jsxs(_components.span,{className:`line`,children:[_jsx(_components.span,{style:{color:`#953800`,\"--shiki-dark\":`#9CDCFE`},children:` groups`}),_jsx(_components.span,{style:{color:`#CF222E`,\"--shiki-dark\":`#D4D4D4`},children:`?:`}),_jsx(_components.span,{style:{color:`#0550AE`,\"--shiki-dark\":`#4EC9B0`},children:` string`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`[];`})]}),`\n`,_jsxs(_components.span,{className:`line`,children:[_jsx(_components.span,{style:{color:`#953800`,\"--shiki-dark\":`#9CDCFE`},children:` content`}),_jsx(_components.span,{style:{color:`#CF222E`,\"--shiki-dark\":`#D4D4D4`},children:`?:`}),_jsx(_components.span,{style:{color:`#953800`,\"--shiki-dark\":`#4EC9B0`},children:` Record`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`\u003c`}),_jsx(_components.span,{style:{color:`#0550AE`,\"--shiki-dark\":`#4EC9B0`},children:`string`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`, `}),_jsx(_components.span,{style:{color:`#0550AE`,\"--shiki-dark\":`#4EC9B0`},children:`any`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`>;`})]}),`\n`,_jsxs(_components.span,{className:`line`,children:[_jsx(_components.span,{style:{color:`#953800`,\"--shiki-dark\":`#9CDCFE`},children:` apiPlaygroundInputs`}),_jsx(_components.span,{style:{color:`#CF222E`,\"--shiki-dark\":`#D4D4D4`},children:`?:`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:` {`})]}),`\n`,_jsxs(_components.span,{className:`line`,children:[_jsx(_components.span,{style:{color:`#953800`,\"--shiki-dark\":`#9CDCFE`},children:` server`}),_jsx(_components.span,{style:{color:`#CF222E`,\"--shiki-dark\":`#D4D4D4`},children:`?:`}),_jsx(_components.span,{style:{color:`#953800`,\"--shiki-dark\":`#4EC9B0`},children:` Record`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`\u003c`}),_jsx(_components.span,{style:{color:`#0550AE`,\"--shiki-dark\":`#4EC9B0`},children:`string`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`, `}),_jsx(_components.span,{style:{color:`#0550AE`,\"--shiki-dark\":`#4EC9B0`},children:`string`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`>;`})]}),`\n`,_jsxs(_components.span,{className:`line`,children:[_jsx(_components.span,{style:{color:`#953800`,\"--shiki-dark\":`#9CDCFE`},children:` header`}),_jsx(_components.span,{style:{color:`#CF222E`,\"--shiki-dark\":`#D4D4D4`},children:`?:`}),_jsx(_components.span,{style:{color:`#953800`,\"--shiki-dark\":`#4EC9B0`},children:` Record`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`\u003c`}),_jsx(_components.span,{style:{color:`#0550AE`,\"--shiki-dark\":`#4EC9B0`},children:`string`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`, `}),_jsx(_components.span,{style:{color:`#0550AE`,\"--shiki-dark\":`#4EC9B0`},children:`unknown`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`>;`})]}),`\n`,_jsxs(_components.span,{className:`line`,children:[_jsx(_components.span,{style:{color:`#953800`,\"--shiki-dark\":`#9CDCFE`},children:` query`}),_jsx(_components.span,{style:{color:`#CF222E`,\"--shiki-dark\":`#D4D4D4`},children:`?:`}),_jsx(_components.span,{style:{color:`#953800`,\"--shiki-dark\":`#4EC9B0`},children:` Record`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`\u003c`}),_jsx(_components.span,{style:{color:`#0550AE`,\"--shiki-dark\":`#4EC9B0`},children:`string`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`, `}),_jsx(_components.span,{style:{color:`#0550AE`,\"--shiki-dark\":`#4EC9B0`},children:`unknown`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`>;`})]}),`\n`,_jsxs(_components.span,{className:`line`,children:[_jsx(_components.span,{style:{color:`#953800`,\"--shiki-dark\":`#9CDCFE`},children:` cookie`}),_jsx(_components.span,{style:{color:`#CF222E`,\"--shiki-dark\":`#D4D4D4`},children:`?:`}),_jsx(_components.span,{style:{color:`#953800`,\"--shiki-dark\":`#4EC9B0`},children:` Record`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`\u003c`}),_jsx(_components.span,{style:{color:`#0550AE`,\"--shiki-dark\":`#4EC9B0`},children:`string`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`, `}),_jsx(_components.span,{style:{color:`#0550AE`,\"--shiki-dark\":`#4EC9B0`},children:`unknown`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`>;`})]}),`\n`,_jsxs(_components.span,{className:`line`,children:[_jsx(_components.span,{style:{color:`#953800`,\"--shiki-dark\":`#9CDCFE`},children:` path`}),_jsx(_components.span,{style:{color:`#CF222E`,\"--shiki-dark\":`#D4D4D4`},children:`?:`}),_jsx(_components.span,{style:{color:`#953800`,\"--shiki-dark\":`#4EC9B0`},children:` Record`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`\u003c`}),_jsx(_components.span,{style:{color:`#0550AE`,\"--shiki-dark\":`#4EC9B0`},children:`string`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`, `}),_jsx(_components.span,{style:{color:`#0550AE`,\"--shiki-dark\":`#4EC9B0`},children:`unknown`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`>;`})]}),`\n`,_jsx(_components.span,{className:`line`,children:_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:` };`})}),`\n`,_jsx(_components.span,{className:`line`,children:_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`};`})}),`\n`]})})}),_jsx(CodeBlock,{filename:`Example`,numberOfLines:`17`,language:`json`,children:_jsx(_components.pre,{className:`shiki shiki-themes github-light-default dark-plus`,style:{backgroundColor:`#ffffff`,\"--shiki-dark-bg\":`#0B0C0E`,color:`#1f2328`,\"--shiki-dark\":`#D4D4D4`},language:`json`,children:_jsxs(_components.code,{language:`json`,numberOfLines:`17`,children:[_jsx(_components.span,{className:`line`,children:_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`{`})}),`\n`,_jsxs(_components.span,{className:`line`,children:[_jsx(_components.span,{style:{color:`#116329`,\"--shiki-dark\":`#9CDCFE`},children:` \"host\"`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`: `}),_jsx(_components.span,{style:{color:`#0A3069`,\"--shiki-dark\":`#CE9178`},children:`\"docs.example.com\"`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`,`})]}),`\n`,_jsxs(_components.span,{className:`line`,children:[_jsx(_components.span,{style:{color:`#116329`,\"--shiki-dark\":`#9CDCFE`},children:` \"expiresAt\"`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`: `}),_jsx(_components.span,{style:{color:`#0550AE`,\"--shiki-dark\":`#B5CEA8`},children:`1893456000`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`,`})]}),`\n`,_jsxs(_components.span,{className:`line`,children:[_jsx(_components.span,{style:{color:`#116329`,\"--shiki-dark\":`#9CDCFE`},children:` \"groups\"`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`: [`}),_jsx(_components.span,{style:{color:`#0A3069`,\"--shiki-dark\":`#CE9178`},children:`\"admin\"`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`, `}),_jsx(_components.span,{style:{color:`#0A3069`,\"--shiki-dark\":`#CE9178`},children:`\"beta-users\"`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`],`})]}),`\n`,_jsxs(_components.span,{className:`line`,children:[_jsx(_components.span,{style:{color:`#116329`,\"--shiki-dark\":`#9CDCFE`},children:` \"content\"`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`: {`})]}),`\n`,_jsxs(_components.span,{className:`line`,children:[_jsx(_components.span,{style:{color:`#116329`,\"--shiki-dark\":`#9CDCFE`},children:` \"firstName\"`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`: `}),_jsx(_components.span,{style:{color:`#0A3069`,\"--shiki-dark\":`#CE9178`},children:`\"Jane\"`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`,`})]}),`\n`,_jsxs(_components.span,{className:`line`,children:[_jsx(_components.span,{style:{color:`#116329`,\"--shiki-dark\":`#9CDCFE`},children:` \"company\"`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`: `}),_jsx(_components.span,{style:{color:`#0A3069`,\"--shiki-dark\":`#CE9178`},children:`\"Acme Corp\"`})]}),`\n`,_jsx(_components.span,{className:`line`,children:_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:` },`})}),`\n`,_jsxs(_components.span,{className:`line`,children:[_jsx(_components.span,{style:{color:`#116329`,\"--shiki-dark\":`#9CDCFE`},children:` \"apiPlaygroundInputs\"`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`: {`})]}),`\n`,_jsxs(_components.span,{className:`line`,children:[_jsx(_components.span,{style:{color:`#116329`,\"--shiki-dark\":`#9CDCFE`},children:` \"header\"`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`: {`})]}),`\n`,_jsxs(_components.span,{className:`line`,children:[_jsx(_components.span,{style:{color:`#116329`,\"--shiki-dark\":`#9CDCFE`},children:` \"Authorization\"`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`: `}),_jsx(_components.span,{style:{color:`#0A3069`,\"--shiki-dark\":`#CE9178`},children:`\"Bearer user_abc123\"`})]}),`\n`,_jsx(_components.span,{className:`line`,children:_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:` },`})}),`\n`,_jsxs(_components.span,{className:`line`,children:[_jsx(_components.span,{style:{color:`#116329`,\"--shiki-dark\":`#9CDCFE`},children:` \"server\"`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`: {`})]}),`\n`,_jsxs(_components.span,{className:`line`,children:[_jsx(_components.span,{style:{color:`#116329`,\"--shiki-dark\":`#9CDCFE`},children:` \"baseUrl\"`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`: `}),_jsx(_components.span,{style:{color:`#0A3069`,\"--shiki-dark\":`#CE9178`},children:`\"https://api.foo.com\"`})]}),`\n`,_jsx(_components.span,{className:`line`,children:_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:` }`})}),`\n`,_jsx(_components.span,{className:`line`,children:_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:` }`})}),`\n`,_jsx(_components.span,{className:`line`,children:_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`}`})}),`\n`]})})})]}),`\n`,_jsx(ParamField,{path:`host`,type:`string`,id:`param-host`,children:_jsxs(_components.p,{children:[_jsx(_components.strong,{children:`Required for JWT authentication.`}),` The hostname of your documentation site. The string must exactly match the domain where you deploy your documentation. Mintlify validates that the JWT’s host matches the requesting host to prevent token reuse across different sites.`]})}),`\n`,_jsxs(ParamField,{path:`expiresAt`,type:`number`,id:`param-expires-at`,children:[_jsx(_components.p,{children:`Session expiration time in seconds since epoch. When the current time passes this value, Mintlify expires the stored user data. The visitor must authenticate again or repeat the identification flow to refresh it.`}),_jsxs(Warning,{children:[_jsx(_components.strong,{children:`For JWT:`}),` This differs from the JWT’s `,_jsx(_components.code,{children:`exp`}),` claim, which determines when a JWT is considered invalid. Set the JWT `,_jsx(_components.code,{children:`exp`}),` claim to a short duration (10 seconds or less) for security. Use `,_jsx(_components.code,{children:`expiresAt`}),` for the actual session length (hours to weeks).`]})]}),`\n`,_jsxs(ParamField,{path:`groups`,type:`string[]`,id:`param-groups`,children:[_jsxs(_components.p,{children:[`List of groups the user belongs to. With authentication, pages with matching `,_jsx(_components.code,{children:`groups`}),` in their frontmatter are accessible to this user. With standalone personalization, groups control page and content visibility but do not restrict access to a page’s direct URL.`]}),_jsxs(_components.p,{children:[_jsx(_components.strong,{children:`Example`}),`: A user with `,_jsx(_components.code,{children:`groups: [\"admin\", \"engineering\"]`}),` matches content tagged with either the `,_jsx(_components.code,{children:`admin`}),` or `,_jsx(_components.code,{children:`engineering`}),` groups.`]})]}),`\n`,_jsx(ParamField,{path:`content`,type:`Record\u003cstring, any>`,id:`param-content`,children:_jsxs(_components.p,{children:[`Custom data accessible in MDX pages via the `,_jsx(_components.code,{children:`user`}),` variable for `,_jsx(_components.a,{href:`/create/personalization#dynamic-mdx-content`,children:`personalized content`}),`.`]})}),`\n`,_jsxs(ParamField,{path:`apiPlaygroundInputs`,type:`object`,id:`param-api-playground-inputs`,children:[_jsx(_components.p,{children:`Prefills API playground fields with user-specific values. When a user authenticates, these values populate the corresponding input fields in the API playground. Users can override prefilled values, and their overrides persist in local storage.`}),_jsx(_components.p,{children:`Mintlify applies only values that match the current endpoint’s security scheme.`}),_jsxs(Expandable,{title:`properties`,children:[_jsx(ParamField,{path:`header`,type:`Record\u003cstring, unknown>`,id:`param-header`,children:_jsx(_components.p,{children:`Header values to prefill, keyed by header name.`})}),_jsx(ParamField,{path:`query`,type:`Record\u003cstring, unknown>`,id:`param-query`,children:_jsx(_components.p,{children:`Query parameter values to prefill, keyed by parameter name.`})}),_jsx(ParamField,{path:`cookie`,type:`Record\u003cstring, unknown>`,id:`param-cookie`,children:_jsx(_components.p,{children:`Cookie values to prefill, keyed by cookie name.`})}),_jsx(ParamField,{path:`server`,type:`Record\u003cstring, string>`,id:`param-server`,children:_jsx(_components.p,{children:`Server variable values to prefill, keyed by variable name.`})}),_jsx(ParamField,{path:`path`,type:`Record\u003cstring, unknown>`,id:`param-path`,children:_jsx(_components.p,{children:`Path parameter values to prefill, keyed by parameter name.`})})]})]}),`\n`,_jsx(Heading,{level:`2`,id:`feature-availability`,children:`Feature availability`}),`\n`,_jsx(_components.p,{children:`Some features behave differently or are unavailable when you enable authentication.`}),`\n`,_jsxs(Table,{children:[_jsx(_components.thead,{children:_jsxs(_components.tr,{children:[_jsx(_components.th,{style:{textAlign:`left`},children:`Feature`}),_jsx(_components.th,{style:{textAlign:`left`},children:`Public`}),_jsx(_components.th,{style:{textAlign:`left`},children:`Fully authenticated (all pages protected)`}),_jsx(_components.th,{style:{textAlign:`left`},children:`Partially authenticated (some public pages)`})]})}),_jsxs(_components.tbody,{children:[_jsxs(_components.tr,{children:[_jsx(_components.td,{style:{textAlign:`left`},children:_jsx(_components.a,{href:`/ai/llmstxt`,children:`llms.txt and llms-full.txt`})}),_jsx(_components.td,{style:{textAlign:`left`},children:`Full support`}),_jsx(_components.td,{style:{textAlign:`left`},children:`Available behind authentication, so AI tools may not be able to access the files`}),_jsx(_components.td,{style:{textAlign:`left`},children:`Publicly accessible, reflecting public pages only`})]}),_jsxs(_components.tr,{children:[_jsx(_components.td,{style:{textAlign:`left`},children:_jsx(_components.a,{href:`/ai/model-context-protocol`,children:`MCP server`})}),_jsx(_components.td,{style:{textAlign:`left`},children:`Full support`}),_jsx(_components.td,{style:{textAlign:`left`},children:`Requires authentication to connect`}),_jsx(_components.td,{style:{textAlign:`left`},children:`Available without authentication for public pages and with authentication for protected pages`})]}),_jsxs(_components.tr,{children:[_jsx(_components.td,{style:{textAlign:`left`},children:_jsx(_components.a,{href:`/ai/markdown-export`,children:`Markdown export`})}),_jsx(_components.td,{style:{textAlign:`left`},children:`Full support`}),_jsx(_components.td,{style:{textAlign:`left`},children:`Full support, respects user groups`}),_jsx(_components.td,{style:{textAlign:`left`},children:`Full support, respects user groups`})]}),_jsxs(_components.tr,{children:[_jsx(_components.td,{style:{textAlign:`left`},children:_jsx(_components.a,{href:`/optimize/pdf-exports`,children:`PDF export`})}),_jsx(_components.td,{style:{textAlign:`left`},children:`Full support`}),_jsx(_components.td,{style:{textAlign:`left`},children:`Full support, respects user groups. Authenticated pages export with images and assets included.`}),_jsx(_components.td,{style:{textAlign:`left`},children:`Full support, respects user groups. Authenticated pages export with images and assets included.`})]}),_jsxs(_components.tr,{children:[_jsx(_components.td,{style:{textAlign:`left`},children:_jsx(_components.a,{href:`/assistant/index`,children:`Search`})}),_jsx(_components.td,{style:{textAlign:`left`},children:`Full support`}),_jsx(_components.td,{style:{textAlign:`left`},children:`Full support, respects user groups`}),_jsx(_components.td,{style:{textAlign:`left`},children:`Full support, respects user groups`})]}),_jsxs(_components.tr,{children:[_jsx(_components.td,{style:{textAlign:`left`},children:_jsx(_components.a,{href:`/assistant/index`,children:`Assistant`})}),_jsx(_components.td,{style:{textAlign:`left`},children:`Full support`}),_jsx(_components.td,{style:{textAlign:`left`},children:`Full support, respects user groups`}),_jsx(_components.td,{style:{textAlign:`left`},children:`Full support, respects user groups`})]}),_jsxs(_components.tr,{children:[_jsx(_components.td,{style:{textAlign:`left`},children:_jsx(_components.a,{href:`/ai/skillmd`,children:`skill.md`})}),_jsx(_components.td,{style:{textAlign:`left`},children:`Full support`}),_jsx(_components.td,{style:{textAlign:`left`},children:`Not supported`}),_jsx(_components.td,{style:{textAlign:`left`},children:`Not supported`})]}),_jsxs(_components.tr,{children:[_jsx(_components.td,{style:{textAlign:`left`},children:_jsx(_components.a,{href:`/optimize/seo#sitemaps-and-robotstxt-files`,children:`Sitemap`})}),_jsx(_components.td,{style:{textAlign:`left`},children:`Full support`}),_jsx(_components.td,{style:{textAlign:`left`},children:`Available behind authentication, but excludes pages in groups`}),_jsx(_components.td,{style:{textAlign:`left`},children:`Available behind authentication, but excludes pages in groups`})]}),_jsxs(_components.tr,{children:[_jsx(_components.td,{style:{textAlign:`left`},children:_jsx(_components.a,{href:`/optimize/seo#sitemaps-and-robotstxt-files`,children:`robots.txt`})}),_jsx(_components.td,{style:{textAlign:`left`},children:`Full support`}),_jsx(_components.td,{style:{textAlign:`left`},children:`Available behind authentication`}),_jsx(_components.td,{style:{textAlign:`left`},children:`Available behind authentication`})]}),_jsxs(_components.tr,{children:[_jsx(_components.td,{style:{textAlign:`left`},children:_jsx(_components.a,{href:`/editor/review#live-preview`,children:`Live preview`})}),_jsx(_components.td,{style:{textAlign:`left`},children:`Full support`}),_jsx(_components.td,{style:{textAlign:`left`},children:`Supported for Mintlify authentication`}),_jsx(_components.td,{style:{textAlign:`left`},children:`Supported for Mintlify authentication`})]})]})]})]})}function MDXContent(props={}){const{wrapper:MDXLayout}={..._provideComponents(),...props.components};return MDXLayout?_jsx(MDXLayout,{...props,children:_jsx(_createMdxContent,{...props})}):_createMdxContent(props)}return{default:MDXContent};function _missingMdxReference(id,component){throw new Error(`Expected `+(component?`component`:`object`)+\" `\"+id+\"` to be defined: you likely forgot to import, pass, or provide it.\")}","frontmatter":{},"scope":{"config":{},"pageMetadata":{"title":"Authentication setup","description":"Set up user authentication to control access to pages and API references using password, OAuth, JWT, or Mintlify-managed private access.","keywords":["authentication","auth","OAuth","JWT","password","private"],"href":"/deploy/authentication-setup"}}},"mdxSourceWithNoJs":null},"mdxExtracts":{"tableOfContents":[{"title":"Choose an authentication method","slug":"choose-an-authentication-method","depth":2,"children":[]},{"title":"Configure authentication","slug":"configure-authentication","depth":2,"children":[{"title":"Password prerequisites","slug":"password-prerequisites","depth":3,"children":[],"tabId":"password"},{"title":"Password setup","slug":"password-setup","depth":3,"children":[],"tabId":"password"},{"title":"Password example","slug":"password-example","depth":3,"children":[],"tabId":"password"},{"title":"Private authentication prerequisites","slug":"private-authentication-prerequisites","depth":3,"children":[],"tabId":"private-authentication"},{"title":"Private authentication setup","slug":"private-authentication-setup","depth":3,"children":[],"tabId":"private-authentication"},{"title":"Private example","slug":"private-example","depth":3,"children":[],"tabId":"private-authentication"},{"title":"OAuth 2.0 prerequisites","slug":"oauth-2-0-prerequisites","depth":3,"children":[],"tabId":"oauth-2-0"},{"title":"OAuth 2.0 setup","slug":"oauth-2-0-setup","depth":3,"children":[],"tabId":"oauth-2-0"},{"title":"Use groups from OAuth token claims","slug":"use-groups-from-oauth-token-claims","depth":3,"children":[],"tabId":"oauth-2-0"},{"title":"OAuth 2.0 example","slug":"oauth-2-0-example","depth":3,"children":[],"tabId":"oauth-2-0"},{"title":"JWT prerequisites","slug":"jwt-prerequisites","depth":3,"children":[],"tabId":"jwt"},{"title":"JWT setup","slug":"jwt-setup","depth":3,"children":[],"tabId":"jwt"},{"title":"JWT example","slug":"jwt-example","depth":3,"children":[],"tabId":"jwt"},{"title":"Redirect unauthenticated users","slug":"redirect-unauthenticated-users","depth":3,"children":[],"tabId":"jwt"}]},{"title":"Make pages public","slug":"make-pages-public","depth":2,"children":[{"title":"Individual pages","slug":"individual-pages","depth":3,"children":[]},{"title":"Groups of pages","slug":"groups-of-pages","depth":3,"children":[]}]},{"title":"Control access with groups","slug":"control-access-with-groups","depth":2,"children":[{"title":"How groups interact with public pages","slug":"how-groups-interact-with-public-pages","depth":3,"children":[]}]},{"title":"User data format","slug":"user-data-format","depth":2,"children":[]},{"title":"Feature availability","slug":"feature-availability","depth":2,"children":[]}],"codeExamples":{}},"jsLinks":["/docs/_mintlify/custom/mintlify/e06454053253c379/common-room-analytics.js","/docs/_mintlify/custom/mintlify/f7e8fc99c1f5798c/reb2b-analytics.js"],"narration":{"path":"deploy/authentication-setup","locale":"en","estimatedDurationSec":717},"subdomain":"mintlify","siteName":"Mintlify","title":"Authentication setup - Mintlify","relatedPages":[{"title":"Preview locally","link":"cli/preview","breadcrumbs":["Documentation","Get started","CLI","Preview locally"],"icon":""},{"title":"Configure OAuth 2.0 authentication with Auth0","link":"help-center/configure-oauth-with-auth0","breadcrumbs":["Help center","Help center","Configure OAuth 2.0 authentication with Auth0"],"icon":""},{"title":"Quickstart","link":"quickstart","breadcrumbs":["Documentation","Get started","Quickstart"],"icon":""}],"relatedPagesConfig":{"enabled":true,"limit":3,"mode":"automatic"},"navMaps":{"firstHrefInVersion":{},"firstHrefInLanguage":{"en":{"href":"/deploy/authentication-setup","matchLevel":0},"fr":{"href":"/fr/deploy/authentication-setup","matchLevel":1},"es":{"href":"/es/deploy/authentication-setup","matchLevel":1},"zh":{"href":"/zh/deploy/authentication-setup","matchLevel":1}}},"lastModified":"2026-09-28T15:22:17.076Z","originalFileLocation":"deploy/authentication-setup.mdx","locale":"en"},"headHtml":"\u003cmeta data-mint-head name=\"description\" content=\"Set up user authentication to control access to pages and API references using password, OAuth, JWT, or Mintlify-managed private access.\">\u003cmeta data-mint-head name=\"application-name\" content=\"Mintlify\">\u003cmeta data-mint-head name=\"generator\" content=\"Mintlify\">\u003clink data-mint-head rel=\"apple-touch-icon\" type=\"image/x-icon\" sizes=\"180x180\" href=\"https://mintcdn.com/mintlify/HKyBg3pjnkyq1if1/favicon.ico?fit=max\u0026amp;auto=format\u0026amp;n=HKyBg3pjnkyq1if1\u0026amp;q=85\u0026amp;s=6f16cb0842f8e4b4ba8a05671aa661f9\">\u003clink data-mint-head rel=\"icon\" type=\"image/x-icon\" sizes=\"32x32\" href=\"https://mintcdn.com/mintlify/HKyBg3pjnkyq1if1/favicon.ico?fit=max\u0026amp;auto=format\u0026amp;n=HKyBg3pjnkyq1if1\u0026amp;q=85\u0026amp;s=6f16cb0842f8e4b4ba8a05671aa661f9\" media=\"(prefers-color-scheme: light)\">\u003clink data-mint-head rel=\"icon\" type=\"image/x-icon\" sizes=\"16x16\" href=\"https://mintcdn.com/mintlify/HKyBg3pjnkyq1if1/favicon.ico?fit=max\u0026amp;auto=format\u0026amp;n=HKyBg3pjnkyq1if1\u0026amp;q=85\u0026amp;s=6f16cb0842f8e4b4ba8a05671aa661f9\" media=\"(prefers-color-scheme: light)\">\u003clink data-mint-head rel=\"shortcut icon\" type=\"image/x-icon\" href=\"https://mintcdn.com/mintlify/HKyBg3pjnkyq1if1/favicon.ico?fit=max\u0026amp;auto=format\u0026amp;n=HKyBg3pjnkyq1if1\u0026amp;q=85\u0026amp;s=6f16cb0842f8e4b4ba8a05671aa661f9\" media=\"(prefers-color-scheme: light)\">\u003clink data-mint-head rel=\"icon\" type=\"image/x-icon\" sizes=\"32x32\" href=\"https://mintcdn.com/mintlify/HKyBg3pjnkyq1if1/favicon.ico?fit=max\u0026amp;auto=format\u0026amp;n=HKyBg3pjnkyq1if1\u0026amp;q=85\u0026amp;s=6f16cb0842f8e4b4ba8a05671aa661f9\" media=\"(prefers-color-scheme: dark)\">\u003clink data-mint-head rel=\"icon\" type=\"image/x-icon\" sizes=\"16x16\" href=\"https://mintcdn.com/mintlify/HKyBg3pjnkyq1if1/favicon.ico?fit=max\u0026amp;auto=format\u0026amp;n=HKyBg3pjnkyq1if1\u0026amp;q=85\u0026amp;s=6f16cb0842f8e4b4ba8a05671aa661f9\" media=\"(prefers-color-scheme: dark)\">\u003clink data-mint-head rel=\"shortcut icon\" type=\"image/x-icon\" href=\"https://mintcdn.com/mintlify/HKyBg3pjnkyq1if1/favicon.ico?fit=max\u0026amp;auto=format\u0026amp;n=HKyBg3pjnkyq1if1\u0026amp;q=85\u0026amp;s=6f16cb0842f8e4b4ba8a05671aa661f9\" media=\"(prefers-color-scheme: dark)\">\u003cmeta data-mint-head property=\"og:title\" content=\"Authentication setup - Mintlify\">\u003cmeta data-mint-head property=\"og:description\" content=\"Set up user authentication to control access to pages and API references using password, OAuth, JWT, or Mintlify-managed private access.\">\u003cmeta data-mint-head property=\"og:site_name\" content=\"Mintlify\">\u003cmeta data-mint-head property=\"og:url\" content=\"https://www.mintlify.com/docs/deploy/authentication-setup\">\u003cmeta data-mint-head property=\"og:type\" content=\"website\">\u003cmeta data-mint-head property=\"og:image\" content=\"https://mintlify.mintlify.app/mintlify-assets/_next/image?url=%2F_mintlify%2Fapi%2Fog%3Fdivision%3DDocumentation%26title%3DAuthentication%2Bsetup%26description%3DSet%2Bup%2Buser%2Bauthentication%2Bto%2Bcontrol%2Baccess%2Bto%2Bpages%2Band%2BAPI%2Breferences%2Busing%2Bpassword%252C%2BOAuth%252C%2BJWT%252C%2Bor%2BMintlify-managed%2Bprivate%2Baccess.%26theme%3D6973fc1c1e3b9db825c1d942\u0026amp;w=1200\u0026amp;q=100\">\u003cmeta data-mint-head property=\"og:image:width\" content=\"1200\">\u003cmeta data-mint-head property=\"og:image:height\" content=\"630\">\u003cmeta data-mint-head name=\"twitter:card\" content=\"summary_large_image\">\u003cmeta data-mint-head name=\"twitter:title\" content=\"Authentication setup - Mintlify\">\u003cmeta data-mint-head name=\"twitter:description\" content=\"Set up user authentication to control access to pages and API references using password, OAuth, JWT, or Mintlify-managed private access.\">\u003cmeta data-mint-head name=\"twitter:image\" content=\"https://mintlify.mintlify.app/mintlify-assets/_next/image?url=%2F_mintlify%2Fapi%2Fog%3Fdivision%3DDocumentation%26title%3DAuthentication%2Bsetup%26description%3DSet%2Bup%2Buser%2Bauthentication%2Bto%2Bcontrol%2Baccess%2Bto%2Bpages%2Band%2BAPI%2Breferences%2Busing%2Bpassword%252C%2BOAuth%252C%2BJWT%252C%2Bor%2BMintlify-managed%2Bprivate%2Baccess.%26theme%3D6973fc1c1e3b9db825c1d942\u0026amp;w=1200\u0026amp;q=100\">\u003cmeta data-mint-head name=\"twitter:image:width\" content=\"1200\">\u003cmeta data-mint-head name=\"twitter:image:height\" content=\"630\">\u003cmeta data-mint-head name=\"msapplication-config\" content=\"https://mintlify.s3.us-west-1.amazonaws.com/mintlify/_generated/favicon/browserconfig.xml?v=3\">\u003cmeta data-mint-head name=\"apple-mobile-web-app-title\" content=\"Mintlify\">\u003cmeta data-mint-head name=\"msapplication-TileColor\" content=\"#166E3F\">\u003cmeta data-mint-head name=\"og:locale\" content=\"en_US\">\u003cmeta data-mint-head name=\"google-site-verification\" content=\"YRuJgIxsRnMkiRTYTo_tEsJSFyIE3AraEiukTbeV4Ag\">\u003clink data-mint-head rel=\"canonical\" href=\"https://www.mintlify.com/docs/deploy/authentication-setup\">\u003clink data-mint-head rel=\"alternate\" type=\"application/xml\" href=\"/docs/sitemap.xml\">\u003clink data-mint-head rel=\"alternate\" type=\"text/markdown\" href=\"/docs/deploy/authentication-setup.md\">\u003cscript data-mint-head type=\"application/ld+json\">{\"@context\":\"https://schema.org\",\"@graph\":[{\"@type\":\"Organization\",\"@id\":\"https://www.mintlify.com/#organization\",\"name\":\"Mintlify\",\"url\":\"https://www.mintlify.com\",\"logo\":{\"@type\":\"ImageObject\",\"url\":\"https://mintcdn.com/mintlify/ZmWpbGQa5yv5AElR/logo/light.svg?fit=max\u0026auto=format\u0026n=ZmWpbGQa5yv5AElR\u0026q=85\u0026s=094e41f7b58b2cab0a6faa2bab2828e0\"}},{\"@type\":\"WebSite\",\"@id\":\"https://www.mintlify.com/docs#website\",\"name\":\"Mintlify\",\"url\":\"https://www.mintlify.com/docs\",\"publisher\":{\"@id\":\"https://www.mintlify.com/#organization\"}},{\"@type\":\"WebPage\",\"@id\":\"https://www.mintlify.com/docs/deploy/authentication-setup#webpage\",\"url\":\"https://www.mintlify.com/docs/deploy/authentication-setup\",\"name\":\"Authentication setup\",\"description\":\"Set up user authentication to control access to pages and API references using password, OAuth, JWT, or Mintlify-managed private access.\",\"dateModified\":\"2026-09-28T15:22:17.076Z\",\"isPartOf\":{\"@id\":\"https://www.mintlify.com/docs#website\"},\"breadcrumb\":{\"@id\":\"https://www.mintlify.com/docs/deploy/authentication-setup#breadcrumb\"}},{\"@type\":\"BreadcrumbList\",\"@id\":\"https://www.mintlify.com/docs/deploy/authentication-setup#breadcrumb\",\"itemListElement\":[{\"@type\":\"ListItem\",\"position\":1,\"name\":\"Manage your site\",\"item\":\"https://www.mintlify.com/docs/organize/settings-appearance\"},{\"@type\":\"ListItem\",\"position\":2,\"name\":\"Authentication setup\",\"item\":\"https://www.mintlify.com/docs/deploy/authentication-setup\"}]},{\"@type\":[\"Article\",\"TechArticle\"],\"@id\":\"https://www.mintlify.com/docs/deploy/authentication-setup#article\",\"headline\":\"Authentication setup\",\"name\":\"Authentication setup\",\"description\":\"Set up user authentication to control access to pages and API references using password, OAuth, JWT, or Mintlify-managed private access.\",\"url\":\"https://www.mintlify.com/docs/deploy/authentication-setup\",\"mainEntityOfPage\":{\"@id\":\"https://www.mintlify.com/docs/deploy/authentication-setup#webpage\"},\"dateModified\":\"2026-09-28T15:22:17.076Z\",\"keywords\":\"authentication, auth, OAuth, JWT, password, private\",\"publisher\":{\"@id\":\"https://www.mintlify.com/#organization\"},\"isPartOf\":{\"@id\":\"https://www.mintlify.com/docs#website\"}}]}\u003c/script>\u003cscript data-mint-head type=\"application/ld+json\">{\"@context\":\"https://schema.org\",\"@type\":\"WebSite\",\"name\":\"Mintlify\",\"creator\":{\"@type\":\"Organization\",\"name\":\"Mintlify\",\"url\":\"https://mintlify.com\"}}\u003c/script>","siteName":"Mintlify","nav":{"global":null,"languages":[{"language":"en","tabs":[{"tab":"Documentation","groups":[{"group":"Get started","boost":2,"pages":[{"title":"Introduction","description":"Mintlify is an AI-native documentation platform built for developers, with beautiful defaults, interactive API playgrounds, and smart search.","mode":"frame","keywords":["overview","platform","getting started","features"],"boost":3,"href":""},{"title":"Quickstart","description":"Get started with Mintlify by deploying your documentation site in minutes and making your first content change with the web editor or Git.","keywords":["quickstart","deploy","get started","first steps","tutorial","setup","onboarding"],"boost":3,"href":"/quickstart"},{"title":"AI-native documentation","sidebarTitle":"AI-native","description":"Learn how Mintlify's AI-native features, including the assistant, agent, llms.txt, and MCP server, improve reading, writing, and discovering your docs.","keywords":["AI","assistant","agent","llms.txt","MCP","llms-full.txt"],"href":"/ai-native"},{"group":"CLI","root":{"title":"Mintlify CLI","description":"Use the Mintlify CLI to preview docs locally, test changes in real time, and run accessibility, link, and validation checks before deploying.","keywords":["CLI","mint","local development","preview"],"href":"/cli/index"},"pages":[{"title":"Install the CLI","description":"Install the Mintlify CLI to preview documentation locally, test changes in real time, and catch build errors before deploying to production.","keywords":["CLI","npm","install","Node.js","pnpm","mint"],"href":"/cli/install"},{"title":"Mintlify MDX extension","description":"Install the Mintlify MDX extension for autocomplete, inline diagnostics, hover docs, a visual editor, and an in-editor preview for writing MDX locally.","keywords":["Cursor","MDX","autocomplete","diagnostics","IntelliSense","preview","editor","visual mode"],"href":"/cli/mdx-extension"},{"title":"Preview locally","description":"Run a local preview of your Mintlify documentation site with live reload, full-text search, and AI assistant support using mint dev.","keywords":["mint dev","local preview","localhost","mint login","search","assistant"],"href":"/cli/preview"},{"title":"Mintlify CLI command reference","sidebarTitle":"Commands","description":"Complete reference for Mintlify CLI commands and flags, including mint index, mint dev, mint validate, mint broken-links, and more.","keywords":["CLI","mint","commands","flags","reference"],"boost":3,"href":"/cli/commands"}]},{"title":"Desktop app","description":"Install the Mintlify desktop app for macOS, Windows, or Linux to use your dashboard and editor in a native window with tabs and keyboard shortcuts.","tag":"New","href":"/desktop"},{"group":"Migration guide","root":{"title":"Migration overview","sidebarTitle":"Overview","description":"Choose a migration path for moving existing documentation from Docusaurus, ReadMe, GitBook, Fern, Document360, or another platform to Mintlify.","keywords":["migration","Docusaurus","ReadMe","GitBook","Fern","Document360","import"],"href":"/migration/index"},"pages":[{"title":"Migrate from Docusaurus","description":"Migrate Docusaurus documentation to Mintlify, including MDX pages, sidebars, versions, localized content, assets, and custom components.","keywords":["Docusaurus migration","Docusaurus to Mintlify","sidebars.js","versioned_docs"],"href":"/migration/docusaurus"},{"title":"Migrate from ReadMe","description":"Migrate ReadMe guides, API references, recipes, custom pages, versions, reusable content, and assets to Mintlify with the scraper or a project export.","keywords":["ReadMe migration","ReadMe to Mintlify","ReadMe export","rdme"],"href":"/migration/readme"},{"title":"Migrate from GitBook","description":"Migrate GitBook sections, Markdown, navigation, reusable content, variants, assets, and OpenAPI documentation to Mintlify using Git Sync or the scraper.","keywords":["GitBook migration","GitBook to Mintlify","Git Sync","SUMMARY.md","GitBook sections"],"href":"/migration/gitbook"},{"title":"Migrate from Fern","description":"Migrate a Fern site to Mintlify. Convert MDX content, docs.yml navigation, products, versions, assets, API references, and components.","keywords":["Fern migration","Fern to Mintlify","docs.yml","Fern Docs"],"href":"/migration/fern"},{"title":"Migrate from Document360","description":"Export a Document360 project ZIP and migrate its workspaces, languages, articles, categories, media, reusable content, and API references to Mintlify.","keywords":["Document360 migration","Document360 to Mintlify","knowledge base export","project ZIP"],"href":"/migration/document360"},{"title":"Migrate from another platform","description":"Convert documentation from any source platform to Mintlify pages, navigation, components, API references, assets, and redirects.","keywords":["manual documentation migration","Markdown migration","MDX migration","docs.json","Confluence","ZIP export"],"href":"/migration/manual"}]}]},{"group":"Create content","pages":[{"group":"Pages","pages":[{"title":"Pages","description":"Configure page metadata, titles, descriptions, icons, and layout modes using YAML frontmatter properties at the top of your MDX documentation.","keywords":["tags","tag","frontmatter","metadata","layout"],"boost":3,"href":"/organize/pages"},{"title":"Hidden pages","description":"Hide documentation pages from the sidebar navigation while keeping them accessible via direct URL, search, or AI assistant for special use cases.","keywords":["hide from navigation","unlisted","page visibility"],"href":"/organize/hidden-pages"},{"title":"Related topics","description":"Add a related topics section at the bottom of each page using automatic recommendations or manually curated links defined in page frontmatter.","keywords":["related","related pages","related topics","recommendations","frontmatter"],"href":"/organize/related-pages"}]},{"group":"Formatting","pages":[{"title":"Format text","description":"Format text in your documentation with Markdown headings, bold, italic, links, blockquotes, and other inline styling options in MDX pages.","keywords":["Markdown formatting","text styling","headings","anchor links","custom heading IDs"],"href":"/create/text"},{"title":"Format code","description":"Format code in your documentation with syntax highlighting, line numbers, diffs, copy buttons, and interactive code group features in MDX.","keywords":["code blocks","syntax highlighting","code styling"],"href":"/create/code"},{"title":"Lists and tables","description":"Format structured data in your documentation with Markdown tables, ordered and unordered lists, nested structures, and task list checkboxes.","keywords":["ordered","unordered","Markdown tables","table formatting"],"href":"/create/list-table"}]},{"group":"Components","root":{"title":"Components overview","description":"Browse the full Mintlify component library for layout, emphasis, API documentation, and navigation elements available in your MDX pages.","keywords":["MDX components","documentation components","UI components","components"],"boost":3,"href":"/components/index"},"pages":[{"title":"Accordions","description":"Use the accordion component to show and hide content sections, organize related information, and enable progressive disclosure in your docs.","keywords":["accordions","collapsible content","expandable sections","progressive disclosure"],"boost":3,"href":"/components/accordions"},{"title":"Badge","description":"Use the badge component to highlight status indicators, version labels, or metadata inline with customizable colors and hover tooltips.","keywords":["badge","label","tag","status","indicator"],"boost":3,"href":"/components/badge"},{"title":"Banner","description":"Add a dismissible banner at the top of your documentation site to display important announcements, release notes, or notifications.","keywords":["banner","announcements","site-wide"],"boost":3,"href":"/components/banner"},{"title":"Callouts","description":"Add info, notes, tips, checks, warnings, danger, and custom callout components to highlight important information in your documentation.","keywords":["callouts","notes","warnings","info boxes","tips","emphasis","highlight"],"boost":3,"href":"/components/callouts"},{"title":"Cards","description":"Use the Mintlify Card component to display links, icons, images, and grouped content as visual containers, including horizontal layouts and CardGroup grids.","keywords":["cards","visual containers"],"boost":3,"href":"/components/cards"},{"title":"Code groups","description":"Use the CodeGroup component to display multiple code examples in a tabbed interface and let readers compare implementations across languages.","keywords":["code groups","tabbed code","multi-language examples","CodeGroup"],"href":"/components/code-groups"},{"title":"Color","description":"Display color swatches with hex values and click-to-copy capability using the color component for design system and branding documentation.","keywords":["color","palette","colors","design system","hex","rgb","rgba","hsl","oklch"],"boost":3,"href":"/components/color"},{"title":"Columns","description":"Arrange cards and other components in a responsive multi-column grid layout with the columns component, including customizable column counts.","keywords":["card groups","grid layout","multi-column layout"],"boost":3,"href":"/components/columns"},{"title":"Examples","description":"Display code examples in the right sidebar panel on desktop devices to show request and response samples alongside API documentation.","keywords":["RequestExample","ResponseExample","code examples","request-response"],"boost":3,"href":"/components/examples"},{"title":"Expandables","description":"Use the expandable component to toggle nested object properties in API documentation, showing child fields for request and response objects.","keywords":["expandables","nested properties","expandable fields","toggle content"],"boost":3,"href":"/components/expandables"},{"title":"Fields","description":"Use ParamField and ResponseField components to document API request and response parameters with types, defaults, and validation rules.","keywords":["ParamField","ResponseField","request parameters","response documentation"],"boost":3,"href":"/components/fields"},{"title":"Frames","description":"Wrap images, videos, and other components with the frame component to add styled borders, captions, and visual emphasis to your content.","keywords":["image frames","visual emphasis","captions","border"],"boost":3,"href":"/components/frames"},{"title":"GitHub","description":"Use the GitHub component to embed a public repository card with a live description, star count, and fork count on any documentation page.","keywords":["github","repo","repository","stars","forks"],"boost":3,"tag":"New","href":"/components/github"},{"title":"Icons","description":"Add icons from Font Awesome, Lucide, Tabler, emoji, or custom sources to your documentation pages using the icon component with size and color options.","keywords":["Font Awesome","Lucide","Tabler","SVGs","emoji"],"boost":3,"href":"/components/icons"},{"title":"MDX","description":"Use the MDX component to render Markdown inside JSX expressions and conditionals so headings, code blocks, and tables compile like the rest of your page.","keywords":["MDX component","conditional content","markdown in JSX","expressions","ternary"],"href":"/components/mdx"},{"title":"Mermaid","description":"Create flowcharts, sequence diagrams, and other visualizations in your documentation using Mermaid syntax with automatic rendering.","keywords":["Mermaid","flowcharts","diagrams"],"boost":3,"href":"/components/mermaid-diagrams"},{"title":"Panel","description":"Customize the right side panel content on documentation pages to display supplementary information, examples, or navigation elements.","keywords":["sidebar"],"boost":3,"href":"/components/panel"},{"title":"Prompt","description":"Display pre-built AI prompts with one-click copy and Cursor integration buttons so users can quickly use prompts in their AI tools.","keywords":["prompt","AI","cursor","copy","prompt card"],"boost":3,"href":"/components/prompt"},{"title":"Response fields","description":"Document API response fields using the ResponseField component with type annotations, descriptions, and required or optional indicators.","keywords":["API output","return values","response structure"],"href":"/components/responses"},{"title":"Steps","description":"Create numbered step-by-step procedures with the steps component to guide users through sequential tasks, tutorials, and setup workflows.","keywords":["sequence","numbered steps","procedures","tutorial steps"],"boost":3,"href":"/components/steps"},{"title":"Tabs","description":"Use the tab component to organize content into switchable panels for showing different options, platform versions, or language examples.","keywords":["tabbed content","content panels","switchable content"],"boost":3,"href":"/components/tabs"},{"title":"Tiles","description":"Use the tiles component to display visual previews with image thumbnails, titles, and descriptions in a responsive grid layout for your docs.","keywords":["tiles","visual preview","grid","showcase"],"boost":3,"href":"/components/tiles"},{"title":"Tooltips","description":"Add tooltips to display contextual definitions and explanations when users hover over terms, abbreviations, or technical concepts in your documentation.","keywords":["tooltips","hover help","contextual information","explanatory","definitions"],"boost":3,"href":"/components/tooltips"},{"title":"Tree","description":"Use the tree component to display hierarchical file and folder structures with collapsible nodes and syntax highlighting for path names.","keywords":["tree","file tree","folder structure","hierarchical navigation","file system"],"boost":3,"href":"/components/tree"},{"title":"Update","description":"Use the update component to display product updates, release notes, and changelog entries in a structured timeline format with dates.","keywords":["changelogs","product updates","release notes"],"boost":3,"href":"/components/update"},{"title":"View","description":"Use the view component to create switchable content panels for different programming languages, frameworks, or configuration alternatives.","keywords":["selector","language-specific content","content switching"],"boost":3,"href":"/components/view"},{"title":"Visibility","description":"Use the visibility component to show different content to humans on the web UI and to AI agents in Markdown output for conditional rendering.","keywords":["visibility","agents","humans","markdown","AI","conditional content"],"boost":3,"href":"/components/visibility"},{"title":"React components","description":"Build interactive and reusable elements with custom React components in your Mintlify documentation using JSX, state, and client-side logic.","keywords":["React components","interactive components","JSX","custom components"],"boost":3,"href":"/customize/react-components"}]},{"group":"Media","pages":[{"title":"Images and embeds","description":"Add images, embed YouTube videos, and include iframes in your MDX pages to enhance documentation with visual and interactive media content.","keywords":["images","videos","iframes","media","svg"],"href":"/create/image-embeds"},{"title":"Files","description":"Serve static assets like images, videos, PDFs, and data files from your documentation repository with automatic optimization and CDN delivery.","keywords":["static assets","supported file types"],"boost":3,"href":"/create/files"}]},{"title":"Reusable snippets","description":"Create reusable content snippets with variables to maintain consistency across documentation pages and reduce duplication in your MDX files.","keywords":["content snippets","reusable content","variables"],"href":"/create/reusable-snippets"},{"title":"Personalized content","description":"Show personalized content based on identified visitor data, group memberships, and custom variables to tailor documentation per audience.","keywords":["content personalization","personalization","user data","groups","dynamic","prefill"],"href":"/create/personalization"},{"group":"Editor","root":{"title":"Editor overview","sidebarTitle":"Overview","description":"Create, edit, and publish content in your browser with the Mintlify editor. Supports real-time collaboration and continuous Git sync.","keywords":["web editor","git","branches","commits","pull requests"],"href":"/editor/index"},"pages":[{"title":"How to use the editor","description":"Step-by-step walkthrough of the Mintlify editor: create a branch, edit pages, share a preview deployment for review, and publish your changes.","keywords":["editor","tutorial","branch","publish"],"href":"/editor/tutorial"},{"title":"Create and edit pages","sidebarTitle":"Edit content","description":"Create pages, edit content, add media, organize your navigation, restore earlier page versions, and manage private and teamspace pages in the editor.","keywords":["editor","content","pages","navigation","version history","media","images","private pages","workspace","site","files","teamspace","move","page settings","share"],"href":"/editor/pages"},{"title":"Publish changes","sidebarTitle":"Publish","description":"Publish changes from the editor to your live site. Branches and protection rules determine what happens when you publish.","keywords":["publish","branch","git","commit","conflicts","deploy","pull request","granular publishing","request review"],"href":"/editor/publish"},{"title":"Review changes","sidebarTitle":"Review","description":"Preview changes before they go live, share them with your team, request review, and merge pull requests from the editor.","keywords":["review","preview","live preview","pull request","request review","merge","diff"],"href":"/editor/review"},{"title":"Collaborate in the editor","sidebarTitle":"Collaborate","description":"Leave comments, propose changes as suggestions, and edit alongside teammates in real time in the editor.","keywords":["comments","suggestions","collaboration","review","mentions","real time"],"href":"/editor/collaborate"},{"title":"Ask agent","description":"Use the editor's built-in AI agent to write content, edit pages, leave comments and suggestions, search your site, upload files, and configure settings.","keywords":["editor","AI","assistant","agent","chat","comments","suggestions","code mode","file upload"],"href":"/editor/agent"},{"title":"Editor settings for AI and publishing","sidebarTitle":"Settings","description":"Configure editor appearance, AI instructions, and publishing defaults to control how the Mintlify web editor looks and how it commits and merges changes.","keywords":["editor","settings","ai","instructions","publishing","pull request","merge","appearance","preferences"],"href":"/editor/settings"},{"title":"Keyboard shortcuts","description":"View the complete list of keyboard shortcuts for the Mintlify web editor, including text formatting, navigation, and editing commands.","keywords":["editor","keys","keyboard","shortcuts"],"href":"/editor/keyboard-shortcuts"}]},{"title":"CI checks","description":"Automate documentation quality checks in your CI/CD pipeline with broken link detection, linting, grammar validation, and build previews.","keywords":["continuous integration","CI/CD","checks","Vale","linter"],"href":"/deploy/ci"}]},{"group":"Manage your site","pages":[{"group":"Global settings","root":{"title":"Global settings","description":"Configure your Mintlify documentation site with docs.json, the required configuration file that controls navigation, appearance, integrations, and more.","keywords":["docs.json","configuration","setup","mint.json"],"href":"/organize/settings"},"pages":[{"title":"Appearance and branding","description":"Configure theme, colors, logo, favicon, fonts, and background in docs.json to control the visual identity of your documentation site.","keywords":["theme","colors","logo","favicon","fonts","background","appearance","branding","dark mode","icons","styling","docs.json"],"href":"/organize/settings-appearance"},{"title":"Site structure","description":"Configure navbar, navigation groups, footer links, banner, contextual menu, redirects, and other structural elements in your docs.json file.","keywords":["navbar","navigation","footer","banner","contextual","redirects","variables","metadata","docs.json"],"href":"/organize/settings-structure"},{"title":"API settings","description":"Configure OpenAPI and AsyncAPI specs, the interactive API playground, SDK code examples, and authentication settings in your docs.json file.","keywords":["api","openapi","asyncapi","playground","docs.json","api reference"],"href":"/organize/settings-api"},{"title":"Integrations","description":"Connect analytics platforms, chat widgets, and third-party services to your Mintlify documentation site through the docs.json integrations config.","keywords":["integrations","analytics","google analytics","posthog","segment","intercom","hotjar","mixpanel","amplitude","docs.json"],"boost":3,"href":"/organize/settings-integrations"},{"title":"SEO and search","description":"Configure SEO settings in docs.json including site description, search engine indexing, meta tags, search bar placeholder, and page timestamps.","keywords":["SEO","search","indexing","meta tags","description","timestamp","last modified","docs.json"],"href":"/organize/settings-seo"},{"title":"docs.json schema reference","description":"Complete reference for every docs.json configuration property with types, default values, descriptions, and usage examples for your docs site.","keywords":["docs.json","schema","reference","configuration","all settings","properties","complete"],"href":"/organize/settings-reference"}]},{"title":"Navigation","description":"Configure your documentation site navigation with groups, pages, dropdowns, tabs, and anchors in docs.json to build a sidebar structure.","keywords":["navigation structure","sidebar configuration","page organization","navigation groups"],"boost":3,"href":"/organize/navigation"},{"title":"Contextual menu","description":"Add a contextual menu to your docs with one-click AI integrations for ChatGPT, Claude, Perplexity, Google AI Studio, Devin, Devin Desktop, and MCP tools.","keywords":["AI tools","ChatGPT","Claude","Perplexity","MCP","Grok","cursor","vscode","vs code","Google AI Studio","aistudio","Devin","Windsurf","Devin Desktop","pdf","copy page","copy button","copy markdown","copy as markdown","view as markdown","context menu","page menu","AI menu","AI actions","open in","download pdf","export pdf","ask ai","openapi","download spec"],"href":"/ai/contextual-menu"},{"title":"Bring your own model","description":"Use your own LLM provider API key and choose the model that powers the Mintlify assistant, agent, and automations on Enterprise plans.","keywords":["BYOK","key","OpenRouter","Anthropic","OpenAI","LLM","API key","credits"],"href":"/ai/bring-your-own-model"},{"title":"Redirects","description":"Configure URL redirects in docs.json for moved, renamed, or deleted documentation pages to preserve SEO rankings and prevent broken links.","keywords":["redirects"],"boost":3,"href":"/create/redirects"},{"title":"Exclude files from publishing","sidebarTitle":"Exclude files","description":"Exclude specific files and directories from your published documentation using a .mintignore file with glob patterns, similar to .gitignore syntax.","keywords":["exclude","ignore","gitignore","drafts","private"],"href":"/organize/mintignore"},{"title":"Notifications","description":"Choose which email notifications you receive about comments, suggestions, automation runs, and page feedback in your Mintlify dashboard.","keywords":["notifications","email","preferences","comments","suggestions","automations","feedback"],"href":"/dashboard/notifications"},{"group":"Repository setup","pages":[{"title":"Monorepo setup","description":"Configure the documentation path and content directory in a monorepo project so Mintlify deploys only from your designated docs folder.","keywords":["monorepo","content directory","multi-project repository"],"href":"/deploy/monorepo"},{"title":"Multi-repository projects","description":"Combine multiple Git repositories into one Mintlify site, with a dedicated URL path for each source repo's content and navigation.","keywords":["multi-repo","multiple repositories","git sources","URL path","multi-repository deployments"],"href":"/deploy/multi-repo"}]},{"group":"Visual customization","pages":[{"title":"Themes","description":"Choose and configure a theme to customize your documentation site's colors, dark mode behavior, layout style, and overall visual appearance.","mode":"frame","keywords":["theme selection","Mint","Maple","Palm","Willow","Linden","Almond","Aspen","Sequoia","customize appearance"],"boost":3,"href":"/customize/themes"},{"title":"Fonts","description":"Customize typography on your documentation site with Google Fonts or self-hosted font files for headings, body text, and code blocks.","keywords":["Google Fonts","local fonts","custom typography"],"boost":3,"href":"/customize/fonts"},{"title":"Custom scripts","description":"Add custom JavaScript and CSS for analytics, widgets, styling, third-party integrations, and API playground server variables on your documentation site.","keywords":["CSS","JavaScript","Tailwind CSS","style customization","API Playground","server variables"],"href":"/customize/custom-scripts"},{"title":"Custom 404 page","description":"Customize the title, description, and appearance of your documentation site's 404 error page to match your brand and guide visitors.","keywords":["404 error page","custom error pages"],"href":"/customize/custom-404-page"}]},{"group":"Analytics","root":{"title":"Analytics overview","description":"Explore the Mintlify analytics dashboard to measure documentation traffic, assistant conversations, search queries, engagement, and reader feedback.","keywords":["analytics","metrics","page views","traffic","trends","insights","impressions","CTA","call-to-action"],"boost":3,"href":"/analytics/index"},"pages":[{"title":"Analyze documentation traffic","sidebarTitle":"Traffic","description":"Review traffic analytics to track visitors, page views, referrals, popular pages, and traffic from both human readers and AI agents.","keywords":["analytics","traffic","page views","visitors","referrals","agent views"],"href":"/analytics/traffic"},{"title":"Analyze assistant conversations","sidebarTitle":"Assistant","description":"Review assistant analytics in the Mintlify dashboard to explore conversation categories, topics, satisfaction, chat history, and content gaps.","keywords":["analytics","assistant","conversations","topics","satisfaction","chat history"],"href":"/analytics/assistant"},{"title":"Analyze documentation searches","sidebarTitle":"Search","description":"Review documentation search analytics to track query volume, spot searches returning no results, and improve result click-through rates.","keywords":["analytics","search","queries","no results","click-through rate","CTR"],"href":"/analytics/search"},{"title":"Analyze user engagements","sidebarTitle":"User engagements","description":"Use engagement analytics to measure content actions, CTA click-through rates, user flows through your docs, and search and assistant funnels.","keywords":["analytics","engagement","CTA","user flow","funnel","actions"],"href":"/analytics/user-engagements"},{"title":"Measure time and money saved with Mintlify","sidebarTitle":"Savings","description":"Use the Savings view in analytics to estimate hours saved by the agent and automations, and support costs saved by assistant answers.","keywords":["analytics","savings","time","money","ROI","deflection","automations","Slack agent"],"href":"/analytics/savings"},{"title":"Collect page feedback from users and AI agents","sidebarTitle":"Feedback","description":"Enable feedback widgets, page ratings, contextual notes, code snippet reactions, and agent feedback to find and fix documentation gaps.","keywords":["user feedback","thumbs rating","contextual","satisfaction","agents"],"boost":3,"href":"/optimize/feedback"},{"title":"Export analytics to CSV","sidebarTitle":"Export analytics","description":"Export traffic, referrals, assistant, search, and feedback analytics to CSV from your Mintlify dashboard and interpret each export field.","keywords":["analytics","export","CSV","traffic export","assistant export"],"href":"/analytics/export"},{"title":"Stream analytics events to Amazon S3","sidebarTitle":"Stream events","description":"Configure Enterprise analytics streaming to send selected event categories from your Mintlify projects to Amazon S3 in near real time.","keywords":["analytics","streaming","Amazon S3","data warehouse","events","Enterprise"],"href":"/analytics/streaming"}]},{"group":"Deployments","root":{"title":"Deployments","description":"Manage documentation deployments in the Mintlify dashboard, including viewing deployment history, monitoring build status, troubleshooting, and deleting a project.","keywords":["manual deployment","deployment history","deployment triggers","delete project","delete deployment"],"boost":3,"href":"/deploy/deployments"},"pages":[{"title":"GitHub","description":"Connect your GitHub repository to Mintlify for automated deployments, pull request preview builds, and continuous documentation synchronization.","keywords":["GitHub App","repository connection","automated deployments"],"boost":3,"href":"/deploy/github"},{"title":"GitHub Enterprise Server","description":"Install and configure the Mintlify GitHub App on your GitHub Enterprise Server instance for automated documentation deployments and syncing.","keywords":["GitHub Enterprise Server","GHES","GitHub Enterprise"],"href":"/deploy/ghes"},{"title":"GitLab","description":"Connect your GitLab repository to Mintlify for automated documentation deployments, merge request previews, and continuous synchronization.","keywords":["GitLab integration","access tokens","merge request previews","self-hosted","instance"],"boost":3,"href":"/deploy/gitlab"},{"title":"Bitbucket Cloud","description":"Connect a Bitbucket Cloud repository to Mintlify for automatic deployments, pull request previews, and continuous synchronization.","keywords":["Bitbucket Cloud","repository connection","OAuth","automated deployments"],"href":"/deploy/bitbucket"},{"title":"Preview deployments","description":"Get unique preview URLs for each pull request so reviewers can see documentation changes in a live environment before merging to production.","keywords":["preview URLs","pull request previews","branch previews","staging environments"],"href":"/deploy/preview-deployments"},{"title":"Rollbacks","description":"Restore your live Mintlify site to a previous successful build from your dashboard without reverting commits or waiting for a rebuild.","keywords":["instant","revert deployment","restore build","promote build","broken deployment"],"href":"/deploy/rollbacks"}]},{"group":"Hosting","root":{"title":"Custom domain","description":"Host your site at your own domain, subdomain, or subpath with DNS records, automatic TLS certificates, and Mintlify-managed or proxy traffic routing.","keywords":["custom domain setup","DNS configuration","CNAME records","TLS certificates","subpath","hosting","base path","apex domain","CNAME flattening","ALIAS records"],"href":"/customize/custom-domain"},"pages":[{"group":"Subpath hosting","root":{"title":"Host docs at a subpath","description":"Host your Mintlify documentation at a subpath like /docs on your main domain using Cloudflare Workers, Vercel rewrites, or an nginx reverse proxy.","keywords":["subpath routing","/docs setup","base path"],"boost":3,"href":"/deploy/docs-subpath"},"pages":[{"title":"Deploy at a subpath with Cloudflare Workers","sidebarTitle":"Cloudflare","description":"Deploy your Mintlify documentation at a subpath on your domain using Cloudflare Workers with step-by-step setup and DNS configuration.","keywords":["Cloudflare Workers","subpath routing","reverse proxy setup","Worker configuration","Cloudflare WAF","firewall rules","Bot Fight Mode","403 errors"],"boost":3,"href":"/deploy/cloudflare"},{"title":"Deploy at a subpath with AWS Route 53 and CloudFront","sidebarTitle":"AWS","description":"Deploy your Mintlify documentation at a subpath on AWS by combining Route 53 DNS routing, a CloudFront distribution, and cache behaviors.","keywords":["AWS deployment","Route 53 DNS","CloudFront CDN","cache policies"],"href":"/deploy/route53-cloudfront"},{"title":"Deploy at a subpath with Vercel","sidebarTitle":"Vercel","description":"Serve your Mintlify site at a subpath on your main domain using Vercel rewrites, with a step-by-step vercel.json configuration walkthrough.","keywords":["vercel.json","Vercel deployment","rewrites configuration","subpath routing","external proxy","CloudFront","domain verification","SSL certificates"],"boost":3,"href":"/deploy/vercel"},{"title":"Reverse proxy","description":"Configure a custom reverse proxy with nginx or a similar tool to serve your Mintlify documentation at a subpath on your own domain.","keywords":["reverse proxy configuration","nginx","proxy routing","header forwarding"],"href":"/deploy/reverse-proxy"}]},{"title":"Content Security Policy (CSP) configuration","sidebarTitle":"CSP configuration","description":"Configure Content Security Policy headers to allow Mintlify resources while maintaining security for reverse proxies and strict network policies.","keywords":["directives","security headers","firewall","XSS prevention","blocked resources"],"href":"/deploy/csp-configuration"},{"title":"Self-host","description":"Run Mintlify inside your own cloud or on-premises environment, on AWS or any Kubernetes platform including Azure, Google Cloud, Oracle Cloud, and OpenShift.","keywords":["self-host","self-hosted","on-prem","deploy","AWS","CDK","Helm","Kubernetes","OpenShift","air gap","enterprise"],"href":"/deploy/self-host"},{"title":"Custom developer portals","description":"Deploy a fully custom developer portal on top of self-hosted Mintlify, designed and built by Mintlify and delivered through versioned releases.","keywords":["developer portal","custom presentation layer","API marketplace","self-host","on-prem","white label","enterprise"],"href":"/deploy/custom-portal"}]},{"group":"Export your site","pages":[{"title":"Offline export","description":"Export your documentation site as a self-contained zip archive for offline viewing, internal distribution, or air-gapped environment hosting.","keywords":["export","offline","zip","static site","distribution","mint export"],"href":"/deploy/export"},{"title":"PDF exports","description":"Export your entire documentation site as a single PDF with a navigable table of contents for offline reading, sharing, and print distribution.","keywords":["PDF","offline docs"],"href":"/optimize/pdf-exports"}]},{"group":"Authentication","root":{"title":"Authentication setup","description":"Set up user authentication to control access to pages and API references using password, OAuth, JWT, or Mintlify-managed private access.","keywords":["authentication","auth","OAuth","JWT","password","private"],"href":"/deploy/authentication-setup"},"pages":[{"title":"Single sign-on (SSO)","description":"Set up single sign-on with SAML or OIDC identity providers like Okta, Azure AD, and Google Workspace for secure team authentication.","keywords":["SSO","SAML authentication","Okta integration","Microsoft Entra","identity provider","JIT","provisioning","OIDC"],"href":"/dashboard/sso"},{"title":"SCIM user provisioning","description":"Automatically provision, deprovision, and map users to roles for Mintlify dashboard members from Okta or another SCIM 2.0 identity provider.","keywords":["SCIM","Okta","identity provider","user management","RBAC"],"href":"/dashboard/scim"},{"title":"Session security","description":"Configure dashboard session timeouts, maximum session lifetime, and an IP allowlist to enforce stricter authentication and network access policies.","keywords":["session","timeout","authentication","security","SSO","IP allowlist"],"href":"/dashboard/session-security"}]},{"group":"Security","pages":[{"title":"Dashboard access policies","sidebarTitle":"Access policies","description":"Restrict Mintlify dashboard access to trusted IP addresses and control how long dashboard sessions stay valid with idle timeouts and maximum session lifetimes.","keywords":["IP allowlist","network access","CIDR","IP restrictions","security","dashboard access","trusted IPs","session lifetime","idle timeout","session duration"],"href":"/dashboard/network-access"},{"title":"Roles","description":"Assign admin, editor, or viewer roles to team members to control access levels, editing permissions, and deployment capabilities in Mintlify.","keywords":["RBAC","role-based access control","admin","editor","viewer","permissions","revoke credentials","session revocation"],"boost":3,"href":"/dashboard/roles"},{"title":"Audit logs","description":"Review, export, and stream audit logs to Amazon S3 or Datadog to track deployments, configuration changes, and permission updates in your organization.","keywords":["monitoring","activity tracking","security","compliance","SIEM"],"href":"/dashboard/audit-logs"},{"title":"Security contact","description":"Configure a security contact email address for your organization to receive vulnerability reports, security alerts, and compliance updates.","keywords":["security","notifications","compliance"],"href":"/dashboard/security-contact"}]}]},{"group":"Agent","pages":[{"title":"What is the agent?","description":"Learn how the Mintlify agent researches, plans, and writes documentation, then opens pull requests with proposed changes for your team to review.","keywords":["automation","automate","AI","autoupdate","maintenance"],"href":"/agent/index"},{"title":"Add the agent to Slack","description":"Install the Mintlify agent in Slack to ask questions, update documentation from team conversations, and capture knowledge in pull requests.","keywords":["Slack integration","Slack bot","team collaboration","agent integration","knowledge capture"],"href":"/agent/slack"},{"group":"Automations","root":{"title":"Automations overview","sidebarTitle":"Overview","description":"Automate content maintenance with Mintlify automations by running the agent on a schedule, on repository pushes, or on connected integration events.","keywords":["automation","automate","cron","agent","automations"],"boost":5,"href":"/automations/index"},"pages":[{"title":"Create a custom automation","description":"Create a Mintlify automation that runs on a schedule, repository push, or integration event. Add context repositories and a custom agent prompt.","keywords":["automation","automate","cron","agent","custom automation"],"href":"/automations/create"},{"title":"Manage automations","description":"Enable, disable, trigger, and delete automations from your dashboard. Configure repository, schedule, and integration triggers; context repos; and automerge.","keywords":["cron","push","automerge","context","automation instructions","trigger","disable automation","enable automation"],"href":"/automations/manage"},{"title":"Integrations for the agent and automations","sidebarTitle":"Integrations","description":"Connect third-party apps so the Mintlify agent can use live context in Slack, during automation runs, or as a trigger for custom automations.","keywords":["integrations","Slack agent","Notion","Linear","Jira","LaunchDarkly","Confluence","Salesforce","PostHog","Intercom","Google Drive","OneDrive","Gmail","Outlook","HubSpot","Plain","Pylon","Stripe","automation trigger","context"],"href":"/automations/integrations"},{"title":"Predefined automations","description":"Reference for all predefined Mintlify automations, including default trigger, update mode, context repository support, and required configurations.","keywords":["predefined","automation","default"],"href":"/automations/reference"},{"title":"Self-hosted GitLab OAuth","description":"Connect a self-hosted GitLab instance to Mintlify via OAuth so automations can clone repositories, push commits, and open merge requests on your behalf.","keywords":["GitLab","self-hosted","OAuth","automations","enterprise"],"href":"/deploy/gitlab-self-hosted"}]},{"title":"Customize agent behavior","description":"Customize agent behavior with an `AGENTS.md` configuration file to control how the agent handles documentation tasks and follows your conventions.","keywords":["AGENTS.md","agent configuration","custom instructions","agent customization"],"href":"/agent/customize"},{"title":"Write effective prompts","description":"Write clear, specific prompts to get better results from the Mintlify agent, with examples of effective instructions and tips for common patterns.","keywords":["prompts","agent prompts","effective prompting","agent usage"],"href":"/agent/effective-prompts"},{"title":"Mintlify agent use cases and examples","sidebarTitle":"Use cases","description":"Explore real-world examples of using the Mintlify agent to automate documentation updates, capture knowledge, and maintain accurate docs.","keywords":["agent automations","documentation automations","automation examples"],"href":"/agent/use-cases"}]},{"group":"Assistant","pages":[{"title":"Assistant","description":"Add an AI-powered chat assistant to your documentation site that answers user questions, cites sources, and generates code examples on demand.","keywords":["chat","user support","multimodal"],"boost":3,"href":"/assistant/index"},{"title":"Configure the assistant","description":"Configure the AI assistant in your Mintlify dashboard: toggle availability, customize responses, add starter questions, set bot protection, and manage billing.","keywords":["assistant","settings","deflection","bot protection","billing"],"href":"/assistant/configure"},{"title":"Customize assistant behavior","description":"Customize the AI assistant by adding an Assistant.md file with system instructions that shape its tone, persona, focus areas, and response behavior.","keywords":["assistant","custom instructions","Assistant.md","system prompt","persona"],"href":"/assistant/customize"},{"title":"Embed the AI assistant widget","sidebarTitle":"Widget","description":"Install and configure the Mintlify widget to embed an AI assistant trained on your content into any website, web app, or dashboard.","keywords":["assistant","chat","embed"],"href":"/assistant/widget"},{"title":"Add assistant skills","description":"Tune the assistant's responses with topic-specific Markdown guides that the assistant loads on demand to answer specific questions with your team's guidance.","keywords":["assistant","skills","loadSkill","guides","system prompt"],"href":"/assistant/skills"},{"title":"Narration","description":"Let readers listen to pages on your documentation site with an AI-narrated audio track.","keywords":["listen","audio","accessibility"],"tag":"New","href":"/assistant/narration"},{"title":"Use the assistant","description":"Open the assistant with keyboard shortcuts, highlighted text, code blocks, file attachments, or URL parameters. Test assistant behavior in local preview.","keywords":["assistant","keyboard shortcut","file attachments","local preview","URL parameters"],"href":"/assistant/use"}]},{"group":"Agent-ready content","pages":[{"title":"Admin Model Context Protocol (MCP) server","sidebarTitle":"Admin MCP","description":"Give AI tools like Claude, ChatGPT, and Cursor write access to your Mintlify content and dashboard so they can edit pages, update settings, and open PRs.","keywords":["MCP","write access","AI","editing","Claude","ChatGPT","Cursor","branch","pull request"],"href":"/ai/mintlify-mcp"},{"group":"Mintlify Index","root":{"title":"Index","sidebarTitle":"Overview","description":"Give coding agents current technical context from publisher-maintained documentation and the web through one MCP server or REST API.","keywords":["Mintlify Index","technical search","coding agents","MCP","REST API"],"href":"/search-index/index"},"pages":[{"title":"Connect Mintlify Index to your coding agent","sidebarTitle":"Connect","description":"Set up the Mintlify Index MCP server in Claude Code, Cursor, VS Code, Codex, OpenCode, Windsurf, or Zed with the CLI or manual configuration.","keywords":["Mintlify Index","CLI","Claude Code","Cursor","MCP","technical documentation"],"href":"/search-index/connect"},{"title":"Mintlify Index MCP server","sidebarTitle":"MCP reference","description":"Reference for the public Mintlify Index MCP server: connection URL, the context tool, parameters, response format, rate limits, and usage examples.","keywords":["Mintlify Index","MCP server","context tool","rate limits"],"href":"/search-index/mcp"}]},{"title":"Search Model Context Protocol (MCP) server","sidebarTitle":"Search MCP","description":"Connect AI tools like Claude, Cursor, and ChatGPT to your hosted search MCP server so they can search and retrieve content from your site.","keywords":["MCP","AI tools","Claude","Cursor","search"],"href":"/ai/model-context-protocol"},{"title":"llms.txt","description":"Automatically generate llms.txt and llms-full.txt files so AI tools like ChatGPT and Claude can index and understand your documentation.","keywords":["llms.txt","LLM indexing","AEO","GEO","content discovery"],"boost":3,"href":"/ai/llmstxt"},{"title":"skill.md","description":"Make your documentation agent-ready with automatically generated skill.md files that describe your product's capabilities for AI agents.","keywords":["AI agents","skills","agent skills","agents"],"boost":3,"href":"/ai/skillmd"},{"title":"Markdown export","description":"Export clean Markdown versions of your documentation pages for AI tools, LLM integrations, and automated content processing workflows.","keywords":["markdown","token efficiency","AI processing"],"href":"/ai/markdown-export"}]},{"group":"Search and SEO","pages":[{"title":"Configure in-product search ranking, results, and filters","sidebarTitle":"Search","description":"Configure the in-product search bar on your Mintlify docs site: ranking boosts, maximum results per query, and product and version search filters.","keywords":["search","search ranking","search boost","boost","search prioritization","maximum search results","max results","searchable","exclude from search","filters"],"href":"/optimize/search"},{"title":"SEO","description":"Configure meta tags, Open Graph properties, canonical URLs, and page-level SEO settings to improve your documentation's search engine ranking.","keywords":["meta tags","sitemap","robots.txt","SEO","search engine optimization"],"boost":3,"href":"/optimize/seo"}]},{"group":"Document APIs","pages":[{"title":"API playground overview","description":"Let developers test API endpoints directly in your documentation with an interactive playground that sends real requests and shows responses.","keywords":["interactive","API","endpoint testing","live API requests","request builder"],"boost":3,"href":"/api-playground/overview"},{"group":"API specifications","pages":[{"title":"OpenAPI setup","description":"Generate interactive API documentation from OpenAPI specification files with automatic endpoint pages, request builders, and navigation.","keywords":["OpenAPI","API specification","Swagger"],"href":"/api-playground/openapi-setup"},{"title":"AsyncAPI setup","description":"Set up real-time WebSocket documentation using AsyncAPI specification files to generate interactive channel and message reference pages.","keywords":["asyncapi","websocket"],"href":"/api-playground/asyncapi-setup"},{"title":"GraphQL setup","description":"Generate reference pages for your GraphQL API from a schema definition file, with linked types and example queries, mutations, and responses.","keywords":["graphql","schema","sdl"],"href":"/api-playground/graphql-setup"},{"group":"SDK reference setup","root":{"title":"Generate SDK reference pages from doc-tool output","sidebarTitle":"SDK reference setup","description":"Publish SDK reference documentation in Mintlify from TypeDoc, DocFX, Javadoc, Sphinx, or phpDocumentor artifacts using the sdk navigation property.","keywords":["sdk","typedoc","docfx","javadoc","sphinx","phpdocumentor","reference"],"href":"/api-playground/sdk-reference-setup"},"pages":[{"title":"Add SDK examples","description":"Add SDK code samples to your API documentation with the x-codeSamples OpenAPI extension or automatically with Speakeasy.","keywords":["x-codeSamples","SDK examples","Speakeasy","autogenerated SDKs"],"href":"/api-playground/adding-sdk-examples"}]}]},{"group":"Endpoint pages","pages":[{"title":"Complex data types","description":"Describe APIs with flexible schemas using oneOf, anyOf, and allOf keywords for optional properties, polymorphism, and multiple data formats.","keywords":["oneOf","anyOf","allOf","schema composition","polymorphic schemas"],"href":"/api-playground/complex-data-types"},{"title":"Multiple responses","description":"Document multiple response variations for API endpoints, including success and error cases, with status codes and example payloads.","keywords":["response examples","conditional responses","response variations","examples property"],"href":"/api-playground/multiple-responses"},{"title":"Manage page visibility","description":"Control which API endpoints appear in your documentation navigation by hiding, filtering, or organizing autogenerated OpenAPI pages.","keywords":["x-hidden","x-excluded","hide endpoints","page visibility","internal endpoints"],"href":"/api-playground/managing-page-visibility"},{"title":"Create manual API pages","description":"Create API reference pages manually with MDX files when you need full control over layout for small APIs, prototypes, or custom docs.","keywords":["API documentation","endpoint documentation"],"href":"/api-playground/mdx-setup"}]},{"title":"Troubleshooting","description":"Troubleshoot common issues with API playground configuration, including OpenAPI validation errors, missing endpoints, and auth problems.","keywords":["API troubleshooting","invalid OpenAPI","configuration issues"],"boost":3,"href":"/api-playground/troubleshooting"}]},{"group":"Integrations","pages":[{"group":"Analytics","root":{"title":"Analytics integrations","description":"Connect your Mintlify documentation to analytics platforms like Google Analytics, Mixpanel, PostHog, and more to track visitor engagement.","keywords":["third-party analytics","engagement tracking","analytics platforms","usage tracking"],"href":"/integrations/analytics/overview"},"pages":[{"title":"Adobe Analytics","description":"Integrate Adobe Analytics with your Mintlify documentation site using Adobe Experience Platform Launch tags for detailed usage tracking.","keywords":["Adobe Analytics","Adobe Launch","Adobe Experience Platform","site analytics"],"href":"/integrations/analytics/adobe"},{"title":"Amplitude","description":"Integrate Amplitude analytics with your Mintlify documentation site to track user behavior, page views, and content engagement metrics.","keywords":["Amplitude integration","Amplitude API key","user behavior tracking","product analytics"],"boost":3,"href":"/integrations/analytics/amplitude"},{"title":"Clarity","description":"Integrate Microsoft Clarity with your Mintlify documentation site to capture session recordings, heatmaps, and user interaction analytics.","keywords":["Microsoft Clarity","session recording","heatmaps","user sessions"],"boost":3,"href":"/integrations/analytics/clarity"},{"title":"Clearbit","description":"Integrate Clearbit with your Mintlify documentation to enrich visitor data, identify visiting companies, and track enterprise engagement.","keywords":["Clearbit integration","user enrichment","visitor intelligence","public API key"],"boost":3,"href":"/integrations/analytics/clearbit"},{"title":"Fathom","description":"Integrate Fathom Analytics with your Mintlify documentation for privacy-focused, GDPR-compliant visitor tracking with a simple site ID setup.","keywords":["Fathom Analytics","privacy-focused analytics","site ID","simple analytics"],"boost":3,"href":"/integrations/analytics/fathom"},{"title":"Google Analytics 4","description":"Integrate Google Analytics 4 with your Mintlify documentation to track visitor behavior, page views, and content engagement with your GA4 ID.","keywords":["GA4 integration","measurement ID","web stream","Universal Analytics"],"href":"/integrations/analytics/google-analytics"},{"title":"Google Tag Manager","description":"Integrate Google Tag Manager with your Mintlify documentation to manage analytics tags, conversion tracking, and marketing events centrally.","keywords":["GTM integration","tag management","tag ID","cookie consent"],"href":"/integrations/analytics/google-tag-manager"},{"title":"Heap","description":"Integrate Heap analytics with your Mintlify documentation site to automatically capture user interactions and events for behavioral analysis.","keywords":["Heap Analytics","automatic event tracking","Heap app ID","user interaction tracking"],"boost":3,"href":"/integrations/analytics/heap"},{"title":"Hightouch","description":"Integrate Hightouch with your Mintlify documentation to sync analytics data for audience activation, segmentation, and downstream tool routing.","keywords":["Hightouch integration","data activation","write key","audience sync"],"boost":3,"href":"/integrations/analytics/hightouch"},{"title":"Hotjar","description":"Integrate Hotjar with your Mintlify documentation site to capture session recordings, heatmaps, and user feedback for experience insights.","keywords":["Hotjar integration","user feedback","session recordings","behavior analytics"],"boost":3,"href":"/integrations/analytics/hotjar"},{"title":"LogRocket","description":"Integrate LogRocket with your Mintlify documentation to replay user sessions, monitor frontend errors, and debug interaction issues in detail.","keywords":["LogRocket integration","session replay","error monitoring","app ID"],"boost":3,"href":"/integrations/analytics/logrocket"},{"title":"Mixpanel","description":"Integrate Mixpanel with your Mintlify documentation site to track product analytics, user behavior funnels, and content engagement events.","keywords":["Mixpanel integration","product analytics","event tracking","token"],"boost":3,"href":"/integrations/analytics/mixpanel"},{"title":"Pirsch","description":"Integrate Pirsch with your Mintlify documentation for GDPR-compliant, cookie-free analytics that tracks page views without collecting personal data.","keywords":["Pirsch Analytics","privacy analytics","identification code","GDPR-compliant"],"boost":3,"href":"/integrations/analytics/pirsch"},{"title":"Plausible","description":"Integrate Plausible Analytics with your Mintlify documentation for lightweight, privacy-respecting visitor tracking without cookies or consent banners.","keywords":["Plausible Analytics","privacy-respecting analytics","self-hosted analytics","domain configuration"],"boost":3,"href":"/integrations/analytics/plausible"},{"title":"PostHog","description":"Integrate PostHog with your Mintlify documentation site to track product analytics, feature usage, and user behavior with your API key.","keywords":["PostHog integration","product analytics","feature flags","self-hosted PostHog"],"boost":3,"href":"/integrations/analytics/posthog"},{"title":"Segment","description":"Integrate Segment with your Mintlify documentation to route analytics events to downstream tools like warehouses, CRMs, and marketing platforms.","keywords":["Segment integration","write key","event streaming","CDP integration"],"boost":3,"href":"/integrations/analytics/segment"}]},{"group":"Support","root":{"title":"Support integrations","description":"Connect your Mintlify documentation to support platforms like Intercom and Front so visitors can get live help directly from your docs pages.","keywords":["customer support platforms","help desk integration","support widgets","customer assistance"],"href":"/integrations/support/overview"},"pages":[{"title":"Intercom","description":"Integrate the Intercom chat widget into your Mintlify documentation site to provide real-time customer messaging, support, and onboarding help.","keywords":["Intercom integration","Intercom widget","app ID","in-app messaging"],"boost":3,"href":"/integrations/support/intercom"},{"title":"Front","description":"Integrate Front chat with your Mintlify documentation site so visitors can start customer support conversations directly from your docs pages.","keywords":["Front Chat","chat widget integration","chat ID","customer conversations"],"boost":3,"href":"/integrations/support/front"}]},{"group":"Privacy","root":{"title":"Privacy integrations","description":"Connect your Mintlify documentation site to privacy platforms like Osano and Transcend to manage cookie consent, compliance banners, and user preferences.","keywords":["data privacy platforms","compliance integrations","privacy tools","cookie consent"],"href":"/integrations/privacy/overview"},"pages":[{"title":"Osano","description":"Integrate Osano with your Mintlify documentation site to manage cookie consent banners, privacy preferences, and regulatory compliance.","keywords":["Osano integration","cookie consent manager","GDPR compliance"],"boost":3,"href":"/integrations/privacy/osano"},{"title":"Transcend","description":"Integrate Transcend Consent Management with your Mintlify docs to gate analytics behind visitor consent using your existing Transcend bundle.","keywords":["Transcend integration","consent management","cookie consent","GDPR compliance"],"href":"/integrations/privacy/transcend"}]}]},{"group":"Reference","pages":[{"title":"Concepts","description":"Learn how Mintlify connects your organization, documentation repository, editing workflows, previews, deployments, analytics, and AI features.","keywords":["how Mintlify works"],"href":"/reference/concepts"},{"title":"Glossary","description":"Definitions for Mintlify product, content, navigation, deployment, Git, API playground, and AI terminology used throughout the documentation.","keywords":["terms","definitions","terminology"],"href":"/reference/glossary"},{"title":"Credit pricing","description":"Learn the fixed credit price of each AI action, how your shared credit balance works, and how Mintlify bills add-ons, overages, and rollovers.","keywords":["credits","billing","pricing","organization","assistant","agent","automations","narration","audio","add-ons","overages","rollovers","usage","export","CSV","activity log"],"href":"/credits"}]}]},{"tab":"API reference","pages":[{"title":"API reference","href":"/api/introduction"}]},{"tab":"Changelog","pages":[{"title":"Changelog","href":"/changelog"}]},{"tab":"Help center","hidden":true,"searchable":true,"pages":[{"title":"Help center","href":"/help-center/can-i-rename-my-deployment-or-organization"}]},{"tab":"Learn","menu":[{"item":"Learn","description":"Self-paced lessons to get the most from Mintlify.","href":"https://learn.mintlify.com/"},{"item":"Guides","description":"How to guides for common tasks and best practices.","pages":[{"title":"Guides","href":"/guides"}]}],"pages":[{"title":"Learn","href":"/guides"}]}]},{"language":"fr","pages":[{"title":"fr","href":"/fr/deploy/authentication-setup"}]},{"language":"es","pages":[{"title":"es","href":"/es/deploy/authentication-setup"}]},{"language":"zh","pages":[{"title":"zh","href":"/zh/deploy/authentication-setup"}]}]},"title":"Authentication setup - Mintlify","buildId":"dpl_4F7c6mgtJUVtsqbPeVNSagyn6ryA","deploymentId":"dpl_4F7c6mgtJUVtsqbPeVNSagyn6ryA","dynamics":["2bfc744e19"],"chunks":["NarrationPlayer-STjnKC93.js"]}