diff --git a/modules/ipapi/__init__.py b/modules/ipapi/__init__.py
new file mode 100644
index 00000000..7ccb0c73
--- /dev/null
+++ b/modules/ipapi/__init__.py
@@ -0,0 +1,3 @@
+from .module import IpapiModule
+
+__all__ = ['IpapiModule']
diff --git a/modules/ipapi/favicon.png b/modules/ipapi/favicon.png
new file mode 100644
index 00000000..be0d3f65
Binary files /dev/null and b/modules/ipapi/favicon.png differ
diff --git a/modules/ipapi/module.py b/modules/ipapi/module.py
new file mode 100644
index 00000000..7830ea30
--- /dev/null
+++ b/modules/ipapi/module.py
@@ -0,0 +1,64 @@
+# -*- coding: utf-8 -*-
+
+# Copyright(C) 2015 Julien Veyssier
+#
+# This file is part of weboob.
+#
+# weboob is free software: you can redistribute it and/or modify
+# it under the terms of the GNU Affero General Public License as published by
+# the Free Software Foundation, either version 3 of the License, or
+# (at your option) any later version.
+#
+# weboob is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+# GNU Affero General Public License for more details.
+#
+# You should have received a copy of the GNU Affero General Public License
+# along with weboob. If not, see .
+
+
+from weboob.capabilities.geolocip import CapGeolocIp, IpLocation
+from weboob.tools.backend import Module
+from weboob.browser.browsers import Browser
+from weboob.tools.json import json
+
+
+__all__ = ['IpapiModule']
+
+
+class IpapiModule(Module, CapGeolocIp):
+ NAME = 'ipapi'
+ MAINTAINER = u'Julien Veyssier'
+ EMAIL = 'julien.veyssier@aiur.fr'
+ VERSION = '1.1'
+ LICENSE = 'AGPLv3+'
+ DESCRIPTION = u"IP-API Geolocation API"
+ BROWSER = Browser
+
+ def get_location(self, ipaddr):
+ res = self.browser.location('http://ip-api.com/json/%s' % ipaddr.encode('utf-8'))
+ jres = json.loads(res.text)
+
+ if "status" in jres and jres["status"] == "fail":
+ raise Exception("IPAPI failure : %s" % jres["message"])
+
+ iploc = IpLocation(ipaddr)
+ iploc.city = u'%s'%jres['city']
+ iploc.region = u'%s'%jres['regionName']
+ iploc.zipcode = u'%s'%jres['zip']
+ iploc.country = u'%s'%jres['country']
+ if jres['lat'] != '':
+ iploc.lt = float(jres['lat'])
+ else:
+ iploc.lt = 0.0
+ if jres['lon'] != '':
+ iploc.lg = float(jres['lon'])
+ else:
+ iploc.lg = 0.0
+ #iploc.host = 'NA'
+ #iploc.tld = 'NA'
+ if 'isp' in jres:
+ iploc.isp = u'%s'%jres['isp']
+
+ return iploc
diff --git a/modules/ipapi/test.py b/modules/ipapi/test.py
new file mode 100644
index 00000000..561697ce
--- /dev/null
+++ b/modules/ipapi/test.py
@@ -0,0 +1,28 @@
+# -*- coding: utf-8 -*-
+
+# Copyright(C) 2015 Julien Veyssier
+#
+# This file is part of weboob.
+#
+# weboob is free software: you can redistribute it and/or modify
+# it under the terms of the GNU Affero General Public License as published by
+# the Free Software Foundation, either version 3 of the License, or
+# (at your option) any later version.
+#
+# weboob is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+# GNU Affero General Public License for more details.
+#
+# You should have received a copy of the GNU Affero General Public License
+# along with weboob. If not, see .
+
+
+from weboob.tools.test import BackendTest
+
+
+class IpapiTest(BackendTest):
+ MODULE = 'ipapi'
+
+ def test_ipapi(self):
+ self.backend.get_location('88.198.11.130')