General comment: We are not consistent when we are throwing an `IOException` or an `APIException`. Every `IOException` is wrapped into an `APIException`, which is not correct. `IOException` should be thrown on general IO problems and the `APIException` when the request was not successful (according to the status code).