/conversation-tags and attach to conversations many-to-many under /conversations/{id}/tags.
Anatomy
Always
"conversation_tag".UUID. Reference this when assigning to a conversation.
Display label, max 100 characters. Unique per org, case-insensitively —
billing and Billing collide and cannot both exist. Creating a tag whose name matches an existing one (ignoring case) returns a conflict.Hex color in
#RRGGBB form (e.g. #FFB020) used in the dashboard. Send null (or omit it) to fall back to the default palette color. Any other string is rejected with 400 invalid_payload.ISO 8601 timestamp.
Create a tag
Assigning tags to a conversation
PUT /conversations/{id}/tags uses replace-set semantics — the array you send becomes the conversation’s full tag set. There’s no separate add/remove endpoint; send [] to clear all tags.
Listing tags on a conversation
/conversation-tags list items.
Deleting a tag
DELETE /conversation-tags/{id} removes the tag from the org-level palette and unassigns it from every conversation it was attached to. There’s no soft-delete — gone is gone.
Tag the entire backlog by topic
A common workflow: route onmessage.created, run your own classifier, then snap the predicted tag set onto the conversation.

