zendesk_read_ticket, the native Zendesk ticket-read tool exposed through the Agents Platform.
Authentication & enablement
Zendesk tools use a per-workspace Zendesk connection created in Settings → Integrations → Zendesk. Pick one of two auth methods when connecting:- API token — enter your Zendesk URL (e.g.
https://acme.zendesk.com), the agent email, and an API token (Admin Center → Apps and integrations → APIs → Zendesk API → add token). Calls authenticate with HTTP Basic{email}/token:{api_token}. - OAuth — create an OAuth client in your own Zendesk (Admin Center → Apps and integrations → APIs → OAuth clients; client kind Confidential, redirect URL = the platform’s OAuth callback), then when connecting enter your Zendesk URL plus that client’s client ID and client secret and click through Zendesk’s authorization page (use this if your account has API tokens disabled). Calls authenticate with
Bearer <access_token>, refreshed automatically. The OAuth app is per-workspace — there is no shared server-side Zendesk app — so it works for any Zendesk subdomain without a Zendesk “global” client.
zendesk_read_ticket
Reads a Zendesk ticket by its numeric id. It does not modify the ticket, but it is not free of side effects: it copies the ticket’s intake attachments into platform file storage (see Output) so they can be previewed and processed downstream.
Inputs
Required:ticket_id: the numeric Zendesk ticket id (e.g."12345").
url, email, and api_token are injected from the connected integration — the agent does not supply them.
Output
descriptionis the ticket’s first-comment body.attachmentsare the first comment’s attachments (the ticket’s intake files); empty if none — fall back todescription. The rest of the conversation’s attachments are out of scope here — a futurezendesk_list_commentstool would cover those.- Each attachment (≤ 50 MB, and at most the first 20 per read) is copied into platform file storage at read time. Two references are returned:
file_id(so the UI can preview it in the app — our own storage is same-origin/CORS-open, unlike the rawcontent_url) andfile_url(a value the agent can pass straight tostructured_data_extractionor other file tools to read the contents — a${VAR_N}ref that resolves to the stored file’s S3 URL, or the raw S3 URL for CodeAct tasks). Best-effort: if the copy fails — or the attachment is over 50 MB or beyond the 20-per-read cap — both refs are omitted and onlycontent_urlis returned. Storing is skipped entirely when file storage isn’t wired (e.g. schema-only mode). custom_fieldsmaps field id (as a string) → value.is_assignedis a convenience for deciding whether to write back.ticket_urlis the ticket’s Zendesk web URL (omitted if the connection URL can’t be normalized).
Limits & errors
- Fetches the ticket plus its first comment (for attachments); the comment fetch is best-effort, so a failure there still returns the ticket (without attachments).
HTTP 404→ check theticket_id.HTTP 401/403→ the workspace’s Zendesk credentials are invalid; reconnect the integration.- “Zendesk is not connected…” → no active Zendesk integration exists for the workspace.
Agent Instruction Guidance
Call this beforezendesk_write_ticket whenever you need the ticket’s current state — for example to implement a “skip if already assigned” rule: read the ticket, check is_assigned, and only write when it is false. The write tool intentionally does not enforce that guard, so the decision lives here in the agent.