<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom" xmlns:dc="http://purl.org/dc/elements/1.1/">
  <channel>
    <title>DEV Community: Aaishika S Bhattacharya</title>
    <description>The latest articles on DEV Community by Aaishika S Bhattacharya (@aaishika).</description>
    <link>https://dev.to/aaishika</link>
    <image>
      <url>https://media2.dev.to/dynamic/image/width=90,height=90,fit=cover,gravity=auto,format=auto/https:%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Fuser%2Fprofile_image%2F478565%2F35968db4-9036-4f07-9fa9-b08246e27f4c.png</url>
      <title>DEV Community: Aaishika S Bhattacharya</title>
      <link>https://dev.to/aaishika</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/aaishika"/>
    <language>en</language>
    <item>
      <title>What are AI gateways, and do you even need them?</title>
      <dc:creator>Aaishika S Bhattacharya</dc:creator>
      <pubDate>Fri, 31 Oct 2025 17:37:29 +0000</pubDate>
      <link>https://dev.to/ngrok/what-are-ai-gateways-and-do-you-even-need-them-5d4c</link>
      <guid>https://dev.to/ngrok/what-are-ai-gateways-and-do-you-even-need-them-5d4c</guid>
      <description>&lt;p&gt;The AI ecosystem is evolving so quickly that even those of us building in it are still figuring out where we fit. Between the scramble to deploy ✨something AI✨ and the chaos of managing multiple model APIs and keys, a new player called "AI gateway" has entered the chat.&lt;/p&gt;

&lt;p&gt;If the term makes you think of &lt;a href="https://ngrok.com/blog-post/api-gateway-shapes-patterns-2025" rel="noopener noreferrer"&gt;API gateways&lt;/a&gt;, you're not wrong, except this one comes with brains and boundaries. It doesn't just route traffic; it watches what goes in, what comes out, and keeps it all in check. Let's take a deeper look.&lt;/p&gt;

&lt;h2&gt;
  
  
  What is an AI gateway?
&lt;/h2&gt;

&lt;p&gt;An AI gateway is essentially a control tower for your AI models, a middleware layer that sits between your applications and the AI services they rely on. Every prompt you send and every model you use, from OpenAI to Anthropic to your in-house Ollama setup, must pass by this control tower.&lt;/p&gt;

&lt;p&gt;In many ways, AI gateways play a role similar to what ngrok does for production API workloads. ngrok creates a secure tunnel between your upstream services and the public internet, giving you a controlled and observable interface between any environment and the public internet.&lt;/p&gt;

&lt;p&gt;AI gateways do the same, but for model interactions. They act as the secure bridge between your internal systems and the unpredictable and probabilistic landscape of external AI APIs, enforcing governance, logging, and routing rules every step of the way.&lt;/p&gt;

&lt;p&gt;AI gateways secure and manage all AI interactions under one roof so your engineers aren't busy juggling or rotating a dozen API keys, your legal team isn't scratching their heads about PII leaks, and you can rest assured that the CTO wouldn't come knocking, enquiring about the extra $$ that showed up on the bill.&lt;/p&gt;

&lt;p&gt;In a nutshell, if &lt;strong&gt;ngrok&lt;/strong&gt; is the gateway to your web traffic, an &lt;strong&gt;AI gateway&lt;/strong&gt; is the gateway to your LLM traffic.&lt;/p&gt;

&lt;h2&gt;
  
  
  But why are AI gateways suddenly everywhere?
&lt;/h2&gt;

&lt;p&gt;The AI gold rush has led to a very modern problem: too many shovels (models), too little gold (control).&lt;/p&gt;

&lt;p&gt;Organizations, no matter their scale, are juggling OpenAI, Anthropic, and open-source models at once, each with its own rate limits, authentication quirks, and billing nightmares. API keys expire, get revoked, or worse—&lt;em&gt;leaked&lt;/em&gt;. Rate limits spike without warning, and failovers become a weekend project no one signed up for. Suddenly, what started as a simple prototype now requires a mini-orchestra of secrets management, retry logic, and routing scripts just to keep the lights on.&lt;/p&gt;

&lt;p&gt;This is where AI gateways quietly slipped in, promising reliability, observability, and most importantly, &lt;em&gt;sanity&lt;/em&gt;. They automate the thankless parts of scaling AI: rotating keys before they break production, failing over to a backup model when one provider struggles, and even dynamically switching models based on latency, cost, or accuracy.&lt;/p&gt;

&lt;p&gt;If you've ever used ngrok's &lt;a href="http://ngrok.com/blog-post/endpoint-pools-load-balance-anything" rel="noopener noreferrer"&gt;Endpoint Pools&lt;/a&gt;, the idea will feel familiar. A pool of secure, intelligent endpoints sitting behind a single entry point, distributing requests for reliability and performance. The only difference is that in this world, the "endpoints" aren't origin servers and upstream services, but LLMs.&lt;/p&gt;

&lt;h2&gt;
  
  
  How do they actually work?
&lt;/h2&gt;

&lt;p&gt;At a high level, an AI gateway sits right between your app and the AI models you call. Every request passes through this layer before reaching the model. The gateway then handles tasks like deciding which model to send it to, checking for security leaks and discrepancies, logging requests and responses, among others, depending on the architecture of your app.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;For example, here's your app without a gateway:&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Frt3na4revwpq26wi1zes.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Frt3na4revwpq26wi1zes.png" alt="Your app without an AI gateway" width="800" height="300"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;And, here’s your app with one:&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fzuvqh6wiu64gmtkft00u.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fzuvqh6wiu64gmtkft00u.png" alt="Your app with an AI gateway" width="800" height="300"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;If you are not inclined to subscribe to multiple third-party services or build complex features, like every 10x engineer, you too would prefer an AI gateway—Simply because it’s actually more cost- and resource-effective to buy than build all the features above.&lt;/p&gt;

&lt;h2&gt;
  
  
  Do you, a developer, actually need an AI gateway?
&lt;/h2&gt;

&lt;p&gt;If you're an enterprise running dozens of AI workloads across teams and vendors; &lt;em&gt;yes, you need an AI gateway yesterday&lt;/em&gt;.&lt;/p&gt;

&lt;p&gt;If you're a startup running a few calls to GPT-5 for your chatbot: &lt;em&gt;nope&lt;/em&gt;.&lt;/p&gt;

&lt;p&gt;So the question actually isn't whether an AI gateway is good, but whether your complexity warrants it. Think of it like Kubernetes---absolutely fantastic for orchestration, but overkill for a personal blog.&lt;/p&gt;

&lt;p&gt;To be very honest, for many developers, the gateway is another layer that needs to be set up. If your app talks to a single model and doesn't need elaborate governance or cost-tracking, your SDK already has you covered. But if your use case involves:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Switching between providers dynamically and gracefully&lt;/li&gt;
&lt;li&gt;Auditing, anonymizing or filtering user prompts&lt;/li&gt;
&lt;li&gt;Controlling cost and usage automatically&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Then an AI gateway can be a lifesaver and not a luxury. Back to the previous section: If you're dealing with multiples of LLMs and/or keys, you probably would benefit from AI gateways.&lt;/p&gt;

&lt;h2&gt;
  
  
  The future of AI gateways
&lt;/h2&gt;

&lt;p&gt;AI gateways are the foundation of AI infrastructure maturity. In a few years, they might evolve into AI mesh networks, balancing workloads between providers the way CDNs do for content today or how ESP8266-based devices communicate amongst themselves (makes my inner IoT enthusiast happy).&lt;/p&gt;

&lt;p&gt;My take on the current AI Landscape, based on the modern AI infrastructure layers, is divided into four distinct layers, and here’s where some of my favorite AI tools fit:&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F42gezxokwalxztsy5bfk.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F42gezxokwalxztsy5bfk.png" alt="AI infrastructure layers" width="800" height="438"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Be on the lookout for our involvement with them &lt;em&gt;wink wink&lt;/em&gt;.&lt;/p&gt;

&lt;h2&gt;
  
  
  Be part of what's next
&lt;/h2&gt;

&lt;p&gt;Speaking of the future: &lt;a href="http://ngrok.ai/" rel="noopener noreferrer"&gt;ngrok.ai&lt;/a&gt; is here and you can sign up and request early access &lt;strong&gt;right now&lt;/strong&gt;. We are building the next generation of networking infrastructure rather fast, so watch this place and our social spaces [&lt;a href="https://x.com/ngrokHQ" rel="noopener noreferrer"&gt;X (formerly Twitter)&lt;/a&gt;, &lt;a href="http://linkedin.com/company/ngrok/" rel="noopener noreferrer"&gt;LinkedIn&lt;/a&gt;, &lt;a href="https://bsky.app/profile/ngrok.com" rel="noopener noreferrer"&gt;Bluesky&lt;/a&gt;, &lt;a href="https://www.youtube.com/@ngrokHQ" rel="noopener noreferrer"&gt;YouTube&lt;/a&gt;] for more AI-centric announcements from your favorite networking platform!&lt;/p&gt;

</description>
      <category>ai</category>
      <category>api</category>
      <category>architecture</category>
    </item>
    <item>
      <title>The Ultimate Guide to ngrok</title>
      <dc:creator>Aaishika S Bhattacharya</dc:creator>
      <pubDate>Wed, 22 Oct 2025 00:00:00 +0000</pubDate>
      <link>https://dev.to/ngrok/the-ultimate-guide-to-ngrok-3khf</link>
      <guid>https://dev.to/ngrok/the-ultimate-guide-to-ngrok-3khf</guid>
      <description>&lt;p&gt;Getting started with ngrok is almost suspiciously easy. Which is why the question we hear most often isn’t "&lt;em&gt;where do I start?&lt;/em&gt;" but rather “&lt;em&gt;what else can I do with ngrok?&lt;/em&gt;” For over a decade, we’ve been serving millions of developers and, through them, millions of users.&lt;/p&gt;

&lt;p&gt;Sure, our &lt;a href="https://ngrok.com/docs/" rel="noopener noreferrer"&gt;documentation&lt;/a&gt; has all the answers, every CLI flag, every Traffic Policy configuration neatly laid out, but what about the developers who are always on the lookout for a &lt;strong&gt;TL;DR&lt;/strong&gt;? What if you too are not looking for a full solution or a specific use case for your next project, but just want to know… what else &lt;em&gt;you&lt;/em&gt; can do with ngrok?&lt;/p&gt;

&lt;p&gt;Presenting ngrok's new cheatsheet that walks you through some of our most interesting offerings, designed to scratch that itch of not just serving, but also securing endpoints in as little as two steps. Read on, or download the &lt;a href="https://ngrok.com/docs/other/ngrok_cheatbook.pdf" rel="noopener noreferrer"&gt;PDF format&lt;/a&gt;, or a crisp &lt;a href="https://ngrok.com/docs/other/ngrok_cheatsheet.pdf" rel="noopener noreferrer"&gt;two-pager printable&lt;/a&gt;.&lt;/p&gt;

&lt;h1&gt;
  
  
  &lt;a href="https://ngrok.com/downloads/" rel="noopener noreferrer"&gt;Installation&lt;/a&gt;
&lt;/h1&gt;

&lt;ul&gt;
&lt;li&gt;&lt;p&gt;Sign up for a free account: &lt;a href="https://ngrok.com/signup" rel="noopener noreferrer"&gt;https://ngrok.com/signup&lt;/a&gt;&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Keep your authtoken handy: &lt;a href="https://dashboard.ngrok.com/get-started/your-authtoken" rel="noopener noreferrer"&gt;https://dashboard.ngrok.com/get-started/your-authtoken&lt;/a&gt;&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  &lt;a href="https://ngrok.com/downloads/mac-os" rel="noopener noreferrer"&gt;macOS&lt;/a&gt;
&lt;/h2&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="c"&gt;# Install via Homebrew&lt;/span&gt;
brew &lt;span class="nb"&gt;install &lt;/span&gt;ngrok

&lt;span class="c"&gt;# Add your authtoken&lt;/span&gt;
ngrok config add-authtoken &amp;lt;token&amp;gt;

&lt;span class="c"&gt;# Start an endpoint&lt;/span&gt;
ngrok http 80
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  &lt;a href="https://ngrok.com/downloads/linux" rel="noopener noreferrer"&gt;Linux&lt;/a&gt;
&lt;/h2&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="c"&gt;# Install via Apt&lt;/span&gt;
curl &lt;span class="nt"&gt;-sSL&lt;/span&gt; https://ngrok-agent.s3.amazonaws.com/ngrok.asc &lt;span class="se"&gt;\&lt;/span&gt;
  | &lt;span class="nb"&gt;sudo tee&lt;/span&gt; /etc/apt/trusted.gpg.d/ngrok.asc &lt;span class="o"&gt;&amp;gt;&lt;/span&gt;/dev/null &lt;span class="se"&gt;\&lt;/span&gt;
  &lt;span class="o"&gt;&amp;amp;&amp;amp;&lt;/span&gt; &lt;span class="nb"&gt;echo&lt;/span&gt; &lt;span class="s2"&gt;"deb https://ngrok-agent.s3.amazonaws.com bookworm main"&lt;/span&gt; &lt;span class="se"&gt;\&lt;/span&gt;
  | &lt;span class="nb"&gt;sudo tee&lt;/span&gt; /etc/apt/sources.list.d/ngrok.list &lt;span class="se"&gt;\&lt;/span&gt;
  &lt;span class="o"&gt;&amp;amp;&amp;amp;&lt;/span&gt; &lt;span class="nb"&gt;sudo &lt;/span&gt;apt update &lt;span class="se"&gt;\&lt;/span&gt;
  &lt;span class="o"&gt;&amp;amp;&amp;amp;&lt;/span&gt; &lt;span class="nb"&gt;sudo &lt;/span&gt;apt &lt;span class="nb"&gt;install &lt;/span&gt;ngrok
&lt;span class="c"&gt;# OR&lt;/span&gt;
&lt;span class="c"&gt;# Install via Snap&lt;/span&gt;
snap &lt;span class="nb"&gt;install &lt;/span&gt;ngrok

&lt;span class="c"&gt;# Add your authtoken&lt;/span&gt;
ngrok config add-authtoken &amp;lt;token&amp;gt;

&lt;span class="c"&gt;# Start an endpoint&lt;/span&gt;
ngrok http 80
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  &lt;a href="https://ngrok.com/downloads/windows" rel="noopener noreferrer"&gt;Windows&lt;/a&gt;
&lt;/h2&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="c"&gt;# Install via WinGet&lt;/span&gt;
winget &lt;span class="nb"&gt;install &lt;/span&gt;ngrok &lt;span class="nt"&gt;-s&lt;/span&gt; msstore
&lt;span class="c"&gt;# OR&lt;/span&gt;
&lt;span class="c"&gt;# Install via Scoop&lt;/span&gt;
scoop &lt;span class="nb"&gt;install &lt;/span&gt;ngrok

&lt;span class="c"&gt;# Add your authtoken&lt;/span&gt;
ngrok config add-authtoken &amp;lt;token&amp;gt;

&lt;span class="c"&gt;# Start an endpoint&lt;/span&gt;
ngrok http 80
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  &lt;a href="https://ngrok.com/downloads/kubernetes" rel="noopener noreferrer"&gt;Kubernetes&lt;/a&gt;
&lt;/h2&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="c"&gt;# Add ngrok Kubernetes Operator to Helm&lt;/span&gt;
helm repo add ngrok https://charts.ngrok.com

&lt;span class="c"&gt;# Add ngrok API key and authtoken&lt;/span&gt;
&lt;span class="nb"&gt;export &lt;/span&gt;&lt;span class="nv"&gt;NGROK_AUTHTOKEN&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;YOUR_NGROK_AUTHTOKEN
&lt;span class="nb"&gt;export &lt;/span&gt;&lt;span class="nv"&gt;NGROK_API_KEY&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;YOUR_NGROK_API_KEY

helm &lt;span class="nb"&gt;install &lt;/span&gt;ngrok-operator ngrok/ngrok-operator &lt;span class="se"&gt;\&lt;/span&gt;
  &lt;span class="nt"&gt;--namespace&lt;/span&gt; ngrok-operator &lt;span class="se"&gt;\&lt;/span&gt;
  &lt;span class="nt"&gt;--create-namespace&lt;/span&gt; &lt;span class="se"&gt;\&lt;/span&gt;
  &lt;span class="nt"&gt;--set&lt;/span&gt; credentials.apiKey&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="nv"&gt;$NGROK_API_KEY&lt;/span&gt; &lt;span class="se"&gt;\&lt;/span&gt;
  &lt;span class="nt"&gt;--set&lt;/span&gt; credentials.authtoken&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="nv"&gt;$NGROK_AUTHTOKEN&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  &lt;a href="https://ngrok.com/downloads/docker" rel="noopener noreferrer"&gt;Docker&lt;/a&gt;
&lt;/h2&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="c"&gt;# Install via Docker&lt;/span&gt;
docker pull ngrok/ngrok

&lt;span class="c"&gt;# Run ngrok via Docker&lt;/span&gt;
docker run &lt;span class="nt"&gt;--net&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;host &lt;span class="nt"&gt;-it&lt;/span&gt; &lt;span class="nt"&gt;-e&lt;/span&gt; &lt;span class="nv"&gt;NGROK_AUTHTOKEN&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;xyz ngrok/ngrok:latest http 80
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  &lt;a href="https://ngrok.com/downloads/" rel="noopener noreferrer"&gt;SDKs&lt;/a&gt;
&lt;/h2&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="c"&gt;# Node.js: https://ngrok.com/downloads/node-js&lt;/span&gt;
npm &lt;span class="nb"&gt;install&lt;/span&gt; @ngrok/ngrok

&lt;span class="c"&gt;# Go: https://ngrok.com/downloads/go&lt;/span&gt;
go get golang.ngrok.com/ngrok/v2

&lt;span class="c"&gt;# Python: https://ngrok.com/downloads/python&lt;/span&gt;
python3 &lt;span class="nt"&gt;-m&lt;/span&gt; pip &lt;span class="nb"&gt;install &lt;/span&gt;ngrok

&lt;span class="c"&gt;# Rust: https://ngrok.com/downloads/rust&lt;/span&gt;
&lt;span class="c"&gt;# Install ngrok-rust package and the required dependencies&lt;/span&gt;
cargo add ngrok &lt;span class="nt"&gt;-F&lt;/span&gt; axum &lt;span class="o"&gt;&amp;amp;&amp;amp;&lt;/span&gt; cargo add axum &lt;span class="o"&gt;&amp;amp;&amp;amp;&lt;/span&gt; cargo add tokio &lt;span class="nt"&gt;-F&lt;/span&gt; rt-multi-thread &lt;span class="nt"&gt;-F&lt;/span&gt; macros
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h1&gt;
  
  
  &lt;a href="https://ngrok.com/docs/agent/#example-usage" rel="noopener noreferrer"&gt;Expose different kinds of servers&lt;/a&gt;
&lt;/h1&gt;

&lt;h2&gt;
  
  
  API service
&lt;/h2&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="c"&gt;# Example: API service on localhost:8080&lt;/span&gt;
ngrok http 8080
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  Web app
&lt;/h2&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="c"&gt;# Example: On localhost:3000&lt;/span&gt;
ngrok http 3000
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  SSH server
&lt;/h2&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="c"&gt;# Example: On Port 22&lt;/span&gt;
ngrok tcp 22
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  Postgres server
&lt;/h2&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;ngrok tcp 5432
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  Any service or server on a different machine
&lt;/h2&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;ngrok http http://192.168.1.50:8080
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h1&gt;
  
  
  &lt;a href="https://ngrok.com/docs/agent/#troubleshooting-connectivity" rel="noopener noreferrer"&gt;Troubleshoot&lt;/a&gt;
&lt;/h1&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;ngrok diagnose

&lt;span class="c"&gt;# To test IPv6 connectivity&lt;/span&gt;
ngrok diagnose &lt;span class="nt"&gt;--ipv6&lt;/span&gt; &lt;span class="nb"&gt;true&lt;/span&gt;

&lt;span class="c"&gt;# To test connectivity between the ngrok agent and all ngrok points of presence&lt;/span&gt;
ngrok diagnose &lt;span class="nt"&gt;--region&lt;/span&gt; all

&lt;span class="c"&gt;# For a verbose report&lt;/span&gt;
ngrok diagnose &lt;span class="nt"&gt;-w&lt;/span&gt; out.txt &lt;span class="c"&gt;#OR&lt;/span&gt;
ngrok diagnose &lt;span class="nt"&gt;--write-report&lt;/span&gt; out.txt
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h1&gt;
  
  
  &lt;a href="https://ngrok.com/docs/traffic-policy/actions/oauth/" rel="noopener noreferrer"&gt;Add Authentication with Traffic Policy&lt;/a&gt;
&lt;/h1&gt;

&lt;h2&gt;
  
  
  &lt;a href="https://ngrok.com/docs/traffic-policy/getting-started/agent-endpoints/cli/" rel="noopener noreferrer"&gt;Create a Traffic Policy file &lt;code&gt;policy.yaml&lt;/code&gt;&lt;/a&gt;
&lt;/h2&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;nano policy.yaml
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  &lt;a href="https://ngrok.com/docs/integrations/google/oauth/" rel="noopener noreferrer"&gt;Add the OAuth Action with Google&lt;/a&gt;
&lt;/h2&gt;

&lt;p&gt;List of Providers: &lt;a href="https://ngrok.com/docs/traffic-policy/actions/oauth/#supported-providers" rel="noopener noreferrer"&gt;https://ngrok.com/docs/traffic-policy/actions/oauth/#supported-providers&lt;/a&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight yaml"&gt;&lt;code&gt;&lt;span class="c1"&gt;# policy.yaml&lt;/span&gt;
&lt;span class="na"&gt;on_http_request&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
  &lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="na"&gt;actions&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
      &lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="na"&gt;type&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;oauth&lt;/span&gt;
        &lt;span class="na"&gt;config&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
          &lt;span class="na"&gt;provider&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;google&lt;/span&gt; &lt;span class="c1"&gt;# OAuth available with Amazon, Facebook, GitHub, GitLab, Google, LinkedIn, Microsoft, Twitch&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  &lt;a href="https://ngrok.com/docs/traffic-policy/getting-started/agent-endpoints/cli/#2-apply-your-traffic-policy" rel="noopener noreferrer"&gt;Run your endpoint with the Traffic Policy file&lt;/a&gt;
&lt;/h2&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;ngrok http 8080 &lt;span class="nt"&gt;--traffic-policy-file&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;policy.yaml
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  Restrict OAuth to specific emails
&lt;/h2&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight yaml"&gt;&lt;code&gt;&lt;span class="c1"&gt;# policy.yaml&lt;/span&gt;
&lt;span class="na"&gt;on_http_request&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
  &lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="na"&gt;actions&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
      &lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="na"&gt;type&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;oauth&lt;/span&gt;
        &lt;span class="na"&gt;config&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
          &lt;span class="na"&gt;provider&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;google&lt;/span&gt;
  &lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="na"&gt;expressions&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
      &lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="s"&gt;!(actions.ngrok.oauth.identity.email&lt;/span&gt;&lt;span class="nv"&gt; &lt;/span&gt;&lt;span class="s"&gt;in&lt;/span&gt;&lt;span class="nv"&gt; &lt;/span&gt;&lt;span class="s"&gt;['alice@example.com','bob@example.com'])"&lt;/span&gt;
    &lt;span class="na"&gt;actions&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
      &lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="na"&gt;type&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;deny&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  Restrict OAuth to specific domains
&lt;/h2&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight yaml"&gt;&lt;code&gt;&lt;span class="c1"&gt;# policy.yaml&lt;/span&gt;
&lt;span class="na"&gt;on_http_request&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
  &lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="na"&gt;actions&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
      &lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="na"&gt;type&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;oauth&lt;/span&gt;
        &lt;span class="na"&gt;config&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
          &lt;span class="na"&gt;provider&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;google&lt;/span&gt;
  &lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="na"&gt;expressions&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
      &lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="s"&gt;!(actions.ngrok.oauth.identity.email.endsWith('@example.com'))"&lt;/span&gt;
    &lt;span class="na"&gt;actions&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
      &lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="na"&gt;type&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;deny&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h1&gt;
  
  
  &lt;a href="https://ngrok.com/docs/traffic-policy/actions/verify-webhook/" rel="noopener noreferrer"&gt;Verify your webhooks&lt;/a&gt;
&lt;/h1&gt;

&lt;h2&gt;
  
  
  &lt;a href="https://ngrok.com/docs/integrations/slack/webhooks/" rel="noopener noreferrer"&gt;Add the &lt;code&gt;verify-webhook&lt;/code&gt; action for Slack&lt;/a&gt;
&lt;/h2&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight yaml"&gt;&lt;code&gt;&lt;span class="c1"&gt;# policy.yaml&lt;/span&gt;
&lt;span class="na"&gt;on_http_request&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
  &lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="na"&gt;actions&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
      &lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="na"&gt;type&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;verify-webhook&lt;/span&gt;
        &lt;span class="na"&gt;config&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
          &lt;span class="na"&gt;provider&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;slack&lt;/span&gt;
          &lt;span class="na"&gt;secret&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;$SLACK_TOKEN&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  CLI Alternative
&lt;/h2&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;ngrok http 3000 &lt;span class="se"&gt;\&lt;/span&gt;
  &lt;span class="nt"&gt;--verify-webhook&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;slack &lt;span class="se"&gt;\&lt;/span&gt;
  &lt;span class="nt"&gt;--verify-webhook-secret&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="nv"&gt;$SLACK_TOKEN&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  &lt;a href="https://ngrok.com/docs/traffic-policy/actions/verify-webhook/" rel="noopener noreferrer"&gt;Replace &lt;code&gt;provider&lt;/code&gt; for any supported provider&lt;/a&gt;
&lt;/h2&gt;

&lt;p&gt;List of Supported Providers: &lt;a href="https://ngrok.com/docs/traffic-policy/actions/verify-webhook/" rel="noopener noreferrer"&gt;https://ngrok.com/docs/traffic-policy/actions/verify-webhook/&lt;/a&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight yaml"&gt;&lt;code&gt;&lt;span class="c1"&gt;# policy.yaml&lt;/span&gt;
&lt;span class="na"&gt;on_http_request&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
  &lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="na"&gt;actions&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
      &lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="na"&gt;type&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;verify-webhook&lt;/span&gt;
        &lt;span class="na"&gt;config&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
          &lt;span class="na"&gt;provider&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;$PROVIDER&lt;/span&gt; &lt;span class="c1"&gt;# Example: GitHub&lt;/span&gt;
          &lt;span class="na"&gt;secret&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;$PROVIDER_TOKEN&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h1&gt;
  
  
  &lt;a href="https://ngrok.com/docs/universal-gateway/internal-endpoints/" rel="noopener noreferrer"&gt;Do even more with internal endpoints&lt;/a&gt;
&lt;/h1&gt;

&lt;h2&gt;
  
  
  &lt;a href="https://ngrok.com/docs/traffic-policy/actions/forward-internal/" rel="noopener noreferrer"&gt;Create a Cloud Endpoint&lt;/a&gt;
&lt;/h2&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="c"&gt;# Create a private, internal agent endpoint only reachable via forward-internal&lt;/span&gt;
ngrok http 8080 &lt;span class="nt"&gt;--binding&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;internal &lt;span class="nt"&gt;--url&lt;/span&gt; https://api.internal
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  Example Traffic Policy File
&lt;/h2&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight yaml"&gt;&lt;code&gt;&lt;span class="c1"&gt;# policy.yaml&lt;/span&gt;
&lt;span class="c1"&gt;# Forward to an internal endpoint from a public endpoint&lt;/span&gt;
&lt;span class="na"&gt;on_http_request&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
  &lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="na"&gt;actions&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
      &lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="na"&gt;type&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;forward-internal&lt;/span&gt;
        &lt;span class="na"&gt;config&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
          &lt;span class="na"&gt;url&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;https://api.internal&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  Start Public Endpoint with &lt;code&gt;forward-internal&lt;/code&gt; action
&lt;/h2&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;ngrok http 8080 &lt;span class="nt"&gt;--url&lt;/span&gt; forward-internal-example.ngrok.app &lt;span class="nt"&gt;--traffic-policy-file&lt;/span&gt; policy.yml
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h1&gt;
  
  
  Manage traffic in other ways
&lt;/h1&gt;

&lt;h2&gt;
  
  
  &lt;a href="https://ngrok.com/docs/universal-gateway/cloud-endpoints/routing-and-policy-decentralization/" rel="noopener noreferrer"&gt;Add path-based routing&lt;/a&gt;
&lt;/h2&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight yaml"&gt;&lt;code&gt;&lt;span class="c1"&gt;# policy.yaml&lt;/span&gt;
&lt;span class="c1"&gt;# Route /api/* to api.internal, /app/* to app.internal&lt;/span&gt;
&lt;span class="na"&gt;on_http_request&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
  &lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="na"&gt;expressions&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
      &lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="s"&gt;req.path.startsWith('/api/')"&lt;/span&gt;
    &lt;span class="na"&gt;actions&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
      &lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="na"&gt;type&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;forward-internal&lt;/span&gt;
        &lt;span class="na"&gt;config&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
          &lt;span class="na"&gt;url&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;https://api.internal&lt;/span&gt;
  &lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="na"&gt;expressions&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
      &lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="s"&gt;req.path.startsWith('/app/')"&lt;/span&gt;
    &lt;span class="na"&gt;actions&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
      &lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="na"&gt;type&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;forward-internal&lt;/span&gt;
        &lt;span class="na"&gt;config&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
          &lt;span class="na"&gt;url&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;https://app.internal&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  &lt;a href="https://ngrok.com/docs/traffic-policy/actions/forward-internal/#examples" rel="noopener noreferrer"&gt;Route traffic by anything&lt;/a&gt;
&lt;/h2&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight yaml"&gt;&lt;code&gt;&lt;span class="c1"&gt;# policy.yaml&lt;/span&gt;
&lt;span class="c1"&gt;# Host-based and header-based dynamic forwarding to internal endpoints via forward-internal action&lt;/span&gt;
&lt;span class="na"&gt;on_http_request&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
  &lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="na"&gt;expressions&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
      &lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="s"&gt;req.host&lt;/span&gt;&lt;span class="nv"&gt; &lt;/span&gt;&lt;span class="s"&gt;==&lt;/span&gt;&lt;span class="nv"&gt; &lt;/span&gt;&lt;span class="s"&gt;'api.example.com'"&lt;/span&gt;
    &lt;span class="na"&gt;actions&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
      &lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="na"&gt;type&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;forward-internal&lt;/span&gt;
        &lt;span class="na"&gt;config&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="pi"&gt;{&lt;/span&gt; &lt;span class="nv"&gt;url&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="nv"&gt;https&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;&lt;span class="nv"&gt;//api.internal&lt;/span&gt; &lt;span class="pi"&gt;}&lt;/span&gt;
  &lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="na"&gt;expressions&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
      &lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="s"&gt;getReqHeader('X-Tenant')&lt;/span&gt;&lt;span class="nv"&gt; &lt;/span&gt;&lt;span class="s"&gt;!=&lt;/span&gt;&lt;span class="nv"&gt; &lt;/span&gt;&lt;span class="s"&gt;''"&lt;/span&gt;
    &lt;span class="na"&gt;actions&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
      &lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="na"&gt;type&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;forward-internal&lt;/span&gt;
        &lt;span class="na"&gt;config&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="pi"&gt;{&lt;/span&gt; &lt;span class="nv"&gt;url&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="nv"&gt;https&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;&lt;span class="nv"&gt;//tenant.internal&lt;/span&gt; &lt;span class="pi"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  &lt;a href="https://ngrok.com/docs/universal-gateway/examples/multiplex/" rel="noopener noreferrer"&gt;Multiplex to Internal Services from a Single Domain&lt;/a&gt;
&lt;/h2&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight yaml"&gt;&lt;code&gt;&lt;span class="c1"&gt;# policy.yaml&lt;/span&gt;
&lt;span class="na"&gt;on_http_request&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
  &lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="na"&gt;actions&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
      &lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="na"&gt;type&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;forward-internal&lt;/span&gt;
        &lt;span class="na"&gt;config&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
          &lt;span class="na"&gt;url&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;https://${req.host.split(".$NGROK_DOMAIN")[0]}.internal&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  &lt;a href="https://ngrok.com/docs/traffic-policy/actions/rate-limit/" rel="noopener noreferrer"&gt;Add rate limiting&lt;/a&gt;
&lt;/h2&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight yaml"&gt;&lt;code&gt;&lt;span class="c1"&gt;# policy.yaml&lt;/span&gt;
&lt;span class="c1"&gt;# 10 requests per 60s window per client IP -&amp;gt; 429 on limit&lt;/span&gt;
&lt;span class="na"&gt;on_http_request&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
  &lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="na"&gt;actions&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
      &lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="na"&gt;type&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;rate-limit&lt;/span&gt;
        &lt;span class="na"&gt;config&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
          &lt;span class="na"&gt;name&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;per-ip-60s&lt;/span&gt;
          &lt;span class="na"&gt;algorithm&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;sliding_window&lt;/span&gt;
          &lt;span class="na"&gt;capacity&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="m"&gt;10&lt;/span&gt;
          &lt;span class="na"&gt;rate&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="s"&gt;60s"&lt;/span&gt;
          &lt;span class="na"&gt;bucket_key&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
            &lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="s"&gt;conn.client_ip&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  &lt;a href="https://ngrok.com/docs/traffic-policy/examples/block-unwanted-requests/#how-do-i-deny-traffic-from-bots-and-crawlers-with-a-robotstxt" rel="noopener noreferrer"&gt;Block search and AI bots&lt;/a&gt;
&lt;/h2&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight yaml"&gt;&lt;code&gt;&lt;span class="c1"&gt;# policy.yaml&lt;/span&gt;
&lt;span class="c1"&gt;# Send a robots.txt denying crawlers&lt;/span&gt;
&lt;span class="na"&gt;on_http_request&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
  &lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="na"&gt;expressions&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
      &lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="s"&gt;req.path&lt;/span&gt;&lt;span class="nv"&gt; &lt;/span&gt;&lt;span class="s"&gt;==&lt;/span&gt;&lt;span class="nv"&gt; &lt;/span&gt;&lt;span class="s"&gt;'/robots.txt'"&lt;/span&gt;
    &lt;span class="na"&gt;actions&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
      &lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="na"&gt;type&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;custom-response&lt;/span&gt;
        &lt;span class="na"&gt;config&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
          &lt;span class="na"&gt;status_code&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="m"&gt;200&lt;/span&gt;
          &lt;span class="na"&gt;headers&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
            &lt;span class="na"&gt;Content-Type&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="s"&gt;text/plain"&lt;/span&gt;
          &lt;span class="na"&gt;body&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="pi"&gt;|&lt;/span&gt;
            &lt;span class="s"&gt;User-agent: *&lt;/span&gt;
            &lt;span class="s"&gt;Disallow: /&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;





&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight yaml"&gt;&lt;code&gt;&lt;span class="c1"&gt;# policy.yaml&lt;/span&gt;
&lt;span class="c1"&gt;# Deny common bot/AI user agents&lt;/span&gt;
&lt;span class="na"&gt;on_http_request&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
  &lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="na"&gt;expressions&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
      &lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="s"&gt;req.user_agent.raw.matches('(?i)(gptbot|chatgpt-user|ccbot|bingbot|googlebot)')"&lt;/span&gt;
    &lt;span class="na"&gt;actions&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
      &lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="na"&gt;type&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;deny&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;





&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight yaml"&gt;&lt;code&gt;&lt;span class="c1"&gt;# policy.yaml&lt;/span&gt;
&lt;span class="c1"&gt;# Also add X-Robots-Tag to all responses&lt;/span&gt;
&lt;span class="na"&gt;on_http_response&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
  &lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="na"&gt;actions&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
      &lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="na"&gt;type&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;add-headers&lt;/span&gt;
        &lt;span class="na"&gt;config&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
          &lt;span class="na"&gt;headers&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
            &lt;span class="na"&gt;X-Robots-Tag&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="s"&gt;noindex,&lt;/span&gt;&lt;span class="nv"&gt; &lt;/span&gt;&lt;span class="s"&gt;nofollow,&lt;/span&gt;&lt;span class="nv"&gt; &lt;/span&gt;&lt;span class="s"&gt;noai,&lt;/span&gt;&lt;span class="nv"&gt; &lt;/span&gt;&lt;span class="s"&gt;noimageai"&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  &lt;a href="https://ngrok.com/docs/traffic-policy/actions/add-headers/" rel="noopener noreferrer"&gt;Add headers&lt;/a&gt;
&lt;/h2&gt;

&lt;h3&gt;
  
  
  Via CLI
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="c"&gt;# Common security headers&lt;/span&gt;
ngrok http 8080 &lt;span class="se"&gt;\&lt;/span&gt;
  &lt;span class="nt"&gt;--request-header-add&lt;/span&gt; &lt;span class="s2"&gt;"X-Frame-Options: DENY"&lt;/span&gt; &lt;span class="se"&gt;\&lt;/span&gt;
  &lt;span class="nt"&gt;--response-header-add&lt;/span&gt; &lt;span class="s2"&gt;"Referrer-Policy: no-referrer"&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  Via Traffic Policy
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight yaml"&gt;&lt;code&gt;&lt;span class="c1"&gt;# policy.yaml&lt;/span&gt;
&lt;span class="c1"&gt;# Add headers on request/response&lt;/span&gt;
&lt;span class="na"&gt;on_http_request&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
  &lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="na"&gt;actions&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
      &lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="na"&gt;type&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;add-headers&lt;/span&gt;
        &lt;span class="na"&gt;config&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
          &lt;span class="na"&gt;headers&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
            &lt;span class="na"&gt;X-Frame-Options&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="s"&gt;DENY"&lt;/span&gt;
&lt;span class="na"&gt;on_http_response&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
  &lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="na"&gt;actions&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
      &lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="na"&gt;type&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;add-headers&lt;/span&gt;
        &lt;span class="na"&gt;config&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
          &lt;span class="na"&gt;headers&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
            &lt;span class="na"&gt;Referrer-Policy&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="s"&gt;no-referrer"&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  &lt;a href="https://ngrok.com/docs/traffic-policy/actions/restrict-ips/" rel="noopener noreferrer"&gt;Restrict access by IPs&lt;/a&gt;
&lt;/h2&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="c"&gt;# Allow only 203.0.113.0/24; deny others&lt;/span&gt;
ngrok http 8080 &lt;span class="nt"&gt;--cidr-allow&lt;/span&gt; 203.0.113.0/24

&lt;span class="c"&gt;# Or explicitly deny CIDRs&lt;/span&gt;
ngrok http 8080 &lt;span class="nt"&gt;--cidr-deny&lt;/span&gt; 0.0.0.0/0
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  &lt;a href="https://ngrok.com/docs/traffic-policy/actions/owasp-crs-response/" rel="noopener noreferrer"&gt;Block all the potentially bad things&lt;/a&gt;
&lt;/h2&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight yaml"&gt;&lt;code&gt;&lt;span class="c1"&gt;# policy.yaml&lt;/span&gt;
&lt;span class="c1"&gt;# Apply OWASP Core Rule Set on requests/responses&lt;/span&gt;
&lt;span class="na"&gt;on_http_request&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
  &lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="na"&gt;actions&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
      &lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="na"&gt;type&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;owasp-crs-request&lt;/span&gt;
&lt;span class="na"&gt;on_http_response&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
  &lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="na"&gt;actions&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
      &lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="na"&gt;type&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;owasp-crs-response&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h1&gt;
  
  
  CLI Flags
&lt;/h1&gt;

&lt;h2&gt;
  
  
  &lt;code&gt;url&lt;/code&gt;
&lt;/h2&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="c"&gt;# Choose a URL instead of random assignment&lt;/span&gt;
ngrok http 8080 &lt;span class="nt"&gt;--url&lt;/span&gt; https://baz.ngrok.dev
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  &lt;code&gt;traffic-policy-file&lt;/code&gt;
&lt;/h2&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="c"&gt;# Manipulate traffic to your endpoint with a traffic policy file&lt;/span&gt;
ngrok http 8080 &lt;span class="nt"&gt;--url&lt;/span&gt; https://baz.ngrok.dev &lt;span class="nt"&gt;--traffic-policy-file&lt;/span&gt; policy.yaml
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  &lt;code&gt;traffic-policy-url&lt;/code&gt;
&lt;/h2&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="c"&gt;# Manipulate traffic to your endpoint with a traffic policy URL&lt;/span&gt;
ngrok http 8080 &lt;span class="nt"&gt;--url&lt;/span&gt; https://baz.ngrok.dev policy &lt;span class="nt"&gt;--traffic-policy-url&lt;/span&gt; https://example.com/policy.yml
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  &lt;code&gt;pooling-enabled&lt;/code&gt;
&lt;/h2&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="c"&gt;# Load Balance (different ports)&lt;/span&gt;
ngrok http 8080 &lt;span class="nt"&gt;--url&lt;/span&gt; https://api.example.com &lt;span class="nt"&gt;--pooling-enabled&lt;/span&gt;
ngrok http 8081 &lt;span class="nt"&gt;--url&lt;/span&gt; https://api.example.com &lt;span class="nt"&gt;--pooling-enabled&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h1&gt;
  
  
  What &lt;em&gt;else&lt;/em&gt; can I do with ngrok?
&lt;/h1&gt;

&lt;ul&gt;
&lt;li&gt;&lt;p&gt;Use ngrok Kubernetes Operator: &lt;a href="https://ngrok.com/docs/k8s/" rel="noopener noreferrer"&gt;https://ngrok.com/docs/k8s/&lt;/a&gt;&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Get started with Traffic Observability: &lt;a href="https://ngrok.com/docs/obs/" rel="noopener noreferrer"&gt;https://ngrok.com/docs/obs/&lt;/a&gt;&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Look into Identity and Access Management: &lt;a href="https://ngrok.com/docs/iam/" rel="noopener noreferrer"&gt;https://ngrok.com/docs/iam/&lt;/a&gt;&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Read ngrok's Security Best Practices: &lt;a href="https://ngrok.com/docs/guides/security-dev-productivity/" rel="noopener noreferrer"&gt;https://ngrok.com/docs/guides/security-dev-productivity/&lt;/a&gt;&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Check out Gateway Examples Gallery: &lt;a href="https://ngrok.com/docs/universal-gateway/examples/" rel="noopener noreferrer"&gt;https://ngrok.com/docs/universal-gateway/examples/&lt;/a&gt;&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;h1&gt;
  
  
  Ending Notes
&lt;/h1&gt;

&lt;p&gt;Get started with ngrok absolutely free of charge, sign up today!&lt;/p&gt;

</description>
      <category>ngrok</category>
      <category>webhooks</category>
      <category>platform</category>
      <category>engineering</category>
    </item>
  </channel>
</rss>
