CINXE.COM
<!doctype html> <html lang="en" dir="ltr" class="docs-wrapper plugin-docs plugin-id-default docs-version-current docs-doc-page docs-doc-id-agent/index" data-has-hydrated="false"> <head> <meta charset="UTF-8"> <meta name="generator" content="Docusaurus v3.7.0"> <title data-rh="true">Overview | ngrok documentation</title><meta data-rh="true" name="viewport" content="width=device-width,initial-scale=1"><meta data-rh="true" name="twitter:card" content="summary_large_image"><meta data-rh="true" property="og:image" content="https://ngrok.com/docs/img/ngrok-docs-opengraph.png"><meta data-rh="true" name="twitter:image" content="https://ngrok.com/docs/img/ngrok-docs-opengraph.png"><meta data-rh="true" property="og:url" content="https://ngrok.com/docs/agent/"><meta data-rh="true" property="og:locale" content="en"><meta data-rh="true" name="docusaurus_locale" content="en"><meta data-rh="true" name="docsearch:language" content="en"><meta data-rh="true" name="keywords" content="ngrok, documentation, api, errors, reference, getting started, tutorials"><meta data-rh="true" name="docusaurus_version" content="current"><meta data-rh="true" name="docusaurus_tag" content="docs-default-current"><meta data-rh="true" name="docsearch:version" content="current"><meta data-rh="true" name="docsearch:docusaurus_tag" content="docs-default-current"><meta data-rh="true" property="og:title" content="Overview | ngrok documentation"><meta data-rh="true" name="description" content="Overview"><meta data-rh="true" property="og:description" content="Overview"><link data-rh="true" rel="icon" href="/docs/img/favicon.ico"><link data-rh="true" rel="canonical" href="https://ngrok.com/docs/agent/"><link data-rh="true" rel="alternate" href="https://ngrok.com/docs/agent/" hreflang="en"><link data-rh="true" rel="alternate" href="https://ngrok.com/docs/agent/" hreflang="x-default"><link data-rh="true" rel="preconnect" href="https://8D7MHVMLBR-dsn.algolia.net" crossorigin="anonymous"><link rel="preconnect" href="https://www.googletagmanager.com"> <script>window.dataLayer=window.dataLayer||[]</script> <script>!function(e,t,a,n){e[n]=e[n]||[],e[n].push({"gtm.start":(new Date).getTime(),event:"gtm.js"});var g=t.getElementsByTagName(a)[0],m=t.createElement(a);m.async=!0,m.src="https://www.googletagmanager.com/gtm.js?id=GTM-P4F37ZW",g.parentNode.insertBefore(m,g)}(window,document,"script","dataLayer")</script> <script id="hs-script-loader" src="//js.hs-scripts.com/21124867.js"></script> <link href="https://assets.ngrok.com" rel="preconnect"> <link href="https://fonts.googleapis.com" rel="preconnect"> <link crossorigin="anonymous" href="https://fonts.gstatic.com" rel="preconnect"> <link href="https://fonts.googleapis.com/css2?family=Nunito+Sans:ital,opsz,wght@0,6..12,200..1000;1,6..12,200..1000&amp;display=swap" rel="stylesheet"> <link rel="preload" href="https://cdn.ngrok.com/static/fonts/euclid-square/EuclidSquare-Regular-WebS.woff" as="font" type="font/woff" crossorigin="anonymous"> <link rel="preload" href="https://cdn.ngrok.com/static/fonts/euclid-square/EuclidSquare-RegularItalic-WebS.woff" as="font" type="font/woff" crossorigin="anonymous"> <link rel="preload" href="https://cdn.ngrok.com/static/fonts/euclid-square/EuclidSquare-Medium-WebS.woff" as="font" type="font/woff" crossorigin="anonymous"> <link rel="preload" href="https://cdn.ngrok.com/static/fonts/euclid-square/EuclidSquare-Semibold-WebS.woff" as="font" type="font/woff" crossorigin="anonymous"> <link rel="preload" href="https://cdn.ngrok.com/static/fonts/euclid-square/EuclidSquare-MediumItalic-WebS.woff" as="font" type="font/woff" crossorigin="anonymous"> <link rel="preload" href="https://cdn.ngrok.com/static/fonts/ibm-plex-mono/IBMPlexMono-Text.woff" as="font" type="font/woff" crossorigin="anonymous"> <link rel="preload" href="https://cdn.ngrok.com/static/fonts/ibm-plex-mono/IBMPlexMono-TextItalic.woff" as="font" type="font/woff" crossorigin="anonymous"> <link rel="preload" href="https://cdn.ngrok.com/static/fonts/ibm-plex-mono/IBMPlexMono-SemiBold.woff" as="font" type="font/woff" crossorigin="anonymous"> <link rel="preload" href="https://cdn.ngrok.com/static/fonts/ibm-plex-mono/IBMPlexMono-SemiBoldItalic.woff" as="font" type="font/woff" crossorigin="anonymous"> <script src="/docs/scripts/prevent-fouc.js"></script> <script src="/docs/scripts/ketch.js"></script> <script src="https://global.ketchcdn.com/web/v2/config/ngrok/ngrok_ketch_tag/boot.js" async defer="defer"></script> <script src="/docs/scripts/fix-redirect.js" async></script> <script src="/docs/scripts/anchor-scroll-to.js" async></script> <script src="https://tag.clearbitscripts.com/v1/pk_1caf9e9fb3222466245fb17c8f807837/tags.js"></script><link rel="stylesheet" href="/docs/assets/css/styles.4fc08b95.css"> <script src="/docs/assets/js/runtime~main.15b48f58.js" defer="defer"></script> <script src="/docs/assets/js/main.9eaf429c.js" defer="defer"></script> </head> <body class="navigation-with-keyboard"> <noscript><iframe src="https://www.googletagmanager.com/ns.html?id=GTM-P4F37ZW" height="0" width="0" style="display:none;visibility:hidden"></iframe></noscript> <script>!function(){function t(t){document.documentElement.setAttribute("data-theme",t)}var e=function(){try{return new URLSearchParams(window.location.search).get("docusaurus-theme")}catch(t){}}()||function(){try{return window.localStorage.getItem("theme")}catch(t){}}();t(null!==e?e:"light")}(),function(){try{const n=new URLSearchParams(window.location.search).entries();for(var[t,e]of n)if(t.startsWith("docusaurus-data-")){var a=t.replace("docusaurus-data-","data-");document.documentElement.setAttribute(a,e)}}catch(t){}}()</script><div id="__docusaurus"><div role="region" aria-label="Skip to main content"><a class="skipToContent_bFX7" href="#__docusaurus_skipToContent_fallback">Skip to main content</a></div><nav aria-label="Main" class="navbar navbar--fixed-top"><div class="navbar__inner"><div class="navbar__items"><button aria-label="Toggle navigation bar" aria-expanded="false" class="navbar__toggle clean-btn" type="button"><svg width="30" height="30" viewBox="0 0 30 30" aria-hidden="true"><path stroke="currentColor" stroke-linecap="round" stroke-miterlimit="10" stroke-width="2" d="M4 7h22M4 15h22M4 23h22"></path></svg></button><a href="https://ngrok.com" target="_blank" rel="noopener noreferrer" class="navbar__brand"><div class="navbar__logo"><img src="/docs/img/ngrok-black.svg" alt="ngrok" class="themedComponent_lG9L themedComponent--light_GoHd"><img src="/docs/img/ngrok-white.svg" alt="ngrok" class="themedComponent_lG9L themedComponent--dark_YNM2"></div></a><a href="https://ngrok.com/product/platform" target="_blank" rel="noopener noreferrer" class="navbar__item navbar__link">Platform</a><a href="https://ngrok.com/use-cases" target="_blank" rel="noopener noreferrer" class="navbar__item navbar__link">Use cases</a><a href="https://ngrok.com/blog" target="_blank" rel="noopener noreferrer" class="navbar__item navbar__link">Blog</a><a href="https://ngrok.com/resources" target="_blank" rel="noopener noreferrer" class="navbar__item navbar__link">Resources</a><a aria-current="page" class="navbar__item navbar__link navbar__link--active" href="/docs/">Docs</a><a href="https://ngrok.com/pricing" target="_blank" rel="noopener noreferrer" class="navbar__item navbar__link">Pricing</a><a href="https://download.ngrok.com" target="_blank" rel="noopener noreferrer" class="navbar__item navbar__link">Get ngrok</a></div><div class="navbar__items navbar__items--right"><a href="https://dashboard.ngrok.com/login" target="_blank" rel="noopener noreferrer" class="navbar__item navbar__link dev-portal-login dev-portal-link">Log in</a><a href="https://ngrok.com/signup" target="_blank" rel="noopener noreferrer" class="navbar__item navbar__link dev-portal-signup dev-portal-link">Sign Up</a><button type="button" class="text-muted hover:text-body bg-transparent flex shrink-0 cursor-pointer items-center justify-center rounded-full p-1.5 ring-focus-accent focus:outline-none focus-visible:ring-4 size-9 dark-high-contrast:text-black dark-high-contrast:hover:text-white colorModeToggle_AOY2"><svg xmlns="http://www.w3.org/2000/svg" width="1em" height="1em" fill="currentColor" viewBox="0 0 256 256" class="size-5 shrink-0"><path d="M116,36V20a12,12,0,0,1,24,0V36a12,12,0,0,1-24,0Zm80,92a68,68,0,1,1-68-68A68.07,68.07,0,0,1,196,128Zm-24,0a44,44,0,1,0-44,44A44.05,44.05,0,0,0,172,128ZM51.51,68.49a12,12,0,1,0,17-17l-12-12a12,12,0,0,0-17,17Zm0,119-12,12a12,12,0,0,0,17,17l12-12a12,12,0,1,0-17-17ZM196,72a12,12,0,0,0,8.49-3.51l12-12a12,12,0,0,0-17-17l-12,12A12,12,0,0,0,196,72Zm8.49,115.51a12,12,0,0,0-17,17l12,12a12,12,0,0,0,17-17ZM48,128a12,12,0,0,0-12-12H20a12,12,0,0,0,0,24H36A12,12,0,0,0,48,128Zm80,80a12,12,0,0,0-12,12v16a12,12,0,0,0,24,0V220A12,12,0,0,0,128,208Zm108-92H220a12,12,0,0,0,0,24h16a12,12,0,0,0,0-24Z"></path></svg></button><div class="navbarSearchContainer_sBvq"><button type="button" class="DocSearch DocSearch-Button" aria-label="Search (Command+K)"><span class="DocSearch-Button-Container"><svg width="20" height="20" class="DocSearch-Search-Icon" viewBox="0 0 20 20" aria-hidden="true"><path d="M14.386 14.386l4.0877 4.0877-4.0877-4.0877c-2.9418 2.9419-7.7115 2.9419-10.6533 0-2.9419-2.9418-2.9419-7.7115 0-10.6533 2.9418-2.9419 7.7115-2.9419 10.6533 0 2.9419 2.9418 2.9419 7.7115 0 10.6533z" stroke="currentColor" fill="none" fill-rule="evenodd" stroke-linecap="round" stroke-linejoin="round"></path></svg><span class="DocSearch-Button-Placeholder">Search</span></span><span class="DocSearch-Button-Keys"></span></button></div></div></div><div role="presentation" class="navbar-sidebar__backdrop"></div></nav><div id="__docusaurus_skipToContent_fallback" class="main-wrapper mainWrapper_pg6l"><div class="docsWrapper_bbG9"><button aria-label="Scroll back to top" class="clean-btn theme-back-to-top-button backToTopButton_PcJv" type="button"></button><div class="docRoot_ZLOJ"><aside class="theme-doc-sidebar-container docSidebarContainer_Qh0p"><div class="sidebarViewport_dYMj"><button type="button" class="DocSearch DocSearch-Button" aria-label="Search (Command+K)"><span class="DocSearch-Button-Container"><svg width="20" height="20" class="DocSearch-Search-Icon" viewBox="0 0 20 20" aria-hidden="true"><path d="M14.386 14.386l4.0877 4.0877-4.0877-4.0877c-2.9418 2.9419-7.7115 2.9419-10.6533 0-2.9419-2.9418-2.9419-7.7115 0-10.6533 2.9418-2.9419 7.7115-2.9419 10.6533 0 2.9419 2.9418 2.9419 7.7115 0 10.6533z" stroke="currentColor" fill="none" fill-rule="evenodd" stroke-linecap="round" stroke-linejoin="round"></path></svg><span class="DocSearch-Button-Placeholder">Search</span></span><span class="DocSearch-Button-Keys"></span></button><div class="sidebar_DINV"><nav aria-label="Docs sidebar" class="menu thin-scrollbar menu_QAx2"><ul class="theme-doc-sidebar-menu menu__list"><li class="theme-doc-sidebar-item-link theme-doc-sidebar-item-link-level-1 menu__list-item"><a class="menu__link" href="/docs/">Overview</a></li><li class="theme-doc-sidebar-item-link theme-doc-sidebar-item-link-level-1 menu__list-item"><a class="menu__link" href="/docs/what-is-ngrok/">What is ngrok?</a></li><li class="theme-doc-sidebar-item-link theme-doc-sidebar-item-link-level-1 menu__list-item"><a class="menu__link" href="/docs/how-ngrok-works/">How does ngrok work?</a></li><li class="theme-doc-sidebar-item-link theme-doc-sidebar-item-link-level-1 menu__list-item"><a class="menu__link" href="/docs/why-ngrok/">Why ngrok?</a></li><li class="theme-doc-sidebar-item-link theme-doc-sidebar-item-link-level-1 menu__list-item"><a class="menu__link" href="/docs/whats-new/">What's new?</a></li><li class="theme-doc-sidebar-item-category theme-doc-sidebar-item-category-level-1 menu__list-item menu__list-item--collapsed"><div class="menu__list-item-collapsible"><a class="menu__link menu__link--sublist" href="/docs/getting-started/">Getting Started</a><button aria-label="Expand sidebar category 'Getting Started'" aria-expanded="false" type="button" class="clean-btn menu__caret"></button></div></li><li class="theme-doc-sidebar-item-category theme-doc-sidebar-item-category-level-1 menu__list-item menu__list-item--collapsed"><div class="menu__list-item-collapsible"><a class="menu__link menu__link--sublist" href="/docs/pricing-limits/">Pricing & Limits</a><button aria-label="Expand sidebar category 'Pricing & Limits'" aria-expanded="false" type="button" class="clean-btn menu__caret"></button></div></li><li class="theme-doc-sidebar-item-category theme-doc-sidebar-item-category-level-1 menu__list-item menu__list-item--category"><div class="menu__list-item-collapsible"><a class="menu__link" href="/docs/universal-gateway/overview/">Universal Gateway</a></div><ul style="display:block;overflow:visible;height:auto" class="menu__list"><li class="theme-doc-sidebar-item-link theme-doc-sidebar-item-link-level-2 menu__list-item"><a class="menu__link" tabindex="0" href="/docs/universal-gateway/overview/">Overview</a></li><li class="theme-doc-sidebar-item-category theme-doc-sidebar-item-category-level-2 menu__list-item menu__list-item--collapsed"><div class="menu__list-item-collapsible"><a class="menu__link menu__link--sublist menu__link--sublist-caret" role="button" aria-expanded="false" tabindex="0" href="/docs/universal-gateway/domains/">Concepts</a></div></li><li class="theme-doc-sidebar-item-category theme-doc-sidebar-item-category-level-2 menu__list-item menu__list-item--collapsed"><div class="menu__list-item-collapsible"><a class="menu__link menu__link--sublist" tabindex="0" href="/docs/universal-gateway/endpoints/">Endpoints</a><button aria-label="Expand sidebar category 'Endpoints'" aria-expanded="false" type="button" class="clean-btn menu__caret"></button></div></li><li class="theme-doc-sidebar-item-category theme-doc-sidebar-item-category-level-2 menu__list-item menu__list-item--collapsed"><div class="menu__list-item-collapsible"><a class="menu__link menu__link--sublist" tabindex="0" href="/docs/universal-gateway/global-load-balancer/">Network</a><button aria-label="Expand sidebar category 'Network'" aria-expanded="false" type="button" class="clean-btn menu__caret"></button></div></li></ul></li><li class="theme-doc-sidebar-item-category theme-doc-sidebar-item-category-level-1 menu__list-item menu__list-item--category"><div class="menu__list-item-collapsible"><a class="menu__link" href="/docs/traffic-policy/">Traffic Policy</a></div><ul style="display:block;overflow:visible;height:auto" class="menu__list"><li class="theme-doc-sidebar-item-link theme-doc-sidebar-item-link-level-2 menu__list-item"><a class="menu__link" tabindex="0" href="/docs/traffic-policy/">Overview</a></li><li class="theme-doc-sidebar-item-category theme-doc-sidebar-item-category-level-2 menu__list-item menu__list-item--collapsed"><div class="menu__list-item-collapsible"><a class="menu__link menu__link--sublist" tabindex="0" href="/docs/traffic-policy/getting-started/agent-endpoints/cli/">Getting Started</a><button aria-label="Expand sidebar category 'Getting Started'" aria-expanded="false" type="button" class="clean-btn menu__caret"></button></div></li><li class="theme-doc-sidebar-item-category theme-doc-sidebar-item-category-level-2 menu__list-item menu__list-item--collapsed"><div class="menu__list-item-collapsible"><a class="menu__link menu__link--sublist" tabindex="0" href="/docs/traffic-policy/concepts/">Concepts</a><button aria-label="Expand sidebar category 'Concepts'" aria-expanded="false" type="button" class="clean-btn menu__caret"></button></div></li><li class="theme-doc-sidebar-item-category theme-doc-sidebar-item-category-level-2 menu__list-item menu__list-item--collapsed"><div class="menu__list-item-collapsible"><a class="menu__link menu__link--sublist" tabindex="0" href="/docs/traffic-policy/actions/">Actions</a><button aria-label="Expand sidebar category 'Actions'" aria-expanded="false" type="button" class="clean-btn menu__caret"></button></div></li><li class="theme-doc-sidebar-item-category theme-doc-sidebar-item-category-level-2 menu__list-item menu__list-item--collapsed"><div class="menu__list-item-collapsible"><a class="menu__link menu__link--sublist" tabindex="0" href="/docs/traffic-policy/macros/">Macros</a><button aria-label="Expand sidebar category 'Macros'" aria-expanded="false" type="button" class="clean-btn menu__caret"></button></div></li><li class="theme-doc-sidebar-item-category theme-doc-sidebar-item-category-level-2 menu__list-item menu__list-item--collapsed"><div class="menu__list-item-collapsible"><a class="menu__link menu__link--sublist" tabindex="0" href="/docs/traffic-policy/variables/">Variables</a><button aria-label="Expand sidebar category 'Variables'" aria-expanded="false" type="button" class="clean-btn menu__caret"></button></div></li><li class="theme-doc-sidebar-item-category theme-doc-sidebar-item-category-level-2 menu__list-item menu__list-item--collapsed"><div class="menu__list-item-collapsible"><a class="menu__link menu__link--sublist" tabindex="0" href="/docs/traffic-policy/identities/">Resources</a><button aria-label="Expand sidebar category 'Resources'" aria-expanded="false" type="button" class="clean-btn menu__caret"></button></div></li><li class="theme-doc-sidebar-item-category theme-doc-sidebar-item-category-level-2 menu__list-item menu__list-item--collapsed"><div class="menu__list-item-collapsible"><a class="menu__link menu__link--sublist menu__link--sublist-caret" role="button" aria-expanded="false" tabindex="0" href="/docs/traffic-policy/examples/a-b-tests/">Examples</a></div></li></ul></li><li class="theme-doc-sidebar-item-category theme-doc-sidebar-item-category-level-1 menu__list-item menu__list-item--category"><div class="menu__list-item-collapsible"><a class="menu__link" href="/docs/k8s/">Kubernetes</a></div><ul style="display:block;overflow:visible;height:auto" class="menu__list"><li class="theme-doc-sidebar-item-link theme-doc-sidebar-item-link-level-2 menu__list-item"><a class="menu__link" tabindex="0" href="/docs/k8s/">Overview</a></li><li class="theme-doc-sidebar-item-link theme-doc-sidebar-item-link-level-2 menu__list-item"><a class="menu__link" tabindex="0" href="/docs/k8s/how-it-works/">How it Works</a></li><li class="theme-doc-sidebar-item-link theme-doc-sidebar-item-link-level-2 menu__list-item"><a class="menu__link" tabindex="0" href="/docs/k8s/guides/quickstart/">Quickstart</a></li><li class="theme-doc-sidebar-item-category theme-doc-sidebar-item-category-level-2 menu__list-item menu__list-item--collapsed"><div class="menu__list-item-collapsible"><a class="menu__link menu__link--sublist" tabindex="0" href="/docs/k8s/installation/install/">Install & Manage</a><button aria-label="Expand sidebar category 'Install & Manage'" aria-expanded="false" type="button" class="clean-btn menu__caret"></button></div></li><li class="theme-doc-sidebar-item-category theme-doc-sidebar-item-category-level-2 menu__list-item menu__list-item--collapsed"><div class="menu__list-item-collapsible"><a class="menu__link menu__link--sublist" tabindex="0" href="/docs/k8s/guides/using-crds/">Usage Guides</a><button aria-label="Expand sidebar category 'Usage Guides'" aria-expanded="false" type="button" class="clean-btn menu__caret"></button></div></li><li class="theme-doc-sidebar-item-category theme-doc-sidebar-item-category-level-2 menu__list-item menu__list-item--collapsed"><div class="menu__list-item-collapsible"><a class="menu__link menu__link--sublist" tabindex="0" href="/docs/k8s/crds/">Custom Resources</a><button aria-label="Expand sidebar category 'Custom Resources'" aria-expanded="false" type="button" class="clean-btn menu__caret"></button></div></li><li class="theme-doc-sidebar-item-category theme-doc-sidebar-item-category-level-2 menu__list-item menu__list-item--collapsed"><div class="menu__list-item-collapsible"><a class="menu__link menu__link--sublist" tabindex="0" href="/docs/k8s/integrations/argo-cd/">Integrations & Platforms</a><button aria-label="Expand sidebar category 'Integrations & Platforms'" aria-expanded="false" type="button" class="clean-btn menu__caret"></button></div></li><li class="theme-doc-sidebar-item-link theme-doc-sidebar-item-link-level-2 menu__list-item"><a class="menu__link" tabindex="0" href="/docs/k8s/changelog/">Changelog</a></li><li class="theme-doc-sidebar-item-link theme-doc-sidebar-item-link-level-2 menu__list-item"><a class="menu__link" tabindex="0" href="/docs/k8s/releasing/">Releasing</a></li></ul></li><li class="theme-doc-sidebar-item-category theme-doc-sidebar-item-category-level-1 menu__list-item menu__list-item--category"><div class="menu__list-item-collapsible"><a class="menu__link" href="/docs/obs/">Traffic Observability</a></div><ul style="display:block;overflow:visible;height:auto" class="menu__list"><li class="theme-doc-sidebar-item-link theme-doc-sidebar-item-link-level-2 menu__list-item"><a class="menu__link" tabindex="0" href="/docs/obs/">Overview</a></li><li class="theme-doc-sidebar-item-link theme-doc-sidebar-item-link-level-2 menu__list-item"><a class="menu__link" tabindex="0" href="/docs/obs/traffic-inspection/">Traffic Inspector</a></li><li class="theme-doc-sidebar-item-category theme-doc-sidebar-item-category-level-2 menu__list-item menu__list-item--collapsed"><div class="menu__list-item-collapsible"><a class="menu__link menu__link--sublist" tabindex="0" href="/docs/obs/events/">Events</a><button aria-label="Expand sidebar category 'Events'" aria-expanded="false" type="button" class="clean-btn menu__caret"></button></div></li></ul></li><li class="theme-doc-sidebar-item-category theme-doc-sidebar-item-category-level-1 menu__list-item menu__list-item--category"><div class="menu__list-item-collapsible menu__list-item-collapsible--active"><a class="menu__link menu__link--active" aria-current="page" href="/docs/agent/">Secure Tunnels</a></div><ul style="display:block;overflow:visible;height:auto" class="menu__list"><li class="theme-doc-sidebar-item-category theme-doc-sidebar-item-category-level-2 menu__list-item"><div class="menu__list-item-collapsible menu__list-item-collapsible--active"><a class="menu__link menu__link--sublist menu__link--active" aria-current="page" tabindex="0" href="/docs/agent/">Agent</a><button aria-label="Collapse sidebar category 'Agent'" aria-expanded="true" type="button" class="clean-btn menu__caret"></button></div><ul style="display:block;overflow:visible;height:auto" class="menu__list"><li class="theme-doc-sidebar-item-link theme-doc-sidebar-item-link-level-3 menu__list-item"><a class="menu__link menu__link--active" aria-current="page" tabindex="0" href="/docs/agent/">Overview</a></li><li class="theme-doc-sidebar-item-link theme-doc-sidebar-item-link-level-3 menu__list-item"><a class="menu__link" tabindex="0" href="/docs/agent/web-inspection-interface/">Web Inspection Interface</a></li><li class="theme-doc-sidebar-item-link theme-doc-sidebar-item-link-level-3 menu__list-item"><a class="menu__link" tabindex="0" href="/docs/agent/cli/">CLI</a></li><li class="theme-doc-sidebar-item-link theme-doc-sidebar-item-link-level-3 menu__list-item"><a class="menu__link" tabindex="0" href="/docs/agent/cli-api/">CLI API Commands</a></li><li class="theme-doc-sidebar-item-category theme-doc-sidebar-item-category-level-3 menu__list-item menu__list-item--collapsed"><div class="menu__list-item-collapsible"><a class="menu__link menu__link--sublist" tabindex="0" href="/docs/agent/config/">Configuration file</a><button aria-label="Expand sidebar category 'Configuration file'" aria-expanded="false" type="button" class="clean-btn menu__caret"></button></div></li><li class="theme-doc-sidebar-item-link theme-doc-sidebar-item-link-level-3 menu__list-item"><a class="menu__link" tabindex="0" href="/docs/agent/api/">API</a></li><li class="theme-doc-sidebar-item-link theme-doc-sidebar-item-link-level-3 menu__list-item"><a class="menu__link" tabindex="0" href="/docs/agent/ssh-reverse-tunnel-agent/">SSH Reverse Tunnel</a></li><li class="theme-doc-sidebar-item-link theme-doc-sidebar-item-link-level-3 menu__list-item"><a class="menu__link" tabindex="0" href="/docs/agent/ingress/">Ingress Address</a></li><li class="theme-doc-sidebar-item-link theme-doc-sidebar-item-link-level-3 menu__list-item"><a class="menu__link" tabindex="0" href="/docs/agent/agent-tls-termination/">Agent TLS Termination</a></li><li class="theme-doc-sidebar-item-link theme-doc-sidebar-item-link-level-3 menu__list-item"><a class="menu__link" tabindex="0" href="/docs/agent/changelog/">Changelog</a></li><li class="theme-doc-sidebar-item-link theme-doc-sidebar-item-link-level-3 menu__list-item"><a class="menu__link" tabindex="0" href="/docs/agent/version-support-policy/">Version Support Policy</a></li><li class="theme-doc-sidebar-item-link theme-doc-sidebar-item-link-level-3 menu__list-item"><a class="menu__link" tabindex="0" href="/docs/agent/diagnose/">Diagnose</a></li></ul></li><li class="theme-doc-sidebar-item-category theme-doc-sidebar-item-category-level-2 menu__list-item menu__list-item--collapsed"><div class="menu__list-item-collapsible"><a class="menu__link menu__link--sublist" tabindex="0" href="/docs/agent-sdks/">Agent SDKs</a><button aria-label="Expand sidebar category 'Agent SDKs'" aria-expanded="false" type="button" class="clean-btn menu__caret"></button></div></li></ul></li><li class="theme-doc-sidebar-item-category theme-doc-sidebar-item-category-level-1 menu__list-item menu__list-item--category"><div class="menu__list-item-collapsible"><a class="menu__link" href="/docs/iam/">Identity & Access</a></div><ul style="display:block;overflow:visible;height:auto" class="menu__list"><li class="theme-doc-sidebar-item-link theme-doc-sidebar-item-link-level-2 menu__list-item"><a class="menu__link" tabindex="0" href="/docs/iam/">Overview</a></li><li class="theme-doc-sidebar-item-category theme-doc-sidebar-item-category-level-2 menu__list-item menu__list-item--collapsed"><div class="menu__list-item-collapsible"><a class="menu__link menu__link--sublist" tabindex="0" href="/docs/iam/users/">Principals</a><button aria-label="Expand sidebar category 'Principals'" aria-expanded="false" type="button" class="clean-btn menu__caret"></button></div></li><li class="theme-doc-sidebar-item-category theme-doc-sidebar-item-category-level-2 menu__list-item menu__list-item--collapsed"><div class="menu__list-item-collapsible"><a class="menu__link menu__link--sublist" tabindex="0" href="/docs/iam/sso/">Account Governance</a><button aria-label="Expand sidebar category 'Account Governance'" aria-expanded="false" type="button" class="clean-btn menu__caret"></button></div></li></ul></li><li class="theme-doc-sidebar-item-link theme-doc-sidebar-item-link-level-1"><div class="menu__section">Platform</div></li><li class="theme-doc-sidebar-item-category theme-doc-sidebar-item-category-level-1 menu__list-item menu__list-item--collapsed"><div class="menu__list-item-collapsible"><a class="menu__link menu__link--sublist" href="/docs/api/">API</a><button aria-label="Expand sidebar category 'API'" aria-expanded="false" type="button" class="clean-btn menu__caret"></button></div></li><li class="theme-doc-sidebar-item-category theme-doc-sidebar-item-category-level-1 menu__list-item menu__list-item--collapsed"><div class="menu__list-item-collapsible"><a class="menu__link menu__link--sublist" href="/docs/errors/">Errors</a><button aria-label="Expand sidebar category 'Errors'" aria-expanded="false" type="button" class="clean-btn menu__caret"></button></div></li><li class="theme-doc-sidebar-item-link theme-doc-sidebar-item-link-level-1"><div class="menu__section">Guides</div></li><li class="theme-doc-sidebar-item-category theme-doc-sidebar-item-category-level-1 menu__list-item menu__list-item--collapsed"><div class="menu__list-item-collapsible"><a class="menu__link menu__link--sublist menu__link--sublist-caret" role="button" aria-expanded="false" href="/docs/guides/api-gateway/get-started/">API Gateway</a></div></li><li class="theme-doc-sidebar-item-category theme-doc-sidebar-item-category-level-1 menu__list-item menu__list-item--collapsed"><div class="menu__list-item-collapsible"><a class="menu__link menu__link--sublist" href="/docs/guides/device-gateway/">Device Gateway</a><button aria-label="Expand sidebar category 'Device Gateway'" aria-expanded="false" type="button" class="clean-btn menu__caret"></button></div></li><li class="theme-doc-sidebar-item-category theme-doc-sidebar-item-category-level-1 menu__list-item menu__list-item--collapsed"><div class="menu__list-item-collapsible"><a class="menu__link menu__link--sublist" href="/docs/guides/identity-aware-proxy/">Identity Aware Proxy</a><button aria-label="Expand sidebar category 'Identity Aware Proxy'" aria-expanded="false" type="button" class="clean-btn menu__caret"></button></div></li><li class="theme-doc-sidebar-item-category theme-doc-sidebar-item-category-level-1 menu__list-item menu__list-item--collapsed"><div class="menu__list-item-collapsible"><a class="menu__link menu__link--sublist" href="/docs/guides/site-to-site-connectivity/">Site-to-Site Connectivity</a><button aria-label="Expand sidebar category 'Site-to-Site Connectivity'" aria-expanded="false" type="button" class="clean-btn menu__caret"></button></div></li><li class="theme-doc-sidebar-item-category theme-doc-sidebar-item-category-level-1 menu__list-item menu__list-item--collapsed"><div class="menu__list-item-collapsible"><a class="menu__link menu__link--sublist" href="/docs/guides/developer-preview/">Developer Preview</a><button aria-label="Expand sidebar category 'Developer Preview'" aria-expanded="false" type="button" class="clean-btn menu__caret"></button></div></li><li class="theme-doc-sidebar-item-category theme-doc-sidebar-item-category-level-1 menu__list-item menu__list-item--collapsed"><div class="menu__list-item-collapsible"><a class="menu__link menu__link--sublist" href="/docs/guides/other-guides/">Other guides</a><button aria-label="Expand sidebar category 'Other guides'" aria-expanded="false" type="button" class="clean-btn menu__caret"></button></div></li><li class="theme-doc-sidebar-item-category theme-doc-sidebar-item-category-level-1 menu__list-item menu__list-item--collapsed"><div class="menu__list-item-collapsible"><a class="menu__link menu__link--sublist" href="/docs/using-ngrok-with/">Using ngrok with</a><button aria-label="Expand sidebar category 'Using ngrok with'" aria-expanded="false" type="button" class="clean-btn menu__caret"></button></div></li><li class="theme-doc-sidebar-item-category theme-doc-sidebar-item-category-level-1 menu__list-item menu__list-item--collapsed"><div class="menu__list-item-collapsible"><a class="menu__link menu__link--sublist" href="/docs/integrations/">Integrations</a><button aria-label="Expand sidebar category 'Integrations'" aria-expanded="false" type="button" class="clean-btn menu__caret"></button></div></li><li class="theme-doc-sidebar-item-link theme-doc-sidebar-item-link-level-1"><div class="menu__section"></div></li><li class="theme-doc-sidebar-item-link theme-doc-sidebar-item-link-level-1 menu__list-item"><a class="menu__link" href="/docs/faq/">FAQ</a></li></ul></nav></div></div></aside><main class="docMainContainer_zgXV"><div class="container padding-top--md padding-bottom--lg"><div class="row"><div class="col docItemCol_SLg3"><div class="docItemContainer_LbGb"><article><nav class="theme-doc-breadcrumbs breadcrumbsContainer_Alpn" aria-label="Breadcrumbs"><ul class="breadcrumbs flex items-center" itemscope="" itemtype="https://schema.org/BreadcrumbList"><li class="breadcrumbs__item flex items-center justify-center"><a aria-label="Home page" class="breadcrumbs__link" href="/docs/"><svg xmlns="http://www.w3.org/2000/svg" width="1em" height="1em" fill="currentColor" viewBox="0 0 256 256" class="size-4"><path d="M224,120v96a8,8,0,0,1-8,8H160a8,8,0,0,1-8-8V164a4,4,0,0,0-4-4H108a4,4,0,0,0-4,4v52a8,8,0,0,1-8,8H40a8,8,0,0,1-8-8V120a16,16,0,0,1,4.69-11.31l80-80a16,16,0,0,1,22.62,0l80,80A16,16,0,0,1,224,120Z"></path></svg></a></li><li itemscope="" itemprop="itemListElement" itemtype="https://schema.org/ListItem" class="breadcrumbs__item relative breadcrumbs__item--active"><span class="breadcrumbs__link" itemprop="name">Secure Tunnels</span><meta itemprop="position" content="1"></li></ul></nav><div class="tocCollapsible_YcJT theme-doc-toc-mobile tocMobile_udbX"><button type="button" class="clean-btn tocCollapsibleButton_D7pE">On this page</button></div><div class="theme-doc-markdown markdown"><header><h1>ngrok Agent</h1></header> <h2 class="anchor anchorWithStickyNavbar_Vexi" id="overview">Overview<a href="#overview" class="hash-link" aria-label="Direct link to Overview" title="Direct link to Overview"></a></h2> <p>The ngrok agent is a lightweight command-line program that forwards traffic from endpoints it creates on the ngrok edge to your upstream application services.</p> <p>The ngrok agent is a standalone native executable with zero runtime dependencies. It runs on <a href="#system-requirements" class="cursor-pointer rounded bg-transparent text-accent-600 hover:underline focus:outline-none focus-visible:ring focus-visible:ring-focus-accent">all major operating systems</a> and it is packaged for distribution on most popular package managers.</p> <p>The ngrok agent uses a simple <a class="cursor-pointer rounded bg-transparent text-accent-600 hover:underline focus:outline-none focus-visible:ring focus-visible:ring-focus-accent" href="/docs/agent/config/">YAML configuration file</a>, can install itself as a native operating system service and also has a built-in CLI for calling the <a class="cursor-pointer rounded bg-transparent text-accent-600 hover:underline focus:outline-none focus-visible:ring focus-visible:ring-focus-accent" href="/docs/api/">ngrok API</a>.</p> <h2 class="anchor anchorWithStickyNavbar_Vexi" id="install">Install<a href="#install" class="hash-link" aria-label="Direct link to Install" title="Direct link to Install"></a></h2> <p>Follow the <a class="cursor-pointer rounded bg-transparent text-accent-600 hover:underline focus:outline-none focus-visible:ring focus-visible:ring-focus-accent" href="/docs/getting-started/#step-1-install">getting started guide</a> or visit the <a href="https://download.ngrok.com" target="_blank" class="cursor-pointer rounded bg-transparent text-accent-600 hover:underline focus:outline-none focus-visible:ring focus-visible:ring-focus-accent">download page</a> to install and set up the ngrok agent.</p> <h2 class="anchor anchorWithStickyNavbar_Vexi" id="example-usage">Example Usage<a href="#example-usage" class="hash-link" aria-label="Direct link to Example Usage" title="Direct link to Example Usage"></a></h2> <h3 class="anchor anchorWithStickyNavbar_Vexi" id="http-endpoint">HTTP Endpoint<a href="#http-endpoint" class="hash-link" aria-label="Direct link to HTTP Endpoint" title="Direct link to HTTP Endpoint"></a></h3> <p>Serve your web app listening at port 8080 on a random public URL</p> <div class="text-mono overflow-hidden rounded-md border border-gray-300 bg-gray-50 font-mono [&_svg]:shrink-0 mb-4"><pre class="min-h-[3.25rem] p-4 pr-[3.375rem] font-mono text-mono">Loading…</pre></div> <h3 class="anchor anchorWithStickyNavbar_Vexi" id="static-domain">Static Domain<a href="#static-domain" class="hash-link" aria-label="Direct link to Static Domain" title="Direct link to Static Domain"></a></h3> <p>Serve a web app on example.ngrok.app</p> <div class="text-mono overflow-hidden rounded-md border border-gray-300 bg-gray-50 font-mono [&_svg]:shrink-0 mb-4"><pre class="min-h-[3.25rem] p-4 pr-[3.375rem] font-mono text-mono">Loading…</pre></div> <h3 class="anchor anchorWithStickyNavbar_Vexi" id="basic-auth">Basic Auth<a href="#basic-auth" class="hash-link" aria-label="Direct link to Basic Auth" title="Direct link to Basic Auth"></a></h3> <p>Secure your web app with a username + password</p> <div class="text-mono overflow-hidden rounded-md border border-gray-300 bg-gray-50 font-mono [&_svg]:shrink-0 mb-4"><pre class="min-h-[3.25rem] p-4 pr-[3.375rem] font-mono text-mono">Loading…</pre></div> <h5 class="anchor anchorWithStickyNavbar_Vexi" id="traffic-policyyml"><code class="border-card rounded-md border bg-gray-500/5 px-1 py-0.5 font-mono text-[0.8em]">traffic-policy.yml</code><a href="#traffic-policyyml" class="hash-link" aria-label="Direct link to traffic-policyyml" title="Direct link to traffic-policyyml"></a></h5> <div class="text-mono overflow-hidden rounded-md border border-gray-300 bg-gray-50 font-mono [&_svg]:shrink-0 mb-4"><pre class="min-h-[3.25rem] p-4 pr-[3.375rem] font-mono text-mono">Loading…</pre></div> <h3 class="anchor anchorWithStickyNavbar_Vexi" id="forward-to-non-local">Forward to non-local<a href="#forward-to-non-local" class="hash-link" aria-label="Direct link to Forward to non-local" title="Direct link to Forward to non-local"></a></h3> <p>Forward to a service not listening on localhost</p> <div class="text-mono overflow-hidden rounded-md border border-gray-300 bg-gray-50 font-mono [&_svg]:shrink-0 mb-4"><pre class="min-h-[3.25rem] p-4 pr-[3.375rem] font-mono text-mono">Loading…</pre></div> <h3 class="anchor anchorWithStickyNavbar_Vexi" id="local-https-server">Local HTTPS Server<a href="#local-https-server" class="hash-link" aria-label="Direct link to Local HTTPS Server" title="Direct link to Local HTTPS Server"></a></h3> <p>Forward to an upstream service listening for <code class="border-card rounded-md border bg-gray-500/5 px-1 py-0.5 font-mono text-[0.8em]">https</code></p> <div class="text-mono overflow-hidden rounded-md border border-gray-300 bg-gray-50 font-mono [&_svg]:shrink-0 mb-4"><pre class="min-h-[3.25rem] p-4 pr-[3.375rem] font-mono text-mono">Loading…</pre></div> <h3 class="anchor anchorWithStickyNavbar_Vexi" id="forwarding-to-ipv6-address">Forwarding to IPv6 Address<a href="#forwarding-to-ipv6-address" class="hash-link" aria-label="Direct link to Forwarding to IPv6 Address" title="Direct link to Forwarding to IPv6 Address"></a></h3> <p>The ngrok agent can also forward to IPv6 addresses</p> <div class="text-mono overflow-hidden rounded-md border border-gray-300 bg-gray-50 font-mono [&_svg]:shrink-0 mb-4"><pre class="min-h-[3.25rem] p-4 pr-[3.375rem] font-mono text-mono">Loading…</pre></div> <div class="text-mono overflow-hidden rounded-md border border-gray-300 bg-gray-50 font-mono [&_svg]:shrink-0 mb-4"><pre class="min-h-[3.25rem] p-4 pr-[3.375rem] font-mono text-mono">Loading…</pre></div> <h3 class="anchor anchorWithStickyNavbar_Vexi" id="tcp-endpoint">TCP Endpoint<a href="#tcp-endpoint" class="hash-link" aria-label="Direct link to TCP Endpoint" title="Direct link to TCP Endpoint"></a></h3> <p>Accept traffic to a non-HTTP service.</p> <div class="text-mono overflow-hidden rounded-md border border-gray-300 bg-gray-50 font-mono [&_svg]:shrink-0 mb-4"><pre class="min-h-[3.25rem] p-4 pr-[3.375rem] font-mono text-mono">Loading…</pre></div> <h3 class="anchor anchorWithStickyNavbar_Vexi" id="tls-endpoint">TLS Endpoint<a href="#tls-endpoint" class="hash-link" aria-label="Direct link to TLS Endpoint" title="Direct link to TLS Endpoint"></a></h3> <p>Listen on <code class="border-card rounded-md border bg-gray-500/5 px-1 py-0.5 font-mono text-[0.8em]">your-name.ngrok.app</code> for TLS traffic. It could be HTTPS, but any protocol wrapped in TLS is accepted.</p> <div class="text-mono overflow-hidden rounded-md border border-gray-300 bg-gray-50 font-mono [&_svg]:shrink-0 mb-4"><pre class="min-h-[3.25rem] p-4 pr-[3.375rem] font-mono text-mono">Loading…</pre></div> <h5 class="anchor anchorWithStickyNavbar_Vexi" id="traffic-policyyml"><code class="border-card rounded-md border bg-gray-500/5 px-1 py-0.5 font-mono text-[0.8em]">traffic-policy.yml</code><a href="#traffic-policyyml" class="hash-link" aria-label="Direct link to traffic-policyyml" title="Direct link to traffic-policyyml"></a></h5> <div class="text-mono overflow-hidden rounded-md border border-gray-300 bg-gray-50 font-mono [&_svg]:shrink-0 mb-4"><pre class="min-h-[3.25rem] p-4 pr-[3.375rem] font-mono text-mono">Loading…</pre></div> <h3 class="anchor anchorWithStickyNavbar_Vexi" id="multiple-endpoints">Multiple Endpoints<a href="#multiple-endpoints" class="hash-link" aria-label="Direct link to Multiple Endpoints" title="Direct link to Multiple Endpoints"></a></h3> <p>Start multiple tunnels defined in the <a class="cursor-pointer rounded bg-transparent text-accent-600 hover:underline focus:outline-none focus-visible:ring focus-visible:ring-focus-accent" href="/docs/agent/config/">configuration file</a>.</p> <div class="text-mono overflow-hidden rounded-md border border-gray-300 bg-gray-50 font-mono [&_svg]:shrink-0 mb-4"><pre class="min-h-[3.25rem] p-4 pr-[3.375rem] font-mono text-mono">Loading…</pre></div> <h2 class="anchor anchorWithStickyNavbar_Vexi" id="tab-completion">Tab Completion<a href="#tab-completion" class="hash-link" aria-label="Direct link to Tab Completion" title="Direct link to Tab Completion"></a></h2> <p>The ngrok agent has built-in tab completion which makes it easy to navigate its command and flags by hitting tab in your terminal when using a <code class="border-card rounded-md border bg-gray-500/5 px-1 py-0.5 font-mono text-[0.8em]">bash</code> or <code class="border-card rounded-md border bg-gray-500/5 px-1 py-0.5 font-mono text-[0.8em]">zsh</code> shell. Add tab-completion to your shell session with:</p> <div class="text-mono overflow-hidden rounded-md border border-gray-300 bg-gray-50 font-mono [&_svg]:shrink-0 mb-4"><pre class="min-h-[3.25rem] p-4 pr-[3.375rem] font-mono text-mono">Loading…</pre></div> <p>Install it permanently by following the documentation for the <a class="cursor-pointer rounded bg-transparent text-accent-600 hover:underline focus:outline-none focus-visible:ring focus-visible:ring-focus-accent" href="/docs/agent/cli/#ngrok-completion"><code class="border-card rounded-md border bg-gray-500/5 px-1 py-0.5 font-mono text-[0.8em]">ngrok completion</code> command</a>.</p> <h2 class="anchor anchorWithStickyNavbar_Vexi" id="authtokens">Authtokens<a href="#authtokens" class="hash-link" aria-label="Direct link to Authtokens" title="Direct link to Authtokens"></a></h2> <p>The ngrok agent authenticates with an authtoken. <a href="https://dashboard.ngrok.com/get-started/your-authtoken" target="_blank" class="cursor-pointer rounded bg-transparent text-accent-600 hover:underline focus:outline-none focus-visible:ring focus-visible:ring-focus-accent">Your authtoken is available on the ngrok dashboard</a>. Add your authtoken to the ngrok agent with the following command:</p> <div class="text-mono overflow-hidden rounded-md border border-gray-300 bg-gray-50 font-mono [&_svg]:shrink-0 mb-4"><pre class="min-h-[3.25rem] p-4 pr-[3.375rem] font-mono text-mono">Loading…</pre></div> <p>This command updates the <code class="border-card rounded-md border bg-gray-500/5 px-1 py-0.5 font-mono text-[0.8em]">authtoken</code> property in your <a class="cursor-pointer rounded bg-transparent text-accent-600 hover:underline focus:outline-none focus-visible:ring focus-visible:ring-focus-accent" href="/docs/agent/config/">ngrok configuration file</a>.</p> <p>Use a separate authtoken for each agent you configure. You can <a href="https://dashboard.ngrok.com/tunnels/authtokens" target="_blank" class="cursor-pointer rounded bg-transparent text-accent-600 hover:underline focus:outline-none focus-visible:ring focus-visible:ring-focus-accent">provision additional authtokens on your ngrok dashboard</a> or <a class="cursor-pointer rounded bg-transparent text-accent-600 hover:underline focus:outline-none focus-visible:ring focus-visible:ring-focus-accent" href="/docs/agent/config/v3/#authtoken">via API</a>. Separate authtokens isolate the security risk if an authtoken is compromised. It also allows you to configure <a href="#authtoken-acls" class="cursor-pointer rounded bg-transparent text-accent-600 hover:underline focus:outline-none focus-visible:ring focus-visible:ring-focus-accent">ACLs</a> on a per agent basis.</p> <p>When you provision a new authtoken, the full token is only displayed once. As a security feature, ngrok does not store a recoverable representation of the token.</p> <h2 class="anchor anchorWithStickyNavbar_Vexi" id="authtoken-acls">Authtoken ACLs<a href="#authtoken-acls" class="hash-link" aria-label="Direct link to Authtoken ACLs" title="Direct link to Authtoken ACLs"></a></h2> <p>Authtoken ACLs restrict what actions an ngrok agent connecting with that authtoken is allowed to take. You may define multiple ACLs. Authtokens with no ACLs may take all actions. The following ACLs are supported:</p> <table><thead><tr><th>Example</th><th>Description</th></tr></thead><tbody><tr><td><code class="border-card rounded-md border bg-gray-500/5 px-1 py-0.5 font-mono text-[0.8em]">bind:foo.ngrok.app</code></td><td>The agent may only create an endpoint on <code class="border-card rounded-md border bg-gray-500/5 px-1 py-0.5 font-mono text-[0.8em]">foo.ngrok.app</code></td></tr><tr><td><code class="border-card rounded-md border bg-gray-500/5 px-1 py-0.5 font-mono text-[0.8em]">bind:*.example.com</code></td><td>The agent may only create endpoints on subdomains of <code class="border-card rounded-md border bg-gray-500/5 px-1 py-0.5 font-mono text-[0.8em]">example.com</code></td></tr><tr><td><code class="border-card rounded-md border bg-gray-500/5 px-1 py-0.5 font-mono text-[0.8em]">bind:foo=bar</code></td><td>The agent may create a labeled tunnel with the label <code class="border-card rounded-md border bg-gray-500/5 px-1 py-0.5 font-mono text-[0.8em]">foo=bar</code></td></tr><tr><td><code class="border-card rounded-md border bg-gray-500/5 px-1 py-0.5 font-mono text-[0.8em]">bind:app=*</code></td><td>The agent may create labeled tunnels with labels like <code class="border-card rounded-md border bg-gray-500/5 px-1 py-0.5 font-mono text-[0.8em]">app=x</code> or <code class="border-card rounded-md border bg-gray-500/5 px-1 py-0.5 font-mono text-[0.8em]">app=y</code></td></tr><tr><td><code class="border-card rounded-md border bg-gray-500/5 px-1 py-0.5 font-mono text-[0.8em]">bind:*</code></td><td>The agent may listen on all endpoints</td></tr></tbody></table> <h2 class="anchor anchorWithStickyNavbar_Vexi" id="api-keys">API Keys<a href="#api-keys" class="hash-link" aria-label="Direct link to API Keys" title="Direct link to API Keys"></a></h2> <p>The ngrok agent contains a <a class="cursor-pointer rounded bg-transparent text-accent-600 hover:underline focus:outline-none focus-visible:ring focus-visible:ring-focus-accent" href="/docs/agent/cli-api/">complete CLI for the ngrok API</a>.</p> <p>To use it, <a href="https://dashboard.ngrok.com/api" target="_blank" class="cursor-pointer rounded bg-transparent text-accent-600 hover:underline focus:outline-none focus-visible:ring focus-visible:ring-focus-accent">create an API Key on your ngrok dashboard</a> and then run:</p> <div class="text-mono overflow-hidden rounded-md border border-gray-300 bg-gray-50 font-mono [&_svg]:shrink-0 mb-4"><pre class="min-h-[3.25rem] p-4 pr-[3.375rem] font-mono text-mono">Loading…</pre></div> <p>After you've installed the API Key, try querying your list of domains or online endpoints:</p> <div class="text-mono overflow-hidden rounded-md border border-gray-300 bg-gray-50 font-mono [&_svg]:shrink-0 mb-4"><pre class="min-h-[3.25rem] p-4 pr-[3.375rem] font-mono text-mono">Loading…</pre></div> <h2 class="anchor anchorWithStickyNavbar_Vexi" id="configuration-file">Configuration File<a href="#configuration-file" class="hash-link" aria-label="Direct link to Configuration File" title="Direct link to Configuration File"></a></h2> <p>The ngrok agent uses a <a class="cursor-pointer rounded bg-transparent text-accent-600 hover:underline focus:outline-none focus-visible:ring focus-visible:ring-focus-accent" href="/docs/agent/config/">YAML configuration file</a> to customize its behavior. The config file is useful if your configuration is too complex for the command line and if you want the agent to run multiple tunnels simultaneously.</p> <p>Consult the <a class="cursor-pointer rounded bg-transparent text-accent-600 hover:underline focus:outline-none focus-visible:ring focus-visible:ring-focus-accent" href="/docs/agent/config/">ngrok agent configuration file reference</a> for a full list of configuration file options.</p> <h2 class="anchor anchorWithStickyNavbar_Vexi" id="environment-variables">Environment Variables<a href="#environment-variables" class="hash-link" aria-label="Direct link to Environment Variables" title="Direct link to Environment Variables"></a></h2> <p>The ngrok agent supports environment variables for some configuration. Environment variables take precedence over the corresponding values specified in the configuration file.</p> <table><thead><tr><th>Name</th><th>Configuration Property</th></tr></thead><tbody><tr><td><code class="border-card rounded-md border bg-gray-500/5 px-1 py-0.5 font-mono text-[0.8em]">NGROK_AUTHTOKEN</code></td><td><a class="cursor-pointer rounded bg-transparent text-accent-600 hover:underline focus:outline-none focus-visible:ring focus-visible:ring-focus-accent" href="/docs/agent/config/v3/#authtoken"><code class="border-card rounded-md border bg-gray-500/5 px-1 py-0.5 font-mono text-[0.8em]">authtoken</code></a></td></tr><tr><td><code class="border-card rounded-md border bg-gray-500/5 px-1 py-0.5 font-mono text-[0.8em]">NGROK_API_KEY</code></td><td><a class="cursor-pointer rounded bg-transparent text-accent-600 hover:underline focus:outline-none focus-visible:ring focus-visible:ring-focus-accent" href="/docs/agent/config/v3/#api_key"><code class="border-card rounded-md border bg-gray-500/5 px-1 py-0.5 font-mono text-[0.8em]">api_key</code></a></td></tr></tbody></table> <h2 class="anchor anchorWithStickyNavbar_Vexi" id="background-service">Running ngrok in the background<a href="#background-service" class="hash-link" aria-label="Direct link to Running ngrok in the background" title="Direct link to Running ngrok in the background"></a></h2> <p>ngrok includes commands to run itself in the background as a native operating system service, i.e. as a daemon. When it runs as an operating system service it:</p> <ul> <li>Starts when the machine boots</li> <li>Automatically restarts after crashes</li> <li>Can be managed via native OS service tooling</li> <li>Sends logs to the OS's native logging service</li> <li>Starts all tunnels defined in the configuration file, the equivalent of running <code class="border-card rounded-md border bg-gray-500/5 px-1 py-0.5 font-mono text-[0.8em]">ngrok start --all</code></li> </ul> <div class="theme-admonition theme-admonition-tip admonition_Gu15 alert alert--success"><div class="admonitionHeading_teYo"><span class="admonitionIcon_dVWP"><svg viewBox="0 0 12 16"><path fill-rule="evenodd" d="M6.5 0C3.48 0 1 2.19 1 5c0 .92.55 2.25 1 3 1.34 2.25 1.78 2.78 2 4v1h5v-1c.22-1.22.66-1.75 2-4 .45-.75 1-2.08 1-3 0-2.81-2.48-5-5.5-5zm3.64 7.48c-.25.44-.47.8-.67 1.11-.86 1.41-1.25 2.06-1.45 3.23-.02.05-.02.11-.02.17H5c0-.06 0-.13-.02-.17-.2-1.17-.59-1.83-1.45-3.23-.2-.31-.42-.67-.67-1.11C2.44 6.78 2 5.65 2 5c0-2.2 2.02-4 4.5-4 1.22 0 2.36.42 3.22 1.19C10.55 2.94 11 3.94 11 5c0 .66-.44 1.78-.86 2.48zM4 14h5c-.23 1.14-1.3 2-2.5 2s-2.27-.86-2.5-2z"></path></svg></span>tip</div><div class="admonitionContent_CCSb"><p>In most cases, installing ngrok as a service requires administrator privileges.</p></div></div> <table><thead><tr><th>OS</th><th>Notes</th></tr></thead><tbody><tr><td>Linux</td><td>The ngrok agent creates a <code class="border-card rounded-md border bg-gray-500/5 px-1 py-0.5 font-mono text-[0.8em]">systemd</code> unit file. Errors and warnings are logged to <code class="border-card rounded-md border bg-gray-500/5 px-1 py-0.5 font-mono text-[0.8em]">syslog</code>.</td></tr><tr><td>Windows</td><td>The ngrok agent installs itself as a Windows service. It can be managed via Windows Services. Errors and warnings are logged to the Windows event log.</td></tr><tr><td>MacOS</td><td>The ngrok agent creates a plist file and configures itself to run via <code class="border-card rounded-md border bg-gray-500/5 px-1 py-0.5 font-mono text-[0.8em]">launchd</code>. Errors and warnings are logged to <code class="border-card rounded-md border bg-gray-500/5 px-1 py-0.5 font-mono text-[0.8em]">syslog</code>.</td></tr></tbody></table> <h4 class="anchor anchorWithStickyNavbar_Vexi" id="try-it-out">Try it out<a href="#try-it-out" class="hash-link" aria-label="Direct link to Try it out" title="Direct link to Try it out"></a></h4> <p>Create an ngrok <a href="#configuration-file" class="cursor-pointer rounded bg-transparent text-accent-600 hover:underline focus:outline-none focus-visible:ring focus-visible:ring-focus-accent">configuration file</a>. For this example, we'll assume it's <code class="border-card rounded-md border bg-gray-500/5 px-1 py-0.5 font-mono text-[0.8em]">C:\ngrok\ngrok.yml</code>. In your configuration file, make sure you include the <a class="cursor-pointer rounded bg-transparent text-accent-600 hover:underline focus:outline-none focus-visible:ring focus-visible:ring-focus-accent" href="/docs/agent/config/v3/#authtoken"><code class="border-card rounded-md border bg-gray-500/5 px-1 py-0.5 font-mono text-[0.8em]">authtoken</code></a> property and define all of the tunnels that you want to start. Then run:</p> <div class="text-mono overflow-hidden rounded-md border border-gray-300 bg-gray-50 font-mono [&_svg]:shrink-0 mb-4"><pre class="min-h-[3.25rem] p-4 pr-[3.375rem] font-mono text-mono">Loading…</pre></div> <p>This will validate that the configuration file is valid, and if so, install ngrok as a service using the given configuration file. The service installation includes the location of the ngrok executable and the configuration file, so don't move or delete either after you've installed the service.</p> <p>You can then start the ngrok agent service with:</p> <div class="text-mono overflow-hidden rounded-md border border-gray-300 bg-gray-50 font-mono [&_svg]:shrink-0 mb-4"><pre class="min-h-[3.25rem] p-4 pr-[3.375rem] font-mono text-mono">Loading…</pre></div> <p>You can manage the agent with your OS's normal service tooling, but the agent also includes the <a class="cursor-pointer rounded bg-transparent text-accent-600 hover:underline focus:outline-none focus-visible:ring focus-visible:ring-focus-accent" href="/docs/agent/cli/#ngrok-service"><code class="border-card rounded-md border bg-gray-500/5 px-1 py-0.5 font-mono text-[0.8em]">ngrok service</code> commands</a> to manage the installed service:</p> <ul> <li><code class="border-card rounded-md border bg-gray-500/5 px-1 py-0.5 font-mono text-[0.8em]">ngrok service start</code></li> <li><code class="border-card rounded-md border bg-gray-500/5 px-1 py-0.5 font-mono text-[0.8em]">ngrok service stop</code></li> <li><code class="border-card rounded-md border bg-gray-500/5 px-1 py-0.5 font-mono text-[0.8em]">ngrok service restart</code></li> <li><code class="border-card rounded-md border bg-gray-500/5 px-1 py-0.5 font-mono text-[0.8em]">ngrok service uninstall</code></li> </ul> <div class="theme-admonition theme-admonition-tip admonition_Gu15 alert alert--success"><div class="admonitionHeading_teYo"><span class="admonitionIcon_dVWP"><svg viewBox="0 0 12 16"><path fill-rule="evenodd" d="M6.5 0C3.48 0 1 2.19 1 5c0 .92.55 2.25 1 3 1.34 2.25 1.78 2.78 2 4v1h5v-1c.22-1.22.66-1.75 2-4 .45-.75 1-2.08 1-3 0-2.81-2.48-5-5.5-5zm3.64 7.48c-.25.44-.47.8-.67 1.11-.86 1.41-1.25 2.06-1.45 3.23-.02.05-.02.11-.02.17H5c0-.06 0-.13-.02-.17-.2-1.17-.59-1.83-1.45-3.23-.2-.31-.42-.67-.67-1.11C2.44 6.78 2 5.65 2 5c0-2.2 2.02-4 4.5-4 1.22 0 2.36.42 3.22 1.19C10.55 2.94 11 3.94 11 5c0 .66-.44 1.78-.86 2.48zM4 14h5c-.23 1.14-1.3 2-2.5 2s-2.27-.86-2.5-2z"></path></svg></span>tip</div><div class="admonitionContent_CCSb"><p>If you see an exit code <code class="border-card rounded-md border bg-gray-500/5 px-1 py-0.5 font-mono text-[0.8em]">5</code> or <code class="border-card rounded-md border bg-gray-500/5 px-1 py-0.5 font-mono text-[0.8em]">Input/output error</code>, it usually indicates that ngrok is not able to find the config file and/or does not have permissions to do so. Make sure you have installed the ngrok service with a valid config file and that when the service is run (either as you or an administrator) it has access to that same config file.</p></div></div> <h2 class="anchor anchorWithStickyNavbar_Vexi" id="remote-management">Remote Management<a href="#remote-management" class="hash-link" aria-label="Direct link to Remote Management" title="Direct link to Remote Management"></a></h2> <p>The ngrok agent can be stopped, restarted, or upgraded remotely using the <a class="cursor-pointer rounded bg-transparent text-accent-600 hover:underline focus:outline-none focus-visible:ring focus-visible:ring-focus-accent" href="/docs/api/resources/tunnel-sessions/#restart-tunnel-agent">Tunnel Sessions</a> API. You can also perform these actions from the ngrok Dashboard.</p> <div class="theme-admonition theme-admonition-warning admonition_Gu15 alert alert--warning"><div class="admonitionHeading_teYo"><span class="admonitionIcon_dVWP"><svg viewBox="0 0 16 16"><path fill-rule="evenodd" d="M8.893 1.5c-.183-.31-.52-.5-.887-.5s-.703.19-.886.5L.138 13.499a.98.98 0 0 0 0 1.001c.193.31.53.501.886.501h13.964c.367 0 .704-.19.877-.5a1.03 1.03 0 0 0 .01-1.002L8.893 1.5zm.133 11.497H6.987v-2.003h2.039v2.003zm0-3.004H6.987V5.987h2.039v4.006z"></path></svg></span>warning</div><div class="admonitionContent_CCSb"><p>Use this with caution if you have made changes to the config file. If for some reason ngrok cannot restart, you may lose access to the agent completely.</p></div></div> <h2 class="anchor anchorWithStickyNavbar_Vexi" id="connectivity">Connectivity<a href="#connectivity" class="hash-link" aria-label="Direct link to Connectivity" title="Direct link to Connectivity"></a></h2> <p>When the ngrok agent and Agent SDKs start, they establish long-lived TLS connections to the ngrok service through which they create new endpoints and receive connections from ngrok's edge that are intended for your upstream services.</p> <h3 class="anchor anchorWithStickyNavbar_Vexi" id="connectivity-address">Address<a href="#connectivity-address" class="hash-link" aria-label="Direct link to Address" title="Direct link to Address"></a></h3> <p>By default, the latest ngrok agent dials the following "agent ingress address" when it connects to the ngrok service. This address resolves to a <a class="cursor-pointer rounded bg-transparent text-accent-600 hover:underline focus:outline-none focus-visible:ring focus-visible:ring-focus-accent" href="/docs/universal-gateway/ip-addresses/">dynamic set of IP Addresses</a>.</p> <div class="text-mono overflow-hidden rounded-md border border-gray-300 bg-gray-50 font-mono [&_svg]:shrink-0 mb-4"><pre class="min-h-[3.25rem] p-4 pr-[3.375rem] font-mono text-mono">Loading…</pre></div> <div class="theme-admonition theme-admonition-note admonition_Gu15 alert alert--secondary"><div class="admonitionHeading_teYo"><span class="admonitionIcon_dVWP"><svg viewBox="0 0 14 16"><path fill-rule="evenodd" d="M6.3 5.69a.942.942 0 0 1-.28-.7c0-.28.09-.52.28-.7.19-.18.42-.28.7-.28.28 0 .52.09.7.28.18.19.28.42.28.7 0 .28-.09.52-.28.7a1 1 0 0 1-.7.3c-.28 0-.52-.11-.7-.3zM8 7.99c-.02-.25-.11-.48-.31-.69-.2-.19-.42-.3-.69-.31H6c-.27.02-.48.13-.69.31-.2.2-.3.44-.31.69h1v3c.02.27.11.5.31.69.2.2.42.31.69.31h1c.27 0 .48-.11.69-.31.2-.19.3-.42.31-.69H8V7.98v.01zM7 2.3c-3.14 0-5.7 2.54-5.7 5.68 0 3.14 2.56 5.7 5.7 5.7s5.7-2.55 5.7-5.7c0-3.15-2.56-5.69-5.7-5.69v.01zM7 .98c3.86 0 7 3.14 7 7s-3.14 7-7 7-7-3.12-7-7 3.14-7 7-7z"></path></svg></span>note</div><div class="admonitionContent_CCSb"><p>All connections to ngrok servers are made on port 443.</p></div></div> <p>You can <a class="cursor-pointer rounded bg-transparent text-accent-600 hover:underline focus:outline-none focus-visible:ring focus-visible:ring-focus-accent" href="/docs/agent/ingress/">customize the agent ingress address</a> to brand it with your own domain.</p> <p>The agent by default only connects to a single region. However connections to multiple regions can be created with traffic load balanced across these connections. If you are interested in this capability, please <a href="https://ngrok.com/enterprise/contact" target="_blank" class="cursor-pointer rounded bg-transparent text-accent-600 hover:underline focus:outline-none focus-visible:ring focus-visible:ring-focus-accent">contact us</a>.</p> <p>The complete list of addresses and IP addresses available for the agent to connect to ngrok can be found in our <a href="https://s3.amazonaws.com/dns.ngrok.com/tunnel.json" target="_blank" class="cursor-pointer rounded bg-transparent text-accent-600 hover:underline focus:outline-none focus-visible:ring focus-visible:ring-focus-accent">ngrok DNS tunnel.json file</a>.</p> <div class="theme-admonition theme-admonition-note admonition_Gu15 alert alert--secondary"><div class="admonitionHeading_teYo"><span class="admonitionIcon_dVWP"><svg viewBox="0 0 14 16"><path fill-rule="evenodd" d="M6.3 5.69a.942.942 0 0 1-.28-.7c0-.28.09-.52.28-.7.19-.18.42-.28.7-.28.28 0 .52.09.7.28.18.19.28.42.28.7 0 .28-.09.52-.28.7a1 1 0 0 1-.7.3c-.28 0-.52-.11-.7-.3zM8 7.99c-.02-.25-.11-.48-.31-.69-.2-.19-.42-.3-.69-.31H6c-.27.02-.48.13-.69.31-.2.2-.3.44-.31.69h1v3c.02.27.11.5.31.69.2.2.42.31.69.31h1c.27 0 .48-.11.69-.31.2-.19.3-.42.31-.69H8V7.98v.01zM7 2.3c-3.14 0-5.7 2.54-5.7 5.68 0 3.14 2.56 5.7 5.7 5.7s5.7-2.55 5.7-5.7c0-3.15-2.56-5.69-5.7-5.69v.01zM7 .98c3.86 0 7 3.14 7 7s-3.14 7-7 7-7-3.12-7-7 3.14-7 7-7z"></path></svg></span>note</div><div class="admonitionContent_CCSb"><p>Prior to ngrok agent version 3.3.0, the ngrok agent connected to <code class="border-card rounded-md border bg-gray-500/5 px-1 py-0.5 font-mono text-[0.8em]">tunnel.*.ngrok.com</code> domains. The latest agent uses <code class="border-card rounded-md border bg-gray-500/5 px-1 py-0.5 font-mono text-[0.8em]">connect.*.ngrok-agent.com</code> domains.</p></div></div> <h3 class="anchor anchorWithStickyNavbar_Vexi" id="additional-urls">Additional URLs<a href="#additional-urls" class="hash-link" aria-label="Direct link to Additional URLs" title="Direct link to Additional URLs"></a></h3> <p>In addition to the addresses used for connecting to the ngrok server, the ngrok agent may reach out to the following URLs.</p> <h4 class="anchor anchorWithStickyNavbar_Vexi" id="certificate-revocation-list-crl-check">Certificate Revocation List (CRL) Check<a href="#certificate-revocation-list-crl-check" class="hash-link" aria-label="Direct link to Certificate Revocation List (CRL) Check" title="Direct link to Certificate Revocation List (CRL) Check"></a></h4> <p>The ngrok agent reaches out to the following domains to check for revoked certificates. This check can be disabled by adding <code class="border-card rounded-md border bg-gray-500/5 px-1 py-0.5 font-mono text-[0.8em]">crl_noverify: true</code> to your ngrok agent config.</p> <ul> <li>Prior to ngrok agent version 3.10.0: <code class="border-card rounded-md border bg-gray-500/5 px-1 py-0.5 font-mono text-[0.8em]">http://crl.ngrok.com/ngrok.crl</code></li> <li>Latest versions: <code class="border-card rounded-md border bg-gray-500/5 px-1 py-0.5 font-mono text-[0.8em]">http://crl.ngrok-agent.com/ngrok.crl</code></li> </ul> <div class="theme-admonition theme-admonition-note admonition_Gu15 alert alert--secondary"><div class="admonitionHeading_teYo"><span class="admonitionIcon_dVWP"><svg viewBox="0 0 14 16"><path fill-rule="evenodd" d="M6.3 5.69a.942.942 0 0 1-.28-.7c0-.28.09-.52.28-.7.19-.18.42-.28.7-.28.28 0 .52.09.7.28.18.19.28.42.28.7 0 .28-.09.52-.28.7a1 1 0 0 1-.7.3c-.28 0-.52-.11-.7-.3zM8 7.99c-.02-.25-.11-.48-.31-.69-.2-.19-.42-.3-.69-.31H6c-.27.02-.48.13-.69.31-.2.2-.3.44-.31.69h1v3c.02.27.11.5.31.69.2.2.42.31.69.31h1c.27 0 .48-.11.69-.31.2-.19.3-.42.31-.69H8V7.98v.01zM7 2.3c-3.14 0-5.7 2.54-5.7 5.68 0 3.14 2.56 5.7 5.7 5.7s5.7-2.55 5.7-5.7c0-3.15-2.56-5.69-5.7-5.69v.01zM7 .98c3.86 0 7 3.14 7 7s-3.14 7-7 7-7-3.12-7-7 3.14-7 7-7z"></path></svg></span>note</div><div class="admonitionContent_CCSb"><p>These connections use HTTP and port 80.</p></div></div> <h4 class="anchor anchorWithStickyNavbar_Vexi" id="ngrok-agent-update-check">ngrok Agent Update Check<a href="#ngrok-agent-update-check" class="hash-link" aria-label="Direct link to ngrok Agent Update Check" title="Direct link to ngrok Agent Update Check"></a></h4> <p>The ngrok agent will automatically look for updates when it starts up. This check can be disabled by adding <code class="border-card rounded-md border bg-gray-500/5 px-1 py-0.5 font-mono text-[0.8em]">update_check: false</code> to your ngrok agent config.</p> <ul> <li><code class="border-card rounded-md border bg-gray-500/5 px-1 py-0.5 font-mono text-[0.8em]">https://update.equinox.io</code></li> </ul> <div class="theme-admonition theme-admonition-note admonition_Gu15 alert alert--secondary"><div class="admonitionHeading_teYo"><span class="admonitionIcon_dVWP"><svg viewBox="0 0 14 16"><path fill-rule="evenodd" d="M6.3 5.69a.942.942 0 0 1-.28-.7c0-.28.09-.52.28-.7.19-.18.42-.28.7-.28.28 0 .52.09.7.28.18.19.28.42.28.7 0 .28-.09.52-.28.7a1 1 0 0 1-.7.3c-.28 0-.52-.11-.7-.3zM8 7.99c-.02-.25-.11-.48-.31-.69-.2-.19-.42-.3-.69-.31H6c-.27.02-.48.13-.69.31-.2.2-.3.44-.31.69h1v3c.02.27.11.5.31.69.2.2.42.31.69.31h1c.27 0 .48-.11.69-.31.2-.19.3-.42.31-.69H8V7.98v.01zM7 2.3c-3.14 0-5.7 2.54-5.7 5.68 0 3.14 2.56 5.7 5.7 5.7s5.7-2.55 5.7-5.7c0-3.15-2.56-5.69-5.7-5.69v.01zM7 .98c3.86 0 7 3.14 7 7s-3.14 7-7 7-7-3.12-7-7 3.14-7 7-7z"></path></svg></span>note</div><div class="admonitionContent_CCSb"><p>Even though the Equinox service was <a href="https://equinox.io/blog/shutting-down" target="_blank" class="cursor-pointer rounded bg-transparent text-accent-600 hover:underline focus:outline-none focus-visible:ring focus-visible:ring-focus-accent">shut down in 2021</a>, it is wholely owned and operated by ngrok, and as such, continues to be used for building and distributing our binaries.</p></div></div> <h3 class="anchor anchorWithStickyNavbar_Vexi" id="dns-resolution">DNS Resolution<a href="#dns-resolution" class="hash-link" aria-label="Direct link to DNS Resolution" title="Direct link to DNS Resolution"></a></h3> <p>When the ngrok agent dials the ngrok service to establish its TLS connections, it resolves DNS for the <a class="cursor-pointer rounded bg-transparent text-accent-600 hover:underline focus:outline-none focus-visible:ring focus-visible:ring-focus-accent" href="/docs/agent/ingress/">connection address</a> which is defined by the <a class="cursor-pointer rounded bg-transparent text-accent-600 hover:underline focus:outline-none focus-visible:ring focus-visible:ring-focus-accent" href="/docs/agent/config/v3/#connect_url"><code class="border-card rounded-md border bg-gray-500/5 px-1 py-0.5 font-mono text-[0.8em]">connect_url</code></a> configuration property. ngrok attempts to resolve DNS using multiple mechanisms so that it can establish connectivity even in network environments where DNS service is failing. ngrok attempts to resolve the IPs of its service using the following mechanisms:</p> <ul> <li>Via the system's default DNS resolvers</li> <li>Via Google's DNS servers (<code class="border-card rounded-md border bg-gray-500/5 px-1 py-0.5 font-mono text-[0.8em]">8.8.8.8</code> and <code class="border-card rounded-md border bg-gray-500/5 px-1 py-0.5 font-mono text-[0.8em]">8.8.4.4</code>)</li> <li>Via Google's DNS-over-HTTPS service (<a href="https://developers.google.com/speed/public-dns/docs/doh" target="_blank" class="cursor-pointer rounded bg-transparent text-accent-600 hover:underline focus:outline-none focus-visible:ring focus-visible:ring-focus-accent">https://developers.google.com/speed/public-dns/docs/doh</a>)</li> <li>Via a <a href="https://s3.amazonaws.com/dns.ngrok.com/tunnel.json" target="_blank" class="cursor-pointer rounded bg-transparent text-accent-600 hover:underline focus:outline-none focus-visible:ring focus-visible:ring-focus-accent">file hosted on an ngrok-controlled S3 bucket</a></li> </ul> <p>Instead of using the system's default DNS resolvers, you can configure the DNS servers the ngrok agent uses for resolution with the <a class="cursor-pointer rounded bg-transparent text-accent-600 hover:underline focus:outline-none focus-visible:ring focus-visible:ring-focus-accent" href="/docs/agent/config/v3/#dns_resolver_ips"><code class="border-card rounded-md border bg-gray-500/5 px-1 py-0.5 font-mono text-[0.8em]">dns_resolver_ips</code></a> configuration option.</p> <h3 class="anchor anchorWithStickyNavbar_Vexi" id="tls-verification">TLS Verification<a href="#tls-verification" class="hash-link" aria-label="Direct link to TLS Verification" title="Direct link to TLS Verification"></a></h3> <p>The ngrok agent connects to the ngrok service over TLS connections. The agent verifies the TLS Certificate returned by the ngrok service. The certificates returned by the ngrok service are signed by ngrok's own root certificate authority. The ngrok agent verifies the returned certificate against certificate authorities bundled into the agent itself.</p> <p>Lastly, the ngrok agent makes a request to <code class="border-card rounded-md border bg-gray-500/5 px-1 py-0.5 font-mono text-[0.8em]">crl.ngrok-agent.com</code> to verify that the certificate returned by the ngrok service has not been revoked. It is possible to skip this step by setting <code class="border-card rounded-md border bg-gray-500/5 px-1 py-0.5 font-mono text-[0.8em]">crl_noverify: true</code> in your configuration file.</p> <h3 class="anchor anchorWithStickyNavbar_Vexi" id="heartbeats">Heartbeats<a href="#heartbeats" class="hash-link" aria-label="Direct link to Heartbeats" title="Direct link to Heartbeats"></a></h3> <p>Once the ngrok agent has established connectivity to the ngrok service, it periodically sends application-level heartbeat messages to validate the liveness of the connection. You may customize this behavior via the <a class="cursor-pointer rounded bg-transparent text-accent-600 hover:underline focus:outline-none focus-visible:ring focus-visible:ring-focus-accent" href="/docs/agent/config/v3/#heartbeat_interval"><code class="border-card rounded-md border bg-gray-500/5 px-1 py-0.5 font-mono text-[0.8em]">heartbeat_interval</code></a> and <a class="cursor-pointer rounded bg-transparent text-accent-600 hover:underline focus:outline-none focus-visible:ring focus-visible:ring-focus-accent" href="/docs/agent/config/v3/#heartbeat_tolerance"><code class="border-card rounded-md border bg-gray-500/5 px-1 py-0.5 font-mono text-[0.8em]">heartbeat_tolerance</code></a> configuration parameters.</p> <p>If the ngrok agent does not receive a response to its heartbeat within the tolerance window, it terminates the connection and begins reconnecting.</p> <p>ngrok's heartbeat mechanism allows it to recover from any type of network outage, even those caused by packet loss, dynamic IP changes, interface changes (e.g. WiFi to LTE) or complete network outages.</p> <p>The ngrok service also sends its own heartbeats to the agent which it uses to detect liveness and terminate dead connections.</p> <h3 class="anchor anchorWithStickyNavbar_Vexi" id="reconnection">Reconnection<a href="#reconnection" class="hash-link" aria-label="Direct link to Reconnection" title="Direct link to Reconnection"></a></h3> <p>If the ngrok agent is disconnected for any reason, it will automatically begin reconnecting. Reconnecting begins the entire connection process over again, beginning with DNS resolution. The ngrok agent attempts to recover quickly and slowly backs off its reconnection attempts but always attempts to re-establish connectivity unless the ngrok service explicitly instructs it to stop reconnecting.</p> <h3 class="anchor anchorWithStickyNavbar_Vexi" id="troubleshooting-connectivity">Troubleshooting<a href="#troubleshooting-connectivity" class="hash-link" aria-label="Direct link to Troubleshooting" title="Direct link to Troubleshooting"></a></h3> <p>If the ngrok agent can't connect to the ngrok service, it is often difficult to understand why.</p> <p>The ngrok agent includes the <code class="border-card rounded-md border bg-gray-500/5 px-1 py-0.5 font-mono text-[0.8em]">ngrok diagnose</code> command to help you troubleshoot connection failures. It runs a series of tests to diagnose potential issues when connecting to the ngrok service. Consult the <a class="cursor-pointer rounded bg-transparent text-accent-600 hover:underline focus:outline-none focus-visible:ring focus-visible:ring-focus-accent" href="/docs/agent/cli/#ngrok-diagnose"><code class="border-card rounded-md border bg-gray-500/5 px-1 py-0.5 font-mono text-[0.8em]">ngrok diagnose</code> documentation</a> or <a class="cursor-pointer rounded bg-transparent text-accent-600 hover:underline focus:outline-none focus-visible:ring focus-visible:ring-focus-accent" href="/docs/agent/diagnose/">Diagnose</a> page for additional details.</p> <h2 class="anchor anchorWithStickyNavbar_Vexi" id="system-requirements">System Requirements<a href="#system-requirements" class="hash-link" aria-label="Direct link to System Requirements" title="Direct link to System Requirements"></a></h2> <h4 class="anchor anchorWithStickyNavbar_Vexi" id="supported-platforms">Supported Platforms<a href="#supported-platforms" class="hash-link" aria-label="Direct link to Supported Platforms" title="Direct link to Supported Platforms"></a></h4> <p>The ngrok agent runs on all major platforms including Linux, MacOS, Windows and most CPU architectures. See the <a href="https://download.ngrok.com" target="_blank" class="cursor-pointer rounded bg-transparent text-accent-600 hover:underline focus:outline-none focus-visible:ring focus-visible:ring-focus-accent">ngrok agent download</a> page. It is also distributed as a Docker container.</p> <table><thead><tr><th>OS</th><th>Supported Architectures</th></tr></thead><tbody><tr><td>Windows</td><td>64-bit, 32-bit (<code class="border-card rounded-md border bg-gray-500/5 px-1 py-0.5 font-mono text-[0.8em]">x86-64</code>, <code class="border-card rounded-md border bg-gray-500/5 px-1 py-0.5 font-mono text-[0.8em]">x86</code>)</td></tr><tr><td>MacOS</td><td>Intel, Apple Silicon (<code class="border-card rounded-md border bg-gray-500/5 px-1 py-0.5 font-mono text-[0.8em]">x86-64</code>, <code class="border-card rounded-md border bg-gray-500/5 px-1 py-0.5 font-mono text-[0.8em]">arm64</code>)</td></tr><tr><td>Linux</td><td><code class="border-card rounded-md border bg-gray-500/5 px-1 py-0.5 font-mono text-[0.8em]">x86-64</code>, <code class="border-card rounded-md border bg-gray-500/5 px-1 py-0.5 font-mono text-[0.8em]">x86</code>, <code class="border-card rounded-md border bg-gray-500/5 px-1 py-0.5 font-mono text-[0.8em]">arm</code>, <code class="border-card rounded-md border bg-gray-500/5 px-1 py-0.5 font-mono text-[0.8em]">arm64</code>, <code class="border-card rounded-md border bg-gray-500/5 px-1 py-0.5 font-mono text-[0.8em]">mips</code>, <code class="border-card rounded-md border bg-gray-500/5 px-1 py-0.5 font-mono text-[0.8em]">mips64</code>, <code class="border-card rounded-md border bg-gray-500/5 px-1 py-0.5 font-mono text-[0.8em]">mips64le</code>, <code class="border-card rounded-md border bg-gray-500/5 px-1 py-0.5 font-mono text-[0.8em]">mipsle</code>, <code class="border-card rounded-md border bg-gray-500/5 px-1 py-0.5 font-mono text-[0.8em]">ppc64</code>, <code class="border-card rounded-md border bg-gray-500/5 px-1 py-0.5 font-mono text-[0.8em]">ppc64le</code>, <code class="border-card rounded-md border bg-gray-500/5 px-1 py-0.5 font-mono text-[0.8em]">s390x</code></td></tr><tr><td>FreeBSD</td><td><code class="border-card rounded-md border bg-gray-500/5 px-1 py-0.5 font-mono text-[0.8em]">x86-64</code>, <code class="border-card rounded-md border bg-gray-500/5 px-1 py-0.5 font-mono text-[0.8em]">x86</code>, <code class="border-card rounded-md border bg-gray-500/5 px-1 py-0.5 font-mono text-[0.8em]">arm</code>, <code class="border-card rounded-md border bg-gray-500/5 px-1 py-0.5 font-mono text-[0.8em]">arm64</code></td></tr></tbody></table> <p>If the agent does not run on your target platform, you can still use ngrok via the <a class="cursor-pointer rounded bg-transparent text-accent-600 hover:underline focus:outline-none focus-visible:ring focus-visible:ring-focus-accent" href="/docs/agent-sdks/">Agent SDKs</a> or the <a class="cursor-pointer rounded bg-transparent text-accent-600 hover:underline focus:outline-none focus-visible:ring focus-visible:ring-focus-accent" href="/docs/agent/ssh-reverse-tunnel-agent/">SSH Reverse Tunnel Agent</a>.</p> <h4 class="anchor anchorWithStickyNavbar_Vexi" id="resource-requirements">Resource Requirements<a href="#resource-requirements" class="hash-link" aria-label="Direct link to Resource Requirements" title="Direct link to Resource Requirements"></a></h4> <p>The ngrok agent is lightweight enough to run most everywhere, even on many embedded platforms. Keep in mind that the ngrok agent's resource usage depends on how much concurrent traffic you drive through it. If your resource requirements are more stringent, you can still use ngrok via the <a class="cursor-pointer rounded bg-transparent text-accent-600 hover:underline focus:outline-none focus-visible:ring focus-visible:ring-focus-accent" href="/docs/agent-sdks/">Agent SDKs</a> or the <a class="cursor-pointer rounded bg-transparent text-accent-600 hover:underline focus:outline-none focus-visible:ring focus-visible:ring-focus-accent" href="/docs/agent/ssh-reverse-tunnel-agent/">SSH Reverse Tunnel Agent</a>.</p> <table><thead><tr><th>Resource</th><th>Value</th></tr></thead><tbody><tr><td>Memory</td><td>64MB minimum, 128MB recommended</td></tr><tr><td>Disk</td><td>25MB</td></tr><tr><td>CPU</td><td>No requirement</td></tr></tbody></table> <div class="theme-admonition theme-admonition-tip admonition_Gu15 alert alert--success"><div class="admonitionHeading_teYo"><span class="admonitionIcon_dVWP"><svg viewBox="0 0 12 16"><path fill-rule="evenodd" d="M6.5 0C3.48 0 1 2.19 1 5c0 .92.55 2.25 1 3 1.34 2.25 1.78 2.78 2 4v1h5v-1c.22-1.22.66-1.75 2-4 .45-.75 1-2.08 1-3 0-2.81-2.48-5-5.5-5zm3.64 7.48c-.25.44-.47.8-.67 1.11-.86 1.41-1.25 2.06-1.45 3.23-.02.05-.02.11-.02.17H5c0-.06 0-.13-.02-.17-.2-1.17-.59-1.83-1.45-3.23-.2-.31-.42-.67-.67-1.11C2.44 6.78 2 5.65 2 5c0-2.2 2.02-4 4.5-4 1.22 0 2.36.42 3.22 1.19C10.55 2.94 11 3.94 11 5c0 .66-.44 1.78-.86 2.48zM4 14h5c-.23 1.14-1.3 2-2.5 2s-2.27-.86-2.5-2z"></path></svg></span>tip</div><div class="admonitionContent_CCSb"><p>You can reduce memory usage in the ngrok agent by disabling <a class="cursor-pointer rounded bg-transparent text-accent-600 hover:underline focus:outline-none focus-visible:ring focus-visible:ring-focus-accent" href="/docs/agent/config/v3/#inspect_db_size">inspection in the configuration file</a>.</p></div></div> <h2 class="anchor anchorWithStickyNavbar_Vexi" id="updates">Updates<a href="#updates" class="hash-link" aria-label="Direct link to Updates" title="Direct link to Updates"></a></h2> <p>The ngrok agent can update itself even if you didn't install it with a package manager. Update the ngrok agent with the <a class="cursor-pointer rounded bg-transparent text-accent-600 hover:underline focus:outline-none focus-visible:ring focus-visible:ring-focus-accent" href="/docs/agent/cli/#ngrok-update"><code class="border-card rounded-md border bg-gray-500/5 px-1 py-0.5 font-mono text-[0.8em]">ngrok update</code></a> command.</p> <div class="text-mono overflow-hidden rounded-md border border-gray-300 bg-gray-50 font-mono [&_svg]:shrink-0 mb-4"><pre class="min-h-[3.25rem] p-4 pr-[3.375rem] font-mono text-mono">Loading…</pre></div> <p>By default, the ngrok agent automatically checks for available updates when it runs. If an update is available, it will prompt you to update by pressing <code class="border-card rounded-md border bg-gray-500/5 px-1 py-0.5 font-mono text-[0.8em]">Ctrl+U</code>. You can configure whether the agent checks for updates via the <a class="cursor-pointer rounded bg-transparent text-accent-600 hover:underline focus:outline-none focus-visible:ring focus-visible:ring-focus-accent" href="/docs/agent/config/v3/#update_check"><code class="border-card rounded-md border bg-gray-500/5 px-1 py-0.5 font-mono text-[0.8em]">update_check</code> config parameter</a>.</p> <p>You can configure which release channel (e.g. <code class="border-card rounded-md border bg-gray-500/5 px-1 py-0.5 font-mono text-[0.8em]">stable</code>, <code class="border-card rounded-md border bg-gray-500/5 px-1 py-0.5 font-mono text-[0.8em]">beta</code>) the agent uses for updates via the <a class="cursor-pointer rounded bg-transparent text-accent-600 hover:underline focus:outline-none focus-visible:ring focus-visible:ring-focus-accent" href="/docs/agent/config/v3/#update_channel"><code class="border-card rounded-md border bg-gray-500/5 px-1 py-0.5 font-mono text-[0.8em]">update_channel</code> config parameter</a>.</p> <h2 class="anchor anchorWithStickyNavbar_Vexi" id="ip-restrictions">IP Restrictions<a href="#ip-restrictions" class="hash-link" aria-label="Direct link to IP Restrictions" title="Direct link to IP Restrictions"></a></h2> <p>All agents must use an authtoken to authenticate with ngrok, but you may also further restrict with IP Policies that specify which IPs and CIDRs agents may connect to your ngrok account from.</p> <ul> <li><a href="https://dashboard.ngrok.com/security/ip-restrictions" target="_blank" class="cursor-pointer rounded bg-transparent text-accent-600 hover:underline focus:outline-none focus-visible:ring focus-visible:ring-focus-accent">IP Restrictions on your ngrok dashboard</a></li> <li><a class="cursor-pointer rounded bg-transparent text-accent-600 hover:underline focus:outline-none focus-visible:ring focus-visible:ring-focus-accent" href="/docs/api/resources/ip-restrictions/">IP Restrictions API Resource</a></li> </ul> <h2 class="anchor anchorWithStickyNavbar_Vexi" id="api">API<a href="#api" class="hash-link" aria-label="Direct link to API" title="Direct link to API"></a></h2> <p>The ngrok agent has its own HTTP API that can be used to dynamically inspect, start and stop tunnels on the agent while it is running. Consult the <a class="cursor-pointer rounded bg-transparent text-accent-600 hover:underline focus:outline-none focus-visible:ring focus-visible:ring-focus-accent" href="/docs/agent/api/">ngrok agent API reference documentation</a> for more details.</p> <div class="theme-admonition theme-admonition-tip admonition_Gu15 alert alert--success"><div class="admonitionHeading_teYo"><span class="admonitionIcon_dVWP"><svg viewBox="0 0 12 16"><path fill-rule="evenodd" d="M6.5 0C3.48 0 1 2.19 1 5c0 .92.55 2.25 1 3 1.34 2.25 1.78 2.78 2 4v1h5v-1c.22-1.22.66-1.75 2-4 .45-.75 1-2.08 1-3 0-2.81-2.48-5-5.5-5zm3.64 7.48c-.25.44-.47.8-.67 1.11-.86 1.41-1.25 2.06-1.45 3.23-.02.05-.02.11-.02.17H5c0-.06 0-.13-.02-.17-.2-1.17-.59-1.83-1.45-3.23-.2-.31-.42-.67-.67-1.11C2.44 6.78 2 5.65 2 5c0-2.2 2.02-4 4.5-4 1.22 0 2.36.42 3.22 1.19C10.55 2.94 11 3.94 11 5c0 .66-.44 1.78-.86 2.48zM4 14h5c-.23 1.14-1.3 2-2.5 2s-2.27-.86-2.5-2z"></path></svg></span>tip</div><div class="admonitionContent_CCSb"><p>If you want to programmatically control the ngrok agent, the <a class="cursor-pointer rounded bg-transparent text-accent-600 hover:underline focus:outline-none focus-visible:ring focus-visible:ring-focus-accent" href="/docs/agent-sdks/">Agent SDKs</a> are usually a more flexible and powerful choice.</p></div></div> <h2 class="anchor anchorWithStickyNavbar_Vexi" id="using-ngrok-without-the-agent">Using ngrok without the agent<a href="#using-ngrok-without-the-agent" class="hash-link" aria-label="Direct link to Using ngrok without the agent" title="Direct link to Using ngrok without the agent"></a></h2> <p>There are three ways to use ngrok without the agent:</p> <ul> <li><a class="cursor-pointer rounded bg-transparent text-accent-600 hover:underline focus:outline-none focus-visible:ring focus-visible:ring-focus-accent" href="/docs/agent-sdks/">Agent SDKs</a></li> <li><a class="cursor-pointer rounded bg-transparent text-accent-600 hover:underline focus:outline-none focus-visible:ring focus-visible:ring-focus-accent" href="/docs/k8s/">Kubernetes Operator</a></li> <li><a class="cursor-pointer rounded bg-transparent text-accent-600 hover:underline focus:outline-none focus-visible:ring focus-visible:ring-focus-accent" href="/docs/agent/ssh-reverse-tunnel-agent/">SSH Reverse Tunnel</a></li> </ul> <p>You may want to use ngrok with one of the alternatives above if:</p> <ul> <li>You don't want to manage the lifetime of a separate agent process</li> <li>You don't want to bundle and distribute the ngrok agent</li> <li>The ngrok agent doesn't run on your target platform</li> <li>The ngrok agent's resource requirements are too high for your target platform</li> <li>You want fine-grained programmatic control over the agent's functionality</li> </ul> <h2 class="anchor anchorWithStickyNavbar_Vexi" id="changelog">Changelog<a href="#changelog" class="hash-link" aria-label="Direct link to Changelog" title="Direct link to Changelog"></a></h2> <p>We publish the <a class="cursor-pointer rounded bg-transparent text-accent-600 hover:underline focus:outline-none focus-visible:ring focus-visible:ring-focus-accent" href="/docs/agent/changelog/">ngrok agent changelog</a> with details on each release of the ngrok agent.</p> <h2 class="anchor anchorWithStickyNavbar_Vexi" id="pricing">Pricing<a href="#pricing" class="hash-link" aria-label="Direct link to Pricing" title="Direct link to Pricing"></a></h2> <p>The ngrok agent is available to all ngrok users at no additional charge. You only incur costs if the resources provisioned by the agent incur a cost. For more information, see the <a href="https://ngrok.com/pricing" target="_blank" class="cursor-pointer rounded bg-transparent text-accent-600 hover:underline focus:outline-none focus-visible:ring focus-visible:ring-focus-accent">ngrok Pricing page</a>.</p></div><footer class="theme-doc-footer docusaurus-mt-lg"><div class="row margin-top--sm theme-doc-footer-edit-meta-row"><div class="col"><a href="https://github.com/ngrok/ngrok-docs/edit/main/docs/agent/index.mdx" target="_blank" rel="noopener noreferrer" class="theme-edit-this-page"><svg fill="currentColor" height="20" width="20" viewBox="0 0 40 40" class="iconEdit_Q4Po" aria-hidden="true"><g><path d="m34.5 11.7l-3 3.1-6.3-6.3 3.1-3q0.5-0.5 1.2-0.5t1.1 0.5l3.9 3.9q0.5 0.4 0.5 1.1t-0.5 1.2z m-29.5 17.1l18.4-18.5 6.3 6.3-18.4 18.4h-6.3v-6.2z"></path></g></svg>Edit this page</a></div><div class="col lastUpdated_f29A"><span class="theme-last-updated">Last updated<!-- --> on <b><time datetime="2025-04-08T16:47:48.000Z" itemprop="dateModified">Apr 8, 2025</time></b> by <b>Allison</b></span></div></div></footer></article><nav class="pagination-nav docusaurus-mt-lg" aria-label="Docs pages"><a class="pagination-nav__link pagination-nav__link--prev" href="/docs/obs/events/reference/"><div class="pagination-nav__sublabel">Previous</div><div class="pagination-nav__label">Event Source Reference</div></a><a class="pagination-nav__link pagination-nav__link--next" href="/docs/agent/web-inspection-interface/"><div class="pagination-nav__sublabel">Next</div><div class="pagination-nav__label">Web Inspection Interface</div></a></nav></div></div><div class="col col--3"><div class="tableOfContents_oQPh thin-scrollbar theme-doc-toc-desktop"><ul class="table-of-contents table-of-contents__left-border"><li><a href="#overview" class="table-of-contents__link toc-highlight">Overview</a></li><li><a href="#install" class="table-of-contents__link toc-highlight">Install</a></li><li><a href="#example-usage" class="table-of-contents__link toc-highlight">Example Usage</a><ul><li><a href="#http-endpoint" class="table-of-contents__link toc-highlight">HTTP Endpoint</a></li><li><a href="#static-domain" class="table-of-contents__link toc-highlight">Static Domain</a></li><li><a href="#basic-auth" class="table-of-contents__link toc-highlight">Basic Auth</a></li><li><a href="#forward-to-non-local" class="table-of-contents__link toc-highlight">Forward to non-local</a></li><li><a href="#local-https-server" class="table-of-contents__link toc-highlight">Local HTTPS Server</a></li><li><a href="#forwarding-to-ipv6-address" class="table-of-contents__link toc-highlight">Forwarding to IPv6 Address</a></li><li><a href="#tcp-endpoint" class="table-of-contents__link toc-highlight">TCP Endpoint</a></li><li><a href="#tls-endpoint" class="table-of-contents__link toc-highlight">TLS Endpoint</a></li><li><a href="#multiple-endpoints" class="table-of-contents__link toc-highlight">Multiple Endpoints</a></li></ul></li><li><a href="#tab-completion" class="table-of-contents__link toc-highlight">Tab Completion</a></li><li><a href="#authtokens" class="table-of-contents__link toc-highlight">Authtokens</a></li><li><a href="#authtoken-acls" class="table-of-contents__link toc-highlight">Authtoken ACLs</a></li><li><a href="#api-keys" class="table-of-contents__link toc-highlight">API Keys</a></li><li><a href="#configuration-file" class="table-of-contents__link toc-highlight">Configuration File</a></li><li><a href="#environment-variables" class="table-of-contents__link toc-highlight">Environment Variables</a></li><li><a href="#background-service" class="table-of-contents__link toc-highlight">Running ngrok in the background</a></li><li><a href="#remote-management" class="table-of-contents__link toc-highlight">Remote Management</a></li><li><a href="#connectivity" class="table-of-contents__link toc-highlight">Connectivity</a><ul><li><a href="#connectivity-address" class="table-of-contents__link toc-highlight">Address</a></li><li><a href="#additional-urls" class="table-of-contents__link toc-highlight">Additional URLs</a></li><li><a href="#dns-resolution" class="table-of-contents__link toc-highlight">DNS Resolution</a></li><li><a href="#tls-verification" class="table-of-contents__link toc-highlight">TLS Verification</a></li><li><a href="#heartbeats" class="table-of-contents__link toc-highlight">Heartbeats</a></li><li><a href="#reconnection" class="table-of-contents__link toc-highlight">Reconnection</a></li><li><a href="#troubleshooting-connectivity" class="table-of-contents__link toc-highlight">Troubleshooting</a></li></ul></li><li><a href="#system-requirements" class="table-of-contents__link toc-highlight">System Requirements</a></li><li><a href="#updates" class="table-of-contents__link toc-highlight">Updates</a></li><li><a href="#ip-restrictions" class="table-of-contents__link toc-highlight">IP Restrictions</a></li><li><a href="#api" class="table-of-contents__link toc-highlight">API</a></li><li><a href="#using-ngrok-without-the-agent" class="table-of-contents__link toc-highlight">Using ngrok without the agent</a></li><li><a href="#changelog" class="table-of-contents__link toc-highlight">Changelog</a></li><li><a href="#pricing" class="table-of-contents__link toc-highlight">Pricing</a></li></ul></div></div></div></div></main></div></div></div><footer class="footer"><div class="container container-fluid"><div class="row footer__links"><div class="col footer__col"><div class="footer__title">ngrok Service</div><ul class="footer__items clean-list"><li class="footer__item"><a class="footer__link-item" href="/docs/getting-started/">Get Started</a></li><li class="footer__item"><a href="https://dashboard.ngrok.com/signup" target="_blank" rel="noopener noreferrer" class="footer__link-item">Sign up</a></li><li class="footer__item"><a href="https://dashboard.ngrok.com/login" target="_blank" rel="noopener noreferrer" class="footer__link-item">Log in</a></li><li class="footer__item"><a href="https://download.ngrok.com" target="_blank" rel="noopener noreferrer" class="footer__link-item">Download</a></li><li class="footer__item"><a href="https://ngrok.com/docs" target="_blank" rel="noopener noreferrer" class="footer__link-item">Docs</a></li><li class="footer__item"><a href="https://status.ngrok.com" target="_blank" rel="noopener noreferrer" class="footer__link-item">Status</a></li></ul></div><div class="col footer__col"><div class="footer__title">ngrok.com</div><ul class="footer__items clean-list"><li class="footer__item"><a href="https://ngrok.com/product" target="_blank" rel="noopener noreferrer" class="footer__link-item">Product</a></li><li class="footer__item"><a href="https://ngrok.com/pricing" target="_blank" rel="noopener noreferrer" class="footer__link-item">Pricing</a></li><li class="footer__item"><a href="https://ngrok.com/customers" target="_blank" rel="noopener noreferrer" class="footer__link-item">Customers</a></li><li class="footer__item"><a href="https://ngrok.com/solutions" target="_blank" rel="noopener noreferrer" class="footer__link-item">Solutions</a></li><li class="footer__item"><a href="https://ngrok.com/partners" target="_blank" rel="noopener noreferrer" class="footer__link-item">Partners</a></li><li class="footer__item"><a href="https://trust.ngrok.com" target="_blank" rel="noopener noreferrer" class="footer__link-item">Trust Portal</a></li></ul></div><div class="col footer__col"><div class="footer__title">Legal</div><ul class="footer__items clean-list"><li class="footer__item"><a href="https://ngrok.com/abuse" target="_blank" rel="noopener noreferrer" class="footer__link-item">Abuse</a></li><li class="footer__item"><a href="https://ngrok.com/dpa" target="_blank" rel="noopener noreferrer" class="footer__link-item">DPA</a></li><li class="footer__item"><a href="https://ngrok.com/privacy" target="_blank" rel="noopener noreferrer" class="footer__link-item">Privacy</a></li><li class="footer__item"><a href="https://ngrok.com/security" target="_blank" rel="noopener noreferrer" class="footer__link-item">Security</a></li><li class="footer__item"><a href="https://ngrok.com/tos" target="_blank" rel="noopener noreferrer" class="footer__link-item">Terms of service</a></li><li class="footer__item"><a href="https://ngrok.com/privacy-preferences" target="_blank" rel="noopener noreferrer" class="footer__link-item">Privacy Preferences</a></li></ul></div><div class="col footer__col"><div class="footer__title">More</div><ul class="footer__items clean-list"><li class="footer__item"><a href="https://ngrok.com/careers" target="_blank" rel="noopener noreferrer" class="footer__link-item">Careers</a></li><li class="footer__item"><a href="https://blog.ngrok.com" target="_blank" rel="noopener noreferrer" class="footer__link-item">Blog</a></li><li class="footer__item"><a href="https://ngrok.com/slack" target="_blank" rel="noopener noreferrer" class="footer__link-item">Community</a></li><li class="footer__item"><a href="https://twitter.com/ngrokHQ" target="_blank" rel="noopener noreferrer" class="footer__link-item">Twitter</a></li><li class="footer__item"><a href="https://www.linkedin.com/company/ngrok" target="_blank" rel="noopener noreferrer" class="footer__link-item">LinkedIn</a></li><li class="footer__item"><a href="https://github.com/ngrok" target="_blank" rel="noopener noreferrer" class="footer__link-item">GitHub</a></li></ul></div></div><div class="footer__bottom text--center"><div class="footer__copyright">© ngrok 2025</div></div></div></footer></div> </body> </html>