Для синхронных ответов требуется тело ответа, а также должен возвращаться статус 200 (OK); для асинхронных ответов требуется статус 202 (Accepted).
Если несколько сообщений приходят от клиента одновременно в момент вызова вебхука, edna может отправить их как отдельные сообщения или как одно, включающее в себе тексты всех сообщений. По умолчанию сообщения отправляются по отдельности. Это поведение управляется настройкой bot.message.concat.
Параметры запроса
| Параметр | Тип | Описание | 
| action | boolean (обязательно) | MESSAGE | 
| text | string (обязательно) | Сообщение клиента для обработки ботом | 
| clientId | string (необязательно) | Внешний ID клиента (только для авторизованных клиентов). Этот параметр устарел, вместо него используйте threadsClientId. | 
| threadsClientId | Long (необязательно) | Внутренний ID клиента (подходит как для авторизованных, так и для неавторизованных клиентов) | 
| sessionId | string (необязательно) | Внутренний ID треда | 
| questionId | number (необязательно) | Внутренний ID сообщения клиента в edna | 
| questionIndex | number (необязательно) | Индекс сообщения клиента в треде | 
| channelInfo | object (обязательно) | Информация о канале, в котором получено сообщение | 
| channelType | string | Тип канала ( WEB,MOBILE,EMAIL,VIBER,TELEGRAM,VIBERPA,FACEBOOK,VKONTAKTE,YANDEX,WHATSAPP,APPLE_BUSINESS_CHAT) | 
| authorized | boolean | true– авторизован,false– не авторизован | 
| platform | string (необязательно) | Только для типа канала ( channelType)MOBILE:• iOS • Android | 
| clientData | dictionary (необязательно) | Данные клиента (подробнее в статье Кастомизация данных клиента (clientData) в содержимом вебхука). | 
| segmentationInfo | map<String, String> | Дополнительные параметры для изменения сегментации (используется как в пользовательских, так и в преднастроенных сегментах). Параметр сегментации personal_managerдоступен “из коробки”. Если в этом параметре передан логин агента, а маршрут для сегмента с этим параметром настроен в системе, треды клиентов распределяются по соответствующему маршруту персональным менеджерам (агентам). | 
| receivedAt | string (обязательно) | Время получения сообщения, дата в формате UTC: yyyy-MM-dd’T’HH:mm:ss.SSS’Z’ | 
| attachments | array of object (необязательно) | Поля: • url– URL файла, строка до 4000 символов• name– Имя файла, строка до 1000 символов• type– MIME-тип файла, строка до 256 символов• size– Размер файла в байтах, целое число | 
| sender | string (обязательно) | Информация об отправителе, всегда ThreadsAPI | 
| settings | object (необязательно) | Дополнительные настройки сообщения | 
| settings.masked | boolean (необязательно) | Параметр, который указывает, замаскированы ли цифры в связанном сообщении клиента ( true– замаскированы,false– не замаскированы). | 
| metaData | object (необязательно) | Отправляется боту при включенной функциональности распознавания голосовых сообщений | 
| metaData.speechText | boolean | Распознанный текст голосового сообщения | 
| metaData.score | integer | Качество распознавания (число от 0 до 100) | 
| metaData.resultStatus | string | Статус распознавания. Допустимые значения: • processing• success• noInput• maxSpeech • noMatch• error | 
| payload | string (необязательно) | Код кнопки, которую нажал клиент | 
HTTP запрос
POST <url for webhook message> HTTP/1.1
Content-Type: application/json
{
   "action":"MESSAGE",
   "threadsClientId":1,
   "sessionId":"1",
   "questionId":43,
   "questionIndex":null,
   "receivedAt":"2018-11-13T13:13:11.876Z",
   "text":"Message",
   "channelInfo":{
      "channelType":"MOBILE",
      "authorized":true
   },
   "platform":"Android",
   "attachments":[
      {
         "url":"hhtp://...",
         "name":"test.jpg",
         "type":"image/jpeg",
         "size":256
      }
   ],
   "clientData":{
      "phone":"79000000000"
   },
   "sender":"ThreadsAPI"
}
Пример успешного HTTP ответа
Для синхронных ответов ожидается текст сообщения и статус 200 (OK); для асинхронных ответов ожидается статус 202 (Accepted).
{
   "action":"MESSAGE",
   "threadsClientId":1,
   "sessionId":"1",
   "questionId":43,
   "questionIndex":null,
   "receivedAt":"2018-11-13T13:13:11.756Z",
   "text":"Message",
   "segmentationInfo": {
        "key":"value"
    },
   "attachments":[
      {
         "url":"https://...",
         "name":"test.jpg",
         "type":"image/jpeg",
         "size":256
      }
   ],
   "sender":"ThreadsAPI",
   "settings" : {
        "masked" : true
    }
}