slash0 fetches and parses the official range publications of every service in its catalog, continuously, and republishes them as a signed feed. Doing that means writing a parser per vendor and then living with the result: the pages that get restyled, the files with no cache headers, the ranges that appear one morning with no warning. This page is the byproduct of that work. It is not a survey of vendor documentation, it is a record of what it takes to track each one in production.
Nothing here is a judgement about the services themselves. A vendor can be excellent and still publish its ranges badly. What is being measured is narrow: whether an automated consumer can follow your ranges without heroics.
what the score measures
Five points, one for each thing that separates a range list you can automate from one you have to babysit.
- Machine-readable source. The ranges come from an endpoint that returns structured data. The alternative is a documentation page, which means every consumer writes a scraper and every scraper breaks on a redesign.
- Cheap change detection. The server honors conditional requests, so checking for a change costs a 304 rather than a full download. Without it, following a vendor closely means refetching the entire list on a timer.
- Purposes separated. The publication distinguishes what the ranges are for, so allowlisting the API does not also allowlist every other thing the vendor operates. The common failure is one flat list covering an entire company.
- Advance notice. The vendor documents how long a newly published range sits unused before it starts carrying traffic. This is the single most useful thing a vendor can offer, and it is the rarest.
- A change signal. Something the vendor operates that tells you a change happened: a notification topic, a status page subscription, a version endpoint. Polling is the fallback when this does not exist.
findings
- 66 services publish official ranges. 38 state that you should not pin them at all. Between them the 66 publish 30,136 CIDRs, rebuilt continuously and republished as a signed feed.
- 1 of 66 scores five out of five. Only Elastic Cloud does everything on this list.
- 9 of 66 commit to any advance notice before newly published ranges start carrying traffic: Auth0 (Okta CIC), Buildkite, CircleCI, Databricks, Elastic Cloud, LaunchDarkly, Microsoft 365, Microsoft Azure (Service Tags), Stripe. For everyone else, a range can go live the moment it appears.
- 8 of 66 operate a change signal you can subscribe to (Amazon Web Services, Atlassian Cloud, CircleCI, Elastic Cloud, Fastly, LaunchDarkly, Microsoft 365, Stripe). Another 4 are trackable only because their documentation happens to live in a public git repository, so the commit feed stands in for a notification the vendor does not offer.
- 28 of 66 have no machine-readable endpoint at all. Their ranges exist only inside a documentation page, so every consumer writes a scraper and every consumer breaks when the page is restyled.
- 20 of 66 honor conditional requests. The rest have no cache validators, so checking for a change means downloading the whole list again.
- 10 of 66 publish one undifferentiated set. Allowlisting the API also allowlists everything else the vendor runs, including infrastructure that has nothing to do with your integration.
- 43 of 66 publish no IPv6 ranges. Reported in the table but left out of the score, since a vendor with no IPv6 footprint has nothing to publish.
the table
Sorted by score, then alphabetically. Every cell is read from the feed, and every service name links to its page, where the current ranges render live. Advance-notice and change-signal entries link to the vendor page that states the claim, so any cell can be checked at its source.
| Service | Score | Source | Change detection | Purposes | Advance notice | Change signal | IPv6 |
|---|---|---|---|---|---|---|---|
| Elastic Cloud | 5 | JSON | conditional GET | 2 | 8 weeks before static IPs change | vendor | no |
| Amazon Web Services | 4 | JSON | conditional GET | 5 | none | vendor | yes |
| Atlassian Cloud | 4 | JSON | conditional GET | 3 | none | vendor | yes |
| Auth0 (Okta CIC) | 4 | JSON | conditional GET | 7 | several months, by email | none | no |
| Buildkite | 4 | JSON | conditional GET | 1 | 7 days, vendor says it will try | none | no |
| CircleCI | 4 | JSON | full download | 2 | 30 days | vendor | no |
| LaunchDarkly | 4 | JSON | full download | 2 | 2 weeks, posted on the status page | vendor | no |
| Microsoft 365 | 4 | JSON | full download | 4 | 30 days before new endpoints are used | vendor | yes |
| Stripe | 4 | JSON | full download | 3 | 7 days, by mailing list | vendor | no |
| Cloudflare | 3 | JSON | conditional GET | 1 | none | none | yes |
| Databricks | 3 | JSON | full download | 7 | 60 days before updated IPs activate | none | no |
| Datadog | 3 | JSON | conditional GET | 8 | none | none | yes |
| Fastly | 3 | JSON | full download | 1 | none | vendor | yes |
| GitHub | 3 | JSON | conditional GET | 7 | none | none | yes |
| Google Cloud Platform | 3 | JSON | conditional GET | 49 | none | none | yes |
| Intercom | 3 | JSON | conditional GET | 3 | none | none | no |
| Microsoft Azure (Service Tags) | 3 | JSON | page extraction | 3 | 1 week before new IPs are used | none | yes |
| Okta | 3 | JSON | conditional GET | 16 | none | none | no |
| Oracle Cloud Infrastructure | 3 | JSON | conditional GET | 2 | none | none | no |
| PagerDuty | 3 | JSON | conditional GET | 2 | none | none | no |
| Svix | 3 | JSON | conditional GET | 1 | none | none | yes |
| Tenable (Vulnerability Management) | 3 | JSON | conditional GET | 1 | none | none | yes |
| Zscaler (zscaler.net cloud) | 3 | JSON | conditional GET | 2 | none | none | yes |
| Akamai Connected Cloud (Linode) | 2 | CSV | conditional GET | one set | none | none | yes |
| Braintree (PayPal) | 2 | JSON | full download | 2 | none | none | no |
| Checkly | 2 | JSON | full download | 1 | none | none | yes |
| DocuSign | 2 | JSON | full download | 2 | none | none | no |
| Google (all services) | 2 | JSON | conditional GET | one set | none | none | yes |
| Grafana Cloud | 2 | text | full download | 3 | none | none | no |
| HubSpot | 2 | JSON | full download | 4 | none | none | no |
| Klaviyo | 2 | JSON | full download | 1 | none | none | no |
| OpenAI | 2 | JSON | full download | 6 | none | none | no |
| Pingdom | 2 | XML | full download | 1 | none | none | yes |
| Salesforce | 2 | JSON | conditional GET | one set | none | none | yes |
| Zendesk | 2 | JSON | full download | 2 | none | none | no |
| Zoom | 2 | text | conditional GET | one set | none | none | no |
| Anthropic | 1 | docs page | page extraction | 3 | none | none | yes |
| Braze | 1 | docs page | page extraction | 1 | none | none | no |
| Checkout.com | 1 | docs page | page extraction | 1 | none | none | no |
| Cisco Duo | 1 | docs page | page extraction | 12 | none | none | no |
| DigitalOcean | 1 | CSV | full download | one set | none | none | yes |
| Fivetran | 1 | docs page | page extraction | 2 | none | none | no |
| GitLab.com | 1 | docs page | page extraction | 2 | none | docs repo | no |
| IBM Cloud (Classic infrastructure) | 1 | docs page | page extraction | 2 | none | none | no |
| Make | 1 | docs page | page extraction | 1 | none | none | no |
| Neon (Serverless Postgres) | 1 | docs page | page extraction | 1 | none | docs repo | no |
| Netskope (NewEdge) | 1 | docs page | page extraction | 1 | none | none | no |
| New Relic | 1 | docs page | page extraction | 2 | none | docs repo | yes |
| OneLogin | 1 | docs page | page extraction | 3 | none | none | no |
| Oracle NetSuite Connector | 1 | docs page | page extraction | 1 | none | none | no |
| Plaid | 1 | docs page | page extraction | 1 | none | none | no |
| Postmark | 1 | docs page | page extraction | 2 | none | none | no |
| Rapid7 (InsightAppSec cloud engines) | 1 | docs page | page extraction | 1 | none | none | no |
| Retool | 1 | docs page | page extraction | 1 | none | none | no |
| Sentry (hosted) | 1 | docs page | page extraction | 3 | none | docs repo | yes |
| Splunk AppDynamics SaaS | 1 | docs page | page extraction | 2 | none | none | no |
| Twilio Elastic SIP Trunking | 1 | docs page | page extraction | 2 | none | none | no |
| UptimeRobot | 1 | docs page | page extraction | 1 | none | none | yes |
| Vultr (Constant, AS20473) | 1 | CSV | full download | one set | none | none | yes |
| Wise | 1 | docs page | page extraction | 2 | none | none | no |
| Workato | 1 | docs page | page extraction | 2 | none | none | no |
| WorkOS | 1 | docs page | page extraction | 1 | none | none | no |
| Airbyte Cloud | 0 | docs page | page extraction | one set | none | none | no |
| dbt Cloud | 0 | docs page | page extraction | one set | none | none | no |
| Hightouch | 0 | docs page | page extraction | one set | none | none | no |
| PayPal | 0 | docs page | page extraction | one set | none | none | no |
IPv6 is reported but not scored. A vendor with no IPv6 footprint has nothing to publish, and penalising that would measure their network, not their publication practice. The same reasoning keeps range count out of the score: a large list is a fact about a vendor's size.
the vendors who decline
These services state that IP allowlisting is unsupported or unreliable for
them, and most name what to do instead: verify webhook signatures, allow a
hostname, use a private endpoint. That is a legitimate answer, and it is more
useful than a list that quietly goes stale. They are published in the feed under
nonPublishers so that tooling can tell "no ranges exist" apart from
"no ranges found".
| Service | Stated position |
|---|---|
| Adyen | No IP list; allowlist out.adyen.com or resolve it via DNS hourly (their words). |
| Aiven | Services are addressed by hostname; static IP addresses are a paid per-project resource created and attached with the avn static-ip CLI, not a public range list. |
| Akamai (CDN) | Site Shield issues a per-customer set of IP subnet ranges (a map) retrieved through Akamai Control Center or the Site Shield API, rather than one public global list. |
| Alibaba Cloud | Publishes per-service ingress lists, such as this per-region table for Data Management Service, rather than a provider-wide range file of the kind AWS, Azure and Google publish. |
| Box | Use domain names; 'IP addresses can change frequently and without notice' (their wording). No webhook source ranges published. |
| CockroachDB Cloud | The documented controls are an allowlist of your own authorized networks and private connectivity through AWS PrivateLink, GCP Private Service Connect or Azure Private Link. |
| Confluent Cloud | Public egress addresses are read from the Cloud Console or the authenticated Cloud REST API (api.confluent.cloud/networking/v1/ip-addresses), are shared by every customer in the same cloud and region, and are 'not guaranteed to be static' (their wording). |
| Docker Hub / Docker Desktop | Publishes an allowlist of domain URLs rather than addresses; the page lists hostnames only. Reproducible on the data plane: registry-1.docker.io resolves into rotating AWS us-east-1 EC2 addresses, a different set on each query (verified 2026-07-30). |
| Dynatrace (Synthetic Monitoring) | Public Synthetic location addresses are read per environment, either from the Frequency and locations page in the web UI ('Copy IPs to clipboard or Download IPs') or from the Synthetic locations API, which 'returns all the locations available for your Environment along with their IP addresses'. No global list is published. |
| Honeycomb | Offers AWS PrivateLink to the Honeycomb API for Enterprise customers on AWS. No range list is published in the docs. |
| JumpCloud | States for the agent, LDAP-as-a-Service and AD Integration alike: 'Due to the elastic nature of the JumpCloud infrastructure, we currently do not publish lists of IP addresses for allow lists'. Directs users to FQDNs instead. Their separate data-centre page does list six regional RADIUS anycast addresses, which is a single narrow endpoint rather than a service range set. |
| Mailchimp Transactional (Mandrill) webhooks | Directs users to authenticate that a webhook originated from Mailchimp's servers using the documented request-signature flow. The /ips/ API returns your own dedicated sending addresses, which is a different thing from webhook sources. |
| Mailgun | Their IP Allowlist API 'lets you view and manage allowlisted IP addresses to which API key and SMTP credential usage is restricted', which controls your own callers rather than publishing Mailgun's addresses. Outbound sending addresses are per-account dedicated IPs grouped into pools, read through the authenticated /v3/ips API. |
| Maven Central (repo1.maven.org) | repo1.maven.org resolves into Cloudflare's published ranges (verified 2026-07-30: 104.18.18.12 and 104.18.19.12, both inside 104.16.0.0/13), so pinning it would allowlist the whole CDN rather than Maven Central. |
| MongoDB Atlas (data plane) | Cluster IPs are per-project/dynamic; control-plane IPs only via authenticated Admin API. Vendor directs users to private endpoints (PrivateLink). |
| Netlify (function egress) | States that by default the addresses builds and functions connect from 'will fluctuate when we scale up and down'. A static set is available only through the Private Connectivity add-on on Enterprise plans. |
| OpenAI API (api.openai.com) | api.openai.com resolves into Cloudflare's published ranges (verified 2026-07-30: 172.66.0.243 within 172.64.0.0/13, 162.159.140.245 within 162.158.0.0/15), so pinning it would allowlist the whole CDN rather than OpenAI. |
| Oracle NetSuite (platform) | States plainly that Oracle 'does not support the use of NetSuite IP addresses to access or manage access to any NetSuite services', that outbound addresses are 'not documented in the NetSuite Help Center or in SuiteAnswers', and that *.netsuite.com is CDN-fronted. Directs users to 2FA, token-based auth and OAuth 2.0 instead, or to a DNS lookup on outboundips.netsuite.com. NetSuite Connector IS published, see the netsuite-connector service. |
| Palo Alto Networks Prisma Access | Egress addresses are allocated per tenant and retrieved with your own API key from api.prod.datapath.prismaaccess.com, or read per location in the Prisma Access UI. |
| PlanetScale | The addresses to allowlist are shown in the console during the import workflow, differ by region, and the vendor directs users to read them there each time because they 'can change occasionally'. |
| PyPI (pypi.org, files.pythonhosted.org) | Both pypi.org and files.pythonhosted.org resolve into Fastly's published ranges (verified 2026-07-30: 151.101.0.223 and 151.101.128.223, inside 151.101.0.0/16), so pinning them would allowlist the whole CDN rather than PyPI. |
| Redis Cloud | The CIDR allow list restricts which of your own addresses may reach your database, between 4 and 32 entries depending on plan. Redis publishes no ranges of its own. |
| RubyGems (rubygems.org) | rubygems.org resolves into Fastly's published ranges (verified 2026-07-30: 151.101.1.227 and 151.101.129.227, inside 151.101.0.0/16), so pinning it would allowlist the whole CDN rather than RubyGems. |
| SendGrid (webhooks/parse) | Dynamic cloud infra; use signed webhooks, not IP allowlists. |
| Shopify (webhooks) | Documents HMAC-SHA256 signature verification as the way to authenticate a webhook. The page does not mention source IPs, and no official range list was found as of the verified date. |
| Slack | No published egress IPs; their allowlisting feature restricts YOUR IPs calling THEM. |
| Snowflake | Deployment-specific hostnames/IPs per account; no global list. |
| Snyk | The Broker Client opens the outbound WebSocket and Snyk rides it back, so in their words 'you do not need to allow a Snyk IP address. Instead, you can allow the Broker Client IP/port.' Requests to Snyk go through a CDN that rotates addresses and whole ranges, and they direct users to allow *.snyk.io. |
| Splunk Cloud Platform | The documented control is an IP allow list restricting which addresses on your own network reach each Splunk feature, managed through the Admin Config Service API. Splunk publishes no ranges of its own for the stack. |
| Square (webhooks) | No webhook source-IP list published; validate notifications via the documented HMAC-SHA256 signature flow. |
| Stytch (webhooks) | Publishes no source-IP list of its own; states 'Stytch's webhooks are powered through Svix'. A receiving endpoint allowlists the svix service in this feed instead. Their own IP feature runs the other way: up to 10 customer IPs that may call the Stytch API, arranged over email with support. |
| Sumo Logic | No own ranges; directs users to download the AWS IP ranges JSON and use the prefixes for the AWS region their deployment sits in, which the aws service already covers. States plainly that 'the list of IP ranges is shared infrastructure. It is not limited to Sumo Logic nodes and is subject to change over time.' |
| Supabase | States that 'IPv4 addresses are guaranteed to be static for ingress traffic' through a per-project paid add-on, while 'the outbound IP address is not static and cannot be guaranteed'. |
| Twilio (REST API + webhooks) | IPs 'highly dynamic, and span a large range, so it's impractical to list each of them'; they recommend allowing outbound HTTPS to any *.twilio.com subdomain instead. SIP trunking IS pinnable, see the twilio-sip service. |
| Vercel (function egress) | Dynamic by default; static IPs are a paid per-customer feature, not a public range. |
| Zapier | States that Zapier 'uses Amazon (AWS)'s us-east-1 region, where it dynamically provisions instances as needed', so there is no fixed set. They suggest matching the User-Agent: Zapier header instead, or the static IP feature available on paid plans. |
| crates.io | crates.io resolves into Fastly's published ranges (verified 2026-07-30: 151.101.130.137 and 151.101.194.137, inside 151.101.0.0/16), so pinning it would allowlist the whole CDN rather than crates.io. |
| npm registry (registry.npmjs.org) | registry.npmjs.org resolves into Cloudflare's published ranges (verified 2026-07-30: 104.16.0.34 and 104.16.1.34, both inside 104.16.0.0/13), so pinning it would allowlist the whole CDN rather than npm. |
method
Every row comes from the published feed at feed.slash0.io/v1, which is rebuilt from each vendor's own publication and carries the source URL and a hash of the upstream body it was derived from. The registry behind it, including the evidence link for every non-publisher, is public in sources.yaml. Advance-notice entries record only periods the vendor documents; a vendor that announces changes without committing to a lead time scores nothing on that criterion, which is a deliberately strict reading. Every notice period and every change signal in the table was read from the vendor's own page and links back to it. Those pages are also submitted to the Internet Archive, so a vendor reorganising its documentation cannot leave a claim here unsupported.
Two caveats worth stating. Notice periods are counted only when they cover the ranges published here: PagerDuty commits to 30 days for its REST API addresses, for example, but not for the webhook sources in this catalog, so it scores nothing for notice. And a low score reflects how a vendor publishes, not how good the service is.
Corrections are welcome, particularly from vendors. If a range publication changed, or this page has something wrong, get in touch and the registry gets updated.
The feed and the Terraform provider that reads it are free. The quickstart is two data sources and a security group rule.