For AI agents: markdown of this page — /docs-content-en/bots/openlines/transfer.md documentation index — /llms.txt
Transfer a session
POST /v1/bots/:botId/openlines/session/transfer
The bot transfers the Open Channel session to a selected employee or to a line queue. Call it instead of having the bot leave the chat when the conversation must move to a person in a given queue.
Parameters
| Parameter | Type | Required | Default | Description |
|---|---|---|---|---|
ParameterbotId (path) |
Typeinteger | Requiredyes | Default— | DescriptionID of a bot registered with this key. List: GET /v1/bots |
Request fields (body)
| Field | Type | Required | Description |
|---|---|---|---|
FieldchatId |
Typeinteger | string | Requiredyes | DescriptionOpen Channel chat ID: a positive integer, a string of digits or the chat<N> form. Source: the data.chat.id field of a bot event or sessions[].chatId in POST /v1/openlines/sessions/search. Instead of chatId, you can pass dialogId or CHAT_ID |
FielddialogId |
Typestring | Requiredno | DescriptionThe same chat, only in the chat<N> form, for example chat2043. A number without the prefix is not accepted here |
FieldCHAT_ID |
Typeinteger | string | Requiredno | DescriptionAlternative name for chatId with the same formats |
FielduserId |
Typeinteger | string | Requiredno | DescriptionID of the employee the session is transferred to: a positive integer or a string of digits. List: GET /v1/users |
FieldqueueId |
Typeinteger | string | Requiredno | DescriptionID of the line whose queue the session is transferred to: a positive integer or a string of digits. List: GET /v1/openline-configs |
FieldtransferId |
Typeinteger | string | Requiredno | DescriptionTarget as a single value: queue<line ID> is a line queue, for example queue7, with the prefix in any case. A number or a string of digits is an employee ID. Line ID from GET /v1/openline-configs, employee ID from GET /v1/users |
Fieldleave |
Typeboolean | string | Requiredno | DescriptionWhether the bot leaves the chat after the transfer: true, false, "Y" or "N". Without the field, the bot stays in the chat |
The first filled field among chatId, dialogId and CHAT_ID is read, in exactly this order. A field set to null counts as not filled. An invalid value in the first filled field returns 400 INVALID_CHAT_ID, and the remaining fields are not checked in that case.
Pass exactly one of userId, queueId and transferId. A field set to null counts as not passed.
Target fields and leave are also accepted under uppercase names: USER_ID, QUEUE_ID, TRANSFER_ID, LEAVE. If both name variants are passed, the field with the name from the table above is read: userId, queueId, transferId or leave.
Examples
curl — personal key
curl -X POST https://vibecode.bitrix24.com/v1/bots/621/openlines/session/transfer \
-H "X-Api-Key: YOUR_API_KEY" \
-H "Content-Type: application/json" \
-d '{
"chatId": 2043,
"queueId": 7,
"leave": true
}'
curl — OAuth application
curl -X POST https://vibecode.bitrix24.com/v1/bots/621/openlines/session/transfer \
-H "X-Api-Key: YOUR_APP_KEY" \
-H "Authorization: Bearer USER_SESSION_TOKEN" \
-H "Content-Type: application/json" \
-d '{
"chatId": 2043,
"queueId": 7,
"leave": true
}'
JavaScript — personal key
const res = await fetch(
'https://vibecode.bitrix24.com/v1/bots/621/openlines/session/transfer',
{
method: 'POST',
headers: {
'X-Api-Key': 'YOUR_API_KEY',
'Content-Type': 'application/json',
},
body: JSON.stringify({ chatId: 2043, queueId: 7, leave: true }),
}
)
const { success, data, error } = await res.json()
console.log(success ? data.transferred : error.code)
JavaScript — OAuth application
const res = await fetch(
'https://vibecode.bitrix24.com/v1/bots/621/openlines/session/transfer',
{
method: 'POST',
headers: {
'X-Api-Key': 'YOUR_APP_KEY',
'Authorization': 'Bearer USER_SESSION_TOKEN',
'Content-Type': 'application/json',
},
body: JSON.stringify({ chatId: 2043, queueId: 7, leave: true }),
}
)
const { success, data, error } = await res.json()
console.log(success ? data.transferred : error.code)
Response fields
| Field | Type | Description |
|---|---|---|
Fieldsuccess |
Typeboolean | Descriptiontrue when Bitrix24 confirmed the call |
Fielddata.chatId |
Typeinteger | DescriptionID of the chat the action was applied to. Returned as a number even if the request passed the chat<N> form |
Fielddata.transferred |
Typeboolean | DescriptionAlways true: Bitrix24 confirmed the transfer |
Response example
{
"success": true,
"data": {
"chatId": 2043,
"transferred": true
}
}
Error response example
422 — Bitrix24 rejected the transfer:
{
"success": false,
"error": {
"code": "BITRIX_ERROR",
"message": "You can not redirect to this operator",
"b24Code": "OPERATOR_WRONG"
}
}
Errors
| HTTP | Code | Description |
|---|---|---|
| HTTP400 | CodeINVALID_BOT_ID |
DescriptionbotId in the path is not a positive integer |
| HTTP400 | CodeINVALID_PARAMS |
DescriptionThe request body is not a JSON object, for example an array or a string |
| HTTP400 | CodeINVALID_CHAT_ID |
DescriptionNone of the chatId, dialogId, CHAT_ID fields was passed, the value is invalid, or dialogId was passed without the chat prefix. A body that cannot be parsed as JSON is treated as empty and also gets this code. message says where to get the chat ID |
| HTTP400 | CodeMISSING_TRANSFER_TARGET |
DescriptionNone of the userId, queueId, transferId fields was passed |
| HTTP400 | CodeINVALID_TRANSFER_TARGET |
DescriptionMore than one transfer target was passed |
| HTTP400 | CodeINVALID_TRANSFER_TARGET |
DescriptionThe target is neither a positive integer nor the queue<N> form |
| HTTP400 | CodeINVALID_TRANSFER_TARGET |
Descriptionleave is not one of true, false, "Y" or "N" |
| HTTP401 | CodeMISSING_API_KEY |
DescriptionThe X-Api-Key header was not passed |
| HTTP401 | CodeTOKEN_MISSING |
DescriptionThe key has no portal tokens. For an application key, the user session token was not passed |
| HTTP403 | CodeSCOPE_DENIED |
DescriptionThe key lacks the imbot or imopenlines scope — both are required |
| HTTP403 | CodeWRITE_BLOCKED_READONLY_KEY |
DescriptionThe key is in read-only mode |
| HTTP403 | CodeBOT_ACCESS_DENIED |
DescriptionThe bot was registered by another key. To regain control, see Restoring access to a bot |
| HTTP403 | CodeBITRIX_ACCESS_DENIED |
DescriptionBitrix24 denied access to the chat |
| HTTP404 | CodeBOT_NOT_FOUND |
DescriptionNo bot with this botId on the portal — register it via POST /v1/bots |
| HTTP404 | CodeENTITY_NOT_FOUND |
DescriptionBitrix24 reported that the record was not found |
| HTTP409 | CodeBOT_ID_REPLACED |
DescriptionThe bot was registered again after the portal address changed. The new ID is in error.details.botId |
| HTTP409 | CodeBOT_RECOVERY_IN_PROGRESS |
DescriptionThe bot is being restored automatically after the portal address changed. Retry after the pause from the Retry-After header |
| HTTP410 | CodeBOT_DISABLED |
DescriptionThe bot is disabled. To bring the bot back, see Bot disabled |
| HTTP422 | CodeBITRIX_ERROR |
DescriptionBitrix24 rejected the transfer. The Bitrix24 code is in error.b24Code, for example OPERATOR_WRONG |
| HTTP429 | CodeRATE_LIMITED |
DescriptionThe shared platform ceiling of 30 requests per minute per portal was exceeded. The ceiling is shared by the four bot actions in an Open Channel and the POST /v1/openlines/operator/answer and POST /v1/openlines/operator/finish calls, and is split between platform replicas, so the code can arrive before the 30th request. The effective value is in the x-ratelimit-limit header, and the time until a retry is in error.message. A request rejected with 400 because of an error in the body also counts against the limit |
| HTTP429 | CodeRATE_LIMITED |
DescriptionBitrix24 throttled requests to the portal. Retry after the pause from the Retry-After header |
| HTTP429 | CodeQUEUE_OVERFLOW |
DescriptionThe request queue to the portal is full. Retry after the pause from the Retry-After header |
| HTTP429 | CodeQUEUE_TIMEOUT |
DescriptionThe request did not get its turn in the portal queue and was not sent to Bitrix24. Retry after the pause from the Retry-After header |
| HTTP502 | CodeOPENLINE_BOT_SESSION_FAILED |
DescriptionBitrix24 did not confirm the transfer: the call result is not true |
| HTTP502 | CodeBITRIX_UNAVAILABLE |
DescriptionThe Bitrix24 portal is unavailable |
| HTTP503 | CodeBITRIX_TIMEOUT |
DescriptionThe Bitrix24 portal did not respond in time |
| HTTP503 | Codeuser_self_deletion_pending |
DescriptionThe key owner's account on the portal is pending deletion |
Full list of common API errors: Errors.
Known specifics
OPERATOR_WRONG does not distinguish a wrong target from a wrong chat. A transfer to an existing queue or an existing employee, but in a chat that does not exist, also returns 422 BITRIX_ERROR with error.b24Code equal to OPERATOR_WRONG. Check chatId against the bot event or session search before changing the target.