← TATER Help · Integrations

Zoho / ManageEngine Endpoint Central Cloud connector

A native Zoho OAuth 2.0 connector that pulls patch posture from ManageEngine Endpoint Central Cloud into TATER's Application Monitoring surface as source=zoho-ec findings. Designed to be extensible to any Zoho-platform service (other ManageEngine modules, Zoho Desk, etc.) without writing a new connector each time.

Tracked in ADO #596 (build) and #598 (verified spec / gotchas).

What it does

One-time setup

  1. In your Zoho region's developer console (api-console.zoho.<region>, e.g. .com, .eu, .in), create a Self Client application. Note the Client ID + Client Secret.
  2. From the same Self Client, generate a grant token (authorization_code, 3-minute expiry) with scope DesktopCentralCloud.PatchMgmt.READ. Trade the grant code for a refresh token at https://accounts.zoho.<region>/oauth/v2/token. Refresh tokens are long-lived; store the refresh token only.
  3. Confirm your EC Cloud instance host. This is the host that serves /dcapi/* routes — typically https://endpointcentral.manageengine.com. The TATER connector requires this explicitly. Do NOT use the token response's api_domain — it points at www.zohoapis.com which returns HTTP 400 "Invalid URL" for EC routes. This was the #1 gotcha while verifying the spec for #598.
  4. In TATER, open Manage → Integrations → Zoho (or POST to /api/settings with integrations.zoho = {…}). Provide: region, clientId, clientSecret, refreshToken, apiInstanceHost, optional scope. Set enabled: true.
  5. Test the connection: POST /api/zoho/test. A successful response shows the total reachable EC patch records. Stamp will appear on the config as lastTestedAt/lastTestResult.

Secret handling

clientSecret and refreshToken are encrypted at rest using TATER's AES-256-GCM ENCRYPTION_KEY. The settings GET endpoint never returns either decrypted — they always show as [REDACTED]. Submitting the literal string [REDACTED] on save preserves the stored value, so admins can update the region or instance host without re-entering the secret.

This mirrors the existing ADO PAT pattern in Settings.integrations.adoTasks.pat — no need to involve a separate Key Vault. If you want strict KV-backed secrets for compliance, front the settings endpoint with a Key Vault reference resolver and store the KV secret name in the config instead of the value.

Syncing patch posture

Three ways to trigger:

What lands in Application Monitoring

Each finding carries:

Findings inherit the standard MonitoringFindings lifecycle (open / acknowledged / suppressed / remediated / superseded). Acknowledge or promote to a TaskerTask as usual.

Important gotcha (per #598)

The Zoho token response includes api_domain (typically https://www.zohoapis.com). This is NOT the EC API host. Calling /dcapi/threats/patches against www.zohoapis.com returns HTTP 400 with a generic Zoho "Invalid URL" page. The real API host is your EC Cloud instance host (e.g. https://endpointcentral.manageengine.com). The TATER connector ignores api_domain and uses cfg.apiInstanceHost exclusively. Set it correctly during setup or every sync will 400.

Extensibility to other Zoho services

The zohoAuth.ts token cache is keyed on (tenantId, orgId, service) so a single org can hold one shared refresh token covering multiple Zoho scopes (e.g. DesktopCentralCloud.PatchMgmt.READ + ZohoDesk.tickets.READ) without colliding. New connectors should:

Data-model note for downloads

The /dcapi/threats/patches route does not expose a download-source URL per endpoint. Each patch carries:

EC handles patch binary download server-side, not per endpoint. If you need to scope GSA / firewall bypass rules based on the downloads EC will attempt, treat the bulletin/KB id as the join key against your firewall vendor's URL category data, not individual binary URLs.

API reference

MethodPathRoleNotes
GET/api/zoho/configAuditor+Returns config with secrets redacted.
POST/api/zoho/testAdminForces fresh token + 1-record probe of EC. Stamps lastTested fields.
POST/api/zoho/ec/patches/syncAdminBody: {failedOnly?,maxPages?,pageLimit?}.
GET/api/zoho/ec/patchesAuditor+Query: ?state=&limit=.

MCP tools