Update Records
Purpose
To update existing records in the module.
Request Details
Request URL
https://{{your-domain}}.zohoplatform.com/crm/v2/{module_api_name}
To update a specific record:
https://{{your-domain}}.zohoplatform.com/crm/v2/{module_api_name}/{record_id}
Supported modules
Leads, Accounts, Contacts, Deals, Campaigns, Tasks, Cases, Events, Calls, Solutions, Products, Vendors, Price Books, Quotes, Sales Orders, Purchase Orders, Invoices, and Custom
Header
Authorization: Zoho-oauthtoken d92d4xxxxxxxxxxxxx15f52
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, and notes
Possible operation types
ALL - Full access to the record
WRITE - Edit records in the module
UPDATE - Update records in the module
Sample Request
Copiedcurl "https://zylkercorp.zohoplatform.com/crm/v2/Leads"
-X PUT
-d "@updatelead.json"
-H "Authorization: Zoho-oauthtoken 1000.8cb99dxxxxxxxxxxxxx9be93.9b8xxxxxxxxxxxxxxxf"
Copied//Get instance of RecordOperations Class
let recordOperations = new ZCRM.Record.Operations();
//Get instance of BodyWrapper Class that will contain the request body
let request = new ZCRM.Record.Model.BodyWrapper();
//Array to hold Record instances
let recordsArray = [];
let record1 = new ZCRM.Record.Model.Record();
//ID of the record to be updated
record1.setId(34770619074373n);
/*
* Call addFieldValue method that takes two arguments
* 1 -> Call Field "." and choose the module from the displayed list and press "." and choose the field name from the displayed list.
* 2 -> Value
*/
record1.addFieldValue(ZCRM.Record.Model.Field.Leads.CITY, "City");
record1.addFieldValue(ZCRM.Record.Model.Field.Leads.LAST_NAME, "Last Name");
record1.addFieldValue(ZCRM.Record.Model.Field.Leads.FIRST_NAME, "First Name");
record1.addFieldValue(ZCRM.Record.Model.Field.Leads.COMPANY, "KKRNP");
/*
* Call addKeyValue method that takes two arguments
* 1 -> A string that is the Field's API Name
* 2 -> Value
*/
record1.addKeyValue("Custom_field", "Custom val");
record1.addKeyValue("Custom_field_2", 10);
//Used when GDPR is enabled
let dataConsent = new ZCRM.Record.Model.Consent();
dataConsent.setConsentRemarks("Approved.");
dataConsent.setConsentThrough("Email");
dataConsent.setContactThroughEmail(true);
dataConsent.setContactThroughSocial(false);
record1.addKeyValue("Data_Processing_Basis_Details", dataConsent);
recordsArray.push(record1);
let record2 = new ZCRM.Record.Model.Record();
//ID of the record to be updated
record2.addFieldValue(ZCRM.Record.Model.Field.Leads.ID, 34096431881002n);
/*
* Call addFieldValue method that takes two arguments
* 1 -> Call Field "." and choose the module from the displayed list and press "." and choose the field name from the displayed list.
* 2 -> Value
*/
record2.addFieldValue(ZCRM.Record.Model.Field.Leads.CITY, "City");
record2.addFieldValue(ZCRM.Record.Model.Field.Leads.LAST_NAME, "Last Name");
record2.addFieldValue(ZCRM.Record.Model.Field.Leads.FIRST_NAME, "First Name");
record2.addFieldValue(ZCRM.Record.Model.Field.Leads.COMPANY, "KKRNP");
/*
* Call addKeyValue method that takes two arguments
* 1 -> A string that is the Field's API Name
* 2 -> Value
*/
record2.addKeyValue("Custom_field", "Value");
record2.addKeyValue("Custom_field_2", "value");
//Add Record instance to the array
recordsArray.push(record2);
//Set the array to data in BodyWrapper instance
request.setData(recordsArray);
let trigger = [];
trigger.push("approval");
trigger.push("workflow");
trigger.push("blueprint");
//Set the array containing the trigger operations to be run
request.setTrigger(trigger);
//Call updateRecords method that takes BodyWrapper instance and moduleAPIName as parameter.
let response = await recordOperations.updateRecords(moduleAPIName, request);
Copiedvar listener = 0;
class UpdateRecords {
async updateListRecord() {
var url = "https://zylkercorp.zohoplatform.com/crm/v2/Leads"
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 UpdateRecords().getToken(token)
headers.set("Authorization", "Zoho-oauthtoken " + accesstoken)
var requestMethod = "PUT"
var reqBody = {"data":[{"Last_Name":"Lead_changed","id":"35240336189014","Email":"newcrmapi@zylkercorp.com","Company":"abc","Lead_Status":"Contacted"},{"Last_Name":"New Lead","Email":"newlead@zylkercorp.com","Company":"abc","Lead_Status":"Contacted"}],"trigger":["approval","workflow","blueprint"]}
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 UpdateRecords().makeAPICall(requestObj);
console.log(result.status)
console.log(result.response)
}
async updateRecord() {
var url = "https://zylkercorp.zohoplatform.com/crm/v2/Leads/35240336189014"
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 UpdateRecords().getToken(token)
headers.set("Authorization", "Zoho-oauthtoken " + accesstoken)
var requestMethod = "PUT"
var reqBody = {"data":[{"Last_Name":"Lead_changed","Email":"newcrmapi@zylkercorp.com","Company":"abc","Lead_Status":"Contacted"}],"trigger":["approval","workflow","blueprint"]}
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 UpdateRecords().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://zylkercorp.zohoplatform.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);
}
}
})
}
}
CopiedSyntax:
<variable> =zoho.crm.updateRecord(<module_name>, <record_ID>, <record_value>, [<query_value>], [<connection>]);
mandatory: module_name, record_id
Sample Request:
leadinfo =
{
"Company":"Zylker",
"Last_Name":"Stewart",
"Phone":"9876XXXXXX",
"Email":"stewart@zylkercorp.com"
};
response = zoho.crm.updateRecord("Leads",23033XXXXXXXXXXXXXX,leadinfo);
Show full
Show less
In the request, "@updatelead.json" contains the sample input.
Request JSON Keys
- idstring, mandatory
Specify the unique ID of the record that you want to update. Refer to the Get Records API to get the unique ID of the record.
- $append_valuesJSON object, optional
Represents whether you want to append the values of the multi-select picklist you specified in the input to the existing values. Specify the API names of the multi-select picklist and "true" or "false" as key-value pairs in this JSON object. The value "true" adds the values in the input to the multi-select picklist, while the value "false" replaces the existing values with the ones in the input.
Example:
"$append_values":{
"Multi_Select_1": true,
"Multi_Select_2": false
}
Note that the values are appended or replaced only for those records that have this key in the input. For the other multi-select picklists, the existing values are simply replaced by default. - apply_feature_executionJSON array
Use this array to apply an existing layout rule when you update a record. Layout rules allow you to show a section, certain fields, set mandatory fields, or show a subform. However, you can only trigger the "Set Mandatory Field" option through the API. Specify the value layout_rules for the key name to apply a layout rule to the record. Note that you must give this key parallel to "data".
Ensure that the input body includes all the keys required to satisfy the criteria in the layout rule. The system throws an error, otherwise. For example, if the layout rule triggers when the Lead_Source is Employee Referral, and you have mandated the Company field, then the system throws the MANDATORY_NOT_FOUND error if you fail to give the Company key in the input.
The 'INVALID_DATA' error is thrown if the field value length is more than the maximum length defined for that field.
If an API is used inside a Function and the field value length exceeds the limit, then that function receives error response from the API. For ex: If the max length for a "Text field" is defined as 10, then value given for it in API cannot be "12345678901", as it has 11 characters.
A maximum of 100 records can be updated per API call.
You must use only Field API names in the input. You can obtain the field API names from
Fields metadata API (the value for the key “api_name” for every field). (Or)
Setup > Developer Space > APIs > API Names > {Module}. Choose “Fields” from the “Filter By” drop-down.
Records with Subform details can also be updated to Vertical Solutions using the Records API. Please look at Subforms API to learn more about updating subform information within a record.
If the update API calls for a record are from DRE(Functions), due to workflow triggered on the same record's create/update, workflow alone will not get executed, irrespective of the trigger param configuration.
Refer Response Structure for more details about the JSON keys, values, and their descriptions. You can also use the sample response of each module as the input when you insert, update, or upsert a record in that corresponding module.
Refer to Get Records API to know more about field types and limits.
Refer to the Insert Records API for the accepted regex patterns for the email, phone, and URL fields.
Sample Input
Copied{
"data": [
{
"id": "554023000000527002",
"Company": "Zylker",
"State":"Baltimore",
"Foreign_Languages": [ //multi-select picklist
"Korean"
],
"$append_values": {
"Foreign_Languages": false
}
},
{
"id": "554023000000527003",
"Company": "abc",
"State":"Baltimore",
"Foreign_Languages": [ //multi-select picklist
"Spanish", "French"
],
"$append_values": {
"Foreign_Languages": true
}
}
],
"trigger": [
"approval"
],
"apply_feature_execution": [
{
"name": "layout_rules"
}
]
}
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_DATAHTTP 202
the id given seems to be invalid
Resolution: You have specified an incorrect record ID. Please specify a valid record ID. Refer to Get Records API to get valid record IDs. - MANDATORY_NOT_FOUNDHTTP 202
You have not specified one or more mandatory fields.
Resolution:You must specify all the mandatory fields of the module including the layout-specific ones(if you want to execute the layout rule). - 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}.UPDATE scope. Create a new client with valid scope. Refer to scope section above. - NO_PERMISSIONHTTP 403
Permission denied to update
Resolution: The user does not have permission to update 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 update records
Resolution: The user does not have the permission to update records. Contact your system administrator. - DUPLICATE_DATAHTTP 202
duplicate data
Resolution: You have specified a duplicate value for one or more unique fields. Refer to Fields Metadata API to know the unique fields. - LIMIT_EXCEEDEDHTTP 202
Only 50 participants can be added to an event.
Resolution: You are trying to update an event with more than 50 participants. You can add only upto 50 participants to an event.
Sample Response
Copied{
"data": [
{
"code": "SUCCESS",
"details": {
"Modified_Time": "2019-05-02T11:17:33+05:30",
"Modified_By": {
"name": "Patricia Boyle",
"id": "554023000000235011"
},
"Created_Time": "2022-08-08T10:53:33+05:30",
"id": "554023000000527002",
"Created_By": {
"name": "Patricia Boyle",
"id": "554023000000235011"
}
},
"message": "record updated",
"status": "success"
},
{
"code": "SUCCESS",
"details": {
"Modified_Time": "2022-08-08T10:53:33+05:30,
"Modified_By": {
"name": "Patricia Boyle",
"id": "554023000000235011"
},
"Created_Time": "2019-05-02T11:17:33+05:30",
"id": "554023000000527003",
"Created_By": {
"name": "Patricia Boyle",
"id": "554023000000235011"
}
},
"message": "record updated",
"status": "success"
}
]
}