I would use a web service that can return JSON (along with jQuery to make things simpler). Below are all the free active IP lookup services I could find and the information they return. If you know of any more, then please add a comment and I'll update this answer.
http://api.db-ip.com/addrinfo?api_key=<your_api_key>&addr=<your_ip_address>
Returns:
{
"address": "116.12.250.1",
"country": "SG",
"stateprov": "Central Singapore",
"city": "Singapore"
}
Limitations:
- 2,500 requests per hour
- Doesn't support JSONP callbacks
- Requires IP address parameter
$.getJSON('//gd.geobytes.com/GetCityDetails?callback=?', function(data) {
console.log(JSON.stringify(data, null, 2));
});
Returns:
{
"geobytesforwarderfor": "",
"geobytesremoteip": "116.12.250.1",
"geobytesipaddress": "116.12.250.1",
"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
- Returns the wrong location (I'm in Singapore, not Saudi Arabia)
$.getJSON('//www.geoplugin.net/json.gp?jsoncallback=?', function(data) {
console.log(JSON.stringify(data, null, 2));
});
Returns:
{
"geoplugin_request": "116.12.250.1",
"geoplugin_status": 200,
"geoplugin_credit": "Some of the returned data includes GeoLite data created by MaxMind, available from <a href=\\'http://www.maxmind.com\\'>http://www.maxmind.com</a>.",
"geoplugin_city": "Singapore",
"geoplugin_region": "Singapore (general)",
"geoplugin_areaCode": "0",
"geoplugin_dmaCode": "0",
"geoplugin_countryCode": "SG",
"geoplugin_countryName": "Singapore",
"geoplugin_continentCode": "AS",
"geoplugin_latitude": "1.2931",
"geoplugin_longitude": "103.855797",
"geoplugin_regionCode": "00",
"geoplugin_regionName": "Singapore (general)",
"geoplugin_currencyCode": "SGD",
"geoplugin_currencySymbol": "$",
"geoplugin_currencySymbol_UTF8": "$",
"geoplugin_currencyConverter": 1.4239
}
Limitations:
http://api.hackertarget.com/geoip/?q=<your_ip_address>
Returns:
IP Address: 116.12.250.1
Country: SG
State: N/A
City: Singapore
Latitude: 1.293100
Longitude: 103.855797
Limitations:
- 50 requests per day
- Only returns plain text
- Requires IP address parameter
$.getJSON('//ip-api.com/json?callback=?', function(data) {
console.log(JSON.stringify(data, null, 2));
});
Returns:
{
"as": "AS3758 SingNet",
"city": "Singapore",
"country": "Singapore",
"countryCode": "SG",
"isp": "SingNet Pte Ltd",
"lat": 1.2931,
"lon": 103.8558,
"org": "Singapore Telecommunications",
"query": "116.12.250.1",
"region": "",
"regionName": "",
"status": "success",
"timezone": "Asia/Singapore",
"zip": ""
}
Limitations:
$.getJSON('//api.ipify.org?format=jsonp&callback=?', function(data) {
console.log(JSON.stringify(data, null, 2));
});
Returns:
{
"ip": "116.12.250.1"
}
Limitations:
- None (unlimited bandwidth)
$.getJSON('//ipinfo.io/', function(data) {
console.log(JSON.stringify(data, null, 2));
});
Returns:
{
"ip": "116.12.250.1",
"hostname": "No Hostname",
"city": "Singapore",
"region": "",
"country": "SG",
"loc": "1.2931,103.8558",
"org": "AS3758 SingNet"
}
Limitations:
$.getJSON('//api.ipinfodb.com/v3/ip-city/?key=<your_api_key>&format=json&callback=?', function(data) {
console.log(JSON.stringify(data, null, 2));
});
Returns:
{
"statusCode": "OK",
"statusMessage": "",
"ipAddress": "116.12.250.1",
"countryCode": "SG",
"countryName": "Singapore",
"regionName": "Singapore",
"cityName": "Singapore",
"zipCode": "048941",
"latitude": "1.28967",
"longitude": "103.85",
"timeZone": "+08:00"
}
Limitations:
- Two requests per second
- Requires registration to get your API key
http://ip-json.rhcloud.com/json
Returns:
{
"site": "http://ip-json.rhcloud.com",
"city": "Singapore",
"region_name": null,
"region": "00",
"area_code": 0,
"time_zone": "Asia/Singapore",
"longitude": 103.85579681396484,
"metro_code": 0,
"country_code3": "SGP",
"latitude": 1.2930999994277954,
"postal_code": null,
"dma_code": 0,
"country_code": "SG",
"country_name": "Singapore",
"q": "116.12.250.1"
}
Limitations:
- Quota not stated, but may be limited by OpenShift PaaS
- Doesn't support JSONP callbacks
$.getJSON('//jsonip.com/?callback=?', function(data) {
console.log(JSON.stringify(data, null, 2));
});
Returns:
{
"ip": "116.12.250.1",
"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": "116.12.250.1"
}
Limitations:
- Goes down a lot (over quota), so I wouldn't use it for production
http://api.snoopi.io/v1/
Returns:
{
"remote_address": "116.12.250.1",
"requested_address": "116.12.250.1",
"requested_time": "11:25:35 pm",
"requested_date": "January 31, 2016",
"CountryCode": "SG",
"Region": null,
"Region_Full": "Singapore",
"City": "Ubi",
"PostalZip": "96940",
"TimeZone_Name": "Asia\/Singapore",
"Latitude": "1.31865",
"Longitude": "103.894"
}
Limitations:
- 2,500 requests per day
- Doesn't support JSONP callbacks