Conversation operators
A conversation operator is a named classifier the inbox runs against every text thread. You define it once — a name, an instruction, and the type of value it returns — and the inbox classifier extracts that signal from each conversation on the channels you scope it to. Signals land on the conversation as typed metadata, so you can filter threads in the dashboard, read per-thread results, and roll them up into reports. Open Settings → Conversations → Conversation Intelligence in the dashboard to manage operators. This page covers the operator model, where signals land, and the API surface that backs the console. Base path:/api/v1/inbox
The operator model
An operator has four parts:- Name — how the signal reads in the dashboard and reports (
"Billing intent"). - Instruction — the natural-language rule the classifier applies to the thread (
"Set to true when the customer asks about an invoice, a refund, or a payment method"). - Output type — the shape of the signal:
text,boolean,number,enum, orlist. Anenumoperator also declares the allowedchoicesit picks from. - Channels — which text channels the operator runs on (SMS, WhatsApp, email, RCS, Viber, Instagram, Messenger, LINE, Telegram, Apple Messages, web chat). Voice conversations are classified by the voice speech-category pipeline instead, so the same taxonomy never applies two classifiers to one thread.
Where signals land
Every operator result is stored on the conversation itself:- Thread metadata — the conversation carries a result per operator: the value, confidence, rationale, which operator version produced it, and when it was classified.
- Per-thread timeline — the conversation detail view and the
GET /conversations/:id/intelligence/operatorsendpoint return the result set tagged on that thread. - Reports — because results are typed (
boolean/number/enumrather than free text), they aggregate cleanly: share of threads flagged for escalation risk, average sentiment score by channel, billing-intent volume week over week.
The operator catalog
The catalog under Settings → Conversations → Conversation Intelligence is tenant-owned. Operators are your tenant’s private taxonomy — nothing you define is shared across workspaces, and operators are scoped to your organization only.- Create — name the signal, write the instruction, pick the output type, and scope the channels. Owners and admins can create; the console is role-gated the same way the API is.
- Edit — send the full definition. Changing the instruction, output type, or enum choices bumps the operator’s version; changing only the channel scope does not.
- Deactivate — a soft delete. The operator stops running against new messages and frees a slot against the 25-operator cap, but its definition and previously computed results stay readable.
- System operators vs custom operators — the built-in fixed-function analytics (dispositions, QM scoring) are separate surfaces. Everything on this catalog is a custom operator your team defined; create, edit, and deactivate are all available to owners and admins.
Example operators
The console and API support any signal you can phrase as an instruction. Three that work well as starting points: Detect billing intentReporting
Operators roll up into the intelligence surface three ways:- Thread-level filtering — results live on thread metadata, so conversation lists and the per-thread intelligence read can filter on operator outcomes (for example, every thread where
Escalation risk = high). - Aggregate views — boolean, number, and enum outcomes aggregate across a window: escalation-risk distribution by channel, billing-intent share of inbound volume, sentiment trends.
- Cross-channel taxonomy — the operator model mirrors the voice speech-category taxonomy, so a reporting layer can treat voice categories and text operators as one taxonomy across channels.
API parity
Everything the console does goes through the inbox API, so the catalog is fully scriptable.List operators
{ items: [...] } with each operator’s id, name, version, instruction, outputType, choices, channels, isActive, and timestamps. Active operators only by default; pass includeInactive=true to include deactivated ones.
Create an operator
enum operator must declare a non-empty choices array — the request 422s otherwise. A tenant at the 25-active-operator cap gets 409 LIMIT_EXCEEDED.
Update an operator
version; a channels-only edit does not. Unknown operator ids return 404 OPERATOR_NOT_FOUND.
Deactivate an operator
{ id, deactivated: true }.
Read per-thread results
operatorId, operatorVersion, name, outputType, value, confidence, rationale, channel, and classifiedAt. Any authenticated teammate can read it; a conversation with no results returns an empty list with a 200.
Rules of scope
- Operators run on message text only — voice and video conversations are classified by the voice speech-category surface instead.
- All controls on this page are tenant-owned: you define the catalog, you scope its channels, you retire operators. Nothing in the pipeline messages your customers — it is reporting plumbing only.
- PII redaction runs before any thread content reaches the classifier, so operator definitions never send raw message bodies out of your tenant.