Тип интеграции JSBOX обеспечивает чат на сайте: посетители отправляют сообщения, которые отображаются в панели управления Mailoo. Вы отвечаете из консоли чата; посетители видят обновления через WebSocket или поллинг.
::: {.contents local=""} :::
Концепции
- Тип интеграции:
JSBOX(создаётся в панели управления или через публичный API с API-ключом). - Сессии: Каждый поток посетителя --- это чат-сессия (непрозрачный
sessionPublicId). Первое сообщение создаёт сессию; последующие сообщения содержатsessionPublicId. - API-ключ: Обязателен для серверных вызовов к вебхукам Mailoo (ваш BFF, бэкенд или автоматизация). Никогда не размещайте API-ключ в браузерном JavaScript.
Публичный API (X-API-Key)
Ограниченные ключи могут включать:
webhook.chat-integration-create---POST /api/v1/webhooks/chat/{projectUid}/integrations(создание интеграции JSBOX).chat.send-message--- сообщения чата, история сессий и статус чата по пути/api/v1/webhooks/chat/....
Создание интеграции JSBOX
curl -X POST "https://api.mailoo.app/api/v1/webhooks/chat/proj_1/integrations" \\
-H "X-API-Key: YOUR_KEY" \\
-H "Content-Type: application/json" \\
-d '{"name":"Support chat","config":{"allowedOrigins":["https://example.com"]}}'
Отправка сообщения посетителя (привязка к проекту + интеграции):
curl -X POST "https://api.mailoo.app/api/v1/webhooks/chat/{projectUid}/{integrationId}/messages" \\
-H "X-API-Key: YOUR_KEY" \\
-H "Content-Type: application/json" \\
-H "Origin: https://your-site.com" \\
-d '{"content":"Hello","sessionPublicId":"optional-if-continuing"}'
Список сообщений сессии (для серверного/BFF-поллинга):
GET /api/v1/webhooks/chat/{projectUid}/{integrationId}/sessions/{sessionPublicId}/messages?since=ISO8601
Статус интеграции чата
GET /api/v1/webhooks/chat/{projectUid}/{integrationId}/status
Устаревший путь (только id интеграции): POST /api/v1/webhooks/messages/{integrationId} по-прежнему существует, но требует chat.send-message и интеграцию JSBOX.
Публичные chat-webhook'и делят rate limit API-ключа. При превышении Mailoo отвечает HTTP 429. Виджет @mailoo/chat классифицирует это (и сбои gateway/сети) и показывает панель недоступности вместо сырого текста API --- хост должен передать unavailableAction (см. chat-widget-nextjs-example{.interpreted-text role="doc"}).
Панель управления (Bearer JWT)
- Сессии:
GET /api/v1/chat/{integrationId}/sessions--- опциональноstatus=OPEN|PENDING|CLOSEDиassignedUserId=<userId>илиassignedUserId=unassigned. - История:
GET /api/v1/chat/{integrationId}/sessions/{sessionPublicId}/messages - Ответ владельца:
POST /api/v1/chat/{integrationId}/sessions/{sessionPublicId}/replyс JSON{"content":"..."}. - Назначение / закрытие:
PATCH /api/v1/chat/{integrationId}/sessions/{sessionPublicId}с{"assignedUserId":"<userId>"|null}(только участники проекта) или{"action":"close"}.
Статус сессии: OPEN, PENDING или CLOSED. Настройки виджета JSBOX (config.chatWidget):
- Автоответ --- первое сообщение посетителя в новой сессии отправляет
autoresponder.message; опциональныйexpectedReplyHoursставитPENDING, пока оператор не ответит. - Шаблоны ответов ---
replyTemplates(не кампании FORM); консоль вставляет их в поле ответа. - Сообщение при закрытии --- при
action: closeпосетителю уходятcloseFollowUp.messageи/илиcloseFollowUp.reviewUrl. Дальнейшие сообщения в закрытую сессию --- 409. - Опциональный ИИ-агент ---
config.chatWidget.agent(enabled,name, опциональноimageMediaId,kbIntegrationIdBlog того же проекта, markdowninstructions/kbDigestPrompt/kbArticlePrompt,kbFiles). При включении агент первым в roster команды (idjsbox_chat_agent). Mailoo API подставляет инструкции и шаблоны (плейсхолдеры{{kb_digest}},{{visitor_message}},{{article_title}},{{article_slug}},{{article_body}}) и вызывает Wednesday в фоне с дайджестом KB (только title + slug); тело статьи --- поKB_REQUEST:<slug>. Файлы KB хранятся в S3 и пока не отдаются модели. Виджет Wednesday не вызывает. Ответы --- OUTBOUNDjsbox_chat_agent,senderName= имя агента. Assign останавливает агента. Агент также может передать человекам черезHANDOFF_TO_HUMAN:(текст посетителю + brief оператору); Mailoo ставитhandedOffAt, статусPENDING, сохраняет brief как OUTBOUNDmetadata.source: jsbox_chat_agent_handoff(только dashboard) и больше не вызывает агента. НуженWEDNESDAY_BASE_URL(dev:http://127.0.0.1:4080). - MCP / настройки агента ---
GET/PATCH /api/v1/chat/{projectUid}/integrations/{integrationId}/settings(скоупchat.manageили MCP-токен) читает/обновляет тот же санитизированный config виджета и возвращает lifetime counts сообщений и сессий (без списка сессий и тел сообщений). Инструмент MCP:manage_jsbox_integration_settings(см.mailoo-mcp{.interpreted-text role="doc"}). Skill агента (минимум правил):configure-chat-mcp{.interpreted-text role="doc"}.
Веб-приложение проксирует эти маршруты через BFF по тем же путям (с авторизацией сессии).
WebSocket
На хосте Next.js с @mailoo/chat origin WebSocket в браузере --- не переменная NEXT_PUBLIC_* времени сборки: сервер определяет его во время выполнения (MAILOO_CHAT_WS_ORIGIN, иначе базовый URL чата/API --- см. getMailooChatWebSocketOrigin).
- Владелец (панель управления):
/api/v1/chat/ws?integrationId=...&token=<JWT>--- используйте тот же токен доступа, что иAuthorization: Bearer. - Посетитель:
/api/v1/chat/visitor-ws?projectUid=...&integrationId=...&sessionPublicId=...--- без API-ключа; сессия должна уже существовать (создаётся при отправке сообщения). Предпочтительнее предоставлять браузеру толькоsessionPublicIdи проводить валидацию в вашем BFF.
Архитектурные детали, полезные нагрузки событий, обратный прокси (wss) и замечания по нескольким репликам см. в chat-websocket-production{.interpreted-text role="doc"}.
Панель (карточка интеграции)
На странице интеграции JSBOX владельцы проекта используют вкладки:
- Виджет --- цвета бренда, приветственный текст, URL политики конфиденциальности, позиция лаунчера (четыре угла плюс middle-left / middle-right; по умолчанию bottom-right) и темы.
- Ответы и автоматизация --- видимость операторов, автоответчик, шаблоны ответов и follow-up при закрытии.
- ИИ Агент --- настройки владельца для
config.chatWidget.agent: тоггл, имя, опциональный аватар, Blog KB, окна markdown-инструкций и загрузка файлов KB (S3). Редакторы открывают вкладку; сохранить может только владелец. При включении агент в команде виджета и в Setup → Operators (без чекбокса). Плавающий чат mailoo.app --- та же JSBOX; dev seed включает агента с именем, Blog KB и шаблонами промптов (Wednesday +WEDNESDAY_BASE_URL). - Подключение и настройки --- библиотека изображений, API-ключи, сниппет окружения сервера и удаление. Сырой
configдоступен за кнопкой Показать JSON конфигурации (форматированный справочный диалог), а не как постоянно видимый блок.
У JSBOX нет вкладки Products/контент --- статус, число сообщений и последняя активность остаются в шапке страницы. Редакторы видят эти метрики в шапке, Подключение и настройки и вкладку ИИ Агент (тоггл выключен). Редакторы виджета/ответов остаются только у владельца.
CORS и allowedOrigins
Браузерные вызовы к вебхукам Mailoo могут отправлять заголовок Origin. При необходимости настройте разрешённые источники на интеграции JSBOX. Если список пуст, Origin не проверяется (API-ключ по-прежнему обязателен). Устаревшее поле domain в хранимой конфигурации остаётся как CORS-фоллбэк для старых записей, но больше не собирается в панели управления.
Позиция лаунчера хранится в config.chatWidget.position и отдаётся публичным widget-config. Дефолтный путь хоста (resolveMailooChatHostConfig + MailooSiteChatShell) всегда применяет её через widgetConfig. Явный проп position на MailooSiteChatWidget по-прежнему перекрывает сохранённое значение, если задан.
См. также
chat-widget-nextjs-example{.interpreted-text role="doc"} --- паттерн BFF для Next.js и переменные окруженияchat-websocket-production{.interpreted-text role="doc"} --- поведение WebSocket и заметки по продакшену- OpenAPI:
https://api.mailoo.app/docs/v1