ngrok
Secure tunneling platform that exposes local servers to the internet with stable domains, request inspection, and OAuth protection. Essential for API and webhook development.
Best for developers who need to expose local servers for webhook testing, API development, and sharing demos without deploying.
Use Cases
Free Tier
3 online endpoints, 1GB bandwidth, 20K HTTP requests/month, random subdomains
How to Maximize the Free Tier
ngrok's free tier is best used for short-lived development and testing sessions, not always-on production tunnels. The 1GB bandwidth cap goes fast with video or large payloads — keep request bodies small during testing. Use the request inspection UI (dashboard at localhost:4040) to debug webhook payloads without needing logging code. The interstitial warning page can be removed with a paid plan, but for internal testing it's harmless. Pair with a tool like Postman or curl for testing, not a browser, to avoid the warning page overhead. Sessions reset on reconnect, so write your stable domain to an .env file to avoid reconfiguring webhooks every time.
Getting Started
Sign up at ngrok.com → download the agent for your OS → run `ngrok http 3000` to tunnel to your local server → copy the random URL from the terminal → use that URL in webhook configurations → visit localhost:4040 for request inspection. For stable subdomains: create a free account and configure via dashboard.
Pros
- Request inspection: Built-in web UI at localhost:4040 shows every request/response in real time — invaluable for debugging webhooks
- Cross-platform: Native clients for macOS, Windows, Linux, Docker, and Kubernetes — works wherever you develop
- Security features: Free tier includes OAuth protection and IP restrictions for securing tunnel endpoints
Cons
- Interstitial page: Free endpoints show a warning page to visitors — requires clicking through before reaching your app
- Bandwidth cap: 1GB monthly bandwidth is restrictive for data-heavy APIs or streaming use cases
- Session resets: Random URLs change on every reconnect — requires reconfiguring webhook endpoints each time