If you’re running the latest ngrok agent, your tunnels use scheme https so that it only opens HTTPS endpoints and not HTTP endpoints.
If you’re running an older version that doesn’t do this, be sure to configure this behavior yourself.
If your local service isn’t running on the same machine as the ngrok agent, set up TLS encryption for the ngrok agent to the upstream service leg of the tunnel using the local HTTPS feature.
Certificates automatically provisioned from Let’s Encrypt are securely managed, and their private keys aren’t accessible to the requester.
This ensures the security and integrity of the certificate by preventing key exposure.
Using a custom connect URL
If your organization uses a custom Connect URL, your default ngrok configuration won’t work.
Edit your ngrok agent configuration to add a connect_url parameter to use the custom Connect URL of your organization.
Tunnel configuration
TLS termination
TLS encryption is terminated at different locations depending on the ngrok endpoint type and configuration.
See Terminating TLS Connections for more details.
Minimum TLS version
You can specify the minimum TLS version that clients are required to use to talk to the ngrok cloud service for your endpoint.
See the terminate-tls Traffic Policy action for more details.
Observability
ngrok provides functionality for consuming logs for events in the system.
For more information, check out the Log Exporting documentation.
Blocking non-corporate accounts
For a tighter security policy, most administrators want to block ngrok accounts that aren’t a part of their organization.
The fastest approach is to block DNS lookups to the URLs the agent uses to connect to the ngrok cloud.
These are the DNS lookups to block:
connect.ngrok-agent.com
connect.us.ngrok-agent.com
connect.eu.ngrok-agent.com
connect.ap.ngrok-agent.com
connect.au.ngrok-agent.com
connect.sa.ngrok-agent.com
connect.jp.ngrok-agent.com
connect.in.ngrok-agent.com
tunnel.ngrok.com
tunnel.us.ngrok.com
tunnel.eu.ngrok.com
tunnel.ap.ngrok.com
tunnel.au.ngrok.com
tunnel.sa.ngrok.com
tunnel.jp.ngrok.com
tunnel.in.ngrok.com
API configuration
You need an API key to authenticate with the ngrok REST API.
API keys are Base64 encoded strings that you can find in the dashboard or from an API endpoint, which makes it easy to rotate your API keys.Consider restricting the IPs permitted to access the API.
You can do so in the ngrok dashboard.
{"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":[{"name":"kill-isr","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"custom-rbac-roles","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":"agent-integrations-settings","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"rbac-expansion","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":"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":"workos-onboarding","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":"stripTemperatureMiddleware","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":"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":"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":"editor-version-history-v2","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"billing-page-v2","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"full-page-search","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"workspace-projects","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},{"name":"fork-pr-previews","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"revalidation-jwt","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"workos-sso-scim","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"hobby-abuse-scan","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"dashboard-inbox","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"workos-signup","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"turbopuffer-dual-write","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"workos-enabled","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"approve-review-flow","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"editor-metadata","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"sso-setup-deadline-banner","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"turbopuffer-serve","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"live-agents","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}],"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":"gateway/security-dev-productivity/securing-your-tunnels","slug":"/gateway/security-dev-productivity/securing-your-tunnels","pageMetadata":{"title":"Security Quick Wins","description":"Tighten security across your ngrok account with quick changes to how you manage authtokens, configure TLS, and sign in to the dashboard.","href":"/gateway/security-dev-productivity/securing-your-tunnels"},"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: \"Tighten security across your ngrok account with quick changes to how you manage authtokens, configure TLS, and sign in to the dashboard.\"\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`,p:`p`,ul:`ul`,..._provideComponents(),...props.components},{Heading,Tip}=_components;if(!Heading)_missingMdxReference(`Heading`,true);if(!Tip)_missingMdxReference(`Tip`,true);return _jsxs(_Fragment,{children:[_jsx(_components.p,{children:`This guide walks you through recommendations to ensure you’re using ngrok securely.`}),`\n`,_jsx(Heading,{level:`2`,id:`agent-tips`,children:`Agent tips`}),`\n`,_jsxs(_components.ul,{children:[`\n`,_jsx(_components.li,{children:`Don’t run ngrok as root, as it shouldn’t be necessary.`}),`\n`,_jsx(_components.li,{children:`Don’t open any additional incoming ports in your firewall.\nngrok only makes an outbound connection upon start.`}),`\n`,_jsx(_components.li,{children:`Consider restricting the IPs that are able to start ngrok agent sessions.`}),`\n`]}),`\n`,_jsx(Heading,{level:`3`,id:`authtokens`,children:`Authtokens`}),`\n`,_jsxs(_components.ul,{children:[`\n`,_jsxs(_components.li,{children:[`Assign a `,_jsx(_components.a,{href:`/gateway/agent/authtokens`,children:`unique Authtoken to each ngrok agent`}),` deployment to isolate issues if a specific Authtoken is compromised.`]}),`\n`,_jsxs(_components.li,{children:[`Set up a `,_jsx(_components.a,{href:`/gateway/agent/authtokens#authtoken-acls`,children:`minimum ACL per Authtoken`}),` to limit the endpoints each agent is able to start.`]}),`\n`]}),`\n`,_jsx(Heading,{level:`3`,id:`encryption`,children:`Encryption`}),`\n`,_jsxs(_components.ul,{children:[`\n`,_jsxs(_components.li,{children:[`If you’re running the latest ngrok agent, your tunnels use `,_jsx(_components.code,{children:`scheme https`}),` so that it only opens HTTPS endpoints and not HTTP endpoints.\nIf you’re running an older version that doesn’t do this, be sure to configure this behavior yourself.`]}),`\n`,_jsxs(_components.li,{children:[`If your local service isn’t running on the same machine as the ngrok agent, set up TLS encryption for the ngrok agent to the upstream service leg of the tunnel using the `,_jsx(_components.a,{href:`/gateway/endpoints/http/#https-forwarding`,children:`local HTTPS feature`}),`.`]}),`\n`,_jsxs(_components.li,{children:[`For custom domains, use ngrok’s `,_jsx(_components.a,{href:`/gateway/domains/tls-certificates/#automated`,children:`Automated TLS certificates`}),` to have ngrok automatically provision a TLS certificate for your endpoint from `,_jsx(_components.a,{href:`https://letsencrypt.org/about/`,children:`Let’s Encrypt`}),`.`]}),`\n`]}),`\n`,_jsx(Tip,{children:_jsx(_components.p,{children:`Certificates automatically provisioned from Let’s Encrypt are securely managed, and their private keys aren’t accessible to the requester.\nThis ensures the security and integrity of the certificate by preventing key exposure.`})}),`\n`,_jsx(Heading,{level:`3`,id:`using-a-custom-connect-url`,children:`Using a custom connect URL`}),`\n`,_jsxs(_components.p,{children:[`If your organization uses a custom Connect URL, your default ngrok configuration won’t work.\nEdit your ngrok agent configuration to add a `,_jsx(_components.a,{href:`/gateway/agent/config/v3/#connect-url`,children:_jsx(_components.code,{children:`connect_url`})}),` parameter to use the custom Connect URL of your organization.`]}),`\n`,_jsx(Heading,{level:`2`,id:`tunnel-configuration`,children:`Tunnel configuration`}),`\n`,_jsx(Heading,{level:`3`,id:`tls-termination`,children:`TLS termination`}),`\n`,_jsxs(_components.p,{children:[`TLS encryption is terminated at different locations depending on the ngrok endpoint type and configuration.\nSee `,_jsx(_components.a,{href:`/gateway/domains/tls-termination/`,children:`Terminating TLS Connections`}),` for more details.`]}),`\n`,_jsx(Heading,{level:`3`,id:`minimum-tls-version`,children:`Minimum TLS version`}),`\n`,_jsxs(_components.p,{children:[`You can specify the minimum TLS version that clients are required to use to talk to the ngrok cloud service for your endpoint.\nSee `,_jsxs(_components.a,{href:`/gateway/traffic-policy/actions/terminate-tls/#changing-supported-tls-versions`,children:[`the `,_jsx(_components.code,{children:`terminate-tls`}),` Traffic Policy action`]}),` for more details.`]}),`\n`,_jsx(Heading,{level:`3`,id:`observability`,children:`Observability`}),`\n`,_jsxs(_components.p,{children:[`ngrok provides functionality for consuming logs for events in the system.\nFor more information, check out the `,_jsx(_components.a,{href:`/obs/`,children:`Log Exporting documentation`}),`.`]}),`\n`,_jsx(Heading,{level:`3`,id:`blocking-non-corporate-accounts`,children:`Blocking non-corporate accounts`}),`\n`,_jsx(_components.p,{children:`For a tighter security policy, most administrators want to block ngrok accounts that aren’t a part of their organization.\nThe fastest approach is to block DNS lookups to the URLs the agent uses to connect to the ngrok cloud.\nThese are the DNS lookups to block:`}),`\n`,_jsxs(_components.ul,{children:[`\n`,_jsx(_components.li,{children:_jsx(_components.code,{children:`connect.ngrok-agent.com`})}),`\n`,_jsx(_components.li,{children:_jsx(_components.code,{children:`connect.us.ngrok-agent.com`})}),`\n`,_jsx(_components.li,{children:_jsx(_components.code,{children:`connect.eu.ngrok-agent.com`})}),`\n`,_jsx(_components.li,{children:_jsx(_components.code,{children:`connect.ap.ngrok-agent.com`})}),`\n`,_jsx(_components.li,{children:_jsx(_components.code,{children:`connect.au.ngrok-agent.com`})}),`\n`,_jsx(_components.li,{children:_jsx(_components.code,{children:`connect.sa.ngrok-agent.com`})}),`\n`,_jsx(_components.li,{children:_jsx(_components.code,{children:`connect.jp.ngrok-agent.com`})}),`\n`,_jsx(_components.li,{children:_jsx(_components.code,{children:`connect.in.ngrok-agent.com`})}),`\n`,_jsx(_components.li,{children:_jsx(_components.code,{children:`tunnel.ngrok.com`})}),`\n`,_jsx(_components.li,{children:_jsx(_components.code,{children:`tunnel.us.ngrok.com`})}),`\n`,_jsx(_components.li,{children:_jsx(_components.code,{children:`tunnel.eu.ngrok.com`})}),`\n`,_jsx(_components.li,{children:_jsx(_components.code,{children:`tunnel.ap.ngrok.com`})}),`\n`,_jsx(_components.li,{children:_jsx(_components.code,{children:`tunnel.au.ngrok.com`})}),`\n`,_jsx(_components.li,{children:_jsx(_components.code,{children:`tunnel.sa.ngrok.com`})}),`\n`,_jsx(_components.li,{children:_jsx(_components.code,{children:`tunnel.jp.ngrok.com`})}),`\n`,_jsx(_components.li,{children:_jsx(_components.code,{children:`tunnel.in.ngrok.com`})}),`\n`]}),`\n`,_jsx(Heading,{level:`2`,id:`api-configuration`,children:`API configuration`}),`\n`,_jsxs(_components.p,{children:[`You need an API key to authenticate with `,_jsx(_components.a,{href:`/api/`,children:`the ngrok REST API`}),`.\nAPI keys are Base64 encoded strings that you can find `,_jsx(_components.a,{href:`https://dashboard.ngrok.com/get-started/your-authtoken`,children:`in the dashboard`}),` or from `,_jsx(_components.a,{href:`/api-reference/apikeys/list`,children:`an API endpoint`}),`, which makes it easy to rotate your API keys.`]}),`\n`,_jsxs(_components.p,{children:[`Consider restricting the IPs permitted to access the API.\nYou can do so `,_jsx(_components.a,{href:`https://dashboard.ngrok.com/ip-restrictions`,children:`in the ngrok dashboard`}),`.`]}),`\n`,_jsx(Heading,{level:`2`,id:`dashboard-configuration`,children:`Dashboard configuration`}),`\n`,_jsx(Heading,{level:`3`,id:`dashboard-authentication`,children:`Dashboard authentication`}),`\n`,_jsxs(_components.ul,{children:[`\n`,_jsxs(_components.li,{children:[`For authenticating access to the dashboard, ngrok has features for `,_jsx(_components.a,{href:`https://dashboard.ngrok.com/team-members`,children:`role-based access control`}),` (RBAC), `,_jsx(_components.a,{href:`https://dashboard.ngrok.com/ip-policies`,children:`IP policies`}),`, and `,_jsx(_components.a,{href:`https://dashboard.ngrok.com/settings`,children:`single sign-on`}),`.`,`\n`,_jsxs(_components.ul,{children:[`\n`,_jsx(_components.li,{children:`With RBAC, you can configure permissions for groups of users within your team (for example, admins and developers).`}),`\n`]}),`\n`]}),`\n`,_jsx(_components.li,{children:`Consider restricting the IPs permitted to access the dashboard.`}),`\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":"Security Quick Wins","description":"Tighten security across your ngrok account with quick changes to how you manage authtokens, configure TLS, and sign in to the dashboard.","href":"/gateway/security-dev-productivity/securing-your-tunnels"}}},"mdxSourceWithNoJs":null},"mdxExtracts":{"tableOfContents":[{"title":"Agent tips","slug":"agent-tips","depth":2,"children":[{"title":"Authtokens","slug":"authtokens","depth":3,"children":[]},{"title":"Encryption","slug":"encryption","depth":3,"children":[]},{"title":"Using a custom connect URL","slug":"using-a-custom-connect-url","depth":3,"children":[]}]},{"title":"Tunnel configuration","slug":"tunnel-configuration","depth":2,"children":[{"title":"TLS termination","slug":"tls-termination","depth":3,"children":[]},{"title":"Minimum TLS version","slug":"minimum-tls-version","depth":3,"children":[]},{"title":"Observability","slug":"observability","depth":3,"children":[]},{"title":"Blocking non-corporate accounts","slug":"blocking-non-corporate-accounts","depth":3,"children":[]}]},{"title":"API configuration","slug":"api-configuration","depth":2,"children":[]},{"title":"Dashboard configuration","slug":"dashboard-configuration","depth":2,"children":[{"title":"Dashboard authentication","slug":"dashboard-authentication","depth":3,"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":"Security Quick Wins - ngrok documentation","navMaps":{"firstHrefInVersion":{},"firstHrefInLanguage":{}},"lastModified":"2026-11-12T18:38:30.542Z","originalFileLocation":"gateway/security-dev-productivity/securing-your-tunnels.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=\"Tighten security across your ngrok account with quick changes to how you manage authtokens, configure TLS, and sign in to the dashboard.\">\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=\"Security Quick Wins - ngrok documentation\">\u003cmeta data-mint-head property=\"og:description\" content=\"Tighten security across your ngrok account with quick changes to how you manage authtokens, configure TLS, and sign in to the dashboard.\">\u003cmeta data-mint-head property=\"og:site_name\" content=\"ngrok documentation\">\u003cmeta data-mint-head property=\"og:url\" content=\"https://ngrok.com/docs/gateway/security-dev-productivity/securing-your-tunnels\">\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=Security+Best+Practices\u0026amp;title=Security+Quick+Wins\u0026amp;description=Tighten+security+across+your+ngrok+account+with+quick+changes+to+how+you+manage+authtokens%2C+configure+TLS%2C+and+sign+in+to+the+dashboard.\u0026amp;theme=7e270833a601ca6e053d019e\u0026amp;signature=fa702ab3a6087a458203deb65d27989fa11c069c07fbc1cbd3ff8055c667a27d\">\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=\"Security Quick Wins - ngrok documentation\">\u003cmeta data-mint-head name=\"twitter:description\" content=\"Tighten security across your ngrok account with quick changes to how you manage authtokens, configure TLS, and sign in to the dashboard.\">\u003cmeta data-mint-head name=\"twitter:image\" content=\"https://ngrok.mintlify.site/docs/_mintlify/api/og/v2?division=Security+Best+Practices\u0026amp;title=Security+Quick+Wins\u0026amp;description=Tighten+security+across+your+ngrok+account+with+quick+changes+to+how+you+manage+authtokens%2C+configure+TLS%2C+and+sign+in+to+the+dashboard.\u0026amp;theme=7e270833a601ca6e053d019e\u0026amp;signature=fa702ab3a6087a458203deb65d27989fa11c069c07fbc1cbd3ff8055c667a27d\">\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/gateway/security-dev-productivity/securing-your-tunnels\">\u003clink data-mint-head rel=\"alternate\" type=\"application/xml\" href=\"/docs/sitemap.xml\">\u003clink data-mint-head rel=\"alternate\" type=\"text/markdown\" href=\"/docs/gateway/security-dev-productivity/securing-your-tunnels.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/gateway/security-dev-productivity/securing-your-tunnels#webpage\",\"url\":\"https://ngrok.com/docs/gateway/security-dev-productivity/securing-your-tunnels\",\"name\":\"Security Quick Wins\",\"description\":\"Tighten security across your ngrok account with quick changes to how you manage authtokens, configure TLS, and sign in to the dashboard.\",\"dateModified\":\"2026-11-12T18:38:30.542Z\",\"isPartOf\":{\"@id\":\"https://ngrok.com/docs#website\"},\"breadcrumb\":{\"@id\":\"https://ngrok.com/docs/gateway/security-dev-productivity/securing-your-tunnels#breadcrumb\"}},{\"@type\":\"BreadcrumbList\",\"@id\":\"https://ngrok.com/docs/gateway/security-dev-productivity/securing-your-tunnels#breadcrumb\",\"itemListElement\":[{\"@type\":\"ListItem\",\"position\":1,\"name\":\"Use Cases\",\"item\":\"https://ngrok.com/docs/gateway/api-gateway/get-started\"},{\"@type\":\"ListItem\",\"position\":2,\"name\":\"Security Best Practices\",\"item\":\"https://ngrok.com/docs/gateway/security-dev-productivity\"},{\"@type\":\"ListItem\",\"position\":3,\"name\":\"Security Quick Wins\",\"item\":\"https://ngrok.com/docs/gateway/security-dev-productivity/securing-your-tunnels\"}]},{\"@type\":[\"Article\",\"TechArticle\"],\"@id\":\"https://ngrok.com/docs/gateway/security-dev-productivity/securing-your-tunnels#article\",\"headline\":\"Security Quick Wins\",\"name\":\"Security Quick Wins\",\"description\":\"Tighten security across your ngrok account with quick changes to how you manage authtokens, configure TLS, and sign in to the dashboard.\",\"url\":\"https://ngrok.com/docs/gateway/security-dev-productivity/securing-your-tunnels\",\"mainEntityOfPage\":{\"@id\":\"https://ngrok.com/docs/gateway/security-dev-productivity/securing-your-tunnels#webpage\"},\"dateModified\":\"2026-11-12T18:38:30.542Z\",\"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/gateway/security-dev-productivity/securing-your-tunnels.md","siteName":"ngrok documentation","nav":{"global":null,"tabs":[{"tab":"Start","pages":[{"title":"Start","href":"/start"}]},{"tab":"Gateway","anchors":[{"anchor":"Gateway","icon":"https://mintlify.s3.us-west-1.amazonaws.com/ngrok/img/icons/gateway.svg","pages":[{"group":"Getting Started","pages":[{"title":"Gateway Overview","sidebarTitle":"Overview","icon":"house","href":"/gateway/overview"},{"title":"CLI Quickstart","sidebarTitle":"Quickstart","icon":"rocket","href":"/gateway/endpoints/agent-cli-quickstart"},{"title":"How Does ngrok's Gateway Work?","sidebarTitle":"How It Works","icon":"gears","href":"/gateway/how-it-works"},{"title":"Points of Presence","icon":"globe","href":"/gateway/points-of-presence"}]},{"group":"Use Cases","pages":[{"group":"API Gateway","pages":[{"title":"Get Started with ngrok's API Gateway","sidebarTitle":"Get Started","href":"/gateway/api-gateway/get-started"},{"title":"Expose an MCP Server to ChatGPT, Claude, Grok, and Cursor","sidebarTitle":"Use ngrok as an MCP Gateway","href":"/gateway/api-gateway/mcp-gateway"},{"title":"Deploy a Multicloud API Gateway","href":"/gateway/api-gateway/multicloud"},{"title":"Using Datadog","href":"/gateway/api-gateway/monitor-ngrok"}]},{"group":"Device Gateway","pages":[{"title":"Device Gateway Overview","sidebarTitle":"Overview","href":"/gateway/device-gateway/overview"},{"title":"Device Gateway Quickstart","sidebarTitle":"Quickstart","href":"/gateway/device-gateway/quickstart"},{"title":"Device Gateway FAQ","sidebarTitle":"FAQ","href":"/gateway/device-gateway/faq"},{"title":"Configure Secure Access to Remote IoT Devices","sidebarTitle":"Using Remote IoT Devices","href":"/gateway/device-gateway/agent"},{"group":"Guides","pages":[{"title":"Configure Remote Connectivity to Your IoT Devices in the Field","sidebarTitle":"Cloud-to-Device","href":"/gateway/device-gateway/cloud-to-device"},{"title":"Secure Remote Access with ngrok for SSH and RDP","sidebarTitle":"Secure Remote Access","href":"/gateway/device-gateway/remote-access"},{"title":"Private Connectivity to Remote IoT Devices with ngrokd","sidebarTitle":"Private Connectivity","href":"/gateway/device-gateway/private-connectivity"},{"title":"Fleet Management","sidebarTitle":"Fleet Management","href":"/gateway/device-gateway/fleet-management"},{"title":"Connect to Devices Using the Python SDK","sidebarTitle":"Connect via SDKs","href":"/gateway/device-gateway/sdk"}]},{"group":"Concepts","pages":[{"title":"Device Security","href":"/gateway/device-gateway/security"},{"title":"Secure Tunnels for Devices","sidebarTitle":"Secure Tunnels","href":"/gateway/device-gateway/tunnels"},{"title":"Traffic Policy for Devices","sidebarTitle":"Traffic Policy","href":"/gateway/device-gateway/traffic-policy"}]},{"group":"Installation Guides","pages":[{"title":"Install ngrok on Linux","sidebarTitle":"Linux","href":"/gateway/device-gateway/linux"},{"title":"Install ngrok on Linux (ARM64)","sidebarTitle":"Linux (ARM64)","href":"/gateway/device-gateway/arm64"},{"title":"Install ngrok on Raspberry Pi","sidebarTitle":"Raspberry Pi","href":"/gateway/device-gateway/raspberry-pi"},{"title":"Install ngrok on Raspberry Pi OS (Formerly Raspbian)","sidebarTitle":"Raspberry Pi OS (Raspbian)","href":"/gateway/device-gateway/raspbian"},{"title":"Install ngrok on a Remote Windows Device","sidebarTitle":"Windows","href":"/gateway/device-gateway/windows"}]}]},{"group":"Site-to-Site Connectivity","pages":[{"title":"Site-to-Site Connectivity Overview","sidebarTitle":"Overview","href":"/gateway/site-to-site-connectivity/overview"},{"title":"Site-to-Site Connectivity Quickstart","sidebarTitle":"Quickstart","href":"/gateway/site-to-site-connectivity/quickstart"},{"title":"Connect to Your Customer's Network","sidebarTitle":"Tutorial","href":"/gateway/site-to-site-connectivity/index"},{"title":"Site-to-Site Connectivity FAQ","sidebarTitle":"FAQ","href":"/gateway/site-to-site-connectivity/faq"},{"title":"Why Your Vendor Uses ngrok","href":"/gateway/site-to-site-connectivity/end-customers"},{"group":"Security","pages":[{"title":"Agent TLS Termination","sidebarTitle":"End-to-End Encryption","href":"/gateway/site-to-site-connectivity/agent-tls-termination"},{"title":"Region and IP Resolution","sidebarTitle":"Pin Traffic to Regions","href":"/gateway/site-to-site-connectivity/region-ip-resolution"},{"title":"Authtoken ACLs","sidebarTitle":"Restrict Agent Permissions","href":"/gateway/site-to-site-connectivity/authtoken-acls"}]},{"group":"Reliability","pages":[{"title":"Install ngrok as a Background Service","sidebarTitle":"Run ngrok in the Background","href":"/gateway/site-to-site-connectivity/background-service"},{"title":"Configure Active-Active Agent Redundancy","sidebarTitle":"Eliminate Single Points of Failure","href":"/gateway/site-to-site-connectivity/redundant-agents"},{"title":"Traffic Events and Log Export","sidebarTitle":"Monitor Agent Traffic","href":"/gateway/site-to-site-connectivity/traffic-events"},{"title":"Multi-Region Failover","sidebarTitle":"Automatic Failover","href":"/gateway/site-to-site-connectivity/multi-region-failover"}]},{"group":"Private Addressability","pages":[{"title":"Securely Connect to Remote Customer Networks from Your K8s Cluster","sidebarTitle":"Connect From Kubernetes","href":"/gateway/site-to-site-connectivity/customer-networks"},{"title":"Private Connectivity to Remote Customer Networks with ngrokd","sidebarTitle":"Connect from Your Non-k8s Environment","href":"/gateway/site-to-site-connectivity/non-k8s-environment"}]},{"group":"Production Ready","pages":[{"title":"Set Up a Custom Connect URL","sidebarTitle":"White-Label Agent Connections","href":"/gateway/site-to-site-connectivity/custom-connect-url"},{"sidebarTitle":"Use the Agent in Your Apps","title":"Create Site-to-Site Connectivity Using SDKs","href":"/gateway/site-to-site-connectivity/agent-sdks"},{"sidebarTitle":"Manage With APIs \u0026 Terraform","title":"Manage ngrok Programmatically With Terraform and API Client Libraries","href":"/gateway/site-to-site-connectivity/apis-terraform"},{"sidebarTitle":"Agent Packaging \u0026 Distribution","title":"Agent Packaging and Distribution","href":"/gateway/site-to-site-connectivity/agent-packaging"}]}]},{"group":"Webhooks to On-Prem","pages":[{"title":"Webhooks to On-Prem","sidebarTitle":"Overview","href":"/gateway/webhooks-to-on-prem/overview"},{"title":"Webhooks to On-Prem Quickstart","sidebarTitle":"Quickstart","href":"/gateway/webhooks-to-on-prem/quickstart"},{"title":"Webhooks to On-Prem Full Tutorial","sidebarTitle":"Tutorial","href":"/gateway/webhooks-to-on-prem/tutorial"},{"title":"Send GitHub Webhooks to On-Prem Jenkins Securely","sidebarTitle":"GitHub to Jenkins","href":"/gateway/webhooks-to-on-prem/github-to-jenkins"},{"title":"Send GitHub Webhooks to On-Prem Argo CD Securely","sidebarTitle":"GitHub to Argo CD","href":"/gateway/webhooks-to-on-prem/github-to-argo-cd"}]},{"group":"Security Best Practices","pages":[{"title":"Best Security Practices for Developer Productivity","sidebarTitle":"Get Started","description":"Put developer endpoints behind one Cloud Endpoint that your security team controls, secured with IP restrictions, JWTs, or mTLS.","href":"/gateway/security-dev-productivity/index"},{"title":"Security Quick Wins","href":"/gateway/security-dev-productivity/securing-your-tunnels"},{"title":"Setting Up HIPAA-Compliant ngrok Services","sidebarTitle":"HIPAA Compliance","description":"Enable HIPAA compliance on a Pay-as-you-go account, sign the BAA, and set up ngrok services that handle protected health data.","href":"/gateway/security-dev-productivity/hipaa-compliance"},{"title":"Secure Your Applications with OAuth 2.0","sidebarTitle":"Adding OAuth 2.0 to Endpoints","href":"/gateway/identity-aware-proxy/securing-with-oauth"},{"title":"Secure Remote Access with ngrok for SSH and RDP","sidebarTitle":"SSH \u0026 RDP Remote Access","href":"/gateway/ssh-rdp/index"},{"title":"Running ngrok Behind a Corporate Firewall","sidebarTitle":"Corporate Firewalls","href":"/gateway/running-behind-firewalls"}]}]},{"group":"Examples","pages":[{"title":"Gateway Examples","sidebarTitle":"Overview","href":"/gateway/examples"},{"group":"Secure and Control Access","expanded":false,"pages":[{"title":"Support Multiple Authentication Methods with Traffic Policy","sidebarTitle":"IP Restrictions or Basic Auth","href":"/gateway/examples/ip-restrictions-basic-auth"},{"title":"Secure Admin Dashboards","sidebarTitle":"Lock Down Your Admin Dashboards","href":"/gateway/examples/lock-admin-dashboards"},{"title":"Create Secure Public Developer Environments","sidebarTitle":"Secure Developer Environments","href":"/gateway/examples/secure-developer-environments"},{"title":"Validate Requests Against Identity Service","sidebarTitle":"Validate Against Identity Service","href":"/gateway/examples/validate-requests-identity"}]},{"group":"Route and Shape Traffic","expanded":false,"pages":[{"title":"Implement the 'Front Door' Pattern","sidebarTitle":"The Front Door Pattern","href":"/gateway/examples/front-door-pattern"},{"title":"Multiplex to Internal Services from a Single Domain","sidebarTitle":"Multiplex to Internal Services","href":"/gateway/examples/multiplex"},{"title":"Microservices API Gateway","href":"/gateway/examples/microservices-gateway"},{"title":"Deploy Custom Error Pages","sidebarTitle":"Custom Error Pages","href":"/gateway/examples/custom-error-pages"},{"title":"Intercept and Rewrite Headers in HTTP Redirect Responses","sidebarTitle":"Intercept and Rewrite Headers","href":"/gateway/examples/rewrite-headers-redirects"},{"title":"Route API and App Traffic by User Agent","sidebarTitle":"Route by User Agent","href":"/gateway/examples/route-api-app-traffic-user-agent"},{"title":"Route to Endpoints by Geography","href":"/gateway/examples/route-by-geography"},{"title":"Route to Services Based on OIDC Authentication","sidebarTitle":"Route by OIDC","href":"/gateway/examples/route-by-oidc"},{"title":"Offload Analytics to a Self-Hosted Service","sidebarTitle":"Offload Analytics","href":"/gateway/examples/offload-analytics"},{"title":"Pre-Tier Requests by IP Address","sidebarTitle":"Pre-Tier Requests","href":"/gateway/examples/pre-tier-requests"}]},{"group":"Connect Apps and Services","expanded":false,"pages":[{"title":"Database Gateway","href":"/gateway/examples/database-gateway"},{"title":"Webhook Gateway","href":"/gateway/examples/webhook-gateway"},{"title":"Self-Hosted PaaS Alternative Gateway","href":"/gateway/examples/paas-alternative-gateway"},{"title":"Agent-Assisted Gateway","href":"/gateway/examples/agent-assisted-gateway"},{"title":"Use a Local LLM in Cursor with Ollama","sidebarTitle":"Local LLM in Cursor","href":"/gateway/examples/cursor-local-llm"},{"title":"Secure Your Public Minecraft Server","sidebarTitle":"Secure Minecraft Server","href":"/gateway/examples/minecraft"},{"title":"Securely Put Your Self-Hosted n8n Workflows Online","sidebarTitle":"Grant Access to Your n8n Workflows","href":"/gateway/examples/n8n"},{"title":"Expose and Secure Your Self-Hosted Odoo Instance","href":"/gateway/examples/odoo"},{"title":"Ollama Remote Access: Expose and Secure Your Ollama API","sidebarTitle":"Expose Ollama API","href":"/gateway/examples/ollama"},{"title":"Accelerate and Secure Your WordPress Installation","sidebarTitle":"Secure Wordpress Installations","href":"/gateway/examples/wordpress"}]},{"group":"Ship Changes Safely","expanded":false,"pages":[{"title":"Switch Traffic Between Blue-Green Deployments","sidebarTitle":"Blue-Green Deployments","href":"/gateway/examples/blue-green-deployments"},{"title":"Distribute Traffic Between Canary Deployments","sidebarTitle":"Canary Deployments","href":"/gateway/examples/canary-deployments"},{"title":"Access CI/CD Deploy Previews on Secure URLs","sidebarTitle":"Ephemeral Workloads","href":"/gateway/examples/ephemeral-workloads"},{"title":"Deploy a Consistent Maintenance Message with Traffic Policy","sidebarTitle":"Maintenance Mode","href":"/gateway/examples/maintenance-mode"}]}]},{"group":"Connectivity","pages":[{"group":"Endpoints","pages":[{"title":"Endpoints Overview","sidebarTitle":"Overview","href":"/gateway/endpoints/index"},{"group":"Agent Endpoints","pages":[{"title":"Agent Endpoints","sidebarTitle":"Overview","href":"/gateway/endpoints/agent-endpoints"},{"title":"Agent Endpoint Protocols","sidebarTitle":"Protocols","href":"/gateway/endpoints/protocols"},{"title":"HTTP/S Agent Endpoints","sidebarTitle":"HTTP/S Endpoints","href":"/gateway/endpoints/http"},{"title":"TLS Agent Endpoints","sidebarTitle":"TLS Endpoints","href":"/gateway/endpoints/tls"},{"title":"TCP Agent Endpoints","sidebarTitle":"TCP Endpoints","href":"/gateway/endpoints/tcp"},{"title":"Endpoint Bindings","sidebarTitle":"Bindings","href":"/gateway/endpoints/bindings"},{"title":"Public Agent Endpoints","sidebarTitle":"Public Endpoints","href":"/gateway/endpoints/public-endpoints"},{"title":"Internal Agent Endpoints","sidebarTitle":"Internal Endpoints","href":"/gateway/endpoints/internal-endpoints"},{"sidebarTitle":"Kubernetes Endpoints","title":"Kubernetes Agent Endpoints","href":"/gateway/endpoints/kubernetes-endpoints"}]},{"group":"Cloud Endpoints","pages":[{"title":"Cloud Endpoints","sidebarTitle":"Overview","href":"/gateway/endpoints/cloud-endpoints/index"},{"title":"Cloud Endpoints Quickstart","sidebarTitle":"Quickstart","href":"/getting-started/cloud-endpoints-quickstart"},{"title":"Cloud Endpoint Protocols","sidebarTitle":"Protocols","href":"/gateway/endpoints/cloud-endpoints/protocols"},{"title":"HTTP/S Cloud Endpoints","sidebarTitle":"HTTP/S Endpoints","href":"/gateway/endpoints/cloud-endpoints/http"},{"title":"TLS Cloud Endpoints","sidebarTitle":"TLS Endpoints","href":"/gateway/endpoints/cloud-endpoints/tls"},{"title":"TCP Cloud Endpoints","sidebarTitle":"TCP Endpoints","href":"/gateway/endpoints/cloud-endpoints/tcp"},{"title":"Endpoint Bindings","sidebarTitle":"Bindings","href":"/gateway/endpoints/cloud-endpoints/bindings"},{"title":"Public Cloud Endpoints","sidebarTitle":"Public Endpoints","href":"/gateway/endpoints/cloud-endpoints/public-endpoints"},{"sidebarTitle":"Internal Endpoints","title":"Internal Cloud Endpoints","href":"/gateway/endpoints/cloud-endpoints/internal-endpoints"},{"sidebarTitle":"Kubernetes Endpoints","title":"Kubernetes Cloud Endpoints","href":"/gateway/endpoints/cloud-endpoints/kubernetes-endpoints"},{"title":"How to Change a Cloud Endpoint Domain","href":"/gateway/endpoints/cloud-endpoints/change-domain-endpoint"},{"title":"Forwarding Traffic to and Load Balancing Internal Endpoints with Cloud Endpoints","sidebarTitle":"Forwarding Traffic and Load Balancing","href":"/gateway/endpoints/cloud-endpoints/forwarding-and-load-balancing"},{"title":"Path-Based Routing and Policy Decentralization with Cloud Endpoints","sidebarTitle":"Path-based Routing","href":"/gateway/endpoints/cloud-endpoints/routing-and-policy-decentralization"}]},{"group":"Pooling \u0026 Load Balancing","pages":[{"title":"Endpoint Pooling","sidebarTitle":"Overview","href":"/gateway/endpoints/endpoint-pooling"},{"title":"Load Balancing Between Multiple Clouds","href":"/gateway/endpoints/load-balancing-multiple-clouds"}]}]},{"group":"Agents","root":{"title":"ngrok Agents Overview","sidebarTitle":"Overview","href":"/gateway/agent/index"},"pages":[{"title":"ngrok Agents Overview","sidebarTitle":"Overview","href":"/gateway/agent/index"},{"title":"How ngrok Agents Work","sidebarTitle":"How It Works","href":"/gateway/agent/how-it-works"},{"title":"ngrok CLI and SDK Connectivity","sidebarTitle":"Connectivity","href":"/gateway/agent/connectivity"},{"group":"CLI Setup","pages":[{"title":"Install the ngrok CLI","sidebarTitle":"Install","href":"/gateway/agent/install"},{"title":"Agent Authtokens","sidebarTitle":"Authtokens","href":"/gateway/agent/authtokens"}]},{"group":"Guides","pages":[{"title":"Expose a Service with the ngrok Agent","sidebarTitle":"Expose a Service","href":"/gateway/agent/expose-a-service"},{"title":"Run the ngrok CLI as a Service","sidebarTitle":"Run as a Service","href":"/gateway/agent/service"},{"title":"SSH Reverse Tunnel","sidebarTitle":"Reverse SSH Agent","href":"/gateway/agent/ssh-reverse-tunnel-agent"},{"title":"CLI TLS Termination","sidebarTitle":"TLS Termination","href":"/gateway/agent/agent-tls-termination"},{"title":"ngrok CLI Web Inspection Interface","sidebarTitle":"Web Inspection Interface","href":"/gateway/agent/web-inspection-interface"}]},{"group":"Configuration File","pages":[{"title":"ngrok CLI Configuration File","sidebarTitle":"Overview","href":"/gateway/agent/config/index"},{"title":"Agent Config Version 3","sidebarTitle":"Version 3","href":"/gateway/agent/config/v3"},{"title":"Agent Config Version 2","sidebarTitle":"Version 2","href":"/gateway/agent/config/v2"}]},{"group":"Account and Network Controls","pages":[{"title":"Agent API Keys","sidebarTitle":"API Keys","href":"/gateway/agent/api-keys"},{"title":"Restrict Where Agents Connect From","sidebarTitle":"IP Restrictions","href":"/gateway/agent/ip-restrictions"},{"title":"Agent Connect URLs","sidebarTitle":"Connect URLs","href":"/gateway/agent/connect-url"}]},{"group":"Reference","pages":[{"title":"ngrok Agent Command Line Interface (CLI)","sidebarTitle":"CLI","href":"/gateway/agent/cli"},{"title":"ngrok CLI API Commands","sidebarTitle":"CLI API Commands","href":"/gateway/agent/cli-api"},{"title":"ngrok CLI API","sidebarTitle":"API","href":"/gateway/agent/api"},{"title":"ngrok Agent Changelog","sidebarTitle":"Changelog","href":"/gateway/agent/changelog"}]},{"group":"Versions","pages":[{"title":"Upgrade to ngrok Agent v3","sidebarTitle":"Upgrade to v3","href":"/gateway/agent/upgrade-v2-v3"},{"title":"ngrok Agent Version Support Policy","sidebarTitle":"Version Support Policy","href":"/gateway/agent/version-support-policy"},{"title":"Agent Version Deprecation Notices","sidebarTitle":"Deprecation Notices","href":"/gateway/agent/deprecation-notices"}]}]},{"group":"Kubernetes Operators","pages":[{"title":"Kubernetes Operator","sidebarTitle":"Overview","href":"/gateway/k8s/index"},{"title":"How the ngrok Kubernetes Operator Works","sidebarTitle":"How It Works","href":"/gateway/k8s/how-it-works"},{"title":"Kubernetes Operator Architecture","sidebarTitle":"Architecture","href":"/gateway/k8s/installation/architecture"},{"title":"Kubernetes Operator Release Process","sidebarTitle":"Releasing","href":"/gateway/k8s/releasing"},{"group":"Quickstarts","pages":[{"title":"Kubernetes Ingress Quickstart","sidebarTitle":"Ingress","href":"/getting-started/kubernetes/ingress"},{"title":"Kubernetes Custom Resources Quickstart","sidebarTitle":"Custom Resources","href":"/getting-started/kubernetes/crds"},{"title":"Kubernetes Gateway API Quickstart","sidebarTitle":"Gateway API","href":"/getting-started/kubernetes/gateway-api"},{"title":"Kubernetes Endpoints Quickstart","sidebarTitle":"Endpoints","href":"/getting-started/kubernetes/endpoints"}]},{"group":"Installation","pages":[{"title":"ngrok Kubernetes Operator Network Egress Requirements","sidebarTitle":"Network Egress","href":"/gateway/k8s/installation/network-egress"},{"title":"How to Update the ngrok Kubernetes Operator","sidebarTitle":"Updates \u0026 Upgrades","href":"/gateway/k8s/installation/update"},{"title":"Kubernetes Operator Helm Configuration","sidebarTitle":"Helm Configuration","href":"/gateway/k8s/installation/helm"},{"title":"Monitoring the Kubernetes Operator","sidebarTitle":"Observability","href":"/gateway/k8s/installation/observability"},{"title":"Uninstalling the ngrok Kubernetes Operator","sidebarTitle":"Uninstall","href":"/gateway/k8s/installation/uninstall"}]},{"group":"Load Balancing","pages":[{"title":"Load Balancing for Kubernetes Services","sidebarTitle":"For Kubernetes Services","href":"/gateway/k8s/load-balancing/load-balancing-kubernetes"},{"title":"Load Balancing Between Multiple Kubernetes Clusters","sidebarTitle":"For Kubernetes Clusters","href":"/gateway/k8s/load-balancing/load-balancing-kubernetes-clusters"}]},{"group":"How-to","pages":[{"title":"Controlling Traffic Flow with Request Routing","sidebarTitle":"Request Routing","href":"/gateway/k8s/guides/how-to/request-routing"},{"title":"TLS Routing","href":"/gateway/k8s/guides/how-to/tls-routing"},{"title":"TCP Routing","href":"/gateway/k8s/guides/how-to/tcp-routing"},{"title":"Customizing Requests with Header Manipulation","sidebarTitle":"Manipulate Headers","href":"/gateway/k8s/guides/how-to/manipulate-headers"},{"title":"Managing Traffic with Redirects","sidebarTitle":"Redirects","href":"/gateway/k8s/guides/how-to/redirects"},{"title":"Customizing Request Routing with URL Rewriting","sidebarTitle":"Rewrite URL","href":"/gateway/k8s/guides/how-to/rewrite-url"},{"title":"Serving Static Responses with Custom Response Policies","sidebarTitle":"Custom/Static Response","href":"/gateway/k8s/guides/how-to/static-response"},{"title":"Managing TLS Termination for Secure Connections","sidebarTitle":"Terminate TLS","href":"/gateway/k8s/guides/how-to/terminate-tls"},{"title":"Securing Upstream Connections with TLS and Mutual TLS (mTLS)","sidebarTitle":"Upstream TLS","href":"/gateway/k8s/guides/how-to/upstream-tls"},{"title":"Protecting Services with Rate Limiting","sidebarTitle":"Rate Limiting","href":"/gateway/k8s/guides/how-to/rate-limiting"},{"title":"Protecting Your Endpoints by Denying Unwanted Traffic","sidebarTitle":"Deny Requests","href":"/gateway/k8s/guides/how-to/deny-requests"},{"title":"Securing Endpoints with Basic Authentication","sidebarTitle":"Basic Auth","href":"/gateway/k8s/guides/how-to/basic-auth"},{"title":"Securing Your Endpoints with OAuth Authentication","sidebarTitle":"OAuth","href":"/gateway/k8s/guides/how-to/oauth"},{"title":"Authenticating Users with OpenID Connect (OIDC)","sidebarTitle":"OpenID Connect (OIDC)","href":"/gateway/k8s/guides/how-to/oidc"},{"title":"Securing Your Endpoints with JWT Validation","sidebarTitle":"JWT Validation","href":"/gateway/k8s/guides/how-to/jwt-validation"},{"title":"Controlling Access with IP Restrictions","sidebarTitle":"Restrict IPs","href":"/gateway/k8s/guides/how-to/restrict-ips"},{"title":"Restricting Access by Kubernetes Pod Identity","sidebarTitle":"Pod Identity Variables","href":"/gateway/k8s/guides/how-to/pod-identity"},{"title":"Circuit Breaking for System Reliability","sidebarTitle":"Circuit Breaking","href":"/gateway/k8s/guides/how-to/circuit-breaking"},{"title":"Improving Performance with Response Compression","sidebarTitle":"Compress Responses","href":"/gateway/k8s/guides/how-to/compress-response"}]},{"group":"Custom Resources","pages":[{"title":"Kubernetes Operator Custom Resources (CRDs)","href":"/gateway/k8s/crds/index"},{"title":"AgentEndpoint Custom Resource","sidebarTitle":"AgentEndpoint","href":"/gateway/k8s/crds/agentendpoint"},{"title":"CloudEndpoint Custom Resource","sidebarTitle":"CloudEndpoint","href":"/gateway/k8s/crds/cloudendpoint"},{"title":"NgrokTrafficPolicy Custom Resource","sidebarTitle":"NgrokTrafficPolicy","href":"/gateway/k8s/crds/ngroktrafficpolicy"},{"title":"BoundEndpoint Custom Resource","sidebarTitle":"BoundEndpoint","href":"/gateway/k8s/crds/boundendpoint"},{"title":"Domain Custom Resource","sidebarTitle":"Domain","href":"/gateway/k8s/crds/domain"},{"title":"KubernetesOperator Custom Resource","sidebarTitle":"KubernetesOperator","href":"/gateway/k8s/crds/kubernetesoperator"},{"title":"IPPolicy Custom Resource","sidebarTitle":"IPPolicy","href":"/gateway/k8s/crds/ippolicy"}]},{"group":"Guides","pages":[{"title":"Running Multiple ngrok Operator Installations","sidebarTitle":"Multiple Installations","href":"/gateway/k8s/guides/multiple-installs"},{"title":"Running a Local Kubernetes Cluster","sidebarTitle":"Local Cluster Options","href":"/gateway/k8s/guides/local-cluster"},{"title":"Using ngrok Custom Resources","sidebarTitle":"Using CRDs","href":"/gateway/k8s/guides/using-crds"},{"title":"How to Create Endpoints in the ngrok Kubernetes Operator","sidebarTitle":"Endpoint Types","href":"/gateway/k8s/guides/endpoint-types"},{"title":"Binding Endpoints in the ngrok Kubernetes Operator","sidebarTitle":"Bindings","href":"/gateway/k8s/guides/bindings"},{"title":"Pooling Endpoints in the ngrok Kubernetes Operator","sidebarTitle":"Pooling","href":"/gateway/k8s/guides/pooling"},{"title":"Kubernetes Custom White-Label Domains","sidebarTitle":"Custom Domains","href":"/gateway/k8s/guides/custom-domain"},{"title":"Connecting to Customer Networks","href":"/gateway/k8s/guides/customer-networks"},{"title":"Projecting Local Services into Remote Clusters","sidebarTitle":"Local Projection","href":"/gateway/k8s/guides/local-projection"},{"title":"Gateway API with the ngrok Kubernetes Operator","sidebarTitle":"Using Gateway API","href":"/gateway/k8s/guides/using-gwapi"},{"title":"How the ngrok Operator Uses Ingresses","sidebarTitle":"Using Ingresses","href":"/gateway/k8s/guides/using-ingresses"},{"title":"Migrate from ingress-nginx to the ngrok Kubernetes Operator","sidebarTitle":"Migrate from ingress-nginx","href":"/gateway/k8s/guides/migrate-from-ingress-nginx"},{"title":"Custom ngrok Annotations","sidebarTitle":"Custom Annotations","href":"/gateway/k8s/guides/annotations"},{"title":"ngrok Kubernetes Operator Managed Resources","sidebarTitle":"Managed Resources","href":"/gateway/k8s/guides/managed-resources"},{"title":"Finalizers Created by the ngrok Kubernetes Operator","sidebarTitle":"Finalizers","href":"/gateway/k8s/guides/finalizers"},{"title":"Troubleshooting the ngrok Kubernetes Operator","sidebarTitle":"Troubleshooting","href":"/gateway/k8s/guides/troubleshooting"},{"title":"Exposing the Kubernetes API Server with the ngrok Operator","sidebarTitle":"Expose Kubernetes API","href":"/gateway/k8s/guides/expose-kubernetes-api"},{"title":"How the ngrok Operator Uses LoadBalancer Services","sidebarTitle":"Using LoadBalancer Services","href":"/gateway/k8s/guides/using-loadbalancers"}]}]}]},{"group":"Traffic Policy","pages":[{"title":"Traffic Policy Overview","sidebarTitle":"Overview","href":"/gateway/traffic-policy/index"},{"group":"Quickstarts","pages":[{"title":"Agent Endpoints with Traffic Policy Quickstart","sidebarTitle":"Agent Endpoints","href":"/gateway/traffic-policy/getting-started/agent-endpoints"},{"title":"Cloud Endpoints with Traffic Policy Quickstart","sidebarTitle":"Cloud Endpoints","href":"/gateway/traffic-policy/getting-started/cloud-endpoints"}]},{"title":"How Traffic Policy Works","sidebarTitle":"How It Works","href":"/gateway/traffic-policy/how-it-works"},{"group":"Concepts","pages":[{"title":"Expression Examples","sidebarTitle":"CEL Expression Examples","href":"/gateway/traffic-policy/concepts/expressions"},{"title":"Traffic Policy Actions","sidebarTitle":"Terminating Actions","href":"/gateway/traffic-policy/concepts/actions"},{"title":"Traffic Identities","href":"/gateway/traffic-policy/identities"}]},{"group":"Actions","pages":[{"title":"Traffic Policy Actions","sidebarTitle":"Overview","href":"/gateway/traffic-policy/actions/index"},{"title":"Add Headers Action","sidebarTitle":"Add Headers","href":"/gateway/traffic-policy/actions/add-headers"},{"title":"Basic Auth Action","sidebarTitle":"Basic Auth","href":"/gateway/traffic-policy/actions/basic-auth"},{"title":"Circuit Breaker Action","sidebarTitle":"Circuit Breaker","href":"/gateway/traffic-policy/actions/circuit-breaker"},{"title":"Close Connection Action","sidebarTitle":"Close Connection","href":"/gateway/traffic-policy/actions/close-connection"},{"title":"Compress Response Action","sidebarTitle":"Compress Response","href":"/gateway/traffic-policy/actions/compress-response"},{"title":"Custom Response Action","sidebarTitle":"Custom Response","href":"/gateway/traffic-policy/actions/custom-response"},{"title":"Deny Action","sidebarTitle":"Deny","href":"/gateway/traffic-policy/actions/deny"},{"title":"Forward Internal Action","sidebarTitle":"Forward Internal","href":"/gateway/traffic-policy/actions/forward-internal"},{"title":"HTTP Request Action","sidebarTitle":"HTTP Request","href":"/gateway/traffic-policy/actions/http-request"},{"title":"JWT Validation Action","sidebarTitle":"JWT Validation","href":"/gateway/traffic-policy/actions/jwt-validation"},{"title":"Log Action","sidebarTitle":"Log","href":"/gateway/traffic-policy/actions/log"},{"title":"OAuth Action","sidebarTitle":"OAuth","href":"/gateway/traffic-policy/actions/oauth"},{"title":"OpenID Connect Action","sidebarTitle":"OpenID Connect (OIDC)","href":"/gateway/traffic-policy/actions/openid-connect"},{"title":"OWASP CRS Request Action","sidebarTitle":"OWASP CRS Request","href":"/gateway/traffic-policy/actions/owasp-crs-request"},{"title":"OWASP CRS Response Action","sidebarTitle":"OWASP CRS Response","href":"/gateway/traffic-policy/actions/owasp-crs-response"},{"title":"Rate Limit Action","sidebarTitle":"Rate Limit","href":"/gateway/traffic-policy/actions/rate-limit"},{"title":"Redirect Action","sidebarTitle":"Redirect","href":"/gateway/traffic-policy/actions/redirect"},{"title":"Remove Headers Action","sidebarTitle":"Remove Headers","href":"/gateway/traffic-policy/actions/remove-headers"},{"title":"Request Body Find and Replace Action","sidebarTitle":"Request Body Find \u0026 Replace","href":"/gateway/traffic-policy/actions/request-body-find-replace"},{"title":"Response Body Find and Replace Action","sidebarTitle":"Response Body Find \u0026 Replace","href":"/gateway/traffic-policy/actions/response-body-find-replace"},{"title":"Restrict IPs Action","sidebarTitle":"Restrict IPs","href":"/gateway/traffic-policy/actions/restrict-ips"},{"title":"SAML Action","sidebarTitle":"SAML","tag":"Early Access","href":"/gateway/traffic-policy/actions/saml"},{"title":"Set Vars Action","sidebarTitle":"Set Vars","href":"/gateway/traffic-policy/actions/set-vars"},{"title":"SSE Find and Replace Action","sidebarTitle":"SSE Find \u0026 Replace","href":"/gateway/traffic-policy/actions/sse-find-replace"},{"title":"Terminate TLS Action","sidebarTitle":"Terminate TLS","href":"/gateway/traffic-policy/actions/terminate-tls"},{"title":"URL Rewrite Action","sidebarTitle":"URL Rewrite","href":"/gateway/traffic-policy/actions/url-rewrite"},{"title":"Verify Webhook Action","sidebarTitle":"Verify Webhook","href":"/gateway/traffic-policy/actions/verify-webhook"}]},{"group":"Examples","pages":[{"title":"Traffic Policy Examples","sidebarTitle":"Overview","mode":"wide","href":"/gateway/traffic-policy/examples/index"},{"title":"How to Run an A/B Test","sidebarTitle":"A/B Tests","href":"/gateway/traffic-policy/examples/a-b-tests"},{"title":"Add and Remove Headers","href":"/gateway/traffic-policy/examples/add-and-remove-headers"},{"title":"Add Authentication","href":"/gateway/traffic-policy/examples/add-authentication"},{"title":"Block Unwanted Requests","href":"/gateway/traffic-policy/examples/block-unwanted-requests"},{"title":"Filter Traffic by IP Category","href":"/gateway/traffic-policy/examples/filter-by-ip-category"},{"title":"Compress JSON Responses Example","sidebarTitle":"Compress JSON Responses","href":"/gateway/traffic-policy/examples/compress-json-responses"},{"title":"Enforce TLS Example","sidebarTitle":"Enforce TLS","href":"/gateway/traffic-policy/examples/enforce-tls"},{"title":"Event Logging Example","sidebarTitle":"Event Logging","href":"/gateway/traffic-policy/examples/event-logging"},{"title":"Using OAuth Traffic Policy on Endpoints","sidebarTitle":"OAuth Protection","href":"/gateway/traffic-policy/examples/oauth-protection"},{"title":"How to Rate Limit Traffic","sidebarTitle":"Rate Limit Requests","href":"/gateway/traffic-policy/examples/rate-limit-requests"},{"title":"Route Requests","href":"/gateway/traffic-policy/examples/route-requests"},{"title":"URL Rewrites Examples","sidebarTitle":"URL Rewrites","href":"/gateway/traffic-policy/examples/url-rewrites"},{"title":"User Agent Filtering Example","sidebarTitle":"User Agent Filtering","href":"/gateway/traffic-policy/examples/user-agent-filtering"}]},{"group":"Reference","pages":[{"title":"Traffic Policy Macros Reference","sidebarTitle":"Macros","href":"/gateway/traffic-policy/macros/index"},{"group":"Variables","pages":[{"title":"Traffic Policy Variables","sidebarTitle":"Overview","href":"/gateway/traffic-policy/variables/index"},{"title":"Action Variables","href":"/gateway/traffic-policy/variables/action"},{"title":"Connection Variables","href":"/gateway/traffic-policy/variables/connection"},{"title":"Endpoint Variables","href":"/gateway/traffic-policy/variables/endpoint"},{"title":"IP Intelligence","href":"/gateway/traffic-policy/variables/ip-intel"},{"title":"HTTP Request Variables","href":"/gateway/traffic-policy/variables/req"},{"title":"HTTP Response Variables","href":"/gateway/traffic-policy/variables/res"},{"title":"Time Variables","href":"/gateway/traffic-policy/variables/time"}]}]}]},{"group":"Observability","pages":[{"title":"Traffic Observability Overview","sidebarTitle":"Overview","href":"/obs/index"},{"group":"Traffic Inspector","root":{"title":"Traffic Inspector","sidebarTitle":"Overview","href":"/obs/traffic-inspection"},"pages":[{"title":"Traffic Inspector HTTP Requests","sidebarTitle":"HTTP Requests","href":"/obs/traffic-inspection/http-requests"},{"title":"Traffic Inspector TCP Connections","sidebarTitle":"TCP Connections","href":"/obs/traffic-inspection/tcp-connections"}]},{"group":"Log Exporting","pages":[{"title":"ngrok Events","sidebarTitle":"Overview","href":"/obs/events/index"},{"title":"Event Source Reference","href":"/obs/events/reference"}]}]},{"group":"Network","pages":[{"group":"Domains","pages":[{"title":"ngrok Domains","sidebarTitle":"Overview","href":"/gateway/domains/index"},{"title":"How to Use a Custom Domain","sidebarTitle":"Using Custom Domains","href":"/gateway/domains/custom-domains"},{"title":"Region and IP Resolution","sidebarTitle":"Region \u0026 IP Resolution","href":"/gateway/domains/region-pinning"},{"title":"TLS Termination","href":"/gateway/domains/tls-termination"},{"title":"mTLS Termination at the ngrok Edge","href":"/gateway/domains/mtls-termination"},{"title":"DDoS Protection","href":"/gateway/domains/ddos-protection"},{"title":"Global Load Balancer","href":"/gateway/domains/global-load-balancer"}]},{"group":"TCP Addresses","pages":[{"title":"IP Addresses","href":"/gateway/domains/ip-addresses"},{"title":"Dedicated IPs","tag":"Coming Soon","href":"/gateway/domains/dedicated-ips"},{"title":"TCP Addresses","href":"/gateway/domains/tcp-addresses"}]}]},{"group":"Resources","pages":[{"title":"IP Policies","sidebarTitle":"IP Policies","href":"/gateway/traffic-policy/concepts/ip-policies"},{"title":"Using Vaults and Secrets with Traffic Policy","sidebarTitle":"Vaults \u0026 Secrets","href":"/gateway/traffic-policy/secrets"},{"title":"TLS Certificates","href":"/gateway/domains/tls-certificates"}]},{"group":"Identity \u0026 Access","pages":[{"title":"Identity and Access Management Overview","sidebarTitle":"Overview","href":"/iam/index"},{"group":"Principals","pages":[{"title":"Users in ngrok Accounts","sidebarTitle":"Users","href":"/iam/users"},{"title":"Service Users","href":"/iam/service-users"}]},{"group":"Account Governance","pages":[{"title":"Single Sign-On and Provisioning to the ngrok Dashboard","sidebarTitle":"Dashboard Single Sign-On","href":"/iam/sso"},{"title":"Role-Based Access Control","sidebarTitle":"RBAC","href":"/iam/rbac"},{"title":"Account Domain Controls","href":"/iam/domain-controls"}]}]}]}]},{"tab":"AI Gateway","pages":[{"title":"AI Gateway","href":"/ai-gateway/overview"}]},{"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":"Security Quick Wins - ngrok documentation","buildId":"dpl_eBQnj73Q1gDRVNqNsS3Yt9yPkTEW","deploymentId":"dpl_eBQnj73Q1gDRVNqNsS3Yt9yPkTEW","dynamics":[],"chunks":[]}