API для разработчиков

Сценарии для агента

Кратко

Пошаговые сценарии работы с API tuk-tuk.online для ИИ-агентов и разработчиков: ответить клиенту, написать первым, рассылка по сегменту, подписка на входящие события, отложенное сообщение, автоответчик на связках. Каждый шаг показан инструментом MCP и запросом curl.

  • Порядок для ответа клиенту: manifest → список каналов → поиск контакта → чтение истории → пауза ассистента → отправка.
  • Адресат сообщения: dialogId, либо phone/email/identifier вместе с channelId.
  • Рассылка: preview аудитории → создание черновика → start; завершённую копируют через duplicate, а не перезапускают.
  • Входящие получают подпиской на события (HMAC-SHA256 в X-Signature), а не поллингом.
  • Отложенная отправка: POST /messages/schedule, минимум 30 секунд вперёд.
  • По API нельзя: подключать каналы, выпускать ключи, платить, управлять правами: это делает человек в кабинете.
  • Ошибки: 401 ключ, 403 нет scope, 404 чужой объект, 422 отправка невозможна, 429 лимит ключа.
На этой странице

Шесть законченных сценариев: от пустого ключа до ответа клиенту. Каждый шаг показан дважды: инструментом MCP (так делает нейросеть) и запросом curl (так делает ваш сервер). Справочник всех адресов: эндпоинты и инструменты.

#Что нужно один раз

ШагГде делаетсяЗачем
Выпустить ключ tuk_sk_…Кабинет → Настройки проекта → APIКлюч нельзя выпустить по API: ключ, умеющий выпускать ключи, обесценивает права
Выдать ключу праваТам же, галочки scopesЛишнее право повышает риск, начните с messengers:read, contacts:read, messages:read, messages:send
Подключить каналКабинет → Каналы связиПока только руками: OAuth-каналам нужен браузер, а токен бота нельзя присылать чужому агенту
Подключить MCPКонфиг вашего клиента, строка подключенияНейросеть увидит инструменты по правам ключа

#Сценарий 1. Ответить клиенту, который написал

Самый частый случай: человек написал в Telegram, отвечает нейросеть.

  1. tuktuk_list_channels: через какой канал вообще можно говорить.
  2. tuktuk_find_contact по телефону, email или имени: получить dialogId.
  3. tuktuk_read_messages: прочитать переписку целиком, а не последнее сообщение.
  4. tuktuk_pause_assistant: если в диалоге работает ИИ-ассистент, заберите диалог себе, иначе клиент получит два ответа.
  5. tuktuk_send_message: ответить.
Shell
# 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, чтобы платформа знала, откуда писать.

Shell
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. Рассылка по сегменту

Порядок обязателен: сначала посчитать аудиторию, потом создать, потом запустить.

  1. tuktuk_preview_audience: сколько человек попадёт под фильтр.
  2. tuktuk_create_broadcast: черновик с текстом, темпом и окном отправки.
  3. tuktuk_start_broadcast: запуск.
  4. tuktuk_broadcast_report: кто получил, кто нет и почему.
Shell
# 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 в цикле даёт лишние запросы и задержку.

Shell
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 от тела):

JavaScript
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. Отложенное действие

Агент живёт один ход, а напомнить нужно завтра. Отдайте время платформе.

Shell
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. Автоответчик без единого клика

Связки отвечают на входящие по сценарию: ветвления, задержки, ИИ, вебхуки.

  1. tuktuk_chain_templates: готовые шаблоны.
  2. tuktuk_create_chain_from_template: создать по шаблону.
  3. 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.