# Botpress Integration: Zoho CRM ## **Zoho CRM Integration Guide** For further details, refer to the [**Zoho CRM API documentation**](https://www.zoho.com/crm/developer/docs/api/v7/). ## **Overview** This Botpress integration allows seamless interaction with **Zoho CRM**. It enables users to manage contacts, deals, appointments, and files directly through their chatbot. ## **Features** - **Record Management:** Create, retrieve, update, delete, and search records. - **Appointments Management:** Create, update, retrieve, and delete appointments. - **File Management:** Upload and retrieve files. - **Emails:** Send emails and associate them with records. - **Organization & User Management:** Retrieve organization details and user information. ## Register Your Application Before making any API calls using the Zoho Botpress Integration, you must register your application with **Zoho CRM**. ### **[Loom video walk through setting up the OAuth configuration.](https://www.loom.com/share/41c2811c047a48cbb08a2d1b0dc98f69?sid=8cb4d496-2cca-415d-be1d-536a87c73a3a)** ### Steps to Register 1. **Go to the [Zoho Developer Console](https://accounts.zoho.com/developerconsole).** 2. Click **Add Client**. 3. Choose the client type: **Self Client**. 4. Click the **Generate Code** tab and enter the following scopes: ``` ZohoCRM.modules.ALL,ZohoCRM.org.ALL,ZohoCRM.users.ALL,ZohoCRM.settings.ALL,ZohoCRM.send_mail.all.CREATE,ZohoCRM.files.CREATE,ZohoCRM.files.READ ``` 5. Set the **time duration** to **10 minutes**. 6. Provide a scope description (This is not vital to the registration). 7. Click **Create**, select your CRM, and click **Create** again. 8. Download your **credentials file**. ### Generate Refresh Token Now, execute the following **cURL** command to obtain a refresh token. Ensure you use the **correct region URL** for OAuth authentication. #### **Zoho Accounts Domains:** | Region | Accounts URL | | ----------------- | ------------------------------- | | US | `https://accounts.zoho.com` | | AU | `https://accounts.zoho.com.au` | | EU | `https://accounts.zoho.eu` | | IN | `https://accounts.zoho.in` | | CN | `https://accounts.zoho.com.cn` | | JP | `https://accounts.zoho.jp` | | SA (Saudi Arabia) | `https://accounts.zoho.sa` | | CA (Canada) | `https://accounts.zohocloud.ca` | ### Execute cURL Request Replace the placeholders (`CLIENT_ID`, `CLIENT_SECRET`, and `AUTHORIZATION_CODE`) with your actual values before executing the request. ```sh curl --request POST \ --url 'https://YOUR_REGION_ACCOUNT_URL/oauth/v2/token' \ --header 'Content-Type: application/x-www-form-urlencoded' \ --data 'grant_type=authorization_code' \ --data 'client_id=YOUR_CLIENT_ID' \ --data 'client_secret=YOUR_CLIENT_SECRET' \ --data 'redirect_uri=YOUR_REDIRECT_URI' \ --data 'code=AUTHORIZATION_CODE' ``` ### Expected Response If the request is successful, you should receive a response similar to the following: ```json { "access_token": "{access_token}", "refresh_token": "{refresh_token}", "api_domain": "https://www.zohoapis.com", "token_type": "Bearer", "expires_in": 3600 } ``` # Define the Zoho OAuth token endpoint based on your region $uri = "https://YOUR_REGION_ACCOUNT_URL/oauth/v2/token" # Define the request body with required parameters $body = @{ grant_type = "authorization_code" client_id = "YOUR_CLIENT_ID" client_secret = "YOUR_CLIENT_SECRET" redirect_uri = "YOUR_REDIRECT_URI" code = "AUTHORIZATION_CODE" } ### Generate Refresh Token using PowerShell (Windows Users) ⚠️ Use this PowerShell command if you're on Windows. Do NOT use cURL—this is for PowerShell only! ⚠️ #### Define the Zoho OAuth token endpoint based on your region $uri = "https://YOUR_REGION_ACCOUNT_URL/oauth/v2/token" # Define the request body with required parameters $body = @{ grant_type = "authorization_code" client_id = "YOUR_CLIENT_ID" client_secret = "YOUR_CLIENT_SECRET" redirect_uri = "YOUR_REDIRECT_URI" code = "AUTHORIZATION_CODE" } ##### Convert body to URL-encoded form data ``` $body = $body | ForEach-Object { "$( $_.Key )=$( $_.Value )" } -join "&" ``` #### Send the POST request using Invoke-RestMethod ``` $response = Invoke-RestMethod -Uri $uri -Method Post -ContentType "application/x-www-form-urlencoded" -Body $body ``` #### Output the response ``` $response ``` ## Configure Zoho Botpress Integration Once you have the necessary credentials, navigate to the **Zoho Botpress Integration** configuration page and enter the following details: - **Client ID** - **Client Secret** - **Refresh Token** - **Region** This completes the registration and integration process for **Zoho Botpress**. You are now ready to start making authorized API calls. --- For more details, refer to the [Zoho API Documentation](https://www.zoho.com/crm/developer/docs/). --- ## API Functions & Usage Below are the available actions in this integration: ### 1️⃣ **Record Management** #### **Insert Record** - **Method:** `POST /crm/v7/{module}` - **Input:** ```json { "module": "Leads", "data": [{ "Last_Name": "Daly", "First_name": "Paul", "Email": "[email protected]" }] } ``` - **Output:** ```json { "success": true, "message": "Request successful", "data": { "code": "SUCCESS", "message": "Record added", "status": "success", "details": { "id": "27234000000176001", "Created_By": "Matea Vasileski", "Modified_By": "Matea Vasileski", "Created_Time": "2025-02-26T18:39:39-05:00", "Modified_Time": "2025-02-26T18:39:39-05:00" } } } ``` #### **Get Records** - **Method:** `GET /crm/v7/{module}` - **Input:** ```json { "module": "Leads", "params": { "fields": "Email" } } ``` - **Output:** ```json { "success": true, "message": "Request successful", "data": { "id": "27234000000157008", "Full_Name": "Jim Mulani", "First_Name": "Jim", "Last_Name": "Mulani", "Email": "[email protected]", "Company": "envy", "Owner": { "name": "Matea Vasileski", "id": "27234000000095001", "email": "[email protected]" }, "Created_By": { "name": "Matea Vasileski", "id": "27234000000095001", "email": "[email protected]" }, "Modified_By": { "name": "Matea Vasileski", "id": "27234000000095001", "email": "[email protected]" }, "Created_Time": "2025-02-23T21:51:21-05:00", "Modified_Time": "2025-02-26T18:19:10-05:00", "Lead_Status": null, "Lead_Source": null, "Record_Status": "Available" } } ``` #### **Get Record By ID** - **Method:** `GET /crm/v7/{module}/{recordId}` - **Input:** ```json { "module": "Leads", "recordId": "27234000000157008" } ``` - **Output:** ```json { "success": true, "message": "Request successful", "data": { "id": "27234000000157008", "Full_Name": "Jim Mulani", "First_Name": "Jim", "Last_Name": "Mulani", "Email": "[email protected]", "Company": "envy", "Owner": { "name": "Matea Vasileski", "id": "27234000000095001", "email": "[email protected]" }, "Created_By": { "name": "Matea Vasileski", "id": "27234000000095001", "email": "[email protected]" }, "Modified_By": { "name": "Matea Vasileski", "id": "27234000000095001", "email": "[email protected]" }, "Created_Time": "2025-02-23T21:51:21-05:00", "Modified_Time": "2025-02-26T18:19:10-05:00", "Lead_Status": null, "Lead_Source": null, "Record_Status": "Available" } } ``` #### **Update Record** - **Method:** `PUT /crm/v7/{module}/{recordId}` - **Input:** ```json { "module": "Leads", "recordId": "27234000000162001", "data": [{ "Email": "[email protected]" }] } ``` - **Output:** ```json { "success": true, "message": "Request successful", "data": { "code": "SUCCESS", "message": "Record updated", "status": "success", "details": { "id": "27234000000157008", "Created_By": "Matea Vasileski", "Modified_By": "Matea Vasileski", "Created_Time": "2025-02-23T21:51:21-05:00", "Modified_Time": "2025-02-26T18:55:37-05:00" } } } ``` #### **Delete Record** - **Method:** `DELETE /crm/v7/{module}/{recordId}` - **Input:** ```json { "module": "Leads", "recordId": "27234000000162008" } ``` - **Output:** ```json { "success": true, "message": "Request successful", "data": { "code": "SUCCESS", "message": "Record deleted", "status": "success", "details": { "id": "27234000000157008" } } } ``` #### **Search Records** - **Method:** `GET /crm/v7/{module}/search` - **Input:** ```json { "module": "Leads", "criteria": "(First_Name:equals:John)" } ``` - **Output:** ```json { "success": true, "message": "Request successful", "data": { "records": [ { "id": "27234000000176001", "Full_Name": "Daly", "Email": "[email protected]", "Created_Time": "2025-02-26T18:39:39-05:00", "Modified_Time": "2025-02-26T18:39:39-05:00", "Owner": { "name": "Matea Vasileski", "email": "[email protected]" }, "Record_Status": "Available" }, { "id": "27234000000174002", "Full_Name": "Daly", "Email": "[email protected]", "Created_Time": "2025-02-26T18:17:10-05:00", "Modified_Time": "2025-02-26T18:17:10-05:00", "Owner": { "name": "Matea Vasileski", "email": "[email protected]" }, "Record_Status": "Available" } ], "pagination": { "per_page": 200, "count": 2, "page": 1, "sort_by": "id", "sort_order": "desc", "more_records": false } } } ``` --- ### 2️⃣ **Appointments Management** #### **Create Appointment** - **Method:** `POST /crm/v7/Appointments__s` - **Input:** ```json [ { "Appointment_Name": "Matea - Mowing Service", "Appointment_For": { "module": { "api_name": "Contacts" }, "name": "k m", "id": "27234000000163029" }, "Service_Name": { "name": "mow", "id": "27234000000168178" }, "Appointment_Start_Time": "2025-02-24T19:33:00Z", "Owner": "27234000000095001", "Location": "Business Address", "Address": "Business Address", "Additional_Information": "", "Remind_At": [ { "unit": 30, "period": "minutes" } ], "Price": "$1.00" } ] ``` - **Output:** ```json { "success": true, "message": "Request successful", "data": { "code": "SUCCESS", "message": "Record added", "status": "success", "details": { "id": "27234000000175008", "Created_By": "Matea Vasileski", "Modified_By": "Matea Vasileski", "Created_Time": "2025-02-26T19:21:59-05:00", "Modified_Time": "2025-02-26T19:21:59-05:00" } } } ``` #### **Get Appointments** - **Method:** `GET /crm/v7/Appointments__s` - **Input:** ```json { "params": { "fields": "Service_Name" } } ``` - **Output:** ```json { "success": true, "message": "Request successful", "data": { "records": [ { "id": "27234000000159008", "Service_Name": { "name": "mow", "id": "27234000000168178" } } ], "pagination": { "per_page": 200, "count": 1, "page": 1, "sort_by": "id", "sort_order": "desc", "more_records": false } } } ``` #### **Get Appointment By ID** - **Method:** `GET /crm/v7/Appointments__s/{appointmentId}` - **Input:** ```json { "appointmentId": "123456" } ``` - **Output:** ```json { "success": true, "message": "Request successful", "data": { "appointment": { "id": "27234000000175008", "Appointment_Name": "Matea - Mowing Service", "Service_Name": { "name": "mow", "id": "27234000000168178" }, "Appointment_For": { "name": "k m", "id": "27234000000163029", "module": "Contacts" }, "Owner": { "name": "Matea Vasileski", "email": "[email protected]" }, "Created_By": { "name": "Matea Vasileski", "email": "[email protected]" }, "Modified_By": { "name": "Matea Vasileski", "email": "[email protected]" }, "Appointment_Start_Time": "2025-02-24T14:33:00-05:00", "Appointment_End_Time": "2025-02-24T15:03:00-05:00", "Duration": 30, "Status": "Overdue", "Location": "Business Address", "Remind_At": [ { "unit": 30, "period": "minutes" } ], "Created_Time": "2025-02-26T19:21:59-05:00", "Modified_Time": "2025-02-26T19:21:59-05:00", "Record_Status": "Available" } } } ``` #### **Update Appointment** - **Method:** `PUT /crm/v7/Appointments__s/{appointmentId}` - **Input:** ```json { "appointmentId": "27234000000159008", "data": { "appointments": [ { "Appointment_Name": "Update appt", "Appointment_For": { "module": "Contacts", "name": "k m", "id": "27234000000163029" }, "Service_Name": { "name": "mow", "id": "27234000000168178" }, "Appointment_Start_Time": "2025-02-24T19:33:00Z", "Owner": "27234000000095001", "Location": "Business Address", "Address": "Business Address", "Additional_Information": "", "Remind_At": [ { "unit": 30, "period": "minutes" } ], "Price": "$1.00" } ] } } ``` - **Output:** ```json { "success": true, "message": "Request successful", "data": { "code": "SUCCESS", "message": "Record updated", "status": "success", "details": { "id": "27234000000159008", "Created_By": "Matea Vasileski", "Modified_By": "Matea Vasileski", "Created_Time": "2025-02-24T19:44:23-05:00", "Modified_Time": "2025-02-26T19:48:20-05:00" } } } ``` #### **Delete Appointment** - **Method:** `DELETE /crm/v7/Appointments__s/{appointmentId}` - **Input:** ```json { "appointmentId": "123456" } ``` - **Output:** ```json { "success": true, "message": "Request successful", "data": { "code": "SUCCESS", "message": "Record deleted", "status": "success", "details": { "id": "27234000000159008" } } } ``` --- ### 3️⃣ **File Management** #### **Upload File** - **Method:** `POST /crm/v7/files` - **Input:** ```json { "fileUrl": "https://example.com/file.pdf" } ``` - **Output:** ```json { "success": true, "message": "File uploaded successfully", "data": { "code": "SUCCESS", "message": "File uploaded successfully", "status": "success", "details": { "name": "20250226050635-LO9N1PT0.webp", "id": "36c38a1979b316686084c58303b1b6cb654eb04f0f1038ed0a8fdf8a6ff28598dceae7f8711509bfd80b56bf8cd4dbba" } } } ``` #### **Get File** - **Method:** `GET /crm/v7/files/{fileId}` - **Input:** ```json { "fileId": "dcc53e79cfef0810414e8335b0e11d8882a51116f390194f400828673ca4a59492a22be84db32aa8425d0859862491f9" } ``` - **Output:** ```json { "success":true, "message":"Request successful", "data": BinaryFileData } ``` --- ### 4️⃣ **Organization & User Management** #### **Get Organization Details** - **Method:** `GET /crm/v7/org` - **Input:** No input is required. - **Output:** ```json { "success": true, "message": "Request successful", "data": { "organization": { "id": "27234000000000684", "company_name": "Envyro", "domain_name": "org110000680144", "primary_email": "[email protected]", "currency": "Canadian Dollar - CAD", "currency_symbol": "$", "time_zone": "America/Toronto", "country_code": "US", "license_details": { "paid": true, "paid_type": "professional", "paid_expiry": "2025-03-23T20:00:00-04:00", "users_license_purchased": 1 }, "created_time": "2024-09-11T11:04:19-04:00" } } } ``` #### **Get Users** - **Method:** `GET /crm/v7/users` - **Input:** ```json { "params": { "status": "active" } } ``` - **Output:** ```json { "success": true, "message": "Request successful", "data": { "users": [ { "id": "27234000000095001", "full_name": "Matea Vasileski", "email": "[email protected]", "role": "CEO", "profile": "Administrator", "status": "active", "country": "Canada", "state": "Ontario", "time_zone": "America/Toronto", "created_time": "2024-09-11T11:04:19-04:00", "modified_time": "2024-09-11T11:04:19-04:00" }, { "id": "27234000000103062", "full_name": "Milos Arsik", "email": "[email protected]", "role": "CEO", "profile": "Administrator", "status": "closed", "time_zone": "America/Toronto", "created_time": "2024-09-16T00:36:14-04:00", "modified_time": "2024-11-01T12:18:54-04:00" } ], "pagination": { "per_page": 200, "count": 2, "page": 1, "more_records": false } } } ``` --- ### 5️⃣ **Emails** #### **Send Email** - **Method:** `POST /crm/v7/emails` - **Input:** ```json { "module": "Leads", "recordId": "123456", "data": [ { "from": { "user_name": "Matea Vasileski", "email": "[email protected]" }, "to": [ { "user_name": "user1", "email": "[email protected]" } ], "cc": [], "bcc": [], "subject": "Important Update", "content": "Here is an important update for you.", "mail_format": "html" } ] } ``` - **Output:** ```json { "success": true, "message": "Request successful", "data": { "code": "SUCCESS", "message": "Your mail has been sent successfully.", "status": "success", "details": { "message_id": "2e660cab6382a85766b68e77778eadf168f923354a69b362ace2e52ce0b934ba" } } } ``` ---