Bot Talk API
Bot Talk API - это REST API для взаимодействия с конкретным чатботом из вашего собственного приложения: пользовательских сервисов, внутренних инструментов или созданных вами сценариев автоматизации. Вы создаете ключ API на вкладке бота API, а затем вызываете эндпоинт чата, передавая ключ в качестве Bearer-токена, чтобы получать ответы бота в виде единого ответа или в потоковом режиме через SSE.
Начало работы
- Выберите чатбота и перейдите на вкладку API в верхней части страницы бота (Select Bot > API (Выбрать бота > API)).
- Нажмите Create API Key (Создать ключ API).
Счетчик рядом с кнопкой показывает, сколько ключей активно ("1 of 5 API keys active"). Ссылка View API Documentation (Просмотреть документацию API) открывает данный справочник, а фрагмент кода curl в разделе Quick Start (Быстрый старт) содержит готовый к запуску пример.
- В диалоговом окне Create API Key укажите имя ключа, при необходимости настройте белый список IP-адресов и ограничение частоты запросов (rate limit), выберите необходимые разрешения и нажмите Create (Создать).
- Скопируйте ключ целиком из окна с подтверждением создания. В открытом виде он отображается только один раз.
Ключ выглядит следующим образом: ck_abcdefghijklmnopqrstuvwxyz012345. Каждый ключ привязан к конкретному боту, поэтому любой запрос с этим ключом обращается именно к нему - бот идентифицируется по ключу и никогда не указывается в URL.
Базовый URL
https://api.chatlab.com/aichat
Все эндпоинты в этой статье указаны относительно данного базового URL.
Разрешения ключа
Каждый ключ содержит одно или оба разрешения, которые настраиваются переключателями в диалоговом окне Create API Key:
- Chat (send messages and receive responses) - разрешает доступ к эндпоинтам
/v1/chatи/v1/chat/stream. - Conversation history (list and read past conversations) - разрешает доступ к эндпоинтам
/v1/conversations.
На вкладке API предоставленные разрешения для каждого ключа отображаются в виде бейджей Chat и Conversations.
Аутентификация
Передавайте ключ в заголовке Authorization при каждом запросе:
Authorization: Bearer ck_abcdefghijklmnopqrstuvwxyz012345
Запросы без заголовка Authorization: Bearer ... возвращают 401 missing_api_key. Неизвестные ключи возвращают 401 invalid_api_key; отозванные ключи возвращают 401 revoked_api_key. Пять неудачных попыток за одну минуту с одного IP-адреса приводят к блокировке на 60 минут.
Лимиты
- Не более 5 активных ключей Bot Talk на одного бота
- Не более 60 запросов в минуту на один ключ (алгоритм token bucket, емкость 60, плавное пополнение со скоростью 1 токен в секунду). Лимит можно уменьшить при создании: задайте меньшее значение
rateLimitPerMinute, и ограничение снизится, а скорость пополнения пропорционально скорректируется. - Максимальная длина сообщения - 4000 символов
- Количество одновременных потоков SSE на ключ регулируется лимитами вашего аккаунта
Эндпоинты
POST /v1/chat
Отправка сообщения боту и получение полного ответа в едином теле JSON.
Тело запроса
{
"message": "Hi, can you help me track my order?",
"conversationId": "550e8400-e29b-41d4-a716-446655440000",
"metadata": {"userEmail": "alice@example.com"}
}
message- обязательная строка, не более 4000 символов.conversationId- необязательный UUID. Не передавайте для нового диалога; используйте значение, ранее возвращенное сервером, чтобы продолжить существующий диалог.metadata- необязательный объект:{source, userName, userEmail, userPhone}. ПолеuserEmailтакже используется для формирования внутреннего идентификатора клиента.
Тело ответа (200)
{
"message": {"role": "assistant", "content": "Sure, what's your order number?"},
"conversationId": "550e8400-e29b-41d4-a716-446655440000",
"model": "gpt-4o-mini",
"usage": {"creditsUsed": 2},
"actions": []
}
message.roleвсегда имеет значение"assistant";message.contentсодержит полный текст ответа.model- идентификатор модели, на базе которой бот обработал этот запрос.usage.creditsUsedучитывает сообщение пользователя + ответ бота (обычно 2), а также дополнительно один кредит за каждый выполненный вызов инструмента.actionsсодержит список вызовов инструментов, выполненных в ходе этого шага. На данный момент возвращаются только записи типаfunction_call(с полямиtype,name,status: "completed").
POST /v1/chat/stream
Потоковый вариант эндпоинта /v1/chat. Возвращает заголовок Content-Type: text/event-stream с событиями Server-Sent Events.
Тело запроса
Имеет ту же структуру, что и POST /v1/chat. Параметр stream в теле запроса указывать не нужно - использование этого маршрута само по себе запускает SSE.
Тело ответа (события SSE)
message.delta- фрагмент содержимого{ "content": "..." }. По мере генерации токенов отправляется несколько таких событий.action- вызов инструмента{ "type", "name", "status": "executing" }. Отправляется, когда бот инициирует вызов функции.message.done- финальное событие с полямиconversationId,model,usageи списком выполненных вызововactions(при их наличии).error- отправляется при сбое генерации; после этого поток закрывается.
Во время длительной генерации каждые 15 секунд отправляются keep-alive комментарии SSE (:keepalive). Таймауты на стороне сервера: 30 секунд на получение первого токена, 120 секунд суммарно на один поток.
Пример использования с curl
curl -N -X POST https://api.chatlab.com/aichat/v1/chat/stream \
-H "Authorization: Bearer ck_..." \
-H "Content-Type: application/json" \
-d '{"message":"hello"}'
GET /v1/conversations
Получение списка диалогов бота, привязанного к вашему ключу, по всем источникам (виджет, WhatsApp, API и т. д.).
Параметры запроса (query parameters)
limit- от 1 до 100, по умолчанию 20. Значения вне этого диапазона приводятся к его границам.cursor- непрозрачный строковый токен, полученный в полеnextCursorна предыдущей странице. Для первой страницы указывать не нужно.
Тело ответа (200)
{
"data": [
{
"conversationId": "550e8400-e29b-41d4-a716-446655440000",
"createdAt": "2026-05-10T14:11:02Z",
"lastMessageAt": "2026-05-10T14:12:34Z",
"messageCount": 6,
"lastMessagePreview": "Thanks for the help."
}
],
"hasMore": false,
"nextCursor": null
}
- Поле
lastMessagePreviewусекается до 100 символов с добавлением многоточия.... - На последней странице поле
nextCursorпринимает значениеnull; передавайте его значение в параметреcursor, чтобы запросить следующую страницу.
GET /v1/conversations/{conversation_id}
Полная история сообщений в диалоге.
Тело ответа (200)
{
"conversationId": "550e8400-e29b-41d4-a716-446655440000",
"createdAt": "2026-05-10T14:11:02Z",
"lastMessageAt": "2026-05-10T14:12:34Z",
"messageCount": 6,
"messages": [
{"role": "user", "content": "Hi", "createdAt": "2026-05-10T14:11:02Z"},
{"role": "assistant", "content": "Hello! How can I help?", "createdAt": "2026-05-10T14:11:03Z"}
]
}
Возвращаются только роли user и assistant; внутренние служебные сообщения system и вызовы инструментов отфильтровываются. Возвращает ошибку 404 not_found_error, если диалог не относится к боту, привязанному к вашему ключу.
Для просмотра конфигурации бота используйте эндпоинт Management API GET /v1/management/bots/{bot_id} с ключом Management.
Заголовки ограничения частоты запросов (rate limit)
Ответы, дошедшие до этапа проверки лимитов (то есть успешно прошедшие аутентификацию и проверку белого списка IP), содержат следующие заголовки:
X-RateLimit-Limit: 60
X-RateLimit-Remaining: 57
X-RateLimit-Reset: 1715430000
X-RateLimit-Limit- фактический лимит на ключ, примененный к данному вызову (по умолчанию 60 или настроенное вами значениеrateLimitPerMinute, если оно меньше).X-RateLimit-Remaining- количество токенов, оставшихся в корзине непосредственно после этого вызова.X-RateLimit-Reset- время в формате Unix epoch seconds, когда станет доступен следующий токен (это не время полного сброса корзины; корзина пополняется непрерывно). Когда корзина заполнена, значение равно текущему времени.
При получении ответа 429 rate_limit_exceeded также передается заголовок Retry-After, указывающий время в целых секундах до момента, когда освободится хотя бы один токен.
Ошибки на этапе до аутентификации (401 missing_api_key, 401 invalid_api_key, 403 ip_blocked) и ошибка 403 ip_not_whitelisted не содержат заголовков X-RateLimit-* - сервис лимитов опрашивается только после успешного прохождения аутентификации и проверки IP.
Формат ошибок
Все ошибки возвращаются в едином формате структуры:
{
"error": {
"type": "rate_limit_error",
"code": "rate_limit_exceeded",
"message": "Rate limit exceeded. Try again in 12 seconds.",
"param": null
}
}
Распространенные HTTP-коды:
400 invalid_request_error- некорректные входные данные (коды:invalid_parameter,unsupported_media_type)401 authentication_error- отсутствует ключ (missing_api_key), указан неизвестный ключ (invalid_api_key) или отозванный ключ (revoked_api_key)402 quota_exceeded_error- исчерпаны кредиты на сообщения403 permission_error- IP-адрес заблокирован (ip_blocked), IP-адрес отсутствует в белом списке ключа (ip_not_whitelisted) либо тип ключа не позволяет использовать этот эндпоинт (key_type_not_allowed,insufficient_permissions)404 not_found_error- диалог не принадлежит этому боту405 invalid_request_error(method_not_allowed) - неверный HTTP-метод для данного URL429 rate_limit_error- превышен лимит запросов (rate_limit_exceeded) или превышено число одновременных потоков (concurrent_streams_exceeded)500 api_error- внутренняя ошибка сервера
Связанные разделы
Инструкции по операциям на уровне аккаунта (создание ботов, обновление ботов, получение данных об использовании) приведены в статье Management API.