Restrict the Auth0 Management API to a Static IP With QuotaGuard

QuotaGuard Engineering
August 19, 2026
5 min read
Pattern

Auth0 has no native Management API IP restriction, so route your app's calls through a QuotaGuard static IP and enforce a source-IP allowlist in an Action.

Auth0 gives every machine-to-machine credential the reach its scopes allow. A token scoped to /api/v2/ can manage your whole tenant. If that client secret leaks, the only thing standing between an attacker and your user directory is the network. So teams reach for an IP allowlist. Then they find Auth0 has no setting for one on the Management API.

Auth0 Enforces Management API IP Rules Through an Action You Own

There's no toggle in the dashboard that says "only accept Management API tokens from these IPs." Auth0's own guidance is to build the check yourself. You add an Action on the onExecuteCredentialsExchange trigger, read the caller's IP off the request, and deny the token when the origin isn't yours.

The Action runs during the client credentials exchange, before the token is issued. Scope it to the Management API resource server so it gates M2M exchanges and leaves interactive logins alone.

exports.onExecuteCredentialsExchange = async (event, api) => {
  const allowed = ["203.0.113.10", "203.0.113.11"]; // your two QuotaGuard IPs
  const audience = event.resource_server && event.resource_server.identifier;

  if (audience === "https://YOUR_TENANT.us.auth0.com/api/v2/") {
    if (!allowed.includes(event.request.ip)) {
      api.access.deny("ip_not_allowed");
    }
  }
};

A Fixed Egress IP Makes the event.request.ip Check Reliable

The Action is only as good as the IP it compares against. If your app runs on Render, Railway, Heroku, Fly.io, or AWS Lambda, its outbound IP changes on every deploy and restart. Your allowlist goes stale the next time the dyno moves. Requests start getting denied even though the credentials are correct.

You can't allowlist the platform's whole range either. PaaS hosts don't publish narrow CIDR blocks, so trusting your platform's range means trusting every other customer on it. That defeats the point of the check.

A static outbound IP fixes both problems. Your app leaves from the same address on every request, the allowlist stays two entries long, and no other tenant shares it.

QuotaGuard Gives Your Auth0 Calls a Static IP in 2 Minutes

QuotaGuard is a proxy. Your app sends its Auth0 traffic through QuotaGuard, and Auth0 sees one of your two fixed IPs on every request. Setup is one environment variable and a proxy config on your HTTP client.

Add the connection URL to your environment:

QUOTAGUARDSTATIC_URL="http://username:password@us-east-static-01.quotaguard.com:9293"

Then route your Auth0 calls through it. In Node.js:

const axios = require("axios");
const { HttpsProxyAgent } = require("https-proxy-agent");
const httpsAgent = new HttpsProxyAgent(process.env.QUOTAGUARDSTATIC_URL);

await axios.get("https://YOUR_TENANT.us.auth0.com/api/v2/users", {
  headers: { Authorization: `Bearer ${managementToken}` },
  httpsAgent,
  proxy: false,
});

Every subscription includes two load-balanced static IPs. Put both in the Action's allowlist so a request served by either one passes. The example host above is region-specific. You pick your region at sign-up, so choose the one closest to your Auth0 tenant, and changing it later means contacting QuotaGuard support.

That's the full loop. Two QuotaGuard IPs on the Action allowlist, your app proxied through them, and the Management API now refuses any token exchange from an origin you didn't register. For the conversion-side walkthrough and the mechanics in one place, see the Auth0 static IP integration page.

Tenant Access Control Lists Add a Second Enforcement Point

If you're on an Enterprise plan with the Attack Protection add-on, Auth0's Tenant Access Control List gives you IP filtering at the tenant edge. Tenant ACL rules match IPv4 and IPv6 CIDR with allow, block, and log actions, and they cover both the Authentication path and the Management API under /api/v2/ and /scim/.

Auth0 is hosted, so you don't put a proxy in front of it. You give your callers a fixed egress IP with QuotaGuard, then add that IP as a Tenant ACL allow rule. The same two IPs cover both the Action check and the Tenant ACL rule. Tenant ACL has shipped as Early Access, so confirm availability on your plan. The Action pattern needs no specific tier, which is why most teams start there.

This is the same static-egress pattern that lets AI agents and coding assistants pass an enterprise firewall's allowlist. If you're routing agent traffic to Anthropic, OpenAI, or an MCP endpoint, the setup is identical to the one above.

QuotaGuard Static Pricing Starts at $19/Month

Bandwidth is bundled. No per-GB overage fees. A typical Auth0 control-plane integration moves modest volume, so the entry tier covers most teams. Dedicated IPs are available on Enterprise and above. On lower tiers, your two assigned IPs are still static, but shared with other customers.

QuotaGuard Shield Pricing Starts at $29/Month

Shield costs slightly more than Static at each tier because SSL passthrough adds routing overhead. If your Auth0 traffic carries regulated PII or your architecture is under SOC 2, PCI-DSS, or HIPAA review, Shield keeps the payload encrypted end to end and is worth the difference. QuotaGuard never decrypts your data in ordinary operation.

All plans include a 3-day trial. Enterprise plans include a 7-day trial. Credit card required.

See the full pricing table at quotaguard.com/products/pricing.

QuotaGuard Static IP Blog

Practical notes on routing cloud and AI traffic through Static IPs.

Reliability Engineered for the Modern Cloud

For over a decade, QuotaGuard has provided reliable, high-performance static IP and proxy solutions for cloud environments like Heroku, Kubernetes, and AWS.

Get the fixed identity and security your application needs today.