Do not apply this method to long lists, where Batch mode would be more efficient and less abusive to the API provider. See [this other answer][1]. 3 API Integrated solution (One API call per IP) ------------------- ClearAll[IP2Location]; Options[IP2Location] = {Method -> Automatic}; SetAttributes[IP2Location, Listable] IP2Location[ip_String | IPAddress[ip_String], OptionsPattern[]] := Block[{url, response, methodlist, method, latlon}, methodlist = {"nekudo", "freegeoip", "ip-api"}; method = If[ OptionValue[Method] === Automatic || FreeQ[methodlist, OptionValue[Method]], RandomChoice[methodlist], OptionValue[Method] ]; url = URLBuild@Switch[method, "nekudo", <|"Scheme" -> "http", "Domain" -> "geoip.nekudo.com", "Path" -> {"api", ip}|>, "freegeoip", <|"Scheme" -> "http", "Domain" -> "freegeoip.net", "Path" -> {"json", ip}|>, "ip-api", <|"Scheme" -> "http", "Domain" -> "ip-api.com", "Path" -> {"json", ip}|> ]; response = Import[url, "RawJSON"]; latlon = ToExpression@Values[ Switch[method, "nekudo", Query["location", {"latitude", "longitude"}], "freegeoip", Query[{"latitude", "longitude"}], "ip-api", Query[{"lat", "lon"}] ][response] ]; (*Echo[response,method];*) GeoLocation[latlon] ] Performance ----------- First@AbsoluteTiming@IP2Location[iplist] (*37.6867*) Failed in 7 sites. [1]: https://mathematica.stackexchange.com/a/155112/10397