API

Вебхуки

Обновлено 28 сентября 2026 г.5 мин чтения

Вебхук — это мостик между Chato и вашей программой: сайтом, складом, 1С, CRM. Он работает в обе стороны, и стороны независимы: можно включить только одну.

  • Исходящий — Chato сам стучится к вам, когда что-то произошло, и спрашивает вас во время разговора с клиентом.
  • Входящий — ваша программа стучится в Chato: пишет клиенту, зовёт менеджера, правит карточку, читает переписку.

Настраивается в кабинете: ИИ-ассистент → Подключения → Вебхук.

Исходящий: события на ваш адрес

Впишите адрес (только https), при желании секрет для подписи и свои заголовки — обычно это ключ доступа к вашей программе. Затем отметьте, о чём вам сообщать:

Событие Когда приходит
message.received клиент написал
message.sent клиенту ответили — ассистент или оператор
conversation.created первое сообщение в новом диалоге
conversation.handoff диалог передан менеджеру
conversation.assigned оператор взял диалог
conversation.reopened диалог вернули в работу
conversation.closed диалог закрыт
channel.disconnected канал отключился

Chato отправляет POST с телом такого вида:

{
  "workspaceId": "cmr4sk0ya0001o701hl7ghbqk",
  "event": "message.received",
  "sentAt": "2026-09-08T10:00:00.000Z",
  "data": {
    "conversationId": "cmt9x1a2b0003o701abcd1234",
    "channelId": "cmt9x0zzz0001o701wxyz9876",
    "messageId": "cmt9x2c3d0005o701efgh5678",
    "direction": "INBOUND",
    "type": "TEXT",
    "text": "Здравствуйте, заказ готов?",
    "sentAt": "2026-09-08T10:00:00.000Z",
    "isFirstMessage": false
  }
}

Отвечайте кодом 200 — тело ответа Chato не разбирает. Если ваш сервер молчит или отвечает ошибкой, разговор с клиентом это не задерживает: событие просто не доставлено, запись об этом остаётся в наших логах.

Подпись запроса

Если задан секрет, Chato кладёт в заголовок x-chato-signature HMAC-SHA256 от тела запроса, шестнадцатеричной строкой. Проверьте её у себя — так вы отличите наш запрос от чужого:

const crypto = require('node:crypto');
const expected = crypto.createHmac('sha256', SECRET).update(rawBody).digest('hex');
const ok = expected === req.headers['x-chato-signature'];

Считайте подпись по сырому телу запроса, до разбора JSON: пересобранный объект даёт другую строку байтов, и подпись не сойдётся.

Вызов вашей программы из разговора

Тот же адрес используется, когда ассистент на шаге «Вызвать функцию» спрашивает вашу программу — «есть ли красный в 42-м размере». Тело: workspaceId, conversationId, sentAt и data с тем, что собрал ассистент. Что вы ответите — то он и скажет клиенту своими словами, поэтому отвечайте коротким понятным JSON.

Входящая ссылка: ваша программа действует в диалоге

Нажмите Создать ссылку и передайте её программисту. Она выглядит так:

POST https://chato.kz/api/v1/ai-assistant/inbound/ВАШ_КЛЮЧ
Content-Type: application/json

Ключ в ссылке — единственная её защита. Кто знает ссылку, тот может писать вашим клиентам. Не публикуйте её и не кладите в код, который видят посторонние. Если ссылка утекла — нажмите «Сменить ключ», старая перестанет работать сразу.

Диалог указывается либо своим conversationId, либо телефоном клиента: номер принимается в любом виде — +7 771 525 89 15, 87715258915.

Написать клиенту

curl -X POST https://chato.kz/api/v1/ai-assistant/inbound/ВАШ_КЛЮЧ \
  -H 'Content-Type: application/json' \
  -d '{"phone":"+7 771 525 89 15","text":"Заказ собран, ждём вас до 19:00"}'

Ответ: {"status":"sent","conversationId":"..."}.

Приложить файл

{
  "phone": "77715258915",
  "text": "Ваш счёт",
  "fileUrl": "https://ваш-сервис.kz/schet-2026-09.pdf",
  "fileName": "Счёт за сентябрь.pdf"
}

Файл берётся по ссылке (только https, до 20 МБ) и уходит клиенту вложением. text при этом необязателен.

Написать первым

Если диалога с этим человеком ещё нет, добавьте channelId — из какого канала писать:

{ "phone": "77715258915", "channelId": "cmt9x0zzz0001o701wxyz9876", "text": "Здравствуйте!" }

Без channelId незнакомому номеру ничего не уходит — иначе утёкшая ссылка превратилась бы в рассылку.

Остальные действия

Все они отправляются на тот же адрес, отличается только поле action.

action Что делает Что передать
message написать клиенту (по умолчанию) text и/или fileUrl
note пометка оператору text
handoff передать менеджеру text — причина
close закрыть диалог —
reopen вернуть в работу —
assign назначить сотрудника operatorEmail
contact.update поправить карточку contact
contact.get прочитать карточку —
messages.list последние сообщения limit
conversations.list список диалогов status, limit
deal.create создать сделку deal (поля как в API), contact или phone
deal.move перенести сделку в этап dealId, stageId, для «Отказа» — lossReasonId
deal.note примечание к сделке dealId, text

Пояснения к полям: text — текст (для note это пометка, для handoff — причина, необязательна); contact — объект { name, phone }, меняется только присланное; limit — от 1 до 100, по умолчанию 20; status — OPEN, WAITING, IN_PROGRESS или CLOSED. После reopen ассистент снова отвечает в диалоге.

Пример — передать диалог человеку:

{ "action": "handoff", "conversationId": "cmt9x1a2b0003o701abcd1234", "text": "клиент просит менеджера" }

Пример — узнать, кто это и что с диалогом:

{ "action": "contact.get", "phone": "77715258915" }
{
  "status": "ok",
  "conversationId": "cmt9x1a2b0003o701abcd1234",
  "contact": { "id": "...", "name": "Асем", "phone": "77715258915", "username": null },
  "conversation": { "id": "...", "status": "OPEN", "channelId": "...", "unreadCount": 2 }
}

conversations.list — единственное действие, которому диалог не нужен: им как раз находят нужный, когда идентификатора нет.

Что вернётся при ошибке

Код Что случилось
404 неизвестный ключ, либо диалог/канал/сотрудник не найден в вашей компании
400 пустой текст, незнакомое action, слишком короткий номер, файл больше 20 МБ
429 слишком часто — на ссылку действует ограничение 60 запросов в минуту

Ключ всегда работает только в пределах вашей компании: чужой conversationId в теле запроса ничего не даст.

Проверить связку проще всего так: создайте ссылку, отправьте contact.get по своему же номеру и убедитесь, что вернулась ваша карточка. Это ничего не меняет и не пишет клиенту.

Сделки и вебхуки CRM

Для своей CRM есть отдельные адреса вебхуков: с выбором событий сделок (deal.created, deal.won, task.completed и другие), подписью HMAC-SHA256 с меткой времени, повторами при ошибках, журналом доставок и кнопкой «Отправить ещё раз». Там же — ключи открытого API с правами. Всё это описано в статье Открытый API сделок и вебхуки CRM; адрес ассистента, описанный выше, продолжает работать как раньше.