Skip to main content
Conversations capture every back-and-forth your agents have with people — chat sessions on your site, phone calls, SMS threads, inbound emails, and form submissions. Each conversation belongs to an agent (bot_id) and may be linked to a Contact and/or an anonymous Visitor. You can read transcripts, update inbox state (assignment, archive, takeover, internal notes), and soft-delete conversations from the API. Creating conversations is not supported — they originate from real channel events (the chat widget, voice/SMS webhooks, inbound email, form submissions) so that routing, billing, and analytics stay accurate.
Looking for the full transcript of a single conversation? Fetch the conversation, then call List messages with order=asc.

The Conversation object

string
Unique conversation identifier.
string
The agent this conversation belongs to.
string | null
The CRM contact linked to this conversation, if one has been resolved.
integer
Channel the conversation happened on. See Conversation types below.
string | null
Best-known email for the participant (may be null for anonymous chats).
string | null
E.164 phone number for the participant on voice / text conversations.
string | null
Display name of the human, when known.
boolean
true when a human teammate has taken over the conversation from the agent.
string | null
User ID of the teammate the conversation is assigned to.
string | null
ISO 8601 timestamp of the most recent assignment.
boolean
true while the conversation is in progress; flips to false after a period of inactivity.
boolean | null
string | null
boolean | null
Soft-delete flag. Deleted conversations are excluded from list responses unless you pass include_deleted=true.
string | null
boolean
true for conversations between teammates (e.g. asking your internal agent), false for customer-facing conversations.
string | null
Free-text notes added by your team. Never shared with the participant.
string | null
Snippet of the most recent message — useful for inbox-style list views.
string | null
ISO 8601 timestamp of the most recent message.
string | null
ISO 8601 timestamp of the participant’s most recent activity (typing, page change, etc.).
boolean | null
true if Clarky’s sentiment analysis judged the conversation as net-positive, false if negative, null if not yet analyzed.
number | null
Sentiment score in the range [-1, 1].
string | null
One-sentence summary of the participant’s mood and intent.
string | null
Storage path for the call recording on voice conversations. Use the dashboard or a workspace-authenticated session to download.
number | null
Duration of voice / phone calls, in minutes.
string | null
Linked anonymous Visitor, when the conversation came from an unauthenticated chat.
string
ISO 8601 timestamp.

Conversation types

The type field is a numeric ID. The list endpoint also accepts the names below as a convenience.

The Message object

string
string
string
Who sent the message. Common roles: user (participant), assistant (the agent), system, tool, human (a human teammate during takeover).
string
The text payload of the message. May be empty for tool-only messages.
string | null
MIME hint for the content (e.g. text/plain, text/markdown).
string | null
Delivery status, when available — e.g. sent, delivered, failed.
string | null
Name of the tool the assistant called, when this message represents a tool invocation.
object | null
JSON arguments passed to the tool.
string
ISO 8601 timestamp.

List conversations

GET
GET /api/v1/conversations
Returns a paginated list of conversations across all agents in your workspace. Sorted by created_at descending by default.

Query parameters

Example


Get a conversation

GET
GET /api/v1/conversations/{id}
Fetches a single conversation by ID. Returns 404 not_found if the conversation does not exist or belongs to another workspace.

Example


Update a conversation

PATCH
PATCH /api/v1/conversations/{id}
Requires a key with the write scope. Updates the listed fields and leaves everything else untouched. Use this to manage inbox state — assigning conversations to teammates, archiving, taking over from the agent, or adding private notes.

Body fields

Setting assigned_to automatically updates assigned_at. Setting archived automatically updates archived_at. You don’t need to send those fields yourself.

Example: assign a conversation

Example: archive

Example: take over from the agent

Updating human_takeover only flips the flag — sending the actual reply still happens through the agent’s channel (chat widget, SMS, etc.). Use takeover to silence the agent while a human responds in the dashboard.

Delete a conversation

DELETE
DELETE /api/v1/conversations/{id}
Requires a key with the write scope. Returns 204 No Content with an empty body on success. This is a soft delete — the conversation is hidden from list responses (and from the dashboard inbox) but transcripts, recordings, and analytics are preserved. Pass include_deleted=true on List conversations to surface deleted records, and PATCH with deleted: false is not supported via the API; restoration is dashboard-only.

Example

Deleting a conversation removes it from your inbox and all dashboard views. The underlying transcript is retained for compliance and analytics, but cannot be re-surfaced through the public API.

List messages in a conversation

GET
GET /api/v1/conversations/{id}/messages
Returns the messages in a single conversation, paginated. Defaults to chronological order (order=asc) — the natural read order for a transcript.

Query parameters

Example

For long transcripts, page through with page_size=100 (the maximum) to minimize round-trips. The total message count is in pagination.total.

List a contact’s conversations

GET
GET /api/v1/contacts/{contact_id}/conversations
Convenience endpoint that returns every conversation linked to a single contact, across all agents and channels.

Query parameters

Example


Common patterns

Sync new conversations to a data warehouse

Poll for conversations that have started since your last sync.

Pull a full transcript

Find every chat a customer has had with you

Auto-assign new conversations from your CRM

Combine List conversations with Update a conversation to route inbound chats to the right rep. Filter for unassigned, in-progress conversations and PATCH each one with the right assigned_to.