diff --git a/lib/geocoder/lookups/ipdata_co.rb b/lib/geocoder/lookups/ipdata_co.rb
index 04e38fa4109de83dcdfb89c56d2870899eb2becc..a8e0bf00dc3cba67cabeb8f1abfe0ebc46812813 100644
--- a/lib/geocoder/lookups/ipdata_co.rb
+++ b/lib/geocoder/lookups/ipdata_co.rb
@@ -19,6 +19,7 @@ module Geocoder::Lookup
     private # ---------------------------------------------------------------
 
     def results(query)
+      Geocoder.configure(:http_headers => { "api-key" => configuration.api_key }) if configuration.api_key
       # don't look up a loopback address, just return the stored result
       return [reserved_result(query.text)] if query.loopback_ip_address?
       # note: Ipdata.co returns plain text on bad request
diff --git a/test/unit/lookups/ipdata_co_test.rb b/test/unit/lookups/ipdata_co_test.rb
index 5acdcf72e7b5c19fdb5ac1e57e3402fc2a4fed21..88a4d16c144a2ebdd9306971944260b29d5009b1 100644
--- a/test/unit/lookups/ipdata_co_test.rb
+++ b/test/unit/lookups/ipdata_co_test.rb
@@ -32,4 +32,23 @@ class IpdataCoTest < GeocoderTestCase
         lookup.send(:check_response_for_errors!, response)
     end
   end
+
+  def test_api_key
+    Geocoder.configure(:api_key => 'XXXX')
+
+    # HACK: run the code once to add the api key to the HTTP request headers
+    Geocoder.search('8.8.8.8')
+    # It's really hard to 'un-monkey-patch' the base lookup class here
+
+    require 'webmock/test_unit'
+    WebMock.enable!
+    stubbed_request = WebMock.stub_request(:get, "https://api.ipdata.co/8.8.8.8").with(headers: {'api-key' => 'XXXX'}).to_return(status: 200)
+
+    g = Geocoder::Lookup::IpdataCo.new
+    g.send(:actual_make_api_request, Geocoder::Query.new('8.8.8.8'))
+    assert_requested(stubbed_request)
+
+    WebMock.reset!
+    WebMock.disable!
+  end
 end