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 (Створити ключ API) вкажіть назву ключа, за потреби задайте білий список IP-адрес і ліміт запитів, виберіть потрібні дозволи та натисніть Create (Створити).
- Скопіюйте повний ключ із вікна успішного створення. Відкритий текст показується лише один раз.
Ключ виглядає як ck_abcdefghijklmnopqrstuvwxyz012345. Кожен ключ належить саме цьому боту, тому кожен запит із цим ключем звертається до цього бота - бот ідентифікується за ключем і ніколи не з'являється в URL.
- На своєму сервері виконайте наведений нижче приклад curl із вашим ключем і коротким тестовим повідомленням. Збережіть повернутий
conversationId, а потім використайте його повторно для наступного повідомлення. Перевірте відповідь і розмову на вкладці бота Chatlogs (Історія чату).
Зберігайте ключі ck_ на своєму сервері, а не в JavaScript сайту чи збірках мобільних застосунків. Дозвіл Conversations надає доступ до збережених розмов цього бота з усіма відвідувачами, тому ваш застосунок повинен авторизувати кожного кінцевого користувача, перш ніж повертати ці дані. Щоб відкликати ключ, скористайтеся діями Revoke (Відкликати) або Delete (Видалити) на вкладці API; жодна з цих дій не покаже відкритий текст ключа знову.
Перш ніж почати, створіть і навчіть свого чатбота та переконайтеся, що ваш обліковий запис включає доступ до API й має кредити на повідомлення.
Базовий 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для визначення ідентифікатора клієнта; каналом фіксується API. Не розраховуйте на те, що інші поля metadata будуть збережені в записі ліда.
Тіло відповіді (200)
{
"message": {"role": "assistant", "content": "Sure, what's your order number?"},
"conversationId": "550e8400-e29b-41d4-a716-446655440000",
"model": "5.6-LUNA",
"usage": {"creditsUsed": 2},
"actions": []
}
message.roleзавжди має значення"assistant";message.contentмістить повну відповідь.model- ідентифікатор моделі, на якій працював бот під час цього виклику.usage.creditsUsedзараз фіксує 2 плюс одиницю за кожен зафіксований виклик інструмента за завершений цикл діалогу. Цей лічильник у відповіді не враховує множники кредитів для моделей/контексту і не повинен використовуватися як бухгалтерський реєстр білінгу. Для перевірки споживання облікового запису використовуйте статистику Management API та перегляньте кредити на повідомлення.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.reset- скинути накопичений для поточної відповіді текст і почати збір фрагментів наново. Це може статися під час перезапуску генерації; об'єднання обох версій призвело б до показу продубльованої або застарілої відповіді.message.delta- фрагмент вмісту{ "content": "..." }. Кілька таких подій надходять у міру прибуття токенів.action- виконання інструмента{ "type", "name", "status": "executing" }. Відправляється, коли бот ініціює виклик функції.message.done- фінальна подія з полямиconversationId,model,usageта (за наявності) списком завершених дійactions.error- надсилається в разі помилки генерації; після цього потік завершується.
Під час тривалої генерації кожні 15 секунд надсилаються коментарі 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 тощо).
Параметри запиту
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.
Заголовки лімітів запитів
Відповіді, які доходять до етапу перевірки лімітів (тобто після успішної автентифікації та проходження білого списку 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, коли стане доступним наступний токен (це не повне скидання ліміту; кошик поповнюється безперервно). Якщо кошик заповнений, показується поточний час.
У відповідях 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)415 invalid_request_error- непідтримуваний тип вмісту (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.