Related Records Data

A record usually contains additional information such as notes, attachments, products, deals, contacts, etc. Using related lists API, you can retrieve all the related list information.

Get Related Records

Purpose

To get the related list records.

Request Details

Request URL

https://www.zohoapis.com/crm/v2/{module_api_name}/{record_id}/{related_list_api_name}

Supported relations

All modules and their relations are supported. You can use the endpoint in the href attribute in the response of the Related List Meta data API  to fetch the records from the related lists of a module.

Header

Authorization: Zoho-oauthtoken d92d4xxxxxxxxxxxxx15f52
If-Modified-Since: Use this header to get the list of recently modified records. Example: 2019-07-25T15:26:49+05:30

Scope

scope=ZohoCRM.modules.ALL
(or)
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, custom, appointments, appointments_rescheduled_history, services and activities

Possible operation types

ALL - Full access to related records
READ - Read related records

Parameters

  • pageinteger, optional

    To get the list of records from the respective pages. Default value for page is 1.
    Possible values: Positive Integer values only.

  • per_pageinteger, optional

    To get the list of records available per page. Default value for page is 200.
    Possible values: Positive Integer values only.

Note
  • The page and per_page parameter is used to fetch records according to their position in the CRM. Let's assume that the user has to fetch 400 records. The maximum number of records that one can get for an API call is 200. So, for records above the 200th position, they cannot be fetched. By using the page (1 and 2) and per_page (200) parameter, the user can fetch all 400 records using 2 API calls.

Sample Request

Copiedcurl "https://www.zohoapis.com/crm/v2/Leads/410888000000698006/Notes"
-X GET
-H "Authorization: Zoho-oauthtoken 1000.8cb99dxxxxxxxxxxxxx9be93.9b8xxxxxxxxxxxxxxxf"
3.0.08.0
CopiedString moduleAPIName = "Leads";
Long recordId = 3477061000005177002l;
String relatedListAPIName = "Products";

//Get instance of RelatedRecordsOperations Class that takes relatedListAPIName, recordId and moduleAPIName as parameter
RelatedRecordsOperations relatedRecordsOperations = new RelatedRecordsOperations(relatedListAPIName, recordId, moduleAPIName);

//Get instance of ParameterMap Class
ParameterMap paramInstance = new ParameterMap();

paramInstance.add(GetRelatedRecordsParam.PAGE, 1);

paramInstance.add(GetRelatedRecordsParam.PER_PAGE, 2);

//Get instance of HeaderMap Class
HeaderMap headerInstance = new HeaderMap();

OffsetDateTime startdatetime = OffsetDateTime.of(2019, 06, 01, 10, 00, 01, 00, ZoneOffset.of("+05:30"));

headerInstance.add(GetRelatedRecordsHeader.IF_MODIFIED_SINCE, startdatetime);

//Call getRelatedRecords method that takes paramInstance, headerInstance as parameter
APIResponse < ResponseHandler > response = relatedRecordsOperations.getRelatedRecords(paramInstance, headerInstance);
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 RelatedRecordsData 
{
	private static void getRelatedRecords()
	{
		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/v2/Leads/34770617711001/Attachments");
			uriBuilder.addParameter("page", "1");
			uriBuilder.addParameter("per_page", "2");
			HttpUriRequest requestObj = new HttpGet(uriBuilder.build());
			requestObj.addHeader("Authorization", "Zoho-oauthtoken 1000.xxxxxxx.xxxxxxx");
			requestObj.addHeader("If-Modified-Since", "2019-09-12T17:59:50+05:30");
			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();
		}
	}
	private static void getRelatedRecord()
	{
		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/v2/Leads/34770617711001/Products/34770617081077");
			HttpUriRequest requestObj = new HttpGet(uriBuilder.build());
			requestObj.addHeader("Authorization", "Zoho-oauthtoken 1000.xxxxxxx.xxxxxxx");
			requestObj.addHeader("If-Modified-Since", "2021-10-12T17:59:50+05:30");
			HttpResponse response = httpclient.execute(requestObj);
			HttpEntity responseEntity = response.getEntity();
			System.out.println("HTTP Status Code : " + response.getStatusLine().getStatusCode());
			if(responseEntity != null)
			{
				if(uriBuilder.toString().contains("Attachments") && 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/username/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();
		}
	}
	public static void main(String[] args) 
	{
		getRelatedRecords();
		getRelatedRecord();
	}
}
3.0.07.x
Copied//Get instance of RelatedRecordsOperations Class that takes moduleAPIName, recordId and relatedListAPIName as parameter
$relatedRecordsOperations = new RelatedRecordsOperations( $relatedListAPIName,  $recordId,  $moduleAPIName);
//Get instance of ParameterMap Class
$paramInstance = new ParameterMap();
$paramInstance->add(GetRelatedRecordsParam::page(), 1);
$paramInstance->add(GetRelatedRecordsParam::perPage(), 2);
//Get instance of HeaderMap Class
$headerInstance = new HeaderMap();
$datetime = date_create("2019-02-26T15:28:34+05:30")->setTimezone(new \DateTimeZone(date_default_timezone_get()));
$headerInstance->add(GetRelatedRecordsHeader::IfModifiedSince(), $datetime);
//Call getRelatedRecords method that takes paramInstance, headerInstance as parameter
$response = $relatedRecordsOperations->getRelatedRecords($paramInstance, $headerInstance);
Copied<?php
class GetRelatedRecordsData{
    
    public function execute(){
        $curl_pointer = curl_init();
        
        $curl_options = array();
        $url = "https://www.zohoapis.com/crm/v2/Leads/34770617711001/Attachments?";
        $parameters = array();
        $parameters["page"]="1";
        $parameters["per_page"]="2";
        
        foreach ($parameters as $key=>$value){
            $url =$url.$key."=".$value."&";
        }
        $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";
        $headersArray[] = "If-Modified-Since".":"."2021-10-12T17:59:50+05:30";
        $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 GetRelatedRecordsData())->execute();
3.0.08.x
Copied//Get instance of RelatedRecordsOperations Class that takes relatedListAPIName, recordId and moduleAPIName as parameter
RelatedRecordsOperations relatedRecordsOperations = new RelatedRecordsOperations(relatedListAPIName, recordId, moduleAPIName);
//Get instance of ParameterMap Class
ParameterMap paramInstance = new ParameterMap();
//Get instance of HeaderMap Class
HeaderMap headerInstance = new HeaderMap();
DateTimeOffset ifModifiedSince = new DateTimeOffset(new DateTime(2020, 05, 15, 12, 0, 0, DateTimeKind.Local));
headerInstance.Add(GetRelatedRecordsHeader.IF_MODIFIED_SINCE, ifModifiedSince);
//Call GetRelatedRecords method that takes paramInstance, headerInstance as parameter
APIResponse<ResponseHandler> response = relatedRecordsOperations.GetRelatedRecords(paramInstance, headerInstance);
Copiedusing System;
using System.IO;
using System.Net;
using System.Xml;
using Newtonsoft.Json;
namespace Com.Zoho.Crm.API.Sample.RestAPI.RelatedRecords
{
    public class RelatedRecordsData
    {
        public static void GetRelatedRecords()
        {
            HttpWebRequest request = (HttpWebRequest)WebRequest.Create("https://www.zohoapis.com/crm/v2/Leads/34770617711001/Attachments?page=1");
            request.Method = "GET";
            request.Headers["Authorization"] = "Zoho-oauthtoken 1000.abfeXXXXXXXXXXX2asw.XXXXXXXXXXXXXXXXXXsdc2";
            string IfModifiedSince = JsonConvert.SerializeObject("2020-05-15T12:00:00+05:30");
            IfModifiedSince = IfModifiedSince.Replace("\\", "");
            IfModifiedSince = IfModifiedSince.Replace("\"", "");
            DateTime dateConversion = XmlConvert.ToDateTime(IfModifiedSince, XmlDateTimeSerializationMode.Utc);
            request.IfModifiedSince = dateConversion;
            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);
        }
        public static void GetRelatedRecord()
        {
            string url = "https://www.zohoapis.com/crm/v2/Leads/34770617711001/Attachments/34770617836002";
            HttpWebRequest request = (HttpWebRequest)WebRequest.Create(url);
            request.Method = "GET";
            request.Headers["Authorization"] = "Zoho-oauthtoken 1000.abfeXXXXXXXXXXX2asw.XXXXXXXXXXXXXXXXXXsdc2";
            string IfModifiedSince = JsonConvert.SerializeObject("2020-05-15T12:00:00+05:30");
            IfModifiedSince = IfModifiedSince.Replace("\\", "");
            IfModifiedSince = IfModifiedSince.Replace("\"", "");
            DateTime dateConversion = XmlConvert.ToDateTime(IfModifiedSince, XmlDateTimeSerializationMode.Utc);
            request.IfModifiedSince = dateConversion;
            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 && url.Contains("Attachments"))
            {
                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/abc-123/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 RelatedRecordsOperations Class that takes moduleAPIName, recordId and relatedListAPIName as parameter
related_records_operations = RelatedRecordsOperations(related_list_api_name, record_id, module_api_name)
# Get instance of ParameterMap Class
param_instance = ParameterMap()
# Possible parameters for Get Related Records operation
param_instance.add(GetRelatedRecordsParam.page, 1)
param_instance.add(GetRelatedRecordsParam.per_page, 100)
# Get instance of HeaderMap Class
header_instance = HeaderMap()
# Possible headers for Get Related Records operation
# header_instance.add(GetRelatedRecordsHeader.if_modified_since, datetime.fromisoformat('2019-10-15T05:00:00+05:30'))
# Call getRelatedRecords method that takes ParameterMap instance and HeaderMap instance as parameter
response = related_records_operations.get_related_records(param_instance, header_instance)
Copieddef get_related_records():
    import requests

    url = 'https://www.zohoapis.com/crm/v2/Products/3409643000000798007/Price_Books'

    headers = {
        'Authorization': 'Zoho-oauthtoken 1000.04be928e4a96XXXXXXXXXXXXX68.0b9eXXXXXXXXXXXX60396e268',
        'If-Modified-Since': '2020-03-19T17:59:50+05:30'
    }

    parameters = {
        'page': 1,
        'per_page': 2
    }

    response = requests.get(url=url, headers=headers, params=parameters)

    if response is not None:
        print("HTTP Status Code : " + str(response.status_code))

        print(response.json())


get_related_records()


def get_related_record():
    import requests
    import os

    url = 'https://www.zohoapis.com/crm/v2/Products/3409643000000798007/Price_Books/3409643000002414001'

    headers = {
        'Authorization': 'Zoho-oauthtoken 1000.04be928e4a96XXXXXXXXXXXXX68.0b9eXXXXXXXXXXXX60396e268',
        'If-Modified-Since': '2020-03-19T17:59:50+05:30'
    }

    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/aswin-7455/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)


get_related_record()
1.0.010.x
Copied//Get instance of RelatedRecordsOperations Class that takes moduleAPIName, recordId and relatedListAPIName as parameter
let relatedRecordsOperations = new RelatedRecordsOperations(relatedListAPIName, recordId, moduleAPIName);
//Get instance of ParameterMap Class
let paramInstance = new ParameterMap();
/* Possible parameters for Get Related Records operation */
await paramInstance.add(GetRelatedRecordsParam.PAGE, 1);
await paramInstance.add(GetRelatedRecordsParam.PER_PAGE, 200);
//Get instance of HeaderMap Class
let headerInstance = new HeaderMap();
/* Possible headers for Get Related Records operation */
await headerInstance.add(GetRelatedRecordsHeader.IF_MODIFIED_SINCE, new Date('October 15, 2019 05:35:32'));
//Call getRelatedRecords method that takes ParameterMap instance and HeaderMap instance as parameter
let response = await relatedRecordsOperations.getRelatedRecords(paramInstance, headerInstance);
Copiedasync function getRelatedRecords() {
    const got = require("got");

    let url = 'https://www.zohoapis.com/crm/v2/Products/3409643000000798007/Price_Books'

    let headers = {
        Authorization : "Zoho-oauthtoken 1000.abfeXXXXXXXXXXX2asw.XXXXXXXXXXXXXXXXXXsdc2",
        'If-Modified-Since' : '2020-03-19T17:59:50+05:30'
    }

    let parameters = {
        page : 1,
        per_page : 2
    }

    let requestDetails = {
        method : "GET",
        headers : headers,
        searchParams : parameters,
        throwHttpErrors : false
    }
    
    let response = await got(url, requestDetails)
    
    if(response != null) {
        console.log(response.statusCode);
        console.log(response.body);
    } 
}
getRelatedRecords()

async function getRelatedRecord() {
    const got = require("got");
    const fs = require("fs");
    const path = require("path");

    let url = 'https://www.zohoapis.com/crm/v2/Products/3409643000000798007/Price_Books/3409643000002414001'

    let headers = {
        Authorization : "Zoho-oauthtoken 1000.abfeXXXXXXXXXXX2asw.XXXXXXXXXXXXXXXXXXsdc2",
        'If-Modified-Since' : '2020-03-19T17:59:50+05:30'
    }

    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-XXX/Desktop", fileName);

                fs.writeFileSync(fileName, response.rawBody);
            }
        }
    } 
}
getRelatedRecord()
2.02.x.x
Copied# Get instance of RelatedRecordsOperations Class that takes moduleAPIName, recordId and relatedListAPIName as parameter
rro = RelatedRecords::RelatedRecordsOperations.new(related_list_api_name , record_id, module_api_name)
# Get instance of ParameterMap Class
pm = ParameterMap.new
# Possible parameters for Get Related Records operation
pm.add(RelatedRecords::RelatedRecordsOperations::GetRelatedRecordsParam.page, 1)
pm.add(RelatedRecords::RelatedRecordsOperations::GetRelatedRecordsParam.per_page, 1)
# Get instance of HeaderMap Class
hm = HeaderMap.new
# hm.add(RelatedRecords::GetRelatedRecordsHeader.If_modified_since,"")
# Call getRelatedRecords method that takes ParameterMap instance and HeaderMap instance as parameter
response = rro.get_related_records(pm, hm)



# Get instance of RelatedRecordsOperations Class that takes moduleAPIName, recordId and relatedListAPIName as parameter
rro = RelatedRecords::RelatedRecordsOperations.new(related_list_api_name , record_id, module_api_name)
# Get instance of HeaderMap Class
hm = HeaderMap.new
# Possible headers for Get Related Records operation
# hm.add(RelatedRecords::GetRelatedRecordsHeader.If_modified_since,"")
# Call getRelatedRecord method that takes header_instance and related_list_id as parameter
response = rro.get_related_record(related_record_id,hm)
Copiedclass GetRelatedRecordsData 

    def execute
        parameters ={}
        parameters["page"]="1"
        parameters["per_page"]="2"
        query_string = parameters.to_a.map { |x| "#{x[0]}=#{x[1]}" }.join('&')
        url= "https://www.zohoapis.com/crm/v2/Leads/3524033000005495065/Attachments"
        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["If-Modified-Since"]="2021-10-12T17:59:50+05:30"
        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
GetRelatedRecordsData.new.execute
1.0.0ES6
Copied//Get instance of RelatedRecordsOperations Class that takes moduleAPIName, recordId and relatedListAPIName as parameter
let relatedRecordsOperations = new ZCRM.RelatedRecord.Operations(relatedListAPIName, recordId, moduleAPIName);
//Get instance of ParameterMap Class
let paramInstance = new ParameterMap();
/* Possible parameters for Get Related Records operation */
await paramInstance.add(ZCRM.RelatedRecord.Model.GetRelatedRecordsParam.PAGE, 1);
await paramInstance.add(ZCRM.RelatedRecord.Model.GetRelatedRecordsParam.PER_PAGE, 200);
//Get instance of HeaderMap Class
let headerInstance = new HeaderMap();
/* Possible headers for Get Related Records operation */
// await headerInstance.add(ZCRM.RelatedRecord.Model.GetRelatedRecordsHeader.IF_MODIFIED_SINCE, new Date('October 15, 2019 05:35:32'));
//Call getRelatedRecords method that takes ParameterMap instance and HeaderMap instance as parameter
let response = await relatedRecordsOperations.getRelatedRecords(paramInstance, headerInstance);






//Get instance of RelatedRecordsOperations Class that takes moduleAPIName, recordId and relatedListAPIName as parameter
let relatedRecordsOperations = new ZCRM.RelatedRecord.Operations(relatedListAPIName, recordId, moduleAPIName);
//Get instance of HeaderMap Class
let headerInstance = new HeaderMap();
/* Possible parameters for Get Related Record operation */
await headerInstance.add(ZCRM.RelatedRecord.Model.GetRelatedRecordHeader.IF_MODIFIED_SINCE, new Date('June 15, 2020 05:35:32'));
//Call getRelatedRecord method that takes headerInstance and relatedRecordId as parameter
let response = await relatedRecordsOperations.getRelatedRecord(relatedListId, headerInstance);
Copiedvar listener = 0;
class RelatedRecordsData {

	async getRelatedRecords() {
		var url = "https://www.zohoapis.com/crm/v2/Leads/35240336189014/notes"
        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 RelatedRecordsData().getToken(token)
        headers.set("Authorization", "Zoho-oauthtoken " + accesstoken)
        headers.set("If-Modified-Since", "2019-09-12T17:59:50+05:30")
        parameters.set("page", "1")
        parameters.set("per_page", "2")
        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 RelatedRecordsData().makeAPICall(requestObj);
        console.log(result.status)
        console.log(result.response)
    }

	async getRelatedRecord() {
		var url = "https://www.zohoapis.com/crm/v2/Leads/35240336189014/notes/35240336243003"
        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 RelatedRecordsData().getToken(token)
        headers.set("Authorization", "Zoho-oauthtoken " + accesstoken)
        headers.set("If-Modified-Since", "2021-10-12T17:59:50+05:30")
        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 RelatedRecordsData().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);
                }
            }
        })
    }
}
Copiedresponse = invokeurl
[
	url: "https://www.zohoapis.com/crm/v2/Leads/410888000000698006/Notes"
	type: GET
	connection:"crm_oauth_connection"
];
info response;

Response JSON keys

  • OwnerJSON object

    Represents the name, ID, and email of the record owner.

  • Modified_Timestring

    Represents the date and time at which related record was last modified.

  • Created_Timestring

    Represents the date and time at which related record was created.

  • $editableboolean

    Represents if the user can edit the current related record.
    true: The user can edit the current related record.
    false: The user cannot edit the current related record.

  • Modified_ByJSON object

    Represents the name, ID, and email of the user who last modified the related record.

  • idstring

    Represents the unique ID of the related record.

  • Created_ByJSON object

    Represents the name, ID, and email of the user who created the related record.

Note
  • The keys listed above are common for all the related records. Along with the above keys, related record-specific keys will also be retrieved in the response.

  • The value of fields with sensitive health data will be retrieved only when Restrict Data access through API option in the compliance settings is disabled. If the option is enabled, the value will be null. Refer to HIPAA compliance for more details

Possible Errors

  • INVALID_MODULEHTTP 400

    The module name given seems to be invalid
    Resolution: You have specified an invalid module name or there is no tab permission, or the module could have been removed from the available modules. Specify a valid module API name.

  • INVALID_MODULEHTTP 400

    The given module is not supported in API
    Resolution: The modules such as Documents and Projects are not supported in the current API. (This error will not be shown, once these modules are been supported). Specify a valid module API name.

  • 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.modules.{module_name}.READ scope. Create a new client with valid scope. Refer to scope section above.

  • NO_PERMISSIONHTTP 403

    Permission denied to read related records
    Resolution: The user does not have permission to read related records data. 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 related records data
    Resolution: The user does not have the permission to read related records data. Contact your system administrator.

Sample Response

Copied{
    "data": [
        {
            "Owner": {
                "name": "Patricia Boyle",
                "id": "4150868000000225013",
                "email": "patricia.b@zylker.com"
            },
            "Modified_Time": "2020-07-26T15:26:58+05:30",
            "$attachments": null,
            "Created_Time": "2020-07-26T15:26:58+05:30",
            "Parent_Id": {
                "name": "patricia boyle",
                "id": "4150868000002737001"
            },
            "$editable": true,
            "$se_module": "Leads",
            "$is_shared_to_client": false,
            "Modified_By": {
                "name": "Patricia Boyle",
                "id": "4150868000000225013",
                "email": "patricia.b@zylker.com"
            },
            "$size": null,
            "$state": "save",
            "$voice_note": false,
            "id": "4150868000002738003",
            "Created_By": {
                "name": "Patricia Boyle",
                "id": "4150868000000225013",
                "email": "patricia.b@zylker.com"
            },
            "Note_Title": null,
            "Note_Content": "This is a sample note."
        }
    ],
    "info": {
        "per_page": 200,
        "count": 1,
        "page": 1,
        "more_records": false
    }
}