manualChatbot
Stored in the manualchatbots collection. createdAt and updatedAt are maintained automatically.
Returned by DELETE /manual-chatbot, GET /manual-chatbot, POST /manual-chatbot, DELETE /manual-chatbot/:id, GET /manual-chatbot/:id, PUT /manual-chatbot/:id and 9 more.
Example
One real manualChatbot as returned by GET /manual-chatbot/chatbot-router. Recorded from a live response, so the defaults, denormalised snapshots and populated fields are the actual ones:
{
"_id": "6a95749f859eafb47bf234f4",
"company": "6a9572df859eafb47bf225d7",
"entryPoints": [],
"matching": {
"minScore": 0.2,
"margin": 0.1
},
"switching": {
"enabled": true,
"minScore": 0.7,
"confirm": true,
"confirmText": "You're in {{from}} right now. Switch to {{to}}?",
"maxPerConversation": 2,
"onReturn": "fresh"
},
"tieBreak": {
"mode": "generated",
"flow": null,
"promptText": "Quick check — which one of these do you need?"
},
"createdAt": "2026-08-31T12:33:35.682Z",
"updatedAt": "2026-08-31T12:33:35.682Z",
"__v": 0
}
:::note Trimmed for reading A populated reference is shown by the fields that identify it rather than in full — it arrives as the entire referenced document. Long arrays are cut to the first two entries and marked, long strings are truncated, and any field that could carry a credential is dropped rather than masked. :::
Fields
| Field | Type | Notes |
|---|---|---|
name | string | required |
normalizedName | string | |
activeName | string | |
description | string | |
kind | string | default flow · one of flow, router |
company | ObjectId -> Company | required |
status | string | default draft · one of draft, published, paused |
publishedVersion | number | default 0 |
latestVersion | number | default 1 |
publishedSnapshot | any | default null |
publishedAt | date | |
conversations | object[] | default [] |
conversations.text | string | required |
conversations.order | number | default 0 |
keywords | object[] | default [] |
keywords.keyword | string | required |
keywords.weight | number | default 0 |
keywords.rank | number | default 0 |
handover.mode | string | default any · one of any, all |
handover.rules | object[] | default [] |
handover.rules.type | string | required · one of flow_finished, contains_text, message_count, time_based |
handover.rules.enabled | boolean | default true |
handover.rules.text | string | |
handover.rules.messageCount | number | default 0 |
handover.rules.minutes | number | default 0 |
routing.label | string | default "" |
routing.allowLeave | boolean | default true |
routing.allowEnter | boolean | default true |
attachments.custom | boolean | default false |
attachments.maxFileSizeMb | number | default 10 |
createdBy | ObjectId -> Member | |
updatedBy | ObjectId -> Member | |
_id | ObjectId | |
createdAt | date | set once |
updatedAt | date |