DialogueRead
A dialogue is a single conversation between an agent and a contact over one messaging channel. Its lifecycle state is the state-tree node it sits on (last_tree_node_id): every agent's tree carries a fixed set of system nodes (initial, attempted, started, the failure and expiry outcomes) next to the nodes the tenant configures, so "where is this dialogue" has one answer. The record also tracks whether the bot is muted, the parking (pending) episode — a wait on top of the node, not a node of its own — and references to the last user/bot messages.
Unique numeric identifier of the record.
ID of the product (workspace) that owns this record. Most endpoints scope access by product.
customer_id object
Canonical company-level customer ID used for shared communication context; null for legacy dialogues that have not been resolved.
- integer
- null
ID of the agent (a configured AI assistant / bot persona) this record belongs to.
ID of the contact this record relates to.
Creation time (UTC, ISO 8601).
ID of the messaging channel this record relates to.
The channel-specific chat identifier this dialogue maps to.
last_user_msg_id objectrequired
- integer
- null
last_user_msg_at objectrequired
- date-time
- null
last_bot_msg_id objectrequired
- integer
- null
Whether this is the active (primary) dialogue for the agent/contact pair; superseded dialogues are set to false.
When true, the bot will not auto-respond in this dialogue (e.g. after a human takeover).
pending_until objectrequired
When a parked dialogue is resumed (UTC). Null unless the dialogue is parked.
- date-time
- null
pending_type object
Why the dialogue is parked (e.g. follow_up, human_clarification, async_tool, custom_follow_up).
- PendingType
- null
Possible values: [follow_up, human_clarification, async_tool, custom_follow_up, future_meeting]
pending_ref object
Opaque reference associated with the parking episode (a clarification id, a tool call id, …).
- string
- null
pending_id object
Identifier of the current parking episode. A deadline refresh keeps it; a new park replaces it, so a scheduler that acts on an episode can tell whether it is still the one it saw.
- uuid
- null
Monotonic counter bumped by every lifecycle write to the dialogue (movements, parks, unparks, resets). Carry it into a decision made outside the write (an operator UI, a queued job) so the platform can reject the decision when the dialogue has moved on in the meantime.
0started_at objectrequired
When the dialogue first left the initial node (UTC).
- date-time
- null
ext_id objectrequired
External identifier of the conversation in the channel/provider, if any.
- string
- null
waba_opener_sent_after_window_num objectrequired
- integer
- null
Whether this outreach was sent into an existing chat with the contact rather than as a cold outreach. Set when an outreach campaign reuses a channel the contact was already messaged on (the agent's persist_channel_in_outreach option): to the contact it is the same conversation, but the platform counts it against a separate "sub-outreach" daily limit, since messaging platforms (WhatsApp, Telegram, …) are less restrictive inside existing dialogues than for cold outreach.
warmup_pair_id objectrequired
For phone-warmup conversations, the warmup pair this dialogue belongs to.
- integer
- null
Whether the dialogue was started by an inbound message from the contact.
Whether the conversation is a group chat.
skip_response_for_user_msg_id objectrequired
- integer
- null
skip_response_until objectrequired
- date-time
- null
ID of the state-tree node the dialogue currently sits on — its lifecycle state. Always set; the node belongs to the dialogue's agent, and GET /tree/ resolves it to a title, system_kind, is_final and group. A parked dialogue (is_pending) keeps its node and resumes there.
subject objectrequired
Email subject line, for email channels.
- string
- null
Prompt-version IDs of the playbooks this dialogue has enabled, in enable order (by the model through its tool, or by the platform from crm_fields_conditions). Append-only: a playbook is never disabled, at most one version per playbook is held, and the dialogue keeps that version even if the playbook is edited later. Match them against enabled_version_id in the agent's playbook list (GET /prompts/?type=playbook) or against a playbook's version list.
Whether the dialogue is waiting for something (a follow-up time, a manager's answer, a tool result, a meeting) before it acts again. Derived from pending_until. Parking does not move the dialogue: last_tree_node_id still names the node it will resume on.
{
"id": 0,
"product_id": 0,
"customer_id": 0,
"agent_id": 0,
"contact_id": 0,
"created_at": "2024-07-29T15:51:28.071Z",
"channel_id": 0,
"chat_id": "string",
"last_user_msg_id": 0,
"last_user_msg_at": "2024-07-29T15:51:28.071Z",
"last_bot_msg_id": 0,
"is_main": true,
"bot_muted": true,
"pending_until": "2024-07-29T15:51:28.071Z",
"pending_type": "follow_up",
"pending_ref": "string",
"pending_id": "3fa85f64-5717-4562-b3fc-2c963f66afa6",
"state_revision": 0,
"started_at": "2024-07-29T15:51:28.071Z",
"ext_id": "string",
"waba_opener_sent_after_window_num": 0,
"is_sub_outreach": true,
"warmup_pair_id": 0,
"is_incoming": true,
"is_group_chat": true,
"skip_response_for_user_msg_id": 0,
"skip_response_until": "2024-07-29T15:51:28.071Z",
"last_tree_node_id": 0,
"subject": "string",
"enabled_playbook_version_ids": [
0
],
"is_pending": true
}