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

Вебхуки и доставка

После каждого звонка резюме, транскрипт и ваши извлечённые поля уходят в вашу систему — с повторами, если она недоступна, журналом доставки и письмом, если что-то не дошло.

Все тарифы, включая пробныйСвой эндпоинт

После каждого звонка Говорило может отправить его данные — резюме, транскрипцию, извлечённые поля — в вашу собственную систему: тикет-систему, CRM, ERP или на любой HTTPS-эндпоинт. На этой странице описано, как именно ведёт себя эта доставка: что происходит, когда ваш сервер недоступен, как часто мы повторяем отправку, что должен пропускать ваш файрвол и как выглядит запрос.

Все тарифы

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

Что можно сделать​

  • Отправлять каждый звонок в свою систему — тикет-систему, CRM, ERP или на любой HTTPS-эндпоинт, когда звонок и его анализ завершены.
  • Формировать запрос — своё JSON-тело, заголовки и параметры запроса, заполненные переменными из звонка.
  • Отправлять только нужные звонки — условие обычными словами решает, какие звонки запускают запрос.
  • Не терять ни одного звонка — неудачные доставки повторяются около 3,4 дня, попадают в журнал и могут быть отправлены снова.
  • Узнавать о сбоях — письмо, если запрос не доставлен.

Как настроить​

  1. Добавьте API-вызов после звонка

    Откройте агента → «Действия» → «Добавить инструмент» → Post call → «API-вызов». В воркфлоу вместо этого используйте ноду «Инструмент» с «API-вызов» и When it runs: After the call.

  2. Опишите запрос

    Укажите название, при желании условие, URL вашего эндпоинта и HTTP-метод. Добавьте заголовки, по которым эндпоинт нас узнаёт (см. Аутентификация), и, если ваша система ждёт свою структуру, «Тело (JSON)» с переменными (см. Формирование запроса).

    Диалог создания действия API-вызова: название, условие, URL эндпоинта, HTTP-метод, заголовки, параметры запроса, тело и «Отправлять только мои поля»
  3. Настройте повторы и письмо о сбое

    Оставьте расписание по умолчанию или задайте своё в «Повторы при ошибке» и выберите, кто получает письмо, в «Уведомление о сбое».

    «Повторы при ошибке» с расписанием по умолчанию, «Уведомление о сбое», «Куда писать» и кнопка «Проверить настройку API»
  4. Проверьте

    Нажмите «Проверить настройку API», затем сделайте тестовый звонок. См. Тестирование.

Примеры сценариев​

Тикет на каждое сообщение о неисправности Звонящий сообщает, что сломался роутер → агент заполняет ваши поля номер клиента, категория тикета и приоритет → после звонка ваша тикет-система получает тикет в своей структуре, с включённым «Отправлять только мои поля».

Только важные звонки Условие «только если звонящий сообщает о неисправности» выполнено → запрос уходит в вашу систему поддержки; остальные звонки никуда не уходят — или уходят вторым действием в вашу CRM.

Ваш сервер не работал все выходные Первые попытки не проходят → запрос повторяется по расписанию → когда сервер снова работает, звонок приходит сам; если расписание закончилось, вы получаете письмо и можете отправить запрос снова из журнала доставки.

Что отправляется и когда​

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

ИсточникГде настраивается
Действие «API-вызов»Агент → Действия → Post call → API-вызов
Шаг воркфлоуКонструктор воркфлоу → нода «Инструмент» (окно «Настроить: Инструмент») → «API-запрос» с настройкой «Когда выполняется: После звонка». См. Workflow → Инструмент
Вебхук агентаПоле webhook_url агента (справочник API)

Запросы, которые агент выполняет во время разговора (инструменты живого звонка), здесь не рассматриваются: они нужны в ту же секунду и позже никогда не повторяются.

Когда ваш сервер недоступен​

Ничего не теряется. Запрос сохраняется в очереди доставки до первой попытки и остаётся в ней, пока ваш сервер его не примет или пока не закончится расписание.

  • Доставка считается успешной, если ваш эндпоинт отвечает любым статусом 2xx в течение 30 секунд.
  • Всё остальное повторяется: отказ в соединении, ошибки DNS или TLS, таймаут и любой другой статус — 5xx, 429, а также 4xx. Если срок действия API-ключа истёк и вы его обновили, ожидающие звонки придут сами.
  • Каждая попытка отправляет тот же запрос с тем же ID доставки.

Расписание повторов​

ПопыткаПауза перед нейВремя с момента завершения звонка
1— (сразу)~0
21 минута~1 мин
35 минут~6 мин
430 минут~36 мин
52 часа~2 ч 36 мин
66 часов~8 ч 36 мин
724 часа~1 день 8 ч
848 часов~3 дня 8 ч

Это 8 попыток примерно за 3,4 дня — достаточно, чтобы пережить сбой, который пришёлся на выходные.

Собственное расписание​

В действии API-вызов (и в шаге воркфлоу «Инструмент» с «API-запросом», который выполняется после звонка) расписание можно заменить в блоке Повторы при ошибке:

  • до 10 повторов,
  • каждая пауза — от 1 минуты до 7 дней,
  • удалите все строки, чтобы запрос отправлялся один раз, без повторов.

Действие, которое вы ни разу не меняли, работает по стандартному расписанию, приведённому выше.

После последней попытки​

Доставка получает статус Не доставлено, вам приходит уведомление по электронной почте, если вы его не отключили, а запрос хранится 30 дней. В течение этого времени его можно отправить снова — одним нажатием в журнале доставки или одним вызовом API. Отправить снова можно и уже успешную доставку — например, после восстановления данных на вашей стороне.

Независимо от вебхуков сам звонок остаётся в вашем аккаунте Говорило — транскрипция, резюме, запись и извлечённые поля доступны в разделе Звонки и через API. Длительный сбой задерживает передачу в вашу систему, но не удаляет разговор.

Как минимум один раз

Доставка выполняется как минимум один раз. В редких случаях — например, когда ваш сервер обработал запрос, но ответ не дошёл до нас вовремя, — один и тот же звонок приходит дважды. Используйте X-Govorilo-Delivery-Id, чтобы распознать и пропустить повтор.

Уведомления о сбоях​

Следить за журналом не обязательно: действие может сообщить вам по электронной почте, что его запрос не доставлен. Выберите вариант в блоке Уведомление о сбое в действии (или в шаге воркфлоу):

НастройкаКогда отправляется письмо
После последней попытки (по умолчанию)Один раз, когда расписание повторов исчерпано и запрос получил статус Не доставлено
После каждой неудачной попыткиПосле каждой неудачной попытки, с указанием времени следующей, — и после последней
Не уведомлятьНикогда; сбои видны только в журнале

В письме указаны действие и агент, хост вашего сервера, его ответ (например, HTTP 503 или timeout after 30s), номер попытки и их общее число, а также есть ссылка на журнал доставки. В последнем письме дополнительно указано, до какого времени хранится запрос, и сказано, что его можно отправить снова.

Поле Куда писать задаёт получателя — обычно это тот, кто отвечает за принимающую систему. Если оставить его пустым, письмо уйдёт владельцу аккаунта. Письмо составляется на языке аккаунта.

Чтобы сбой не переполнил ваш почтовый ящик, уведомления ограничены для каждого действия: 10 в час и 30 в сутки; в последнем письме перед паузой указано, до какого времени она продлится. Каждый сбой по-прежнему записывается в журнал. О запросе, который вы отправили снова вручную, уведомления не приходят.

Журнал доставки​

Записывается каждая попытка: время, HTTP-статус или сетевая ошибка, длительность и начало ответа вашего сервера.

В приложении: CRM → Коммуникации → откройте запись типа API-вызов. Вы увидите статус (Доставлено, Повторяется, Не доставлено), все попытки, время следующей и кнопку Отправить снова.

Через API (аутентификация вашим API-ключом в заголовке x-api-key):

ЗапросРезультат
GET /v1/webhook-deliveriesВаши доставки, сначала самые новые. Фильтры: status (pending, delivered, failed), agent_id, call_id, limit, offset
GET /v1/webhook-deliveries/{id}Одна доставка со всеми попытками и телом запроса
POST /v1/webhook-deliveries/{id}/resendОтправляет её снова прямо сейчас и возвращает результат
{
"id": "6ac71fb82e4f72e709a4a566",
"delivery_id": "0b0f2f0e-6c0f-4f0b-9c55-3c6a3a1f8a11",
"kind": "api_call",
"name": "Create ticket",
"call_id": "6ac71f9d2e4f72e709a4a4f0",
"status": "pending",
"attempts_made": 2,
"attempts_max": 8,
"next_attempt_at": "2026-10-09T11:36:04.000Z",
"attempts": [
{ "n": 1, "at": "2026-10-09T11:30:03.512Z", "duration_ms": 212, "error": "connection refused" },
{ "n": 2, "at": "2026-10-09T11:31:04.007Z", "duration_ms": 187, "status_code": 503, "error": "HTTP 503", "response_preview": "Service Unavailable" }
]
}

Значения заголовков сохранённого запроса (ваши ключи) никогда не возвращаются.

Сеть и файрвол​

Говорило обращается к вашему эндпоинту — соединение всегда устанавливается с нашей стороны к вашей.

НаправлениеИсходящее со стороны Говорило → входящее на вашей стороне
IP-адреса источника178.104.10.47 (сервис доставки) и 128.140.65.92 (сервис звонков, используется как резервный путь)
ПротоколHTTPS (TLS 1.2 или новее). Обычный HTTP работает, но не рекомендуется
Порт443 или тот порт, который указан в вашем URL
Версия IPIPv4
СертификатДолжен быть действительным и выданным публичным удостоверяющим центром; самоподписанные сертификаты отклоняются
Время ответаОтвет в течение 30 секунд — лучше всего сразу подтвердить приём, а обработку выполнить в фоне
ПеренаправленияВыполняются, не более 5

Список разрешённых адресов: если ваш файрвол или WAF фильтрует по адресу источника, разрешите два указанных выше адреса для пути вашего вебхука. Об изменении этих адресов мы сообщаем заранее.

Невозможно: адреса внутри частной сети (10.x, 172.16–31.x, 192.168.x, localhost). Эндпоинт должен быть доступен из интернета — напрямую или через ваш обратный прокси либо API-шлюз.

Браузер: вебхуки передаются с сервера на сервер. Настройки браузера, расширения и открытые порты на рабочих компьютерах сотрудников не задействованы.

Формат запроса​

Запросы POST, PUT и PATCH содержат тело в формате JSON (Content-Type: application/json, UTF-8).

{
"id": "6ac7ea6eca60c6024b465c70",
"agent_id": "6ac2a93e36bad261cf088684",
"call_from": "+74951234567",
"call_to": "+79161234567",
"direction": "inbound",
"call_type": "phone",
"call_status": "success",
"start_timestamp": 1730000000000,
"end_timestamp": 1730000187000,
"duration": 187000,
"call_summary": "Customer reports a broken router and asks for a callback…",
"transcription": [
{ "speaker": "agent", "content": "Hello…", "timestamp": 1730000001000 },
{ "speaker": "user", "content": "Hi…", "timestamp": 1730000003000 }
],
"task_achieved": true,
"sentiment": { "sentiment": "neutral", "explanation": "…" },
"custom_analysis_data": {
"customer_number": "K-20417",
"ticket_category": "Hardware",
"priority": "high"
},
"collected_data": { },
"transfer_history": [ ],
"recording_url": "https://…",
"disconnection_reason": "user_hangup",
"is_anonymous": false,
"is_simulation": false,
"created_at": 1730000000000,
"updated_at": 1730000187000
}
ПолеСодержимое
id, agent_idЗвонок и агент, который его провёл
call_summaryРезюме разговора
transcriptionПолный разговор, реплика за репликой, с метками времени
call_from, call_to, directionНомер звонящего, вызываемый номер, направление — входящий или исходящий
call_type, call_statusphone или web; success или failed
start_timestamp, end_timestamp, durationВремя в формате Unix и длительность в миллисекундах
custom_analysis_dataВаши собственные поля, извлечённые из разговора, — см. Переменные извлечения
collected_dataДанные, которые агент собрал во время звонка
sentiment, task_achievedНастроение разговора и достигнута ли его цель
recording_urlСсылка на запись, если запись включена
transfer_historyПереводы, которые произошли во время звонка
disconnection_reasonКак завершился звонок, например user_hangup, agent_hangup, call_transfer, voicemail
is_anonymous, is_simulationЗвонящий скрыл свой номер; звонок был тестовой симуляцией
created_at, updated_atКогда запись о звонке была создана и последний раз обновлена (время Unix, мс)

Отправляются только эти поля. Никакие другие данные о звонке не покидают платформу.

Для GET и DELETE те же поля передаются в строке запроса; вложенные значения, такие как transcription, опускаются.

Заголовки​

ЗаголовокНазначение
X-Govorilo-Delivery-IdИдентифицирует доставку. Одинаков при каждой попытке — используйте его, чтобы пропускать дубликаты
X-Govorilo-AttemptНомер попытки, начиная с 1
User-AgentGovorilo-Webhooks/1.0
ваши заголовкиВсё, что вы настроили в действии

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

Вы сами решаете, как ваш эндпоинт нас распознаёт:

  • API-ключ или токен — добавьте в действие заголовок, например Authorization: Bearer <token> или X-API-Key: <key>. Заголовки отправляются при каждой попытке.
  • Basic-аутентификация — Authorization: Basic <base64(user:password)>.
  • Query-параметр — для систем, которые ожидают ключ в URL.
  • Адрес источника — разрешите только перечисленные выше IP-адреса.

Способы можно комбинировать; обычная схема — ключ плюс список разрешённых IP-адресов.

Формирование запроса под вашу систему​

По умолчанию запрос содержит поля звонка (см. Формат запроса). Для системы, которая ожидает собственную структуру (а таких тикет-систем большинство), вы сами описываете эту структуру и заполняете её данными звонка.

Переменные​

В действии API-вызов после звонка и в шаге воркфлоу «Инструмент» с «API-запросом» поля URL, заголовки, query-параметры и тело принимают переменные в двойных фигурных скобках. Они заполняются данными звонка непосредственно перед отправкой запроса.

ПеременнаяЗначение
{{call_id}}ID звонка
{{call_from}}, {{call_to}}Номер звонящего и вызываемый номер
{{customer_phone}}, {{customer_email}}Номер и адрес электронной почты собеседника — при любом направлении звонка
{{call_direction}}, {{call_type}}inbound / outbound, phone / web
{{call_start}}, {{call_end}}Начало и конец, ISO 8601 (UTC)
{{call_duration}}Длительность в секундах
{{call_summary}}Резюме разговора
{{call_transcription}}Полный разговор в виде текста
{{call_sentiment}}, {{call_task_achieved}}Настроение и достигнута ли цель
{{call_recording_url}}Ссылка на запись
{{agent_id}}ID агента
ваши поляКаждая переменная извлечения по её имени, например {{customer_number}}, {{priority}}, — а также каждая переменная, которую воркфлоу собрал во время звонка

Правила, которые полезно знать:

  • Поле тела, состоящее только из одной переменной, сохраняет тип этой переменной: "priority": "{{priority}}" отправляется как число 3, "urgent": "{{urgent}}" — как true. Если рядом с переменной есть текст, значение становится текстом.
  • Значение, подставленное в URL, автоматически проходит URL-кодирование (+43… превращается в %2B43…).
  • Переменная, для которой в звонке нет значения, отправляется пустой — и никогда не уходит буквальной строкой {{name}}.

В приложении кнопка {x} в поле открывает список доступных переменных; в теле запроса они предлагаются при вводе {{.

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

В поле Тело (JSON) в действии вы пишете JSON-объект, который ожидает ваша система, с любой нужной глубиной вложенности:

{
"ticket": {
"subject": "Call from {{customer_phone}}: {{ticket_category}}",
"comment": { "body": "{{call_summary}}" },
"priority": "{{priority}}",
"custom_fields": [
{ "id": 360001, "value": "{{customer_number}}" },
{ "id": 360002, "value": "{{call_recording_url}}" }
],
"tags": ["phone-agent"]
}
}

Только ваши поля​

Если включён переключатель Отправлять только мои поля, запрос содержит только ваше тело и ваши query-параметры — данные звонка не добавляются. Если оставить его выключенным, ваши поля отправляются вместе с полями звонка.

Выборочная отправка​

Условие, записанное обычными словами («только если звонящий сообщает о неисправности»), определяет, какие звонки запускают запрос. Несколько действий могут вести в разные системы или на разные эндпоинты.

Подключение тикет-системы​

Любая тикет-система с HTTP API или входящим вебхуком может принимать звонки — напрямую, без промежуточного программного обеспечения. Что требуется с вашей стороны:

  1. Эндпоинт, доступный из интернета по HTTPS и принимающий JSON.
  2. Учётные данные для него (API-ключ, токен или Basic-аутентификация), указанные в действии в виде заголовка.
  3. Если вы фильтруете по адресу — два IP-адреса, приведённых выше, в вашем списке разрешённых.

Затем в действии:

  1. Определите свои поля. Добавьте переменные извлечения, например номер клиента, категория заявки, приоритет, нужен обратный звонок. Агент заполняет их на основе разговора.
  2. Напишите тело в структуре API вашей тикет-системы и расставьте переменные по нужным местам.
  3. Включите Отправлять только мои поля.
  4. Нажмите Проверить настройку API, затем сделайте тестовый звонок.

Мы с удовольствием подготовим тело запроса для вашей системы вместе с вами.

Тестирование​

Проверка соединения. Кнопка Проверить настройку API в действии сразу отправляет пробный запрос и показывает, удалось ли связаться с вашим эндпоинтом.

Проверка повторов — чтобы увидеть механизм своими глазами:

  1. В действии задайте короткое расписание в блоке Повторы при ошибке, например три паузы по 1 минуте.
  2. Остановите свой эндпоинт или заблокируйте наши адреса в файрволе.
  3. Сделайте тестовый звонок агенту.
  4. Откройте CRM → Коммуникации: в записи отображаются статус Повторяется, неудачная попытка с её ошибкой и время следующей.
  5. Снова запустите эндпоинт (или снимите блокировку). Следующая попытка доставит звонок, и запись перейдёт в статус Доставлено — либо нажмите Отправить снова, чтобы доставить немедленно.

Чек-лист для вашего эндпоинта​

  • Отвечайте 2xx, как только запрос сохранён; ресурсоёмкую обработку выполняйте после этого.
  • Используйте X-Govorilo-Delivery-Id как ключ идемпотентности.
  • Отвечайте 4xx/5xx, если вы не смогли принять запрос, — мы обратимся снова.
  • Следите, чтобы сертификат оставался действительным, а два адреса источника — разрешёнными.