Listing all approvals attached to a Zoho Desk ticket is a single API call that returns every approval record associated with a given ticket ID — here's exactly how to do it.
Why this matters
Ticket approvals in Zoho Desk represent formal sign-off steps that may be required before a ticket can progress or be resolved. If you are building an integration, automating a workflow, or auditing approval status across tickets, you need a reliable way to retrieve the full list of approvals for any given ticket. Understanding the correct endpoint and required OAuth scopes ensures your requests succeed without permission errors.
> Beam Help is an independent expert support resource for Zoho — not official Zoho support.
---
Step-by-step
Step 1. Confirm your OAuth token includes the correct Zoho Desk scopes before making any request. At minimum you will need Desk.tickets.READ in your authorised scope set, which covers read access to ticket-related resources including approvals. [2]
Step 2. Identify the ticketId for the ticket whose approvals you want to retrieve. This is the unique numeric identifier Zoho Desk assigns to each ticket — you can find it in the ticket's URL inside the Desk agent portal, which follows the pattern https://desk.zoho.com/agent/{portal}/tickets/details/{ticketId}. [7]
Step 3. Send a GET request to the approvals endpoint, substituting your actual ticket ID into the path:
GET /api/v1/tickets/{ticketId}/approvals
This operation is identified internally as list_approvals. The endpoint accepts ticketId as a required path parameter and an optional p parameter for any additional query options you wish to pass. [3]
Step 4. In code, the call looks like this (shown in Python for clarity):
def list_approvals(self, ticketId: str, p: dict = None):
return self.c.request("GET", f"/api/v1/tickets/{ticketId}/approvals", p, None)
Pass the ticket's ID as a string, and optionally supply a dictionary of query parameters as p if you need to filter or paginate results. [3]
Step 5. Parse the response. The API will return the collection of approval records linked to that ticket. If you need the full details of a specific approval from the list, take its approvalId and follow up with a separate GET request to:
GET /api/v1/tickets/{ticketId}/approvals/{approvalId}
This is the get_approval operation and accepts both ticketId and approvalId as path parameters. [5]
Step 6. If your workflow requires acting on an approval — for example, programmatically approving a ticket — you can do so via a POST to:
POST /api/v1/tickets/{ticketId}/approvals/{approvalId}/approve
This createapproveticket operation requires both the ticket and approval IDs, plus any relevant data payload. [4]
---
Common pitfalls
- Missing scopes: If your OAuth token was generated without
Desk.tickets.READ(or the broaderDesk.tickets.ALL), the API will return an authorisation error. Always verify your scope list before debugging the request itself. [2] - Wrong ticket ID format: The
ticketIdmust be passed as a string in the path. Passing an integer type directly without converting it may cause request construction errors depending on your HTTP client. [3] - Confusing list vs. detail endpoints: The
listapprovalsendpoint (GET /api/v1/tickets/{ticketId}/approvals) returns a collection, whilegetapproval(GET /api/v1/tickets/{ticketId}/approvals/{approvalId}) returns a single record. Use the list endpoint first to discover availableapprovalIdvalues, then drill into individual records as needed. [3][5] - Creating vs. listing: The
POST /api/v1/tickets/{ticketId}/approvalsendpoint is for *creating* a new approval, not retrieving existing ones. Sending aPOSTwhen you intended aGETwill create an unintended approval record. [6]
---
What to check
- Scope verification: Confirm that
Desk.tickets.READorDesk.tickets.ALLappears in the active OAuth token's scope list before making the call. [2] - Correct ticket ID: Open the ticket in the Zoho Desk agent portal and confirm the ID in the URL matches the
ticketIdyou are passing to the endpoint. [7] - Response structure: Ensure the response body contains an array/list of approval objects; an empty array is valid and simply means no approvals have been created for that ticket yet, while an error object indicates a scope or path issue. [3]