I'm a big fan of Guzzle it's great for making API calls. 

My typical code when making calls looks like this:

use GuzzleHttp\Client;
use Exception;

try {
    $client = new Client;
    $response = $client->post($url, ['form_params' => $params]);
    return json_decode($response->getBody()->getContents(), true);
} catch (Exception $e) {
    return $e->getMessage();

That all works but when there is an error returned from the API the errors are truncated. Calling the usually $e->getMessage is not the correct way with Guzzle instead throw an exception with the same response call used for returned data.

throw new Exception($e->getResponse()->getBody()->getContents());