Kaizen #189: Manipulating Multi-Module Lookup (MML) Field using Zoho CRM APIs

Kaizen #189: Manipulating Multi-Module Lookup (MML) Field using Zoho CRM APIs

Hello everyone!

Welcome back to another week of Kaizen.
In this post, we explore the Multi-Module Lookup (MML) field in the Appointments module of Zoho CRM. You learn what an MML field is, how it works, and how to use it with Zoho CRM APIs.



Table of Contents:

  • What is a Multi-Module Lookup (MML) Field in Zoho CRM?
  • Use Cases for MML
  • How  the "Appointment For" (MML) field in the "Appointments" module works?
  • Creating a Record in the Appointments Module Using the Insert Records API
  • Retrieving a Record from the Appointments Module Using the Get Records API
  • Multi-module Lookup Using the COQL API
  • Multi-module Lookup Using the Bulk Read API
  • Frequently Asked Questions

What is a Multi-Module Lookup (MML) Field in Zoho CRM?

A Multi-Module Lookup (MML) field in Zoho CRM allows you to create a one-to-one relationship between a record in one module and a record from one of multiple other modules. Unlike a normal lookup field, which references a single module, an MML field can dynamically reference records from multiple modules. 
Without the MML field, users must create multiple lookup fields for each module, which complicates the CRM layout and user experience.

Note:
  • The multi-module lookup (multi_module_lookup) data type was introduced in Zoho CRM API version 3.
  • Currently, the MML field is available as a system-defined field named Appointment For in the Appointments module. 
  • The Appointment For field supports lookups to both Contacts and custom modules.
  • You cannot create a custom MML field in Zoho CRM.


Data Model Representation

MML's Data Model Representation

Use Cases for MML


Zylker Healthcare is a multi-specialty hospital that uses Zoho CRM to maintain its appointment scheduling process. 

In this setup, Zylker maintains two key modules:
  • Contacts module - Stores records of physicians and surgeons, including attending physicians, specialists, and surgeons who diagnose and refer patients.
  • Patients module - A custom module used to maintain records of all patients.

To improve the appointment booking process, Zylker uses the "Appointment For" Multi-Module Lookup (MML) field in the Appointments module. This field lets Zylker manage an appointment with either a Physician/Surgeon or a Patient, eliminating the need for multiple lookup fields.

How  the "Appointment For" (MML) field in the "Appointments" module works?

  • When creating an appointment, the user selects the "Appointment For" field.
  • The field displays records based on the selected module, either the Contacts or  Patients
  • The user selects the appropriate record (Contact or Patients) for the appointment.
  • A related list is automatically created in the selected module (Contact or Patients) as the Open Activities / Closed Activities to display all appointments associated with that record.

Creating a Record in the Appointments module using the Insert Records API

Before creating a record in the Appointments module via the Insert Records API, make sure you know the API names of the system-defined mandatory fields. These fields are required to create an appointment successfully.

System-defined Mandatory Fields:
  • Appointment_For (MML field)
  • Service_Name
  • Appointment_Start_Time
  • Appointment_Name
  • Member
  • Location

The below image shows how these system-defined mandatory fields appear in the Appointments module UI:

System-defined mandatory keys in the Appointments Module in UI view.

API calls you have to make before creating a record:

Before inserting a record into the Appointments module, it is important to know the API names of the fields and their parent modules. 

i. Use the GET - Module Metadata API to know the API name of the module. In our case, the Appointments module.

Request URL : {api-domain}/crm/v8/settings/modules
Request Method : GET

Sample Response :

 
In the API response, search for the module with "module_name": "Appointments" and check the value of the "api_name" key to get the API name of the module. This is the name you will use in all related API calls.

ii. Use the GET - Fields Metadata API and get fields metadata for the Appointments module. Here, you can find the API names of the mandatory fields along with other fields present in the Appointments module. 

Below is the API call & response for the multi-module lookup field along with other mandatory fields.

Request URL : {api-domain}/crm/v8/settings/fields?module=Appointments__s
Request Method : GET

Sample Response :


Note: The above image highlights only the key properties of the Multi-Module Lookup (MML) field from the field metadata response. The complete API response contains additional properties not shown here.

In the response:
  • The multi-module lookup field is identified by the key "data_type" with the value "multi_module_lookup".
  • The associated modules supported by the MML field (e.g., Contacts, Patients) are listed under the "modules" key.
  • Other mandatory fields like Service Name, Appointment Name, and Appointment Start Time can be identified by "system_mandatory": true.
The keys of the above multi_module_lookup JSON object are explained below:


"multi_module_lookup": {
    "display_label": "Appointments", // Display label of the module where the MML field is used
    "api_name": "Appointments__s", // API name of the Appointments module
    "modules": [ //List of modules associated with the Appointments module. 
        {
            "api_name": "Contacts", //API name of the associated module 
            "module_name": "Contacts", // Display Name of the module 
            "id": "5725767000000002179" //Unique ID of the module
        },
        {
            "api_name": "Patients", //API name of the associated custom module
            "module_name": "Patients", //Display label of the module
            "id": "5725767000006473007" //Unique module ID
        }
    }
]
},

Note: 
  • You cannot add or remove modules from the Multi-Module Lookup (MML) field using APIs. These actions are only available through the Zoho CRM UI.
  • Once a module is disassociated from the MML field, existing records associated with that module will remain in the Appointments module, and you will no longer be able to associate newly created records from the disassociated module using the MML field. 
The remaining system-defined mandatory fields, along with their API names, are listed below.

 

 System-defined Mandatory Field Names

 

 

System-defined Mandatory Field API Names

Service Name

Service_Name

Appointment Start Time

Appointment_Start_Time

Appointment Name

Appointment_Name

Member

Owner

Location

Location


Note: The system-defined mandatory fields can be identified by "system_mandatory": true.

Search the system-defined mandatory field names and get their API names.
With the field API names, use the following request and sample input body to create a record in the Appointments module using the Insert Records API.

Request URL : {{api-domain}}/crm/v8/Appointments__s
Request Method : POST

Request Body :

{
    "data": [
        {
            "Appointment_Name": "General Consultation",
            "Owner": {
                "name": "Patricia Boyle",
                "id": "5725767000000411001",
                "email": "patricia@zohotest.com"
            },
            "Appointment_Start_Time": "2025-04-15T13:00:00-07:00",
            "Appointment_End_Time": "2025-04-15T13:30:00-07:00",
            "Appointment_For": {
                "module": {
                    "api_name": "Contacts",
                    "id": "5725767000000002179"
                },
                "name": "John Doe",
                "id": "5725767000005607020"
            },
            "Service_Name": {
                "name": "General Check-up",
                "id": "5725767000006387029"
            },
            "Location": "Business Address"
        }
    ]
}


Sample Response:


{
    "data": [
        {
            "code": "SUCCESS",
            "details": {
                "Modified_Time": "2025-05-06T20:33:42-07:00",
                "Modified_By": {
                    "name": "Patricia Boyle",
                    "id": "5725767000000411001"
                },
                "Created_Time": "2025-05-06T20:33:42-07:00",
                "id": "5725767000006390001", //Unique ID if the newly created record. Please note that this record ID will be used in the following API get and update operations.
                "Created_By": {
                    "name": "Patricia Boyle",
                    "id": "5725767000000411001"
                }
            },
            "message": "record added",
            "status": "success"
        }
    ]
}



Note:
Only Contacts and custom modules are supported in the Multi-Module Lookup field. If you try to associate a new record with a module that has been removed from the MML field or an unsupported module in the MML field, the following error will be thrown. 


Retrieving a Record from the Appointments Module Using the Get Records API

Request URL : {{api-domain}}/crm/v8/Appointments__s/5725767000006390001
Request Method: GET

Request Response:

{
    "data": [
        {
            "Owner": {
                "name": "Patricia Boyle",
                "id": "5725767000000411001",
                "email": "patricia@zoho.com"
            },
            "$currency_symbol": "$",
            "Address": null,
            "Appointment_Start_Time": "2025-04-15T13:00:00-07:00",
            "Cancellation_Reason": null,
            "$field_states": null,
            "Appointment_For": {
                "module": {
                    "api_name": "Contacts",
                    "id": "5725767000000002179"
                },
                "name": "John Doe",
                "id": "5725767000005607020"
            },
            "Rescheduled_To": null,
            "$sharing_permission": "full_access",
            "Reschedule_Reason": null,
            "Additional_Information": null,
            "Last_Activity_Time": null,
            "Cancelled_Time": null,
            "Cancellation_Note": null,
            "Modified_By": {
                "name": "Patricia Boyle",
                "id": "5725767000000411001",
                "email": "patricia@zoho.com"
            },
            "Reschedule_Count": 0,
            "Rescheduled_By": null,
            "id": "5725767000006390001",
            "Rescheduled_Time": null,
            "Remind_At": null,
            "Appointment_End_Time": "2025-04-15T13:30:00-07:00",
            "Status": "Overdue",
            "Modified_Time": "2025-05-06T20:04:38-07:00",
            "Service_Name": {
                "name": "General Check-up",
                "id": "5725767000006387029"
            },
            "Created_Time": "2025-05-06T20:04:38-07:00",
            "testing": null,
            "Rescheduled_From": null,
            "Cancelled_By": null,
            "$editable": true,
            "Appointment_Name": "General Consultation",
            "Duration": 30,
            "Record_Status__s": "Available",
            "Created_By": {
                "name": "Patricia Boyle",
                "id": "5725767000000411001",
                "email": "patricia@zoho.com"
            },
            "Tag": [],
            "Location": "Business Address",
            "Reschedule_Note": null
        }
    ]
}


Updating MML Field Value Using the Update Records API

Request URL : {{api-domain}}/crm/v8/Appointments__s/5725767000006390001
Request Method: PUT

Request Body:

{
    "data": [
        {
            "Appointment_Start_Time": "2025-04-16T14:00:00-07:00", //Updating the Appointment_Start_Time
            "Appointment_End_Time": "2025-04-16T14:30:00-07:00", //Updating the Appointment_End_Time
            "Appointment_For": {
                "module": {
                    "api_name": "Employees", //Updating a different module
                    "id": "5725767000002161028"
                },
                "name": "Patrica", //A record from the Employees module
                "id": "5725767000006272001" //unique ID of the record
            }
        }
    ]
}


Multi-module Lookup Using the COQL API

Querying Inner Fields of Linked Modules within the MML Field

With the COQL API, you can query inner fields of linked modules within a Multi-Module Lookup (MML) field. This provides deeper insights into related fields data in a module. This query support is available from Zoho CRM API Version 7.

Sample Query:


{
 "select_query": "select 'Appointment_For->Contacts.Lead_Source' from Appointments__s where id is not null"
}

The above query retrieves the Lead Source field from the Contacts module within the Appointment_For MML field. 


Sample Response:



Querying Multi-Module Lookup Module Name

Querying the module name associated with each record in a Multi-Module Lookup (MML) field. This query support is available from Zoho CRM API Version 7.

Sample Query:

{
"select_query": "select Appointment_For.module.api_name, Appointment_For from Appointments__s where id is not null"
}


The Appointment_For.module.api_name returns the module name (e.g., Contacts or Accounts) for each record linked in the Appointment_For MML field.

Sample Response:


Multi-module Lookup Using the Bulk Read API

Bulk Read API allows you to fetch a large set of data i.e., you can fetch a maximum of 2,00,000 records in a single API call. 
Specify the API name of the Appointments module in the module JSON object when making API calls. Refer to the following section for an example.

Request Method : POST

Request Body :

{
    "callback": {
        "method": "post"
    },
    "query": {
        "module": {
            "api_name": "Appointments__s" //API name of the Appointments module
        },
        "file_type": "csv"
    }
}


Note: The Appointment_For field cannot be used in the criteria.

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.

Sample Exported Response 



Frequently Asked Questions

1. Which modules are currently supported in the MML field?

Only Contacts and custom modules can be associated with an MML field.

2. What error is thrown if I try to associate a record with a removed or unsupported module in the MML field?

If you try to associate a record with a removed or unsupported module in an MML field, the system will throw an "INVALID_DATA" error.

3. Is the MML field available for all modules?

No, as of Zoho CRM API Version 8, the MML field is available only as a system-defined field in the Appointments module.

4. How do I get the list of modules associated with an MML field?

You can use the GET - Fields Metadata API for the Appointments module and look for the field with "data_type" : "multi_module_lookup" and check its "modules" JSON array.

5. Can I add or remove modules from a Multi-Module Lookup (MML) field via API?

Adding or removing modules in an MML field is not supported via API. These actions can only be done through the Zoho CRM UI.

6. What happens if I remove a module from an MML field?

If a module is removed from the MML through Zoho CRM UI, it can no longer be associated with new records, but existing records linked to that module will remain unaffected.

7. Is MML field supported in the Bulk Write API?

As of Zoho CRM API Version 8, the MML field is available only in the Appointments module as a system-defined field. The Appointments module is not supported in the Bulk Write API.

8. Is MML field supported in the Search API?

The MML field is not currently supported in the Search API.



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


Related Readings:


      • Recent Topics

      • Zoho People how do i view the history of leave taken

        Hi All What is the report that i am unable to view the history of the leave taken for an individual and team?
      • UK Registration for VAT with existing stock/inventory

        We have an existing inventory of stock and are investigating how to handle the conversion from a UK VAT unregistered company to a UK VAT registered company. Enabling VAT registered status looks extremely easy, but we cannot find any way within Books to
      • Trigger action after workflow

        I would like to trigger a deluge function after the approval workflow is complete. Is this possible? The objective is to take the approved document and move it over to Zoho Contracts to send out to our customer for review and signature. The reason we
      • Is it possible to create a meeting in Zoho Crm which automatically creates a Google Meet link?

        We are using Google's own "Zoho CRM for Google" integration and also Zoho's "Google Apps Sync" tools, but none of them provide us with the ability to create a meeting in Zoho CRM that then adds a Google Meet link into the meeting. Is this something that
      • Unable To Enable Google Calendar Sync

        Hi Folks, I am unable to enable google calendar sync. I get Internal Error, Problem Occurred Internally. Screenshot attached. How do I solve this?
      • Export to Zoho CRM Not Triggering Workflow Rules

        Hello, I have set up an automated export from DataPrep to Leads in CRM but none of my Workflow Rules are triggering once the leads are created. The Timeline history is completely empty in every lead. How can I fix this issue? Do I need to set up a Schedule
      • 【Zoho Projects】サンドボックス機能(テスト環境)リリースのお知らせ

        本投稿は、本社のZoho コミュニティに投稿された以下の記事を参照し作成したものです。 Sandbox - Your Secure Testing Space in Zoho Projects ユーザーの皆さま、こんにちは。コミュニティチームの中野です。 本投稿では、Zoho Projects のサンドボックス機能リリースについてご紹介します。 サンドボックス(テスト環境)とは? Zoho Projects の「サンドボックス」は、新たな設定を作成、検証、そして既存の処理を妨げることなく本番環境に適用することができるテスト環境です。
      • Sending from domain alias

        In the Control Panel/Domains, I have set up some domains as aliases for my main domain. Only my main domain has mail hosting. The other domains are verified as aliases for the main domain, and emails sent to <user>@<alias domain> arrive successfully at
      • Difficult to Purchase More users

        It's surprisingly difficult and un-intuitive to purchase more user licenses in Zoho One under the new UI. It's not actually possible to do it anywhere from the admin interface. You have to leave the admin/directory section, then click your profile icon,
      • How to link web sales payments through Stripe to invoices?

        I have just set up an online shop website which accepts payments through Stripe.  The payment appears in Zoho Books through the Stripe feed as 'Sales without invoices'.  In order to keep Zoho Inventory in step, I manually (for now) create a Sales Invoice
      • Announcing New Features in Trident for macOS (v.1.22.0)

        Hello everyone! Trident for macOS (v.1.22.0) is here with thoughtful updates to improve your daily workflow. Here's a quick look at what's new. Switch email response type easily. You can now switch between Reply, Reply All, and Forward directly in the
      • Layout Rules / Quick create

        Hello, is there a way to create a layout rule for quick create option? Regards, Katarzyna
      • Zoho Notebook Will Not Open After App Install

        I am a new user of Notebook. I was able to successfully import my data from Evernote and the product is working well on a Windows 11 computer and Pixel device. I have also installed Notebook on a Samsung S6 lite tablet however the software freezes on
      • Leads, contacts, deals table view is not sorting

        i am unable to sort the table view of leads, contacts and deals
      • Conditional Layouts On Multi Select Field

        How we can use Conditional Layouts On Multi Select Field field? Please help.
      • Zoho CRM Multi-select values not translated

        Hello! I have some issue with translate custom multi-select fields in zoho CRM in other language. I download export file, but it has all my custom fields and picklist values exept multi-select fields picklist values.  Please, help me to undestand, is
      • Unable to Download Invoices via API – Code 57 Authorization Error

        I’m integrating the Zoho Billing API with the scopes ZohoInvoice.invoices.CREATE,ZohoInvoice.invoices.READ. I’ve completed the OAuth2 flow successfully, including generating the auth code, access token, and refresh token. All tokens are valid and fresh.
      • Weekly Tips : Stay in loop with Conversation View

        You receive a series of emails back and forth with a client regarding a project update. Instead of searching through your inbox for each separate email, you would want to see the entire email conversation in one place to understand the context quickly
      • Introducing Zoho PDF Editor: Your free online PDF editing tool

        Edit your PDFs effortlessly with Zoho PDF Editor, Zoho's new free online PDF editing tool. Add text, insert images, include shapes, embed hyperlinks, and even transform your PDFs into fillable forms to collect data and e-signatures. You can edit PDFs
      • RSC Connectivity Linkedin Recruiter RPS

        It seems there's a bit of a push from Linkedin Talent Solutions to keep integrations moving. My Account Manager confirmed that Zoho Recruit is a Certified Linkedin Linkedin Partner but does not have RSC as of yet., (we knew that :-) She encouraged me
      • Water-Scrum-Fall approach for finance institutions with Zoho Projects Plus

        Finance is a highly regulated sector with strict rules and compliance requirements. Handling sensitive client data and complex transactions like multi-currency deals requires elaborate workflows and precise management. Implementing project management
      • Get instant summaries of your notes with the help of Zia

        Hello all, We've added a simple yet powerful feature to Zoho CRM that we're excited for you to try: Zia Notes Summary. It's designed to make the daily lives of a CRM user a bit easier by giving you quick summaries of your CRM notes. Whether it's a glance
      • Zoho one web page are not available

        Why I am not able to enter to zoho one web page?
      • Zoho People > Onboarding > Candidate do not view all the data field on the Employee Onboarding

        Hello In my onboarding portal I do not see all the fields that i want the candidate to fill in In my Employee Onboarding Form These details i can see In the work information, i have enable the Company View but in the Employee Portal i do not see I have
      • Has anyone implemented a ""switch"" to redirect emails in production for testing?

        Hi everyone, In our production Zoho CRM we have a fairly complex setup with multiple Blueprints and Deluge functions that send emails automatically — to managers and internal staff — triggered by workflows. We’re looking for a way to *test changes safely*,
      • Restrict Access/Shared Access

        Sometimes access to documents that go out from Zoho Sign need to be restricted or shared. For example: 1) HR department send out employment contracts. Any Zoho Sign admin can view them. Access should be restricted to those that HR would allow to view
      • Tip#44: Integrate with Xero to manage your financial operations

        Managing your project finances becomes more efficient with Xero integration in Zoho Sprints. With this integration, you can sync your Zoho Sprints data with Xero. Once you sync them to Xero, you can easily create invoices in Xero. This feature significantly
      • Zoho People Onboarding Unable to Convert to User

        Hello All I need help in this onboarding of candidate Currently at this stage the candidate is just being offered and we are filling in his details however not all information are fill up. The candidate is still using his/her personal email When i try
      • Integration with SharePoint Online

        Is there an integration where we can add a Zoho Sign link to the context menu of a document in the SharePoint document library. Then, we could directly initiate a workflow of sending a document for signature from a document library in SharePoint onl
      • White screen when connecting Zoho Cliq and Zoho People for birthday notifications

        Hi everyone, I'm new to Zoho and I'm trying to set up the employee birthday notifications, following this guide: Automating Employee Birthday Notifications in Zoho Cliq But when I try to connect Zoho Cliq with Zoho People, I just get a white screen and
      • Word file is messed up when i upload it to zoho sign

        Hi. I am trying to upload a word file to zoho sign and when i do that it ruins the file, It adds spaces and images are on top of each other. What can i do? Thanks.
      • Annotate widget?

        Is there something in creator or any zoho app that allows me to have an image markup field item in the form? I need to be able to complete a form that also allows the user to mark up a preloaded image. Other compay's call this an image markup field or
      • Dashboards / Home Page - Logged In User

        Lots of the dashboards that we use reference the Logged In User.  We also set up Home Pages for specific roles, where the Logged In User is referenced within the custom view.  As an admin, that means that these views are often blank when customizing and
      • I'm pissed as fuck

        What the hell Zoho! Always the same goddam problem. It takes time because the simplest things just don't fucking work. Today it just took me 3 hours to complete and send a 1page privacy letter to a client. And you know what 99% of the document was already
      • Configure Notifications for API Limit

        Hello developers, APIs are essential for businesses today as they enable seamless integration between different software systems, automate workflows, and ensure real-time data sync. To ensure that admins are notified well in advance before APIs reach
      • Introducing Blueprints for Custom Modules!

        Hello developers, We've added a new feature called Blueprints in Custom Modules. Blueprints are the online representation of a business process. In Zoho Books, you can use Blueprints to design a process flow using states and transitions. Developers can
      • Campaign Links Blocked as Phishing- Help!

        We sent a Campaign out yesterday. We tested all of the links beforehand. One of the links is to our own website. After the fact, when we open up the Campaign in our browser, the links work fine. The links in the emails received, however, opened in a new
      • Zoho Tables July 2025 Update: Smart Creation, Smarter Automation

        We’re excited to introduce a powerful set of updates across Web, Android and iOS/iPad apps. From AI-assisted base creation to advanced automations and mobile enhancements, this release is packed with features to help you build faster, automate better,
      • Zoho Voice est désormais en France !

        Nous avons des nouveautés très intéressantes qui vont transformer la façon dont vous communiquez avec vos clients. Zoho Voice, la solution de téléphonie d'entreprise et de centre de contact basée sur le cloud est arrivée en France ! Vous pouvez enfin
      • Numbers in MA

        I have an issue rationalising the various numbers around MA2. Not convinced that any are truly accurate. However have a specific problem in that i have a list with 1301 records in the list view. When i come to email there is only 1289 Then have another
      • Next Page