Beam Help
Get help now

How-to · Zoho DESK

How to list all threads in Zoho Desk tickets

Retrieve conversation threads associated with a support ticket.

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.WRITE or Desk.tickets.CREATE but not Desk.tickets.READ, the API will reject the request. Double-check that Desk.tickets.READ (or Desk.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 p parameter 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 example https://desk.zoho.eu for EU-hosted accounts. [4]

What to check


  • Verify that the ticket_id in your request path matches a real ticket in your Zoho Desk organisation and that the agent token has at least Desk.tickets.READ scope. [^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 p parameter. [3]
  • If you only needed the most recent message, cross-reference the result from /threads/latest against the last item returned by /threads to 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.*

Sources cited

  1. [1] server.py: build_zoho_links
  2. [2] config.py
  3. [3] GET /api/v1/tickets/{ticket_id}/threads
  4. [4] server.py: chat_stream
  5. [5] server.py: chat_plan
  6. [6] GET /api/v1/tickets/{ticket_id}/threads/latest
  7. [7] planner.py
List All Threads in Tickets | Beam Help — Beam Help