Установка вебхука в кабинет

Вебхук нельзя установить для отдельного номера входящей линии, а только на все входящие номера в кабинете разом. Для того чтобы прикрепить адрес вебхука к кабинету нужно:

  1. Получить авторизационный токен (используя логин и пароль)
    curl --location 'https://iam.twin24.ai/api/v1/auth/login' \
    --header 'Content-Type: application/json' \
    --data '{
        "email": "{{login}}",
        "password": "{{password}}",
        "ttl": 43200
    }'
  2. Выполнить метод для привязки вебхука (вместо {{cabinet}} указать номер личного кабинета, вместо {{url}} — адрес вашего вебхука, для авторизации использовать токен из прошлого шага)
    curl --location --request PATCH 'https://tcl.twin24.ai/api/iam/v1/companies/{{cabinet}}/settings' \
    --header 'Authorization: Bearer {{auth_token}}' \
    --header 'Content-Type: application/json' \
    --data '{
        "settings": {
            "cis.webhooks.incomingCall": "{{url}}"
        }
    }'

Формат вебхука

Пример вебхуков

Хука будет два на каждый звонок (из-за особенностей реализации внутри системы):

  1. Как завершит работать бот

  2. Как завершит работать "оболочка" над ботом

Разница между хуками в наличии во втором хука пути до аудизаписи диалога и биллинга по звонку.

  1. Пример первого хука
    {
      "callId": "88556d65-9bc1-46cf-ba2d-306842b238f7",
      "startedAt": "2023-04-05 20:01",
      "number": "79309990580",
      "duration": 8,
      "robotCallDuration": 8,
      "robotCallTotalCost": "0.27",
      "externalId": "005112a5-2633-47e7-89ee-0f0bddb3ac2e",
      "currentStatusName": "ANSWERED",
      "additional": null,
      "recordPath": null,
      "mainCallCost": "0",
      "mainCallDiscount": "0",
      "mainCallDuration": 0,
      "mainCallTotalCost": "0",
      "autoCallCost": "0",
      "autoCallDiscount": "0",
      "autoCallDuration": "0",
      "autoCallTotalCost": "0",
      "robotCallCost": "2.00",
      "robotCallDiscount": "0",
      "transferCallCost": "0",
      "transferCallDiscount": "0",
      "transferCallDuration": "0",
      "transferCallTotalCost": 0,
      "totalCost": "0.27",
      "companyId": 1758,
      "method": "callEnded",
      "id": {
        "identity": "88556d65-9bc1-46cf-ba2d-306842b238f7"
      },
      "createdAt": null,
      "updatedAt": null,
      "callerId": "79992082892",
      "data": {
        "flow": [
          {
            "botId": "11b17988-7e83-445a-ad3d-ec30f619edee",
            "start": "2023-04-05 11:20:01.667647+03",
            "end": "2023-04-05 11:20:07.709039+03",
            "messages": [
              {
                "text": "Назови число",
                "author": "BOT",
                "time": "2023-04-05 11:20:01.667647+03"
              },
              {
                "text": "11",
                "author": "CLIENT",
                "time": "2023-04-05 11:20:06.023713+03"
              },
              {
                "text": "Ты назвал 11",
                "author": "BOT",
                "time": "2023-04-05 11:20:07.709039+03"
              }
            ]
          }
        ],
        "duration": 8,
        "totalCost": 0.27,
        "result": {
          "initialVariables": {
            "phone": "79992082892"
          },
          "markers": [
            "Вопрос",
            "Ответ",
            "Результат 1"
          ],
          "confirmation": "Поле подтверждение",
          "nps": "Поле нпс",
          "Переменная_1": "Ее значение",
          "Переменная_2": "Ее значение"
        }
      },
      "taskName": null,
      "taskCreatedAt": null,
      "botId": "11b17988-7e83-445a-ad3d-ec30f619edee",
      "callingNumber": "79992082892",
      "timezone": 10800,
      "messagesAsString": "BOT: Назови число\nCLIENT: 11\nBOT: Ты назвал 11",
      "resultsString": {
        "initialVariables": {
          "phone": "79992082892"
        },
        "markers": [
          "Вопрос",
          "Ответ",
          "Результат 1"
        ],
        "confirmation": "Поле подтверждение",
        "nps": "Поле нпс",
        "Переменная_1": "Ее значение",
        "Переменная_2": "Ее значение"
      },
      "emotion": null,
      "hungUpBy": null,
      "gender": null,
      "nps": "Поле нпс",
      "isAssistantRequest": null,
      "markers": null,
      "callbackData": []
    }
  2. Пример второго хука по этому же диалогу
    {
      "callId": "88556d65-9bc1-46cf-ba2d-306842b238f7",
      "startedAt": "2023-04-05 20:01",
      "number": "79309990580",
      "duration": 10,
      "robotCallDuration": 8,
      "robotCallTotalCost": "0.27",
      "externalId": "005112a5-2633-47e7-89ee-0f0bddb3ac2e",
      "currentStatusName": "ANSWERED",
      "additional": null,
      "recordPath": "/1672/2023/4/5/1680682799.7442646_79309990580_79992082892.mp3",
      "mainCallCost": "1.30",
      "mainCallDiscount": "0",
      "mainCallDuration": 10,
      "mainCallTotalCost": "0.22",
      "autoCallCost": "0",
      "autoCallDiscount": "0",
      "autoCallDuration": "0",
      "autoCallTotalCost": "0",
      "robotCallCost": "2.00",
      "robotCallDiscount": "0",
      "transferCallCost": "0",
      "transferCallDiscount": "0",
      "transferCallDuration": "0",
      "transferCallTotalCost": "0.22",
      "totalCost": "0.49",
      "companyId": 1758,
      "method": "callEnded",
      "id": {
        "identity": "88556d65-9bc1-46cf-ba2d-306842b238f7"
      },
      "createdAt": null,
      "updatedAt": null,
      "callerId": "79992082892",
      "data": {
        "flow": [
          {
            "botId": "11b17988-7e83-445a-ad3d-ec30f619edee",
            "start": "2023-04-05 11:20:01.667647+03",
            "end": "2023-04-05 11:20:07.709039+03",
            "messages": [
              {
                "text": "Назови число",
                "author": "BOT",
                "time": "2023-04-05 11:20:01.667647+03"
              },
              {
                "text": "11",
                "author": "CLIENT",
                "time": "2023-04-05 11:20:06.023713+03"
              },
              {
                "text": "Ты назвал 11",
                "author": "BOT",
                "time": "2023-04-05 11:20:07.709039+03"
              }
            ]
          }
        ],
        "duration": 10,
        "totalCost": 0.49,
        "result": {
          "initialVariables": {
            "phone": "79992082892"
          },
          "markers": [
            "Вопрос",
            "Ответ",
            "Результат 1"
          ],
          "confirmation": "Поле подтверждение",
          "nps": "Поле нпс",
          "Переменная_1": "Ее значение",
          "Переменная_2": "Ее значение"
        }
      },
      "taskName": null,
      "taskCreatedAt": null,
      "botId": "11b17988-7e83-445a-ad3d-ec30f619edee",
      "callingNumber": "79992082892",
      "timezone": 10800,
      "messagesAsString": "BOT: Назови число\nCLIENT: 11\nBOT: Ты назвал 11",
      "resultsString": {
        "initialVariables": {
          "phone": "79992082892"
        },
        "markers": [
          "Вопрос",
          "Ответ",
          "Результат 1"
        ],
        "confirmation": "Поле подтверждение",
        "nps": "Поле нпс",
        "Переменная_1": "Ее значение",
        "Переменная_2": "Ее значение"
      },
      "emotion": null,
      "hungUpBy": null,
      "gender": null,
      "nps": "Поле нпс",
      "isAssistantRequest": null,
      "markers": null,
      "callbackData": []
    }

Описание полей вебхука

ПолеОписание
callIdИдентификатор звонка в системе TWIN
startedAtДата начала звонка
numberНомер на который пришел звонок
durationДлительность звонка
robotCallDurationДлительность работы робота в звонке
robotCallTotalCostСтоимость работы робота в звонке
externalIdНЕ АКТУАЛЬНО ДЛЯ ВХОДЯЩЕЙ
currentStatusNameСтатус звонка
additionalНЕ АКТУАЛЬНО ДЛЯ ВХОДЯЩЕЙ
recordPathПуть до записи (запись расположена на хосте https://minio.twin24.ai/twin-cis-production/records по этому пути)
mainCallCostТариф для основного звонка
mainCallDiscountСкидка для основного звонка
mainCallDurationДлительность основного звонка
mainCallTotalCostСтоимость основного звонка
autoCallCostНЕ АКТУАЛЬНО ДЛЯ ВХОДЯЩЕЙ
autoCallDiscountНЕ АКТУАЛЬНО ДЛЯ ВХОДЯЩЕЙ
autoCallDurationНЕ АКТУАЛЬНО ДЛЯ ВХОДЯЩЕЙ
autoCallTotalCostНЕ АКТУАЛЬНО ДЛЯ ВХОДЯЩЕЙ
robotCallCostТариф работы робота в звонке
robotCallDiscountСкидка работы робота в звонке
transferCallCostТариф переадрессации звонка
transferCallDurationДлительность переадрессованного звонка
transferCallTotalCostСтоимость переадрессованного звонка
totalCostОбщая стоимость звонка
companyIdНомер личного кабинета компании
methodМетод, вызвавший отправку вебхука
id.identity== callId
createdAtНЕ АКТУАЛЬНО ДЛЯ ВХОДЯЩЕЙ
updatedAtНЕ АКТУАЛЬНО ДЛЯ ВХОДЯЩЕЙ
callerIdНомер, позвонивший на входящую
dataМассив данных по диалогу
data.flowДанные по работе каждого сценария (в звонке может быть несколько сценариев. Они отличаются по botId)
data.flow.botIdИдентификатор сценария
data.flow.startДата и время начала работы сценария
data.flow.endДата и время конца работы сценария
data.flow.messagesСообщения в сценарии (Разделенные по Автору: Бот или Клиент)
data.duration== duration
data.totalCost== totalCost
data.resultМассив результатов диалога
data.result.initialVariablesНЕ АКТУАЛЬНО ДЛЯ ВХОДЯЩЕЙ
data.result.markersМассив маркеров (Опциональны для сценария)
data.result.confirmationДанные из поля “Подтверждение результата”
data.result.npsДанные из поля “NPS”
data.result.переменная_1Данные из пользовательских полей, заданных в сценарии
taskNameНЕ АКТУАЛЬНО ДЛЯ ВХОДЯЩЕЙ
taskCreatedAtНЕ АКТУАЛЬНО ДЛЯ ВХОДЯЩЕЙ
botIdИдентификатор сценарий, который принял звонок
callingNumber== callerId
timezoneтаймзона
messagesAsStringВесь диалог бота и клиента одной строкой
resultsString== data.result
emotionОпределенная эмоция (при наличии блока в сценарии)
hungUpByНЕ АКТУАЛЬНО ДЛЯ ВХОДЯЩЕЙ
genderОпределенный пол (при наличии блока в сценарии)
nps== data.result.nps
isAssistantRequestЗапросил ли бот “помощь” - перевод на оператора
markersНЕ АКТУАЛЬНО ДЛЯ ВХОДЯЩЕЙ
callbackDataНЕ АКТУАЛЬНО ДЛЯ ВХОДЯЩЕЙ
  • Нет меток