IP labelling explained, and how to check an IP's type
Residential, ISP or datacenter is a label a provider puts on an IP. Here is how to look up who owns an address and check the label with free tools.
When a provider sells you a "residential" or "US" proxy, that word is a label. The label is what you pay for, and on cheap proxies it is the part most often wrong: datacenter addresses sold as residential, or an IP billed as one country that exits in another.
You do not have to take the label on trust. Who owns an IP address is public information, and you can look it up in a couple of minutes with free tools.
What the label is made of
Every public IP address belongs to a block announced by one network. That network has an autonomous system number (ASN) and a registered organisation name. From there:
- Datacenter means the announcing network is a hosting company or cloud provider.
- ISP means a static address announced by a consumer internet provider, hosted on a server.
- Residential means an address a consumer internet provider has handed to a home connection, which changes as the pool rotates.
Commercial IP databases add their own guesses on top: a "hosting" flag, a "proxy" flag, a city. Those are useful signals and they are often out of date, so treat them as a second opinion.
Step one: find your exit IP
Ask an echo service what address it sees, through the proxy. HOST, PORT, USERNAME and PASSWORD are placeholders; our dashboard shows the real values on each service's page.
curl -s -x http://USERNAME:PASSWORD@HOST:PORT https://api.ipify.org
For a rotating product, run it several times. Each run shows a different address, and you want to check a handful of them.
Step two: look up who announces it
Run these from your own connection. There is no need to send the lookups through the proxy.
import requests
ip = input("Exit IP from step one: ").strip()
network = requests.get(
"https://stat.ripe.net/data/network-info/data.json",
params={"resource": ip}, timeout=30,
).json()["data"]
asn = network["asns"][0]
holder = requests.get(
"https://stat.ripe.net/data/as-overview/data.json",
params={"resource": f"AS{asn}"}, timeout=30,
).json()["data"]["holder"]
flags = requests.get(
f"http://ip-api.com/json/{ip}",
params={"fields": "status,country,city,isp,org,as,hosting,proxy"}, timeout=30,
).json()
print(f"{ip} AS{asn} {holder}")
print(flags)
RIPEstat answers for addresses worldwide, and the ASN holder it returns is the fact that matters most. ip-api's free endpoint adds a country, a city and its own hosting and proxy flags. From a terminal, whois -h whois.cymru.com " -v EXIT_IP" gives the ASN and holder in one line.
Step three: read the result
- Sold as datacenter: the holder is a hosting or cloud company and
hostingis usually true. That is correct, and it is fine. - Sold as ISP: the holder should be a consumer internet provider. Some databases still flag these as hosting, because the server sits in a data centre. Weigh the ASN holder above the flag.
- Sold as residential: across several samples you should see a spread of consumer internet providers. A run of addresses from one hosting company is the classic sign of a relabelled pool.
- Country: for a line with country targeting, the lookup's country should match what you ordered. City data in free databases is rough, so a nearby city is not evidence of anything.
A proxy: true flag on its own tells you little. Any address that has carried proxy traffic tends to end up flagged, whatever network it belongs to.
When the label is wrong
Write down the IP, the time, and what the lookups returned, and send it to the provider. A decent one will want it.
With us, a mislabelled IP is covered on the honesty page: tell us, and we credit the traffic you spent on it back to your account and pull the address from the pool. Our ISP and datacenter lines let you pick the country, region and city, so those are the ones where a country mismatch is ours to fix. Our residential line rotates without a country choice, so on residential check the network type rather than the country.
Found something odd? Post the lookup output in Discord and we will look at it in the open.