Download Bulk Write Result

Purpose

To download the result of the bulk write job as a CSV file.

Download URL

Use the URL present in the download_url parameter in the response of Get Bulk Write Job Details.
The file will be in the .zip format. Extract it to get the CSV file. The filename would be in the modulename-filename format. Example: Deals-bulkwrite.
The CSV file will contain the first three mapped columns from the uploaded file, and three more columns — ID, Status, and Errors.

  • STATUS

    This column indicates if the record is added, skipped, updated, or unprocessed.

  • RECORD_ID

    This column indicates the added or updated record's ID in Zoho CRM.

  • ERRORS

    This column contains the error code. The format is:

    • <errorCode>-<column_header> for a single error. Example: MANDATORY_NOT_FOUND-Company

    • <errorCode>-<column_header>:<errorCode>-<column_header> for multiple errors. Example: MANDATORY_NOT_FOUND-Company,Last_Name:DUPLICATE_DATA-Email

The possible errors are MANDATORY_NOT_FOUND, INVALID_DATA, DUPLICATE_DATA, NOT_APPROVED, BLOCKED_RECORD, CANNOT_PROCESS, LIMIT_EXCEEDED, and RESOURCE_NOT_FOUND.

Sample Result

sample result

Sample Request

3.0.08.0
CopiedString downloadUrl = "https://download-accl.zoho.com/v2/crm/6735/bulk-write/347706122009/347706122009.zip";
String destinationFolder = "/Users/user_name/Documents";

//Get instance of BulkWriteOperations Class
BulkWriteOperations bulkWriteOperations = new BulkWriteOperations();

//Call downloadBulkWriteResult method that takes downloadUrl as parameter
APIResponse < ResponseHandler > response = bulkWriteOperations.downloadBulkWriteResult(downloadUrl);
Copiedimport java.io.File;
import java.io.FileOutputStream;
import java.io.InputStream;
import java.io.OutputStream;
import 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 DownloadBulkWriteResult 
{	
	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://download-accl.zoho.com/v2/crm/673573045/bulk-write/34770617780026/34770617780026.zip");
			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)
			{
				if(response.containsHeader("Content-Disposition"))
				{
					String contentDisposition = response.getFirstHeader("Content-Disposition").getValue();
					String fileName = contentDisposition.split("=")[1];
					if(fileName.contains("''"))
			        {
			            fileName = fileName.split("''")[1];
			        }
					if(fileName.contains("\""))
			        {
			        	fileName = fileName.replace("\"", "");
			        }
					//Create a file instance with the absolute_file_path
					File file = new File("/Users/usernames/Desktop" + File.separatorChar + fileName);
					//Get InputStream from the response
					InputStream is = responseEntity.getContent();
					//Create an OutputStream for the destination file
					OutputStream os = new FileOutputStream(file);
					byte[] buffer = new byte[1024];
			        int bytesRead;
			        //read the InputStream till the end
			        while((bytesRead = is.read(buffer)) != -1)
			        {
			        	//write data to OutputStream
			        	os.write(buffer, 0, bytesRead);
			        }
			        //Close the InputStream
			        is.close();
			        //Flush and close the OutputStream
			        os.flush();
			        os.close();
				}
				else
				{
					Object responseObject = EntityUtils.toString(responseEntity);
					String responseString = responseObject.toString();
					System.out.println(responseString);
				}
			}
		}
		catch(Exception ex)
		{
			ex.printStackTrace();
		}
	}
}
3.0.07.x
Copied//Get instance of BulkWriteOperations Class
$bulkWriteOperations = new BulkWriteOperations();
//Call downloadBulkWriteResult method that takes downloadUrl as parameters
$response = $bulkWriteOperations->downloadBulkWriteResult($downloadUrl);
Copied<?php
class DownloadBulkWriteResult{

    public function execute(){
        $curl_pointer = curl_init();
        
        $curl_options = array();
        $curl_options[CURLOPT_URL] = "https://download-accl.zoho.com/v2/crm/6773045/bulk-write/34770617780026/34770617780026.zip";
        $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);
            }
        }
        $response = $content;
        if ($response == null && $responseInfo['http_code'] != 204) {
            list ($headers, $content) = explode("\r\n\r\n", $content, 2);
            $response = json_decode($content, true);
        }
        $contentDisp = $headerMap['Content-Disposition'];
        $fileName = substr($contentDisp, strrpos($contentDisp, "'") + 1, strlen($contentDisp));
        
        if (strpos($fileName, "=") !== false)
        {
            $fileName = substr($fileName, strrpos($fileName, "=") + 1, strlen($fileName));
            
            $fileName = str_replace(array(
                '\'',
                '"'
            ), '', $fileName);
        }
        $filePath = "/Users/test/PHP/PHPNativeSampleCode/";
        $fp = fopen($filePath . $fileName, "w"); // $filePath - absolute path where downloaded file has to be stored.
        $stream = $response;
        fputs($fp, $stream);
        fclose($fp);   
    }
  
}
(new DownloadBulkWriteResult())->execute();
3.0.08.x
Copied//Get instance of BulkWriteOperations Class
BulkWriteOperations bulkWriteOperations = new BulkWriteOperations();
//Call DownloadBulkWriteResult method that takes downloadUrl as parameter
APIResponse<ResponseHandler> response = bulkWriteOperations.DownloadBulkWriteResult(downloadUrl);
Copiedusing System;
using System.IO;
using System.Net;
namespace Com.Zoho.Crm.API.Sample.RestAPI.BulkWrite
{
    public class DownloadBulkWriteResult
    {
        public static void DownloadBulkWrite()
        {
            HttpWebRequest request = (HttpWebRequest)WebRequest.Create("https://download-accl.zoho.com/v2/crm/673573045/bulk-write/34770617821002/34770617821002.zip");
            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);
            WebHeaderCollection collection = responseEntity.Headers;
            string contentDisposition = collection["Content-Disposition"];
            if (contentDisposition != null)
            {
                string fileName = contentDisposition.Split(new string[] { "=" }, StringSplitOptions.None)[1];
                if (fileName.Contains("''"))
                {
                    fileName = fileName.Split(new string[] { "''" }, StringSplitOptions.None)[1];
                }
                fileName = fileName.Trim('\"');
                string fullFilePath = Path.Combine("/Users/raja-7453/Desktop", fileName);
                using (FileStream outputFileStream = new FileStream(fullFilePath, FileMode.Create))
                {
                    responseEntity.GetResponseStream().CopyTo(outputFileStream);
                }
                responseEntity.Close();
            }
            else
            {
                string responsestring = new StreamReader(responseEntity.GetResponseStream()).ReadToEnd();
                responseEntity.Close();
                Console.WriteLine(responsestring);
            }
        }
    }
}
3.0.03.x.x
Copied# Get instance of BulkWriteOperations Class
bulk_write_operations = BulkWriteOperations()
# Call download_bulk_write_result method that takes download_url as parameter
response = bulk_write_operations.download_bulk_write_result(download_url)
Copieddef download_result():
    import requests
    import os

    url = 'https://download-accl.zoho.com/v2/crm/673899828/bulk-write/340964300000191101/340964300000191101.zip'

    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))

        if 'Content-Type' in response.headers:
            content_type = response.headers['Content-Type'].split(';')[0]

            if content_type == 'application/json':
                print(response.json())
            else:
                if 'Content-Disposition' in response.headers:
                    file_name = ''
                    content_disposition = response.headers['Content-Disposition']

                    if "'" in content_disposition:
                        start_index = content_disposition.rindex("'")
                        file_name = content_disposition[start_index + 1:]

                    elif '"' in content_disposition:
                        start_index = content_disposition.rindex('=')
                        file_name = content_disposition[start_index + 1:].replace('"', '')

                    destination_file = os.path.join('/Users/abc-123/Documents/SDK-workspace/latest-git-csez/python/latest/zohocrm-python-sdk', file_name)

                    with open(destination_file, 'wb') as f:
                        for chunk in response:
                            f.write(chunk)

download_result()
1.0.010.x
Copied//Get instance of BulkWriteOperations Class
let bulkWriteOperations = new BulkWriteOperations();
//Call downloadBulkWriteResult method that takes downloadUrl as parameter
let response = await bulkWriteOperations.downloadBulkWriteResult(downloadUrl);
Copiedasync function downloadResult() {
    const got = require("got");
    const fs = require("fs");
    const path = require("path");

    let url = 'https://download-accl.zoho.com/v2/crm/673899828/bulk-write/340964300000191101/340964300000191101.zip'

    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);
        
        if(response.headers.hasOwnProperty('content-type')) {
            let contentType = response.headers['content-type'].split(";")[0];

            if(contentType == 'application/json') {
                console.log(response.body);
            }
            else {
                let fileName = "";

                let contentDisposition = (response.headers['content-disposition']);

                if(contentDisposition.includes("'")){
                    let startIndex = contentDisposition.lastIndexOf("'");

                    fileName = contentDisposition.substring(startIndex + 1);
                }
                else if(contentDisposition.includes("\"")){
                    let startIndex = contentDisposition.lastIndexOf("=");

                    fileName = contentDisposition.substring(startIndex + 1).replace(/"/g, "");
                }

                fileName = path.join("/Users/abc-123/Documents/SDK/latest/nodejs/zohocrm-nodejs-sdk", fileName);

                fs.writeFileSync(fileName, response.rawBody);
            }
        }
    }
    
}
downloadResult()
2.02.x.x
Copied# Get instance of BulkWriteOperations Class
bwo = BulkWrite::BulkWriteOperations.new
# Call download_bulk_write_result method that takes download_url as parameter
response = bwo.download_bulk_write_result(download_url)
Copiedclass DownloadBulkWriteResult 

    def execute
      
        url = "https://download-accl.zoho.com/v2/crm/673XXX45/bulk-write/347706100026/34770780026.zip"
        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&.each { |key, value| req.add_field(key, value) }   
        
        response=http.request(req)
        file_name = response.to_hash["content-disposition"][0].split('=')[1]

        file_name = file_name.split("''")[1] if file_name.include? "''"

        file_name = file_name.gsub('"', '') if file_name.include? '"'

        status_code = response.code.to_i
        headers = response.each_header.to_h
        print status_code
        print headers
        unless response.body.nil?
            File.open("/Users/test/RUBY/RUBYNativeSampleCode/"+file_name, 'w') { |file| file.write(response.body) }
        end
    end
end
DownloadBulkWriteResult.new.execute
1.0.0ES6
Copied//Get instance of BulkWriteOperations Class
let bulkWriteOperations = new ZCRM.BulkWrite.Operations();
//Call downloadBulkWriteResult method that takes downloadUrl as parameter
let response = await bulkWriteOperations.downloadBulkWriteResult(downloadUrl);
Copiedvar listener = 0;
class DownloadBulkWriteResult {

	async downloadBulkWriteResult()	{
		var url = "https://download-accl.zoho.com/v2/crm/123456778/bulk-write/34770619080471/3477069080471.zip"
        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 DownloadBulkWriteResult().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 DownloadBulkWriteResult().makeAPICall(requestObj);
        console.log(result.status)
        console.log(result.response)
        var filename;

        var disposition = result.getResponseHeader('content-disposition');//No I18N

        if (disposition && disposition.indexOf('attachment') !== -1) {

            var filenameRegex = /filename[^;=\n]*=((['"]).*?\2|[^;\n]*)/;

            var matches = filenameRegex.exec(disposition);

            if (matches != null && matches[1]) {

                filename = matches[1].replace(/['"]/g, '');

                filename = filename.replace('UTF-8','');
            }
        }
        let readStream = result.response;

        var url = URL.createObjectURL(readStream);

        var ttt = document.createElement('a');

        ttt.href = url;

        ttt.download = filename;

        ttt.click();

    }

    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.responseType = "blob";//No I18N
            xhr.send(body);
            xhr.onreadystatechange = function() {
                if(xhr.readyState == 4) {
                    resolve(xhr);
                }
            }
        })
    }
}
1.0.14.x.x
Copied/Get instance of BulkWriteOperations Class
let bulkWriteOperations: BulkWriteOperations = new BulkWriteOperations();

//Call downloadBulkWriteResult method that takes downloadUrl as parameter
let response: APIResponse < ResponseHandler > = await bulkWriteOperations.downloadBulkWriteResult(downloadUrl);
Copiedimport got from 'got';
import { createWriteStream } from "fs";
class DownloadBulkWriteResult {
	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://download-accl.zoho.com/v2/crm/xxxx/bulk-write/34770619339001/34770619339001.zip", requestDetails);
		console.log(response.statusCode)
		var filepath :string="/Users/username/Documents"
		var contentDispo :string = response.headers["content-disposition"]
		var filename :string= contentDispo.split( "=")[1]

		if (filename.includes( "''")) {

			filename = filename.split( "''")[1]
		}
		if(filename.includes("\"")){
			let start_index = filename.lastIndexOf("=");
			filename = filename.substring(start_index + 1).replace(/"/g, "");
		}
		filepath = filepath +"/"+filename
		var writeStream = createWriteStream(filepath);
		writeStream.write(response.rawBody)
	}

}
var v = new DownloadBulkWriteResult()

v.main()