Ahmad Awais

SHARE


What Is the Best API for Geolocating an IP Address?

Ahmad AwaisAhmad Awais

While working on a recent project for a client, I found myself in the need of a good and reasonably reliable Geolocation API to find out more about a user that visits your site.

So, I did a little research for currently available APIs and came up with somewhat an exhaustive list. That is what I plan to share today.

I would use a web service that can return JSON data. Below are all the free *active* IP lookup services I could find and the information they return. If you know of any more, then do add a comment below. If you own one, reach out to me through the contact form, I’d love to talk.

🌟 IPStack → (recommended)

Remember FreeGEOIP.net? Well, it is now called IPStack. It has much better offerings, good enough free package, and affordable premium packages.

IPStack offers so much more inside the API response that has made me not only use IPStack for personal use but I also recommend you to take a look:

ipstack

Just use this link https://api.ipstack.com/check?access_key=YOUR_ACCESS_KEY with the language of your choice to get all the details for more details, read the documentation →

Returns:

Pros:

Limitations:

var ip = "39.45.220.245";
var api_key = "your_api_key";
$(function () {
	$.ajax({
		url: "https://geoipify.whoisxmlapi.com/api/v1",
		dataType: "jsonp",
		data: {
			apiKey: api_key,
			ipAddress: ip
		},
		success: function (data) {
			console.log(JSON.stringify(data, "", 2));
		}
	});
});

Returns:

Result for 39.45.220.245
Country: PK
Region: Punjab
City: Sialkot
Latitude: 32.5101
Longitude: 74.54313
Postal code: 51260
Time zone offset by UTC: +05:00

Pros:

Limitations:

//api.db-ip.com/addrinfo?api_key=<*your api key*>&addr=<*ip address*>

Returns:

{
"address": "119.152.180.314",
"country": "PK",
"stateprov": "Central Pakistan",
"city": "Pakistan"
}

Limitations:

– 2,500 requests per hour
– Doesn’t support JSONP callbacks
– Requires IP address parameter
– Requires an email address to get your API key

$.getJSON( '//gd.geobytes.com/GetCityDetails?callback=?', function( data ) {
console.log( JSON.stringify( data, null, 2 ) );
});

Returns:

{
"geobytesforwarderfor": "",
"geobytesremoteip": "119.152.180.314",
"geobytesipaddress": "119.152.180.314",
"geobytescertainty": "99",
"geobytesinternet": "SA",
"geobytescountry": "Saudi Arabia",
"geobytesregionlocationcode": "SASH",
"geobytesregion": "Ash Sharqiyah",
"geobytescode": "SH",
"geobyteslocationcode": "SASHJUBA",
"geobytescity": "Jubail",
"geobytescityid": "13793",
"geobytesfqcn": "Jubail, SH, Saudi Arabia",
"geobyteslatitude": "27.004999",
"geobyteslongitude": "49.660999",
"geobytescapital": "Riyadh ",
"geobytestimezone": "+03:00",
"geobytesnationalitysingular": "Saudi Arabian ",
"geobytespopulation": "22757092",
"geobytesnationalityplural": "Saudis",
"geobytesmapreference": "Middle East ",
"geobytescurrency": "Saudi Riyal",
"geobytescurrencycode": "SAR",
"geobytestitle": "Saudi Arabia"
}

Limitations:

– 16,384 requests per hour
– Can return the wrong location (I am not in Saudi Arabia)

$.getJSON( '//geoip.nekudo.com/api/', function( data ) {
console.log( JSON.stringify( data, null, 2 ) );
});

Returns:

{
"city": "Pakistan",
"country": {
"name": "Pakistan",
"code": "PK"
},
"location": {
"accuracy_radius": 50,
"latitude": 1.2855,
"longitude": 103.8565,
"time_zone": "Asia/Karachi"
},
"ip": "119.152.180.314"
}

Limitations:

– Requires IP address parameter

$.getJSON( '//www.geoplugin.net/json.gp?jsoncallback=?', function( data ) {
console.log( JSON.stringify( data, null, 2 ) );
});

Returns:

{
"geoplugin_request": "119.152.180.314",
"geoplugin_status": 200,
"geoplugin_credit": "Some of the returned data includes GeoLite data created by MaxMind, available from http://www.maxmind.com.",
"geoplugin_city": "Pakistan",
"geoplugin_region": "Pakistan ( general )",
"geoplugin_areaCode": "0",
"geoplugin_dmaCode": "0",
"geoplugin_countryCode": "PK",
"geoplugin_countryName": "Pakistan",
"geoplugin_continentCode": "AS",
"geoplugin_latitude": "31.5497",
"geoplugin_longitude": "103.855797",
"geoplugin_regionCode": "00",
"geoplugin_regionName": "Pakistan ( general )",
"geoplugin_currencyCode": "PKD",
"geoplugin_currencySymbol": "Rs.",
"geoplugin_currencySymbol_UTF8": "Rs.",
"geoplugin_currencyConverter": 1.4239
}

Limitations:

– 120 requests per minute

$.getJSON( '//ip-api.com/json?callback=?', function( data ) {
console.log( JSON.stringify( data, null, 2 ) );
});

Returns:

{
"as": "PTCL",
"city": "Pakistan",
"country": "Pakistan",
"countryCode": "PK",
"isp": "PTCL Pte Ltd",
"lat": 31.5497,
"lon": 74.3436,
"org": "Pakistan Telecommunications",
"query": "119.152.180.314",
"region": "01",
"regionName": "Central Pakistan Community Development Council",
"status": "success",
"timezone": "Asia/Karachi",
"zip": ""
}

Limitations:

– 150 requests per minute

$.getJSON( '//api.ipify.org?format=jsonp&callback=?', function( data ) {
console.log( JSON.stringify( data, null, 2 ) );
});

Returns:

{
"ip": "119.152.180.314"
}

Limitations:

– None ( unlimited bandwidth )

$.getJSON( '//ipinfo.io/json', function( data ) {
console.log( JSON.stringify( data, null, 2 ) );
});

Returns:

{
"ip": "119.152.180.314",
"hostname": "No Hostname",
"city": "Pakistan",
"region": "Central Pakistan Community Development Council",
"country": "PK",
"loc": "31.5497,74.3436",
"org": "AS3758 SingNet"
}

Limitations:

– 1,000 requests per day

$.getJSON( '//api.ipinfodb.com/v3/ip-city/?key=&format=json&callback=?', function( data ) {
console.log( JSON.stringify( data, null, 2 ) );
});

Returns:

{
"statusCode": "OK",
"statusMessage": "",
"ipAddress": "119.152.180.314",
"countryCode": "PK",
"countryName": "Pakistan",
"regionName": "Pakistan",
"cityName": "Pakistan",
"zipCode": "54000",
"latitude": "1.28967",
"longitude": "103.85",
"timeZone": "+08:00"
}

Limitations:

– Two requests per second
– Requires registration to get your API key

$.getJSON( '//jsonip.com/?callback=?', function( data ) {
console.log( JSON.stringify( data, null, 2 ) );
});

Returns:

{
"ip": "119.152.180.314",
"about": "/about",
"Pro!": "http://getjsonip.com"
}

Limitations:

– None ( unlimited bandwidth )

$.getJSON( '//ip.jsontest.com/?callback=?', function( data ) {
console.log( JSON.stringify( data, null, 2 ) );
});

Returns:

{
"ip": "119.152.180.314"
}

Limitations:

– Goes down a lot ( over quota ), so I wouldn’t use it for production.

$.get("https://api.ipdata.co", function (response) {
$("#response").html(JSON.stringify(response, null, 4));
}, "jsonp"); Here's a JSFiddle

Returns:

{
    "ip": "39.45.201.56",
    "city": "Sialkot",
    "region": "Punjab",
    "region_code": "PB",
    "country_name": "Pakistan",
    "country_code": "PK",
    "continent_name": "Asia",
    "continent_code": "AS",
    "latitude": 32.4228,
    "longitude": 74.2898,
    "asn": "AS45595",
    "organisation": "Pakistan Telecom Company Limited",
    "postal": "51310",
    "calling_code": "92",
    "flag": "https://ipdata.co/flags/pk.png",
    "emoji_flag": "🇵🇰",
    "emoji_unicode": "U+1F1F5 U+1F1F0",
    "is_eu": false,
    "languages": [
        {
            "name": "English",
            "native": "English"
        },
        {
            "name": "Urdu",
            "native": "اردو",
            "rtl": 1
        }
    ],
    "currency": {
        "name": "Pakistani Rupee",
        "code": "PKR",
        "symbol": "PKRs",
        "native": "₨",
        "plural": "Pakistani rupees"
    },
    "time_zone": {
        "name": "Asia/Karachi",
        "abbr": "PKT",
        "offset": "+0500",
        "is_dst": false,
        "current_time": "2018-04-18T21:22:54.352584+05:00"
    },
    "threat": {
        "is_tor": false,
        "is_proxy": false,
        "is_anonymous": false,
        "is_known_attacker": false,
        "is_known_abuser": false,
        "is_threat": false,
        "is_bogon": false
    }
}

Pros:

Limitations:

//api.ipgeolocation.io/ipgeo?apiKey=API_KEY

Returns:

{
"ip": "39.45.201.56",
"continent_code": "AS",
"continent_name": "Asia",
"country_code2": "PK",
"country_code3": "PAK",
"country_name": "Pakistan",
"country_capital": "Islamabad",
"state_prov": "Khyber Pakhtunkhwa",
"district": "Peshawar",
"city": "Peshawar",
"zipcode": "25120",
"latitude": "34.015",
"longitude": "71.5805",
"is_eu": false,
"calling_code": "+92",
"country_tld": ".pk",
"languages": "ur-PK,en-PK,pa,sd,ps,brh",
"country_flag": "https://ipgeolocation.io/static/flags/pk_64.png",
"isp": "PTCL Triple Play Project Sialkot",
"connection_type": "",
"organization": "Pakistan Telecommuication company limited",
"geoname_id": "1168197",
"currency": {
"name": "Rupee",
"code": "PKR"
},
"time_zone": {
"name": "Asia/Karachi",
"offset": 5,
"is_dst": false,
"current_time": "2018-06-16 16:07:07.708+0500"
    }
}

Pros:

Limitations:

//api.snoopi.io/v1/?apikey=<*your api key*>&user_ip_address=<*ip address*>

Returns:

{
"remote_address": "119.152.180.314",
"requested_address": "119.152.180.314",
"requested_time": "11:25:35 pm",
"requested_date": "January 31, 2017",
"CountryCode": "PK",
"Region": null,
"Region_Full": "Pakistan",
"City": "Lahore",
"PostalZip": "54000",
"TimeZone_Name": "Asia\/Pakistan",
"Latitude": "31.5497",
"Longitude": "74.3436"
}

Limitations:

– 2,500 requests per day
– Doesn’t support JSONP callbacks
– Requires IP address parameter
– Requires registration to get your API key

Before You Begin!

Keep in mind that since these are all free services, your mileage may vary in terms of exceeding quota and uptime, and who knows when/if they will be taken offline down the road. Most of these services also offer a paid tier in case you want something more robust.

It’d be a good thing if you tweet this list. No pressure!

🎩

WPTakeaway: Premium WordPress Newsletter!

Takeaway my professional opinion about Full Stack WordPress Development, building a business, growing a family, and everything web! Delivered to your inbox twice a month. 👻 I hate spam! Pinky Promise!

🔥 Ridiculously hard-working Full Stack Web DeveloperRegular WordPress Core Contributor 📣 TEDx Speaker ✌️ Spends 50% of his time building FOSS (Free & Open Source Software) used by over 30,000 Developers 🎖 WordPress Advocate & 🙌 Community Evangelist 🎯 JavaScript & DevOps fanboy 😂 Cracks silly jokes 💜 Loves his wife (Maedah) 🍕 Learn more about Ahmad ↣

Say 👋 on Twitter @MrAhmadAwais | Subscribe to the WordPress Takeaway!