@bijection/connectors/zoho-crm entrypoint to declare Zoho CRM resources.
Availability
This page describes the pinned source package. Published availability is unestablished for this artifact. Source build and package availability.Resources and modes
| Resource | Mode | Description |
|---|---|---|
| Module records | pull | Modified_Time windows, deleted-records phase, bodyless 204/304 empty pages, If-Unmodified-Since updates |
| Module records | bulk | Bulk read jobs (ZIP of CSV) in Modified_Time windows for the initial load, then the incremental walk |
Module records
pull: Modified_Time windows, deleted-records phase, bodyless 204/304 empty pages, If-Unmodified-Since updates
The following example matches configurationstandard.
import { zohoCrm } from "@bijection/connectors/zoho-crm";
import { makeFunctionReference } from "bijection/server";
export const deals = zohoCrm.records.pull({
dataCentre: "eu",
module: "Deals",
fields: ["Deal_Name", "Amount"],
governingRule: makeFunctionReference<"query", any, [null]>("crm:canUpdate"),
});
Inferred record types
Inferred record types
Resource without an operational record table
Configuration: standard
Case:zoho-crm/records/pull/standard.
Connection and resource configuration are declared by this exact case.
Credential kind: zoho-crm. Keep credential material in the private credential inventory.
Inspect the complete configuration contract below for settings and conditional requirements.
Complete configuration contract
Complete configuration contract
{
"setup": [],
"resource": {
"access": {},
"defaults": {},
"connector": "zoho-crm",
"output": {
"kind": "single",
"collection": "records"
},
"credential_kind": "zoho-crm",
"connection_fields": [],
"address": {
"kind": "fixed",
"url": "https://www.zohoapis.eu/"
}
},
"connection_setup": {
"type": "object",
"value": {}
},
"execution": null
}
| Contract | Meaning |
|---|---|
| Initial | Enumeration of observed records |
| Changes | Repeated observations of current records |
| Deletions | Explicit deletion evidence |
| Resume | No continuation |
| Gap | Not applicable |
| Retention | Unspecified |
Complete native profile
Complete native profile
{
"movement": {
"exchanges": {
"changes": {
"200": {
"placement": "retained_bytes",
"interpretation": "json",
"projectsBeforeRetention": false,
"retainedBodyLimitBytes": "524288",
"fileLimitBytes": null
},
"204": {
"placement": "retained_bytes",
"interpretation": "none",
"projectsBeforeRetention": false,
"retainedBodyLimitBytes": "524288",
"fileLimitBytes": null
},
"304": {
"placement": "retained_bytes",
"interpretation": "none",
"projectsBeforeRetention": false,
"retainedBodyLimitBytes": "524288",
"fileLimitBytes": null
},
"429": {
"placement": "retained_bytes",
"interpretation": "opaque",
"projectsBeforeRetention": false,
"retainedBodyLimitBytes": "524288",
"fileLimitBytes": null
}
},
"deletions": {
"200": {
"placement": "retained_bytes",
"interpretation": "json",
"projectsBeforeRetention": false,
"retainedBodyLimitBytes": "524288",
"fileLimitBytes": null
},
"204": {
"placement": "retained_bytes",
"interpretation": "none",
"projectsBeforeRetention": false,
"retainedBodyLimitBytes": "524288",
"fileLimitBytes": null
},
"304": {
"placement": "retained_bytes",
"interpretation": "none",
"projectsBeforeRetention": false,
"retainedBodyLimitBytes": "524288",
"fileLimitBytes": null
},
"429": {
"placement": "retained_bytes",
"interpretation": "opaque",
"projectsBeforeRetention": false,
"retainedBodyLimitBytes": "524288",
"fileLimitBytes": null
}
},
"record": {
"200": {
"placement": "retained_bytes",
"interpretation": "json",
"projectsBeforeRetention": false,
"retainedBodyLimitBytes": "524288",
"fileLimitBytes": null
},
"204": {
"placement": "retained_bytes",
"interpretation": "opaque",
"projectsBeforeRetention": false,
"retainedBodyLimitBytes": "524288",
"fileLimitBytes": null
},
"400": {
"placement": "retained_bytes",
"interpretation": "opaque",
"projectsBeforeRetention": false,
"retainedBodyLimitBytes": "524288",
"fileLimitBytes": null
},
"429": {
"placement": "retained_bytes",
"interpretation": "opaque",
"projectsBeforeRetention": false,
"retainedBodyLimitBytes": "524288",
"fileLimitBytes": null
}
}
},
"nativeInputLimitBytes": null,
"steps": [
{
"id": "acquire.1",
"inputs": [],
"action": {
"operation": "acquire",
"subject": "exchange changes",
"limitBytes": null
}
},
{
"id": "acquire.2",
"inputs": [],
"action": {
"operation": "acquire",
"subject": "exchange deletions",
"limitBytes": null
}
},
{
"id": "acquire.3",
"inputs": [],
"action": {
"operation": "acquire",
"subject": "exchange record",
"limitBytes": null
}
},
{
"id": "retain.1",
"inputs": [
"acquire.1",
"acquire.2",
"acquire.3"
],
"action": {
"operation": "retain",
"subject": "acquisition evidence",
"reason": "recovery",
"release": "acquisition_custody"
}
},
{
"id": "interpret.1",
"inputs": [
"retain.1"
],
"action": {
"operation": "interpret",
"subject": "acquired input",
"produces": "records"
}
},
{
"id": "materialize.1",
"inputs": [
"interpret.1"
],
"action": {
"operation": "materialize",
"subject": "source rows",
"reason": "serving",
"release": "replacement"
}
},
{
"id": "publish.1",
"inputs": [
"materialize.1"
],
"action": {
"operation": "publish",
"subject": "source rows",
"visibility": "with_acquisition"
}
}
]
},
"initial": "enumeration",
"changes": "observations",
"deletions": "explicit_events",
"resume": "none",
"retentionMs": null,
"gap": "not_applicable",
"limits": {
"http_response_bytes": "524288"
},
"restrictions": [],
"commands": {
"update": {
"target": "records",
"delivery": "single_attempt",
"condition": "target_version",
"replayWindowMs": null,
"maxDeliveryHours": "1",
"providerEnforcedExpiry": false
}
}
}
| Command | Target | Condition | Delivery |
|---|---|---|---|
update | records | Target version precondition | Single dispatch attempt |
Commands, occurrences and artifacts
Commands, occurrences and artifacts
{
"records": {
"records": {
"protocol": "record_observation",
"coverage": "records",
"consistency": "observations",
"atomicity": "record",
"history": "observations",
"recordRefresh": true,
"reconciliation": true,
"notifications": false,
"snapshotMaxRows": null,
"profile": {
"movement": {
"exchanges": {
"changes": {
"200": {
"placement": "retained_bytes",
"interpretation": "json",
"projectsBeforeRetention": false,
"retainedBodyLimitBytes": "524288",
"fileLimitBytes": null
},
"204": {
"placement": "retained_bytes",
"interpretation": "none",
"projectsBeforeRetention": false,
"retainedBodyLimitBytes": "524288",
"fileLimitBytes": null
},
"304": {
"placement": "retained_bytes",
"interpretation": "none",
"projectsBeforeRetention": false,
"retainedBodyLimitBytes": "524288",
"fileLimitBytes": null
},
"429": {
"placement": "retained_bytes",
"interpretation": "opaque",
"projectsBeforeRetention": false,
"retainedBodyLimitBytes": "524288",
"fileLimitBytes": null
}
},
"deletions": {
"200": {
"placement": "retained_bytes",
"interpretation": "json",
"projectsBeforeRetention": false,
"retainedBodyLimitBytes": "524288",
"fileLimitBytes": null
},
"204": {
"placement": "retained_bytes",
"interpretation": "none",
"projectsBeforeRetention": false,
"retainedBodyLimitBytes": "524288",
"fileLimitBytes": null
},
"304": {
"placement": "retained_bytes",
"interpretation": "none",
"projectsBeforeRetention": false,
"retainedBodyLimitBytes": "524288",
"fileLimitBytes": null
},
"429": {
"placement": "retained_bytes",
"interpretation": "opaque",
"projectsBeforeRetention": false,
"retainedBodyLimitBytes": "524288",
"fileLimitBytes": null
}
},
"record": {
"200": {
"placement": "retained_bytes",
"interpretation": "json",
"projectsBeforeRetention": false,
"retainedBodyLimitBytes": "524288",
"fileLimitBytes": null
},
"204": {
"placement": "retained_bytes",
"interpretation": "opaque",
"projectsBeforeRetention": false,
"retainedBodyLimitBytes": "524288",
"fileLimitBytes": null
},
"400": {
"placement": "retained_bytes",
"interpretation": "opaque",
"projectsBeforeRetention": false,
"retainedBodyLimitBytes": "524288",
"fileLimitBytes": null
},
"429": {
"placement": "retained_bytes",
"interpretation": "opaque",
"projectsBeforeRetention": false,
"retainedBodyLimitBytes": "524288",
"fileLimitBytes": null
}
}
},
"nativeInputLimitBytes": null,
"steps": [
{
"id": "acquire.1",
"inputs": [],
"action": {
"operation": "acquire",
"subject": "exchange changes",
"limitBytes": null
}
},
{
"id": "acquire.2",
"inputs": [],
"action": {
"operation": "acquire",
"subject": "exchange deletions",
"limitBytes": null
}
},
{
"id": "acquire.3",
"inputs": [],
"action": {
"operation": "acquire",
"subject": "exchange record",
"limitBytes": null
}
},
{
"id": "retain.1",
"inputs": [
"acquire.1",
"acquire.2",
"acquire.3"
],
"action": {
"operation": "retain",
"subject": "acquisition evidence",
"reason": "recovery",
"release": "acquisition_custody"
}
},
{
"id": "interpret.1",
"inputs": [
"retain.1"
],
"action": {
"operation": "interpret",
"subject": "acquired input",
"produces": "records"
}
},
{
"id": "materialize.1",
"inputs": [
"interpret.1"
],
"action": {
"operation": "materialize",
"subject": "source rows",
"reason": "serving",
"release": "replacement"
}
},
{
"id": "publish.1",
"inputs": [
"materialize.1"
],
"action": {
"operation": "publish",
"subject": "source rows",
"visibility": "with_acquisition"
}
}
]
},
"initial": "enumeration",
"changes": "observations",
"deletions": "explicit_events",
"resume": "none",
"retentionMs": null,
"gap": "not_applicable",
"limits": {
"http_response_bytes": "524288"
},
"restrictions": [],
"commands": {
"update": {
"target": "records",
"delivery": "single_attempt",
"condition": "target_version",
"replayWindowMs": null,
"maxDeliveryHours": "1",
"providerEnforcedExpiry": false
}
}
}
}
},
"occurrences": null,
"artifacts": {
"raw_archive": false,
"native_file_transfer_limit_bytes": null,
"external_versions": false,
"files": {}
},
"commands": {
"update": {
"target": "records",
"condition": {
"kind": "target_version",
"from": {
"kind": "record_version"
}
},
"delivery": {
"kind": "single_attempt",
"retention": {
"kind": "unknown"
},
"max_delivery_hours": 1
}
}
}
}
| Requirement | Scope | Evidence | Result |
|---|---|---|---|
| page-publication-recovery | {“kind”:“collection”,“name”:“records”} | Native test: integrations/acquisition/acquisition_windows_preserve_sequences_and_restart_fences_old_work (shared_engine) | Execution result unavailable |
| command-response-lost | {“kind”:“command”,“name”:“update”} | Native test: integrations/listeners/calendar_repair_preserves_accepted_responsibility (shared_engine) | Execution result unavailable |
| identity-account | {“kind”:“connection”} | Fixture: ./src/connectors/zoho-crm/fixtures/identity.json | passed (2026-10-24T21:36:12.593Z) |
Configuration: readOnly
Case:zoho-crm/records/pull/readOnly.
Connection and resource configuration are declared by this exact case.
Credential kind: zoho-crm. Keep credential material in the private credential inventory.
Inspect the complete configuration contract below for settings and conditional requirements.
Complete configuration contract
Complete configuration contract
{
"setup": [],
"resource": {
"access": {},
"defaults": {},
"connector": "zoho-crm",
"output": {
"kind": "single",
"collection": "records"
},
"credential_kind": "zoho-crm",
"connection_fields": [],
"address": {
"kind": "fixed",
"url": "https://www.zohoapis.com.au/"
}
},
"connection_setup": {
"type": "object",
"value": {}
},
"execution": null
}
| Contract | Meaning |
|---|---|
| Initial | Enumeration of observed records |
| Changes | Repeated observations of current records |
| Deletions | Explicit deletion evidence |
| Resume | No continuation |
| Gap | Not applicable |
| Retention | Unspecified |
Complete native profile
Complete native profile
{
"movement": {
"exchanges": {
"changes": {
"200": {
"placement": "retained_bytes",
"interpretation": "json",
"projectsBeforeRetention": false,
"retainedBodyLimitBytes": "524288",
"fileLimitBytes": null
},
"204": {
"placement": "retained_bytes",
"interpretation": "none",
"projectsBeforeRetention": false,
"retainedBodyLimitBytes": "524288",
"fileLimitBytes": null
},
"304": {
"placement": "retained_bytes",
"interpretation": "none",
"projectsBeforeRetention": false,
"retainedBodyLimitBytes": "524288",
"fileLimitBytes": null
},
"429": {
"placement": "retained_bytes",
"interpretation": "opaque",
"projectsBeforeRetention": false,
"retainedBodyLimitBytes": "524288",
"fileLimitBytes": null
}
},
"deletions": {
"200": {
"placement": "retained_bytes",
"interpretation": "json",
"projectsBeforeRetention": false,
"retainedBodyLimitBytes": "524288",
"fileLimitBytes": null
},
"204": {
"placement": "retained_bytes",
"interpretation": "none",
"projectsBeforeRetention": false,
"retainedBodyLimitBytes": "524288",
"fileLimitBytes": null
},
"304": {
"placement": "retained_bytes",
"interpretation": "none",
"projectsBeforeRetention": false,
"retainedBodyLimitBytes": "524288",
"fileLimitBytes": null
},
"429": {
"placement": "retained_bytes",
"interpretation": "opaque",
"projectsBeforeRetention": false,
"retainedBodyLimitBytes": "524288",
"fileLimitBytes": null
}
},
"record": {
"200": {
"placement": "retained_bytes",
"interpretation": "json",
"projectsBeforeRetention": false,
"retainedBodyLimitBytes": "524288",
"fileLimitBytes": null
},
"204": {
"placement": "retained_bytes",
"interpretation": "opaque",
"projectsBeforeRetention": false,
"retainedBodyLimitBytes": "524288",
"fileLimitBytes": null
},
"400": {
"placement": "retained_bytes",
"interpretation": "opaque",
"projectsBeforeRetention": false,
"retainedBodyLimitBytes": "524288",
"fileLimitBytes": null
},
"429": {
"placement": "retained_bytes",
"interpretation": "opaque",
"projectsBeforeRetention": false,
"retainedBodyLimitBytes": "524288",
"fileLimitBytes": null
}
}
},
"nativeInputLimitBytes": null,
"steps": [
{
"id": "acquire.1",
"inputs": [],
"action": {
"operation": "acquire",
"subject": "exchange changes",
"limitBytes": null
}
},
{
"id": "acquire.2",
"inputs": [],
"action": {
"operation": "acquire",
"subject": "exchange deletions",
"limitBytes": null
}
},
{
"id": "acquire.3",
"inputs": [],
"action": {
"operation": "acquire",
"subject": "exchange record",
"limitBytes": null
}
},
{
"id": "retain.1",
"inputs": [
"acquire.1",
"acquire.2",
"acquire.3"
],
"action": {
"operation": "retain",
"subject": "acquisition evidence",
"reason": "recovery",
"release": "acquisition_custody"
}
},
{
"id": "interpret.1",
"inputs": [
"retain.1"
],
"action": {
"operation": "interpret",
"subject": "acquired input",
"produces": "records"
}
},
{
"id": "materialize.1",
"inputs": [
"interpret.1"
],
"action": {
"operation": "materialize",
"subject": "source rows",
"reason": "serving",
"release": "replacement"
}
},
{
"id": "publish.1",
"inputs": [
"materialize.1"
],
"action": {
"operation": "publish",
"subject": "source rows",
"visibility": "with_acquisition"
}
}
]
},
"initial": "enumeration",
"changes": "observations",
"deletions": "explicit_events",
"resume": "none",
"retentionMs": null,
"gap": "not_applicable",
"limits": {
"http_response_bytes": "524288"
},
"restrictions": [],
"commands": {}
}
Commands, occurrences and artifacts
Commands, occurrences and artifacts
{
"records": {
"records": {
"protocol": "record_observation",
"coverage": "records",
"consistency": "observations",
"atomicity": "record",
"history": "observations",
"recordRefresh": true,
"reconciliation": true,
"notifications": false,
"snapshotMaxRows": null,
"profile": {
"movement": {
"exchanges": {
"changes": {
"200": {
"placement": "retained_bytes",
"interpretation": "json",
"projectsBeforeRetention": false,
"retainedBodyLimitBytes": "524288",
"fileLimitBytes": null
},
"204": {
"placement": "retained_bytes",
"interpretation": "none",
"projectsBeforeRetention": false,
"retainedBodyLimitBytes": "524288",
"fileLimitBytes": null
},
"304": {
"placement": "retained_bytes",
"interpretation": "none",
"projectsBeforeRetention": false,
"retainedBodyLimitBytes": "524288",
"fileLimitBytes": null
},
"429": {
"placement": "retained_bytes",
"interpretation": "opaque",
"projectsBeforeRetention": false,
"retainedBodyLimitBytes": "524288",
"fileLimitBytes": null
}
},
"deletions": {
"200": {
"placement": "retained_bytes",
"interpretation": "json",
"projectsBeforeRetention": false,
"retainedBodyLimitBytes": "524288",
"fileLimitBytes": null
},
"204": {
"placement": "retained_bytes",
"interpretation": "none",
"projectsBeforeRetention": false,
"retainedBodyLimitBytes": "524288",
"fileLimitBytes": null
},
"304": {
"placement": "retained_bytes",
"interpretation": "none",
"projectsBeforeRetention": false,
"retainedBodyLimitBytes": "524288",
"fileLimitBytes": null
},
"429": {
"placement": "retained_bytes",
"interpretation": "opaque",
"projectsBeforeRetention": false,
"retainedBodyLimitBytes": "524288",
"fileLimitBytes": null
}
},
"record": {
"200": {
"placement": "retained_bytes",
"interpretation": "json",
"projectsBeforeRetention": false,
"retainedBodyLimitBytes": "524288",
"fileLimitBytes": null
},
"204": {
"placement": "retained_bytes",
"interpretation": "opaque",
"projectsBeforeRetention": false,
"retainedBodyLimitBytes": "524288",
"fileLimitBytes": null
},
"400": {
"placement": "retained_bytes",
"interpretation": "opaque",
"projectsBeforeRetention": false,
"retainedBodyLimitBytes": "524288",
"fileLimitBytes": null
},
"429": {
"placement": "retained_bytes",
"interpretation": "opaque",
"projectsBeforeRetention": false,
"retainedBodyLimitBytes": "524288",
"fileLimitBytes": null
}
}
},
"nativeInputLimitBytes": null,
"steps": [
{
"id": "acquire.1",
"inputs": [],
"action": {
"operation": "acquire",
"subject": "exchange changes",
"limitBytes": null
}
},
{
"id": "acquire.2",
"inputs": [],
"action": {
"operation": "acquire",
"subject": "exchange deletions",
"limitBytes": null
}
},
{
"id": "acquire.3",
"inputs": [],
"action": {
"operation": "acquire",
"subject": "exchange record",
"limitBytes": null
}
},
{
"id": "retain.1",
"inputs": [
"acquire.1",
"acquire.2",
"acquire.3"
],
"action": {
"operation": "retain",
"subject": "acquisition evidence",
"reason": "recovery",
"release": "acquisition_custody"
}
},
{
"id": "interpret.1",
"inputs": [
"retain.1"
],
"action": {
"operation": "interpret",
"subject": "acquired input",
"produces": "records"
}
},
{
"id": "materialize.1",
"inputs": [
"interpret.1"
],
"action": {
"operation": "materialize",
"subject": "source rows",
"reason": "serving",
"release": "replacement"
}
},
{
"id": "publish.1",
"inputs": [
"materialize.1"
],
"action": {
"operation": "publish",
"subject": "source rows",
"visibility": "with_acquisition"
}
}
]
},
"initial": "enumeration",
"changes": "observations",
"deletions": "explicit_events",
"resume": "none",
"retentionMs": null,
"gap": "not_applicable",
"limits": {
"http_response_bytes": "524288"
},
"restrictions": [],
"commands": {}
}
}
},
"occurrences": null,
"artifacts": {
"raw_archive": false,
"native_file_transfer_limit_bytes": null,
"external_versions": false,
"files": {}
},
"commands": {}
}
| Requirement | Scope | Evidence | Result |
|---|---|---|---|
| page-publication-recovery | {“kind”:“collection”,“name”:“records”} | Native test: integrations/acquisition/acquisition_windows_preserve_sequences_and_restart_fences_old_work (shared_engine) | Execution result unavailable |
| identity-account | {“kind”:“connection”} | Fixture: ./src/connectors/zoho-crm/fixtures/identity.json | passed (2026-10-24T21:36:12.593Z) |
bulk: Bulk read jobs (ZIP of CSV) in Modified_Time windows for the initial load, then the incremental walk
The following example matches configurationbulkLeads.
import { zohoCrm } from "@bijection/connectors/zoho-crm";
export const leads = zohoCrm.records.bulk({
dataCentre: "com",
module: "Leads",
fields: ["Last_Name", "Annual_Revenue"],
bulk: { since: "2026-01-01T00:00:00Z", windowDays: 30 },
});
Inferred record types
Inferred record types
Resource without an operational record table
Configuration: bulkLeads
Case:zoho-crm/records/bulk/bulkLeads.
Connection and resource configuration are declared by this exact case.
Credential kind: zoho-crm. Keep credential material in the private credential inventory.
Inspect the complete configuration contract below for settings and conditional requirements.
Complete configuration contract
Complete configuration contract
{
"setup": [],
"resource": {
"access": {},
"defaults": {},
"connector": "zoho-crm",
"output": {
"kind": "single",
"collection": "records"
},
"credential_kind": "zoho-crm",
"connection_fields": [],
"address": {
"kind": "fixed",
"url": "https://www.zohoapis.com/"
}
},
"connection_setup": {
"type": "object",
"value": {}
},
"execution": null
}
| Contract | Meaning |
|---|---|
| Initial | Enumeration of observed records |
| Changes | Repeated observations of current records |
| Deletions | Explicit deletion evidence |
| Resume | No continuation |
| Gap | Not applicable |
| Retention | Unspecified |
Complete native profile
Complete native profile
{
"movement": {
"exchanges": {
"bulk": {
"201": {
"placement": "retained_bytes",
"interpretation": "json",
"projectsBeforeRetention": false,
"retainedBodyLimitBytes": "524288",
"fileLimitBytes": null
},
"400": {
"placement": "retained_bytes",
"interpretation": "opaque",
"projectsBeforeRetention": false,
"retainedBodyLimitBytes": "524288",
"fileLimitBytes": null
},
"401": {
"placement": "retained_bytes",
"interpretation": "opaque",
"projectsBeforeRetention": false,
"retainedBodyLimitBytes": "524288",
"fileLimitBytes": null
},
"403": {
"placement": "retained_bytes",
"interpretation": "opaque",
"projectsBeforeRetention": false,
"retainedBodyLimitBytes": "524288",
"fileLimitBytes": null
},
"429": {
"placement": "retained_bytes",
"interpretation": "opaque",
"projectsBeforeRetention": false,
"retainedBodyLimitBytes": "524288",
"fileLimitBytes": null
}
},
"bulkPage": {
"201": {
"placement": "retained_bytes",
"interpretation": "json",
"projectsBeforeRetention": false,
"retainedBodyLimitBytes": "524288",
"fileLimitBytes": null
},
"400": {
"placement": "retained_bytes",
"interpretation": "opaque",
"projectsBeforeRetention": false,
"retainedBodyLimitBytes": "524288",
"fileLimitBytes": null
},
"401": {
"placement": "retained_bytes",
"interpretation": "opaque",
"projectsBeforeRetention": false,
"retainedBodyLimitBytes": "524288",
"fileLimitBytes": null
},
"403": {
"placement": "retained_bytes",
"interpretation": "opaque",
"projectsBeforeRetention": false,
"retainedBodyLimitBytes": "524288",
"fileLimitBytes": null
},
"429": {
"placement": "retained_bytes",
"interpretation": "opaque",
"projectsBeforeRetention": false,
"retainedBodyLimitBytes": "524288",
"fileLimitBytes": null
}
},
"bulkResult": {
"200": {
"placement": "retained_bytes",
"interpretation": "document",
"projectsBeforeRetention": false,
"retainedBodyLimitBytes": "524288",
"fileLimitBytes": null
},
"404": {
"placement": "retained_bytes",
"interpretation": "opaque",
"projectsBeforeRetention": false,
"retainedBodyLimitBytes": "524288",
"fileLimitBytes": null
},
"429": {
"placement": "retained_bytes",
"interpretation": "opaque",
"projectsBeforeRetention": false,
"retainedBodyLimitBytes": "524288",
"fileLimitBytes": null
}
},
"bulkStatus": {
"200": {
"placement": "retained_bytes",
"interpretation": "json",
"projectsBeforeRetention": false,
"retainedBodyLimitBytes": "524288",
"fileLimitBytes": null
},
"404": {
"placement": "retained_bytes",
"interpretation": "opaque",
"projectsBeforeRetention": false,
"retainedBodyLimitBytes": "524288",
"fileLimitBytes": null
},
"429": {
"placement": "retained_bytes",
"interpretation": "opaque",
"projectsBeforeRetention": false,
"retainedBodyLimitBytes": "524288",
"fileLimitBytes": null
}
},
"changes": {
"200": {
"placement": "retained_bytes",
"interpretation": "json",
"projectsBeforeRetention": false,
"retainedBodyLimitBytes": "524288",
"fileLimitBytes": null
},
"204": {
"placement": "retained_bytes",
"interpretation": "none",
"projectsBeforeRetention": false,
"retainedBodyLimitBytes": "524288",
"fileLimitBytes": null
},
"304": {
"placement": "retained_bytes",
"interpretation": "none",
"projectsBeforeRetention": false,
"retainedBodyLimitBytes": "524288",
"fileLimitBytes": null
},
"429": {
"placement": "retained_bytes",
"interpretation": "opaque",
"projectsBeforeRetention": false,
"retainedBodyLimitBytes": "524288",
"fileLimitBytes": null
}
},
"deletions": {
"200": {
"placement": "retained_bytes",
"interpretation": "json",
"projectsBeforeRetention": false,
"retainedBodyLimitBytes": "524288",
"fileLimitBytes": null
},
"204": {
"placement": "retained_bytes",
"interpretation": "none",
"projectsBeforeRetention": false,
"retainedBodyLimitBytes": "524288",
"fileLimitBytes": null
},
"304": {
"placement": "retained_bytes",
"interpretation": "none",
"projectsBeforeRetention": false,
"retainedBodyLimitBytes": "524288",
"fileLimitBytes": null
},
"429": {
"placement": "retained_bytes",
"interpretation": "opaque",
"projectsBeforeRetention": false,
"retainedBodyLimitBytes": "524288",
"fileLimitBytes": null
}
},
"record": {
"200": {
"placement": "retained_bytes",
"interpretation": "json",
"projectsBeforeRetention": false,
"retainedBodyLimitBytes": "524288",
"fileLimitBytes": null
},
"204": {
"placement": "retained_bytes",
"interpretation": "opaque",
"projectsBeforeRetention": false,
"retainedBodyLimitBytes": "524288",
"fileLimitBytes": null
},
"400": {
"placement": "retained_bytes",
"interpretation": "opaque",
"projectsBeforeRetention": false,
"retainedBodyLimitBytes": "524288",
"fileLimitBytes": null
},
"429": {
"placement": "retained_bytes",
"interpretation": "opaque",
"projectsBeforeRetention": false,
"retainedBodyLimitBytes": "524288",
"fileLimitBytes": null
}
}
},
"nativeInputLimitBytes": null,
"steps": [
{
"id": "acquire.1",
"inputs": [],
"action": {
"operation": "acquire",
"subject": "exchange bulk",
"limitBytes": null
}
},
{
"id": "acquire.2",
"inputs": [],
"action": {
"operation": "acquire",
"subject": "exchange bulkPage",
"limitBytes": null
}
},
{
"id": "acquire.3",
"inputs": [],
"action": {
"operation": "acquire",
"subject": "exchange bulkResult",
"limitBytes": null
}
},
{
"id": "acquire.4",
"inputs": [],
"action": {
"operation": "acquire",
"subject": "exchange bulkStatus",
"limitBytes": null
}
},
{
"id": "acquire.5",
"inputs": [],
"action": {
"operation": "acquire",
"subject": "exchange changes",
"limitBytes": null
}
},
{
"id": "acquire.6",
"inputs": [],
"action": {
"operation": "acquire",
"subject": "exchange deletions",
"limitBytes": null
}
},
{
"id": "acquire.7",
"inputs": [],
"action": {
"operation": "acquire",
"subject": "exchange record",
"limitBytes": null
}
},
{
"id": "retain.1",
"inputs": [
"acquire.1",
"acquire.2",
"acquire.3",
"acquire.4",
"acquire.5",
"acquire.6",
"acquire.7"
],
"action": {
"operation": "retain",
"subject": "acquisition evidence",
"reason": "recovery",
"release": "acquisition_custody"
}
},
{
"id": "interpret.1",
"inputs": [
"retain.1"
],
"action": {
"operation": "interpret",
"subject": "acquired input",
"produces": "records"
}
},
{
"id": "materialize.1",
"inputs": [
"interpret.1"
],
"action": {
"operation": "materialize",
"subject": "source rows",
"reason": "serving",
"release": "replacement"
}
},
{
"id": "publish.1",
"inputs": [
"materialize.1"
],
"action": {
"operation": "publish",
"subject": "source rows",
"visibility": "with_acquisition"
}
}
]
},
"initial": "enumeration",
"changes": "observations",
"deletions": "explicit_events",
"resume": "none",
"retentionMs": null,
"gap": "not_applicable",
"limits": {
"http_response_bytes": "524288"
},
"restrictions": [],
"commands": {}
}
Commands, occurrences and artifacts
Commands, occurrences and artifacts
{
"records": {
"records": {
"protocol": "record_observation",
"coverage": "records",
"consistency": "observations",
"atomicity": "record",
"history": "observations",
"recordRefresh": true,
"reconciliation": true,
"notifications": false,
"snapshotMaxRows": null,
"profile": {
"movement": {
"exchanges": {
"bulk": {
"201": {
"placement": "retained_bytes",
"interpretation": "json",
"projectsBeforeRetention": false,
"retainedBodyLimitBytes": "524288",
"fileLimitBytes": null
},
"400": {
"placement": "retained_bytes",
"interpretation": "opaque",
"projectsBeforeRetention": false,
"retainedBodyLimitBytes": "524288",
"fileLimitBytes": null
},
"401": {
"placement": "retained_bytes",
"interpretation": "opaque",
"projectsBeforeRetention": false,
"retainedBodyLimitBytes": "524288",
"fileLimitBytes": null
},
"403": {
"placement": "retained_bytes",
"interpretation": "opaque",
"projectsBeforeRetention": false,
"retainedBodyLimitBytes": "524288",
"fileLimitBytes": null
},
"429": {
"placement": "retained_bytes",
"interpretation": "opaque",
"projectsBeforeRetention": false,
"retainedBodyLimitBytes": "524288",
"fileLimitBytes": null
}
},
"bulkPage": {
"201": {
"placement": "retained_bytes",
"interpretation": "json",
"projectsBeforeRetention": false,
"retainedBodyLimitBytes": "524288",
"fileLimitBytes": null
},
"400": {
"placement": "retained_bytes",
"interpretation": "opaque",
"projectsBeforeRetention": false,
"retainedBodyLimitBytes": "524288",
"fileLimitBytes": null
},
"401": {
"placement": "retained_bytes",
"interpretation": "opaque",
"projectsBeforeRetention": false,
"retainedBodyLimitBytes": "524288",
"fileLimitBytes": null
},
"403": {
"placement": "retained_bytes",
"interpretation": "opaque",
"projectsBeforeRetention": false,
"retainedBodyLimitBytes": "524288",
"fileLimitBytes": null
},
"429": {
"placement": "retained_bytes",
"interpretation": "opaque",
"projectsBeforeRetention": false,
"retainedBodyLimitBytes": "524288",
"fileLimitBytes": null
}
},
"bulkResult": {
"200": {
"placement": "retained_bytes",
"interpretation": "document",
"projectsBeforeRetention": false,
"retainedBodyLimitBytes": "524288",
"fileLimitBytes": null
},
"404": {
"placement": "retained_bytes",
"interpretation": "opaque",
"projectsBeforeRetention": false,
"retainedBodyLimitBytes": "524288",
"fileLimitBytes": null
},
"429": {
"placement": "retained_bytes",
"interpretation": "opaque",
"projectsBeforeRetention": false,
"retainedBodyLimitBytes": "524288",
"fileLimitBytes": null
}
},
"bulkStatus": {
"200": {
"placement": "retained_bytes",
"interpretation": "json",
"projectsBeforeRetention": false,
"retainedBodyLimitBytes": "524288",
"fileLimitBytes": null
},
"404": {
"placement": "retained_bytes",
"interpretation": "opaque",
"projectsBeforeRetention": false,
"retainedBodyLimitBytes": "524288",
"fileLimitBytes": null
},
"429": {
"placement": "retained_bytes",
"interpretation": "opaque",
"projectsBeforeRetention": false,
"retainedBodyLimitBytes": "524288",
"fileLimitBytes": null
}
},
"changes": {
"200": {
"placement": "retained_bytes",
"interpretation": "json",
"projectsBeforeRetention": false,
"retainedBodyLimitBytes": "524288",
"fileLimitBytes": null
},
"204": {
"placement": "retained_bytes",
"interpretation": "none",
"projectsBeforeRetention": false,
"retainedBodyLimitBytes": "524288",
"fileLimitBytes": null
},
"304": {
"placement": "retained_bytes",
"interpretation": "none",
"projectsBeforeRetention": false,
"retainedBodyLimitBytes": "524288",
"fileLimitBytes": null
},
"429": {
"placement": "retained_bytes",
"interpretation": "opaque",
"projectsBeforeRetention": false,
"retainedBodyLimitBytes": "524288",
"fileLimitBytes": null
}
},
"deletions": {
"200": {
"placement": "retained_bytes",
"interpretation": "json",
"projectsBeforeRetention": false,
"retainedBodyLimitBytes": "524288",
"fileLimitBytes": null
},
"204": {
"placement": "retained_bytes",
"interpretation": "none",
"projectsBeforeRetention": false,
"retainedBodyLimitBytes": "524288",
"fileLimitBytes": null
},
"304": {
"placement": "retained_bytes",
"interpretation": "none",
"projectsBeforeRetention": false,
"retainedBodyLimitBytes": "524288",
"fileLimitBytes": null
},
"429": {
"placement": "retained_bytes",
"interpretation": "opaque",
"projectsBeforeRetention": false,
"retainedBodyLimitBytes": "524288",
"fileLimitBytes": null
}
},
"record": {
"200": {
"placement": "retained_bytes",
"interpretation": "json",
"projectsBeforeRetention": false,
"retainedBodyLimitBytes": "524288",
"fileLimitBytes": null
},
"204": {
"placement": "retained_bytes",
"interpretation": "opaque",
"projectsBeforeRetention": false,
"retainedBodyLimitBytes": "524288",
"fileLimitBytes": null
},
"400": {
"placement": "retained_bytes",
"interpretation": "opaque",
"projectsBeforeRetention": false,
"retainedBodyLimitBytes": "524288",
"fileLimitBytes": null
},
"429": {
"placement": "retained_bytes",
"interpretation": "opaque",
"projectsBeforeRetention": false,
"retainedBodyLimitBytes": "524288",
"fileLimitBytes": null
}
}
},
"nativeInputLimitBytes": null,
"steps": [
{
"id": "acquire.1",
"inputs": [],
"action": {
"operation": "acquire",
"subject": "exchange bulk",
"limitBytes": null
}
},
{
"id": "acquire.2",
"inputs": [],
"action": {
"operation": "acquire",
"subject": "exchange bulkPage",
"limitBytes": null
}
},
{
"id": "acquire.3",
"inputs": [],
"action": {
"operation": "acquire",
"subject": "exchange bulkResult",
"limitBytes": null
}
},
{
"id": "acquire.4",
"inputs": [],
"action": {
"operation": "acquire",
"subject": "exchange bulkStatus",
"limitBytes": null
}
},
{
"id": "acquire.5",
"inputs": [],
"action": {
"operation": "acquire",
"subject": "exchange changes",
"limitBytes": null
}
},
{
"id": "acquire.6",
"inputs": [],
"action": {
"operation": "acquire",
"subject": "exchange deletions",
"limitBytes": null
}
},
{
"id": "acquire.7",
"inputs": [],
"action": {
"operation": "acquire",
"subject": "exchange record",
"limitBytes": null
}
},
{
"id": "retain.1",
"inputs": [
"acquire.1",
"acquire.2",
"acquire.3",
"acquire.4",
"acquire.5",
"acquire.6",
"acquire.7"
],
"action": {
"operation": "retain",
"subject": "acquisition evidence",
"reason": "recovery",
"release": "acquisition_custody"
}
},
{
"id": "interpret.1",
"inputs": [
"retain.1"
],
"action": {
"operation": "interpret",
"subject": "acquired input",
"produces": "records"
}
},
{
"id": "materialize.1",
"inputs": [
"interpret.1"
],
"action": {
"operation": "materialize",
"subject": "source rows",
"reason": "serving",
"release": "replacement"
}
},
{
"id": "publish.1",
"inputs": [
"materialize.1"
],
"action": {
"operation": "publish",
"subject": "source rows",
"visibility": "with_acquisition"
}
}
]
},
"initial": "enumeration",
"changes": "observations",
"deletions": "explicit_events",
"resume": "none",
"retentionMs": null,
"gap": "not_applicable",
"limits": {
"http_response_bytes": "524288"
},
"restrictions": [],
"commands": {}
}
}
},
"occurrences": null,
"artifacts": {
"raw_archive": false,
"native_file_transfer_limit_bytes": null,
"external_versions": false,
"files": {}
},
"commands": {}
}
| Requirement | Scope | Evidence | Result |
|---|---|---|---|
| page-publication-recovery | {“kind”:“collection”,“name”:“records”} | Fixture: ./src/connectors/zoho-crm/fixtures/bulk-first-window.json | passed (2026-10-24T21:36:12.601Z) |
| page-publication-recovery | {“kind”:“collection”,“name”:“records”} | Fixture: ./src/connectors/zoho-crm/fixtures/bulk-status-polled.json | passed (2026-10-24T21:36:12.604Z) |
| page-publication-recovery | {“kind”:“collection”,“name”:“records”} | Fixture: ./src/connectors/zoho-crm/fixtures/bulk-next-page.json | passed (2026-10-24T21:36:12.605Z) |
| page-publication-recovery | {“kind”:“collection”,“name”:“records”} | Fixture: ./src/connectors/zoho-crm/fixtures/bulk-result-window.json | passed (2026-10-24T21:36:12.608Z) |
| page-publication-recovery | {“kind”:“collection”,“name”:“records”} | Fixture: ./src/connectors/zoho-crm/fixtures/bulk-load-hands-over.json | passed (2026-10-24T21:36:12.610Z) |
| page-publication-recovery | {“kind”:“collection”,“name”:“records”} | Native test: integrations/acquisition/acquisition_windows_preserve_sequences_and_restart_fences_old_work (shared_engine) | Execution result unavailable |
| identity-account | {“kind”:“connection”} | Fixture: ./src/connectors/zoho-crm/fixtures/identity.json | passed (2026-10-24T21:36:12.611Z) |
Provider guidance
Compiled declaration examples and configuration details are published in the connector reference. The binding’sdataCentre (com, eu, in, com.au, jp, ca, com.cn
or sa) fixes the API domain https://www.zohoapis.<dataCentre>/ the
zoho-crm credential is presented to (the token answer’s api_domain is
authoritative; Zoho’s CRM pages confirm only com, eu and com.cn). Zoho
takes Authorization: Zoho-oauthtoken <token>: the connection’s managed
oauth_refresh envelope names that scheme (protocol.bearer_scheme), and the
host writes each refreshed token under it. Identity is the organization id of
GET /crm/v8/org.
{
"kind": "oauth_refresh",
"protocol": { "bearer_scheme": "Zoho-oauthtoken", "refresh_semantics": "repeatable" },
"token_endpoint": "https://accounts.zoho.<dc>/oauth/v2/token",
"client_id": "…",
"client_secret": "…",
"refresh_token": "…",
"refresh_context": { "kind": "none" },
"allowed_resource_origins": ["https://www.zohoapis.<dc>"]
}
records.pull reads one module sorted by Modified_Time ascending with an
If-Modified-Since header, 200 rows a page (fewer when the fields would
overflow one record publication), re-asking from one second before the latest
Modified_Time read; more than 2,000 rows inside one such window fails the
walk. The pass then reads /deleted?type=all from the same bound
(recycle bin 60 days, permanent deletions 120 days), and every row withdraws a
record. A finished pass carries the latest modification and deletion; the next
starts five minutes before them. Zoho answers a module with no records 204 and
an unchanged window 304, with no body; both listings declare those statuses
bodyless, so either answer is an empty page and ends its phase.
update sends Modified_Time as If-Unmodified-Since; Zoho refuses a record
modified since with 412 ALREADY_MODIFIED. The comparison is at whole seconds.
records.bulk takes the same options plus bulk: { since, windowDays } (at
most 30 fields) and loads the module through Bulk Read jobs before the walk
starts:
export const leads = zohoCrm.records.bulk({
dataCentre: "com",
module: "Leads",
fields: ["Last_Name", "Email", "Annual_Revenue"],
bulk: { since: "2020-01-01T00:00:00Z", windowDays: 90 },
});
POST /crm/bulk/v8/read, scope ZohoCRM.bulk.read)
for a Modified_Time window — the first from the epoch to since plus
windowDays, then the next windowDays — polls the job every minute until
COMPLETED, reads its ZIP of CSV 128 records at a time and follows
next_page_token pages. The job whose window reaches its kick-off date hands
the walk a carried position: modifications from that date, deletions from the
load’s first job. The host fetches the whole ZIP for every 128 records (Zoho
allows 10 downloads a minute) and refuses one over 512 KiB, or over 4 MiB of
CSV, so a window holding more fails visibly: shrink windowDays. CSV values
are text, an empty field reads as null, and lookups are ids.
Notifications (actions/watch) and page_token paging of the Records API are
not declared; see the platform’s sales CRM page. Nothing here has run against
Zoho or been qualified.
Provider references
Provider references and prerequisites are maintained in the connector guidance above. No separate provider-documentation review date is recorded.Source and evidence
Canonical connector source, native analysis and check receipts. Connector artifact:905888ea276a2a28e36981a79e8142b2547ea451c3e63162cb6915ad4a7d1305.
The resource declaration examples above are compiled and compared with exact catalog declarations. Recorded checks apply only to their source, declaration and runtime identities. Configure a connection and inspect its status to establish deployment-specific readiness.