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

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

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


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

После завершения звонка система может:

  • Отправить данные на указанный URL — методом POST или PUT, в JSON body или URL params.
  • Заполнить любые поля из разговора — ИИ извлекает значения из транскрипта по вашей схеме.
  • Передать контекст о звонке и контакте: номера, длительность, статус, исход, доп. поля карточки.
  • Авторизоваться на принимающей стороне — Basic, Bearer или API Key.
  • Подставлять переменные в URL и инструкции — {{contact_data.*}}, {{call.*}}.
  • Дождаться URL записи — до 20 сек, если в инструкциях используется {{call.record_url}}.
  • Фильтровать отправку — только заинтересованные диалоги и/или выбранные статусы звонка.

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


Подключение: пошаговая настройка​

Шаг 1. Открыть раздел интеграций​

  1. В меню слева откройте «Интеграции».
  2. Нажмите «+ Добавить интеграцию».
Раздел «Интеграции» и кнопка «Добавить интеграцию»

Шаг 2. Выбрать шаблон​

В каталоге выберите карточку «Вебхук после звонка» (категория AI Tuning) и нажмите «Далее».

Выбор интеграции «Вебхук после звонка» в каталоге

Шаг 3. Название, URL, авторизация и безопасность​

  1. Укажите название интеграции — произвольное, для вашего удобства.
Название интеграции «Вебхук после звонка»
  1. В «URL для исходящего вебхука» укажите адрес вашего API, например:

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

    В URL можно использовать переменные {{contact_data.*}}, {{call.*}} (см. ниже).

  2. Выберите «Аутентификация» — без авторизации, Basic, Bearer или API Key. После выбора типа появятся поля для учётных данных.

Выбор типа аутентификации вебхука
  1. Выберите HTTP метод — POST (по умолчанию) или PUT.

  2. В «Разрешённые хосты» укажите домены через запятую (webhook.site, api.example.com). Домен должен совпадать с хостом из URL. Если поле пустое — используется хост из URL. localhost и private IP блокируются.

HTTP метод и разрешённые хосты
warning

Не публикуйте токены и пароли в открытых репозиториях. Храните секреты только в настройках интеграции.

Шаг 4. Схема запроса и параметры отправки​

  1. Задайте таймаут (по умолчанию 30 сек) и формат отправки — JSON body или URL params.
  2. В «Схема запроса для вебхука» опишите JSON, который нужно отправить (см. раздел «Схема запроса»). Поддерживаются полная JSON Schema, пример JSON или словарь «поле → описание».
Таймаут, формат отправки и схема запроса для вебхука

Шаг 5. Инструкции для ИИ​

В блоке «Инструкции для заполнения полей» для каждого поля из схемы укажите правило для ИИ:

  • «+ Добавить поле» — добавить строку вручную;
  • «Подтянуть из схемы» — автоматически создать строки по полям JSON Schema;
  • кнопка — вставить переменную из звонка или контакта.

Слева — ключ поля из схемы, справа — инструкция: откуда брать значение и в каком формате записывать.

Таблица инструкци�й для заполнения полей Вставка переменных call и contact_data через кнопку { }

При необходимости переключитесь в «Экспертный режим (текст)» — правила редактируются одним текстовым блоком.

Экспертный режим редактирования инструкций для ИИ

Шаг 6. Фильтры, кампания и сохранение​

  1. «Отправлять только заинтересованные диалоги» — Да (по умолчанию) отправляет webhook только по заинтересованным звонкам; Нет — по каждому завершённому.
Фильтр «Отправлять только заинтересованные диалоги»
  1. «Отправлять при статусах звонка» — оставьте «Все статусы» или выберите конкретные (например, только «Завершён»).
  2. Выберите кампанию(и) и нажмите «Создать интеграцию».
Фильтр по статусам звонка и выбор кампании

Все настройки интеграции​

Поле в интерфейсеОбязательноеПо умолчаниюОписание
URL для исходящего вебхукада—Адрес, на который отправляются данные
АутентификациянетБез авторизацииБез авторизации, Basic, Bearer или API Key
Basic: логиннет—Логин для Basic Auth
Basic: парольнет—Пароль для Basic Auth
Bearer tokenнет—Токен для Bearer
API Keyнет—Ключ для заголовка
API Key: имя заголовканетX-API-KEYИмя заголовка для API Key
HTTP методнетPOSTPOST или PUT
Разрешённые хостынетхост из URLДомены через запятую (защита от SSRF)
Таймаут (сек)нет301–120 сек; время ожидания ответа вашего API
Формат отправкинетJSON bodyJSON body или URL params
Схема запроса для вебхукада—JSON Schema или пример JSON
Инструкции для ИИнет—Правила заполнения полей схемы
Отправлять только заинтересованные диалогинетДаТолько звонки с исходом «Заинтересован»
Отправлять при статусах звонканетВсе статусыПусто — любой завершённый звонок

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

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

  • Да (по умолчанию) — webhook срабатывает только если система пометила звонок как «Заинтересован» (action_status = interested). Остальные звонки не отправляются.
  • Нет — данные отправляются после каждого завершённого звонка, независимо от исхода.

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


Фильтр по статусу звонка​

Поле «Отправлять при статусах звонка» ограничивает, при каком результате звонка уходит webhook:

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

Доступные статусы в интерфейсе:

В интерфейсеКогда бывает
ЗавершёнРазговор состоялся и завершён
НеудачноОшибка при звонке
Занят или отклонёнЗанято или абонент сбросил
Неверный номерНекорректный номер
ОтклонёнЗвонок отклонён
ПрерваноЗвонок прерван
НедоступенАбонент недоступен
Голосовая почтаОтветила голосовая почта

Примеры:

  • CRM — только состоявшиеся разговоры: выберите «Завершён».
  • Аналитика недозвонов: «Недоступен», «Голосовая почта», «Занят или отклонён».

Фильтры «заинтересованные» и «статусы» работают вместе — оба условия должны выполниться.


Аутентификация​

Учётные данные не выдаёт Salesbot — их нужно получить у сервиса, который принимает webhook (ваша CRM, backend, API-gateway). Salesbot только сохраняет их в интеграции и подставляет в исходящий запрос.

Где взять:

  1. Документация вашего API — раздел «Authentication», «API keys», «Webhooks».
  2. Личный кабинет / админка сервиса — часто там создают API-ключ или токен.
  3. Разработчик вашего backend — если endpoint свой.

Перед настройкой уточните у принимающей стороны тип авторизации и имя заголовка (для API Key часто X-API-KEY, X-Api-Key, Api-Key — зависит от сервиса).

В интеграции выбирается один тип из поля «Аутентификация».

Без авторизации​

Если endpoint публичный (например, тестовый webhook.site) — оставьте «Без авторизации».

Basic Auth​

Authorization: Basic <base64(login:password)>

Логин и пароль — те же, что требует ваш API для Basic-авторизации. Заполните Basic: логин и Basic: пароль.

Bearer Token​

Authorization: Bearer <token>

Токен выдаёт принимающий сервис (личный кабинет, API keys, OAuth — как у вашего провайдера). Вставьте его в Bearer token.

API Key​

X-API-KEY: <key>

Ключ создаётся не в Salesbot, а там, куда вы указали URL для исходящего вебхука:

Куда уходит webhookГде взять API Key
Свой backend / APIЗадаёте сами при разработке endpoint'а (переменная окружения, секрет в конфиге сервера). Передайте тот же ключ в интеграцию.
CRM или SaaS (Bitrix, amoCRM, n8n, Make и т.п.)В админке или документации сервиса — раздел «API keys», «Webhooks», «Integrations».
Публичный тест (webhook.site и аналоги)Обычно ключ не нужен — выберите «Без авторизации».

В Salesbot вы только вставляете уже готовый ключ:

  1. Скопируйте ключ из сервиса-получателя (или сгенерируйте у себя на сервере).
  2. Вставьте в поле API Key в интеграции.
  3. В API Key: имя заголовка — имя из документации API (по умолчанию X-API-KEY). Если сервис ждёт токен в Authorization: Bearer … — выберите тип Bearer, а не API Key.
Проверка

Если не уверены в типе авторизации — попробуйте отправить тестовый запрос из Postman/curl с теми же заголовками. Когда запрос проходит — те же значения укажите в интеграции.


Формат отправки​

JSON body (по умолчанию)​

saveDataUseUrlParams = false

POST /api/v1/create_new_client HTTP/1.1
Host: your_crm.com
Content-Type: application/json
Authorization: Bearer <token>

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

URL params​

saveDataUseUrlParams = true

POST /webhook?phone=79991234567&clientName=Иван&callSummary=... HTTP/1.1
Host: old-api.com

Подходит для legacy-endpoint'ов, которые принимают параметры в query string.

Ограничения HTTP-запроса:

  • Поддерживаются только URL со схемой http / https.
  • Редиректы (3xx) не следуют и считаются ошибкой.
  • Успех — код 2xx и отсутствие полей error / errors в JSON-ответе (если тело — JSON).
  • Повторная отправка при ошибке не выполняется.

Плейсхолдеры в URL и инструкциях​

В URL вебхука и инструкциях для ИИ можно использовать переменные — система подставит актуальные значения перед отправкой.

ПеременнаяЧто подставится
{{contact_data.<поле>}}Значение из доп. данных контакта
{{contact.id}}, {{contact.phone_number}}ID и телефон контакта
{{call.id}}, {{call.from_number}}, {{call.to_number}}ID и номера звонка
{{call.status}}, {{call.action_status}}Статус и исход звонка
{{call.call_duration}}, {{call.start_time}}, {{call.end_time}}Длительность и время
{{call.record_url}}Ссылка на запись разговора

Вставить переменную можно кнопкой рядом с полем в форме.


URL записи звонка​

Если в схеме есть поле record_url, call_link или recording_url, система заполнит его ссылкой на запись автоматически, без участия ИИ.

Если в инструкциях для ИИ указана переменная {{call.record_url}}, а запись ещё не готова, отправка webhook подождёт до 20 секунд. Если за это время ссылка не появится — webhook уйдёт без неё.


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

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

Поддерживаются несколько форматов — используйте удобный.

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

JSON с примерами значений. Система определит типы полей автоматически:

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

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

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

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

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

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

Для максимального контроля над типами, enum и вложенными объектами (как в интеграции Bitrix24):

{
"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"] — текст или пустое значение.

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


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

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

Примеры правил для полей:

phone — номер из доп. данных контакта
result — одно из: "успех", "отказ", "не дозвонились"
deal_id — взять из {{contact_data.bitrix24_deal_id}}, если заполнено

Если данных в разговоре нет — ИИ оставит поле пустым (null). Без транскрипта webhook не отправляется.


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

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

  1. Транскрипт звонка — полный текст разговора.
  2. Данные контакта — поля карточки контакта (если заполнены).
  3. Данные звонка — номера, длительность, время, тип, исход, статус.
ПолеОписаниеВозможные значения
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
record_urlURL записи разговорастрока (если запись готова)
call_dataДоп. данные звонка из вашей системыобъект (если заполнен)

Пример: в инструкциях указать:

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

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


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

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

Основные параметры​

ПараметрЗначение
URLhttps://your_crm.com/api/v1/leads
АутентификацияBearer
HTTP методPOST
ФорматJSON body
Только заинтересованныеДа
Статусы«Завершён»

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

{
"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: заполняется системой из URL записи звонка (не через ИИ)

Правила:
- Если 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 заполняй из транскрипта

Как работает отправка​

  1. Звонок завершается → проверяются фильтры по интересу и статусу.
  2. При необходимости система ждёт ссылку на запись (до 20 сек).
  3. ИИ заполняет JSON по схеме и инструкциям на основе транскрипта, данных контакта и звонка.
  4. Ссылка на запись подставляется в поля record_url, call_link, recording_url — если они есть в схеме.
  5. Данные отправляются HTTP-запросом на указанный URL.
  6. При ошибке повтор не выполняется.

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

Что происходитЧто проверить
Данные не отправляютсяЗаполнен URL. URL доступен снаружи. Не срабатывают фильтры. Есть транскрипт (пустой — отправки не будет).
Поля приходят пустыми или все nullОписания полей в схеме/инструкциях понятны.
call_link / record_url пустойЗапись ещё не готова — подождите или укажите в инструкциях переменную {{call.record_url}}.
Ошибка схемыСхема описывает объект. JSON валиден. Имена полей — только буквы, цифры, подчёркивание.
Данные отправляются не после каждого звонкаВключена опция «Только заинтересованные» или выбраны ограничивающие статусы.
401 / 403 от вашего APIКлюч/токен взят из принимающего сервиса (не из Salesbot). Совпадают тип авторизации, имя заголовка (для API Key) и сами учётные данные.
Запрос не доходит до APIРазрешённые хосты совпадают с доменом из URL. Не localhost / private IP.
Ответ 3xx RedirectРедиректы не поддерживаются — укажите финальный URL без redirect.
Данные уходят, но API возвращает ошибкуИмена и типы полей совпадают с ожиданиями API.
TimeoutУвеличьте таймаут (до 120 сек) или ускорьте ответ API.

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


Частые вопросы​

Можно ли отправлять данные после каждого звонка, включая недозвоны?​

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

Поддерживается ли PUT вместо POST?​

Да — выберите HTTP метод = PUT в настройках интеграции.

Как передать API-ключ не в Authorization?​

Выберите Аутентификация = API Key и укажите имя заголовка (например, X-Custom-Key).

Повторяется ли отправка при ошибке?​

Нет. Webhook отправляется один раз после звонка. При ошибке на стороне вашего API нужно обрабатывать повтор на своей стороне или вручную.

Можно ли отправить данные в legacy-систему с query-параметрами?​

Да — выберите Формат отправки = URL params.

Как передать URL записи в webhook?​

Добавьте в схему поле call_link, record_url или recording_url — система подставит ссылку на запись автоматически. Если запись появляется с задержкой, укажите в инструкциях переменную {{call.record_url}} — отправка подождёт до 20 секунд.