DEV Community

loading...
Cover image for Get IP Clients Addresses

Get IP Clients Addresses

Jenuel Oras Ganawed
I'm a software/web developer specializing in creating(and sometimes designing) exceptional websites, applications, and everything in between.
・8 min read

In this post, I would like to share something away or maybe the better way to get the clients API for Security Purposes. What I mean by security is the identity of what IP the client's device is using. So that if your system Identifies that there is a login using different IP you can set a response to those kinds of things so, How do we get clients addresses.

There are services that actually will do that for us (Hope This helps! 👍👍👌😁✋):

Cloudflare

Try it: https://www.cloudflare.com/cdn-cgi/trace

// If your site is on Cloudflare, then you can use '/cdn-cgi/trace' instead
$.get('https://www.cloudflare.com/cdn-cgi/trace', function(data) {
    console.log(data)
})
Enter fullscreen mode Exit fullscreen mode

Returns:

fl=4f422
h=www.cloudflare.com
ip=54.193.27.106
ts=1575967108.245
visit_scheme=https
uag=Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/74.0.3729.169 Safari/537.36 Hypothesis-Via
colo=SJC
http=http/1.1
loc=US
tls=TLSv1.3
sni=plaintext
warp=off
Enter fullscreen mode Exit fullscreen mode

Limitations:
Returns plain text


DB-IP

Try it: http://api.db-ip.com/addrinfo?api_key=&addr=

Returns:

{
  "address": "116.12.250.1",
  "country": "SG",
  "stateprov": "Central Singapore",
  "city": "Singapore"
}
Enter fullscreen mode Exit fullscreen mode

Limitations:

2,500 requests per day
Doesn't support JSONP callbacks
Requires IP address parameter
Requires an email address to get your API key
No SSL (https) with the free plan


Geobytes

Try it: http://gd.geobytes.com/GetCityDetails

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

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"
}
Enter fullscreen mode Exit fullscreen mode

Limitations:

16,384 requests per hour
No SSL (https) with the free plan
Can return the wrong location (I'm in Singapore, not Saudi Arabia)


GeoIPLookup.io

Try it: https://json.geoiplookup.io/api

$.getJSON('https://json.geoiplookup.io/api?callback=?', function(data) {
  console.log(JSON.stringify(data, null, 2));
});
Enter fullscreen mode Exit fullscreen mode

Returns:

{
    "ip": "116.12.250.1",
    "isp": "SGPOST",
    "org": "Singapore Post Ltd",
    "hostname": "116.12.250.1",
    "longitude": "103.807",
    "latitude": "1.29209",
    "postal_code": "",
    "city": "Singapore",
    "country_code": "SG",
    "country_name": "Singapore",
    "continent_code": "AS",
    "region": "Central Singapore",
    "district": "",
    "timezone_name": "Asia\/Singapore",
    "connection_type": "",
    "asn": "AS3758 SingNet",
    "currency_code": "SGD",
    "currency_name": "Singapore Dollar",
    "success": true
}
Enter fullscreen mode Exit fullscreen mode

Limitations:

10,000 requests per hour
Free API only allows non-commercial use


geoPlugin

Try it: http://www.geoplugin.net/json.gp

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

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": "&#36;",
  "geoplugin_currencySymbol_UTF8": "$",
  "geoplugin_currencyConverter": 1.4239
}
Enter fullscreen mode Exit fullscreen mode

Limitations:

120 requests per minute
No SSL (https) with the free plan


Hacker Target

Try it: https://api.hackertarget.com/geoip/?q=

Returns:

IP Address: 116.12.250.1
Country: SG
State: N/A
City: Singapore
Latitude: 1.293100
Longitude: 103.855797
Enter fullscreen mode Exit fullscreen mode

Limitations:

50 requests per day
Doesn't support JSONP callbacks
Requires IP address parameter
Returns plain text


ipapi.co
Try it: https://ipapi.co/json/

$.getJSON('https://ipapi.co/json/', function(data) {
  console.log(JSON.stringify(data, null, 2));
});
Enter fullscreen mode Exit fullscreen mode

Returns:

{
  "ip": "116.12.250.1",
  "city": "Singapore",
  "region": "Central Singapore Community Development Council",
  "country": "SG",
  "country_name": "Singapore",
  "postal": null,
  "latitude": 1.2855,
  "longitude": 103.8565,
  "timezone": "Asia/Singapore"
}
Enter fullscreen mode Exit fullscreen mode

Limitations:

1,000 requests per day
Requires SSL (https)


IP-API.com

Try it: http://ip-api.com/json

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

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": "01",
  "regionName": "Central Singapore Community Development Council",
  "status": "success",
  "timezone": "Asia/Singapore",
  "zip": ""
}
Enter fullscreen mode Exit fullscreen mode

Limitations:

150 requests per minute
No SSL (https) with the free plan


Ipdata.co

Try it: https://api.ipdata.co

$.getJSON('https://api.ipdata.co', function(data) {
  console.log(JSON.stringify(data, null, 2));
});
Enter fullscreen mode Exit fullscreen mode

Returns:

{
  "ip": "116.12.250.1",
  "city": "Singapore",
  "region": "Central Singapore Community Development Council",
  "region_code": "01",
  "country_name": "Singapore",
  "country_code": "SG",
  "continent_name": "Asia",
  "continent_code": "AS",
  "latitude": 1.2931,
  "longitude": 103.8558,
  "asn": "AS3758",
  "organisation": "SingNet",
  "postal": "",
  "calling_code": "65",
  "flag": "https://ipdata.co/flags/sg.png",
  "emoji_flag": "\ud83c\uddf8\ud83c\uddec",
  "emoji_unicode": "U+1F1F8 U+1F1EC",
  "is_eu": false,
  "languages": [
    {
      "name": "English",
      "native": "English"
    },
    {
      "name": "Malay",
      "native": "Bahasa Melayu"
    },
    {
      "name": "Tamil",
      "native": "\u0ba4\u0bae\u0bbf\u0bb4\u0bcd"
    },
    {
      "name": "Chinese",
      "native": "\u4e2d\u6587"
    }
  ],
  "currency": {
    "name": "Singapore Dollar",
    "code": "SGD",
    "symbol": "S$",
    "native": "$",
    "plural": "Singapore dollars"
  },
  "time_zone": {
    "name": "Asia/Singapore",
    "abbr": "+08",
    "offset": "+0800",
    "is_dst": false,
    "current_time": "2018-05-09T12:28:49.183674+08: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
  }
}
Enter fullscreen mode Exit fullscreen mode

Limitations:

1,500 requests per day
Requires an email address to get your API key
Requires SSL (https)


IP Find

Try it: https://ipfind.co/me?auth=

$.getJSON('https://ipfind.co/me?auth=<your_api_key>', function(data) {
  console.log(JSON.stringify(data, null, 2));
});
Enter fullscreen mode Exit fullscreen mode

Returns:

{
  "ip_address": "116.12.250.1",
  "country": "Singapore",
  "country_code": "SG",
  "continent": "Asia",
  "continent_code": "AS",
  "city": "Singapore",
  "county": null,
  "region": "Central Singapore",
  "region_code": "01",
  "timezone": "Asia/Singapore",
  "owner": null,
  "longitude": 103.8565,
  "latitude": 1.2855,
  "currency": "SGD",
  "languages": [
    "cmn",
    "en-SG",
    "ms-SG",
    "ta-SG",
    "zh-SG"
  ]
}
Enter fullscreen mode Exit fullscreen mode

Limitations:

300 requests per day
Requires registration to get your API key


ipgeolocation

Try it: https://api.ipgeolocation.io/ipgeo?apiKey=

$.getJSON('https://api.ipgeolocation.io/ipgeo?apiKey=<your_api_key>', function(data) {
  console.log(JSON.stringify(data, null, 2));
});
Enter fullscreen mode Exit fullscreen mode

Returns:

{
  "ip": "116.12.250.1",
  "continent_code": "AS",
  "continent_name": "Asia",
  "country_code2": "SG",
  "country_code3": "SGP",
  "country_name": "Singapore",
  "country_capital": "Singapore",
  "state_prov": "Central Singapore",
  "district": "",
  "city": "Singapore",
  "zipcode": "",
  "latitude": "1.29209",
  "longitude": "103.807",
  "is_eu": false,
  "calling_code": "+65",
  "country_tld": ".sg",
  "languages": "cmn,en-SG,ms-SG,ta-SG,zh-SG",
  "country_flag": "https://ipgeolocation.io/static/flags/sg_64.png",
  "isp": "SGPOST",
  "connection_type": "",
  "organization": "Singapore Post Ltd",
  "geoname_id": "1880252",
  "currency": {
    "name": "Dollar",
    "code": "SGD"
  },
  "time_zone": {
    "name": "Asia/Singapore",
    "offset": 8,
    "is_dst": false,
    "current_time": "2018-06-12 09:06:49.028+0800"
  }
}
Enter fullscreen mode Exit fullscreen mode

Limitations:

50,000 requests per month
Requires registration to get your API key


ipify

Try it: https://api.ipify.org/?format=json

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

Returns:

{
  "ip": "116.12.250.1"
}
Enter fullscreen mode Exit fullscreen mode

Limitations:

None


IPInfoDB

Try it: https://api.ipinfodb.com/v3/ip-city/?key=&format=json

$.getJSON('https://api.ipinfodb.com/v3/ip-city/?key=<your_api_key>&format=json&callback=?', function(data) {
  console.log(JSON.stringify(data, null, 2));
});
Enter fullscreen mode Exit fullscreen mode

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"
}
Enter fullscreen mode Exit fullscreen mode

Limitations:

Two requests per second
Requires registration to get your API key


ipinfo.io

Try it: https://ipinfo.io/json

$.getJSON('https://ipinfo.io/json', function(data) {
  console.log(JSON.stringify(data, null, 2));
});
Enter fullscreen mode Exit fullscreen mode

Returns:

{
  "ip": "116.12.250.1",
  "hostname": "No Hostname",
  "city": "Singapore",
  "region": "Central Singapore Community Development Council",
  "country": "SG",
  "loc": "1.2931,103.8558",
  "org": "AS3758 SingNet"
}
Enter fullscreen mode Exit fullscreen mode

Limitations:

1,000 requests per day


Ipregistry

Try it: https://api.ipregistry.co/?key=

$.getJSON('https://api.ipregistry.co/?key=<your_api_key>', function(data) {
  console.log(JSON.stringify(data, null, 2));
});
Enter fullscreen mode Exit fullscreen mode

Returns:

{
  "ip" : "116.12.250.1",
  "type" : "IPv4",
  "hostname" : null,
  "carrier" : {
    "name" : null,
    "mcc" : null,
    "mnc" : null
  },
  "connection" : {
    "asn" : 3758,
    "domain" : "singnet.com.sg",
    "organization" : "SingNet Pte Ltd",
    "type" : "isp"
  },
  "currency" : {
    "code" : "SGD",
    "name" : "Singapore Dollar",
    "plural" : "Singapore dollars",
    "symbol" : "SGD",
    "symbol_native" : "SGD",
    "format" : {
      "negative" : {
        "prefix" : "-SGD",
        "suffix" : ""
      },
      "positive" : {
        "prefix" : "SGD",
        "suffix" : ""
      }
    }
  },
  "location" : {
    "continent" : {
      "code" : "AS",
      "name" : "Asia"
    },
    "country" : {
      "area" : 692.0,
      "borders" : [ ],
      "calling_code" : "65",
      "capital" : "Singapore",
      "code" : "SG",
      "name" : "Singapore",
      "population" : 5638676,
      "population_density" : 8148.38,
      "flag" : {
        "emoji" : "🇸🇬",
        "emoji_unicode" : "U+1F1F8 U+1F1EC",
        "emojitwo" : "https://cdn.ipregistry.co/flags/emojitwo/sg.svg",
        "noto" : "https://cdn.ipregistry.co/flags/noto/sg.png",
        "twemoji" : "https://cdn.ipregistry.co/flags/twemoji/sg.svg",
        "wikimedia" : "https://cdn.ipregistry.co/flags/wikimedia/sg.svg"
      },
      "languages" : [ {
        "code" : "cmn",
        "name" : "cmn",
        "native" : "cmn"
      }, {
        "code" : "en",
        "name" : "English",
        "native" : "English"
      }, {
        "code" : "ms",
        "name" : "Malay",
        "native" : "Melayu"
      }, {
        "code" : "ta",
        "name" : "Tamil",
        "native" : "தமிழ்"
      }, {
        "code" : "zh",
        "name" : "Chinese",
        "native" : "中文"
      } ],
      "tld" : ".sg"
    },
    "region" : {
      "code" : null,
      "name" : "Singapore"
    },
    "city" : "Singapore",
    "postal" : "96534",
    "latitude" : 1.28967,
    "longitude" : 103.85007,
    "language" : {
      "code" : "cmn",
      "name" : "cmn",
      "native" : "cmn"
    },
    "in_eu" : false
  },
  "security" : {
    "is_bogon" : false,
    "is_cloud_provider" : false,
    "is_tor" : false,
    "is_tor_exit" : false,
    "is_proxy" : false,
    "is_anonymous" : false,
    "is_abuser" : false,
    "is_attacker" : false,
    "is_threat" : false
  },
  "time_zone" : {
    "id" : "Asia/Singapore",
    "abbreviation" : "SGT",
    "current_time" : "2019-09-29T23:13:32+08:00",
    "name" : "Singapore Standard Time",
    "offset" : 28800,
    "in_daylight_saving" : false
  }
}
Enter fullscreen mode Exit fullscreen mode

Limitations:

Free plan includes 100,000 requests
Requires registration to get your API key


ipstack (formerly freegeoip.net)

Try it: http://api.ipstack.com/?access_key=

$.getJSON('http://api.ipstack.com/<ip_address>?access_key=<your_api_key>', function(data) {
  console.log(JSON.stringify(data, null, 2));
});
Enter fullscreen mode Exit fullscreen mode

Returns:

{
    "ip": "116.12.250.1",
    "type": "ipv4",
    "continent_code": "AS",
    "continent_name": "Asia",
    "country_code": "SG",
    "country_name": "Singapore",
    "region_code": "01",
    "region_name": "Central Singapore Community Development Council",
    "city": "Singapore",
    "zip": null,
    "latitude": 1.2931,
    "longitude": 103.8558,
    "location": {
        "geoname_id": 1880252,
        "capital": "Singapore",
        "languages": [{
            "code": "en",
            "name": "English",
            "native": "English"
        },
        {
            "code": "ms",
            "name": "Malay",
            "native": "Bahasa Melayu"
        },
        {
            "code": "ta",
            "name": "Tamil",
            "native": "\u0ba4\u0bae\u0bbf\u0bb4\u0bcd"
        },
        {
            "code": "zh",
            "name": "Chinese",
            "native": "\u4e2d\u6587"
        }],
        "country_flag": "http:\/\/assets.ipstack.com\/flags\/sg.svg",
        "country_flag_emoji": "\ud83c\uddf8\ud83c\uddec",
        "country_flag_emoji_unicode": "U+1F1F8 U+1F1EC",
        "calling_code": "65",
        "is_eu": false
    }
}
Enter fullscreen mode Exit fullscreen mode

Limitations:

10,000 requests per month
Requires IP address parameter
Requires registration to get your API key
No SSL (https) with the free plan


jsonip.com

Try it: https://jsonip.com

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

Returns:

{
  "ip": "116.12.250.1",
  "about": "https://jsonip.com/about",
  "Pro!": "http://getjsonip.com",
  "Get Notifications": "https://jsonip.com/notify"
}
Enter fullscreen mode Exit fullscreen mode

Limitations:

The response includes upsell


JSON Test

Try it: http://ip.jsontest.com/

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

Returns:

{
  "ip": "116.12.250.1"
}
Enter fullscreen mode Exit fullscreen mode

Limitations:

No SSL (https)
Goes down a lot (over quota), so I wouldn't use it for production
Returns IPv6 address if you have one, which may not be what you want


Nekudo

Try it: https://geoip.nekudo.com/api

$.getJSON('https://geoip.nekudo.com/api', function(data) {
  console.log(JSON.stringify(data, null, 2));
});
Enter fullscreen mode Exit fullscreen mode

Returns:

{
  "city": "Singapore",
  "country": {
    "name": "Singapore",
    "code": "SG"
  },
  "location": {
    "accuracy_radius": 50,
    "latitude": 1.2855,
    "longitude": 103.8565,
    "time_zone": "Asia/Singapore"
  },
  "ip": "116.12.250.1"
}
Enter fullscreen mode Exit fullscreen mode

Limitations:

Blocked by ad blockers using the EasyPrivacy list
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 (exhibit A: Telize). Most of these services also offer a paid tier in case you want more features like SSL support.

Also, as skobaljic noted in the comments below, the request quotas are mostly academic since this is happening client-side and most end users will never exceed the quota.

UPDATES

2/1/2016: Removed Telize (no longer offers free plan)
4/18/2016: Removed freegeoip.net (out of service)
4/26/2016: Added DB-IP
4/26/2016: Added Hacker Target
7/6/2016: Reinstated freegeoip.net
7/6/2016: Removed ip-json.rhcloud.com (dead link)
12/21/2016: Removed Hacker Target (out of service)
2/10/2017: Added Nekudo
4/20/2017: Added ipapi.co (thanks Ahmad Awais)
4/24/2017: Reinstated Hacker Target
4/24/2017: Removed Snoopi.io (out of service)
7/16/2017: Added IP Find (thanks JordanC)
7/16/2017: Updated limitation for free plans that don't support SSL
9/25/2017: Added Stupid Web Tools (thanks Cœur)
3/16/2018: Added Ipdata.co (thanks Jonathan)
4/14/2018: Renamed freegeoip.net to ipstack (thanks MA-Maddin)
4/16/2018: Added GeoIPLookup.io (thanks Rob Waa)
6/11/2018: Added ipgeolocation (thanks Ejaz Ahmed)
7/31/2019: Added Ipregistry (thanks Laurent)
8/16/2019: Added SmartIP.io (thanks kevinj)
8/22/2019: Removed Stupid Web Tools (out of service)
12/8/2019: Changed Smart IP monthly rate limit
12/10/2019: Added Cloudflare
1/9/2020: Removed SmartIP.io (out of service)

Discussion (10)

Collapse
adithyapaib profile image
adithyapaib

how to make an api like these sites ?

Collapse
aalireza439 profile image
aalireza439 • Edited

just look for X-Forwarded-For in your request header.
if you're using express.js something like this should work:

app.get('/get/ip', function (req, res) {
    const ipAddress =  req.headers['x-forwarded-for']?.split(',').shift() || req.socket?.remoteAddress
    res.send(ipAddress);
})
Enter fullscreen mode Exit fullscreen mode
Collapse
adithyapaib profile image
adithyapaib

So if I make a http request to the end I will get the public IP address?

Thread Thread
aalireza439 profile image
aalireza439

yes, it's show you the IP address of a client connecting to your web server (which in your case is Express.js)
developer.mozilla.org/en-US/docs/W...

Thread Thread
adithyapaib profile image
adithyapaib

Will try it out
Thank you so much 🥰❤️

Collapse
adithyapaib profile image
adithyapaib • Edited

get-ip-eight.vercel.app/ working thanks
anyway to get ip location without third party api

Collapse
brojenuel profile image
Jenuel Oras Ganawed Author

Hi! thank you for showing interest in this post. The idea here is to fetch data from a backend server using a link provided by the backend.. If you would like to create something like this you can start learning how Rest Api works..

Collapse
adithyapaib profile image
adithyapaib

Hey
I actually made several rest API's (nodejs) but I could find proper source or information to make an API to get IP address without 3rd part api's. Is there any proper resource to do it? Or can you write a post on that would love to read it .
Thank you

Thread Thread
brojenuel profile image
Jenuel Oras Ganawed Author

I think for js you have to use libraries to do it... If you have tried python I think its easier in python language.... but anyway, Ill try to search about it and make a post about it also :)

Thread Thread
adithyapaib profile image
adithyapaib

Thanks man really appreciate it