Beam Help
Get help now

How-to · Zoho DESK

How to remove tags from tickets in Zoho Desk

Delete specific tags from a ticket.

Removing a tag from a Zoho Desk ticket via the API is a straightforward DELETE operation that requires both the ticket's ID and the specific tag's ID. This article walks through the exact endpoint, required parameters, and OAuth scopes needed to do it cleanly.


Why this matters


Tags in Zoho Desk help teams categorise and filter tickets, but stale or incorrect tags can skew reporting and routing logic. If you're building an automation, a migration script, or a cleanup workflow, you'll need a reliable way to detach individual tags from tickets programmatically. This is also useful when syncing ticket metadata between Zoho Desk and an external system. Note that Beam Help is independent expert support — we are not official Zoho support.


Step-by-step


Step 1. Confirm your OAuth scopes are in place.


Before making any API call, ensure your connected application has the correct Zoho Desk OAuth scopes authorised. At minimum you need Desk.tickets.ALL or the combination of Desk.tickets.READ and Desk.tickets.DELETE in your scope configuration. [2]


Step 2. Gather the required identifiers.


You need two pieces of information before calling the endpoint:


  • ticketId — the unique identifier of the ticket from which you want the tag removed.
  • tagId — the unique identifier of the specific tag you want to detach.

Both values are strings. You can retrieve the ticketId from any ticket list or detail call, and the tagId from the tag metadata associated with that ticket. [1]


Step 3. Call the remove-tag endpoint.


Send a DELETE request to the following path, substituting your real values:


DELETE /api/v1/tickets/{ticketId}/tags/{tagId}

An optional p parameter (a dictionary) can be passed for any additional query parameters your integration requires. [1]


Step 4. Implement the call in Python.


If you're using a Python-based Zoho Desk client, the method signature looks like this:


def remove_tags_from_ticket(self, ticketId: str, tagId: str, p: dict = None):
    return self.c.request("DELETE", f"/api/v1/tickets/{ticketId}/tags/{tagId}", p, None)

Pass the ticketId and tagId as positional string arguments. The request body is None for a DELETE operation — only the URL path carries the identifying information. [1]


Step 5. Verify the response.


A successful deletion will return an HTTP 200 or 204 status. If you receive a 404, double-check that both the ticketId and tagId are correct and that the tag is actually associated with that ticket. If you receive a 401 or 403, revisit your OAuth scope configuration from Step 1. [2]


Step 6. (Optional) Confirm by adding tags when needed.


If your workflow also needs to add tags back to a ticket, the complementary operation is a POST to the same base path without the tagId segment:


POST /api/v1/tickets/{ticketId}/tags

This endpoint accepts a data dictionary in the request body containing the tag details. [6]


Common pitfalls


  • Wrong scope level. Using only Desk.tickets.READ will block DELETE operations. Make sure Desk.tickets.DELETE or Desk.tickets.ALL is included in your OAuth scope string. [2]
  • Confusing tag removal with template or attachment deletion. The Zoho Desk API has separate DELETE endpoints for ticket templates (/api/v1/ticketTemplates/{templateId}) and ticket attachments (/api/v1/tickets/{ticketId}/attachments/{attachmentId}). These are entirely different resources — do not mix up the endpoint paths. [4][5]
  • Missing tagId in the path. The tag identifier must appear in the URL path itself, not in the request body or as a query parameter. Sending a DELETE to /api/v1/tickets/{ticketId}/tags without the tagId segment will not target a specific tag. [1]

What to check


  • Confirm that the Desk.tickets.DELETE or Desk.tickets.ALL scope is present and authorised in your OAuth configuration before running the request. [2]
  • Verify that the tagId you are passing genuinely belongs to the target ticket — attempting to remove a tag that isn't attached to that ticket will return an error. [1]
  • After the DELETE call returns a success status, optionally re-fetch the ticket's tag list to confirm the tag no longer appears, ensuring your downstream logic reflects the updated state. [6]

Sources cited

  1. [1] DELETE /api/v1/tickets/{ticketId}/tags/{tagId}
  2. [2] config.py
  3. [3] server.py: build_zoho_links
  4. [4] DELETE /api/v1/ticketTemplates/{templateId}
  5. [5] DELETE /api/v1/tickets/{ticketId}/attachments/{attachmentId}
  6. [6] POST /api/v1/tickets/{ticketId}/tags
  7. [7] DELETE /api/v1/tickets/{ticket_id}/threads/{thread_id}/attachments/{attachment_id}
  8. [8] DELETE /api/v1/tickets/{ticket_id}/attachments/{attachment_id}
Remove Tags from Tickets | Beam Help