/conversation-tags and attach to conversations many-to-many under /conversations/{id}/tags.
Anatomy
string
required
Always
"conversation_tag".string
required
UUID. Reference this when assigning to a conversation.
string
required
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.string
required
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.
1
Fetch the palette
GET /conversation-tags once, cache by name → id locally.2
On each message.created
Classify the visitor’s turn. Translate predicted labels to IDs from your
cache.
3
PUT the full set
PUT /conversations/{id}/tags with the merged set (existing tags you want
to keep, plus any new ones).
