diff --git a/lib/withings/error.rb b/lib/withings/error.rb
index <HASH>..<HASH> 100644
--- a/lib/withings/error.rb
+++ b/lib/withings/error.rb
@@ -6,5 +6,13 @@ module Withings
 
     # Raised when client is misconfigured
     ClientConfigurationError = Class.new(self)
+
+    # Withings returns 200 for everything, making it difficult to figure out
+    # exactly what went wrong. They also appear to send back fairly arbitrary
+    # codes, for example a response with an HTTP Status Code 200 can contain
+    # a body {"status":503,"error":"Invalid Params"} if OAuth credentials are
+    # incorrect (503 normally indicates that a downstream service is unavailable).
+    # Because of this we just wrap most errors in this class.
+    InvalidResponseError = Class.new(self)
   end
 end
diff --git a/lib/withings/http/request.rb b/lib/withings/http/request.rb
index <HASH>..<HASH> 100644
--- a/lib/withings/http/request.rb
+++ b/lib/withings/http/request.rb
@@ -19,7 +19,7 @@ module Withings
         when Net::HTTPOK
           body = JSON.parse(response.body)
           if body['status'].to_i != 0
-            # TODO
+            raise Withings::Error::InvalidResponseError, "#{body['status']} - #{body['error']}"
           end
           body['body']
         else
Raise exception when receiving a non-successful response