Create a Cadence
Purpose
To create a cadence for your org in Zoho CRM.
Endpoints
- POST /settings/automation/cadences
Request Details
Request URL
{api-domain}/crm/{version}/settings/automation/cadences
Header
Authorization: Zoho-oauthtoken d92d4xxxxxxxxxxxxx15f52
Scope
ZohoCRM.settings.cadences.ALL
(or)
ZohoCRM.settings.cadences.CREATE
Sample Request
Copiedcurl "https://www.zohoapis.com/crm/v8/settings/automation/cadences"
-X POST
-d "@input.json"
-H "Authorization: Zoho-oauthtoken 1000.8cb99dxxxxxxxxxxxxx9be93.9b8xxxxxxxxxxxxxxxf"Request JSON Keys
- namestring, mandatory
Represents the name of the cadence. Accepts alphanumeric characters. Maximum 100 characters. Must not contain #, %, or ^. Must be unique within the organization.
- moduleJSON object, mandatory
Represents the API name and ID of the module for which you want to create the cadence. Use the Get Modules API to get the API name and ID of the module.
- typestring, mandatory
Represents the type of the cadence. Possible values are:
- custom_view: To create a cadence for a specific custom view.
- manual_enrollment: To create a cadence for manually enrolling records.
- custom_viewJSON object, mandatory if type = custom_view
The unique ID of the custom view you want to create the cadence for. Use the Get Custom View API to get the ID of the custom view.
- execution_detailsJSON object, optional
Each JSON object in this array represents the frequency of execution of the cadence, unenrollment properties, and the follow up criteria.
- execute_everyJSON object, optional
Represents the frequency of execution(in "period" and "unit") of the cadence.
period - string, mandatory - the time period the cadence must execute. Allowed values are immediately, hours, days, and weeks.
unit - integer, mandatory - Positive integer values.
For example, period = hours, unit = 1 means the cadence will execute every one hour. - unenroll_propertiesJSON array, optional
Represents when the records in the cadence must be unenrolled. Possible values for the type key are:
- automatic_unenroll: Represents you want to unenroll the records from the cadence automatically.
Sample:{"type":"automatic_unenroll"} - end_date: Represents you want to unenroll the records from the cadence after the end date. You must also include the "details" key with the end date in the YYYY-MM-DD format.
Sample:{"type":"end_date","details": {"unenroll_date": "2026-10-29"}} - criteria: Represents you want to unenroll the records from the cadence based on criteria.
Sample:{ "type": "criteria", "details": { "criteria": { "field": { "api_name": "Annual_Revenue" }, "comparator": "equal", "value": 10000 } } } - followup_criteria: Represents you want to unenroll the records from the cadence when a specific follow up criterion is met.
specific: The value "true" indicates that the unenrollment criteria applies to a specific follow up.
state: The name and ID of the follow up state.
Sample:{ "type": "followup_criteria", "details": { "type": "Tasks", "details": { "criteria": { "field": { "api_name": "Subject", "id": "111112000000004066" }, "comparator": "equal", "value": "Send Welcome Email" }, "specific": true, "state": { "name": "FollowUp2", "id": "111112000000092010" } } } }
- automatic_unenroll: Represents you want to unenroll the records from the cadence automatically.
- follow_upsJSON array, optional
Represents an ordered list of automated actions like tasks, emails, calls that you want to trigger within the cadence. Follow-ups are linked via reference_id and parent_follow_up.
- reference_idstring, conditional
Temporary identifier used to link follow-ups within the same request. Must follow the format {{Followup_1}}, {{Followup_2}}, and so on. Required for the first follow-up. Include for any follow-up that you want to reference as a parent.
- parent_follow_upJSON object, conditional
Required for all follow-ups after the first. Must include reference_id. Set to null for the first follow-up.
- triggersJSON array, conditional
Represents the outcome status of the parent follow-up that must occur before this step executes (e.g., ["Completed"]). triggers is required when parent_follow_up.reference_id is given.
- execute_afterJSON object, conditional
Represents the delay between the trigger condition being met and this follow-up executing. Contains unit(integer) and period(accepted values: minutes, hours, business_hours, days, business_days, months).
- actionJSON object, mandatory
Represents the activity to perform at this follow-up step. Contains the following keys:
- type: string, mandatory - The activity type. Accepted values are tasks, email_notifications, schedule_call, whatsapp_message_notification.
- id: string, mandatory - ID of the pre-configured action (task, email notification, or WhatsApp message) to use for this follow-up step. Required for tasks, email_notifications, and whatsapp_message_notification action types. Not applicable for schedule_call.
- details: JSON object, conditional - Required when action.type is schedule_call. Contains the following keys:
- layout: JSON object, mandatory - The ID and name of the layout. Use the Layouts Metadata API to get the ID of the required layout.
- module: JSON object, mandatory - The ID and name of the module associated with the call. Use the Modules API to get the ID and name of the required module.
- field_mappings: JSON array, mandatory - Field mappings for the scheduled call. Each item requires field, type, and value.
- field - JSON object, mandatory - The ID and name of the field to map with. Use the Layouts Metadata API to get the ID of the required field.
- type: string, mandatory - The mapping strategy. Accepted values are static, reference, time_computed, execution_time, merge_field.
- value: string/JSON object, mandatory - The value to assign to the mapped field. The structure depends on the field being mapped:
a. Simple string used for picklist and text fields(e.g., "Outbound", "Scheduled").
b. Owner object{"name": "${CURRENTUSER}"} to assign to the current user.
c. Time object for execution_time type - {"period": "business_days", "unit": "1", "sign": "plus", "time": "00:00", "trigger_field": "${CURRENTTIME}"}.
d. Reminder object - {"unit": "15", "period": "minutes"}.
Sample Input
Copied{
"cadences": [
{
"name": "cadenceNew",
"description": "description",
"module": {
"api_name": "Leads",
"id": "554023000000000125"
},
"type": "custom_view",
"custom_view": {
"id": "554023000000091501"
},
"execution_details": {
"execute_every": {
"period": "hours",
"unit": 1
},
"unenroll_properties": [
{
"type": "automatic_unenroll"
},
{
"type": "end_date",
"details": {
"unenroll_date": "2027-01-01"
}
},
{
"type": "criteria",
"details": {
"criteria": {
"field": {
"api_name": "Annual_Revenue"
},
"comparator": "equal",
"value": 25000
}
}
},
{
"type": "followup_criteria",
"details": {
"type": "Tasks",
"details": {
"criteria": {
"field": {
"api_name": "Subject",
"id": "554023000000000221"
},
"comparator": "equal",
"value": "important"
},
"specific": false,
"state": null
}
}
}
]
},
"follow_ups": [
{
"parent_follow_up": null,
"reference_id": "{{Followup_1}}",
"action": {
"type": "tasks",
"id": "111112000000091250"
}
},
{
"parent_follow_up": {
"reference_id": "{{Followup_1}}"
},
"reference_id": "{{Followup_2}}",
"triggers": [
"Completed"
],
"execute_after": {
"unit": 10,
"period": "minutes"
},
"action": {
"type": "schedule_call",
"details": {
"layout": {
"id": "111112000000003660",
"name": "Standard"
},
"module": {
"id": "111112000000002654",
"api_name": "Calls"
},
"field_mappings": [
{
"field": {
"id": "111112000000004208",
"api_name": "Call_Type"
},
"type": "static",
"value": "Outbound"
},
{
"field": {
"id": "111112000000004236",
"api_name": "Outgoing_Call_Status"
},
"type": "static",
"value": "Scheduled"
},
{
"field": {
"id": "111112000000004216",
"api_name": "Call_Start_Time"
},
"type": "execution_time",
"value": {
"period": "business_days",
"unit": "1",
"sign": "plus",
"time": "00:00",
"trigger_field": "${CURRENTTIME}"
}
},
{
"field": {
"id": "111112000000004204",
"api_name": "Owner"
},
"type": "static",
"value": {
"name": "${CURRENTUSER}"
}
},
{
"field": {
"id": "111112000000004262",
"api_name": "Call_Purpose"
},
"type": "static",
"value": "Demo"
},
{
"field": {
"id": "111112000000004264",
"api_name": "Call_Agenda"
},
"type": "static",
"value": "test"
},
{
"field": {
"id": "111112000000004206",
"api_name": "Subject"
},
"type": "static",
"value": "test subject"
},
{
"field": {
"id": "111112000000004232",
"api_name": "Reminder"
},
"type": "static",
"value": {
"unit": "15",
"period": "minutes"
}
}
]
}
}
}
]
}
]
}Possible Errors
- INVALID_DATAHTTP 400
The name field contains one or more disallowed characters. Special characters #, %, and ^, as well as emoji, are not permitted.
Resolution: Remove all special characters and emoji from the cadence name. Use only alphanumeric characters and supported punctuation. - INVALID_DATAHTTP 400
The value provided for name or description exceeds the allowed character limit.
Resolution: Ensure the name does not exceed 100 characters and the description does not exceed 500 characters. Check the maximum_length key in the error response for the exact limit that was breached. - INVALID_DATAHTTP 400
The value provided for the type field is not supported.
Resolution: Use one of the supported values for type: custom_view or manual_enrollment. Refer to the supported_values key in the error response for the valid options. - INVALID_DATAHTTP 400
The value provided for execute_every.period is not a supported option.
Resolution: Use one of the supported values for period: immediately, hours, days, or weeks. Refer to the supported_values key in the error response. - INVALID_DATAHTTP 400
The value provided for execute_every.unit is outside the permitted range.
Resolution: Provide a valid integer for unit based on the selected period: The accepted range is 1 to 99. - INVALID_DATAHTTP 400
The value provided for reference_id does not follow the required format.
Resolution: Use the format {{Followup_<count>}} where <count> is a sequential integer starting from 1 (for example, Followup_1, Followup_2). This value must match the reference_id assigned to another follow-up in the same request when used inside parent_follow_up. - INVALID_DATAHTTP 400
The value provided for action.type is not a supported option.
Resolution: Use one of the supported values for action.type: tasks, email_notifications, schedule_call, or whatsapp_message_notification. Refer to the supported_values key in the error response. - INVALID_DATAHTTP 400
The value provided for action.id is not a valid action ID.
Resolution: Verify that the id references an existing action template. Ensure the action belongs to the correct type (tasks, email_notifications, or whatsapp_message_notification) and has not been deleted. - INVALID_DATAHTTP 400
The specified action.id is already associated with another cadence, or the same ID appears more than once in the request.
Resolution: Each action can be linked to only one follow-up. Use a different action ID that is not already in use, or remove the duplicate entry from the request. - INVALID_DATAHTTP 400
The id provided for action.details.layout or action.details.module is not valid.
Resolution: Verify the layout ID using the Layouts Metadata API and the module ID using the Get Modules API. Ensure the IDs referenced belong to the correct module and have not been deleted.JSON path:$.cadences[0].follow_ups[n].action.details.layout.id /
- INVALID_DATAHTTP 400
The value provided for type inside a field_mappings entry is not supported.
Resolution: Use one of the supported values for field mapping type: static, reference, time_computed, execution_time, or merge_field. Refer to the supported_values key in the error response. - INVALID_DATAHTTP 400
The value provided for execute_after.period is not a supported option.
Resolution: Use one of the supported values for execute_after.period: minutes, hours, business_hours, days, business_days, or months. - INVALID_DATAHTTP 400
The value provided for execute_after.unit is outside the permitted range for the selected period.
Resolution: Provide a valid integer for unit based on the execute_after.period selected. The accepted range is 1 to 99. - INVALID_DATAHTTP 400
The value provided for unenroll_date does not match the required date format.
Resolution: Provide the unenroll_date value in YYYY-MM-DD format (for example, 2026-10-29). - INVALID_DATAHTTP 400
The follow-up ID provided in details.state.id is not valid.
Resolution: Provide the ID of an existing follow-up that belongs to this cadence. Use the Get Cadences API to retrieve valid follow-up IDs. - INVALID_DATAHTTP 400
The value provided for type in an unenroll_properties entry is not supported.
Resolution: Use one of the supported values for unenroll_properties[].type: automatic_unenroll, end_date, criteria, or followup_criteria. - MANDATORY_NOT_FOUNDHTTP 400
One or more of the mandatory fields such as name, module, or type are missing from the request body.
Resolution: Include all three fields in the request body. Refer to the Request JSON Keys section for the full list of mandatory parameters. - MANDATORY_NOT_FOUNDHTTP 400
The mandatory field period is missing from the execute_every object inside execution_details.
Resolution: Include the period key in the execute_every object. The supported values are immediately, hours, days, and weeks. - MANDATORY_NOT_FOUNDHTTP 400
One or more mandatory fields are missing inside a follow_ups object: reference_id, parent_follow_up (for follow-ups beyond the first), action, or action.type.
Resolution: Ensure every follow-up entry includes reference_id, action, and action.type. All follow-ups after the first must also include parent_follow_up. Refer to the json_path in the error response to identify the exact missing field. - MANDATORY_NOT_FOUNDHTTP 400
One or more mandatory fields are missing from the action.details object required for a schedule_call action: layout, module, field_mappings, or one of the field mapping sub-keys (field, type, value).
Resolution: Provide all required fields in the action.details object:- layout - the ID of the call layout.
- module - the ID of the module.
- field_mappings - an array of field mapping objects, each containing field, type, and value.
Refer to the json_path in the error response to identify the exact missing field.
- MANDATORY_NOT_FOUNDHTTP 400
The mandatory fields unit and/or period are missing from the execute_after object in a follow-up.
Resolution: Include both unit and period in the execute_after object. Refer to the json_path in the error response to identify the exact missing field. - DUPLICATE_DATAHTTP 400
A cadence with the specified name already exists in your organization.
Resolution: Provide a unique name for the cadence. Use the Get Cadences API to verify that the name is not already in use. - DEPENDENT_FIELD_MISSINGHTTP 400
Dependent Field missing
Resolution: The execute_after field is required when triggers field is provided. Provide execute_after field. - DEPENDENT_FIELD_MISSINGHTTP 400
The custom_view field is required when type is set to custom_view, but it was not included in the request.
Resolution: Include the custom_view object with its id when the cadence type is custom_view. Use the Get Custom View API to obtain the correct ID. - DEPENDENT_FIELD_MISSINGHTTP 400
The unit field is required inside execute_every when period is not immediately, but it was not provided.
Resolution: Include the unit key in the execute_every object whenever period is hours, days, or weeks. The value must be an integer between 1 and 99. - DEPENDENT_FIELD_MISSINGHTTP 400
A required dependent field for the specified action.type is missing: either id or details.
Resolution: Provide the correct dependent field based on the action.type value:- When action.type is tasks, email_notifications, or whatsapp_message_notification — include the id of the relevant action template.
- When action.type is schedule_call, include the details object instead.
- DEPENDENT_FIELD_MISSINGHTTP 400
The details object is required for the specified unenroll_properties.type but was not provided.
Resolution: Include the details object for all unenroll_properties entries where type is end_date, criteria, or followup_criteria. - DEPENDENT_FIELD_MISSINGHTTP 400
The unenroll_date field is required inside details when unenroll_properties.type is end_date, but it was not included.
Resolution: Add the unenroll_date key to the details object when type is end_date. The date must be in YYYY-MM-DD format. - DEPENDENT_FIELD_MISSINGHTTP 400
The criteria field is required inside details when unenroll_properties.type is criteria, but it was not included.
Resolution: Add the criteria key to the details object when type is criteria. The criteria object must contain at least one of group or field. - DEPENDENT_FIELD_MISSINGHTTP 400
The nested details object (inside unenroll_properties.details) is required when unenroll_properties.type is followup_criteria, but it was not provided.
Resolution: Include the inner details object inside unenroll_properties.details when type is followup_criteria. This object must specify the follow-up action type, whether to match a specific follow-up state (specific), the target state (state), and the criteria. - DEPENDENT_FIELD_MISSINGHTTP 400
The specific (boolean) and/or state (JSON object) fields are missing from the nested details object when unenroll_properties.type is followup_criteria.
Resolution: Include both specific and state in the inner details object. Set specific to true to match a specific follow-up state (and provide state.id), or to false to match any state (in which case state should be omitted or null). - DEPENDENT_FIELD_MISSINGHTTP 400
The criteria field is required inside the nested details.details object when unenroll_properties.type is followup_criteria, but it was not provided.
Resolution: Add the criteria key to the inner details object. The criteria object must define the conditions (using group or field) under which the record should be unenrolled from the cadence. - EXPECTED_FIELD_MISSINGHTTP 400
The parent_follow_up object is missing at least one identifier. Either reference_id or id must be specified.
Resolution: Provide either the reference_id (for newly created follow-ups in the same request, e.g. Followup_1) or the id (for existing follow-ups) inside the parent_follow_up object. - EXPECTED_FIELD_MISSINGHTTP 400
The criteria object inside unenroll_properties.details is missing both group and field.
Resolution: Provide at least one of group or field inside the criteria object to define the unenrollment condition.JSON path:$.cadences[0].execution_details.unenroll_properties[n].criteria.group /
- EXPECTED_DEPENDENT_FIELD_MISSINGHTTP 400
A follow-up has a parent_follow_up.reference_id defined, but triggers was not included.
Resolution: When a follow-up references a parent via reference_id, provide triggers. - DEPENDENT_MISMATCHHTTP 400
One or more values in the triggers array are not valid for the parent follow-up's action type.
Resolution: Use only trigger values that are applicable to the parent follow-up's action type. For example, task actions support triggers such as Not Started, Deferred, In Progress, Completed, and Waiting on someone else. Refer to the supported_values key in the error response for the full list valid for the specific action type. - DEPENDENT_MISMATCHHTTP 400
The type value inside the nested details object is not valid for a followup_criteria unenroll property.
Resolution: Use one of the supported values for details.type within a followup_criteria entry: tasks, schedule_call, email_notifications, or whatsapp_message_notification. - AMBIGUITY_DURING_PROCESSINGHTTP 400
The same trigger value appears more than once in the triggers array of a single follow-up.
Resolution: Remove duplicate entries from the triggers array. Each trigger value must be unique within a single follow-up's triggers array. - AMBIGUITY_DURING_PROCESSINGHTTP 400
There is a conflict between the values of specific and state in the nested details object of a followup_criteria unenroll property.
Resolution: Ensure the two fields are consistent:- When specific is true — provide the state object with a valid follow-up id.
- When specific is false — omit the state field or set it to null; do not include a state object alongside a false value.
- ALREADY_USEDHTTP 400
A trigger value has already been used by a sibling follow-up that shares the same parent follow-up and cannot be reused.
Resolution: Each trigger value can be assigned to only one child follow-up per parent. Review the exists_in.json_path in the error response to see which follow-up already uses this trigger, and assign a different, unused trigger value to the current follow-up. - LIMIT_EXCEEDEDHTTP 400
A specific unenroll_properties type has been specified more than the permitted number of times.
Resolution: Each unenroll type (except followup_criteria) may appear only once in the unenroll_properties array. Review the array and remove duplicate type entries. - LIMIT_EXCEEDEDHTTP 400
The number of follow-ups in the cadence exceeds the allowed maximum.
Resolution: A maximum of 70 follow-ups can be created per cadence. Remove or consolidate follow-up steps to stay within this limit. - LIMIT_EXCEEDEDHTTP 400
The number of cadences for the specified module has reached its maximum limit.
Resolution: A maximum of 60 cadences can be created per module. Delete unused cadences from this module before creating a new one. - LIMIT_EXCEEDEDHTTP 400
The total number of cadences across your organization has reached its maximum limit.
Resolution: A maximum of 150 cadences can exist across the entire organization. Delete unused cadences from any module before creating new ones. - INVALID_REQUEST_METHODHTTP 400
The request method is incorrect.
Resolution: Use the HTTP POST method to make this API call. Any other request method will result in this error. - AUTHORIZATION_FAILEDHTTP 400
You do not have sufficient permission to add a cadence.
Resolution: Contact your system administrator. - OAUTH_SCOPE_MISMATCHHTTP 401
The access token you have used to make this API call does not have the required scope.
Resolution: Generate a new access token with the scope ZohoCRM.settings.cadences.CREATE or ZohoCRM.settings.cadences.ALL. - NO_PERMISSIONHTTP 403
You do not have the Crm_Implied_Manage_Cadences permission.
Resolution: Contact your system administrator. - INVALID_URL_PATTERNHTTP 404
The request URL is incorrect.
Resolution: Specify a valid request URL. Refer to the Request URL section for the right URL. - INTERNAL_ERRORHTTP 500
Unexpected and unhandled exception in the server.
Resolution: Contact the support team at support@zohocrm.com.
Sample Response
Copied{
"cadences": [
{
"code": "SUCCESS",
"details": {
"id": "554023000006316085"
},
"message": "Cadences created successfully",
"status": "success"
}
]
}