Skip to main content
A conversation tag is a named label scoped to your organization. Tags live in a shared palette under /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.
Because assignment is a replace-set, you don’t need to diff against the current tags. Compute the full desired set in one place (a classifier, a rules engine) and PUT it. Idempotent by construction.

Listing tags on a conversation

Returns the full assigned set with the same shape as /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.
Deleting a tag is irreversible and fans out to all conversations that referenced it. Rename via the dashboard if you just want a different label.

Tag the entire backlog by topic

A common workflow: route on message.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).