diff --git a/.idea/.gitignore b/.idea/.gitignore
new file mode 100644
index 000000000..73f69e095
--- /dev/null
+++ b/.idea/.gitignore
@@ -0,0 +1,8 @@
+# Default ignored files
+/shelf/
+/workspace.xml
+# Datasource local storage ignored files
+/dataSources/
+/dataSources.local.xml
+# Editor-based HTTP Client requests
+/httpRequests/
diff --git a/.idea/geocoder.iml b/.idea/geocoder.iml
new file mode 100644
index 000000000..dccff1c66
--- /dev/null
+++ b/.idea/geocoder.iml
@@ -0,0 +1,22 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/.idea/misc.xml b/.idea/misc.xml
new file mode 100644
index 000000000..8a4f1abbb
--- /dev/null
+++ b/.idea/misc.xml
@@ -0,0 +1,4 @@
+
+
+
+
\ No newline at end of file
diff --git a/.idea/modules.xml b/.idea/modules.xml
new file mode 100644
index 000000000..e589fae76
--- /dev/null
+++ b/.idea/modules.xml
@@ -0,0 +1,8 @@
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/.idea/vcs.xml b/.idea/vcs.xml
new file mode 100644
index 000000000..94a25f7f4
--- /dev/null
+++ b/.idea/vcs.xml
@@ -0,0 +1,6 @@
+
+
+
+
+
+
\ No newline at end of file
diff --git a/README_API_GUIDE.md b/README_API_GUIDE.md
index 6499280bd..b30a340d9 100644
--- a/README_API_GUIDE.md
+++ b/README_API_GUIDE.md
@@ -268,6 +268,27 @@ The [Google Places Search API](https://developers.google.com/maps/documentation/
* **Terms of Service**: https://www.melissa.com/terms
* **Limitations**: ?
+### NetToolKit (`:net_tool_kit`)
+
+* **API key**: required, but added to HTTP Headers (See below)
+* **Key signup**: https://www.nettoolkit.com/pricing
+* **Quota**: ?
+* **HTTP Headers**: you can specify the API key and a referer like so:
+ ```
+ Geocoder.configure(
+ http_headers: {
+ "X-NTK-KEY" => ENV["NET_TOOL_KIT_API_KEY"],
+ "Referer" => "http://foo.com"
+ }
+ )
+ ```
+* **Region**: world
+* **SSL support**: yes
+* **Languages**: English
+* **Documentation**: https://www.nettoolkit.com/docs/overview
+* **Terms of Service**: https://www.nettoolkit.com/terms
+* **Limitations**: ?
+
### Nominatim (`:nominatim`)
* **API key**: none
diff --git a/lib/geocoder/lookup.rb b/lib/geocoder/lookup.rb
index 7c23dabd2..7c17560c2 100644
--- a/lib/geocoder/lookup.rb
+++ b/lib/geocoder/lookup.rb
@@ -42,6 +42,7 @@ def street_services
:geocoder_ca,
:yandex,
:nationaal_georegister_nl,
+ :net_tool_kit,
:nominatim,
:mapbox,
:mapquest,
diff --git a/lib/geocoder/lookups/net_tool_kit.rb b/lib/geocoder/lookups/net_tool_kit.rb
new file mode 100644
index 000000000..3af50012a
--- /dev/null
+++ b/lib/geocoder/lookups/net_tool_kit.rb
@@ -0,0 +1,65 @@
+require 'geocoder/lookups/base'
+require 'geocoder/results/net_tool_kit'
+
+module Geocoder::Lookup
+ class NetToolKit < Base
+
+ def name
+ 'NetToolKit'
+ end
+
+ def supported_protocols
+ [:https]
+ end
+
+ private # ---------------------------------------------------------------
+
+ def base_query_url(query)
+ "#{protocol}://api.nettoolkit.com/v1/geo/#{search_type(query)}?version=2&"
+ end
+
+ def search_type(query)
+ query.reverse_geocode? ? 'reverse-geocodes' : 'geocodes'
+ end
+
+ def query_url_params(query)
+ params = { address: query.sanitized_text }
+
+ [:provider].each do |option|
+ unless (option_value = query.options[option]).nil?
+ params[option] = option_value
+ end
+ end
+
+ params.merge(super)
+ end
+
+ def results(query)
+ return [] unless doc = fetch_data(query)
+ return doc['results'] if doc['code'] == 1000 || doc['code'] == 1001
+
+ messages = doc['message']
+ case doc['code']
+ when 2002, 2003, 2004, 2005
+ raise_error(Geocoder::ServiceUnavailable, messages) ||
+ Geocoder.log(:warn, "NetToolKit Geocoding API error: #{messages}")
+ when 3000
+ raise_error(Geocoder::RequestDenied, messages) ||
+ Geocoder.log(:warn, "NetToolKit Geocoding API error: #{messages}")
+ when 3001, 3003
+ raise_error(Geocoder::OverQueryLimitError, messages) ||
+ Geocoder.log(:warn, "NetToolKit Geocoding API error: #{messages}")
+ when 3002
+ raise_error(Geocoder::InvalidApiKey, messages) ||
+ Geocoder.log(:warn, "NetToolKit Geocoding API error: #{messages}")
+ when 4000, 4001, 4002
+ raise_error(Geocoder::InvalidRequest, messages) ||
+ Geocoder.log(:warn, "NetToolKit Geocoding API error: #{messages}")
+ else
+ raise_error(Geocoder::Error, messages) ||
+ Geocoder.log(:warn, "NetToolKit Geocoding API error: #{messages}")
+ end
+ end
+
+ end
+end
diff --git a/lib/geocoder/results/net_tool_kit.rb b/lib/geocoder/results/net_tool_kit.rb
new file mode 100644
index 000000000..026c35cfc
--- /dev/null
+++ b/lib/geocoder/results/net_tool_kit.rb
@@ -0,0 +1,62 @@
+require 'geocoder/results/base'
+
+module Geocoder::Result
+ class NetToolKit < Base
+
+ def address
+ @data['address']
+ end
+
+ def coordinates
+ %w[latitude longitude].map{ |l| @data[l] }
+ end
+
+ def house_number
+ @data['house_number']
+ end
+
+ def street
+ @data['street']
+ end
+
+ def street_name
+ @data['street_name']
+ end
+
+ def street_type
+ @data['street_type']
+ end
+
+ def city
+ @data['city']
+ end
+
+ def county
+ @data['county']
+ end
+
+ def state
+ @data['state']
+ end
+
+ def state_code
+ @data['state_code']
+ end
+
+ def postal_code
+ @data['postcode']
+ end
+
+ def precision
+ @data['precision']
+ end
+
+ def provider
+ @data['provider']
+ end
+
+ def ntk_geocode_time
+ @data['ntk_geocode_time']
+ end
+ end
+end