A consistency check compares the country an IP address is in with the country of the postal address and the country the phone number was allocated under. When the IP is a VPN exit, an iCloud Private Relay egress or a datacenter address, those comparisons are not made. The row still appears, with result: not_compared and withheld: low_confidence, and no flag is raised. This guide explains why that rule exists, exactly what it covers, and what to read instead when the network itself is what you want to act on.
The rule
Three fields on the IP answer decide it: is_anonymous (true when any of Tor, a known VPN or the Apple relay matched), is_datacenter, and is_relay. If any of them is true, the IP does not speak for a place, and every country comparison involving that IP is withheld:
ip_address_country— withheldip_phone_country— withheldip_address_distance— withheld too, because it is measured only once the countries already agree andlocation_confidenceishigh
What is not withheld: phone_address_country, which does not involve the IP at all and is compared exactly as it would have been. A withheld IP takes its own comparisons out of the report and touches nothing else.
country_agreement follows from what survives. If the phone-and-address pair is the only comparison left and it agrees, the roll-up reads agree; if nothing at all could be compared, it reads null rather than pretending to agreement it never established.
Why the answer is withheld rather than reported
The location of a VPN exit is a fact about the VPN provider. A person in Manchester connected to a server in Frankfurt genuinely is coming from Frankfurt as far as the network is concerned, and there is no arithmetic that recovers Manchester from it. Comparing that country against their postal address does not measure a discrepancy about the person; it measures the provider's server estate.
The scale is what makes it a design rule rather than a nicety. iCloud Private Relay is on by default in Safari for iCloud+ subscribers, most of whom did nothing but pay for storage. Commercial VPNs are ordinary consumer software, bought by ordinary consumers, often for exactly the reason you would want a customer to be careful. If the endpoint reported ip_country_differs_from_address_country for all of them, that flag would stop meaning anything, and any rule built on it would fall hardest on the people being most careful with their own data.
So the comparison is withheld and says so. That is a different thing from silence: the row is in the response, with both values quoted, so you can see the country that was not compared and why.
low_confidence is not the same as missing_value
Two reasons appear in withheld, and they mean different things.
withheld |
Cause | How to read it |
|---|---|---|
missing_value |
One of the two fields was null. An invalid phone number has no country; a reserved IP range has no location; an address the installed lists do not cover has no mail-drop answer. |
The data was not there. Nothing was established either way. |
low_confidence |
Both values are present, but the IP's country belongs to an operator rather than to the person. | The comparison was possible and was deliberately not made. |
Across every Spaw product a null means "not evaluated" and never "no", and both of these reasons exist so that neither case can quietly become a finding. If you store comparison results, keep withheld beside result; collapsing not_compared into false throws away the whole distinction.
What to read instead
Withholding the comparison does not hide the network. The IP block in the same response carries everything you need if the network is what you want to act on:
is_relay— an iCloud Private Relay egress, from Apple's own published list. It is a default for iCloud+ subscribers in Safari, not a signal of intent.is_vpnandprivacy_service— a known VPN exit, and which provider's own list named it.privacy_serviceis null for Tor and for ranges known only from an aggregate list.is_tor— a Tor exit, from the Tor Project's own data.is_datacenter,hosting_providerandasn_type— hosting rather than a consumer network, and whose. A signup arriving from a cloud provider is a different proposition from one arriving over a consumer VPN.location_sourceandlocation_confidence— whether the operator declared the location itself, and how far the city answer is to be trusted.
The IP product also publishes its own risk_score over those flags, with the weights documented. That score is about the network. The consistency report is about whether several signals describe the same person. Keeping them apart is the point: a VPN is a fact about the connection, and it should be weighed as one rather than smuggled in as a geography mismatch.
There is a whole guide on writing a policy that treats those flags proportionately: a VPN and relay policy that does not punish real people.
Two practical consequences
A flagged network is not a reason to ask for more signals. If a customer's IP is a relay egress, running the check again with a different address will not un-withhold the row. What you have is a phone-and-address comparison plus the network flags, and that is the honest total.
A withheld row is not a failed check. Some integrations treat any not_compared as a soft fail and add friction. That turns a privacy default into a penalty. If you need a rule that fires on network anonymity, write it against is_anonymous explicitly, so that it says what it does and can be explained to the person it affects.
What this does not tell you
- Where the person actually is. Nothing recovers that from a VPN exit, and nothing here tries.
- Whether the VPN was used to hide something. The flag says a network was used, not why.
- Anything about a datacenter address in isolation. Plenty of legitimate traffic comes from hosting: server-side integrations, corporate egress, tunnels.
asn_typeandhosting_providerare how you tell an obvious bot farm from a company VPN, and neither is decided here. - A verdict. As everywhere in this endpoint, there is no score, no risk level and no recommendation. The flags and the withheld reasons are the whole output, and the decision stays yours.
What to do next
- Read how to read a consistency report for the rest of the comparisons and the fields around them.
- Read the cross-signal consistency guide for the request shape and the withholding rules in full.
- Read the ip_country_differs_from_address_country reference page for the flag this rule prevents.
- Build the network half of your policy with a VPN and relay policy that does not punish real people.