Handover. Your team takes over, from your own tools.
The same actions as the SimplyBoost inbox: take a conversation over, reply as a person, hand it back to the agent, resolve and reopen. Works on every channel.
On this page
The flow
- Take over: the agent stops answering.
modebecomeshuman. - Reply: your message reaches the visitor on the conversation's own channel (website chat, WhatsApp, Instagram, Messenger or API), shown with the first name of the token's creator.
- Hand back: the agent answers again.
modebecomesai. - Resolve or reopen: mark the conversation done, or open it again.
Replies are sent as the person who created the token. If a colleague already claimed the handover in the inbox, your reply is refused with 403 claimed_by_other, so two people never answer at once. A conversation handed over by the agent fires the conversation.escalated webhook; resolving fires conversation.resolved.
Take over a conversation
/chatbots/{chatbotId}/conversations/{threadId}/take-overA person takes the conversation; the chatbot stops answering it.
Permission: conversations:write
Path parameters
chatbotIdThe chatbot. Listed by GET /chatbots.
threadIdThe conversation, from conversation.threadId.
curl -X POST https://get-api.simplyboost.io/api/v1/chatbots/CHATBOT_ID/conversations/THREAD_ID/take-over \
-H "Authorization: Bearer $SIMPLYBOOST_TOKEN"Response 200 OK
{
"ok": true,
"data": { "conversation": { "threadId": "3f0c…", "mode": "human", "escalated": false, "resolved": false, … } },
"meta": { "requestId": "req_7c1e4b2a9f0d4e6c8b3a5d7f9e1c2b4a" }
}Response fields
data.conversation.threadIdThe conversation's ID.
data.conversation.chatbotIdThe chatbot it belongs to.
data.conversation.channelWhere it happens: web, api, whatsapp, instagram or facebook.
data.conversation.modeWho answers: ai (the chatbot) or human (your team).
data.conversation.escalatedTrue while a handover to your team is open.
data.conversation.resolvedTrue once it was marked resolved.
data.conversation.startedAtWhen it started.
data.conversation.lastMessageAtWhen the last message was sent.
Errors
| Status | Code | When |
|---|---|---|
| 404 | not_found | No such chatbot or conversation, or this token may not see it. |
| 409 | already_handover | A person is already handling it. |
Reply as a person
/chatbots/{chatbotId}/conversations/{threadId}/repliesSends a reply from the token's creator in a conversation your team is handling. Take it over first.
Permission: conversations:write
Path parameters
chatbotIdThe chatbot. Listed by GET /chatbots.
threadIdThe conversation, from conversation.threadId.
Body (JSON)
messageThe reply, 1 to 4,000 characters.
curl -X POST https://get-api.simplyboost.io/api/v1/chatbots/CHATBOT_ID/conversations/THREAD_ID/replies \
-H "Authorization: Bearer $SIMPLYBOOST_TOKEN" \
-H "Idempotency-Key: reply-3f0c-1" \
-H "Content-Type: application/json" \
-d '{"message": "Hi Sanne, I have refunded the second payment."}'Response 201 Created
{
"ok": true,
"data": {
"message": { "id": "…", "role": "agent", "text": "Hi Sanne, I have refunded the second payment.", "createdAt": "2026-10-07T09:41:00+00:00" },
"delivered": true
},
"meta": { "requestId": "req_7c1e4b2a9f0d4e6c8b3a5d7f9e1c2b4a" }
}Response fields
data.message.idThe message's ID.
data.message.roleuser (the visitor), assistant (the chatbot) or agent (a person on your team).
data.message.textThe message text.
data.message.createdAtWhen it was sent.
data.deliveredWhether the reply was handed to the visitor's channel.
data.deliveryErrorOnly when delivery failed: the reason. The reply is still saved in the conversation.
Errors
| Status | Code | When |
|---|---|---|
| 400 | validation_error | message is missing, empty or over 4,000 characters. |
| 404 | not_found | No such chatbot or conversation, or this token may not see it. |
| 409 | not_handover | Your team is not handling the conversation. Take it over first. |
| 403 | claimed_by_other | A colleague is already handling this handover. |
| 503 | lock_failed | A short conflict while claiming the handover. Retry. |
Hand a conversation back to the chatbot
/chatbots/{chatbotId}/conversations/{threadId}/switch-to-aiThe chatbot answers the visitor's next messages again.
Permission: conversations:write
Path parameters
chatbotIdThe chatbot. Listed by GET /chatbots.
threadIdThe conversation, from conversation.threadId.
curl -X POST https://get-api.simplyboost.io/api/v1/chatbots/CHATBOT_ID/conversations/THREAD_ID/switch-to-ai \
-H "Authorization: Bearer $SIMPLYBOOST_TOKEN"Response 200 OK
{
"ok": true,
"data": { "conversation": { "threadId": "3f0c…", "mode": "ai", … } },
"meta": { "requestId": "req_7c1e4b2a9f0d4e6c8b3a5d7f9e1c2b4a" }
}Response fields
data.conversation.threadIdThe conversation's ID.
data.conversation.chatbotIdThe chatbot it belongs to.
data.conversation.channelWhere it happens: web, api, whatsapp, instagram or facebook.
data.conversation.modeWho answers: ai (the chatbot) or human (your team).
data.conversation.escalatedTrue while a handover to your team is open.
data.conversation.resolvedTrue once it was marked resolved.
data.conversation.startedAtWhen it started.
data.conversation.lastMessageAtWhen the last message was sent.
Errors
| Status | Code | When |
|---|---|---|
| 404 | not_found | No such chatbot or conversation, or this token may not see it. |
| 409 | not_handover | The chatbot is already answering. |
Resolve or reopen a conversation
/chatbots/{chatbotId}/conversations/{threadId}{"resolved": true} marks the conversation done; {"resolved": false} reopens it.
Permission: conversations:write
Path parameters
chatbotIdThe chatbot. Listed by GET /chatbots.
threadIdThe conversation, from conversation.threadId.
Body (JSON)
resolvedtrue to resolve, false to reopen.
curl -X PATCH https://get-api.simplyboost.io/api/v1/chatbots/CHATBOT_ID/conversations/THREAD_ID \
-H "Authorization: Bearer $SIMPLYBOOST_TOKEN" \
-H "Content-Type: application/json" \
-d '{"resolved": true}'Response 200 OK
{
"ok": true,
"data": { "conversation": { "threadId": "3f0c…", "mode": "ai", "resolved": true, … } },
"meta": { "requestId": "req_7c1e4b2a9f0d4e6c8b3a5d7f9e1c2b4a" }
}Response fields
data.conversation.threadIdThe conversation's ID.
data.conversation.chatbotIdThe chatbot it belongs to.
data.conversation.channelWhere it happens: web, api, whatsapp, instagram or facebook.
data.conversation.modeWho answers: ai (the chatbot) or human (your team).
data.conversation.escalatedTrue while a handover to your team is open.
data.conversation.resolvedTrue once it was marked resolved.
data.conversation.startedAtWhen it started.
data.conversation.lastMessageAtWhen the last message was sent.
Errors
| Status | Code | When |
|---|---|---|
| 400 | validation_error | resolved is missing or not a boolean. |
| 404 | not_found | No such chatbot or conversation, or this token may not see it. |
| 409 | already_resolved | Resolving a conversation that is already resolved. |
| 409 | not_resolved | Reopening a conversation that is not resolved. |