Copied to clipboard
Your IPv4 address
Checking...
Your IPv6 address
2a06:98c0:3600::103
Location
Portland, Oregon
Country
🇺🇸 United States
ISP
VPN
No
Proxy
No
Tor
No
ASN
Timezone
America/Los_Angeles
Coordinates
45.5152, -122.6780
Currency
USD — US Dollar
Local Time
16:52 (-07:00)

What is my IP?

Your public IP address is what websites, APIs and online services see when you connect — it reveals your approximate location, ISP and network. IPAddress.to gives you instant lookups for any IP, plus DNS, WHOIS and hostname tools, all processed in-house. Run our fraud score to check whether an IP is a VPN, proxy, Tor exit or known-abusive host before you trust it.

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 →