Zoho Desk
Connect Zoho Desk through OAuth and start Helios workflows from help desk events.
What your agents can do
Agents search the indexed Zoho Desk REST API to find operations, then call them with your connection's credentials. The index covers 905 unique operations from Zoho's public specification, including tickets, threads, contacts, accounts, activities, knowledge articles, automation and settings. Access depends on your OAuth grant, profile permissions and plan. Five operations with broken specification references are listed under Limits.
Authentication
Zoho Desk uses OAuth.
| Method | Required fields |
|---|---|
| Your Zoho OAuth app | Data centre, Organization ID, Client ID, Client secret; optional Admin access |
| Existing OAuth tokens | Data centre, Organization ID, Client ID, Client secret, accessToken, refreshToken |
Data centre values are com (US), eu, in, com.au, jp, ca, sa, com.cn, uk, ae (UAE) and sg (Singapore). Canada uses accounts.zohocloud.ca and desk.zohocloud.ca; the other regions use accounts.zoho.<region> and desk.zoho.<region>.
Connect your app
- Create a Server app in the Zoho API console.
- Register
https://<your-helios-host>/integrations/zoho_desk/oauth_callbackas the redirect URI. - In Helios, select Your Zoho OAuth app, choose the account's data centre, and enter the Organization ID and app credentials for that data centre.
- Leave Admin access off for a Server app. Enable it only with an ORG client and an organization administrator's consent. This uses instance-level OAuth, a separate authorization flow.
- Continue to Zoho and approve offline access. If Zoho redirects from a different data centre, select that data centre in Helios and reconnect.
For Existing OAuth tokens, generate access and refresh tokens with a Self Client or another OAuth app and enter both tokens and that app's credentials. Helios refreshes revoked or expired access tokens when the API requests reauthorization and schedules a weekly refresh while the refresh token remains usable. A revoked refresh token requires reconnection.
Scopes
Normal OAuth requests the following published scope families. Every family below requests each of .ALL, .READ, .CREATE, .UPDATE and .DELETE.
DRE.dreapiDesk.InstantMessagesDesk.accountsDesk.activitiesDesk.activities.callsDesk.activities.eventsDesk.activities.tasksDesk.agentsDesk.articlesDesk.automationsDesk.basicDesk.botchatDesk.buttonsDesk.callsDesk.channels.emailDesk.channels.helpcenterDesk.communityDesk.contactsDesk.contractsDesk.custommoduleDesk.departmentsDesk.eventsDesk.extensionsDesk.extensions.dataDesk.extensions.settingsDesk.feedsDesk.fieldsDesk.forumsDesk.integrationsDesk.layoutsDesk.modulesDesk.phonebridgeDesk.productsDesk.settingsDesk.settings.extensionDesk.tasksDesk.templatesDesk.ticketsDesk.webhooksDesk.ziaprofile.userphoto
Additional exact scopes are Desk.featuresettings.READ, Desk.featuresettings.UPDATE, Desk.search.READ, Desk.deskOembed.READ, Desk.imports, Desk.exports, Desk.organization.READ, Desk.organization.UPDATE, Desk.privacysettings.READ; Desk.permissions and Desk.teams with each of .READ, .CREATE, .UPDATE, .DELETE; Desk.recyclebin.READ, Desk.recyclebin.UPDATE, Desk.recyclebin.DELETE; and Desk.contacts.WRITE, Desk.events.WRITE, Desk.tasks.WRITE, Desk.tickets.WRITE.
Admin access requests Desk.accessAll.ALL through the ORG flow. Ordinary scope grants do not override profile permissions. Helios does not request Desk.imports.CUSTOM, Desk.exports.CUSTOM, Desk.community.GET, Desk.community.PATCH, Desk.qaautomation.CREATE or bare settings.READ. Zoho may reject a broad consent request containing scopes unavailable to your app; reconnect with existing OAuth tokens carrying your approved scopes if needed.
Triggers
On every setup, Helios creates or updates the first webhook at this connection's URL and requests all 56 catalog events without restrictions, including events from automation. It keeps accepted subscriptions if Zoho refuses another event and reports unavailable events with the vendor's reason. The account must have a plan that supports webhooks and the profile's Webhook permission.
All filters are optional glob patterns. ID filters are case-sensitive; text filters ignore case. A selected filter does not match when the delivery omits its field, so deletion events expose only the fields Zoho documents. Translation articleId reads payload.id, and section categoryId reads payload.rootCategoryId.
| Event | Filters |
|---|---|
ticket.created | id, departmentId, status, priority, channel, assigneeId, teamId, contactId, accountId, email, subject |
ticket.updated | id, departmentId, status, priority, channel, assigneeId, teamId, contactId, accountId, email, subject |
ticket.deleted | id |
ticket_approval.created | id, status, approver.id, requester.id |
ticket_approval.updated | id, status, approver.id, requester.id |
ticket_thread.added | id, direction, channel, ticketId, departmentId |
ticket_comment.added | id, isPublic, commenterId, ticketId |
ticket_comment.updated | id, isPublic, commenterId, ticketId |
ticket_attachment.added | id, isPublic, name, ticketId |
ticket_attachment.updated | id, isPublic, name, ticketId |
ticket_attachment.deleted | id, ticketId |
ticket_attachment.trashed | id, isPublic, name, ticketId |
ticket_attachment.restored | id, isPublic, name, ticketId |
ticket_comment_attachment.added | id, name, ticketId |
ticket_comment_attachment.deleted | id, name, ticketId |
contact.created | id, email, ownerId, accountId |
contact.updated | id, email, ownerId, accountId |
contact.deleted | id |
account.created | id, email, ownerId |
account.updated | id, email, ownerId |
account.deleted | id |
department.created | id, name |
department.updated | id, name |
agent.created | id, emailId, status |
agent.updated | id, emailId, status |
agent.deleted | id |
agent_presence.updated | id, emailId, status |
agent_channel_preference.updated | userId, emailId, channelType, status |
task.created | id, status, priority, ownerId, departmentId, ticketId |
task.updated | id, status, priority, ownerId, departmentId, ticketId |
task.deleted | id |
call.created | id, ownerId, departmentId, ticketId |
call.updated | id, ownerId, departmentId, ticketId |
call.deleted | id |
event.created | id, ownerId, departmentId, ticketId |
event.updated | id, ownerId, departmentId, ticketId |
event.deleted | id |
time_entry.created | id, ownerId, departmentId, parent.id, parent.type |
time_entry.updated | id, ownerId, departmentId, parent.id, parent.type |
time_entry.deleted | id |
article.created | id, status, title, categoryId |
article.updated | id, status, title, categoryId |
article.deleted | id |
article_translation.created | articleId, locale |
article_translation.updated | articleId, locale |
article_translation.deleted | articleId, locale |
article_feedback.added | id, article.id, article.locale, contactId |
kb_category.created | id, name |
kb_category.updated | id, name |
kb_category.deleted | id |
kb_section.created | id, name, categoryId |
kb_section.updated | id, name, categoryId |
kb_section.deleted | id |
im_message.added | id, channelId, departmentId, sessionId, messageType, direction, integration, actor.contactId |
im_message.status_changed | messageId, channelId, departmentId, sessionId, messageOldStatus, messageNewStatus.status |
im_session.status_changed | channelId, departmentId, sessionId, sessionOldStatus, sessionStatus, currentAssigneeId, assigneeType |
The vendor catalog documents most payloads. ticket_attachment.trashed, ticket_attachment.restored, ticket_comment_attachment.added and ticket_comment_attachment.deleted appear only in the pinned subscription schema and may be refused by Zoho.
Errors and limits
- Free and Standard plans have no active webhooks. Professional allows five, Enterprise ten and Ultimate twenty; an organization can configure at most twenty. A plan downgrade can disable webhooks. See Zoho's limits and permissions.
OAUTH_ORG_MISMATCHmeans the Organization ID and token belong to different organizations. Reconnect with the matching ID and data centre. A 403 during setup can indicate missing Webhook permission, scopes or plan access. API rate limits and credits vary by plan.- Webhooks use
X-ZDesk-JWTand RS256. Helios verifies each token with the public keys of the connection's data centre, such ashttps://desk.zoho.eu/.well-known/jwks.jsonforeu. Helios checks the organization issuer, stored webhook audience, expiry and a five-minute token age. - Zoho's JWT signs its claims, not the HTTP body.
- Zoho supplies no delivery ID, so Helios may treat identical events in different batches as one. Retry schedules, batch limits and daily delivery limits are not documented.
Limits on indexed operations
The pinned vendor files contain broken references. These five operations are excluded:
| File | Excluded operations | Broken reference |
|---|---|---|
| ArticleVersion.json | GET /api/v1/articles/{id}/translations/{locale}/versions | ArticleTranslation.json#/components/responses/versionListView |
| RuleGroup.json | GET /api/v1/rulegroups, POST /api/v1/rulegroups, POST /api/v1/rulegroups/{id}/updateStatus, PUT /api/v1/rulegroups/{id} | untitled:Untitled-22 |
Last updated on