API v8 is not a v2 superset. The shape of pagination, error responses, and search semantics changed enough that drop-in upgrades will fail in production within a week. Plan a real migration.
Pagination Moved to Cursor-Based
v2 used page and per_page. v8 uses cursor tokens returned in the info block:
// v2
GET /crm/v2/Leads?page=3&per_page=200
// v8
GET /crm/v8/Leads?per_page=200&page_token=eyJsYXN0...
If you have any client code that constructs page=N URLs, refactor before migrating. Cursors are not predictable — you can only walk forward.
Search Semantics Tightened
v8’s search rejects ambiguous criteria that v2 silently accepted. (Email:equals:) (empty value) returned everything in v2; v8 returns a 400. Audit every search call your integrations make.
Typed Error Responses
v8 errors now include a code, details, and a stable error_id you can pattern-match safely. Build your error handlers around error_id, not the human-readable message:
if (response.data.code === "INVALID_DATA") {
// recover
}
The v2 habit of grep-ing the message string will eventually break on a localization update.
Bulk Operations Got Their Own Endpoint
v8 separates /bulk/v8/read and /bulk/v8/write. They’re async, return job IDs, and have their own callback URL pattern. Don’t try to use the synchronous endpoints for anything over 1,000 records — v8’s rate limits punish that pattern harder than v2 did.
OAuth Scopes Are Stricter
v8 requires fine-grained scopes:
ZohoCRM.modules.deals.READ # not ZohoCRM.modules.ALL
ZohoCRM.modules.deals.WRITE
ZohoCRM.bulk.READ
Apps using broad ZohoCRM.modules.ALL still work but Zoho is sunsetting those tokens. Re-issue tokens with narrow scopes during migration.
Migration Sequencing
Don’t migrate all integrations at once. Order by:
- Internal tools first (you control the rollback).
- Marketing automation second (lower-risk than billing).
- Billing and payment integrations last, with a maintenance window.
Run v2 and v8 side-by-side against the same module for a week before cutover. Diff the responses — that’s how you find the silent semantic shifts.
What to Do This Week
- List every integration calling Zoho APIs and tag the version.
- Find all
page=Nconstructions and queue them for cursor refactor. - Re-issue OAuth tokens with narrow scopes.
- Set up a side-by-side diff for one non-critical integration.