Get a conversation's labels
Returns the label record of one conversation under the published labeling configuration: its `labelStatus`, the `taxonomyVersion` of the read, and `labels`, the current run. `labels` is `null` unless `labelStatus` is `labeled`, and a status never carries a reason. When present, `answers` holds the judge's answer for each label with the ids of the messages that justify it, and `tokens` lists the conversation's label tokens. Only the current run is returned. A conversation of another site, another organization's conversation and an unknown id all answer the same `404`.
Authorization
ApiKeyAuth A WorkOS org-scoped API key, created from the dashboard's organization settings page. Identifies the tenant every read and write is scoped to. Missing, malformed, unknown, revoked, expired, or non-organization-owned keys all return 401 (no distinction, so the response can't be used to probe which keys or org ids exist).
In: header
Path Parameters
The site id (prefixed site_). A site id that isn't yours is a 404, same as any other cross-tenant id.
The conversation id (prefixed conv_).
Response Body
application/json
application/problem+json
application/problem+json
application/problem+json
application/problem+json
curl -X GET "https://example.com/api/v1/sites/string/conversations/string/labels"{ "data": { "conversationId": "conv_01kvnwmagvf27rc9cze5rm9e1r", "labelStatus": "labeled", "taxonomyVersion": "v1.1", "labels": { "labeledAt": "2026-09-28T15:02:11.000Z", "resolution": "resolved", "reviewReason": null, "reviewPriority": null, "scores": { "quality": 0.92, "service": 1, "trust": 1 }, "answers": { "resolution": { "value": "resolved", "source": "judge", "evidence": [ "msg_01kvnwmagwf27rc9d7zef4qksf" ] }, "product_question": { "value": true, "source": "judge", "evidence": [ "msg_01kvnwmagvf27rc9cze5rm9e1r" ] }, "purchase_intent": { "value": true, "source": "judge", "evidence": [ "msg_01kvnwmagvf27rc9cze5rm9e1r" ] }, "grounded": { "value": "pass", "source": "judge", "evidence": [ "msg_01kvnwmagwf27rc9d7zef4qksf" ] }, "answered_every_question": { "value": "pass", "source": "judge", "evidence": [ "msg_01kvnwmagvf27rc9cze5rm9e1r", "msg_01kvnwmagwf27rc9d7zef4qksf" ] }, "no_loop": { "value": "not_applicable", "source": "judge", "evidence": [] }, "objection_price": { "value": false, "source": "judge", "evidence": [] } }, "tokens": [ "answered:true", "answered_every_question:pass", "grounded:pass", "product_question:true", "purchase_intent:true", "resolution:resolved", "sales_phase:pre_sales" ] } }}Get a conversation with messages
Returns a single conversation: every field of the collection item, plus the playground `metadata` and the full ordered `messages` array. Read-only and tenant-scoped; messages have no API of their own. A conversation whose agent belongs to a different site than the one in the path, another organization's conversation and an unknown id all answer the same `404`.
Get the label vocabulary
Returns the published label taxonomy: every label with its key, kind, block and allowed values, an English display name for each label, block and value, and the derived tokens. A token is `<key>:<value>`. The vocabulary is exactly the set of tokens the `labels.all`, `labels.any` and `labels.none` filters of the conversation collection accept, so build a filter from what you read here. The display names are English text for explaining a label to a person: match on `key` and on the tokens, never on a `displayName`. It needs a valid API key like every route and returns no tenant data: it is the same for every organization.