Hello everyone!
Welcome back to another week of Kaizen. In last week's 
post in the 
Kaizen series, we discussed how subforms work in Zoho CRM and how to manipulate subform data using Zoho CRM APIs.
In this post, we will discuss how to manipulate a multi-select lookup fields using Zoho CRM APIs.
Multi-select lookup field
The Multi-Select Lookup Field enables you to establish a many-to-many relationship between two different modules in CRM. It allows you to associate multiple records with each other, from two different modules. 
These associations are stored in an individual module called "
Linking Module". Consider there are two modules, 
Employees and 
Skills. The Employees module contains details regarding Zylker's workforce, and the Skills module contains details regarding various skills like Social Media Marketing and Content Marketing.
We want to associate multiple skills to an employee. So, a multi-select lookup can be created in the Employees module. When doing so, similar multi-select lookup field will be automatically created in the Skills module, along with the EmpXSkills linking module by Zoho CRM. The underlying data model is described in the below image.
 The above chart shows the data model representation when you create a multi-select lookup field in a module. Here, there are two lookup fields—one pointing to the Employees module and the other pointing to the Skills module.
The above chart shows the data model representation when you create a multi-select lookup field in a module. Here, there are two lookup fields—one pointing to the Employees module and the other pointing to the Skills module. In the linking module, two lookup fields (lookup fields with api names - Employees and Skills) will be created. The lookup fields, one pointing to Employees and the other pointing to Skills from the linking module, establish a connection between the linking module and its associated module.
How to associate an employee's skills while creating an Employee record through the Insert Records API
API names you need before invoking the API
- The API name of the multi-select lookup field in the modules you want to insert data.
- API names of the lookup fields in the linking module. Eg: here the API Name of the linking module is "EmpXSkills" and the corresponding lookup field api names are "Employees" & "Skills". You can use the Fields Metadata API for Employees and Skills to get these details.
 
Step 1
Know the API name of the multi-select lookup field in the module (In our case, Skills is the multi-select lookup field in the Employees module)
To know the API names of the multi-select lookup fields, make a 
GET - Fields Metadata API call. Among all the Employee's fields, multi-select lookup field can be identified by the json key 
data_type with the value 
multiselectlookup. The corresponding connected module can be found from the json connected_module. Below is the API call & response for such a multi-select lookup field.
Request URL : {api-domain}/crm/v6/settings/fields?module=Employees
Request Method: GET
Sample Response: 
The above highlighted keys are the details of the Multi select lookup field. The corresponding keys are explained below:
| "multiselectlookup": {                 "display_label": "Skills",   //Display label of the MxN field in the Employees module                 "linking_module": {                     "api_name": "EmpXSkills", //API name of the linking module                     "id": "5725767000002166520"                 ...                 "lookup_apiname": "Employees", //API name of the Employee lookup field in the linking module                 "connected_module": {                     "api_name": "Skills", //API name of the connected module                     "id": "5725767000002165263"                 },                 "api_name": "Skills_In_Related_List", //API of the related list of the connected module Skills in the Employees module.                 "connectedfield_apiname": "Employees", //API Name of the multi-select lookup field in the connected module (Skills)                "connectedlookup_apiname": "Skills", //API name of the Skills module lookup field in the linking module.                 "id": "5725767000002166655" //Related List ID             },                 ... | 
Step 2
Using the api_name of the linking module, make a 
GET Fields metadata API call to get the list of 
fields (along with their 
api_name) present in it. It lists all fields of the linking module in the response. 
Sample Request and Response
Search for the "data_type": "lookup" in the response. The lookup fields represent the connected modules in association with the linking module.
For example, in our case, the response will have two lookup fields. One of the lookup fields (with api name Employees) points to the Employees module, and the other one (with api name Skills) points to the Skills module. 
Step 3
To associate records via the MxN field, you need to know the 
IDs of the records in the Skills module. Here is the input body to insert the skills in the 
Employee module with the multi-select lookup field 
Skills. 
Here is the input body to insert a new Employee record and associate a Skills record to it using the MxN field.
Request URL: {{api-domain}}/crm/v6/Employees
Request Method: POST
Sample Input:
| {     "data": [         {             "Name": "Patricia",             "Position": "Marketing Specialist",             "Year_of_Experience": 5,             "Skills": [ //API name of the multi-select lookup field in Employee module                 {                     "Skills": { //API Name of the lookup field pointing to the Skills module in the linking module                         "name": "Marketing",                         "id": "5725767000002149427" //Record ID in the Skills module                      }                 },                 {                     "Skills": {                         "name": "Social Media Marketing",                         "id": "5725767000002149476"                      }                 }             ]         }     ] }
 | 
How to disassociate an employee & skills relation while updating an Employee record through the Update Records API  
Request URL: {{api-domain}}/crm/v6/Employees
Request Method: PUT
Sample Input:
| 
 {     "data": [         {             "id": "7890710000097291",             "Name": "Patricia",             "Position": "Marketing Specialist",             "Year_of_Experience": 5,             "Skills": [                 {                     "_delete": null, //This association in the linking module will be deleted                     "id": "5725767000008126002" //Record created in the linking module                 }             ]         }     ] }
 | 
Sending _delete:null will cause delinking of the association.
How to associate an employee's skills via "Linking Module"
You can associate the relationship between Employees and Skills module by creating records in the Linking module (EmpXSkills). Use the API names for the corresponding lookup fields, Employee (API Name: Employees) and Skills (API Name: Skills) in the input body.
Request URL: {{api-domain}}/crm/v6/EmpXSkills
Request Method: POST
Sample Input
| {    "data": [         {             "Name": "Patricia",             "Employees": {                  "id": "5725767000002161001" //unique record ID in the Employees module. GET your ID here            },              "Skills": {                  "id": "5725767000002149476" //unique record ID in the Skills module. GET your ID here            }         }     ] } | 
The id in the above response is the Primary Key ID of an Employee-Skill association record in the linking module. This ID can later be used to do specific operations like association update or deletion via API.
How to disassociate an employee & skills relationship via "Linking Module"
Use the Delete Records API to delete the record which corresponds to the specific relation between 
Employee and 
Skills module in the 
EmpXSkills module. You can get the record ID for the specific association using the 
Get Records API for the linking module. 
Use the Delete Record API to delete the specific record, thereby deleting the specific association between the Employee and Skills record. Please note that only the association is removed, and not the individual records. 
Sample Request and Response

When to use create/update operation in Employees/EmpXSkills module?
Use "Employees" module: When you want to create/update records in the Employees module, and associate the record with a Skills record in a single API call.
Use "EmpXSkills" module: When you want to associate/disassociate the relationship between existing Employees and Skills records. 
Retrieve data via COQL API and Bulk Read API
There may be situations where you need to fetch records based upon certain conditions.
For example, Zylker's HR team wants to retrieve the list of employees having more than 4 years of experience and are experts in Social media marketing. In this case, they can use Zoho CRM's COQL API or Bulk Read API. Let's see how to achieve this. 
Retrieving MxN data via COQL API
We know that both the Employees and Skills modules' association data is maintained in the linking module. In order to retrieve data from the linking module, query using the API name of the lookup fields in the linking module.
Request URL: {{api-domain}}/crm/v6/coql
Request Method: POST
Sample Input:
| 
 {
     "select_query" : "select Employees.Name as employee_name, Employees.Year_of_Experience as employee_experience, Skills.Name as skill_name from EmpXSkills where Employees.Year_of_Experience > 4 and Skills.Name like '%Social%'" }
 
 | 
From the SQL perspective, above COQL can be interpreted as
| select emp.Name as employee_name, emp.Year_of_Experience as employee_experience, skill.Name as skill_name from EmpXSkills left join Employees as emp on EmpXSkills.Employees = emp.id left join Skills as ski on EmpXSkills.Skills = ski.id where emp.Year_of_Experience > 4 and ski.Name like '%Social%' | 
Sample Response
Retrieving MxN data via Bulk Read API
Bulk Read API allows you to fetch a large set of data i.e., you can fetch a maximum of 200,000 records in a single API call. 
To export linking module records, use its API name.
Request Method: POST
Sample input to export linking module's records:
| {     "callback": {         "method": "post"     },     "query": {         "module": {             "api_name": "EmpXSkills" //API name of the linking module         },         "file_type": "csv"     } } | 
Export linking module records that meet the specified criteria
To export linking module's records based on the given criteria above (similar to the COQL API).
| {     "callback": {         "method": "post"     },     "query": {         "module": {             "api_name": "EmpXSkills"         },         "fields": [             "Employees.Name",             "Employees.Year_of_Experience",             "Skills.Name"         ],         "criteria": {             "group": [                 {                     "field": {                         "api_name": "Employees.Year_of_Experience"                      },                     "comparator": "greater_than",                     "value": "4"                 },                 {                     "field": {                         "api_name": "Skills.Name"                     },                     "comparator": "contains",                     "value": "Social"                 }             ],             "group_operator": "AND"         }     } }
 | 
As the API is an asynchronous API, the response will not be available instantly; the bulk read job is scheduled, and the status can be checked. Once the job is completed, you will be notified in the callback URL. The records are available in a downloadable CSV file or ICS file (for events). See the 
Bulk Read API document to know how to view the status of the scheduled job and download the file, along with more sample requests and responses.
We trust that this post meets your needs and is helpful. Let us know your thoughts in the comment section or reach out to us at support@zohocrm.com
Stay tuned for more insights in our upcoming Kaizen posts!
------------------------------------------------------------------------------------------------------------------------------
-------------------------------------------------------------------------------------------------------------------------------
Cheers!
Additional Reading:
Kaizen Posts:
- Recent Topics
- The attendees will now be redirected to the landing webpage when they exit the webinar, set by the organizer.- Hello All, In the latest version of the Zoho Meeting iOS mobile app (v1.3.16), we have brought in the below enhancements:   Post Webinar Re-direction Revamped exit UI for Webinar Post Webinar Re-direction:  The attendees will now be redirected to the 
- Download API file contents from browser- Hi Team - is there something being planned to be able to trigger file downloads from the browser via a deluge script? i.e. retrieve a file via API, trigger the file download directly from the browser. Or... using the convertToPdf function (https://www.zoho.com/deluge/help/functions/file/convert-to-pdf.html) 
- March 15, 2023: Zoho Docs is discontinued- As of today (March 15, 2023) Zoho Docs is discontinued for all users. We would like to thank our customers for trusting us for so many years! Going forward, we're confident you'll enjoy using Zoho WorkDrive for all your advanced file management and collaboration 
- When using "locations" in zoho books, can you keep the two locations totally separate from each other?- I am looking to add a location but I don't want to intermingle the banking or other accounts. I want that to be like two separate independent branches that use different banking accounts, accounts payable, and accounts receivable. The people who are in 
- Exported Slide Image Lacks Portion of the Background Image- This does not always happen, but when I export (or "download") the rendered image of a slide, it sometimes lacks a portion of the background image. I created a sample slide deck to demonstrate it and shared it with the admins. It is also publicly available 
- Adding a Channel to SalesIQ- I have a client that currently uses Zoho CRM and Zoho Desk. They would like a live chat to place on their website that has a mobile app and chat bots (something like SalesIQ). However, they would also like to have all this work over SMS as well. Does the SalesIQ API allow this? Can I add visitors without them being a visitor on a website? Thanks! Bryan Redeagle 
- Zoho CRM IP Addresses to Whitelist- We were told to whitelist IP addresses from Zoho CRM.  (CRM, not Zoho Mail.) What is the current list of IP Addresses to whitelist for outbound mail? Is there a website where these IP addresses are published and updated?  Everything I could find is over 
- Empowered Custom Views: Cross-Module Criteria Now Supported in Zoho CRM- Hello everyone, We’re excited to introduce cross-module criteria support in custom views! Custom views provide personalized perspectives on your data and that you can save for future use. You can share these views with all users or specific individuals 
- How Do I Refund a Customer Directly to Their Credit Card?- Hi, I use books to auto-charge my customers credit card. But when I create a credit note there doesn't seem to be a way to directly refund the amount back to their credit card. Is the only way to refund a credit note by doing it "offline" - or manually- 
- Zoho Flow Needs to Embrace AI Agent Protocols to Stay Competitive- Zoho Flow has long been a reliable platform for automating workflows and integrating various applications. However, in the rapidly evolving landscape of AI-driven automation, it risks falling behind competitors like n8n, which are pioneering advancements 
- Important Features Missing- Hey all I love linkthread, but i am missing some important features. I want to be able to include my Google Tag Manager. I have all the important stuff in my GTM Container: Facebook Pixel, LinkIn Pixel, Zoho Pagesense and so on. So i am able to do retargeting 
- Introducing Record Summary: smarter insights at your fingertips- Hello everyone, We’re excited to introduce the Record Summary feature. This powerful addition makes use of Zia to simplify how you interact with your CRM data, providing a seamless, consolidated view of critical record information. Scrolling through the 
- Zoho SignForms: Prefill parameters with spaces render as “+” in the document (even when using %20)- Hello Zoho Sign team, we are using SignForms with prefill parameters passed via URL. Spaces in parameter values are being rendered as “+” in the finalized document—even when we URL-encode spaces as %20. This is critical for us because we prefill addresses 
- Auto CC - Moving Departments- We have Auto CC e-mail replies to your support mailbox enabled. We have two departments: Helpdesk (helpdesk@domain.com) Delivery (delivery@domain.com) If we create a Helpdesk ticket, and reply, replies are CC'd to helpdesk@domain.com (OK) We then move 
- Currency selector (based on variable) usage in comparsion- Hi, I've developed a currency selector based on the following topic, and it's working well in pivot tables and charts: https://help.zoho.com/portal/en/community/topic/how-can-i-allow-my-users-to-choose-a-currency-for-the-dashboard I also have a comparison 
- Notification received when self-assigning tickets- When I assign tickets in Zoho Desk the relevant agent gets a notification email. When assigning myself a ticket in Zoho Desk, I get a notification email. Now, as I am the person who assigned the ticket to myself, getting a notification in this regard 
- Customize Column in Projects - Default View for Template?- Is there a way to have the columns you'd like to see added to a template? I want my customized columns to show up every single time I create a project from that template. It appears I can customize them in the template but when I create the project they do not transfer over.  Template: See below how the columns in order are : Task, Owner, Status, Assigned, Website URL, Blog H1..etc. When I create a project from that same template it comes out as: Task, Owner, Status, Tags, Start Date, End Date, etc 
- Ask the Experts 24: Analytics, data administration, and mobile experience with Zoho Desk- Hello Everyone! Welcome back to the Ask the Experts(ATE) series! We were so focused on our Autumn 2025 release that we didn't host an ATE session last month. In this month's ATE, we'd like to expand our areas for discussion: we'd like to listen to your 
- Multi-Page Forms in Zoho Creator!- Let’s make long applications easier to handle by dividing them into pages, adding a progress bar, and guiding users step by step through complex data entry. This would be a total game-changer for the user experience and could significantly boost completion 
- Unable to Receive Emails on Zoho Mail After Office 365 Coexistence Setup – Error: 553 Relaying Disallowed- Hello, My domain name is bigniter.com, and I’ve been using Zoho Mail as my email service provider without any issues. Recently, I followed the steps outlined in the Zoho documentation to enable Coexistence with Office 365: 🔗 https://www.zoho.com/mail/help/adminconsole/coexistence-with-office365.html#multi-server 
- Email login error- Login successfully but email page error 
- Shared Mailboxes Disappeared- Zoho Mail users in our company haven't been able to see their Shared Mailboxes for the past few hours. I've checked with App and Web Access, but they can't access them. When I send emails to their addresses, I get no error messages. They're still visible 
- Remote Server is misconfigured- Dear Team, I am unable to use email id as remote server is misconfigured. It would be really great if you could help on this and get this resolved. Thanks & Regard Rohit Gupta 
- why cant i access my email account. it keeps asking me for reverifiying my account by entering my password.- I cant access my account. it keeps asking me for reverifcaton by entering my password. once its entered it asks for it over and over. 
- Free webinar alert on October 16 - Less Complexity, More Security: Workplace + Directory- Hello Zoho Workplace Community! Security and productivity shouldn't be at odds—and with Zoho, they're not. Discover how Zoho Workplace + Directory delivers seamless collaboration with enterprise-grade security, all in one integrated ecosystem. Join our 
- Email Recall Feature In Zoho Mail Which Should Also Work For Outside Organisation Members- Add a feature to recall or undo sending an email within a configurable short time window (e.g., 30 seconds to 2 minutes) after hitting send, similar to Gmail’s undo send. Currently the sent email can not be recall If the recipient is not from within your 
- Workdrive and ChatGPT Team Synced Connectors- Hi, we want to be able to integrate Zoho Workdrive with OpenAI’s ChatGPT Team plan. Google Drive and OneDrive both offer this, zoho please catch up asap. We dont want to have to put our company files in google drive, we want to allow chatgpt Team edition 
- Alias Name (on items) use case in Zoho inventory- Hey, Hope everyone is well. Wondering if anyone can shed some light on the use case of Alias Names on Products in Zoho Inventory? Cheers, Chris 
- Updating an Invoice Line Item's Discount Account via API Call / Deluge Custom Function- I need help updating an invoice line item's discount account via API. Below is a screenshot of the line item field I am referring to. Now the field to the left of the highlighted field (discount account) is the sales income account. I am able to modify 
- Send e-mail with attachments- Dear Zoho, How is that possible in Zoho Flow to send an e-mail with attachment?  Just a simple example: Zoho Flow checks my Zoho mails and if the conditions starts the trigger then I would like to send an email with the original email's attachment. Any idea? BR, Adam 
- How to I get checkboxes on a subform to update via deluge- Hello, would someone be able to tell me what I'm doing wrong here? I am trying to take the contents of a Deals subform and add them to an invoice then update the checkbox on each row so that 'add to invoice' is unticked and 'invoiced' is ticked. The output 
- CRM Related list table in Zoho analytics- In Zoho Analytics, where can I view the tables created from zoho crm related lists? For example, in my Zoho CRM setup, I have added the Product module as a related list in the Lead module, and also the Lead module as a related list in the Product module. 
- Cadences- I have just started using Cadences for follow-up up email pipeline. Is it just me or do you find the functionality very basic? For example, it will tell me (if I go looking for it) if someone has replied to a follow-up and been unenrolled; but it won't 
- Account in Quick View Filter- I have a report that I often run against a specific Account. Every time, I have to go into the edit menu and change the Advanced Filter. I would prefer to use the Quick View Filter, but it does not allow me to use the one and only field that makes any 
- Add Webhook Response Module to Zoho Flow- Hi Zoho Flow Team, We’d like to request a Webhook Response capability for Zoho Flow that can return a dynamic, computed reply to the original webhook caller after / during the flow runs. What exists today Zoho Flow’s webhook trigger can send custom acknowledgements 
- Your bot just got smarter: AI-Powered routing that reads between the lines- What if your bot could tell the difference? Between a visitor who just needs a quick answer, someone actively comparing options, and a frustrated customer one click away from leaving? Most bots can't. They deliver the same response to everyone, missing 
- Tips & tricks: Make SalesIQ automations work for you- Every day, thousands of visitors land on your website. Some browse, some buy, and some leave without a word. But, wouldn’t it be great if you could automatically know who’s interested, engage them at the right moment, and never miss a lead, and all this 
- Zoho Analytics & SQL Server - Live connect - Below are the steps I did Created a fresh database and table in my own virtual server Created a new data source connection with live connect I was able to select the tables and created the data source successfully I am getting the error when I try to 
- Mapping a new Ticket in Zoho Desk to an Account or Deal in Zoho CRM manually- Is there any way for me to map an existing ticket in Zoho desk to an account or Deal within Zoho CRM? Sometimes people use different email to put in a ticket than the one that we have in the CRM, but it's still the same person. We would like to be able 
- Good news! Calendar in Zoho CRM gets a face lift- Dear Customers, We are delighted to unveil the revamped calendar UI in Zoho CRM. With a complete visual overhaul aligned with CRM for Everyone, the calendar now offers a more intuitive and flexible scheduling experience. What’s new? Distinguish activities 
- Next Page