WebSocket-уведомления
WebSocket подходит для интерфейсов, которым нужно узнавать о событиях сразу. В отличие от вебхуков, событие несёт объекты целиком.
Подключение — к тому же адресу, что и API, по схеме wss://. Обмен идёт бинарными кадрами; текстовые кадры игнорируются.
Формат кадра
Кадр — заголовок из 16 байт и необязательное тело в JSON. Многобайтовые числа — big-endian.
| Смещение | Размер | Поле | Описание |
|---|---|---|---|
| 0 | 2 | opcode | Тип сообщения |
| 2 | 1 | version | Версия протокола, сейчас 1 |
| 3 | 1 | flags | Бит 0 — ответ на запрос, бит 1 — ошибка |
| 4 | 4 | messageId | Связывает ответ с запросом |
| 8 | 4 | length | Длина тела в байтах |
| 12 | 4 | — | Зарезервировано, нули |
opcode | Название | Кто отправляет | Тело |
|---|---|---|---|
0x0001 | HELLO | Клиент, сервер отвечает | Запрос: { "amocrmId": 31245678 }. Ответ: { "ok": true, "subscribed": true } |
0x0010 | EVENT | Сервер | Событие |
0x00ff | ERROR | Сервер | { "error": "Failed to read a frame" } — кадр не удалось разобрать |
Подписка
После подключения отправьте HELLO с amocrmId. Сервер ответит кадром HELLO с тем же messageId и subscribed: true и начнёт присылать события этого аккаунта. Без HELLO соединение остаётся открытым, но событий не получает.
const socket = new WebSocket("wss://{host}");
socket.binaryType = "arraybuffer";
const encodeFrame = (opcode, messageId, payload) => {
const body = new TextEncoder().encode(JSON.stringify(payload));
const frame = new Uint8Array(16 + body.length);
const view = new DataView(frame.buffer);
view.setUint16(0, opcode);
view.setUint8(2, 1);
view.setUint8(3, 0);
view.setUint32(4, messageId);
view.setUint32(8, body.length);
frame.set(body, 16);
return frame;
};
socket.onopen = () => socket.send(encodeFrame(0x0001, 1, { amocrmId: 31245678 }));
socket.onmessage = ({ data }) => {
const view = new DataView(data);
const opcode = view.getUint16(0);
const length = view.getUint32(8);
const payload = length ? JSON.parse(new TextDecoder().decode(new Uint8Array(data, 16, length))) : null;
if (opcode === 0x0010) console.log(payload.event, payload.data);
};
События WebSocket
| Событие | Когда | Поле data | Как включить |
|---|---|---|---|
audio-transcribed | Звонок расшифрован | call, transcription | notifyOnTranscription: true в настройках расшифровки |
scenario-processed | Сценарий выполнен | scenario, analyse, call | notifyOnFinish: true у сценария |
По умолчанию оба события выключены. На вебхуки эти флаги не влияют.
{
"event": "audio-transcribed",
"amocrmId": 31245678,
"occurredAt": "2026-10-19T11:05:12.186Z",
"data": {
"call": { "id": "245581", "amocrm_id": 31245678, "phone": "79001234567", "duration": 52 },
"transcription": { "id": "4210", "call_id": "245581", "text": "Добрый день…" }
}
}
Объекты в data приходят целиком в формате v1 (в примере сокращены): звонок, расшифровка, сценарий, результат.