Message Box | ||||||
---|---|---|---|---|---|---|
| ||||||
|
Информация |
---|
Вебхук приходит с 87.251.83.190 (в вайт лист лучше добавлять весь диапазон TWIN: 87.251.83.160/27) |
У хука есть 3 типа событий и отправка идет по каждому их них:
Тип события | Значение | Описание |
---|---|---|
event | CALL_REDIRECTED | Вебхук, с информацией о звонке, переведенном на оператора. Отправляется только тогда, когда в диалоге бота настроен перевод на оператора. Событие отправляется самым первым хуком, чтобы проинформировать стороннюю систему о переводе звонка в КЦ. Отправляется и для входящих и для исходящих звонков, если в сценарии настроен перевод на оператора. Если перевода не было или он не предусмотрен - событие отправляться не будет. |
event | CALL_ENDED | Вебхук, с информацией о попытке дозвона. Отправляется всегда, по итогам завершения звонка. Отправляется и для входящих и для исходящих звонков. |
event | CANDIDATE_CHANGED | Вебхук, с информацией о итоге обработки кандидата. Отправляется в качестве сигнала, что данный кандидат полностью обработан системой и больше звонков по кандидату не будет. На него можно опираться для снятия блокировки с кандидата в CRM или дайлера. Отправляется только для исходящих звонков. Для входящих событие отправляться не будет. |
Примеры кейсов и описание для них логики отправок хуков
Звонок 1 кандидату (1 номер, без перевода на оператора):
- Получаем хук CALL_ENDED
- Получаем хук CANDIDATE_CHANGED
Звонок 1 кандидату (1 номер, перевод на оператора):
- Получаем хук CALL_REDIRECTED
- Получаем хук CALL_ENDED
- Получаем хук CANDIDATE_CHANGED
Звонок 1 кандидату (2+ номеров, без перевода на оператора):
- Получаем хук CALL_ENDED
- Получаем хук CALL_ENDED
- Получаем хук CANDIDATE_CHANGED
Звонок 1 кандидату (2+ номеров, перевод на оператора):
- Получаем хук CALL_REDIRECTED
- Получаем хук CALL_ENDED
- Получаем хук CALL_REDIRECTED
- Получаем хук CALL_ENDED
- Получаем хук CANDIDATE_CHANGED
Информация |
---|
На нашей платформе реализована система гарантированной доставки хуков. Система ожидает в ответ по каждому отправленному хуку 200й код. В противном случае мы будет делать повторные отправки сообщений в течение 24 часов с увеличением интервалов повторной отправке по экспоненциальной формуле (чем больше попыток - тем больше будет интервал попыток). Меж серверное взаимодействие ожидает подтверждения в получении отправленных данных. Если вам нужен только один тип хука, вы можете отвечать 200м кодом на все остальные передачи и ничего не делать с полученными данными. Решение что обрабатывать, а что игнорировать, находится на стороне бизнес логики компании заказчика. |
Описание хука по событию «CALL«CALL_REDIRECTED» REDIRECTED» (Только для ботов с переводом на оператора)
Пример запроса:
Тело webHook в формате Json:
Блок кода | ||||||||
---|---|---|---|---|---|---|---|---|
| ||||||||
{ "event": "CALL_REDIRECTED", "id": "a9f629ab-20f0-4c11-8a82-05af87e49e43", "redirectAdditional": null, "redirectAnons": null, "redirectDestination": "ch", "redirectDestinationId": "10103", "callbackData": [] } |
Описание полей:
Поле | Тип | Обязательно | Описание | Соответствие с полем из метода старой телефонии |
---|---|---|---|---|
event | string | да | Тип события.
| - |
id | string | да | Идентификатор вызова | id |
redirectAdditional | string | да | Дополнительные данные, которые идут в SIP обмене | - |
redirectAnons | string | да | Текст сопровождения перевода, указанный в настройках бота при переводе звонка. | - |
redirectDestination | string | да | Тип перевода (настраивается в сценарии бота): ch (канал перевода) custom (произвольный перевод) int (внутренний номер, вроде не используем) | - |
redirectDestinationId | string | да | Значение конечного номера, для выбранного типа перевода (номер канала, номер произвольного перевода, внутренний номер) | - |
| callbackData | Object | да (может быть пустым) | Информация о кандидате, переданная в момент добавления кандидата (см. метод добавления кандидата) | - |
Описание хука по событию «CALL«CALL_ENDED»ENDED»
Пример запроса:
Тело webHook в формате Json:
Блок кода | ||||||||
---|---|---|---|---|---|---|---|---|
| ||||||||
{ "event": "CALL_ENDED", "type": "OUTGOING", "companyId": 5, "botId": "228cc4fa-92f2-4709-94e3-7344a96a5903", "id": "80970c2c-9b30-4f33-96a6-9f37f37009e2", "externalId": "f6d1c992-09d7-11ee-a9b5-9ae97dfae6df", "taskId": "bd5ed800-a7e1-443d-afa2-4368e4f0de61", "candidateId": "c89b04c3-fc46-4ab3-ac70-ae7de8d5617c", "status": "ANSWERED", "callFrom": "79669876543", "callTo": "79991234567", "startedAt": "2023-06-13T10:49:36+00:00", "finishedAt": "2023-06-13T10:49:38+00:00", "billedAt": "2023-06-13T10:49:55+00:00", "variables": { "age": "35", "name": "Иван Иванов" }, "result": { "initialVariables": { "phone": "79991234567", "age": "35", "name": "Иван Иванов" }, "markers": [ "Маркер 1", "Маркер 2", "Маркер 3" ], "confirmation": "Подтверждение", "nps": "NPS", "ключ_1": "его значение 1", "ключ_2": "его значение 2" }, "amd": "MACH", "recordPath": "/180/2023/6/13/1686653365.8627691_79992082892_180.mp3", "flow": [ { "botId": "228cc4fa-92f2-4709-94e3-7344a96a5903", "start": "2023-06-13 13:49:37.016654+03", "end": "2023-06-13 13:49:37.016654+03", "messages": [ { "text": "Привет и пока", "author": "BOT", "time": "2023-06-13 13:49:37.016654+03" } ] } ], "gmtOffset": 0, "hungUpBy": null, "duration": 2, "totalCost": 0.09, "robotCallDuration": 1, "robotCallTotalCost": 0.05, "mainCallCost": 1.45, "mainCallDiscount": 0, "mainCallDuration": 2, "mainCallTotalCost": 0.05, "autoCallCost": 0, "autoCallDiscount": 0, "autoCallDuration": 0, "autoCallTotalCost": 0, "robotCallCost": 2.5, "robotCallDiscount": 0, "transferCallCost": 0, "transferCallDiscount": 0, "transferCallDuration": 0, "transferCallTotalCost": 0.05, "callbackData": [] } |
Описание полей:
Поле | Тип | Обязательно | Описание | Соответствие с полем из метода старой телефонии |
---|---|---|---|---|
event | string | да | Тип события. Возможные значения:
| - |
type | string | да | Тип звонка. Возможные значения:
| - |
companyId | int | да | Идентификатор компании | - |
botId | string | да | Идентификатор сценария | botId |
id | string | да | Идентификатор вызова | id |
externalId | string | да | Переданный в запросе на инициализацию идентификатор (callId) | - |
taskId | string | да | Идентификатор задания на обзвон | taskId |
candidateId | string | да | Идентификатор кандидата на обзвон | - |
status | string | да | Статус вызова. Возможные значения:
| status |
callFrom | string | да | Вызывающий номер | - |
callTo | string | да | Вызываемый номер | phone |
startedAt | string | да | Дата начала вызова | startedAt |
finishedAt | string | да | Дата окончания вызова | - |
billedAt | string | да | Дата билинга вызова | - |
variables | Object | да | Произвольный словарь типа ключ-значения, который был передан перед инициализацией вызова. Содержит исходные переменные | - |
result | Object | да (может быть пустым) | Произвольный словарь типа ключ-значения. Результаты разговора робота | results |
| initialVariables | Object | нет | Исходные переменные | - |
| markers | Array[string] | нет | Маркеры | - |
| evaluation | string | нет | Оценка из блока результат | |
| confirmation | string | нет | Подтверждение | results.confirm |
| nps | string | нет | NPS | results.nps |
| ключ_1 | string | нет | Произвольный результат. Задается в блоке "Результат" с типом "Произвольный результат" | results.ключ_1 |
amd | string | да | Результат работы определителя автоответчика. Возможные значения:
| amd |
recordPath | string | да (пустой для первого хука) | Путь к аудиофайлу. Для получения ссылки нужно добавить в начале пути | recordPath |
flow | Array[Object] | да | Массив фрагментов разговора | - |
| botId | string | да | Идентификатор сценария | - |
| start | string | да | Время начала части диалога | - |
| end | string | да | Время окончания части диалога | - |
| messages | Array[Object] | да | Массив сообщений по диалогу | messages |
| | text | string | да | Текст сообщений | messages.X.text |
| | author | string | да | Кто произнес сообщение (BOT, CLIENT) | messages.X.author |
| | time | string | да | Время отправки сообщения | messages.X.created_at |
gmtOffset | int | да | смещение в минутах от UTC часового пояса клиента | timezone |
hungUpBy | string | да (пока всегда null) | Кто положил трубку (пока всегда null) | - |
duration | int | да | Общая длительность разговора | duration |
totalCost | float | да | Общая стоимость разговора | - |
robotCallDuration | int | да | Длительность разговора робота | botDuration |
robotCallTotalCost | float | да | Стоимость разговора робота со скидкой | - |
mainCallCost | float | да | Стоимость разговора (транк клиента) | - |
mainCallDiscount | float | да | Скидка за разговор (транк клиента) | - |
mainCallDuration | int | да | Длительность разговора (транк клиента) | - |
autoCallCost | float | да | Всегда равен 0 | - |
autoCallDiscount | float | да | Всегда равен 0 | - |
autoCallDuration | int | да | Всегда равен 0 | - |
autoCallTotalCost | float | да | Всегда равен 0 | - |
robotCallCost | float | да | Стоимость разговора робота | - |
robotCallDiscount | float | да | Скидка за разговор робота | - |
transferCallCost | float | да | Стоимость перевода звонка | - |
transferCallDiscount | float | да | Скидка за перевод звонка | - |
transferCallDuration | int | да | Длительность звонка после перевода | operatorDuration |
transferCallTotalCost | float | да | Стоимость звонка после перевода со скидкой | - |
callbackData | Object | да (может быть пустым) | Информация о кандидате, переданная в момент добавления кандидата (см. метод добавления кандидата) | - |
Описание хука по событию «CANDIDATE«CANDIDATE_CHANGED» CHANGED» (Только для исходящих)
Пример запроса:
Тело webHook в формате Json:
Блок кода | ||||||||
---|---|---|---|---|---|---|---|---|
| ||||||||
{ "event": "CANDIDATE_CHANGED", "id": "5c0d503f-a34e-4806-b455-3225de25***", "clientExternalId": null, "taskId": "210ef80*-1f92-48b*-9800-84fcf59363*e", "status": "FINISHED", "callbackData": [ { "id_num": "12q12", "id_debt": "456321" } } |
Описание полей:
Поле | Тип | Обязательно | Описание | Соответствие с полем из метода старой телефонии |
---|---|---|---|---|
event | string | да | Тип события. Возможные значения:
| - |
id | string | да | Идентификатор вызовакандидата | id |
clientExternalId | string | да | Переданный в запросе на инициализацию идентификатор (callId) | - |
taskId | string | да | Идентификатор задания на обзвон | taskId |
candidateIdlastCallId | string | да | Идентификатор кандидата на обзвон | - |
status | string | да | Статус вызова. Возможные значения:
| status |
| callbackData | Object | да (может быть пустым) | Информация о кандидате, переданная в момент добавления кандидата (см. метод добавления кандидата) | - |
Описание хука по событию «RECALL_SCHEDULED»
Тело запроса:
Блок кода | ||||||
---|---|---|---|---|---|---|
| ||||||
{ "event":"RECALL_SCHEDULED", "id":"59205dce-7dd8-418c-be9c-54eaeaa4629f", "date":"2024-01-31T13:25:00+00:00", "callbackData":[] } |
Описание полей:
Поле | Тип | Обязательно | Описание |
---|---|---|---|
event | string | да | Тип события «RECALL_SCHEDULED» — указывает на запланированный перезвон в рамках текущего звонка (через блок Результат). |
id | string | да | ID звонка. |
date | string | да | Дата и время, на которые запланирован звонок. |
callbackData | Array | да | Поле для дополнительной информации. |