Skip to main content
A conversation is a UUID-keyed record describing one visitor chat session. It’s the parent for messages, notes, and tag assignments.

Identifiers

string
required
Always "conversation".
string
required
UUID. Use this as your foreign key in external systems.
string | null
UUID of the Chatbot the visitor was talking to. null if the conversation predates the Chatbot being deleted or originated outside any chatbot.

Updating a conversation

PATCH /conversations/{id} accepts only the writable fields — status, priority, title, the three contact_* fields, and assigned_to. The endpoint is strict: any unknown or unrecognized field in the body (including read-only fields like summary, sentiment_score, or last_message_at) is rejected with 400. Send only the fields you intend to change.

Status

string
required
One of open, bot_active, agent_requested, resolved, closed, archived. See Lifecycle for the transition rules.You can read bot_active here, but you cannot set it via PATCH — once a human or API caller is driving the conversation, you can’t put the bot back in the loop.
string
required
One of low, medium, high. Defaults to medium on creation; agents bump it via PATCH.
string | null
Human-readable summary line shown in the inbox. The Chatbot generates this automatically once enough context has accumulated; you can overwrite it via PATCH.
string | null
Longer recap of the conversation, generated when the thread is resolved or closed. Set by AI; not editable via API.
integer | null
Integer between 0 and 100. 0 is fully negative, 100 fully positive. null until the model has scored the thread. Set by AI; not editable via API.

Contact

The visitor’s volunteered contact details. All three are nullable and stay null for anonymous threads.
string | null
Best email of record for the visitor. Used to send the away-email follow-up when an agent replies and the visitor isn’t watching the tab.
string | null
Display name. Free-text — don’t assume any particular format.
string | null
Phone number, as the visitor typed it. No normalization.

Assignment

string | null
UUID of the agent who currently owns the conversation. null means unassigned (anyone on the team can pick it up). When an API key posts the first reply, the conversation stays unassigned — there’s no user to claim with.When you set assigned_to via PATCH, the id must belong to an active member of your organization; an unknown user, or a removed/foreign member, is rejected with 422. Pass null to unassign.

Attribution

Set at creation time from the visitor’s entry point. Drives routing rules and analytics.
string | null
QR code the visitor scanned to get here. null for any other entry path.
string | null
Product that drove this session, when the visitor scanned a product code.
string | null
Custom object that drove this session, when the visitor scanned an /o/<slug> URL.
object | null
The QR scan context the chatbot actually used for this conversation: which code was scanned, its group, and the properties the chatbot received. Refreshed on each chatbot turn, so after you change a code’s or group’s properties, the next reply (and this field) picks them up within about a minute. null when the conversation didn’t start from a QR scan.

Activity

string | null
First 200 characters of the most recent message. Use for inbox rows — saves a round trip to /messages.
string | null
ISO 8601. Updated on every message, including system markers.

Timestamps

string | null
ISO 8601. Stamped when status moves to resolved. Cleared on reopen.
string | null
ISO 8601. Stamped when status moves to closed. Cleared on reopen.
string
required
ISO 8601. Set by the chat widget at session start.

Example

Fields you won’t find here. Cost, token usage, the model that handled a turn, billing rates, internal resume tokens, and presence timestamps are all server-only. They never appear in API responses or webhook payloads.