Free IP Geolocation API (No Key Required)

10 endpoints: IP geolocation, IP lookup, email breach checking, privacy scoring, DNS, WHOIS, reverse DNS, blacklist check, website status, and bulk lookup. No API key required. JSON response, CORS enabled. Please keep it under 100 requests per minute.

$ curl https://hackmyip.com/api/ip
Run a live request →
No API KeyStart making requests immediately. No signup, no authentication.
JSON ResponseClean JSON format. Easy to parse in any language.
CORS EnabledAccess-Control-Allow-Origin: * — use from any domain.
Edge NetworkServed from Cloudflare's global edge. Low latency worldwide.

Copy-paste examples

7 of the 10 endpoints on this page have a curl, JavaScript (fetch) and Python (requests) example with a copy button: /api/ip, /api/lookup, /api/score, /api/dns, /api/whois, /api/rdns and /api/blacklist. Pick a language once and every example switches. We ran each example against the live API on 2026-10-25 and show the response it returned; /api/ip and /api/score show your own connection instead.

GET /api/ip

Returns the requesting client's IP address and geolocation data.

GET https://hackmyip.com/api/ip

Example Request

curl
curl https://hackmyip.com/api/ip
JavaScript (fetch)
fetch('https://hackmyip.com/api/ip')
  .then(r => r.json())
  .then(res => console.log(res.data.ip, res.data.location.country, res.data.network.isp));
Python (requests)
import requests

res = requests.get('https://hackmyip.com/api/ip', timeout=10).json()
print(res['data']['ip'], res['data']['location']['country'], res['data']['network']['isp'])

Example Response

{
  "success": true,
  "data": {
    "ip": "2a06:98c0:3600::103",
    "location": {
      "city": "Columbus",
      "region": "Ohio",
      "country": "US",
      "country_name": "US",
      "continent": "NA",
      "latitude": "39.96118",
      "longitude": "-82.99879",
      "timezone": "America/New_York",
      "postal_code": "43215"
    },
    "network": {
      "asn": 13335,
      "isp": "Cloudflare, Inc.",
      "connection_type": "HTTP/2",
      "tls_version": "TLSv1.3"
    },
    "privacy": {
      "type": "datacenter",
      "score": 80,
      "grade": "A",
      "is_vpn": false,
      "is_datacenter": true,
      "is_residential": false,
      "hosting": false,
      "proxy": false
    },
    "is_eu": false,
    "ipv6": true
  }
}

Full response, built from your own connection as our edge sees it. When the upstream network lookup answers, location.country_name is the full country name and city, region, isp, privacy.hosting and privacy.proxy come from that lookup. Field list in the OpenAPI spec.

Response Fields

successbooleanEnvelope flag — every response is wrapped as { success, data }
data.ipstringPublic IP address (IPv4 or IPv6)
data.location.citystringCity based on IP geolocation
data.location.regionstringState or region
data.location.countrystringISO 3166-1 alpha-2 country code
data.location.country_namestringFull country name
data.location.continentstringContinent code (NA, EU, AS, etc.)
data.location.latitudestringApproximate latitude coordinate
data.location.longitudestringApproximate longitude coordinate
data.location.timezonestringIANA timezone identifier
data.location.postal_codestringPostal or ZIP code
data.network.asnnumberAutonomous System Number
data.network.ispstringISP or organization name
data.network.connection_typestringHTTP protocol version (HTTP/1.1, HTTP/2, HTTP/3)
data.network.tls_versionstringTLS version of the connection
data.privacyobjecttype, score, grade, is_vpn, is_datacenter, is_residential, hosting, proxy
data.is_eubooleanWhether the IP is in an EU country
data.ipv6booleanWhether the caller connected over IPv6

GET /api/lookup

Look up geolocation data for a specific IP address.

GET https://hackmyip.com/api/lookup?ip=8.8.8.8

Parameters

ipstringRequired. IPv4 or IPv6 address to look up.

Example Request

curl
curl "https://hackmyip.com/api/lookup?ip=8.8.8.8"
JavaScript (fetch)
fetch('https://hackmyip.com/api/lookup?ip=8.8.8.8')
  .then(r => r.json())
  .then(res => console.log(res.data.location.country_name, res.data.network.isp, res.data.privacy.hosting));
Python (requests)
import requests

res = requests.get('https://hackmyip.com/api/lookup', params={'ip': '8.8.8.8'}, timeout=10).json()
print(res['data']['location']['country_name'], res['data']['network']['isp'], res['data']['privacy']['hosting'])

Example Response

{
  "success": true,
  "data": {
    "ip": "8.8.8.8",
    "location": {
      "city": "Ashburn",
      "region": "Virginia",
      "country": "US",
      "country_name": "United States",
      "latitude": 39.03,
      "longitude": -77.5,
      "timezone": "America/New_York",
      "postal_code": "20149"
    },
    "network": {
      "asn": 15169,
      "isp": "Google LLC",
      "org": "Google Public DNS"
    },
    "privacy": {
      "hosting": true,
      "proxy": true,
      "mobile": false
    }
  }
}

Real response for 8.8.8.8 (2026-10-25). Results are cacheable for an hour. If the upstream lookup is briefly unavailable you get HTTP 503 with "success": false and an error message, so retry after a few seconds.

Usage Notes

This API is free for personal and commercial use. Please keep it under 100 requests per minute, the limit our response headers advertise (X-RateLimit-Limit: 100, X-RateLimit-Window: 60). The /api/v1/ endpoints are capped at 60 requests per minute. The API is powered by Cloudflare Workers and served from edge locations worldwide for minimal latency.

For high-volume usage or dedicated support, please reach out.

README Badge

Using the API in a project? Add the badge to your README so your users know where the IP data comes from. It renders fine through GitHub's image proxy:

IP data by HackMyIP

Markdown

[![IP data by HackMyIP](https://hackmyip.com/badge.svg)](https://hackmyip.com/api)

HTML

<a href="https://hackmyip.com/api"><img src="https://hackmyip.com/badge.svg" alt="IP data by HackMyIP"></a>

GET /api/breach

Check if an email address has been exposed in data breaches. Scans known breach databases (XposedOrNot).

GET https://hackmyip.com/api/breach?email=user@example.com

Parameters

emailstringEmail address to check (required)

Example Request

# cURL curl "https://hackmyip.com/api/breach?email=user@example.com" # JavaScript fetch('https://hackmyip.com/api/breach?email=user@example.com') .then(r => r.json()) .then(data => console.log(data.data.breaches));

Example Response

{ "success": true, "data": { "email": "use***@example.com", "status": "checked", "breaches": 13, "services": ["Adobe", "Canva", "LinkedIn", ...], "risk": { "score": 71, "level": "high" }, "passwords": { "plain_text": 3, "weak_hash": 2, "strong_hash": 3, "unknown": 0, "total": 8 } } }

Sample response: the fields match the live endpoint, but the values are illustrative, not a real lookup. When the breach database cannot be reached the endpoint answers "status": "unavailable" instead of a false clean result.

GET /api/score

Get your IP's privacy and cleanliness score. Detects VPN, datacenter, or residential IP.

GET https://hackmyip.com/api/score

Example Request

curl
curl https://hackmyip.com/api/score
JavaScript (fetch)
fetch('https://hackmyip.com/api/score')
  .then(r => r.json())
  .then(res => console.log(res.data.privacy.type, res.data.privacy.score, res.data.privacy.grade));
Python (requests)
import requests

res = requests.get('https://hackmyip.com/api/score', timeout=10).json()
print(res['data']['privacy']['type'], res['data']['privacy']['score'], res['data']['privacy']['grade'])

Example Response

{
  "success": true,
  "data": {
    "ip": "2a06:98c0:3600::103",
    "location": {
      "city": "Columbus",
      "country": "US",
      "timezone": "America/New_York"
    },
    "network": {
      "isp": "Cloudflare, Inc.",
      "asn": 13335,
      "tls_version": "TLSv1.3"
    },
    "privacy": {
      "type": "datacenter",
      "score": 80,
      "grade": "A",
      "label": "Clean",
      "flags": [
        "Hosting/datacenter IP - your real IP is hidden",
        "IPv6 address"
      ],
      "is_vpn": false,
      "is_datacenter": true,
      "is_residential": false
    },
    "ipv6": true
  }
}

Your own result: this is exactly what /api/score returns for your connection right now.

GET /api/dns

DNS record lookup for any domain. Supports A, AAAA, MX, NS, TXT, CNAME, CAA, SOA.

GET https://hackmyip.com/api/dns?domain=github.com&type=MX

Example Request

curl
curl "https://hackmyip.com/api/dns?domain=github.com&type=MX"
JavaScript (fetch)
fetch('https://hackmyip.com/api/dns?domain=github.com&type=MX')
  .then(r => r.json())
  .then(res => res.data.records.forEach(rec => console.log(rec.data, rec.TTL)));
Python (requests)
import requests

res = requests.get('https://hackmyip.com/api/dns', params={'domain': 'github.com', 'type': 'MX'}, timeout=10).json()
for rec in res['data']['records']:
    print(rec['data'], rec['TTL'])

Example Response

{
  "success": true,
  "data": {
    "domain": "github.com",
    "type": "MX",
    "status": 0,
    "records": [
      {
        "name": "github.com",
        "type": 15,
        "TTL": 177,
        "data": "0 github-com.mail.protection.outlook.com."
      }
    ],
    "authority": []
  }
}

Real response (2026-10-25). status is the DNS response code (0 = no error, 3 = domain does not exist) and type inside each record is the numeric record type (15 = MX).

GET /api/whois

WHOIS / RDAP registration data for a domain: registrar, creation date, expiration, name servers.

GET https://hackmyip.com/api/whois?domain=github.com

Example Request

curl
curl "https://hackmyip.com/api/whois?domain=github.com"
JavaScript (fetch)
fetch('https://hackmyip.com/api/whois?domain=github.com')
  .then(r => r.json())
  .then(res => console.log(res.data.registrar, res.data.creation_date, res.data.expiration_date));
Python (requests)
import requests

res = requests.get('https://hackmyip.com/api/whois', params={'domain': 'github.com'}, timeout=10).json()
print(res['data']['registrar'], res['data']['creation_date'], res['data']['expiration_date'])

Example Response

{
  "success": true,
  "data": {
    "domain": "GITHUB.COM",
    "registrar": "MarkMonitor Inc.",
    "creation_date": "2007-10-09T18:20:50Z",
    "expiration_date": "2028-10-09T18:20:50Z",
    "last_updated": "2026-09-07T09:22:52Z",
    "name_servers": [
      "DNS1.P08.NSONE.NET",
      "DNS2.P08.NSONE.NET",
      "DNS3.P08.NSONE.NET",
      "DNS4.P08.NSONE.NET",
      "NS-1283.AWSDNS-32.ORG",
      "NS-1707.AWSDNS-21.CO.UK",
      "NS-421.AWSDNS-52.COM",
      "NS-520.AWSDNS-01.NET"
    ],
    "status": [
      "client delete prohibited",
      "client transfer prohibited",
      "client update prohibited"
    ],
    "rdap_link": "https://rdap.verisign.com/com/v1/domain/github.com"
  }
}

Real response (2026-10-25).

GET /api/rdns

Reverse DNS — resolves an IP address to its PTR hostname.

GET https://hackmyip.com/api/rdns?ip=8.8.8.8

Example Request

curl
curl "https://hackmyip.com/api/rdns?ip=8.8.8.8"
JavaScript (fetch)
fetch('https://hackmyip.com/api/rdns?ip=8.8.8.8')
  .then(r => r.json())
  .then(res => console.log(res.data.hostname));
Python (requests)
import requests

res = requests.get('https://hackmyip.com/api/rdns', params={'ip': '8.8.8.8'}, timeout=10).json()
print(res['data']['hostname'])

Example Response

{
  "success": true,
  "data": {
    "ip": "8.8.8.8",
    "hostname": "dns.google",
    "ptr_record": "8.8.8.8.in-addr.arpa"
  }
}

Real response (2026-10-25).

GET /api/blacklist

Check an IPv4 against 12 spam / abuse DNSBLs (Spamhaus ZEN, Barracuda, SpamCop, UCEPROTECT, and more).

GET https://hackmyip.com/api/blacklist?ip=8.8.8.8

Example Request

curl
curl "https://hackmyip.com/api/blacklist?ip=8.8.8.8"
JavaScript (fetch)
fetch('https://hackmyip.com/api/blacklist?ip=8.8.8.8')
  .then(r => r.json())
  .then(res => console.log(res.data.status, res.data.listed_count, res.data.total_checked));
Python (requests)
import requests

res = requests.get('https://hackmyip.com/api/blacklist', params={'ip': '8.8.8.8'}, timeout=20).json()
print(res['data']['status'], res['data']['listed_count'], res['data']['total_checked'])

Example Response

{
  "success": true,
  "data": {
    "ip": "8.8.8.8",
    "total_lists": 12,
    "total_checked": 8,
    "unavailable_count": 4,
    "listed_count": 0,
    "clean": true,
    "status": "CLEAN",
    "results": [
      {
        "name": "Spamhaus ZEN",
        "zone": "zen.spamhaus.org",
        "desc": "Combined spam/exploit/policy blocklist",
        "listed": false,
        "status": "unavailable",
        "response": null
      },
      {
        "name": "Barracuda",
        "zone": "b.barracudacentral.org",
        "desc": "Barracuda reputation block list",
        "listed": false,
        "status": "not_listed",
        "response": null
      }
    ]
  }
}

Real response (2026-10-25), results trimmed to 2 of its 12 entries. A list that does not answer is counted in unavailable_count, never as listed.

GET /api/down

Is a website up or down. Returns HTTP status code and response time in ms.

GET https://hackmyip.com/api/down?url=example.com

Example Request

curl "https://hackmyip.com/api/down?url=example.com"

Example Response

{ "success": true, "data": { "url": "https://example.com", "is_up": true, "status_code": 200, "status_text": "OK", "response_time_ms": 7, "server": "cloudflare", "content_type": "text/html; charset=utf-8", "powered_by": null, "note": null, "checked_at": "2026-10-25T05:33:08.203Z" } }

Real response from hackmyip.com (2026-10-25).

POST /api/bulk

Batch lookup up to 50 IPs in a single POST request. Faster than sequential /api/lookup calls.

POST https://hackmyip.com/api/bulk

Example Request

curl -X POST -H "Content-Type: application/json" \ -d '{"ips":["8.8.8.8","1.1.1.1"]}' \ https://hackmyip.com/api/bulk

Example Response

{ "success": true, "data": { "total": 2, "results": [ { "ip": "8.8.8.8", "country": "US", "city": "Ashburn", "isp": "Google LLC", "org": "Google Public DNS", "lat": 39.03, "lon": -77.5 }, { "ip": "1.1.1.1", "country": "AU", "city": "South Brisbane", "isp": "Cloudflare, Inc", "org": "APNIC and Cloudflare DNS Resolver project", "lat": -27.4766, "lon": 153.0166 } ] } }

npm Package

Use our official JavaScript client for easy integration:

# Install npm install hackmyip # Usage const { getMyIP, checkBreach, getPrivacyScore } = require('hackmyip'); const ip = await getMyIP(); const breach = await checkBreach('user@example.com'); const score = await getPrivacyScore();

GitHub: github.com/Hackmyip/hackmyip-js

Using the API? Add a badge

Show off that your project runs on the free HackMyIP API with an embeddable SVG badge. Drop it in your README or site — one line of Markdown:

IP API: hackmyip

[![IP API](https://hackmyip.com/badge/api.svg)](https://hackmyip.com)

Browse all badges & trust seals →