You signed in with another tab or window. Reload to refresh your session.You signed out in another tab or window. Reload to refresh your session.You switched accounts on another tab or window. Reload to refresh your session.Dismiss alert
Five independent audits (OAuth/scopes, tools-vs-docs, block/selectors,
blast-radius, /validate-trigger). Findings, most severe first.
A trigger-mode field was a live tool-mode required param. `shouldSerializeSubBlock`
excluded `mode: 'trigger'` but not `'trigger-advanced'`, so the trigger's required
`manualOrgId` validated on every tool operation. Reproduced against the real
serializer: with the Organization field pinned to advanced, running
List Organizations failed with "Missing required fields: Organization ID" - a
field that operation does not even render, and which the user could not clear
without switching operations. Fixed in the serializer rather than locally,
because the Google Sheets/Drive/Calendar pollers have the identical shape.
`limit=200` on /organizations was an undocumented parameter I added by
extrapolating from /departments and /agents. Zoho documents NO parameters for
that endpoint and its sample is a bare GET; the other siblings cap at 100 and
Zoho answers out-of-range with 422. Since orgId gates every tool and both other
selectors, a 422 there would have made the whole integration unreachable. Reverted
to Zoho's documented shape.
`descriptionText` was HTML-stripping plain text. The previous round made the strip
unconditional after finding Zoho sends no `descriptionContentType`, but Zoho's REST
samples show plain descriptions while only the webhook payload is HTML - and the
webhook path runs this over contact/account/department bodies too. html-to-text is
not identity on plain text: it decodes entities and deletes tag-shaped content
("a < b > c", XML snippets). Now sniffs for markup first.
`omitUnset` made every documented field-clear impossible. Zoho's own PATCH sample
uses `"classification": ""` and `"productId": ""` to clear. Dropping `''` meant no
scalar field could be cleared. Now drops only undefined/null - the serializer-null
case it was written for - and forwards `''`.
status/priority leaked between operations. One shared subBlock served both the
list_tickets filter and the update_ticket value, and subBlock values survive an
operation switch, so a filter of "Open,On Hold" could be PATCHed onto a ticket and
an update value could silently filter a later list. Split per operation.
Auth: `invalid_code` added to TERMINAL_ERRORS - it is Zoho's code for a revoked
refresh token, so without it the previous round's refresh fix never actually
dead-flagged the credential it was written for. The shared refresh body-error
branch now also requires `!data.access_token`, so no provider can have a
successful refresh misclassified. The token route now uses the validating
`extractZohoDeskBaseFromScope` instead of a private regex with no https/allowlist
check - that value is injected into every tool call. Scope list falls back to the
requested scopes when Zoho omits `scope`, which would otherwise flag every
credential as needing reconnect. The Self Client mint no longer sends
`aaaserver.profile.READ`, a scope that grant never uses.
Trigger: `includePrevState` now set for every *_Update event, not just tickets -
it defaults to false, so prevState was permanently null for contact/agent/task/
article updates while the trigger advertised it. `departmentIds` is only sent for
events Zoho documents as accepting it, and the field is conditioned accordingly.
Empty filters serialize as `null`, matching Zoho's examples, rather than `{}`.
JWKS fetch bounded to 1.5s - jose's default is 5000ms, exactly Zoho's whole
delivery deadline, and Zoho publishes no retry. The create-time validation POST
fallback is now matched by the pending-verification probe. Ticket_Delete added.
All 17 webhook event ids, the POST /api/v1/webhooks body contract, and the JWT
claim/JWKS specifics are now confirmed verbatim against Zoho's webhook
documentation - previously 12 of 17 events and the entire subscription contract
were unverified.
Copy file name to clipboardExpand all lines: apps/docs/content/docs/en/integrations/zoho_desk.mdx
+11-5Lines changed: 11 additions & 5 deletions
Display the source diff
Display the rich diff
Original file line number
Diff line number
Diff line change
@@ -70,7 +70,7 @@ List tickets from a Zoho Desk organization with optional filters. Returns a list
70
70
| ↳ `ticketNumber`| string | Human-readable ticket number |
71
71
| ↳ `subject`| string | Ticket subject |
72
72
| ↳ `description`| string | Ticket description \(raw; may be HTML\)|
73
-
| ↳ `descriptionText`| string | Plain-text rendering of the description with HTML stripped \(Zoho sends ticket descriptions as HTML\)|
73
+
| ↳ `descriptionText`| string | Plain-text rendering of the description: HTML stripped when the body contains markup, otherwise the description verbatim|
74
74
| ↳ `status`| string | Ticket status |
75
75
| ↳ `statusType`| string | Status category \(Open/Closed/On Hold\)|
76
76
| ↳ `priority`| string | Ticket priority |
@@ -121,7 +121,7 @@ Retrieve a single Zoho Desk ticket by ID.
121
121
| ↳ `ticketNumber`| string | Human-readable ticket number |
122
122
| ↳ `subject`| string | Ticket subject |
123
123
| ↳ `description`| string | Ticket description \(raw; may be HTML\)|
124
-
| ↳ `descriptionText`| string | Plain-text rendering of the description with HTML stripped \(Zoho sends ticket descriptions as HTML\)|
124
+
| ↳ `descriptionText`| string | Plain-text rendering of the description: HTML stripped when the body contains markup, otherwise the description verbatim|
125
125
| ↳ `status`| string | Ticket status |
126
126
| ↳ `statusType`| string | Status category \(Open/Closed/On Hold\)|
127
127
| ↳ `priority`| string | Ticket priority |
@@ -182,7 +182,7 @@ Update fields on an existing Zoho Desk ticket.
182
182
| ↳ `ticketNumber`| string | Human-readable ticket number |
183
183
| ↳ `subject`| string | Ticket subject |
184
184
| ↳ `description`| string | Ticket description \(raw; may be HTML\)|
185
-
| ↳ `descriptionText`| string | Plain-text rendering of the description with HTML stripped \(Zoho sends ticket descriptions as HTML\)|
185
+
| ↳ `descriptionText`| string | Plain-text rendering of the description: HTML stripped when the body contains markup, otherwise the description verbatim|
186
186
| ↳ `status`| string | Ticket status |
187
187
| ↳ `statusType`| string | Status category \(Open/Closed/On Hold\)|
188
188
| ↳ `priority`| string | Ticket priority |
@@ -296,7 +296,7 @@ Add a comment to a Zoho Desk ticket.
296
296
297
297
### `zoho_desk_list_threads`
298
298
299
-
List conversation threads on a Zoho Desk ticket, newest first (Zoho sorts by sendDateTime descending by default).
299
+
List conversation threads on a Zoho Desk ticket, newest first (Zoho sorts by sendDateTime descending by default). Returns a list projection: message bodies (content, summary, to/cc/bcc) come back only from Get Thread.
300
300
301
301
#### Input
302
302
@@ -330,6 +330,9 @@ List conversation threads on a Zoho Desk ticket, newest first (Zoho sorts by sen
330
330
| ↳ `bcc`| string | BCC email address |
331
331
| ↳ `replyTo`| string | Reply-to email address |
332
332
| ↳ `isForward`| boolean | Whether the thread is a forward |
333
+
| ↳ `isContentTruncated`| boolean | Whether Zoho truncated the thread content; fetch fullContentURL for the rest |
@@ -504,6 +510,6 @@ Trigger a workflow when a Zoho Desk event occurs (ticket, comment, thread, conta
504
510
|`eventType`| string | The Zoho Desk event type \(e.g. Ticket_Add\)|
505
511
|`eventTime`| string | Event time in milliseconds since epoch |
506
512
|`orgId`| string | Zoho Desk organization ID |
507
-
|`payload`| json | The full resource that changed \(ticket, comment, thread, etc.\). For comment/thread events a derived plain-text `contentText`is added alongside the raw `content` + `contentType`. |
513
+
|`payload`| json | The full resource that changed \(ticket, comment, thread, etc.\). Comment and thread events gain a derived plain-text `contentText` alongside the raw `content` + `contentType`; ticket events gain `descriptionText` alongside `description`. |
508
514
|`prevState`| json | Previous state of the resource \(update events only\)|
Copy file name to clipboardExpand all lines: apps/sim/lib/integrations/integrations.json
+1-1Lines changed: 1 addition & 1 deletion
Original file line number
Diff line number
Diff line change
@@ -21844,7 +21844,7 @@
21844
21844
},
21845
21845
{
21846
21846
"name": "List Threads",
21847
-
"description": "List conversation threads on a Zoho Desk ticket, newest first (Zoho sorts by sendDateTime descending by default)."
21847
+
"description": "List conversation threads on a Zoho Desk ticket, newest first (Zoho sorts by sendDateTime descending by default). Returns a list projection: message bodies (content, summary, to/cc/bcc) come back only from Get Thread."
0 commit comments