diff --git a/lib/geocoder/lookups/geocodio.rb b/lib/geocoder/lookups/geocodio.rb
index 8d6cd211d67d4b9ebfbacf1f3543c24dbf940a14..1f7c2f86a9769cdb148f019955f46c2aca28d9f4 100644
--- a/lib/geocoder/lookups/geocodio.rb
+++ b/lib/geocoder/lookups/geocodio.rb
@@ -15,10 +15,17 @@ module Geocoder::Lookup
 
     def results(query)
       return [] unless doc = fetch_data(query)
-      if doc['error'].nil?
-        return doc["results"]
+      return doc["results"] if doc['error'].nil?
+      
+      if doc['error'] == 'Invalid API key'
+        raise_error(Geocoder::InvalidApiKey) ||
+          warn("Geocodio service error: invalid API key.")
+      elsif doc['error'].match(/You have reached your daily maximum/)
+        raise_error(Geocoder::OverQueryLimitError, doc['error']) ||
+          warn("Geocodio service error: #{doc['error']}.")
       else
-        warn "Geocodio service error: #{doc['error']}."
+        raise_error(Geocoder::InvalidRequest, doc['error']) ||
+          warn("Geocodio service error: #{doc['error']}.")
       end
       []
     end
diff --git a/test/fixtures/geocodio_bad_api_key b/test/fixtures/geocodio_bad_api_key
new file mode 100644
index 0000000000000000000000000000000000000000..fb5525197b6d4bdac61d60206ef114f3da979a10
--- /dev/null
+++ b/test/fixtures/geocodio_bad_api_key
@@ -0,0 +1,3 @@
+{
+  "error": "Invalid API key"
+}
diff --git a/test/fixtures/geocodio_invalid b/test/fixtures/geocodio_invalid
new file mode 100644
index 0000000000000000000000000000000000000000..f716108533ddbdc4f720571568b87135695295b0
--- /dev/null
+++ b/test/fixtures/geocodio_invalid
@@ -0,0 +1,4 @@
+{
+  "error": "Could not geocode address, zip code, city or city/state are required"
+}
+
diff --git a/test/fixtures/geocodio_over_query_limit b/test/fixtures/geocodio_over_query_limit
new file mode 100644
index 0000000000000000000000000000000000000000..803542d89ea9bcf112241745974bcfb149e423d8
--- /dev/null
+++ b/test/fixtures/geocodio_over_query_limit
@@ -0,0 +1,4 @@
+{
+  "error": "You have reached your daily maximum, please add a payment method for continued use. You can configure billing at https://dash.geocod.io"
+}
+
diff --git a/test/unit/lookups/geocodio_test.rb b/test/unit/lookups/geocodio_test.rb
index 1bb4b313aaa0f930b380a233c966cbe3569de392..c1ac2c746206c98e22571912a750d8a62fb51c6d 100644
--- a/test/unit/lookups/geocodio_test.rb
+++ b/test/unit/lookups/geocodio_test.rb
@@ -31,4 +31,25 @@ class GeocodioTest < GeocoderTestCase
     query = Geocoder::Query.new([45.423733, -75.676333])
     assert_match /reverse/, query.url
   end
+
+  def test_raises_invalid_request_exception
+    Geocoder.configure Geocoder.configure(:always_raise => [Geocoder::InvalidRequest])
+    assert_raises Geocoder::InvalidRequest do
+      Geocoder.search("invalid")
+    end
+  end
+
+  def test_raises_api_key_exception
+    Geocoder.configure Geocoder.configure(:always_raise => [Geocoder::InvalidApiKey])
+    assert_raises Geocoder::InvalidApiKey do
+      Geocoder.search("bad api key")
+    end
+  end
+
+  def test_raises_over_limit_exception
+    Geocoder.configure Geocoder.configure(:always_raise => [Geocoder::OverQueryLimitError])
+    assert_raises Geocoder::OverQueryLimitError do
+      Geocoder.search("over query limit")
+    end
+  end
 end