Copied to clipboard
Your IP Address
IPv4
216.73.217.34
IPv6
Checking...
Location
Columbus, Ohio
Country
πŸ‡ΊπŸ‡Έ United States
ISP
Amazon.com, Inc.
ASN
AS16509
VPN
No
Proxy
No
Tor
No
Hosting
No
Timezone
America/New_York
Coordinates
39.9612, -82.9988

Precise IP geolocation for modern applications

Get accurate location data from any IP address. City-level precision, real-time updates, and all lookups processed in-house for maximum privacy.

100%
In-house processing
193
Countries covered
>10M
External API calls
>15K
Active users
REST API

Simple, private API

All lookups are processed locally using our own geolocation database. No data is sent to third parties.

GET /api/lookup/my Get your own IP info
cURL
curl "https://ipaddress.to/api/lookup/my"
JavaScript
const res = await fetch('https://ipaddress.to/api/lookup/my');
const data = await res.json();
console.log(data);
Python
import requests

data = requests.get('https://ipaddress.to/api/lookup/my').json()
print(data)
PHP
$data = json_decode(
    file_get_contents('https://ipaddress.to/api/lookup/my'),
    true
);
print_r($data);
C#
using var client = new HttpClient();
var json = await client.GetStringAsync("https://ipaddress.to/api/lookup/my");
Console.WriteLine(json);
Go
resp, _ := http.Get("https://ipaddress.to/api/lookup/my")
body, _ := io.ReadAll(resp.Body)
fmt.Println(string(body))
Ruby
require 'net/http'
require 'json'

data = JSON.parse(Net::HTTP.get(URI('https://ipaddress.to/api/lookup/my')))
puts data
Java
HttpClient client = HttpClient.newHttpClient();
HttpRequest req = HttpRequest.newBuilder()
    .uri(URI.create("https://ipaddress.to/api/lookup/my")).build();
String body = client.send(req, BodyHandlers.ofString()).body();
System.out.println(body);
Perl
use LWP::Simple;
use JSON;

my $data = decode_json(get('https://ipaddress.to/api/lookup/my'));
print $data->{ip};
Rust
let body = reqwest::get("https://ipaddress.to/api/lookup/my")
    .await?.text().await?;
println!("{}", body);
Response
{
  "success": true,
  "ip": "203.45.167.89",
  "type": "IPv4",
  "country": "United States",
  "country_code": "US",
  "region": "California",
  "city": "San Francisco",
  "latitude": 37.7749,
  "longitude": -122.4194,
  "timezone": "America/Los_Angeles",
  "isp": "Cloudflare, Inc.",
  "asn": "AS13335"
}
GET /api/lookup/{ip_or_hostname} Lookup an IP address or hostname
ip_or_hostname optional
string
IPv4/IPv6 address or hostname. Omit to get your own IP info.
Example
curl "https://ipaddress.to/api/lookup/8.8.8.8"
Response
{
  "success": true,
  "ip": "8.8.8.8",
  "type": "IPv4",
  "rdns": "dns.google",
  "location": {
    "continent": "NA",
    "continent_name": "North America",
    "country": "United States",
    "country_code": "US",
    "state": "California",
    "city": "Mountain View",
    "latitude": 37.422,
    "longitude": -122.085,
    "timezone": "America/Los_Angeles",
    "is_eu_member": false,
    "calling_code": "1",
    "capital": "Washington, D.C.",
    "languages": "English",
    "country_tld": ".us",
    "currency": { "code": "USD", "name": "US Dollar" }
  },
  "asn": {
    "asn": 15169,
    "descr": "Google LLC",
    "country": "US",
    "org": "Google LLC"
  },
  "company": { "name": "Google LLC" },
  "is_vpn": false,
  "is_proxy": false,
  "is_tor": false,
  "is_hosting": false,
  "vpn_provider": null
}
GET /api/whois/{ip_or_domain} WHOIS/RDAP lookup (subdomains auto-stripped to root domain)
query required
string
IP address (v4/v6) or domain name to query
cURL
curl "https://ipaddress.to/api/whois/google.com"
JavaScript
const res = await fetch('https://ipaddress.to/api/whois/google.com');
const data = await res.json();
console.log(data.parsed.registrar); // "MarkMonitor Inc."
Python
import requests

data = requests.get('https://ipaddress.to/api/whois/google.com').json()
print(data['parsed']['registrar'])
PHP
$data = json_decode(
    file_get_contents('https://ipaddress.to/api/whois/google.com'),
    true
);
echo $data['parsed']['registrar'];
C#
using var client = new HttpClient();
var json = await client.GetStringAsync(
    "https://ipaddress.to/api/whois/google.com");
Console.WriteLine(json);
Go
resp, _ := http.Get("https://ipaddress.to/api/whois/google.com")
body, _ := io.ReadAll(resp.Body)
fmt.Println(string(body))
Perl
use LWP::Simple;
use JSON;

my $data = decode_json(get('https://ipaddress.to/api/whois/google.com'));
print $data->{parsed}{registrar};
Response (domain)
{
  "success": true,
  "query": "google.com",
  "type": "domain",
  "found": true,
  "parsed": {
    "domain_name": "GOOGLE.COM",
    "registrar": "MarkMonitor Inc.",
    "registrar_url": "https://rdap.markmonitor.com/rdap/domain/GOOGLE.COM",
    "registrar_iana_id": "292",
    "creation_date": "1997-09-15T04:00:00Z",
    "expiry_date": "2028-09-14T04:00:00Z",
    "updated_date": "2026-05-11T18:51:14Z",
    "status": ["client delete prohibited", "client transfer prohibited"],
    "nameservers": ["ns1.google.com", "ns2.google.com"],
    "dnssec": "unsigned",
    "abuse_email": "[email protected]",
    "abuse_phone": "tel:+1.2086851750"
  },
  "source": "rdap",
  "duration_ms": 342
}
GET /api/dns/{type}/{domain} DNS propagation checker across 40 global servers
type required
string
DNS record type: A, AAAA, CNAME, MX, NS, TXT, SOA, PTR, SRV, CAA
domain required
string
Domain to query (e.g., google.com)
server optional
string
Query a single DNS server IP instead of all 40. Pass as query param: ?server=8.8.8.8
cURL
curl "https://ipaddress.to/api/dns/a/google.com"
JavaScript
const res = await fetch('https://ipaddress.to/api/dns/mx/google.com');
const reader = res.body.getReader();
// Streams NDJSON β€” one result per line per server
Python
import requests, json
r = requests.get('https://ipaddress.to/api/dns/ns/google.com', stream=True)
for line in r.iter_lines():
    print(json.loads(line))

Response is NDJSON (streaming). Each line is a JSON object: start, result (Γ—40 servers), then done with propagation summary.

GET /api/resolve/{hostname} Resolve hostname to IP addresses
hostname required
string
Hostname to resolve (e.g., github.com)
cURL
curl "https://ipaddress.to/api/resolve/github.com"
JavaScript
const res = await fetch('https://ipaddress.to/api/resolve/github.com');
const data = await res.json();
console.log(data.a); // ["140.82.121.3"]
Python
import requests

data = requests.get('https://ipaddress.to/api/resolve/github.com').json()
for ip in data['a']:
    print(ip)
PHP
$data = json_decode(
    file_get_contents('https://ipaddress.to/api/resolve/github.com'),
    true
);
print_r($data['a']); // IPv4 addresses
C#
using var client = new HttpClient();
var json = await client.GetStringAsync(
    "https://ipaddress.to/api/resolve/github.com");
Console.WriteLine(json);
Go
resp, _ := http.Get("https://ipaddress.to/api/resolve/github.com")
body, _ := io.ReadAll(resp.Body)
fmt.Println(string(body))
Perl
use LWP::Simple;
use JSON;

my $data = decode_json(get('https://ipaddress.to/api/resolve/github.com'));
print join("\n", @{$data->{a}});
Response
{
  "success": true,
  "hostname": "github.com",
  "a": ["140.82.121.3"],
  "aaaa": [],
  "cname": [],
  "reverse": {
    "140.82.121.3": "lb-140-82-121-3-iad.github.com"
  },
  "total_ips": 1,
  "has_ipv4": true,
  "has_ipv6": false,
  "duration_ms": 87
}
GET /api/score/{ip_or_hostname} IP fraud risk score with threat indicators
ip_or_hostname optional
string
IP address or hostname to score. Use "my" or omit for your own IP.
cURL
curl "https://ipaddress.to/api/score/134.199.214.1"
JavaScript
const res = await fetch('https://ipaddress.to/api/score/134.199.214.1');
const data = await res.json();
console.log(data.score, data.risk, data.checks.hosting_asn);
// 54 "high" true
Python
import requests

data = requests.get('https://ipaddress.to/api/score/134.199.214.1').json()
print(f"Score: {data['score']}/100 ({data['risk']})")
print(f"Hosting: {data['checks']['hosting_asn']}")
PHP
$data = json_decode(
    file_get_contents('https://ipaddress.to/api/score/134.199.214.1'),
    true
);
echo $data['score'] . ' β€” ' . $data['risk'];
Response
{
  "success": true,
  "ip": "134.199.214.1",
  "score": 54,
  "risk": "high",
  "vpn_provider": null,
  "rdns": null,
  "location": {
    "country": "United States",
    "country_code": "US",
    "city": "Santa Clara",
    "currency": { "code": "USD", "name": "US Dollar" }
  },
  "asn": { "asn": 14061, "org": "DigitalOcean, LLC" },
  "company": { "name": "DigitalOcean, LLC", "type": "hosting" },
  "checks": {
    "hosting_asn": true,
    "datacenter_blocklist": true,
    "vpn_detected": false,
    "tor_exit": false,
    "blocklist_listed": true,
    "blocklist_count": 3,
    "has_rdns": false
  },
  "factors": [
    { "name": "Hosting/Datacenter ASN", "impact": "medium" },
    { "name": "No Reverse DNS", "impact": "low" },
    { "name": "Datacenter Confirmed", "impact": "medium" },
    { "name": "Threat Intelligence", "impact": "high" }
  ],
  "duration_ms": 45
}
Try it live

API Playground

Test all APIs directly in your browser.

Live Testing
Ready
β€”
// Click "Run Test" or a preset to make a request
Under the hood

A fraud score that shows its work.

Most commercial IP-intelligence APIs return one opaque number and ask you to trust it. We surface every signal that contributed to a verdict β€” datacentre vs residential, hosting vs ISP, why a network raised the risk β€” so you can debug a flagged user instead of guessing.

Privacy proxies, classified.

Consumer privacy relays, commercial VPN networks and residential-proxy infrastructure are each surfaced as their own category β€” not collapsed into a single "VPN" flag. That distinction matters when a real user behind a privacy proxy isn't a fraudster, but a paid residential-proxy customer almost always is.

A signal, not a black box.

The score draws on dozens of independent threat-intelligence inputs covering active C2 servers, brute-force sources, spam infrastructure, malware hosts, scanning, and abuse reports β€” refreshed continuously. The response tells you how many independent signals agreed on an IP, the severity of each, and the rDNS/ASN reasoning β€” not just a number you have to take on faith.

Real users don't get hit.

Major hyperscale and CDN infrastructure is verified by ASN + reverse-DNS before any blocklist match is applied, so legitimate traffic from well-known public networks can't be mistaken for fraud. Competing services we benchmarked tag some of the largest public DNS resolvers as "abusers" β€” that's a real correctness problem if you're gating signups or comments.

Local-first. No per-query bill.

Every lookup is an indexed query against an in-house database β€” no external call-out per request, no API key, no rate ladder. The free tier is genuinely unlimited, and a /60-second result cache means repeat lookups of the same IP are sub-100 ms across the board.

14 / 16 correct classifications in a recent benchmark across a curated set of network categories β€” vs 10–11 for the two leading paid services on the same IPs.
64 ms median latency on cached lookups (60-second TTL). Cold-cache calls do additional resolution work, so the first hit on a new IP is slower β€” a trade-off we made for accuracy.
$0 marginal cost per query at any volume. The two paid services we benchmarked charge $7–$25 per month at 100k queries, $30–$200 at a million.

Benchmark: 240 live requests across three services, May 2026, spanning trusted infrastructure, datacentres, commercial VPNs, anonymising relays, an active proxy and a multi-feed attacker. Try the API on any IP →