Передача

Передача бота (со всеми его кампаниями) или отдельной кампании другому аккаунту — в одной атомарной операции. Смотрите также: Руководство по передаче.

Все запросы аутентифицированы (ваш API-ключ). Эндпоинты token и resolve доступны на любом тарифе; bot и camp требуют, чтобы у самого отправителя была активная платная подписка. Любой ответ — это HTTP 200 с телом application/json; успех или ошибка определяются полем status, а не HTTP-кодом.


Как работает передача

Передача использует токен передачи — буквенно-цифровой код из 32 символов у каждого пользователя, отдельный от API-ключа. Он идентифицирует получателя, не раскрывая его Telegram ID или username. Отправитель получает токен передачи получателя вне системы (например, в личном сообщении), проверяет его через resolve для подтверждения возможности передачи, затем вызывает эндпоинт передачи.

Условия приёма проверяются перед перемещением данных:

  • У получателя должна быть платная подписка в истории аккаунта — бесплатный / ни разу не плативший аккаунт не может принять ботов или кампании (вернётся ошибка unpaid).
  • У получателя должно быть достаточно свободных слотов для кампаний, которые передаются.

Кроме того, сам отправитель должен быть на активной платной подписке: эндпоинты bot и camp закрыты платным шлюзом и до их выполнения вернут ошибку unpaid, если подписка отправителя неактивна.

Судьба лидов управляется параметром leads, который необязателен и по умолчанию равен 0:

  • leads=1 (любое ненулевое значение) — все лиды, статистика и история переатрибутируются получателю.
  • leads=0 (значение по умолчанию, если параметр опущен) — все лиды передаваемых кампаний и связанные с ними записи удаляются навсегда. Чтобы сохранить лиды, обязательно передавайте leads=1 явно.

Все операции записи выполняются в одной транзакции базы данных.

CRM при передаче. Если у передаваемого бота включён CRM, его диалоги и кастомные события следуют тому же выбору leads (переходят получателю или удаляются) и отвязываются от ваших операторов; бот исключается из ваших команд (операторы сразу теряют к нему доступ), а режим CRM на нём выключается — получатель включит его заново. При передаче отдельной кампании диалоги остаются у прежнего бота (он остаётся у вас) — переезжают только привязанные к лидам события.


Получить свой токен передачи

GET /api/transfer/token.json

Возвращает ваш текущий токен передачи. Если токен ещё не был сгенерирован, он создаётся и сохраняется при первом обращении. Поделитесь им с тем, кто хочет передать вам бота или кампанию.

{ "status": "ok", "token": "Hk3mP9qL2xVnT7wRcZ8aBdFgJ4sYuE6" }
ОшибкаЗначение
dbОшибка базы данных при чтении или сохранении токена

Сбросить токен передачи

POST /api/transfer/token.json

Генерирует новый токен передачи из 32 символов. Старый токен перестаёт работать немедленно — любая передача, которую отправитель инициировал со старым токеном, завершится ошибкой notfound.

{ "status": "ok", "token": "Qz5tNb1cW8yMr3kHdLpX7vJ2aFgUeS9o" }
ОшибкаЗначение
dbОшибка базы данных при обновлении токена

Найти получателя

GET /api/transfer/resolve.json

Получает имя аккаунта по токену передачи и проверяет готовность к приёму. Вызывайте перед transfer/bot или transfer/camp, чтобы убедиться в возможности передачи.

ПараметрОбязательныйОписание
tokenТокен передачи получателя
{
  "status": "ok",
  "name": "Иван Петров",
  "paid": true,
  "slots": 12
}

name — отображаемое имя аккаунта получателя. paid показывает, есть ли у получателя платная подписка в истории аккаунта — это не проверка активного окна, поэтому ранее оплачивавший аккаунт с уже истёкшим окном всё равно вернёт true; false бывает только у бесплатного / ни разу не платившего аккаунта. slots — количество свободных слотов для кампаний:

Значение slotsЗначение
-1Безлимитный тариф (у получателя есть платная подписка в истории)
0Свободных слотов нет: либо бесплатный / ни разу не плативший аккаунт (paid: false), либо лимитный тариф уже заполнен
> 0Лимит тарифа минус число неудалённых кампаний получателя
ОшибкаЗначение
funcПараметр token не передан или пуст
notfoundАккаунт с этим токеном передачи не найден
dbОшибка базы данных при поиске

Передать бота

POST /api/transfer/bot.json

Передаёт бота и все его неудалённые кампании получателю. Лиды каждой кампании переатрибутируются или удаляются в зависимости от leads, а история журнала следует за ботом к новому владельцу.

ПараметрОбязательныйОписание
botID бота (вы должны быть его владельцем)
tokenТокен передачи получателя
leads1 — переатрибутировать лиды получателю; 0 (по умолчанию) — удалить их навсегда
{ "status": "ok" }
ОшибкаЗначение
funcНе передан bot или token
selfЭто ваш собственный токен передачи — передать самому себе нельзя
accessВы не являетесь владельцем этого бота
notfoundТокен передачи не соответствует ни одному аккаунту
unpaidПодписка отправителя неактивна, либо получатель — бесплатный / ни разу не плативший аккаунт
limitУ получателя недостаточно свободных слотов для передаваемых кампаний
heldБот или какая-либо из его кампаний заморожены модерацией
dbОшибка базы данных или транзакции

Передать кампанию

POST /api/transfer/camp.json

Передаёт одну кампанию получателю. У получателя должен быть активный бот, являющийся администратором чата кампании — подходящий бот выбирается автоматически и становится новым ботом кампании.

Если выбранный бот получателя отличается от прежнего бота, приветственное медиа перезагружается на нового бота (file_id в Telegram привязан к боту): медиа на короткое время отправляется в чат кампании и сразу удаляется — в канале возможна кратковременная вспышка сообщения. Если перезагрузка не удалась, она не прерывает передачу: медиа очищается, и новому владельцу потребуется загрузить его заново.

ПараметрОбязательныйОписание
campID кампании (вы должны быть её владельцем)
tokenТокен передачи получателя
leads1 — переатрибутировать лиды (и привязать их к новому боту); 0 (по умолчанию) — удалить их навсегда
{ "status": "ok" }
ОшибкаЗначение
funcНе передан camp или token
selfЭто ваш собственный токен передачи — передать самому себе нельзя
accessВы не являетесь владельцем этой кампании
notfoundТокен передачи не соответствует ни одному аккаунту
unpaidПодписка отправителя неактивна, либо получатель — бесплатный / ни разу не плативший аккаунт
limitУ получателя нет свободного слота для кампании
nobotУ получателя нет активного бота, являющегося администратором чата этой кампании
heldКампания заморожена модерацией
dbОшибка базы данных или транзакции

Перенос кампании между своими ботами

Переносит кампанию на другого вашего бота (тот же владелец) — например, если прежний бот перестал работать (потерял права администратора или его токен отозван), а другой ваш бот уже администрирует ту же группу/канал. Получатель не меняется, поэтому токен и проверки оплаты/слотов не нужны, а лиды всегда сохраняются (параметр leads здесь не используется).

В одной транзакции на нового бота переносятся: сама кампания, органическая история журнала чата, CRM-диалоги подписчиков кампании (чтобы чат оператора продолжал работать, новый бот должен входить в команду оператора) и любая идущая чистка группы. Приветственное медиа перезагружается через прежнего бота (работает, даже если он лишь потерял админку в группе); если прежний бот недоступен, перенос всё равно проходит, а медиа очищается (media_lost: true — загрузите его заново). Замороженная модерацией кампания (или её бот) к переносу не допускается.


Доступные боты для переноса

GET /api/transfer/targets.json

Возвращает ваших других активных ботов, администрирующих чат кампании — допустимые адресаты для переноса.

ПараметрОбязательныйОписание
campID кампании (вы должны быть её владельцем)
{
  "status": "ok",
  "data": [
    { "id": 9, "name": "Backup Bot", "username": "mybackupbot" }
  ]
}

data — массив (может быть пустым, если подходящих ботов нет).

ОшибкаЗначение
funccamp равен 0
accessКампания не принадлежит вам
dbОшибка базы данных

Перенести кампанию на своего бота

POST /api/transfer/move.json

Перенаправляет кампанию на указанного вашего бота (из числа доступных).

ПараметрОбязательныйОписание
campID кампании (вы должны быть её владельцем)
botID вашего активного бота — администратора чата кампании, отличного от текущего
{ "status": "ok", "media_lost": false }

media_losttrue, если приветственное медиа перенести не удалось (загрузите заново).

ОшибкаЗначение
funcНе передан camp или bot, либо указан тот же бот (перенос-пустышка)
accessКампания не принадлежит вам
heldКампания или её текущий бот заморожены модерацией
notadminЦелевой бот не является активным администратором чата
dbОшибка базы данных или транзакции