Перенос владения ботом
POST /v1/bots/:botId/transfer
Переносит владение ботом на другой API-ключ того же аккаунта Битрикс24 и того же пользователя (или администратора аккаунта). Решает ситуацию, когда бот «осиротел» после пересоздания приложения: ключ-владелец отозван, и рантайм бота переставал работать. Перенос меняет только привязку ключа — botId, история чатов и подписки сохраняются. B24-вызов не выполняется; после переноса проверьте B24-привязку нового ключа через `POST /v1/bots/:botId/reauth`.
Параметры
| Параметр | Тип | Обяз. | Описание |
|---|---|---|---|
botId |
number | да | ID бота (path-параметр) |
targetApiKeyId |
string | да | ID целевого API-ключа (тело запроса) |
Целевой ключ должен быть активен (ACTIVE), в том же аккаунте, что и бот, принадлежать тому же пользователю (или вызов делает администратор аккаунта), иметь область imbot и не быть служебным платформенным ключом (cowork, агент-сит, agent-maintenance) — у таких ключей жизненный цикл управляется платформой, бот снова «осиротеет» при их ротации.
Примеры
curl
curl -X POST https://vibecode.bitrix24.tech/v1/bots/42/transfer \
-H "X-Api-Key: YOUR_API_KEY" \
-H "Content-Type: application/json" \
-d '{ "targetApiKeyId": "ck_target_key_id" }'
JavaScript
const res = await fetch('https://vibecode.bitrix24.tech/v1/bots/42/transfer', {
method: 'POST',
headers: { 'X-Api-Key': 'YOUR_API_KEY', 'Content-Type': 'application/json' },
body: JSON.stringify({ targetApiKeyId: 'ck_target_key_id' }),
})
const { data } = await res.json()
console.log(data) // { transferred: true, botId: 42, fromApiKeyId: '...', toApiKeyId: '...' }
Поля ответа
| Поле | Тип | Описание |
|---|---|---|
data.transferred |
boolean | true, если привязка изменилась; false — если ключ уже был владельцем (идемпотентный no-op) |
data.botId |
number | ID бота |
data.fromApiKeyId |
string | ID прежнего ключа-владельца (только при transferred: true) |
data.toApiKeyId |
string | ID нового ключа-владельца |
Пример ответа
{
"success": true,
"data": {
"transferred": true,
"botId": 42,
"fromApiKeyId": "ck_old_owner",
"toApiKeyId": "ck_target_key_id"
}
}
Если целевой ключ уже владеет ботом, перенос не выполняется и возвращается transferred: false (при этом fromApiKeyId равен toApiKeyId — текущему владельцу).
Пример ответа при ошибке
400 — целевой ключ не подходит (с уточнением в поле reason):
{
"success": false,
"error": {
"code": "TARGET_KEY_INVALID",
"message": "Target API key is not eligible to own this bot.",
"reason": "wrong_user"
}
}
Ошибки
| HTTP | Код | Описание |
|---|---|---|
| 400 | INVALID_BOT_ID |
botId не является числом |
| 400 | INVALID_PARAMS |
Не передан targetApiKeyId или он не строка |
| 400 | TARGET_KEY_INVALID |
Целевой ключ не подходит. reason: not_active · wrong_portal · wrong_user · missing_scope · expired · system_key (служебный платформенный ключ) |
| 403 | NOT_BOT_OWNER |
Вызывающий не владеет ботом (нужен тот же пользователь, что у ключа-владельца, или администратор аккаунта) |
| 403 | SCOPE_DENIED |
API-ключ не имеет области imbot |
| 403 | WRITE_BLOCKED_READONLY_KEY |
Ключ в режиме «только чтение» |
| 404 | BOT_NOT_FOUND |
Бот не найден в аккаунте |
| 404 | TARGET_KEY_NOT_FOUND |
Целевой ключ не найден |
| 409 | BOT_TRANSFER_NOT_ALLOWED |
Бот управляется агентом или управляемым ботом — переносите через соответствующий ресурс, а не напрямую |
| 409 | BOT_TRANSFER_CONFLICT |
Владение изменилось параллельным запросом — перечитайте текущего владельца и повторите при необходимости |
Полный список общих ошибок API — Ошибки.
Известные особенности
Когда применять. Бот перестал работать после пересоздания OAuth-приложения: ключ-владелец отозван, и рантайм бота больше не запускается. Перенос на активный личный ключ (vibe_api_*) того же аккаунта восстанавливает работу бота — рантайм не зависит от того, каким приложением был зарегистрирован бот.
Авторизация по пользователю, а не по ключу. Перенос разрешён владельцу бота (тому же пользователю Vibe, что и у текущего ключа-владельца — даже если ключ уже отозван) или администратору аккаунта. Держать текущий ключ-владелец не требуется — именно поэтому перенос работает, когда исходный ключ отозван.
Идемпотентность. Перенос на текущий ключ-владелец (в том числе отозванный) — безопасный no-op: возвращается transferred: false, привязка не меняется, запись в журнал не создаётся.
Проверка после переноса. B24-вызов при переносе не выполняется. Чтобы убедиться, что новый ключ может управлять ботом, вызовите `POST /v1/bots/:botId/reauth` — он проверит B24-привязку нового ключа.