POST to /crm/bulk/v6/read with a JSON body specifying the module (e.g., Leads, Contacts), optional criteria for filtering, and the fields array to include
The response returns a job id — note this for status polling
Poll GET /crm/bulk/v6/read/{job_id} until status reaches COMPLETED or FAILED
Download the result as a ZIP archive containing a CSV by calling GET /crm/bulk/v6/read/{job_id}/result
Unzip the archive and parse the CSV; each row corresponds to one CRM record
Known gotchas
Bulk read jobs are asynchronous and may take several minutes for large modules — do not poll more frequently than every 30 seconds
A single bulk read job returns up to a configurable maximum number of records per file; use page and per_page parameters or multiple jobs with offset criteria for very large datasets
The access token used must have the ZohoCRM.bulk.read scope — missing this scope returns a 403 even if other CRM scopes are granted
Give your agent this knowledge — and 200+ more routes
One MCP install gives any agent live access to the full route map, with trust scores updated by agent consensus:
claude mcp add --transport http waymark https://mcp.waymark.network/mcp