WebSocket-уведомления

WebSocket подходит для интерфейсов, которым нужно узнавать о событиях сразу. В отличие от вебхуков, событие несёт объекты целиком.

Подключение — к тому же адресу, что и API, по схеме wss://. Обмен идёт бинарными кадрами; текстовые кадры игнорируются.

Формат кадра

Кадр — заголовок из 16 байт и необязательное тело в JSON. Многобайтовые числа — big-endian.

СмещениеРазмерПолеОписание
02opcodeТип сообщения
21versionВерсия протокола, сейчас 1
31flagsБит 0 — ответ на запрос, бит 1 — ошибка
44messageIdСвязывает ответ с запросом
84lengthДлина тела в байтах
124—Зарезервировано, нули
opcodeНазваниеКто отправляетТело
0x0001HELLOКлиент, сервер отвечаетЗапрос: { "amocrmId": 31245678 }. Ответ: { "ok": true, "subscribed": true }
0x0010EVENTСерверСобытие
0x00ffERRORСервер{ "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, transcriptionnotifyOnTranscription: true в настройках расшифровки
scenario-processedСценарий выполненscenario, analyse, callnotifyOnFinish: 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 (в примере сокращены): звонок, расшифровка, сценарий, результат.