true, CURLOPT_HTTPHEADER => $headers, CURLOPT_CONNECTTIMEOUT => 10, CURLOPT_TIMEOUT => 20, CURLOPT_SSL_VERIFYPEER => true, CURLOPT_SSL_VERIFYHOST => 2, )); $body = curl_exec($ch); $http = curl_getinfo($ch, CURLINFO_HTTP_CODE); $err = curl_error($ch); curl_close($ch); if ($body === false) { return array('ok'=>false, 'http'=>$http ?: 0, 'error'=>'Transport error: '.$err, 'url'=>$url); } $json = json_decode($body, true); if ($json === null) { return array('ok'=>false, 'http'=>$http, 'error'=>'Non‑JSON response', 'url'=>$url, 'raw'=>$body); } // API-level errors follow the pattern: {"Error": "Message"} (capital E) if (isset($json['Error']) || isset($json['error'])) { $msg = isset($json['Error']) ? $json['Error'] : $json['error']; return array('ok'=>false, 'http'=>$http, 'error'=>$msg, 'url'=>$url, 'data'=>$json); } return array('ok'=>true, 'http'=>$http, 'url'=>$url, 'data'=>$json); } /** Pretty printer */ function show($title, $res) { echo "=== $title ===\n"; echo "URL: {$res['url']}\n"; echo "HTTP: {$res['http']}\n"; if ($res['ok']) { echo "OK\n"; echo json_encode($res['data'], JSON_UNESCAPED_UNICODE|JSON_PRETTY_PRINT), "\n\n"; } else { echo "ERROR: {$res['error']}\n"; if (isset($res['data'])) { echo json_encode($res['data'], JSON_UNESCAPED_UNICODE|JSON_PRETTY_PRINT), "\n\n"; } elseif (isset($res['raw'])) { echo $res['raw'], "\n\n"; } else { echo "\n"; } } } // Safe read-only tests (do not charge balance) show('balance', call_api($BASE_URL, array('key'=>$API_KEY,'action'=>'balance'), $TOKEN)); show('test error', call_api($BASE_URL, array('key'=>'1234567890','action'=>'services'), $TOKEN)); show('status order', call_api($BASE_URL, array('key'=>$API_KEY,'action'=>'status','order'=>406), $TOKEN)); // Uncomment to create a real order (this charges balance!) // $link = 'https://www.instagram.com/bigstata/'; // $create = call_api($BASE_URL, array( // 'key'=>$API_KEY, 'action'=>'create', 'service'=>4, 'quantity'=>100, 'link'=>$link // ), $TOKEN); // show('create', $create);