Сравнение версий

Ключ

  • Эта строка добавлена.
  • Эта строка удалена.
  • Изменено форматирование.
Message Box
iconnone
titleНа этой странице
typegeneric

Оглавление

Информация

Вебхук приходит с 87.251.83.190 (в вайт лист лучше добавлять весь диапазон  TWIN: 87.251.83.160/27)

У хука есть 3 типа событий и отправка идет по каждому их них:

Тип событияЗначениеОписание
eventCALL_REDIRECTED

Вебхук, с информацией о звонке, переведенном на оператора. Отправляется только тогда, когда в диалоге бота настроен перевод на оператора.

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

Отправляется и для входящих и для исходящих звонков, если в сценарии настроен перевод на оператора. Если перевода не было или он не предусмотрен - событие отправляться не будет.

eventCALL_ENDEDВебхук, с информацией о попытке дозвона. Отправляется всегда, по итогам завершения звонка. Отправляется и для входящих и для исходящих звонков.
eventCANDIDATE_CHANGED

Вебхук, с информацией о итоге обработки кандидата. Отправляется в качестве сигнала, что данный кандидат полностью обработан системой и больше звонков по кандидату не будет.

На него можно опираться для снятия блокировки с кандидата в CRM или дайлера. Отправляется только для исходящих звонков. Для входящих событие отправляться не будет.

Примеры кейсов и описание для них логики отправок хуков

Звонок 1 кандидату (1 номер, без перевода на оператора):

  1. Получаем хук CALL_ENDED

  2. Получаем хук CANDIDATE_CHANGED


Звонок 1 кандидату (1 номер, перевод на оператора):

  1. Получаем хук CALL_REDIRECTED

  2. Получаем хук CALL_ENDED

  3. Получаем хук CANDIDATE_CHANGED


Звонок 1 кандидату (2+ номеров, без перевода на оператора):

  1. Получаем хук CALL_ENDED

  2. Получаем хук CALL_ENDED

  3. Получаем хук CANDIDATE_CHANGED


Звонок 1 кандидату (2+ номеров, перевод на оператора):

  1. Получаем хук CALL_REDIRECTED

  2. Получаем хук CALL_ENDED

  3. Получаем хук CALL_REDIRECTED

  4. Получаем хук CALL_ENDED

  5. Получаем хук CANDIDATE_CHANGED


Информация

На нашей платформе реализована система гарантированной доставки хуков. 

Система ожидает в ответ по каждому отправленному хуку 200й код. В противном случае мы будет делать повторные отправки сообщений в течение 24 часов с увеличением интервалов повторной отправке по экспоненциальной формуле (чем больше попыток - тем больше будет интервал попыток).

Меж серверное взаимодействие ожидает подтверждения в получении отправленных данных. 

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

Описание хука по событию «CALL«CALL_REDIRECTED» REDIRECTED» (Только для ботов с переводом на оператора)

Пример запроса:
Тело webHook в формате Json:

Блок кода
languagepy
themeDJango
firstline1
linenumberstrue
{
 	"event": "CALL_REDIRECTED",
    "id": "a9f629ab-20f0-4c11-8a82-05af87e49e43",
    "redirectAdditional": null,
    "redirectAnons": null,
    "redirectDestination": "ch",
    "redirectDestinationId": "10103",
    "callbackData": []
}

Описание полей:

Поле

Тип

Обязательно

Описание

Соответствие с полем из метода старой телефонии

eventstringда

Тип события. 

  • CALL_REDIRECTED (Вызов переведен)
-
id

string

да

Идентификатор вызова

id
redirectAdditional

string

да

Дополнительные данные, которые идут в SIP обмене

-
redirectAnons

string

да

Текст сопровождения перевода, указанный в настройках бота при переводе звонка.

-
redirectDestination

string

да

Тип перевода (настраивается в сценарии бота):

ch (канал перевода)

custom (произвольный перевод)

int (внутренний номер, вроде не используем)

-
redirectDestinationId

string

да

Значение конечного номера, для выбранного типа перевода (номер канала, номер произвольного перевода, внутренний номер)

-

|   callbackData

Object

да (может быть пустым)

Информация о кандидате, переданная в момент добавления кандидата (см. метод добавления кандидата)

-

Описание хука по событию «CALL«CALL_ENDED»ENDED»

Пример запроса:
Тело webHook в формате Json:

Блок кода
languagepy
themeDJango
firstline1
linenumberstrue
{
  "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": []
}

Описание полей:

Поле

Тип

Обязательно

Описание

Соответствие с полем из метода старой телефонии

eventstringда

Тип события. 

Возможные значения:

  • CALL_ENDED (Вызов завершен)
-
type

string

да

Тип звонка.

Возможные значения:

  • INCOMING (Входящий)
  • OUTGOING (Исходящий)
-
companyId

int

да

Идентификатор компании

-
botId

string

да

Идентификатор сценария

botId
id

string

да

Идентификатор вызова

id
externalId

string

да

Переданный в запросе на инициализацию идентификатор (callId)

-
taskId

string

да

Идентификатор задания на обзвон

taskId
candidateId

string

да

Идентификатор кандидата на обзвон

-
status

string

да

Статус вызова. 

Возможные значения:

  • CANCEL (Вызов отменен)
  • ANSWERED (Вызов отвечен)
  • NOANSWER (Нет ответа)
  • BUSY (Занято)
  • CONGESTION (Оператор отклонил вызов)
  • CHANUNAVAIL (Транк не доступен)
  • FAILED (Ошибка системы при обработке вызова)
  • SCHEDULED (Вызов запланирован)
  • BLACKLIST (Телефон в черном списке)
  • DIAL (Набор номера)
  • INPROGRESS (Идет диалог)
  • FZ230 (Запрет вызова по 230ФЗ)
  • INVALID (Номер не корректный)
  • UNAVAILABLE (Удаленная АТС не доступна)
  • EXPIRED (Соединение не установлено за таймаут)
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
amdstring

да

Результат работы определителя автоответчика.

Возможные значения:

  • HUMN (человек)
  • MACH (автоответчик)
  • NOT_DEF (не определялось)
amd
recordPath

string

да (пустой для первого хука)

Путь к аудиофайлу.

Для получения ссылки нужно добавить в начале пути 

https://minio.twin24.ai/twin-cis-production/records

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:

Блок кода
languagepy
themeDJango
firstline1
linenumberstrue
{
  "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"
    }
}

Описание полей:

Поле

Тип

Обязательно

Описание

Соответствие с полем из метода старой телефонии

eventstringда

Тип события. 

Возможные значения:

  • CANDIDATE_

  • CHANGED 
  • CHANGED (Обновление статуса по кандидату)

-
id

string

да

Идентификатор вызовакандидата

id
clientExternalId

string

да

Переданный в запросе на инициализацию идентификатор (callId)

-
taskId

string

да

Идентификатор задания на обзвон

taskId
candidateIdlastCallId

string

да

Идентификатор кандидата на обзвон

-
status

string

да

Статус вызова. 

Возможные значения:

  • FINISHED (Обработка кандидата завершена, больше звонков совершено не будет)

status

|   callbackData

Object

да (может быть пустым)

Информация о кандидате, переданная в момент добавления кандидата (см. метод добавления кандидата)

-

Описание хука по событию «RECALL_SCHEDULED»

Тело запроса:

Блок кода
languagepy
themeDJango
firstline1
{
	"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 звонка.
datestringдаДата и время, на которые запланирован звонок.
callbackDataArrayда

Поле для дополнительной информации.