Skip to content

Why a VPN withholds the country comparisons

published · September 10, 2026

A VPN exit, a relay or a datacenter egress locates the operator, not the person. What low_confidence withholds, what it does not, and what to read instead.

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 — withheld
  • ip_phone_country — withheld
  • ip_address_distance — withheld too, because it is measured only once the countries already agree and location_confidence is high

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_vpn and privacy_service — a known VPN exit, and which provider's own list named it. privacy_service is 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_provider and asn_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_source and location_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_type and hosting_provider are 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

Related

markdown version: /guides/why-a-vpn-withholds-the-country-comparisons.md

Verify addresses the same way

The Spaw API runs every check described here on each lookup, with an SMTP handshake that never sends mail. 10 free lookups a month, no card required.

Get your API key

More guides

  • How to read a consistency report

    Four fields, ten comparisons, both sides of each one quoted, and deliberately no score. A field-by-field reading, and how to write a rule you can defend.

  • When two weak signals coincide

    A burner mailbox is common. A datacenter address is common. Both on one signup is not. The four pairing comparisons, and the rule that keeps them honest.

  • A LEI check digit is a typing check

    Twenty characters ending in an ISO 7064 checksum. What checksum_valid settles, what only a register can settle, and why the two are reported side by side.

  • How a UK dissolution shows up in open data

    The free company file is a snapshot of the live register, so a struck-off company is removed rather than marked dissolved. What to watch instead.

  • When two registers disagree about a company

    A LEI record and a national register can carry different names and different statuses for one company. What Spaw compares, what it refuses to resolve, and why.

  • A UK postcode is not an address

    What open postcode data answers, what it cannot, and what a Postcode Address File licence actually buys — with the numbers from the copies installed here.

  • How to read an address-existence answer

    Premise, street and postcode matches prove different things, and absence from a partial register proves nothing at all. A field-by-field reading of exists.

  • Stop OTP abuse with block data and disposable numbers

    Which numbers soak up one-time codes and free trials, the four open signals that catch them, and a signup policy that does not punish real people.