HackMyIP

Bulk IP Lookup

Batch up to 50 IPs in one request — free geolocation and ISP, no key

Need geolocation and ISP data for a list of IPs at once? HackMyIP’s bulk endpoint takes up to 50 IPs in a single POST and returns a result per IP — free, no key, no signup. It is faster than 50 sequential calls and easier on rate limits. There is also an interactive bulk lookup tool if you would rather paste a list in the browser. Full reference in the API docs.

POST /api/bulk

Send a JSON body with an "ips" array (max 50):

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

Response — one row per IP with country, city, ISP, org, and coordinates:

{
  "success": true,
  "data": {
    "total": 3,
    "results": [
      { "ip": "8.8.8.8", "country": "US", "city": "...",
        "isp": "Google LLC", "org": "...", "lat": 0, "lon": 0 },
      { "ip": "1.1.1.1", "country": "...", "city": "...",
        "isp": "...", "org": "...", "lat": 0, "lon": 0 }
    ]
  }
}

Invalid or unresolvable entries come back as { "ip": "...", "error": "invalid format" } so one bad IP never fails the whole batch.

Code examples

JavaScript (fetch)

const res = await fetch('https://hackmyip.com/api/bulk', {
  method: 'POST',
  headers: { 'Content-Type': 'application/json' },
  body: JSON.stringify({ ips: ['8.8.8.8', '1.1.1.1', '9.9.9.9'] })
});
const { data } = await res.json();
data.results.forEach(r => console.log(r.ip, r.country, r.isp));

Python (requests)

import requests

ips = ['8.8.8.8', '1.1.1.1', '208.67.222.222']
r = requests.post('https://hackmyip.com/api/bulk', json={'ips': ips})
for row in r.json()['data']['results']:
    print(row['ip'], row.get('country'), row.get('isp'))

Looking up more than 50 IPs

The bulk endpoint caps each request at 50 IPs. For a larger list, either chunk it into batches of 50, or loop the single-IP /api/lookup endpoint when you need richer per-IP fields like the numeric ASN. Stay within 60 requests/minute:

import requests, time

ips = [ ... ]  # any number of IPs
for ip in ips:
    r = requests.get('https://hackmyip.com/api/lookup', params={'ip': ip})
    d = r.json()['data']
    print(ip, d['network']['asn'], d['network']['isp'])
    time.sleep(1)  # stay under 60 requests/minute

Frequently asked questions

Is there a free bulk IP lookup API?

Yes. HackMyIP’s POST /api/bulk takes a JSON array of up to 50 IPs per request and returns geolocation and ISP for each — no key, no signup. For more than 50 IPs, send multiple batches or loop the single-IP /api/lookup endpoint.

What about bulk IP WHOIS?

HackMyIP does not offer a bulk WHOIS endpoint. For network ownership, use the single-IP /api/lookup (returns ASN, ISP, and organization) or /api/asn?q={ip} per IP. The /api/whois endpoint is for domain RDAP, not IP WHOIS. Loop those endpoints over your list, respecting the 60 requests/minute limit.

How many IPs can I look up at once?

Up to 50 IPs per POST /api/bulk request. The endpoint caps the array at 50 and looks them up in parallel, so a batch is much faster than 50 sequential calls. Send additional batches for larger lists.

Bulk lookup tool Full API docs Single IP lookup