> ## Documentation Index
> Fetch the complete documentation index at: https://docs.atako.ai/llms.txt
> Use this file to discover all available pages before exploring further.

# Zoho CRM

> Connect Zoho CRM to your Atako agents — 8 read and 4 write actions.

Let your agents read and write your Zoho CRM — leads, contacts, accounts, deals, tasks and custom modules: search, COQL queries, notes, users and field metadata.

## Connection

* **Authentication**: OAuth 2.0 — you authorize Atako via Zoho CRM's consent screen; no key to copy.
* **Scopes requested**:
  * `ZohoCRM.modules.ALL`
  * `ZohoCRM.settings.READ`
  * `ZohoCRM.users.READ`
  * `ZohoCRM.coql.READ`
  * `ZohoSearch.securesearch.READ`

<Note>
  Nothing to paste: click Connect and approve Atako with your Zoho account. Only accounts hosted on the US data center (zoho.com) are supported for now. Prerequisite on the Atako side — an administrator creates a "Server-based Applications" client in the Zoho API Console ([https://api-console.zoho.com](https://api-console.zoho.com)) with the redirect URI \$\{API\_URL}/integrations/oauth/callback, and puts its Client ID and Client Secret in INTEGRATION\_OAUTH\_ZOHO\_CRM\_CLIENT\_ID / \_CLIENT\_SECRET.

  See [Zoho CRM's documentation](https://www.zoho.com/crm/developer/docs/api/v8/).
</Note>

## Read actions (8)

| Action              | Description                                                                                                                                                                                                                      |
| ------------------- | -------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
| `coql_query`        | Run a read-only COQL query (SQL-like, joins through lookups), e.g. "select Last\_Name, Email from Contacts where Account\_Name.Account\_Name = 'Acme' limit 0, 200". A WHERE clause is required; LIMIT offset, limit (max 2000). |
| `get_module_fields` | Get the field metadata of a module (api\_name, data\_type, picklist values, lookups) — use it before reading or writing records.                                                                                                 |
| `get_record`        | Fetch one record by id (subforms and multi-select lookups included).                                                                                                                                                             |
| `get_records`       | List records of a module. `fields` is required by Zoho. Up to 200 per page; beyond 2000 records pass the next\_page\_token of the previous response as page\_token.                                                              |
| `list_modules`      | List the CRM modules (standard and custom) with their api\_name — the value every other action expects as `module`.                                                                                                              |
| `list_notes`        | List the notes attached to a record (title, content, author, dates).                                                                                                                                                             |
| `list_users`        | List CRM users (id, name, email, role, profile) — e.g. to find an Owner id. type=CurrentUser returns the connected user.                                                                                                         |
| `search_records`    | Search records of a module by ONE of: criteria (e.g. "((Last\_Name:equals:Dupont)and(City:starts\_with:Par))", max 10 conditions), email, phone or word. Zoho uses the first one present in that order.                          |

## Write actions (4)

| Action           | Description                                                                                                                                                                                                                                                                                                                                                                                                                            |
| ---------------- | -------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
| `add_note`       | Add a note to a record. Arguments: module (string, e.g. "Deals"); id (record id, digit string); Note\_Content (string, required); Note\_Title (string, optional).                                                                                                                                                                                                                                                                      |
| `create_records` | Create 1-100 records. Arguments: module (string, e.g. "Leads"); data (ARRAY of objects, one per record, keys = field API names, e.g. \[\{"Last\_Name":"Dupont","Company":"Acme","Email":"[a@b.fr](mailto:a@b.fr)"}]; a lookup is an object \{"id":"\<record id>"}, Owner is \{"id":"\<user id>"}); trigger (optional array of "workflow"\|"approval"\|"blueprint"). Mandatory fields depend on the module — check get\_module\_fields. |
| `update_records` | Update 1-100 existing records; only the fields sent change. Arguments: module (string); data (ARRAY of objects, each with "id" = the record id as a digit string plus the field API names to change, e.g. \[\{"id":"4150868000001944196","Lead\_Status":"Contacted"}]); trigger (optional array of "workflow"\|"approval"\|"blueprint").                                                                                               |
| `upsert_records` | Insert or update 1-100 records, matched on duplicate-check fields. Arguments: module (string); data (ARRAY of objects keyed by field API names, like create\_records); duplicate\_check\_fields (optional ARRAY of field API name strings, checked in order, e.g. \["Email"] — default: the module's system then unique fields); trigger (optional array of "workflow"\|"approval"\|"blueprint").                                      |

## Permissions

Every action above must be explicitly granted to an agent before it can be used. See [Permissions](/integrations/permissions) for the grant model and [Security](/integrations/security) for how credentials are protected.
