Перейти к основному содержимому

Вебхук после звонка

Эта инструкция поможет настроить автоматическую отправку данных после каждого звонка в любую внешнюю систему: свою CRM, базу данных, аналитику или любой другой сервис с API.


Что умеет интеграция

После каждого звонка система может:

  • Отправить данные на указанный URL в формате JSON.
  • Заполнить любые поля из разговора — ИИ сам «вытащит» нужное из транскрипта по вашей схеме.
  • Передать контекст о звонке: номер телефона, длительность, статус, исход и другие данные.

Интеграция универсальна: подходит для любой системы, у которой есть HTTP-endpoint для приёма данных.


Отправка только заинтересованных диалогов

Опция «Отправлять только заинтересованные диалоги»:

  • Включено (по умолчанию) — данные уйдут только по тем звонкам, которые система пометила как «Заинтересован». Остальные звонки не отправляются.
  • Выключено — данные отправляются после каждого завершённого звонка, независимо от результата.

Для холодных обзвонов рекомендуется оставить включённым, чтобы не засорять систему незаинтересованными контактами.


URL для исходящего вебхука

В поле «URL для исходящего вебхука» укажите адрес, на который система будет отправлять данные — например:

https://your_crm.com/api/v1/create_new_client

Запрос будет отправлен методом POST с телом в формате JSON. Если URL недоступен или возвращает ошибку — отправка не повторяется.


Схема запроса

В поле «Схема запроса для вебхука» вы описываете, какие данные нужно извлечь из разговора и отправить. Это одновременно и «задание для ИИ», и шаблон финального JSON.

Есть несколько способов описать схему — используйте тот, который удобнее.

Способ 1: пример payload (самый простой)

Укажите JSON с примерами значений. ИИ поймёт типы полей из примеров и заполнит их из разговора:

{
"phone": "79991234567",
"clientName": "Иван",
"callSummary": "Краткое описание звонка"
}

Способ 2: словарь поле → описание

Укажите JSON, где ключ — имя поля, значение — описание для ИИ:

{
"phone": "Номер телефона клиента",
"clientName": "Имя клиента",
"callSummary": "Краткое резюме разговора"
}

Способ 3: формат «поле — описание» (одно поле на строку)

Минималистичный текстовый формат — каждая строка содержит имя поля и описание через -:

phone - Номер телефона клиента
clientName - Имя клиента
callSummary - Краткое резюме разговора

Способ 4: полная JSON Schema

Для максимального контроля над типами данных:

{
"type": "object",
"properties": {
"phone": {
"type": "string",
"description": "Номер телефона клиента"
},
"clientName": {
"type": ["string", "null"],
"description": "Имя клиента"
},
"callSummary": {
"type": "string",
"description": "Краткое резюме звонка"
}
},
"required": ["phone", "clientName", "callSummary"],
"additionalProperties": false
}

Типы полей: "string" — текст, "integer" — целое число, "number" — дробное число, "boolean" — да/нет, ["string", "null"] — текст или пустое значение.

Важно: имена полей в схеме должны содержать только буквы, цифры и знак подчёркивания (_). Пробелы и дефисы не поддерживаются.


Инструкции для ИИ

В поле «Инструкции для ИИ» вы можете дать дополнительные правила — как заполнять поля, что делать при отсутствии данных, в каком формате записывать значения.

Примеры инструкций:

Если email не назван — установить null.
Бюджет указывай только числом, без знаков валюты.
Поле source всегда заполнять значением "ai_calls".

Эти инструкции передаются ИИ вместе со схемой. Если поле не заполнено — ИИ по умолчанию ставит null для отсутствующих данных.


Что ИИ знает при заполнении схемы

ИИ получает три источника контекста:

  1. Транскрипт звонка — полный текст разговора.
  2. Данные контакта — поля карточки контакта из вашей системы (если заполнены).
  3. Данные звонка — номера телефонов, длительность, время начала и конца, тип звонка, исход (action_status), статус.

Это означает, что в схему можно включить любое из этих полей — ИИ заполнит их из данных звонка, не только из транскрипта.

ПолеОписаниеВозможные значения
from_numberНомер, с которого звонилистрока
to_numberНомер, на который звонилистрока
call_durationДлительность разговора в секундахчисло
start_timeВремя начала звонка (ISO 8601)строка
end_timeВремя окончания звонка (ISO 8601)строка
call_typeТип звонкаoutbound (исходящий), inbound (входящий)
action_statusИсход звонка, определённый ИИinterested — заинтересован; transferred — переведён на оператора; scheduled — запланирован повторный звонок; null — исход не определён
statusТехнический статус звонкаnew, in progress, finished, failed, busy_or_rejected, invalid number, insufficient funds, rejected, terminated, unavailable, voicemail
call_dataДополнительные данные звонка из вашей системыобъект (если заполнен)

Пример: поставить метку по исходу звонка

Если в схеме есть поле lead_status и в инструкциях написано:

Если action_status в данных звонка равен "interested" — поле lead_status = "hot", иначе "cold".

ИИ корректно заполнит это поле на основе фактического исхода звонка.


Пример: полная настройка для CRM

Ниже — рабочий пример конфигурации для интеграции с CRM, где нужно передавать данные контакта, результат звонка, транскрипт и ряд дополнительных признаков.

В этом примере используется следующий подход:

  • Схема запроса — JSON с примерами значений. Система определяет по ним структуру и типы полей.
  • Инструкции для ИИ — содержат одновременно описания каждого поля и правила заполнения.

Схема запроса

{
"inn": "123456789012",
"name": "Евгений",
"phone": "79999999999",
"result": "успех",
"summary": "Клиент согласился связаться",
"messenger": "WhatsApp",
"easyToSay": "yes",
"callByName": "no",
"transcription": "ai: Добрый день, контакт: Ало",
"call_link": "https://example.com/record/123"
}

Инструкции для ИИ

Обязательные поля:
- inn: ИНН из детали контакта
- name: имя контакта из детали контакта
- phone: номер телефона контакта
- result: результат звонка. Одно из: "успех", "отказ", "не дозвонились"
- easyToSay: удобно ли говорить. Одно из: "yes", "no", или пустая строка если абонент не ответил
- callByName: ai произносил имя контакта (из поля name) в разговоре или нет. Смотри только реплики "ai:" в транскрипции — если там есть обращение по имени (например "Здравствуйте, Руслан!"), ставь "yes", иначе "no". Одно из: "yes", "no"
- summary: ключевая фраза клиента, максимум два предложения, без домыслов
- messenger: мессенджер только если точно слышишь от собеседника. Одно из: "WhatsApp", "Telegram", иначе пустая строка
- transcription: полный текст транскрипции разговора из контекста
- call_link: оставляй пустым

Правила:
- Если ai выявил заинтересованность и согласие на встречу и по статусу звонка (status в данных звонка) finished, ставь result = "успех"
- Если контакт явно отказался, неинтересно, уже работает с другими или сбросил звонок ставь result = "отказ"
- Если контакт не ответил, голосовая почта, недоступен, номер не ответил или по статусу звонка (status в данных звонка) не finished, ставь result = "не дозвонились"
- Если абонент ответил и подтвердил, что удобно говорить, ставь easyToSay = "yes"
- Если абонент ответил и сказал, что неудобно или сразу положил трубку, ставь easyToSay = "no"
- Если абонент не ответил (недоступен, голосовая почта, не взял трубку), easyToSay оставляй пустым
- callByName = "yes" только если в транскрипции в репликах ai есть имя контакта (из name). Например: "ai: Здравствуйте, Руслан!" или "ai: Руслан, удобно поговорить?"
- Если ai не обращался по имени (только "Здравствуйте!", "Удобно поговорить?" и т.п.), ставь callByName = "no"
- easyToSay и callByName передавай при любом result, если информация доступна
- При result = "отказ" всё равно передавай easyToSay, callByName, inn, name, phone, result, summary, messenger, transcription
- В summary — только фактический смысл сказанного клиентом. При голосовой почте — "Абонент не ответил на звонок."
- Услышал вотсап/ватсап — ставь messenger = "WhatsApp"
- Услышал телеграм/телеграмма — ставь messenger = "Telegram"
- Во всех остальных случаях messenger оставляй пустым
- При обрывах, частичной транскрипции, неразборчивой речи вебхук всё равно отправляй, заполняй все поля по мере возможности
- Не придумывай ответы за контакта, используй только указанные значения строк
- Если данных нет или одна–две фразы: easyToSay, callByName, inn, name, phone, result передавай; summary и messenger оставь пустыми; transcription заполняй из транскрипта

Что делать, если что-то не работает

Что происходитЧто проверить
Данные не отправляютсяПроверьте, что поле «URL для исходящего вебхука» заполнено. Убедитесь, что URL доступен снаружи и принимает POST-запросы с телом в JSON.
Поля приходят пустыми или все nullУбедитесь, что описания полей в схеме понятны: ИИ ориентируется на текст описания, чтобы понять, что искать в разговоре.
Ошибка схемыСхема должна описывать объект. Проверьте валидность JSON (если используете JSON-формат). Имена полей — только буквы, цифры, подчёркивание.
Данные отправляются не после каждого звонкаВключена опция «Отправлять только заинтересованные диалоги». Если нужны все звонки — выключите её.
Данные уходят, но принимающая сторона возвращает ошибкуСверьте имена и типы полей в схеме с тем, что ожидает ваш API. Используйте полную JSON Schema для точного контроля типов.

Если проблема не решается — сохраните текст ошибки и обратитесь в поддержку, указав URL вебхука и схему запроса.