Get the Status of the Bulk Read Job
Purpose
To get the details of a bulk read job performed previously.
Endpoints
Request Details
Request URL
https://www.zohoapis.com/crm/bulk/v2/read/{job_id}
where job_id is the unique ID of the bulk read job.
Header
Authorization: Zoho-oauthtoken d92d4xxxxxxxxxxxxx15f52
Scope
scope=ZohoCRM.bulk.read
(and)
scope=ZohoCRM.modules.{module_name}.{operation_type}
Possible module names
leads, accounts, contacts, deals, campaigns, tasks, cases, events, calls, solutions, products, vendors, pricebooks, quotes, salesorders, purchaseorders, invoices, and custom
Possible operation types
Full access to related records
READ - Get bulk read job
Sample Request
Copiedcurl "https://www.zohoapis.com/crm/bulk/v2/read/3652397000000646004"
-X GET
-H "Authorization: Zoho-oauthtoken 1000.8cb99dxxxxxxxxxxxxx9be93.9b8xxxxxxxxxxxxxxxf"
CopiedLong jobId = 3477061000005177002L;
//Get instance of BulkReadOperations Class
BulkReadOperations bulkReadOperations = new BulkReadOperations();
//Call getBulkReadJobDetails method that takes jobId as parameter
APIResponse < ResponseHandler > response = bulkReadOperations.getBulkReadJobDetails(jobId);
Copiedimport javax.net.ssl.SSLContext;
import org.apache.http.HttpEntity;
import org.apache.http.HttpResponse;
import org.apache.http.client.methods.HttpGet;
import org.apache.http.client.methods.HttpUriRequest;
import org.apache.http.client.utils.URIBuilder;
import org.apache.http.conn.ssl.NoopHostnameVerifier;
import org.apache.http.conn.ssl.SSLConnectionSocketFactory;
import org.apache.http.impl.client.CloseableHttpClient;
import org.apache.http.impl.client.HttpClientBuilder;
import org.apache.http.util.EntityUtils;
public class GettheStatusoftheBulkReadJob
{
public static void main(String[] args)
{
try
{
HttpClientBuilder httpClientBuilder = HttpClientBuilder.create();
SSLContext sslContext = SSLContext.getDefault();
SSLConnectionSocketFactory sslConnectionSocketFactory = new SSLConnectionSocketFactory(sslContext, NoopHostnameVerifier.INSTANCE);
CloseableHttpClient httpclient = httpClientBuilder.setSSLSocketFactory(sslConnectionSocketFactory).build();
URIBuilder uriBuilder = new URIBuilder("https://www.zohoapis.com/crm/bulk/v2/read/34770617772019");
HttpUriRequest requestObj = new HttpGet(uriBuilder.build());
requestObj.addHeader("Authorization", "Zoho-oauthtoken 1000.xxxxxxx.xxxxxxx");
HttpResponse response = httpclient.execute(requestObj);
HttpEntity responseEntity = response.getEntity();
System.out.println("HTTP Status Code : " + response.getStatusLine().getStatusCode());
if(responseEntity != null)
{
Object responseObject = EntityUtils.toString(responseEntity);
String responseString = responseObject.toString();
System.out.println(responseString);
}
}
catch(Exception ex)
{
ex.printStackTrace();
}
}
}
Copied//Get instance of BulkReadOperations Class
$bulkReadOperations = new BulkReadOperations();
//Call getBulkReadJobDetails method that takes jobId as parameter
$response = $bulkReadOperations->getBulkReadJobDetails($jobId);
Copied<?php
class GettheStatusoftheBulkReadJob{
public function execute(){
$curl_pointer = curl_init();
$url = "https://www.zohoapis.com/crm/bulk/v2/read/35240336003003";
$curl_options = array();
$curl_options[CURLOPT_URL] =$url;
$curl_options[CURLOPT_RETURNTRANSFER] = true;
$curl_options[CURLOPT_HEADER] = 1;
$curl_options[CURLOPT_CUSTOMREQUEST] = "GET";
$headersArray = array();
$headersArray[] = "Authorization". ":" . "Zoho-oauthtoken " . "1000.8cb99dxxxxxxxxxxxxx9be93.9b8xxxxxxxxxxxxxxxf";
$curl_options[CURLOPT_HTTPHEADER]=$headersArray;
curl_setopt_array($curl_pointer, $curl_options);
$result = curl_exec($curl_pointer);
$responseInfo = curl_getinfo($curl_pointer);
curl_close($curl_pointer);
list ($headers, $content) = explode("\r\n\r\n", $result, 2);
if(strpos($headers," 100 Continue")!==false){
list( $headers, $content) = explode( "\r\n\r\n", $content , 2);
}
$headerArray = (explode("\r\n", $headers, 50));
$headerMap = array();
foreach ($headerArray as $key) {
if (strpos($key, ":") != false) {
$firstHalf = substr($key, 0, strpos($key, ":"));
$secondHalf = substr($key, strpos($key, ":") + 1);
$headerMap[$firstHalf] = trim($secondHalf);
}
}
$jsonResponse = json_decode($content, true);
if ($jsonResponse == null && $responseInfo['http_code'] != 204) {
list ($headers, $content) = explode("\r\n\r\n", $content, 2);
$jsonResponse = json_decode($content, true);
}
var_dump($headerMap);
var_dump($jsonResponse);
var_dump($responseInfo['http_code']);
}
}
(new GettheStatusoftheBulkReadJob())->execute();
Copied//Get instance of BulkReadOperations Class
BulkReadOperations bulkReadOperations = new BulkReadOperations();
//Call GetBulkReadJobDetails method that takes jobId as parameter
APIResponse<ResponseHandler> response = bulkReadOperations.GetBulkReadJobDetails(jobId);
Copiedusing System;
using System.IO;
using System.Net;
namespace Com.Zoho.Crm.API.Sample.RestAPI.BulkRead
{
public class GettheStatusoftheBulkReadJob
{
public static void GettheStatusoftheBulkRead()
{
HttpWebRequest request = (HttpWebRequest)WebRequest.Create("https://www.zohoapis.com/crm/bulk/v2/read/34770617772019");
request.Method = "GET";
request.Headers["Authorization"] = "Zoho-oauthtoken 1000.abfeXXXXXXXXXXX2asw.XXXXXXXXXXXXXXXXXXsdc2";
request.KeepAlive = true;
HttpWebResponse response;
try
{
response = (HttpWebResponse)request.GetResponse();
}
catch (WebException e)
{
if (e.Response == null) { throw; }
response = (HttpWebResponse)e.Response;
}
HttpWebResponse responseEntity = response;
Console.WriteLine("HTTP Status Code : " + (int)response.StatusCode);
string responsestring = new StreamReader(responseEntity.GetResponseStream()).ReadToEnd();
responseEntity.Close();
Console.WriteLine(responsestring);
}
}
}
Copied# Get instance of BulkReadOperations Class
bulk_read_operations = BulkReadOperations()
# Call get_bulk_read_job_details method that takes jobId as parameter
response = bulk_read_operations.get_bulk_read_job_details(job_id)
Copieddef get_status_of_bulk_read_job():
import requests
url = 'https://www.zohoapis.com/crm/bulk/v2/read/3409643000002461001'
headers = {
'Authorization': 'Zoho-oauthtoken 1000.04be928e4a96XXXXXXXXXXXXX68.0b9eXXXXXXXXXXXX60396e268',
}
response = requests.get(url=url, headers=headers)
if response is not None:
print("HTTP Status Code : " + str(response.status_code))
print(response.json())
get_status_of_bulk_read_job()
Copied//Get instance of BulkReadOperations Class
let bulkReadOperations = new BulkReadOperations();
//Call getBulkReadJobDetails method that takes jobId as parameter
let response = await bulkReadOperations.getBulkReadJobDetails(jobId);
Copiedasync function getStatusOfBulkReadJob() {
const got = require("got");
let url = 'https://www.zohoapis.com/crm/bulk/v2/read/3409643000002461001'
let headers = {
Authorization : "Zoho-oauthtoken 1000.8cb99dxxxxxxxxxxxxx9be93.9b8xxxxxxxxxxxxxxxf"
}
let requestDetails = {
method : "GET",
headers : headers,
throwHttpErrors : false
}
let response = await got(url, requestDetails)
if(response != null) {
console.log(response.statusCode);
console.log(response.body);
}
}
getStatusOfBulkReadJob()
Copied# Get instance of BulkReadOperations Class
bro = BulkRead::BulkReadOperations.new
# Call get_bulk_read_job_details method that takes jobId as parameter
response = bro.get_bulk_read_job_details(job_id)
Copiedclass GettheStatusoftheBulkReadJob
def execute
parameters ={}
parameters["job_id"]="3524033000006027001"
query_string = parameters.to_a.map { |x| "#{x[0]}=#{x[1]}" }.join('&')
url= "https://www.zohoapis.com/crm/bulk/v2/read/3524033000006003003"
url += '?' + query_string if !query_string.nil? && (query_string.strip != '')
url = URI(url)
req = Net::HTTP::Get.new(url.request_uri)
http = Net::HTTP.new(url.host, url.port)
http.use_ssl = true
headers={}
headers["Authorization"]="Zoho-oauthtoken 1000.50XXXXXXXXX&77e3a.44XXXXXXXXX8353"
headers["Content-Type"]="application/json"
headers&.each { |key, value| req.add_field(key, value) }
response=http.request(req)
status_code = response.code.to_i
headers = response.each_header.to_h
print status_code
print headers
unless response.body.nil?
print response.body
end
end
end
GettheStatusoftheBulkReadJob.new.execute
Copied//Get instance of BulkReadOperations Class
let bulkReadOperations = new ZCRM.BulkRead.Operations();
//Call getBulkReadJobDetails method that takes jobId as parameter
let response = await bulkReadOperations.getBulkReadJobDetails(jobId);
Copiedvar listener = 0;
class GettheStatusoftheBulkReadJob {
async gettheStatusoftheBulkRead() {
var url = "https://www.zohoapis.com/crm/bulk/v2/read/34770619080469"
var parameters = new Map()
var headers = new Map()
var token = {
clientId:"1000.NPY9M1V0XXXXXXXXXXXXXXXXXXXF7H",
redirectUrl:"http://127.0.0.1:5500/redirect.html",
scope:"ZohoCRM.users.ALL,ZohoCRM.bulk.read,ZohoCRM.modules.ALL,ZohoCRM.settings.ALL,Aaaserver.profile.Read,ZohoCRM.org.ALL,profile.userphoto.READ,ZohoFiles.files.ALL,ZohoCRM.bulk.ALL,ZohoCRM.settings.variable_groups.ALL"
}
var accesstoken = await new GettheStatusoftheBulkReadJob().getToken(token)
headers.set("Authorization", "Zoho-oauthtoken " + accesstoken)
var requestMethod = "GET"
var reqBody = null
var params = "";
parameters.forEach(function(value, key) {
if (parameters.has(key)) {
if (params) {
params = params + key + '=' + value + '&';
}
else {
params = key + '=' + value + '&';
}
}
});
var apiHeaders = {};
if(headers) {
headers.forEach(function(value, key) {
apiHeaders[key] = value;
});
}
if (params.length > 0){
url = url + '?' + params.substring(0, params.length - 1);
}
var requestObj = {
uri : url,
method : requestMethod,
headers : apiHeaders,
body : JSON.stringify(reqBody),
encoding: "utf8",
allowGetBody : true,
throwHttpErrors : false
};
var result = await new GettheStatusoftheBulkReadJob().makeAPICall(requestObj);
console.log(result.status)
console.log(result.response)
}
async getToken(token) {
if(listener == 0) {
window.addEventListener("storage", function(reponse) {
if(reponse.key === "access_token" && (reponse.oldValue != reponse.newValue || reponse.oldValue == null)){
location.reload();
}
if(reponse.key === "access_token"){
sessionStorage.removeItem("__auth_process");
}
}, false);
listener = 1;
if(sessionStorage.getItem("__auth_process")) {
sessionStorage.removeItem("__auth_process");
}
}
["granted_for_session", "access_token","expires_in","expires_in_sec","location","api_domain","state","__token_init","__auth_process"].forEach(function (k) {
var isKeyExists = localStorage.hasOwnProperty(k);
if(isKeyExists) {
sessionStorage.setItem(k, localStorage[k]);
}
localStorage.removeItem(k);
});
var valueInStore = sessionStorage.getItem("access_token");
var tokenInit = sessionStorage.getItem("__token_init");
if(tokenInit != null && valueInStore != null && Date.now() >= parseInt(tokenInit) + 59 * 60 * 1000){ // check after 59th minute
valueInStore = null;
sessionStorage.removeItem("access_token");
}
var auth_process = sessionStorage.getItem("__auth_process");
if ((valueInStore == null && auth_process == null) || (valueInStore == 'undefined' && (auth_process == null || auth_process == "true"))) {
var accountsUrl = "https://accounts.zoho.com/oauth/v2/auth"
var clientId;
var scope;
var redirectUrl;
if(token != null) {
clientId = token.clientId;
scope = token.scope;
redirectUrl = token.redirectUrl;
}
var fullGrant = sessionStorage.getItem("full_grant");
var grantedForSession = sessionStorage.getItem("granted_for_session");
if(sessionStorage.getItem("__token_init") != null && ((fullGrant != null && "true" == full_grant) || (grantedForSession != null && "true" == grantedForSession))) {
accountsUrl += '/refresh';
}
if (clientId && scope) {
sessionStorage.setItem("__token_init", Date.now());
sessionStorage.removeItem("access_token");
sessionStorage.setItem("__auth_process", "true");
window.open(accountsUrl + "?" + "scope" + "=" + scope + "&"+ "client_id" +"=" + clientId + "&response_type=token&state=zohocrmclient&redirect_uri=" + redirectUrl);
["granted_for_session", "access_token","expires_in","expires_in_sec","location","api_domain","state","__token_init","__auth_process"].forEach(function (k) {
var isKeyExists = localStorage.hasOwnProperty(k);
if(isKeyExists){
sessionStorage.setItem(k, localStorage[k]);
}
localStorage.removeItem(k);
});
valueInStore = sessionStorage.getItem("access_token");
}
}
if(token != null && valueInStore != 'undefined'){
token.accessToken = valueInStore;
}
return token.accessToken;
}
async makeAPICall(requestDetails) {
return new Promise(function (resolve, reject) {
var body, xhr, i;
body = requestDetails.body || null;
xhr = new XMLHttpRequest();
xhr.withCredentials = true;
xhr.open(requestDetails.method, requestDetails.uri, true);
for (i in requestDetails.headers) {
xhr.setRequestHeader(i, requestDetails.headers[i]);
}
xhr.send(body);
xhr.onreadystatechange = function() {
if(xhr.readyState == 4) {
resolve(xhr);
}
}
})
}
}
Copied//Get instance of BulkReadOperations Class
let bulkReadOperations: BulkReadOperations = new BulkReadOperations();
//Call getBulkReadJobDetails method that takes jobId as parameter
let response: APIResponse < ResponseHandler > = await bulkReadOperations.getBulkReadJobDetails(jobId);
Copiedimport got from 'got';
class GettheStatusoftheBulkReadJob {
public async main() {
var apiHeaders: {[key: string]: string} = {};
var apiParameters: {[key: string]: string} = {};
var modifiedRequestBody: any;
apiHeaders["Authorization"] = "Zoho-oauthtoken 1000.xxxxxxx.xxxxxx"
var requestDetails: {[key: string]: any} = {
method : "GET",
headers : apiHeaders,
searchParams : apiParameters,
body : modifiedRequestBody,
encoding: "utf8",
allowGetBody : true,
throwHttpErrors : false
};
var response = await got("https://www.zohoapis.com/crm/bulk/v2/read/34770619338001", requestDetails);
console.log(response.statusCode)
console.log(JSON.parse(response.body));
}
}
var v = new GettheStatusoftheBulkReadJob()
v.main()
Sample Response: For Job Added
Copied{
"data": [
{
"id": "3652397000000646004",
"operation": "read",
"state": "ADDED",
"query": {
"fields": [
"Last_Name",
"Owner",
"Owner.last_name",
"Account_Name.Account_Name",
"Account_Name.Phone",
"Lead_Source",
"Created_Time"
],
"module": "Contacts",
"criteria": {
"group": [
{
"api_name": "Lead_Source",
"comparator": "equal",
"value": "Advertisement"
},
{
"api_name": "Owner.last_name",
"comparator": "equal",
"value": "Boyle"
},
{
"api_name": "Account_Name.Phone",
"comparator": "contains",
"value": "5"
}
],
"group_operator": "or"
},
"page": 1
},
"created_by": {
"id": "3652397000000186017",
"name": "Patricia Boyle"
},
"created_time": "2019-04-01T14:20:04+05:30"
}
]
}
Sample Response: For Job In Progress
Copied{
"data": [
{
"id": "3652397000000646004",
"operation": "read",
"state": "IN PROGRESS",
"query": {
"fields": [
"Last_Name",
"Owner",
"Owner.last_name",
"Account_Name.Account_Name",
"Account_Name.Phone",
"Lead_Source",
"Created_Time"
],
"module": "Contacts",
"criteria": {
"group": [
{
"api_name": "Lead_Source",
"comparator": "equal",
"value": "Advertisement"
},
{
"api_name": "Owner.last_name",
"comparator": "equal",
"value": "Boyle"
},
{
"api_name": "Account_Name.Phone",
"comparator": "contains",
"value": "5"
}
],
"group_operator": "or"
},
"page": 1
},
"created_by": {
"id": "3652397000000186017",
"name": "Patricia Boyle"
},
"created_time": "2019-04-01T14:22:04+05:30"
}
]
}
Sample Response: For Job Completed
Copied{
"data": [
{
"id": "3652397000000646004",
"operation": "read",
"state": "COMPLETED",
"result": {
"page": 1,
"count": 20,
"download_url": "/crm/bulk/v2/read/3652397000000646004/result",
"per_page": 200000,
"more_records": false
},
"query": {
"fields": [
"Last_Name",
"Owner",
"Owner.last_name",
"Account_Name.Account_Name",
"Account_Name.Phone",
"Lead_Source",
"Created_Time"
],
"module": "Contacts",
"criteria": {
"group": [
{
"api_name": "Lead_Source",
"comparator": "equal",
"value": "Advertisement"
},
{
"api_name": "Owner.last_name",
"comparator": "equal",
"value": "Boyle"
},
{
"api_name": "Account_Name.Phone",
"comparator": "contains",
"value": "5"
}
],
"group_operator": "or"
},
"page": 1
},
"created_by": {
"id": "3652397000000186017",
"name": "Patricia Boyle"
},
"created_time": "2019-04-01T14:24:04+05:30"
}
]
}
Response Structure
- operationstring
Specifies the type of action the API completed. Sample - "operation" : "read”.
- created_byJSON Object
Specifies the ID and Name of the user who initiated the bulk read job. Sample - "created_by": { "id": "1000000031045", "name": "Patricia Boyle" },
- created_timeISO8601
Specifies the time period of when the bulk read job was initialized.
- statestring
Specifies the current status of the bulk read job. Example: "state": "ADDED" or "IN PROGRESS" or "COMPLETED".
- queryJSON Object
Specifies the "query" provided by the user when creating the bulk read job. The attributes are the same as in the Request JSON, with "modules", "cvid", fields", "criteria" and "page".
- idString
Specifies the unique identifier of the bulk read job. Sample - "id": "1000010760002".
- resultJSON Object
It is available only after the completion of the job. Please refer to the below section for information on the "result" JSON object.
"result" Properties
- pageInteger
Describes the range of the number of records exported. If the "page" is one, then the number of records would be between 1 - 200,000. If it's "two", then the records from 200,001 - 400,000 will be taken for export.
- countInteger
Specifies the actual number of records exported. Sample - "count": 14567
- download_urlString
Specifies the url which contains the CSV file. User can send a GET request with your api domain attached to the download URL to download the file. Sample - "/crm/bulk/v2/read/2883756000001275012/result".
- more_recordsboolean
The "more_records" key in the response can be used to detect if there are any further records. You can change the value of "page" key for additional export jobs.
To know about the Bulk Read API limits, go here.
Possible Errors
- INVALID_URL_PATTERNHTTP 404
Please check if the URL trying to access is a correct one
Resolution: The request URL specified is incorrect. Specify a valid request URL. Refer to request URL section above. - OAUTH_SCOPE_MISMATCHHTTP 401
Unauthorized
Resolution: Client does not have ZohoCRM.bulk.read or ZohoCRM.modules.{module_name}.READ. Create a new client with valid scope. Refer to scope section above. - NO_PERMISSIONHTTP 403
Permission denied to read
Resolution: The user does not have permission to read records. Contact your system administrator. - INTERNAL_ERRORHTTP 500
Internal Server Error
Resolution: Unexpected and unhandled exception in Server. Contact support team. - INVALID_REQUEST_METHODHTTP 400
The http request method type is not a valid one
Resolution: You have specified an invalid HTTP method to access the API URL. Specify a valid request method. Refer to endpoints section above. - AUTHORIZATION_FAILEDHTTP 400
User does not have sufficient privilege to read.
Resolution: The user does not have the permission to read records. Contact your system administrator. - RESOURCE_NOT_FOUNDHTTP 404
The requested resource doesn't exist.
Resolution: The job ID specified is invalid. Specify a valid job ID.
Sample Request: For the job with cvid and Criteria
Copiedcurl "https://www.zohoapis.com/crm/bulk/v2/read/554023000000568002"
-X GET
-H "Authorization: Zoho-oauthtoken 1000.8cb99dxxxxxxxxxxxxx9be93.9b8xxxxxxxxxxxxxxxf"
CopiedZCRMBulkRead readIns= ZCRMRestClient.GetInstance().GetBulkReadInstance(3477061000002); // To get the ZCRMBulkRead instance using job_id
APIResponse response = readIns.GetBulkReadJobDetails();
ZCRMBulkRead bulkReadIns = (ZCRMBulkRead)response.Data;// To get ZCRMBulkRead instance
Sample Response: For Job Completed
Copied{
"data": [
{
"id": "554023000000568002",
"operation": "read",
"state": "COMPLETED",
"result": {
"page": 1,
"count": 3,
"download_url": "/crm/bulk/v2/read/554023000000568002/result",
"per_page": 200000,
"more_records": false
},
"query": {
"fields": [
"Last_Name",
"Owner",
"Owner.last_name",
"$converted",
"Lead_Source",
"Lead_Status",
"Company",
"Email",
"Mobile",
"Created_Time"
],
"module": "Leads",
"criteria": {
"group": [
{
"api_name": "$converted",
"comparator": "equal",
"value": true
},
{
"api_name": "Owner.last_name",
"comparator": "equal",
"value": "Patricia Boyle"
}
],
"group_operator": "and"
},
"page": 1,
"cvid": "554023000000093005"
},
"created_by": {
"id": "554023000000235011",
"name": "Patricia Boyle"
},
"created_time": "2019-05-09T14:01:24+05:30"
}
]
}