Skip to main content

Zoho CRM

Sync overview​

The Zoho CRM source supports Full Refresh and Incremental syncs. It reads data through version 2 of the Zoho CRM REST API.

Output schema​

The connector syncs:

  • Standard modules in your Zoho CRM account
  • Custom modules you added to your account
  • Custom fields in both standard and custom modules

There's no fixed list of streams. During discovery, the connector calls the Modules API to list your modules, then the Modules Metadata API and Fields Metadata API to build a schema for each one. Discovery usually takes 10 to 30 seconds.

A module appears as a stream only if the Zoho CRM API returns module and field metadata for it. Some modules aren't available because of your Zoho CRM edition or because your OAuth token lacks the scope for them. For details, see Scopes in the Zoho CRM documentation.

Data type mapping​

Integration TypeAirbyte TypeNotes
booleanboolean
doublenumber
currencynumber
integerinteger
profileimagestring
pickliststringenum
textareastring
websitestringformat: uri
datestringformat: date
datetimestringformat: date-time
textstring
phonestring
bigintstringairbyte_type: big_integer
event_reminderstring
emailstringformat: email
autonumberstringairbyte_type: big_integer
jsonarrayarray
jsonobjectobject
multiselectpicklistarray
lookupobject
ownerlookupobject
RRULEobject
ALARMobject

Any other data type not listed in the table above will be treated as string.

Auto-number fields are the one exception to that table: when the field has a prefix or suffix configured in Zoho CRM, its values are plain strings such as INV-1042, so the connector drops the big_integer type and syncs them as strings.

Features​

FeatureSupported? (Yes/No)
Full Refresh Overwrite SyncYes
Full Refresh Append SyncYes
Incremental - Append SyncYes
Incremental - Append + Deduplication SyncYes
NamespacesNo

Incremental syncs​

Every stream supports incremental syncs. The connector resolves the cursor field separately for each module, using the first of these fields that the module's field metadata exposes:

  1. Modified_Time
  2. Action_Performed_Time
  3. Created_Time

Most modules use Modified_Time. Modules that don't expose it, such as Actions_Performed, use Action_Performed_Time instead. Because the cursor field varies by module, each stream stores its state under its own cursor field name.

To read only changed records, the connector sends the stored cursor value in the If-Modified-Since request header, advanced by one second so the last record of the previous sync isn't read again. Zoho CRM returns 304 Not Modified when nothing changed, which the connector treats as an empty page. If a record has no value in the cursor field, the connector emits the record but doesn't advance the stream's state.

Every stream schema includes id and Modified_Time, even for modules that don't have a Modified_Time field. For those modules the column is always null, and the module's real cursor field carries the timestamp.

Start date​

Start Date is optional and sets how far back the first incremental sync reads. If you leave it empty, the connector reads from 1970-01-01T00:00:00+00:00. Use an ISO 8601 value, with or without a time and UTC offset: 2024-01-01, 2024-01-01 13:00:00, 2024-01-01T13:00:00-07:00, and 2024-01-01T13:00:00Z are all accepted.

Connector versions earlier than 0.1.4 can't parse UTC timestamps that end in Z, and fail the sync with Invalid isoformat string. Upgrade to 0.1.4 or later if your start date or saved cursor value uses that format.

List of Supported Environments for Zoho CRM​

Production​

EnvironmentBase URL
UShttps://zohoapis.com
AUhttps://zohoapis.com.au
EUhttps://zohoapis.eu
INhttps://zohoapis.in
CNhttps://zohoapis.com.cn
JPhttps://zohoapis.jp

Sandbox​

EnvironmentEndpoint
UShttps://sandbox.zohoapis.com
AUhttps://sandbox.zohoapis.com.au
EUhttps://sandbox.zohoapis.eu
INhttps://sandbox.zohoapis.in
CNhttps://sandbox.zohoapis.com.cn
JPhttps://sandbox.zohoapis.jp

Developer​

EnvironmentEndpoint
UShttps://developer.zohoapis.com
AUhttps://developer.zohoapis.com.au
EUhttps://developer.zohoapis.eu
INhttps://developer.zohoapis.in
CNhttps://developer.zohoapis.com.cn
JPhttps://developer.zohoapis.jp

For more information about available environments, please visit this page

Performance considerations​

Zoho CRM API calls consume credits, and each Zoho CRM edition has a credit limit in a 24-hour rolling window. Discovery is more expensive than it looks: the connector makes one call to list your modules, then two metadata calls per module (module metadata and field metadata). Take this into account when you set sync frequency. For the credit cost of each call, see API limits in the Zoho CRM documentation.

The connector detects your Zoho CRM Edition automatically from the Zoho organization API (/crm/v2/org), which requires the ZohoCRM.org.READ scope. The detected edition controls how many metadata requests the connector makes in parallel while it builds the list of streams:

EditionParallel requests
Free5
Standard10
Professional15
Enterprise20
Ultimate25

If the connector can't detect your edition, it falls back to a concurrency limit of 5 (the Free tier) and logs a warning that explains why. Common causes:

  • Your refresh token doesn't include the ZohoCRM.org.READ scope. Sources authenticated through Airbyte Cloud with connector version 0.2.0 didn't request this scope, so they fall into this group until you re-authenticate.
  • Zoho reports an edition name that isn't one of the five in the table. The warning includes the name Zoho returned.

To skip detection, set Max Concurrent Requests to the number of parallel requests you want. Use this to raise the limit without re-authenticating, to match the limit Zoho lists for your plan in its API limits table, or to throttle the connector when other integrations share the same Zoho API credits. A value higher than your account's concurrency limit can push the connector past what Zoho allows during discovery.

Note about using the Zoho Developer Environment​

The Zoho Developer environment API is inconsistent with production environment API. It contains about half of the modules supported in the production environment. Keep this in mind when pulling data from the Developer environment.

Setup guide​

There are two ways to authenticate, depending on where you run Airbyte. In both cases you also fill in these fields:

FieldRequiredNotes
Data Center LocationYesThe region that hosts your Zoho CRM account: US, AU, EU, IN, CN, or JP
EnvironmentYesProduction, Developer, or Sandbox
Start DateNoSee Start date
Max Concurrent RequestsNoOverrides edition detection. See Performance considerations

Airbyte Cloud: sign in with Zoho​

  1. Select your Data Center Location first. Zoho runs a separate accounts server per data center, and the sign-in flow uses the one for the region you pick.
  2. Select Authenticate your Zoho CRM account and sign in. Airbyte requests these read-only scopes:
    • ZohoCRM.settings.modules.READ and ZohoCRM.settings.fields.READ, to list your modules and their fields
    • ZohoCRM.modules.READ and ZohoCRM.modules.custom.READ, to read records from standard and custom modules
    • ZohoCRM.org.READ, to detect your Zoho CRM edition and set the request concurrency
  3. Fill in the remaining fields and select Set up source.

The flow stores only the refresh token in your source. The client ID and secret belong to Airbyte's Zoho app.

Airbyte Open Source​

Create a Zoho API client and generate a refresh token yourself, then enter the Client ID, Client Secret and Refresh Token in the source.

Get Client ID, Client Secret, and Grant Token​

  1. Log into https://api-console.zoho.com/
  2. Choose client
  3. Enter the scopes the refresh and access tokens cover. The connector reads module and field metadata, reads records from each module, and detects the edition from the organization API, so grant ZohoCRM.settings.modules.READ, ZohoCRM.settings.fields.READ, ZohoCRM.modules.READ, ZohoCRM.modules.custom.READ, and ZohoCRM.org.READ (or ZohoCRM.modules.ALL if you prefer a single module scope for records). Make sure the scope covers every module you want to sync. If the token lacks metadata access for a module, that module doesn't appear as a stream; if it lacks record access, the stream appears but the sync fails when it tries to read data.
  4. Enter grant token's lifetime and description, click "Create".
  5. Copy Grant token, close the popup and copy Client ID and Client Secret on the "Client Secret" tab.

Create Refresh Token​

For generating the refresh token, please refer to this page. Make sure to complete the auth flow quickly, as the initial token granted by Zoho CRM is only live for a few minutes before it can no longer be used to generate a refresh token.

IP allow list​

If you use Airbyte Cloud and your organization restricts access to specific IPs, add the Airbyte Cloud IP addresses to your allow list.

Reference​

Config fields reference

Field
Type
Property name
string
client_id
string
client_secret
string
dc_region
string
environment
string
refresh_token
integer
max_concurrent_requests
stringnull
start_datetime

Changelog​

Expand to review
VersionDatePull RequestSubject
0.3.12026-09-2286874Update dependencies
0.3.02026-09-2186491Auto-detect Zoho CRM edition from the organization API instead of the edition config field (defaulting to a concurrency limit of 5 when detection fails); add optional max_concurrent_requests override
0.2.02026-09-1685833Add advanced_auth with declarative OAuth (data-center-aware consent and token URLs) requesting Zoho's documented read scopes; document the OAuth and manual setup paths
0.1.62026-09-1586301Update dependencies
0.1.52026-08-2579062Update dependencies
0.1.42026-08-2480278Fix incremental sync: tolerate Z-suffixed (UTC) cursor values and resolve cursor field per module instead of hardcoding Modified_Time
0.1.32025-02-0542864Migrate to Poetry
0.1.22023-03-1923906added support for the latest CDK, fixed SAT
0.1.12023-03-1524034Set airbyte type to string for zoho autonumbers when they include prefix or suffix
0.1.02022-04-0611193Initial release