Шесть законченных сценариев: от пустого ключа до ответа клиенту. Каждый шаг показан дважды: инструментом MCP (так делает нейросеть) и запросом curl (так делает ваш сервер). Справочник всех адресов: эндпоинты и инструменты.
#Что нужно один раз
| Шаг | Где делается | Зачем |
|---|---|---|
Выпустить ключ tuk_sk_… | Кабинет → Настройки проекта → API | Ключ нельзя выпустить по API: ключ, умеющий выпускать ключи, обесценивает права |
| Выдать ключу права | Там же, галочки scopes | Лишнее право повышает риск, начните с messengers:read, contacts:read, messages:read, messages:send |
| Подключить канал | Кабинет → Каналы связи | Пока только руками: OAuth-каналам нужен браузер, а токен бота нельзя присылать чужому агенту |
| Подключить MCP | Конфиг вашего клиента, строка подключения | Нейросеть увидит инструменты по правам ключа |
#Сценарий 1. Ответить клиенту, который написал
Самый частый случай: человек написал в Telegram, отвечает нейросеть.
tuktuk_list_channels: через какой канал вообще можно говорить.tuktuk_find_contactпо телефону, email или имени: получитьdialogId.tuktuk_read_messages: прочитать переписку целиком, а не последнее сообщение.tuktuk_pause_assistant: если в диалоге работает ИИ-ассистент, заберите диалог себе, иначе клиент получит два ответа.tuktuk_send_message: ответить.
# 2. Найти контакт
curl -s "https://back.tuk-tuk.online/api/v1/contacts?phone=%2B79991234567" -H "Authorization: Bearer $TUK_KEY"
# 3. Прочитать историю (свежие сверху)
curl -s "https://back.tuk-tuk.online/api/v1/contacts/$DIALOG/messages?limit=30" -H "Authorization: Bearer $TUK_KEY"
# 4. Забрать диалог у ассистента
curl -s -X POST https://back.tuk-tuk.online/api/v1/assistants/pause-dialog \
-H "Authorization: Bearer $TUK_KEY" -H "Content-Type: application/json" \
-d '{"dialogId":"'$DIALOG'","minutes":60}'
# 5. Ответить
curl -s -X POST https://back.tuk-tuk.online/api/v1/messages \
-H "Authorization: Bearer $TUK_KEY" -H "Content-Type: application/json" \
-H "Idempotency-Key: reply-$DIALOG-1" \
-d '{"dialogId":"'$DIALOG'","text":"Здравствуйте! Записал вас на четверг, 15:00."}'#Сценарий 2. Написать первым
Адресат задаётся одним из четырёх способов: dialogId, phone, email, identifier. Во всех случаях, кроме dialogId, нужен channelId, чтобы платформа знала, откуда писать.
curl -s -X POST https://back.tuk-tuk.online/api/v1/messages \
-H "Authorization: Bearer $TUK_KEY" -H "Content-Type: application/json" \
-d '{"channelId":"'$CHANNEL'","phone":"+79991234567","name":"Иван","text":"Ваш заказ готов"}'Контакта ещё нет? Он заведётся сам, имя возьмётся из поля name. Инструмент MCP тот же: tuktuk_send_message.
#Сценарий 3. Рассылка по сегменту
Порядок обязателен: сначала посчитать аудиторию, потом создать, потом запустить.
tuktuk_preview_audience: сколько человек попадёт под фильтр.tuktuk_create_broadcast: черновик с текстом, темпом и окном отправки.tuktuk_start_broadcast: запуск.tuktuk_broadcast_report: кто получил, кто нет и почему.
# 1. Сколько получателей
curl -s -X POST https://back.tuk-tuk.online/api/v1/broadcasts/preview \
-H "Authorization: Bearer $TUK_KEY" -H "Content-Type: application/json" \
-d '{"audience":{"tags":["клиент"],"activeWithinDays":90}}'
# 2-3. Создать и запустить
BID=$(curl -s -X POST https://back.tuk-tuk.online/api/v1/broadcasts -H "Authorization: Bearer $TUK_KEY" \
-H "Content-Type: application/json" \
-d '{"name":"Сентябрьская акция","text":"Скидка 20% до пятницы","audience":{"tags":["клиент"]},"delayMinSec":20,"delayMaxSec":60}' | jq -r .id)
curl -s -X POST https://back.tuk-tuk.online/api/v1/broadcasts/$BID/start -H "Authorization: Bearer $TUK_KEY"Завершённую рассылку не перезапускают: duplicate делает копию, иначе получившие однажды получат второй раз. Темп и окно берегут аккаунт от блокировки в мессенджере, подробности.
#Сценарий 4. Узнавать о входящих без поллинга
Платформа сама постучится на ваш адрес. Поллинг /contacts/{id}/messages в цикле даёт лишние запросы и задержку.
curl -s -X POST https://back.tuk-tuk.online/api/v1/events/subscriptions \
-H "Authorization: Bearer $TUK_KEY" -H "Content-Type: application/json" \
-d '{"url":"https://example.com/hooks/tuktuk","events":["message.inbound","dialog.created"]}'В ответе придёт secret, он показывается один раз. Каждый запрос подписан заголовком X-Webhook-Signature (HMAC-SHA256 от тела):
import { createHmac, timingSafeEqual } from 'node:crypto';
function valid(rawBody, signature, secret) {
const mine = createHmac('sha256', secret).update(rawBody).digest('hex');
const a = Buffer.from(mine), b = Buffer.from(signature ?? '');
return a.length === b.length && timingSafeEqual(a, b);
}Полный список событий и формат тела: Event Webhooks. История доставок и повторы лежат в GET /events/subscriptions/{id}/deliveries.
#Сценарий 5. Отложенное действие
Агент живёт один ход, а напомнить нужно завтра. Отдайте время платформе.
curl -s -X POST https://back.tuk-tuk.online/api/v1/messages/schedule \
-H "Authorization: Bearer $TUK_KEY" -H "Content-Type: application/json" \
-d '{"dialogId":"'$DIALOG'","text":"Напоминаю о встрече в 15:00","sendAt":"2026-09-20T09:00:00Z"}'Минимум 30 секунд вперёд. Очередь показывает tuktuk_list_scheduled, отменяет tuktuk_cancel_scheduled.
#Сценарий 6. Автоответчик без единого клика
Связки отвечают на входящие по сценарию: ветвления, задержки, ИИ, вебхуки.
tuktuk_chain_templates: готовые шаблоны.tuktuk_create_chain_from_template: создать по шаблону.tuktuk_toggle_chain: включить.
Своя схема собирается через POST /chains с массивом блоков; справочник 18 типов блоков отдаёт GET /chains/block-types, человеческое описание лежит в разделе Цепочки.
#Правила, которые берегут деньги и репутацию
| Правило | Почему |
|---|---|
Idempotency-Key на каждой отправке | Обрыв связи и ретрай не должны отправить второе сообщение. Ключ живёт сутки |
Проверяйте canSend в GET /account | При нулевом балансе и истёкшем тарифе отправка не пройдёт, причина в blockedReason |
| Ставьте ассистента на паузу, если ведёте диалог сами | Иначе клиент получит два ответа на один вопрос |
Уважайте transactional в email | Служебное письмо (чек, код, доступ) проходит отписавшемуся, рекламное не проходит: отправка вернёт 422 |
| Читайте историю перед ответом | Клиент уже мог написать то, что вы собираетесь спросить |
#Что по API нельзя и где это делается руками
Граница проходит по деньгам и расширению прав. Это не забытые эндпоинты, а сознательное решение: утечка ключа не должна превращаться в счёт или в новый ключ.
| Действие | Где делает человек |
|---|---|
| Подключить или отключить канал | Каналы связи |
| Выпустить, изменить, отозвать ключ API | Настройки проекта → API |
| Пополнить баланс, сменить тариф | Баланс |
| Пригласить сотрудника, выдать права | Пользователи |
Кабинет остаётся полноценным рабочим местом: всё, что делает агент, человек видит в тех же диалогах, задачах и отчётах и может вмешаться в любой момент.
#Коды ответов, которые стоит обрабатывать
| Код | Значение | Что делать |
|---|---|---|
401 | Ключ неверен или отозван | Остановиться, попросить новый ключ |
403 | Нет права (scope) | Показать человеку, какое право добавить в кабинете |
404 | Объекта нет или он чужой | Не повторять запрос |
422 | Запрос принят, но отправить нельзя | Прочитать message: отписка, пустой баланс, неподходящий канал |
429 | Лимит запросов ключа | Подождать, затем повторить |
Полный перечень ошибок и тела ответов: REST API v1.
