Listing all threads in a Zoho Desk ticket is straightforward once you know the correct API endpoint and required parameters. This article walks you through the call, the OAuth scopes you need, and what to verify afterwards.
Why this matters
Support tickets in Zoho Desk accumulate multiple threads — customer replies, agent responses, and internal notes — over their lifetime. When you need to audit a conversation, build an integration, or surface thread history in a custom app, you must be able to retrieve every thread programmatically rather than scrolling through the UI manually.
Step-by-step
Step 1. Confirm your OAuth token includes the correct Zoho Desk scopes before making any call. At minimum you need Desk.tickets.READ in your authorised scope list; broader integrations typically also include Desk.tickets.ALL to cover write operations in the same session. [2]
Step 2. Identify the ticket_id for the ticket whose threads you want to retrieve. This is the numeric identifier Zoho Desk assigns to each ticket record — you can find it in the ticket URL inside the agent portal, which follows the pattern https://desk.zoho.com/agent/{portal}/tickets/details/{TicketId}. [4]
Step 3. Send a GET request to the threads endpoint, substituting your ticket's identifier into the path:
GET /api/v1/tickets/{ticket_id}/threads
Include your Bearer token in the Authorization header. The endpoint also accepts an optional p parameter (a dictionary of additional query options such as pagination controls) if you need to page through a large thread list. [3]
Step 4. Parse the response. Each item in the returned collection represents one thread on the ticket — a reply, a forward, or a note — with its own metadata such as sender, timestamp, and content body. Display or store the fields that matter to your use case. [3]
Step 5. If you only need the single most recent exchange rather than the full history, use the dedicated latest-thread endpoint instead:
GET /api/v1/tickets/{ticket_id}/threads/latest
This returns just the newest thread object and is more efficient when you only need a quick status check. [7]
Common pitfalls
- Missing or under-scoped token. If your OAuth client was granted only
Desk.tickets.WRITEorDesk.tickets.CREATEbut notDesk.tickets.READ, the API will reject the request. Double-check thatDesk.tickets.READ(orDesk.tickets.ALL) appears in the active scope string. [2]
- Wrong ticket ID format. Passing a subject string or a CRM record ID instead of the Desk numeric ticket ID will result in a 404 or empty response. Always source the ID directly from Zoho Desk ticket records. [4]
- Forgetting pagination. Tickets with long histories may return results across multiple pages. Use the
pparameter to iterate through pages rather than assuming the first response contains every thread. [3]
- Data-centre mismatch. Zoho hosts data in multiple regions (
.com,.eu,.in, etc.). Make sure the base URL you call matches the data centre where your Desk organisation is provisioned — for examplehttps://desk.zoho.eufor EU-hosted accounts. [4]
What to check
- Verify that the
ticket_idin your request path matches a real ticket in your Zoho Desk organisation and that the agent token has at leastDesk.tickets.READscope. [^2, ^3] - Confirm the response contains the expected number of thread objects; if the count seems low, check whether pagination is truncating results and iterate using the
pparameter. [3] - If you only needed the most recent message, cross-reference the result from
/threads/latestagainst the last item returned by/threadsto ensure they match. [7]
---
*Beam Help is an independent expert support resource for Zoho products and is not official Zoho support. Always refer to the Zoho Desk API documentation for the latest endpoint specifications.*