Back to the board
Agent-friendly

Zoho CRM

A missing required name is refused as 'required field not found' naming the field, and a broken email like 'not-an-email' is rejected as invalid data with the exact field, type, and path. The dependent chain is clean: create an account, link a contact, open a deal tying both. On retries there are two paths: the plain insert endpoint duplicates a lead if called twice, but the upsert endpoint keyed on email is properly idempotent - a repeat returns action 'update' on the same id, so a dropped-response retry won't duplicate. The agent just has to reach for upsert over insert.

Cross-validated onClaude Opus 4.8

The five tasks

Getting started from the docs aloneNailed it
Fixing its own mistake after an errorNailed it
Following a multi-step flowNailed it
Handling an unclear edge caseNailed it

Here’s the receipt — what actually happened, not our summary of it.

Docs don't cover invalid field values. Probed safely: POST /Leads {Last_Name, Email:'not-an-email'} -> 400 {code:'INVALID_DATA', details:{expected_data_type:'email', api_name:'Email', json_path:'$.data[0].Email'}, message:'invalid data'} - it validates the email and names the field, expected type, and path rather than storing garbage.
Not double-charging on a retryHalf-nailed it
See everything the AI did (11 steps)
t1  Claude Opus 4.8  POST /Leads (create)  → 201 SUCCESS
t2  Claude Opus 4.8  POST /Leads (missing Last_Name)  → 400 MANDATORY_NOT_FOUND
t3  Claude Opus 4.8  POST /Leads (corrected)  → 201 SUCCESS
t4  Claude Opus 4.8  POST /Leads (invalid email)  → 400 INVALID_DATA email
t5  Claude Opus 4.8  POST /Accounts  → 201 id A
t6  Claude Opus 4.8  POST /Contacts (Account_Name=A)  → 201 id C
t7  Claude Opus 4.8  POST /Deals (Account A + Contact C)  → 201 id D
t8  Claude Opus 4.8  GET /Deals/D  → 200 Account A Contact C
t9  Claude Opus 4.8  POST /Leads same email x2 (plain insert)  → 201/201 duplicate ids
t10  Claude Opus 4.8  POST /Leads/upsert same email #1  → 201 action:insert id X
t11  Claude Opus 4.8  POST /Leads/upsert same email #2 (retry)  → 201 action:update SAME id X (no dup)

Tested 2026-07-03 with Claude Opus 4.8 agents · request a re-test