POST /v1/iframe — встраивание чата WazzaBee
Этот эндпоинт позволяет встроить чат WazzaBee в вашу CRM-систему или любое веб-приложение через <iframe>. Идеально подходит для кастомных CRM на React, Vue, Angular или любом другом фреймворке.
💡 Как это работает:
- Ваш бэкенд запрашивает iframe-сессию через API
- API возвращает URL для встраивания
- Ваш фронтенд показывает
<iframe>с этим URL - Пользователь видит полноценный чат WazzaBee внутри вашего приложения
URL
POST https://api.wazzabee.com/api-gateway/v1/iframe
Заголовки
Authorization: Bearer ВАШ_API_КЛЮЧ
Content-Type: application/json
Параметры тела запроса
| Параметр | Тип | Обязательный | Описание |
|---|---|---|---|
user | object | ✅ Да | Информация о пользователе вашей CRM |
user.id | string | ✅ Да | Идентификатор пользователя в вашей CRM-системе |
user.name | string | Нет | Имя пользователя (для отображения) |
scope | string | Нет | Режим отображения: global (все чаты) или card (чат конкретного контакта). По умолчанию: global |
filter | object | Условно | Фильтры для scope=card. Обязателен при scope=card |
filter.phone | string | — | Номер телефона контакта для фильтрации |
filter.channelIds | array | — | Ограничить показ определёнными каналами |
activeChat | object | Нет | Открыть конкретный чат сразу при загрузке |
options | object | Нет | Дополнительные настройки отображения |
Режимы отображения (scope)
global — все чаты
Показывает полный список диалогов, как в основном интерфейсе WazzaBee. Подходит для отдельной страницы «Чаты» в вашей CRM.
card — чат конкретного контакта
Фильтрует диалоги по телефону контакта. Идеально для встраивания в карточку клиента — менеджер видит только переписку с этим клиентом.
Примеры запросов
Пример 1. Все чаты (scope=global)
curl -X POST "https://api.wazzabee.com/api-gateway/v1/iframe" \
-H "Authorization: Bearer ВАШ_API_КЛЮЧ" \
-H "Content-Type: application/json" \
-d '{
"user": {
"id": "manager-42",
"name": "Алексей Менеджер"
},
"scope": "global"
}'
Пример 2. Чат конкретного клиента (scope=card)
curl -X POST "https://api.wazzabee.com/api-gateway/v1/iframe" \
-H "Authorization: Bearer ВАШ_API_КЛЮЧ" \
-H "Content-Type: application/json" \
-d '{
"user": {
"id": "manager-42",
"name": "Алексей Менеджер"
},
"scope": "card",
"filter": {
"phone": "77001234567"
}
}'
Пример 3. С ограничением по каналам
curl -X POST "https://api.wazzabee.com/api-gateway/v1/iframe" \
-H "Authorization: Bearer ВАШ_API_КЛЮЧ" \
-H "Content-Type: application/json" \
-d '{
"user": {
"id": "manager-42",
"name": "Алексей Менеджер"
},
"scope": "card",
"filter": {
"phone": "77001234567",
"channelIds": ["550e8400-e29b-41d4-a716-446655440000"]
}
}'
Успешный ответ (200 OK)
{
"success": true,
"url": "https://app.wazzabee.com/chat/embed/a1b2c3d4...64-символьный-токен",
"token": "a1b2c3d4...64-символьный-токен",
"expiresAt": "2026-03-13T10:00:00.000Z",
"scope": "card"
}
| Поле | Тип | Описание |
|---|---|---|
url | string | Готовый URL для вставки в <iframe src="..."> |
token | string | Токен сессии (64 символа hex) |
expiresAt | string (ISO 8601) | Время истечения сессии (24 часа от создания) |
scope | string | Выбранный режим: global или card |
Встраивание на фронтенде
Простой HTML
<iframe
src="https://app.wazzabee.com/chat/embed/ТОКЕН_СЕССИИ"
style="width: 100%; height: 600px; border: none;"
allow="clipboard-write"
></iframe>
React-компонент
import { useEffect, useState } from "react";
function WazzaBeeChat({ contactPhone }) {
const [iframeUrl, setIframeUrl] = useState(null);
useEffect(() => {
// Запрос к вашему бэкенду, который проксирует вызов к WazzaBee API
fetch("/api/wazzabee/iframe", {
method: "POST",
headers: { "Content-Type": "application/json" },
body: JSON.stringify({
phone: contactPhone,
scope: "card"
})
})
.then(res => res.json())
.then(data => setIframeUrl(data.url));
}, [contactPhone]);
if (!iframeUrl) return <div>Загрузка чата...</div>;
return (
<iframe
src={iframeUrl}
style={{ width: "100%", height: "600px", border: "none" }}
allow="clipboard-write"
/>
);
}
⚠️ Важно: Запрос к WazzaBee API (с API-ключом) должен идти через ваш бэкенд, а не напрямую из браузера клиента. API-ключ нельзя хранить на фронтенде!
События postMessage
iframe отправляет события в родительское окно через window.postMessage. Вы можете слушать их для интеграции с вашей CRM.
Доступные события
| Событие | Когда срабатывает | Данные |
|---|---|---|
WZ_READY | Чат загрузился и готов к работе | { type: "WZ_READY" } |
WZ_CHAT_OPENED | Пользователь открыл диалог | { type: "WZ_CHAT_OPENED", conversationId, contactPhone } |
WZ_MESSAGE_SENT | Пользователь отправил сообщение | { type: "WZ_MESSAGE_SENT", conversationId, text } |
WZ_CREATE_CONTACT | Запрос на создание контакта в CRM | { type: "WZ_CREATE_CONTACT", phone, name } |
Пример обработки событий
window.addEventListener("message", (event) => {
// Проверяем источник
if (event.origin !== "https://app.wazzabee.com") return;
const { type, ...data } = event.data;
switch (type) {
case "WZ_READY":
console.log("Чат WazzaBee загружен");
break;
case "WZ_CHAT_OPENED":
console.log("Открыт диалог:", data.conversationId);
// Можно обновить карточку клиента в CRM
break;
case "WZ_MESSAGE_SENT":
console.log("Отправлено сообщение:", data.text);
// Можно добавить запись в историю CRM
break;
case "WZ_CREATE_CONTACT":
console.log("Запрос на создание контакта:", data.phone);
// Можно автоматически создать контакт в вашей CRM
break;
}
});
Возможные ошибки
| Код | Ошибка | Причина |
|---|---|---|
400 | Поле user.id обязательно | Не передан идентификатор пользователя CRM |
400 | Для scope=card необходимо указать filter | Выбран режим card, но не указан фильтр |
Время жизни сессии
- Сессия действует 24 часа с момента создания
- После истечения iframe покажет ошибку — нужно запросить новый токен
- Рекомендуем обновлять токен заранее (например, каждые 12 часов)
- Для каждого пользователя CRM создаётся отдельная сессия
