Give each client its own access key so you can track its usage and revoke it without affecting the others. Clients never hold your provider keys.
Access keys authenticate every request to https://gateway.ngrok.ai. The AI Gateway validates each key before forwarding traffic. Upstream provider credentials are managed separately—see Access keys vs provider keys.
{"docsConfig":{"theme":"mint","$schema":"https://mintlify.com/docs.json","name":"ngrok documentation","colors":{"primary":"#0078C4","light":"#00BCFF","dark":"#0078C4"},"logo":{"light":"https://mintcdn.com/ngrok/_7R3hf69rnKiCshG/logo/compact-light.svg?fit=max\u0026auto=format\u0026n=_7R3hf69rnKiCshG\u0026q=85\u0026s=d79c7eb9cf2273745608b35a1b312b05","dark":"https://mintcdn.com/ngrok/_7R3hf69rnKiCshG/logo/compact-dark.svg?fit=max\u0026auto=format\u0026n=_7R3hf69rnKiCshG\u0026q=85\u0026s=fcc0cf30ebbc762df394756f6754d3bd","href":"https://ngrok.com/docs"},"favicon":"https://mintcdn.com/ngrok/BQQt-CHCs_8OwVmS/favicon.ico?fit=max\u0026auto=format\u0026n=BQQt-CHCs_8OwVmS\u0026q=85\u0026s=294907ab135b589ed607e4888e1a10a4","background":{"color":{"dark":"#121212"}},"navbar":{"links":[{"href":"https://ngrok.com/","label":"Homepage"},{"href":"https://dashboard.ngrok.com/","label":"Dashboard"},{"href":"https://ngrok.com/changelog","label":"Changelog"}],"primary":{"type":"button","label":"Sign up","href":"https://dashboard.ngrok.com/signup"}},"footer":{"socials":{"x":"https://x.com/ngrokhq","github":"https://github.com/ngrok","linkedin":"https://linkedin.com/company/ngrok","youtube":"https://www.youtube.com/@ngrokHQ"},"links":[{"header":"Product","items":[{"label":"Gateway","href":"https://ngrok.com/docs/gateway/overview"},{"label":"AI Gateway","href":"https://ngrok.ai"},{"label":"Traffic Policy","href":"https://ngrok.com/docs/traffic-policy"},{"label":"Secure Tunnels","href":"https://ngrok.com/docs/agent/overview"},{"label":"Traffic Observability","href":"https://ngrok.com/docs/obs"},{"label":"Kubernetes Operator","href":"https://ngrok.com/docs/k8s"}]},{"header":"Problems we solve","items":[{"label":"API gateway","href":"https://ngrok.com/docs/guides/api-gateway/get-started"},{"label":"AI gateway","href":"https://ngrok.ai/"},{"label":"Webhook gateway","href":"https://ngrok.com/docs/gateway/examples/webhook-gateway"},{"label":"Ephemeral workloads","href":"https://ngrok.com/docs/gateway/examples/ephemeral-workloads"},{"label":"Customer connectivity","href":"https://ngrok.com/use-cases/saas-customer-connectivity"},{"label":"Device gateway","href":"https://ngrok.com/docs/guides/device-gateway/overview"},{"label":"Remote access","href":"https://ngrok.com/docs/guides/ssh-rdp"},{"label":"Share localhost","href":"https://ngrok.com/use-cases/share-localhost"},{"label":"Connect MCPs to AI providers","href":"https://ngrok.com/docs/gateway/api-gateway/mcp-gateway"},{"label":"Test webhooks","href":"https://ngrok.com/docs/share-localhost/webhooks"},{"label":"Access remote K8s clusters","href":"https://ngrok.com/docs/k8s/guides/local-projection"},{"label":"Minecraft","href":"https://ngrok.com/docs/gateway/examples/minecraft"}]},{"header":"Resources","items":[{"label":"Docs","href":"https://ngrok.com/docs/start"},{"label":"Guides","href":"https://ngrok.com/docs/guides"},{"label":"Pricing","href":"https://ngrok.com/pricing"},{"label":"Download","href":"https://ngrok.com/download"},{"label":"Security","href":"https://ngrok.com/security"},{"label":"Trust","href":"https://trust.ngrok.com/"},{"label":"Case studies","href":"https://ngrok.com/customers"},{"label":"Integrations","href":"https://ngrok.com/docs/integrations"},{"label":"Support","href":"https://ngrok.com/support"},{"label":"Abuse","href":"https://ngrok.com/abuse"},{"label":"Status","href":"https://status.ngrok.com/"}]},{"header":"Company","items":[{"label":"About","href":"https://ngrok.com/about"},{"label":"Contact","href":"https://ngrok.com/contact"},{"label":"Blog","href":"https://ngrok.com/blog"},{"label":"Newsletter","href":"https://ngrok.com/newsletter"},{"label":"Press","href":"https://ngrok.com/press"},{"label":"Brand","href":"https://ngrok.com/brand"},{"label":"Careers","href":"https://ngrok.com/careers"}]}]},"seo":{"metatags":{"canonical":"https://ngrok.com/docs"},"indexing":"navigable"},"fonts":{"heading":{"family":"Roobert","weight":600,"source":"https://assets.ngrok.com/fonts/roobert/roobert-proportional-vf.woff2","format":"woff2"},"body":{"family":"Roobert","weight":400,"source":"https://assets.ngrok.com/fonts/roobert/roobert-proportional-vf.woff2","format":"woff2"}},"styling":{"codeblocks":{"theme":{"light":"css-variables","dark":"css-variables"}},"latex":true},"integrations":{"posthog":{"apiKey":"phc_mUGMN4JlTzthGcz0XNK0z6NKUqdeQMn7rPRAM3mifjQ","apiHost":"https://e.ngrok.com"}},"contextual":{"options":["copy","view",{"title":"Connect the ngrok MCP server","description":"Let your AI agent manage your ngrok account","icon":"plug","href":"https://ngrok.com/docs/mcp-server"},"claude",{"title":"Connect to Cursor","description":"Install the ngrok MCP server in Cursor","icon":"/img/icons/cursor.svg","href":{"base":"cursor://anysphere.cursor-deeplink/mcp/install","query":[{"key":"name","value":"ngrok"},{"key":"config","value":"eyJ1cmwiOiJodHRwczovL21jcC5uZ3Jvay5jb20vbWNwIiwiYXV0aCI6eyJDTElFTlRfSUQiOiJpYW1jbGlfM0tlSzhkOHNPNGQ5UkFyQVJ4N1JGemNUVnRPIn19"}]}},{"title":"Connect to VS Code","description":"Install the ngrok MCP server in VS Code","icon":"/img/icons/vscode.svg","href":"vscode:mcp/install?%7B%22name%22%3A%22ngrok%22%2C%22type%22%3A%22http%22%2C%22url%22%3A%22https%3A%2F%2Fmcp.ngrok.com%2Fmcp%22%7D"},"assistant","chatgpt","perplexity","grok","aistudio","devin","download-spec"],"display":"header"},"navigation":{"pages":[]}},"deployment":{"deploymentMetadataValue":{"subdomain":"ngrok","hasAudioNarration":false,"actualSubdomain":"ngrok","customDomains":["ngrok.com"],"gitSource":{"type":"github","owner":"ngrok","repo":"ngrok-docs","deployBranch":"main","contentDirectory":"","isPrivate":false,"mountPath":"","label":""},"feedback":{"thumbs":true,"edits":true,"issues":true},"entitlements":{"AI_CHAT":{"status":"DISABLED"},"CONTEXTUAL_FEEDBACK":{"status":"ENABLED"},"CODE_SNIPPET_FEEDBACK":{"status":"ENABLED"},"WEB_MCP":{"status":"ENABLED"},"NARRATION":{"status":"DISABLED"}},"buildId":"6af7ade2f7f591b5b5b1a4d4","clientVersion":"0.0.4142","searchFilterCounts":[{"language":"default","tag":"Reference","count":4349},{"language":"default","tag":"Errors","count":1906},{"language":"default","tag":"Error codes","count":1904},{"language":"default","tag":"Gateway","count":485},{"language":"default","tag":"Named error codes","count":362},{"language":"default","tag":"ERR_NGROK_0-999","count":304},{"language":"default","tag":"Integrations","count":300},{"language":"default","tag":"ERR_NGROK_1000-1999","count":271},{"language":"default","tag":"AI Gateway","count":258},{"language":"default","tag":"ERR_NGROK_10000 and above","count":257}],"searchSettings":{"isFiltersEnabled":false}},"assistantConfig":{"enableAskAiButton":false,"enableAskAiSearchBar":true,"deflection":{"enabled":true,"email":"support@ngrok.com","showHelpButton":true}},"basePath":"/docs","hasChatPermissions":false,"hasWebMcpPermissions":true,"toggles":[],"googleFontsInlined":false},"customCss":[{"filePath":"style.css","content":"img{max-width:100%;height:auto}.tooltip{font-weight:bold;text-decoration:none!important;position:relative}.tooltip::after{content:\"\";position:absolute;bottom:0;left:0;width:100%;height:1px;border-bottom:1px dotted rgba(0, 0, 0, 0.8)}:root .tooltip,[data-theme=\"light\"] .tooltip,.light .tooltip{color:rgba(0, 0, 0, 0.8)}:root .tooltip::after,[data-theme=\"light\"] .tooltip::after,.light .tooltip::after{border-bottom-color:rgba(0, 0, 0, 0.8)}[data-theme=\"dark\"] .tooltip,.dark .tooltip{color:rgba(255, 255, 255, 0.8)}[data-theme=\"dark\"] .tooltip::after,.dark .tooltip::after{border-bottom-color:rgba(255, 255, 255, 0.8)}@media (prefers-color-scheme: light){.tooltip{color:rgba(0, 0, 0, 0.8)}.tooltip::after{border-bottom-color:rgba(0, 0, 0, 0.8)}}@media (prefers-color-scheme: dark){.tooltip{color:rgba(255, 255, 255, 0.8)}.tooltip::after{border-bottom-color:rgba(255, 255, 255, 0.8)}}:root td .tooltip{font-weight:inherit;color:inherit}:root .mcp-examples .tooltip{font-weight:inherit;color:inherit}td button[data-state]{text-align:start}td button[data-state] code{white-space:nowrap;word-break:normal;overflow-wrap:normal}td:first-child:has(>button[data-state] code){width:100%}table:has(td:first-child>button[data-state] code) td,table:has(td:first-child>button[data-state] code) th{min-width:0;white-space:nowrap}td .icon{mask-size:contain;-webkit-mask-size:contain}td .tooltip:has(>.icon){text-decoration:none}td .tooltip:has(>.icon)::after{display:none}td pre,td code{word-wrap:break-word;overflow-wrap:break-word;word-break:break-word}td pre{white-space:pre-wrap}td:has(pre),td:has(code){min-width:240px;width:auto}td pre{min-width:200px}td code{min-width:150px}@font-face{font-family:\"Roobert\";src:url(\"https://assets.ngrok.com/fonts/roobert/roobert-proportional-vf.woff2\")\n format(\"woff2 supports variations\"),\n url(\"https://assets.ngrok.com/fonts/roobert/roobert-proportional-vf.woff2\")\n format(\"woff2-variations\");font-weight:300 900;font-display:swap;font-style:normal}@font-face{font-family:\"JetBrains Mono\";src:url(\"https://assets.ngrok.com/fonts/jetbrains/jetbrainsmono-wght.woff2\")\n format(\"woff2 supports variations\"),\n url(\"https://assets.ngrok.com/fonts/jetbrains/jetbrainsmono-wght.woff2\")\n format(\"woff2-variations\");font-weight:100 800;font-display:swap;font-style:normal}@font-face{font-family:\"JetBrains Mono\";src:url(\"https://assets.ngrok.com/fonts/jetbrains/jetbrainsmono-italic-wght.woff2\")\n format(\"woff2 supports variations\"),\n url(\"https://assets.ngrok.com/fonts/jetbrains/jetbrainsmono-italic-wght.woff2\")\n format(\"woff2-variations\");font-weight:100 800;font-display:swap;font-style:italic}code,pre,pre code,.hljs,.token{font-family:\"JetBrains Mono\",\n ui-monospace,\n SFMono-Regular,\n Menlo,\n Monaco,\n Consolas,\n Liberation Mono,\n Courier New,\n monospace!important}#topbar-cta-button span.bg-primary-dark{background-color:#121212!important;transition:background-color!important}#topbar-cta-button a:hover span.bg-primary-dark{background-color:#171717!important}#topbar-cta-button span.text-white{color:#fff!important}.dark #topbar-cta-button span.bg-primary-dark,[data-theme=\"dark\"] #topbar-cta-button span.bg-primary-dark{background-color:rgba(255, 255, 255, 0.85)!important;transition:background-color!important}.dark #topbar-cta-button a:hover span.bg-primary-dark,[data-theme=\"dark\"] #topbar-cta-button a:hover span.bg-primary-dark{background-color:#fff!important}.dark #topbar-cta-button span.text-white,[data-theme=\"dark\"] #topbar-cta-button span.text-white{color:#000!important}#topbar-cta-button svg{color:#fff!important}.dark #topbar-cta-button svg,[data-theme=\"dark\"] #topbar-cta-button svg{color:#000!important}footer#footer a{overflow:visible;text-overflow:clip;white-space:nowrap}@media (min-width: 768px) and (max-width: 880px){footer#footer a{white-space:normal}}.card :is([data-component-part=\"card-title\"],[data-component-part=\"card-content\"]){text-wrap:pretty}.nav-tabs-item>div.absolute.bottom-0{height:2px!important}.docs-home-updates a{display:block;padding-block:1.25rem;border-bottom:1px solid #d4d4d4;text-decoration:none}.docs-home-updates .docs-home-date{display:block;color:#666;font-size:0.8125rem;margin-bottom:0.375rem}.docs-home-updates .docs-home-title{color:#121212;font-weight:600}.docs-home-updates a:focus-visible{outline:2px solid rgb(var(--primary));outline-offset:4px}.docs-home-updates a:hover .docs-home-title{text-decoration:underline}.docs-home-updates p{margin:0.375rem 0 0;color:#525252;font-size:0.875rem;line-height:1.5}.dark .docs-home-updates .docs-home-title{color:#f5f5f5}.dark .docs-home-updates a{border-color:#404040}.dark .docs-home-updates a:focus-visible{outline-color:rgb(var(--primary-light))}.dark .docs-home-updates .docs-home-date,.dark .docs-home-updates p{color:#a3a3a3}.nav-anchor div:has(>img[src$=\"/img/icons/gateway.svg\"]){background:rgb(16 185 129 / 0.2)!important}.nav-anchor div:has(>img[src$=\"/img/icons/ai-gateway.svg\"]){background:rgb(245 158 11 / 0.2)!important}.nav-anchor div:has(>img[src$=\"/img/icons/share-localhost.svg\"]){background:rgb(168 85 247 / 0.2)!important}.nav-anchor img[src*=\"/img/icons/\"]{opacity:1;background:transparent!important}html:has(.nav-tabs-item[data-active=\"true\"]:is([href^=\"/gateway/\"],[href^=\"/docs/gateway/\"])),.product-gateway{--primary: 4 120 87;--primary-light: 52 211 153;--primary-dark: 4 120 87}html:has(.nav-tabs-item[data-active=\"true\"]:is([href^=\"/ai-gateway/\"],[href^=\"/docs/ai-gateway/\"])),.product-ai-gateway{--primary: 180 83 9;--primary-light: 251 191 36;--primary-dark: 180 83 9}html:has(.nav-tabs-item[data-active=\"true\"]:is([href^=\"/share-localhost/\"],[href^=\"/docs/share-localhost/\"])),.product-share-localhost{--primary: 147 51 234;--primary-light: 192 132 252;--primary-dark: 147 51 234}#navbar>.max-w-8xl{max-width:none}#navbar .h-16{padding-inline:0.5rem}@media (min-width: 64rem){#navbar a:has(>.nav-logo){margin-left:1.5rem}}@media (min-width: 64rem){#navbar div:has(>.nav-tabs){padding-inline:2rem 1rem}#navbar .nav-tabs{flex:1}#navbar .nav-tabs-item:is([href^=\"/for-agents\"],[href^=\"/docs/for-agents\"]){margin-left:auto}}#navbar .nav-tabs-item:focus-visible{outline:none}#navbar .nav-tabs-item:focus-visible::before{content:\"\";position:absolute;inset:0.625rem -0.5rem;border-radius:0.375rem;box-shadow:0 0 0 4px rgb(var(--primary) / 0.3);pointer-events:none}:is(html.dark,html[data-theme=\"dark\"]) #navbar .nav-tabs-item:focus-visible::before{box-shadow:0 0 0 4px rgb(var(--primary-light) / 0.35)}@media (min-width: 64rem) and (max-width: 80rem){#navbar .nav-tabs{column-gap:1rem}}@media (min-width: 100rem){:root{--topbar-tabs-height: 0rem !important;--experiment-search-width: 9rem;--experiment-actions-width: 27rem}#navbar>.max-w-8xl{position:relative}#navbar div:has(>.nav-tabs){position:absolute;top:0;left:10rem;right:calc(0.5rem + var(--experiment-actions-width) + var(--experiment-search-width) + 2.5rem);height:4rem;padding-inline:0;z-index:30}#navbar .nav-tabs{white-space:nowrap}#navbar .h-16>div>div:has(>a>.nav-logo){flex:1 1 auto}#navbar .h-16>div>div:has(>#search-bar-entry){flex:0 0 var(--experiment-search-width)}#navbar .h-16>div>div:has(>nav){flex:0 0 var(--experiment-actions-width)}#navbar .h-16>div{border-bottom:0}}@media (min-width: 106rem){:root{--experiment-search-width: 12rem}}@media (min-width: 64rem){#navbar.is-not-custom.is-not-center~div:has(>#sidebar){--experiment-sidebar-width: 18rem;--experiment-article-width: 52rem;--experiment-content-width: 74rem;max-width:none;padding-inline:1rem}#navbar.is-not-custom.is-not-center~div>#sidebar{width:var(--experiment-sidebar-width)}#navbar.is-not-custom.is-wide~div:has(>#sidebar)>#content-container{flex:none;width:min(\n var(--experiment-article-width),\n calc(100% - var(--experiment-sidebar-width) - 2rem)\n );margin-left:clamp(\n 2rem,\n calc((100% - var(--experiment-article-width)) / 2 - var(--experiment-sidebar-width)),\n max(2rem, calc(100% - var(--experiment-sidebar-width) - var(--experiment-content-width)))\n );margin-right:auto}#navbar.is-not-custom.is-not-center.is-not-wide~div:has(>#sidebar)>#content-container{flex:none;width:min(\n var(--experiment-content-width),\n calc(100% - var(--experiment-sidebar-width) - 2rem)\n );margin-left:clamp(\n 2rem,\n calc((100% - var(--experiment-article-width)) / 2 - var(--experiment-sidebar-width)),\n max(2rem, calc(100% - var(--experiment-sidebar-width) - var(--experiment-content-width)))\n );margin-right:auto}#navbar.is-not-custom.is-not-center~div #content-area{flex:1;min-width:0;width:auto;margin-inline:0;padding-inline:0}#navbar.is-not-custom.is-not-center.is-not-wide~div #content-side-layout{flex:none;width:19rem}}.ngrok-consent{--ngrok-consent-surface: #ffffff;--ngrok-consent-border: #d4d4d4;--ngrok-consent-text: #121212;--ngrok-consent-action-bg-hover: rgb(115 115 115 / 10%);--ngrok-consent-focus-ring: rgb(0 120 196 / 35%);--ngrok-consent-shadow:\n 0 1px 13px 0 rgb(0 0 0 / 5%),\n 0 4px 6px -4px rgb(0 0 0 / 10%),\n 0 10px 15px -3px rgb(0 0 0 / 10%);position:fixed;inset-inline:0;bottom:1rem;z-index:2147483000;display:flex;justify-content:center;padding-inline:1rem;pointer-events:none}:is(html.dark,html[data-theme=\"dark\"]) .ngrok-consent{--ngrok-consent-surface: #171717;--ngrok-consent-border: #404040;--ngrok-consent-text: #ffffff;--ngrok-consent-focus-ring: rgb(0 188 255 / 35%);--ngrok-consent-shadow:\n 0 1px 13px 0 rgb(0 0 0 / 15%),\n 0 4px 6px -4px rgb(0 0 0 / 30%),\n 0 10px 15px -3px rgb(0 0 0 / 30%)}@media (min-width: 640px){.ngrok-consent{bottom:2.5rem}}.ngrok-consent-panel{pointer-events:auto;display:flex;align-items:center;gap:0.75rem;width:fit-content;max-width:100%;padding:0.5rem 0.75rem;border:1px solid var(--ngrok-consent-border);border-radius:1rem;background-color:var(--ngrok-consent-surface);color:var(--ngrok-consent-text);box-shadow:var(--ngrok-consent-shadow);transition-property:opacity, translate;transition-timing-function:cubic-bezier(0, 0, 0.2, 1);transition-duration:400ms}.ngrok-consent-panel[hidden]{display:none}.ngrok-consent-panel[data-state=\"closed\"]{pointer-events:none;opacity:0;transition-duration:200ms}@media (prefers-reduced-motion: no-preference){.ngrok-consent-panel[data-state=\"closed\"]{translate:0 calc(100% + 2.5rem)}}.ngrok-consent-message{margin:0;font-size:0.875rem;line-height:1.25rem}.ngrok-consent-actions{display:flex;align-items:center;gap:0.375rem}.ngrok-consent-icon-button{display:inline-flex;flex-shrink:0;align-items:center;justify-content:center;width:1.5rem;height:1.5rem;padding:0;border:1px solid transparent;border-radius:0.375rem;background-color:transparent;color:var(--ngrok-consent-text);cursor:pointer;outline:2px solid transparent;outline-offset:2px;text-decoration:none;transition:transform 150ms cubic-bezier(0, 0, 0.2, 1)}.ngrok-consent-icon-button:hover{background-color:var(--ngrok-consent-action-bg-hover)}.ngrok-consent-icon-button:active{transform:scale(0.97)}.ngrok-consent-icon-button:focus-visible{box-shadow:0 0 0 4px var(--ngrok-consent-focus-ring)}.ngrok-consent-icon-button svg{width:1.25rem;height:1.25rem;flex-shrink:0}img[src$=\"/img/icons/cursor.svg\"],img[src$=\"/img/icons/vscode.svg\"]{opacity:0.5}.dark img[src$=\"/img/icons/cursor.svg\"],.dark img[src$=\"/img/icons/vscode.svg\"]{filter:invert(1)}:root{--mint-foreground: oklch(18.2% 0 0);--mint-token-comment: oklch(18.2% 0 0 / 60%);--mint-token-constant: oklch(55.5% 0.163 48.998);--mint-token-string: oklch(50.8% 0.118 165.612);--mint-token-string-expression: oklch(50.8% 0.118 165.612);--mint-token-keyword: oklch(49.6% 0.265 301.924);--mint-token-function: oklch(50% 0.134 242.749);--mint-token-parameter: oklch(51.4% 0.222 16.935);--mint-token-punctuation: oklch(50% 0.134 242.749);--mint-token-link: oklch(50% 0.134 242.749);--mantle-code-bg: oklch(98.5% 0 0);--mantle-code-border: oklch(87% 0 0);--mantle-code-header-text: oklch(37.1% 0 0);--mantle-code-active-tab-bg: oklch(55.6% 0 0 / 15%)}:is(html.dark,html[data-theme=\"dark\"]){--mint-foreground: #fff;--mint-token-comment: rgb(255 255 255 / 50%);--mint-token-constant: oklch(87.9% 0.169 91.605);--mint-token-string: oklch(84.5% 0.143 164.978);--mint-token-string-expression: oklch(84.5% 0.143 164.978);--mint-token-keyword: oklch(82.7% 0.119 306.383);--mint-token-function: oklch(82.8% 0.111 230.318);--mint-token-parameter: oklch(81% 0.117 11.638);--mint-token-punctuation: oklch(82.8% 0.111 230.318);--mint-token-link: oklch(82.8% 0.111 230.318);--mantle-code-bg: oklch(18.2% 0 0);--mantle-code-border: oklch(37.1% 0 0);--mantle-code-header-text: oklch(87% 0 0)}.callout:is([data-callout-type=\"note\"],[data-callout-type=\"info\"]){--mantle-intent-500: oklch(68.5% 0.169 237.323);--mantle-intent-700: oklch(50% 0.134 242.749);--mantle-intent-900: oklch(39.1% 0.09 240.876)}.callout:is([data-callout-type=\"tip\"],[data-callout-type=\"check\"]){--mantle-intent-500: oklch(69.6% 0.17 162.48);--mantle-intent-700: oklch(50.8% 0.118 165.612);--mantle-intent-900: oklch(37.8% 0.077 168.94)}.callout[data-callout-type=\"warning\"]{--mantle-intent-500: oklch(76.9% 0.188 70.08);--mantle-intent-700: oklch(55.5% 0.163 48.998);--mantle-intent-900: oklch(41.4% 0.112 45.904)}.callout[data-callout-type=\"danger\"]{--mantle-intent-500: oklch(64.5% 0.246 16.439);--mantle-intent-700: oklch(51.4% 0.222 16.935);--mantle-intent-900: oklch(41% 0.159 10.272)}:is(html.dark,html[data-theme=\"dark\"]) .callout:is([data-callout-type=\"note\"],[data-callout-type=\"info\"]){--mantle-intent-700: oklch(82.8% 0.111 230.318);--mantle-intent-900: oklch(95.1% 0.026 236.824)}:is(html.dark,html[data-theme=\"dark\"]) .callout:is([data-callout-type=\"tip\"],[data-callout-type=\"check\"]){--mantle-intent-700: oklch(84.5% 0.143 164.978);--mantle-intent-900: oklch(95% 0.052 163.051)}:is(html.dark,html[data-theme=\"dark\"]) .callout[data-callout-type=\"warning\"]{--mantle-intent-700: oklch(87.9% 0.169 91.605);--mantle-intent-900: oklch(96.2% 0.059 95.617)}:is(html.dark,html[data-theme=\"dark\"]) .callout[data-callout-type=\"danger\"]{--mantle-intent-700: oklch(81% 0.117 11.638);--mantle-intent-900: oklch(94.1% 0.03 12.58)}.callout:is([data-callout-type=\"note\"],[data-callout-type=\"info\"],[data-callout-type=\"tip\"],[data-callout-type=\"check\"],[data-callout-type=\"warning\"],[data-callout-type=\"danger\"]){gap:0.75rem;padding:0.875rem 1rem;border-radius:0.375rem;border-color:color-mix(in oklab, var(--mantle-intent-500) 50%, transparent);background-color:color-mix(in oklab, var(--mantle-intent-500) 10%, transparent)}.callout:is([data-callout-type=\"note\"],[data-callout-type=\"info\"],[data-callout-type=\"tip\"],[data-callout-type=\"check\"],[data-callout-type=\"warning\"],[data-callout-type=\"danger\"]) :is([data-component-part=\"callout-icon\"] svg,[data-component-part=\"callout-content\"]){color:var(--mantle-intent-700)}.callout:is([data-callout-type=\"note\"],[data-callout-type=\"info\"],[data-callout-type=\"tip\"],[data-callout-type=\"check\"],[data-callout-type=\"warning\"],[data-callout-type=\"danger\"]) [data-component-part=\"callout-icon\"]{width:1.25rem;margin-top:0.25rem}.callout:is([data-callout-type=\"note\"],[data-callout-type=\"info\"],[data-callout-type=\"tip\"],[data-callout-type=\"check\"],[data-callout-type=\"warning\"],[data-callout-type=\"danger\"]) [data-component-part=\"callout-icon\"] svg{width:1.25rem;height:1.25rem}.callout:is([data-callout-type=\"note\"],[data-callout-type=\"info\"],[data-callout-type=\"tip\"],[data-callout-type=\"check\"],[data-callout-type=\"warning\"],[data-callout-type=\"danger\"]) [data-component-part=\"callout-content\"]{font-size:1rem;line-height:1.75rem}.callout:is([data-callout-type=\"note\"],[data-callout-type=\"info\"],[data-callout-type=\"tip\"],[data-callout-type=\"check\"],[data-callout-type=\"warning\"],[data-callout-type=\"danger\"]) [data-component-part=\"callout-content\"] ul>li::before{background-color:var(--mantle-intent-700)}.callout:is([data-callout-type=\"note\"],[data-callout-type=\"info\"],[data-callout-type=\"tip\"],[data-callout-type=\"check\"],[data-callout-type=\"warning\"],[data-callout-type=\"danger\"]) [data-component-part=\"callout-content\"] code{color:var(--mantle-intent-900)!important;background-color:color-mix(in oklab, var(--mantle-intent-500) 10%, transparent);border:1px solid color-mix(in oklab, var(--mantle-intent-500) 20%, transparent)}:root :is(.code-block,.code-group){--mint-background: var(--mantle-code-bg);padding:0;border:1px solid var(--mantle-code-border);border-radius:0.375rem;background-color:var(--mantle-code-bg)}:root .code-group .code-block{border:0;border-radius:0 0 0.375rem 0.375rem}.code-block [data-component-part=\"code-block-root\"]{border-radius:inherit}.code-block [data-component-part=\"code-block-root\"]{font-size:0.8125rem}:root .code-block pre{line-height:1.25rem}.code-block [data-component-part=\"scroll-area-viewport\"]{padding:1rem}.code-block [data-component-part=\"code-block-header\"],.code-group [data-component-part=\"code-group-tab-bar\"]{border-bottom:1px solid var(--mantle-code-border);border-radius:0.375rem 0.375rem 0 0}.code-block [data-component-part=\"code-block-header\"]{padding-block:0.5rem;padding-inline:1rem 0.625rem}.code-block [data-component-part=\"code-block-header-filename\"]{color:var(--mantle-code-header-text)}.code-group [data-component-part=\"code-group-tab-bar\"] [role=\"tab\"]{margin-block:0.5rem;color:var(--mantle-code-header-text)}.code-group [data-component-part=\"code-group-tab-bar\"] [role=\"tab\"][aria-selected=\"true\"]{color:var(--mint-foreground)}.code-group [data-component-part=\"code-group-tab-bar\"] [role=\"tab\"]>div:first-child{padding-block:0.125rem;border-radius:0.25rem}.code-group [data-component-part=\"code-group-tab-bar\"] [role=\"tab\"][aria-selected=\"true\"]>div:first-child{background-color:var(--mantle-code-active-tab-bg)}:root .code-group [data-component-part=\"code-group-tab-bar\"] [role=\"tab\"]:hover>div:first-child{color:var(--mint-foreground)}:root .code-group [data-component-part=\"code-group-tab-bar\"] [role=\"tab\"][aria-selected=\"false\"]:hover>div:first-child{background-color:oklch(55.6% 0 0 / 10%)}.code-group [data-component-part=\"code-group-tab-bar\"] [role=\"tab\"]>div:not(:first-child){display:none}.code-block-copy-button button{background-color:var(--mantle-code-bg)!important}.code-block-copy-button button:hover{background-color:var(--mantle-code-active-tab-bg)!important}:root .code-block-copy-button svg{color:var(--mint-token-comment)}:root{--mantle-card-border: oklch(87% 0 0);--mantle-card-bg: #fff;--mantle-card-border-muted: oklch(92.2% 0 0);--mantle-base-bg: oklch(98.5% 0 0);--mantle-separator: oklch(55.6% 0 0 / 20%);--mantle-text-body: oklch(18.2% 0 0 / 75%);--mantle-text-muted: oklch(18.2% 0 0 / 60%);--mantle-text-gray-600: oklch(43.9% 0 0)}:is(html.dark,html[data-theme=\"dark\"]){--mantle-card-border: oklch(37.1% 0 0);--mantle-card-bg: oklch(20.5% 0 0);--mantle-card-border-muted: oklch(26.9% 0 0);--mantle-base-bg: oklch(18.2% 0 0);--mantle-separator: oklch(70.8% 0 0 / 20%);--mantle-text-body: rgb(255 255 255 / 70%);--mantle-text-muted: rgb(255 255 255 / 50%);--mantle-text-gray-600: oklch(70.8% 0 0)}:root .prose :not(pre)>code{padding:0 0.25rem;border:1px solid oklch(55.6% 0 0 / 15%);border-radius:0.375rem;background-color:oklch(55.6% 0 0 / 5%);color:var(--mint-foreground);font-size:0.8em}:root .prose a>code{color:inherit}:root [data-component-part=\"tabs-list\"]{border-color:var(--mantle-separator)}:root [data-component-part=\"tab-button\"]{padding-block:0.75rem calc(0.75rem - 2px);border-bottom-width:3px;color:var(--mantle-text-gray-600);font-weight:500;line-height:1.25rem}:root [data-component-part=\"tab-button\"]:hover{border-color:transparent;color:var(--mint-foreground)}:root [data-component-part=\"tab-button\"][data-active=\"true\"]{border-color:var(--mint-foreground);color:var(--mint-foreground)}:root .tab-container>div>.prose>:last-child{margin-bottom:0}:root .prose table{border:1px solid var(--mantle-card-border);border-collapse:separate;border-spacing:0;border-radius:0.5rem;background-color:var(--mantle-card-bg)}:root .prose table th{height:2.75rem;padding:0 0.75rem;border-bottom:1px solid var(--mantle-card-border-muted);background-color:var(--mantle-base-bg);color:var(--mantle-text-muted);font-size:1rem;font-weight:500;line-height:1.75rem;vertical-align:middle}:root .prose table th:first-child{border-top-left-radius:calc(0.5rem - 1px)}:root .prose table th:last-child{border-top-right-radius:calc(0.5rem - 1px)}:root .prose table td{padding:0.75rem;border-bottom:0;color:var(--mantle-text-body);font-size:1rem;line-height:1.75rem}:root .prose table tbody tr{border-bottom:0}:root .prose table tbody tr+tr>td{border-top:1px solid var(--mantle-card-border-muted)}:root .card{border-color:var(--mantle-card-border);border-radius:0.375rem;background-color:var(--mantle-card-bg)}:root .card [data-component-part=\"card-content-container\"]{padding:1.5rem}:root .card [data-component-part=\"card-title\"]{font-weight:500}:root .accordion-group{border-width:1px 0;border-color:var(--mantle-separator);border-radius:0}:root details.accordion{border-width:0;border-radius:0;background-color:transparent}:root details.accordion:not(.accordion-group>details){border-block:1px solid var(--mantle-separator)}:root .accordion [data-component-part=\"accordion-button\"]{padding:1rem 0;gap:1rem;background-color:transparent}:root .accordion [data-component-part=\"accordion-title\"]{color:var(--mint-foreground)}:root .accordion [data-component-part=\"accordion-caret-right\"]{order:1;background-color:var(--mantle-text-muted);mask:url(\"data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 256 256'%3E%3Cpath d='M213.66,101.66l-80,80a8,8,0,0,1-11.32,0l-80-80A8,8,0,0,1,53.66,90.34L128,164.69l74.34-74.35a8,8,0,0,1,11.32,11.32Z'/%3E%3C/svg%3E\") center / contain no-repeat;transition:transform 200ms ease-out}:root .accordion [data-component-part=\"accordion-caret-right\"] svg{display:none}:root details.accordion[open]>summary [data-component-part=\"accordion-caret-right\"]{transform:rotate(180deg)}:root .accordion [data-component-part=\"accordion-content\"]{padding:0 0 1rem}:root #sidebar li>a{border-radius:0.375rem}"}],"page":{"pagePath":"ai-gateway/guides/securing-endpoints","slug":"/ai-gateway/guides/securing-endpoints","pageMetadata":{"title":"Secure Your Gateway","description":"Give each client its own access key so you can track its usage and revoke it without affecting the others. Clients never hold your provider keys.","href":"/ai-gateway/guides/securing-endpoints"},"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: \"Give each client its own access key so you can track its usage and revoke it without affecting the others. Clients never hold your provider keys.\"\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`,ul:`ul`,..._provideComponents(),...props.components},{CodeBlock,Heading,Warning}=_components;if(!CodeBlock)_missingMdxReference(`CodeBlock`,true);if(!Heading)_missingMdxReference(`Heading`,true);if(!Warning)_missingMdxReference(`Warning`,true);return _jsxs(_Fragment,{children:[_jsxs(_components.p,{children:[_jsx(_components.a,{href:`/ai-gateway/concepts/access-keys`,children:`Access keys`}),` authenticate every request to `,_jsx(_components.code,{children:`https://gateway.ngrok.ai`}),`. The AI Gateway validates each key before forwarding traffic. Upstream provider credentials are managed separately—see `,_jsx(_components.a,{href:`/ai-gateway/concepts/access-keys#access-keys-vs-provider-keys`,children:`Access keys vs provider keys`}),`.`]}),`\n`,_jsx(Heading,{level:`2`,id:`how-it-works`,children:`How it works`}),`\n`,_jsxs(_components.ol,{children:[`\n`,_jsxs(_components.li,{children:[_jsx(_components.a,{href:`/ai-gateway/concepts/access-keys`,children:`Create an access key`}),` in `,_jsx(_components.a,{href:`https://app.ngrok.ai`,children:`app.ngrok.ai`}),` or via the AI Gateway API`]}),`\n`,_jsxs(_components.li,{children:[`Send the key as `,_jsx(_components.code,{children:`Authorization: Bearer ng-xxxxx-g1-xxxxx`}),` (OpenAI-compatible APIs) or `,_jsx(_components.code,{children:`x-api-key`}),` (Anthropic native API)`]}),`\n`,_jsx(_components.li,{children:`The gateway validates the key on every request`}),`\n`,_jsx(_components.li,{children:`Invalid or missing keys are rejected—requests do not reach providers`}),`\n`]}),`\n`,_jsx(CodeBlock,{filename:``,numberOfLines:`11`,language:`python`,children:_jsx(_components.pre,{className:`shiki shiki-themes css-variables css-variables`,style:{backgroundColor:`var(--mint-background)`,\"--shiki-dark-bg\":`var(--mint-background)`,color:`var(--mint-foreground)`,\"--shiki-dark\":`var(--mint-foreground)`},language:`python`,children:_jsxs(_components.code,{language:`python`,numberOfLines:`11`,children:[_jsxs(_components.span,{className:`line`,children:[_jsx(_components.span,{style:{color:`var(--mint-token-keyword, #bd2864)`,\"--shiki-dark\":`var(--mint-token-keyword, #bd2864)`},children:`from`}),_jsx(_components.span,{style:{color:`var(--mint-foreground)`,\"--shiki-dark\":`var(--mint-foreground)`},children:` openai `}),_jsx(_components.span,{style:{color:`var(--mint-token-keyword, #bd2864)`,\"--shiki-dark\":`var(--mint-token-keyword, #bd2864)`},children:`import`}),_jsx(_components.span,{style:{color:`var(--mint-foreground)`,\"--shiki-dark\":`var(--mint-foreground)`},children:` OpenAI`})]}),`\n`,_jsx(_components.span,{className:`line`}),`\n`,_jsxs(_components.span,{className:`line`,children:[_jsx(_components.span,{style:{color:`var(--mint-foreground)`,\"--shiki-dark\":`var(--mint-foreground)`},children:`client `}),_jsx(_components.span,{style:{color:`var(--mint-token-keyword, #bd2864)`,\"--shiki-dark\":`var(--mint-token-keyword, #bd2864)`},children:`=`}),_jsx(_components.span,{style:{color:`var(--mint-token-function, #0068d6)`,\"--shiki-dark\":`var(--mint-token-function, #0068d6)`},children:` OpenAI`}),_jsx(_components.span,{style:{color:`var(--mint-token-punctuation, #171717)`,\"--shiki-dark\":`var(--mint-token-punctuation, #171717)`},children:`(`})]}),`\n`,_jsxs(_components.span,{className:`line`,children:[_jsx(_components.span,{style:{color:`var(--mint-token-punctuation, #171717)`,\"--shiki-dark\":`var(--mint-token-punctuation, #171717)`},children:` base_url`}),_jsx(_components.span,{style:{color:`var(--mint-token-keyword, #bd2864)`,\"--shiki-dark\":`var(--mint-token-keyword, #bd2864)`},children:`=`}),_jsx(_components.span,{style:{color:`var(--mint-token-string-expression, #297a3a)`,\"--shiki-dark\":`var(--mint-token-string-expression, #297a3a)`},children:`\"https://gateway.ngrok.ai/v1\"`}),_jsx(_components.span,{style:{color:`var(--mint-token-punctuation, #171717)`,\"--shiki-dark\":`var(--mint-token-punctuation, #171717)`},children:`,`})]}),`\n`,_jsxs(_components.span,{className:`line`,children:[_jsx(_components.span,{style:{color:`var(--mint-token-punctuation, #171717)`,\"--shiki-dark\":`var(--mint-token-punctuation, #171717)`},children:` api_key`}),_jsx(_components.span,{style:{color:`var(--mint-token-keyword, #bd2864)`,\"--shiki-dark\":`var(--mint-token-keyword, #bd2864)`},children:`=`}),_jsx(_components.span,{style:{color:`var(--mint-token-string-expression, #297a3a)`,\"--shiki-dark\":`var(--mint-token-string-expression, #297a3a)`},children:`\"ng-xxxxx-g1-xxxxx\"`}),_jsx(_components.span,{style:{color:`var(--mint-token-comment, #666666)`,\"--shiki-dark\":`var(--mint-token-comment, #666666)`},children:` # Your access key`})]}),`\n`,_jsx(_components.span,{className:`line`,children:_jsx(_components.span,{style:{color:`var(--mint-token-punctuation, #171717)`,\"--shiki-dark\":`var(--mint-token-punctuation, #171717)`},children:`)`})}),`\n`,_jsx(_components.span,{className:`line`}),`\n`,_jsxs(_components.span,{className:`line`,children:[_jsx(_components.span,{style:{color:`var(--mint-foreground)`,\"--shiki-dark\":`var(--mint-foreground)`},children:`response `}),_jsx(_components.span,{style:{color:`var(--mint-token-keyword, #bd2864)`,\"--shiki-dark\":`var(--mint-token-keyword, #bd2864)`},children:`=`}),_jsx(_components.span,{style:{color:`var(--mint-foreground)`,\"--shiki-dark\":`var(--mint-foreground)`},children:` client`}),_jsx(_components.span,{style:{color:`var(--mint-token-punctuation, #171717)`,\"--shiki-dark\":`var(--mint-token-punctuation, #171717)`},children:`.`}),_jsx(_components.span,{style:{color:`var(--mint-foreground)`,\"--shiki-dark\":`var(--mint-foreground)`},children:`chat`}),_jsx(_components.span,{style:{color:`var(--mint-token-punctuation, #171717)`,\"--shiki-dark\":`var(--mint-token-punctuation, #171717)`},children:`.`}),_jsx(_components.span,{style:{color:`var(--mint-foreground)`,\"--shiki-dark\":`var(--mint-foreground)`},children:`completions`}),_jsx(_components.span,{style:{color:`var(--mint-token-punctuation, #171717)`,\"--shiki-dark\":`var(--mint-token-punctuation, #171717)`},children:`.`}),_jsx(_components.span,{style:{color:`var(--mint-token-function, #0068d6)`,\"--shiki-dark\":`var(--mint-token-function, #0068d6)`},children:`create`}),_jsx(_components.span,{style:{color:`var(--mint-token-punctuation, #171717)`,\"--shiki-dark\":`var(--mint-token-punctuation, #171717)`},children:`(`})]}),`\n`,_jsxs(_components.span,{className:`line`,children:[_jsx(_components.span,{style:{color:`var(--mint-token-punctuation, #171717)`,\"--shiki-dark\":`var(--mint-token-punctuation, #171717)`},children:` model`}),_jsx(_components.span,{style:{color:`var(--mint-token-keyword, #bd2864)`,\"--shiki-dark\":`var(--mint-token-keyword, #bd2864)`},children:`=`}),_jsx(_components.span,{style:{color:`var(--mint-token-string-expression, #297a3a)`,\"--shiki-dark\":`var(--mint-token-string-expression, #297a3a)`},children:`\"gpt-4o\"`}),_jsx(_components.span,{style:{color:`var(--mint-token-punctuation, #171717)`,\"--shiki-dark\":`var(--mint-token-punctuation, #171717)`},children:`,`})]}),`\n`,_jsxs(_components.span,{className:`line`,children:[_jsx(_components.span,{style:{color:`var(--mint-token-punctuation, #171717)`,\"--shiki-dark\":`var(--mint-token-punctuation, #171717)`},children:` messages`}),_jsx(_components.span,{style:{color:`var(--mint-token-keyword, #bd2864)`,\"--shiki-dark\":`var(--mint-token-keyword, #bd2864)`},children:`=`}),_jsx(_components.span,{style:{color:`var(--mint-token-punctuation, #171717)`,\"--shiki-dark\":`var(--mint-token-punctuation, #171717)`},children:`[{`}),_jsx(_components.span,{style:{color:`var(--mint-token-string-expression, #297a3a)`,\"--shiki-dark\":`var(--mint-token-string-expression, #297a3a)`},children:`\"role\"`}),_jsx(_components.span,{style:{color:`var(--mint-token-punctuation, #171717)`,\"--shiki-dark\":`var(--mint-token-punctuation, #171717)`},children:`: `}),_jsx(_components.span,{style:{color:`var(--mint-token-string-expression, #297a3a)`,\"--shiki-dark\":`var(--mint-token-string-expression, #297a3a)`},children:`\"user\"`}),_jsx(_components.span,{style:{color:`var(--mint-token-punctuation, #171717)`,\"--shiki-dark\":`var(--mint-token-punctuation, #171717)`},children:`, `}),_jsx(_components.span,{style:{color:`var(--mint-token-string-expression, #297a3a)`,\"--shiki-dark\":`var(--mint-token-string-expression, #297a3a)`},children:`\"content\"`}),_jsx(_components.span,{style:{color:`var(--mint-token-punctuation, #171717)`,\"--shiki-dark\":`var(--mint-token-punctuation, #171717)`},children:`: `}),_jsx(_components.span,{style:{color:`var(--mint-token-string-expression, #297a3a)`,\"--shiki-dark\":`var(--mint-token-string-expression, #297a3a)`},children:`\"Hello!\"`}),_jsx(_components.span,{style:{color:`var(--mint-token-punctuation, #171717)`,\"--shiki-dark\":`var(--mint-token-punctuation, #171717)`},children:`}]`})]}),`\n`,_jsx(_components.span,{className:`line`,children:_jsx(_components.span,{style:{color:`var(--mint-token-punctuation, #171717)`,\"--shiki-dark\":`var(--mint-token-punctuation, #171717)`},children:`)`})}),`\n`]})})}),`\n`,_jsx(_components.p,{children:`The AI Gateway replaces your access key with provider credentials from your configuration before forwarding to the upstream provider.`}),`\n`,_jsx(Heading,{level:`2`,id:`per-client-keys`,children:`Per-client keys`}),`\n`,_jsx(_components.p,{children:`Create separate access keys for each client or application:`}),`\n`,_jsxs(_components.ul,{children:[`\n`,_jsx(_components.li,{children:`Revoke one client without affecting others`}),`\n`,_jsx(_components.li,{children:`Track usage per key`}),`\n`,_jsxs(_components.li,{children:[`Assign different `,_jsx(_components.a,{href:`/ai-gateway/guides/access-key-configurations`,children:`configurations`}),` to limit scope per client`]}),`\n`]}),`\n`,_jsxs(_components.p,{children:[`Create access keys with the `,_jsx(_components.a,{href:`/ai-gateway/api-reference/access-keys/create`,children:`Access Keys API`}),`. Authorize the request with your `,_jsx(_components.a,{href:`/ai-gateway/concepts/access-keys#credentials-overview`,children:`AI Gateway API key`}),`.`]}),`\n`,_jsx(CodeBlock,{filename:``,numberOfLines:`4`,language:`shellscript`,children:_jsx(_components.pre,{className:`shiki shiki-themes css-variables css-variables`,style:{backgroundColor:`var(--mint-background)`,\"--shiki-dark-bg\":`var(--mint-background)`,color:`var(--mint-foreground)`,\"--shiki-dark\":`var(--mint-foreground)`},language:`shellscript`,children:_jsxs(_components.code,{language:`shellscript`,numberOfLines:`4`,children:[_jsxs(_components.span,{className:`line`,children:[_jsx(_components.span,{style:{color:`var(--mint-token-function, #0068d6)`,\"--shiki-dark\":`var(--mint-token-function, #0068d6)`},children:`curl`}),_jsx(_components.span,{style:{color:`var(--mint-token-string, #297a3a)`,\"--shiki-dark\":`var(--mint-token-string, #297a3a)`},children:` -X`}),_jsx(_components.span,{style:{color:`var(--mint-token-string, #297a3a)`,\"--shiki-dark\":`var(--mint-token-string, #297a3a)`},children:` POST`}),_jsx(_components.span,{style:{color:`var(--mint-token-string, #297a3a)`,\"--shiki-dark\":`var(--mint-token-string, #297a3a)`},children:` https://api.ngrok.ai/access-keys`}),_jsx(_components.span,{style:{color:`var(--mint-foreground)`,\"--shiki-dark\":`var(--mint-foreground)`},children:` \\\\`})]}),`\n`,_jsxs(_components.span,{className:`line`,children:[_jsx(_components.span,{style:{color:`var(--mint-token-string, #297a3a)`,\"--shiki-dark\":`var(--mint-token-string, #297a3a)`},children:` -H`}),_jsx(_components.span,{style:{color:`var(--mint-token-string-expression, #297a3a)`,\"--shiki-dark\":`var(--mint-token-string-expression, #297a3a)`},children:` \"Authorization: Bearer $AI_GATEWAY_API_KEY\"`}),_jsx(_components.span,{style:{color:`var(--mint-foreground)`,\"--shiki-dark\":`var(--mint-foreground)`},children:` \\\\`})]}),`\n`,_jsxs(_components.span,{className:`line`,children:[_jsx(_components.span,{style:{color:`var(--mint-token-string, #297a3a)`,\"--shiki-dark\":`var(--mint-token-string, #297a3a)`},children:` -H`}),_jsx(_components.span,{style:{color:`var(--mint-token-string-expression, #297a3a)`,\"--shiki-dark\":`var(--mint-token-string-expression, #297a3a)`},children:` \"Content-Type: application/json\"`}),_jsx(_components.span,{style:{color:`var(--mint-foreground)`,\"--shiki-dark\":`var(--mint-foreground)`},children:` \\\\`})]}),`\n`,_jsxs(_components.span,{className:`line`,children:[_jsx(_components.span,{style:{color:`var(--mint-token-string, #297a3a)`,\"--shiki-dark\":`var(--mint-token-string, #297a3a)`},children:` -d`}),_jsx(_components.span,{style:{color:`var(--mint-token-string-expression, #297a3a)`,\"--shiki-dark\":`var(--mint-token-string-expression, #297a3a)`},children:` '{ \"name\": \"Production web app\" }'`})]}),`\n`]})})}),`\n`,_jsxs(_components.p,{children:[`Delete access keys with the `,_jsx(_components.a,{href:`/ai-gateway/api-reference/access-keys/delete`,children:`Access Keys API`}),`. Authorize the request with your `,_jsx(_components.a,{href:`/ai-gateway/concepts/access-keys#credentials-overview`,children:`AI Gateway API key`}),`.`]}),`\n`,_jsx(CodeBlock,{filename:``,numberOfLines:`2`,language:`shellscript`,children:_jsx(_components.pre,{className:`shiki shiki-themes css-variables css-variables`,style:{backgroundColor:`var(--mint-background)`,\"--shiki-dark-bg\":`var(--mint-background)`,color:`var(--mint-foreground)`,\"--shiki-dark\":`var(--mint-foreground)`},language:`shellscript`,children:_jsxs(_components.code,{language:`shellscript`,numberOfLines:`2`,children:[_jsxs(_components.span,{className:`line`,children:[_jsx(_components.span,{style:{color:`var(--mint-token-function, #0068d6)`,\"--shiki-dark\":`var(--mint-token-function, #0068d6)`},children:`curl`}),_jsx(_components.span,{style:{color:`var(--mint-token-string, #297a3a)`,\"--shiki-dark\":`var(--mint-token-string, #297a3a)`},children:` -X`}),_jsx(_components.span,{style:{color:`var(--mint-token-string, #297a3a)`,\"--shiki-dark\":`var(--mint-token-string, #297a3a)`},children:` DELETE`}),_jsx(_components.span,{style:{color:`var(--mint-token-string, #297a3a)`,\"--shiki-dark\":`var(--mint-token-string, #297a3a)`},children:` https://api.ngrok.ai/access-keys/aigk_xxxxx`}),_jsx(_components.span,{style:{color:`var(--mint-foreground)`,\"--shiki-dark\":`var(--mint-foreground)`},children:` \\\\`})]}),`\n`,_jsxs(_components.span,{className:`line`,children:[_jsx(_components.span,{style:{color:`var(--mint-token-string, #297a3a)`,\"--shiki-dark\":`var(--mint-token-string, #297a3a)`},children:` -H`}),_jsx(_components.span,{style:{color:`var(--mint-token-string-expression, #297a3a)`,\"--shiki-dark\":`var(--mint-token-string-expression, #297a3a)`},children:` \"Authorization: Bearer $AI_GATEWAY_API_KEY\"`})]}),`\n`]})})}),`\n`,_jsxs(_components.p,{children:[`See the `,_jsx(_components.a,{href:`/ai-gateway/api-reference/access-keys/delete`,children:`Access Keys API reference`}),`.`]}),`\n`,_jsx(Warning,{children:_jsx(_components.p,{children:`Deletion is permanent. Clients using the revoked key receive authentication errors immediately.`})}),`\n`,_jsx(Heading,{level:`2`,id:`protecting-provider-keys`,children:`Protecting provider keys`}),`\n`,_jsx(_components.p,{children:`Store provider keys in app.ngrok.ai and reference them in configurations. Clients only ever hold the access key.`}),`\n`,_jsxs(_components.p,{children:[`See `,_jsx(_components.a,{href:`/ai-gateway/guides/attaching-provider-keys`,children:`Provider Keys`}),`.`]}),`\n`,_jsx(Heading,{level:`2`,id:`next-steps`,children:`Next steps`}),`\n`,_jsxs(_components.ul,{children:[`\n`,_jsxs(_components.li,{children:[_jsx(_components.a,{href:`/ai-gateway/concepts/access-keys`,children:`Access Keys`}),`: Create and manage keys`]}),`\n`,_jsxs(_components.li,{children:[_jsx(_components.a,{href:`/ai-gateway/guides/access-key-configurations`,children:`Access Key Configurations`}),`: Scope and credentials per key`]}),`\n`,_jsxs(_components.li,{children:[_jsx(_components.a,{href:`/ai-gateway/reference/error-codes`,children:`Error Codes`}),`: Authentication errors`]}),`\n`]})]})}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":{"codeStyling":{"theme":{"light":"css-variables","dark":"css-variables"}},"config":{},"pageMetadata":{"title":"Secure Your Gateway","description":"Give each client its own access key so you can track its usage and revoke it without affecting the others. Clients never hold your provider keys.","href":"/ai-gateway/guides/securing-endpoints"}}},"mdxSourceWithNoJs":null},"mdxExtracts":{"tableOfContents":[{"title":"How it works","slug":"how-it-works","depth":2,"children":[]},{"title":"Per-client keys","slug":"per-client-keys","depth":2,"children":[]},{"title":"Protecting provider keys","slug":"protecting-provider-keys","depth":2,"children":[]},{"title":"Next steps","slug":"next-steps","depth":2,"children":[]}],"codeExamples":{}},"jsLinks":["/docs/_mintlify/custom/ngrok/05d9da4b27f4fed8/redirect-to-ngrok.js","/docs/_mintlify/custom/ngrok/cabe0d94bdb3d370/persist-query-params.js","/docs/_mintlify/custom/ngrok/52bc6b535db9c274/definition-wrapper.js","/docs/_mintlify/custom/ngrok/6167f7a3c0c9913f/consent.js"],"subdomain":"ngrok","siteName":"ngrok documentation","title":"Secure Your Gateway - ngrok documentation","navMaps":{"firstHrefInVersion":{},"firstHrefInLanguage":{}},"lastModified":"2026-11-12T19:23:31.671Z","originalFileLocation":"ai-gateway/guides/securing-endpoints.mdx"},"headHtml":"\u003cscript data-mint-head>(function(){var d=document.documentElement,p=null;if(!p){try{p=localStorage.getItem(\"isDarkMode\")}catch(e){}if(p==='true')p='dark';else if(p==='false')p='light';if(p!=='light'\u0026\u0026p!=='dark'\u0026\u0026p!=='system')p=\"system\"}var r=p==='system'?(matchMedia(\"(prefers-color-scheme: dark)\").matches?'dark':'light'):p;d.classList.remove(r==='dark'?'light':'dark');d.classList.add(r);d.setAttribute(\"data-theme-preference\",p)})();\u003c/script>\u003cmeta data-mint-head name=\"description\" content=\"Give each client its own access key so you can track its usage and revoke it without affecting the others. Clients never hold your provider keys.\">\u003cmeta data-mint-head name=\"application-name\" content=\"ngrok documentation\">\u003cmeta data-mint-head name=\"generator\" content=\"Mintlify\">\u003clink data-mint-head rel=\"icon\" type=\"image/png\" sizes=\"192x192\" href=\"/docs/mintlify-assets/_mintlify/favicons/ngrok/EDFj7szN2_Vn64sM/_generated/favicon/android-chrome-192x192.png\" media=\"(prefers-color-scheme: light)\">\u003clink data-mint-head rel=\"apple-touch-icon\" type=\"image/png\" sizes=\"180x180\" href=\"/docs/mintlify-assets/_mintlify/favicons/ngrok/EDFj7szN2_Vn64sM/_generated/favicon/apple-touch-icon.png\">\u003clink data-mint-head rel=\"icon\" type=\"image/png\" sizes=\"16x16\" href=\"/docs/mintlify-assets/_mintlify/favicons/ngrok/EDFj7szN2_Vn64sM/_generated/favicon/favicon-16x16.png\" media=\"(prefers-color-scheme: light)\">\u003clink data-mint-head rel=\"icon\" type=\"image/png\" sizes=\"32x32\" href=\"/docs/mintlify-assets/_mintlify/favicons/ngrok/EDFj7szN2_Vn64sM/_generated/favicon/favicon-32x32.png\" media=\"(prefers-color-scheme: light)\">\u003clink data-mint-head rel=\"shortcut icon\" type=\"image/x-icon\" href=\"/docs/mintlify-assets/_mintlify/favicons/ngrok/EDFj7szN2_Vn64sM/_generated/favicon/favicon.ico\" media=\"(prefers-color-scheme: light)\">\u003clink data-mint-head rel=\"icon\" type=\"image/png\" sizes=\"192x192\" href=\"/docs/mintlify-assets/_mintlify/favicons/ngrok/EDFj7szN2_Vn64sM/_generated/favicon-dark/android-chrome-192x192.png\" media=\"(prefers-color-scheme: dark)\">\u003clink data-mint-head rel=\"icon\" type=\"image/png\" sizes=\"16x16\" href=\"/docs/mintlify-assets/_mintlify/favicons/ngrok/EDFj7szN2_Vn64sM/_generated/favicon-dark/favicon-16x16.png\" media=\"(prefers-color-scheme: dark)\">\u003clink data-mint-head rel=\"icon\" type=\"image/png\" sizes=\"32x32\" href=\"/docs/mintlify-assets/_mintlify/favicons/ngrok/EDFj7szN2_Vn64sM/_generated/favicon-dark/favicon-32x32.png\" media=\"(prefers-color-scheme: dark)\">\u003clink data-mint-head rel=\"shortcut icon\" type=\"image/x-icon\" href=\"/docs/mintlify-assets/_mintlify/favicons/ngrok/EDFj7szN2_Vn64sM/_generated/favicon-dark/favicon.ico\" media=\"(prefers-color-scheme: dark)\">\u003cmeta data-mint-head property=\"og:title\" content=\"Secure Your Gateway - ngrok documentation\">\u003cmeta data-mint-head property=\"og:description\" content=\"Give each client its own access key so you can track its usage and revoke it without affecting the others. Clients never hold your provider keys.\">\u003cmeta data-mint-head property=\"og:site_name\" content=\"ngrok documentation\">\u003cmeta data-mint-head property=\"og:url\" content=\"https://ngrok.com/docs/ai-gateway/guides/securing-endpoints\">\u003cmeta data-mint-head property=\"og:type\" content=\"website\">\u003cmeta data-mint-head property=\"og:image\" content=\"https://ngrok.mintlify.site/docs/_mintlify/api/og/v2?division=Guides\u0026amp;title=Secure+Your+Gateway\u0026amp;description=Give+each+client+its+own+access+key+so+you+can+track+its+usage+and+revoke+it+without+affecting+the+others.+Clients+never+hold+your+provider+keys.\u0026amp;theme=7e270833a601ca6e053d019e\u0026amp;signature=46400a745b818e81480f991ce4a482ad147d7f1ecc844fd7ffdd34a15c9ec81e\">\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=\"Secure Your Gateway - ngrok documentation\">\u003cmeta data-mint-head name=\"twitter:description\" content=\"Give each client its own access key so you can track its usage and revoke it without affecting the others. Clients never hold your provider keys.\">\u003cmeta data-mint-head name=\"twitter:image\" content=\"https://ngrok.mintlify.site/docs/_mintlify/api/og/v2?division=Guides\u0026amp;title=Secure+Your+Gateway\u0026amp;description=Give+each+client+its+own+access+key+so+you+can+track+its+usage+and+revoke+it+without+affecting+the+others.+Clients+never+hold+your+provider+keys.\u0026amp;theme=7e270833a601ca6e053d019e\u0026amp;signature=46400a745b818e81480f991ce4a482ad147d7f1ecc844fd7ffdd34a15c9ec81e\">\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=\"/docs/mintlify-assets/_mintlify/favicons/ngrok/EDFj7szN2_Vn64sM/_generated/favicon/browserconfig.xml\">\u003cmeta data-mint-head name=\"apple-mobile-web-app-title\" content=\"ngrok documentation\">\u003cmeta data-mint-head name=\"msapplication-TileColor\" content=\"#0078C4\">\u003clink data-mint-head rel=\"canonical\" href=\"https://ngrok.com/docs/ai-gateway/guides/securing-endpoints\">\u003clink data-mint-head rel=\"alternate\" type=\"application/xml\" href=\"/docs/sitemap.xml\">\u003clink data-mint-head rel=\"alternate\" type=\"text/markdown\" href=\"/docs/ai-gateway/guides/securing-endpoints.md\">\u003cscript data-mint-head type=\"application/ld+json\">{\"@context\":\"https://schema.org\",\"@graph\":[{\"@type\":\"Organization\",\"@id\":\"https://ngrok.com/#organization\",\"name\":\"ngrok documentation\",\"url\":\"https://ngrok.com\",\"logo\":{\"@type\":\"ImageObject\",\"url\":\"https://mintcdn.com/ngrok/_7R3hf69rnKiCshG/logo/compact-light.svg?fit=max\u0026auto=format\u0026n=_7R3hf69rnKiCshG\u0026q=85\u0026s=d79c7eb9cf2273745608b35a1b312b05\"}},{\"@type\":\"WebSite\",\"@id\":\"https://ngrok.com/docs#website\",\"name\":\"ngrok documentation\",\"url\":\"https://ngrok.com/docs\",\"publisher\":{\"@id\":\"https://ngrok.com/#organization\"}},{\"@type\":\"WebPage\",\"@id\":\"https://ngrok.com/docs/ai-gateway/guides/securing-endpoints#webpage\",\"url\":\"https://ngrok.com/docs/ai-gateway/guides/securing-endpoints\",\"name\":\"Secure Your Gateway\",\"description\":\"Give each client its own access key so you can track its usage and revoke it without affecting the others. Clients never hold your provider keys.\",\"dateModified\":\"2026-11-12T19:23:31.671Z\",\"isPartOf\":{\"@id\":\"https://ngrok.com/docs#website\"},\"breadcrumb\":{\"@id\":\"https://ngrok.com/docs/ai-gateway/guides/securing-endpoints#breadcrumb\"}},{\"@type\":\"BreadcrumbList\",\"@id\":\"https://ngrok.com/docs/ai-gateway/guides/securing-endpoints#breadcrumb\",\"itemListElement\":[{\"@type\":\"ListItem\",\"position\":1,\"name\":\"Guides\",\"item\":\"https://ngrok.com/docs/ai-gateway/guides/playground\"},{\"@type\":\"ListItem\",\"position\":2,\"name\":\"Secure Your Gateway\",\"item\":\"https://ngrok.com/docs/ai-gateway/guides/securing-endpoints\"}]},{\"@type\":[\"Article\",\"TechArticle\"],\"@id\":\"https://ngrok.com/docs/ai-gateway/guides/securing-endpoints#article\",\"headline\":\"Secure Your Gateway\",\"name\":\"Secure Your Gateway\",\"description\":\"Give each client its own access key so you can track its usage and revoke it without affecting the others. Clients never hold your provider keys.\",\"url\":\"https://ngrok.com/docs/ai-gateway/guides/securing-endpoints\",\"mainEntityOfPage\":{\"@id\":\"https://ngrok.com/docs/ai-gateway/guides/securing-endpoints#webpage\"},\"dateModified\":\"2026-11-12T19:23:31.671Z\",\"publisher\":{\"@id\":\"https://ngrok.com/#organization\"},\"isPartOf\":{\"@id\":\"https://ngrok.com/docs#website\"}}]}\u003c/script>\u003cscript data-mint-head type=\"application/ld+json\">{\"@context\":\"https://schema.org\",\"@type\":\"WebSite\",\"name\":\"ngrok documentation\",\"publisher\":{\"@type\":\"Organization\",\"name\":\"ngrok documentation\"},\"provider\":{\"@type\":\"Organization\",\"name\":\"Mintlify\",\"url\":\"https://mintlify.com\"}}\u003c/script>","agentPointerHref":"/docs/ai-gateway/guides/securing-endpoints.md","siteName":"ngrok documentation","nav":{"global":null,"tabs":[{"tab":"Start","pages":[{"title":"Start","href":"/start"}]},{"tab":"Gateway","pages":[{"title":"Gateway","href":"/gateway/overview"}]},{"tab":"AI Gateway","anchors":[{"anchor":"AI Gateway","icon":"https://mintlify.s3.us-west-1.amazonaws.com/ngrok/img/icons/ai-gateway.svg","pages":[{"title":"AI Gateway Overview","sidebarTitle":"Overview","icon":"house","href":"/ai-gateway/overview"},{"title":"AI Gateway Quickstart","sidebarTitle":"Quickstart","icon":"rocket","href":"/ai-gateway/quickstart"},{"title":"How It Works","icon":"gears","href":"/ai-gateway/how-it-works"},{"title":"Model Catalog","icon":"book","href":"/ai-gateway/reference/model-catalog"},{"title":"AI Gateway FAQ","sidebarTitle":"FAQ","icon":"circle-question","href":"/ai-gateway/faq"},{"group":"Concepts","pages":[{"title":"Access Keys","href":"/ai-gateway/concepts/access-keys"},{"title":"AI Gateway Credits","sidebarTitle":"Credits","href":"/ai-gateway/concepts/credits"},{"title":"Hosted Tool Billing","href":"/ai-gateway/concepts/hosted-tools"},{"title":"AI Gateway Providers","sidebarTitle":"Providers","href":"/ai-gateway/concepts/providers"},{"title":"AI Gateway Models","sidebarTitle":"Models","href":"/ai-gateway/concepts/models"},{"title":"Open-Weight Models","href":"/ai-gateway/concepts/open-weight-models"},{"title":"Custom Providers","href":"/ai-gateway/concepts/custom-providers"},{"title":"Bring Your Own Keys","href":"/ai-gateway/concepts/bring-your-own-keys"},{"title":"AI Gateway Firewall","sidebarTitle":"Firewall","href":"/ai-gateway/concepts/firewall"}]},{"group":"Getting Started With","pages":[{"title":"Use OpenAI with the AI Gateway","sidebarTitle":"OpenAI","href":"/ai-gateway/providers/openai"},{"title":"Use Anthropic with the AI Gateway","sidebarTitle":"Anthropic","href":"/ai-gateway/providers/anthropic"},{"title":"Use OpenRouter with the AI Gateway","sidebarTitle":"OpenRouter","href":"/ai-gateway/providers/openrouter"},{"title":"Use Google Gemini with the AI Gateway","sidebarTitle":"Google","href":"/ai-gateway/providers/google"},{"title":"Use Groq with the AI Gateway","sidebarTitle":"Groq","href":"/ai-gateway/providers/groq"},{"title":"Use DeepSeek with the AI Gateway","sidebarTitle":"DeepSeek","href":"/ai-gateway/providers/deepseek"},{"title":"Use xAI with the AI Gateway","sidebarTitle":"xAI","href":"/ai-gateway/providers/xai"},{"title":"Use Mistral AI with the AI Gateway","sidebarTitle":"Mistral AI","href":"/ai-gateway/providers/mistral"},{"title":"Use Moonshot AI with the AI Gateway","sidebarTitle":"Moonshot AI","href":"/ai-gateway/providers/moonshotai"},{"title":"Use Z.ai with the AI Gateway","sidebarTitle":"Z.ai","href":"/ai-gateway/providers/z-ai"},{"title":"Use QwenCloud with the AI Gateway","sidebarTitle":"QwenCloud","href":"/ai-gateway/providers/qwencloud"},{"title":"Use MiniMax with the AI Gateway","sidebarTitle":"MiniMax","href":"/ai-gateway/providers/minimax"},{"title":"Use Tencent TokenHub with the AI Gateway","sidebarTitle":"Tencent TokenHub","href":"/ai-gateway/providers/tokenhub"},{"title":"Use Typesafe AI with the AI Gateway","sidebarTitle":"Typesafe AI","href":"/ai-gateway/providers/typesafeai"},{"title":"Use Liquid AI with the AI Gateway","sidebarTitle":"Liquid AI","href":"/ai-gateway/providers/liquid"},{"title":"Use LLM API with the AI Gateway","sidebarTitle":"LLM API","href":"/ai-gateway/providers/llmapi"},{"title":"Use Hyperbolic with the AI Gateway","sidebarTitle":"Hyperbolic","href":"/ai-gateway/providers/hyperbolic"},{"title":"Use InceptionLabs with the AI Gateway","sidebarTitle":"InceptionLabs","href":"/ai-gateway/providers/inceptionlabs"},{"title":"Use Inference.net with the AI Gateway","sidebarTitle":"Inference.net","href":"/ai-gateway/providers/inference-net"},{"title":"Connect Ollama to the AI Gateway","sidebarTitle":"Ollama","href":"/ai-gateway/custom-providers/ollama"},{"title":"Connect LM Studio to the AI Gateway","sidebarTitle":"LM Studio","href":"/ai-gateway/custom-providers/lm-studio"},{"title":"Connect vLLM to the AI Gateway","sidebarTitle":"vLLM","href":"/ai-gateway/custom-providers/vllm"},{"title":"Connect Azure OpenAI to the AI Gateway","sidebarTitle":"Azure OpenAI","href":"/ai-gateway/custom-providers/azure-openai"}]},{"group":"SDKs","pages":[{"title":"Connect SDKs to the AI Gateway","sidebarTitle":"Overview","href":"/ai-gateway/sdks/index"},{"title":"Use the OpenAI SDK with the AI Gateway","sidebarTitle":"OpenAI SDK","href":"/ai-gateway/sdks/openai"},{"title":"Use the Anthropic SDK with the AI Gateway","sidebarTitle":"Anthropic SDK","href":"/ai-gateway/sdks/anthropic"},{"title":"Google Gen AI SDK","href":"/ai-gateway/sdks/google"},{"title":"Vercel AI SDK","href":"/ai-gateway/sdks/vercel-ai-sdk"},{"title":"Use TanStack AI with the AI Gateway","sidebarTitle":"TanStack AI","href":"/ai-gateway/sdks/tanstack-ai"},{"title":"Use LangChain with the AI Gateway","sidebarTitle":"LangChain","href":"/ai-gateway/sdks/langchain"},{"title":"Use Other SDKs with the AI Gateway","sidebarTitle":"Other SDKs","href":"/ai-gateway/sdks/other"}]},{"group":"Agents","pages":[{"title":"Connect Coding Agents to the AI Gateway","sidebarTitle":"Overview","href":"/ai-gateway/agents/index"},{"title":"Use Claude Code with the AI Gateway","sidebarTitle":"Claude Code","href":"/ai-gateway/agents/claude-code"},{"title":"Use Codex with the AI Gateway","sidebarTitle":"Codex","href":"/ai-gateway/agents/codex"},{"title":"Use Cursor with the AI Gateway","sidebarTitle":"Cursor","href":"/ai-gateway/agents/cursor"},{"title":"Use Hermes Agent with the AI Gateway","sidebarTitle":"Hermes","href":"/ai-gateway/agents/hermes"},{"title":"Use OpenCode with the AI Gateway","sidebarTitle":"OpenCode","href":"/ai-gateway/agents/opencode"},{"title":"Use the Pi Coding Agent with the AI Gateway","sidebarTitle":"Pi","href":"/ai-gateway/agents/pi"},{"title":"Use Zed with the AI Gateway","sidebarTitle":"Zed","href":"/ai-gateway/agents/zed"},{"title":"Use Other Coding Agents with the AI Gateway","sidebarTitle":"Other Agents","href":"/ai-gateway/agents/other"}]},{"group":"Guides","pages":[{"title":"Compare Models in the Playground","href":"/ai-gateway/guides/playground"},{"title":"Choose How to Reach Providers","href":"/ai-gateway/guides/configuring-providers"},{"title":"Pay with Credits","href":"/ai-gateway/guides/pay-with-credits"},{"title":"Bring Your Own Provider Key","href":"/ai-gateway/guides/attaching-provider-keys"},{"title":"Use a Model You Run Yourself","href":"/ai-gateway/guides/use-a-model-you-run-yourself"},{"title":"Choose a Model","href":"/ai-gateway/guides/model-selection-strategies"},{"title":"Automatic Model Selection","href":"/ai-gateway/guides/automatic-model-selection"},{"title":"Configure Fallback Models","href":"/ai-gateway/guides/configure-fallback-models"},{"title":"Use Virtual Models","sidebarTitle":"Virtual Models","href":"/ai-gateway/guides/virtual-models"},{"title":"Upload and Use Files","sidebarTitle":"Files","href":"/ai-gateway/guides/files"},{"title":"Typed-Question APIs","sidebarTitle":"Decisions and System One","href":"/ai-gateway/guides/decisions-and-system-one"},{"title":"Restrict Providers and Models","href":"/ai-gateway/guides/restrict-providers-and-models"},{"title":"Set Up an Access Key Configuration","href":"/ai-gateway/guides/access-key-configurations"},{"title":"Guard Agent Tool Calls with Firewall","sidebarTitle":"Guard Agent Tool Calls","href":"/ai-gateway/guides/firewall-policies"},{"title":"Configure Provider Key Failover","description":"Add backup provider keys so the AI Gateway can retry with another key when one is rate limited or out of quota.","href":"/ai-gateway/guides/key-selection-failover"},{"title":"Secure Your Gateway","href":"/ai-gateway/guides/securing-endpoints"},{"title":"Configure Account Settings","description":"Set default timeouts, token limits, and request capture for every AI Gateway request, from the ngrok.ai dashboard or the API.","href":"/ai-gateway/guides/account-settings"},{"title":"Handle Gateway Errors","href":"/ai-gateway/guides/error-handling"},{"title":"Debug Failed Requests","href":"/ai-gateway/guides/debugging"},{"title":"Find Out Why a Request Failed Over","sidebarTitle":"Why a Request Failed Over","href":"/ai-gateway/guides/why-a-request-failed-over"}]},{"group":"Observability","pages":[{"title":"Observability Overview","sidebarTitle":"Overview","href":"/ai-gateway/observability/index"}]},{"group":"Examples","pages":[{"title":"Multi-Provider Failover","href":"/ai-gateway/examples/multi-provider-failover"},{"title":"Multi-Key Failover","href":"/ai-gateway/examples/multi-key-failover"},{"title":"Restrict Models and Providers","href":"/ai-gateway/examples/model-filtering"},{"title":"Securely Put Your Self-Hosted n8n Workflows Online","sidebarTitle":"Grant Access to Your n8n Workflows","href":"/gateway/examples/n8n"}]},{"group":"Reference","pages":[{"title":"Error Codes Reference","href":"/ai-gateway/reference/error-codes"},{"title":"Firewall Reference","sidebarTitle":"Firewall","href":"/ai-gateway/reference/firewall"}]},{"group":"API Reference","pages":[{"title":"AI Gateway API","sidebarTitle":"Overview","href":"/ai-gateway/api-reference/overview"},{"group":"Access Keys","pages":[{"openapi":"openapi/ai-gateway.yaml GET /access-keys","title":"List AI Gateway Access Keys","href":"/ai-gateway/api-reference/access-keys/list"},{"openapi":"openapi/ai-gateway.yaml POST /access-keys","title":"Create an AI Gateway Access Key","href":"/ai-gateway/api-reference/access-keys/create"},{"openapi":"openapi/ai-gateway.yaml GET /access-keys/{id}","title":"Get an AI Gateway Access Key","href":"/ai-gateway/api-reference/access-keys/get"},{"openapi":"openapi/ai-gateway.yaml PATCH /access-keys/{id}","title":"Update an AI Gateway Access Key","href":"/ai-gateway/api-reference/access-keys/update"},{"openapi":"openapi/ai-gateway.yaml DELETE /access-keys/{id}","title":"Delete an AI Gateway Access Key","href":"/ai-gateway/api-reference/access-keys/delete"}]},{"group":"Access Key Configurations","pages":[{"openapi":"openapi/ai-gateway.yaml GET /access-key-configurations","title":"List AI Gateway Access Key Configurations","href":"/ai-gateway/api-reference/access-key-configurations/list"},{"openapi":"openapi/ai-gateway.yaml POST /access-key-configurations","title":"Create an AI Gateway Access Key Configuration","href":"/ai-gateway/api-reference/access-key-configurations/create"},{"openapi":"openapi/ai-gateway.yaml GET /access-key-configurations/{id}","title":"Get an AI Gateway Access Key Configuration","href":"/ai-gateway/api-reference/access-key-configurations/get"},{"openapi":"openapi/ai-gateway.yaml PATCH /access-key-configurations/{id}","title":"Update an AI Gateway Access Key Configuration","href":"/ai-gateway/api-reference/access-key-configurations/update"},{"openapi":"openapi/ai-gateway.yaml DELETE /access-key-configurations/{id}","title":"Delete an AI Gateway Access Key Configuration","href":"/ai-gateway/api-reference/access-key-configurations/delete"}]},{"group":"Firewall Policies","pages":[{"openapi":"openapi/ai-gateway.yaml GET /firewall-policies","title":"List AI Gateway Firewall Policies","href":"/ai-gateway/api-reference/firewall-policies/list"},{"openapi":"openapi/ai-gateway.yaml POST /firewall-policies","title":"Create an AI Gateway Firewall Policy","href":"/ai-gateway/api-reference/firewall-policies/create"},{"openapi":"openapi/ai-gateway.yaml GET /firewall-policies/{id}","title":"Get an AI Gateway Firewall Policy","href":"/ai-gateway/api-reference/firewall-policies/get"},{"openapi":"openapi/ai-gateway.yaml PATCH /firewall-policies/{id}","title":"Update an AI Gateway Firewall Policy","href":"/ai-gateway/api-reference/firewall-policies/update"},{"openapi":"openapi/ai-gateway.yaml DELETE /firewall-policies/{id}","title":"Delete an AI Gateway Firewall Policy","href":"/ai-gateway/api-reference/firewall-policies/delete"}]},{"group":"Provider Keys","pages":[{"openapi":"openapi/ai-gateway.yaml GET /provider-keys","title":"List AI Gateway Provider Keys","href":"/ai-gateway/api-reference/provider-keys/list"},{"openapi":"openapi/ai-gateway.yaml POST /provider-keys","title":"Create an AI Gateway Provider Key","href":"/ai-gateway/api-reference/provider-keys/create"},{"openapi":"openapi/ai-gateway.yaml GET /provider-keys/{id}","title":"Get an AI Gateway Provider Key","href":"/ai-gateway/api-reference/provider-keys/get"},{"openapi":"openapi/ai-gateway.yaml PATCH /provider-keys/{id}","title":"Update an AI Gateway Provider Key","href":"/ai-gateway/api-reference/provider-keys/update"},{"openapi":"openapi/ai-gateway.yaml DELETE /provider-keys/{id}","title":"Delete an AI Gateway Provider Key","href":"/ai-gateway/api-reference/provider-keys/delete"},{"openapi":"openapi/ai-gateway.yaml POST /provider-keys/{id}/rotate","title":"Rotate an AI Gateway Provider Key","href":"/ai-gateway/api-reference/provider-keys/rotate"}]},{"group":"Providers","pages":[{"openapi":"openapi/ai-gateway.yaml GET /providers","title":"List AI Gateway Providers","href":"/ai-gateway/api-reference/providers/list"},{"openapi":"openapi/ai-gateway.yaml POST /providers","title":"Create an AI Gateway Provider","href":"/ai-gateway/api-reference/providers/create"},{"openapi":"openapi/ai-gateway.yaml GET /providers/{id}","title":"Get an AI Gateway Provider","href":"/ai-gateway/api-reference/providers/get"},{"openapi":"openapi/ai-gateway.yaml PATCH /providers/{id}","title":"Update an AI Gateway Provider","href":"/ai-gateway/api-reference/providers/update"},{"openapi":"openapi/ai-gateway.yaml DELETE /providers/{id}","title":"Delete an AI Gateway Provider","href":"/ai-gateway/api-reference/providers/delete"}]},{"group":"API Keys","pages":[{"openapi":"openapi/ai-gateway.yaml GET /api-keys","title":"List AI Gateway API Keys","href":"/ai-gateway/api-reference/api-keys/list"},{"openapi":"openapi/ai-gateway.yaml POST /api-keys","title":"Create an AI Gateway API Key","href":"/ai-gateway/api-reference/api-keys/create"},{"openapi":"openapi/ai-gateway.yaml GET /api-keys/{id}","title":"Get an AI Gateway API Key","href":"/ai-gateway/api-reference/api-keys/get"},{"openapi":"openapi/ai-gateway.yaml PATCH /api-keys/{id}","title":"Update an AI Gateway API Key","href":"/ai-gateway/api-reference/api-keys/update"},{"openapi":"openapi/ai-gateway.yaml DELETE /api-keys/{id}","title":"Delete an AI Gateway API Key","href":"/ai-gateway/api-reference/api-keys/delete"}]},{"group":"Credits","pages":[{"openapi":"openapi/ai-gateway.yaml GET /credits/balance","title":"Get Credit Balance","href":"/ai-gateway/api-reference/credits/balance"},{"openapi":"openapi/ai-gateway.yaml GET /credits/transactions","title":"List Credit Transactions","href":"/ai-gateway/api-reference/credits/transactions"},{"openapi":"openapi/ai-gateway.yaml POST /credits/checkout-session","title":"Create a Stripe Checkout Session","href":"/ai-gateway/api-reference/credits/checkout-session"},{"openapi":"openapi/ai-gateway.yaml POST /credits/purchases","title":"Start a Credit Purchase","href":"/ai-gateway/api-reference/credits/purchase-create"},{"openapi":"openapi/ai-gateway.yaml GET /credits/purchases/{id}","title":"Get a Credit Purchase","href":"/ai-gateway/api-reference/credits/purchase-get"}]},{"group":"Models","pages":[{"openapi":"openapi/ai-gateway.yaml GET /v1/models","title":"List Available AI Gateway Models","href":"/ai-gateway/api-reference/models/list"}]},{"group":"Virtual Models","pages":[{"openapi":"openapi/ai-gateway.yaml GET /virtual-models","title":"List AI Gateway Virtual Models","href":"/ai-gateway/api-reference/virtual-models/list"},{"openapi":"openapi/ai-gateway.yaml POST /virtual-models","title":"Create an AI Gateway Virtual Model","href":"/ai-gateway/api-reference/virtual-models/create"},{"openapi":"openapi/ai-gateway.yaml GET /virtual-models/{id}","title":"Get an AI Gateway Virtual Model","href":"/ai-gateway/api-reference/virtual-models/get"},{"openapi":"openapi/ai-gateway.yaml PATCH /virtual-models/{id}","title":"Update an AI Gateway Virtual Model","href":"/ai-gateway/api-reference/virtual-models/update"},{"openapi":"openapi/ai-gateway.yaml DELETE /virtual-models/{id}","title":"Delete an AI Gateway Virtual Model","href":"/ai-gateway/api-reference/virtual-models/delete"}]},{"group":"Configuration","pages":[{"openapi":"openapi/ai-gateway.yaml GET /gateway-config","title":"Get AI Gateway Configuration","href":"/ai-gateway/api-reference/gateway-config/get"},{"openapi":"openapi/ai-gateway.yaml PATCH /gateway-config","title":"Update AI Gateway Configuration","href":"/ai-gateway/api-reference/gateway-config/update"}]},{"group":"Usage","pages":[{"openapi":"openapi/ai-gateway.yaml GET /usage","title":"List AI Gateway Usage Events","href":"/ai-gateway/api-reference/usage/list"},{"openapi":"openapi/ai-gateway.yaml GET /usage/overview","title":"AI Gateway Usage Overview","href":"/ai-gateway/api-reference/usage/overview"},{"openapi":"openapi/ai-gateway.yaml GET /usage/requests/{requestId}","title":"Get the Upstream Attempts of One AI Gateway Request","href":"/ai-gateway/api-reference/usage/request-attempts"}]}]}]}]},{"tab":"Share Localhost","pages":[{"title":"Share Localhost","href":"/share-localhost/overview"}]},{"tab":"For AI Agents","pages":[{"title":"For AI Agents","href":"/for-agents"}]},{"tab":"Integrations","pages":[{"title":"Integrations","href":"/integrations"}]},{"tab":"Reference","menu":[{"item":"Platform API","anchors":[{"anchor":"Reference","icon":"book-open","pages":[{"title":"Reference","href":"/api"}],"groups":[{"group":"Reference","pages":[{"title":"Reference","href":"/api-reference/abusereports/create"}]}]}]},{"item":"Agent API","anchors":[{"anchor":"Reference","icon":"book-open","pages":[{"title":"Reference","href":"/gateway/agent/api"}]}]},{"item":"CLI","anchors":[{"anchor":"Reference","icon":"book-open","pages":[{"title":"Reference","href":"/gateway/agent/cli"}]}]},{"item":"Agent Config File","anchors":[{"anchor":"Reference","icon":"book-open","pages":[{"title":"Reference","href":"/gateway/agent/config"}]}]},{"item":"SDKs","anchors":[{"anchor":"Reference","icon":"book-open","pages":[{"title":"Reference","href":"/agent-sdks"}]}]},{"item":"Errors","anchors":[{"anchor":"Reference","icon":"book-open","pages":[{"title":"Reference","href":"/errors"}]}]},{"item":"Changelogs","anchors":[{"anchor":"Reference","icon":"book-open","pages":[{"title":"Reference","href":"/gateway/agent/changelog"}]}]}],"pages":[{"title":"Reference","href":"/api"}]},{"tab":"Pricing","pages":[{"title":"Pricing","href":"/pricing-limits"}]}]},"basePath":"","title":"Secure Your Gateway - ngrok documentation","buildId":"dpl_eBQnj73Q1gDRVNqNsS3Yt9yPkTEW","deploymentId":"dpl_eBQnj73Q1gDRVNqNsS3Yt9yPkTEW","dynamics":[],"chunks":[]}