Разработчикам
Вебхуки
Получайте подписанные HTTPS-уведомления, когда завершаются звонки, принимаются сообщения, меняются записи, заказы и бронирования или завершается кампания, и проверяйте, что каждое из них действительно пришло от Ringhum.
5 минут чтения Обновлено 24 сентября 2026
На этой странице
Вебхук отправляет HTTPS-запрос на ваш сервер в тот момент, когда что-то происходит в вашем рабочем пространстве. Используйте вебхуки вместо опроса API: когда звонок завершается, вы сразу же получаете сводку, результат, собранные данные и расшифровку. Каждая доставка подписывается секретом, который известен только вам и Ringhum, поэтому ваш сервер может отклонять всё, что пришло не от Ringhum.
Добавление конечной точки
Добавлять, тестировать и удалять конечные точки могут только Владелец и Администраторы рабочего пространства.
- Откройте Разработчикам в боковом меню.
- В карточке Webhooks нажмите Добавить адрес.
- Введите URL адреса. Он должен начинаться с
https://. - В разделе События отметьте нужные события.
call.endedотмечен за вас. - Нажмите Добавить адрес.
- Скопируйте секрет подписи из зелёного блока (он начинается с
whsec_) и сохраните его на своём сервере. Нажмите Готово.
Важно: Секрет подписи показывается только один раз. Если вы его потеряли, удалите конечную точку и добавьте её заново, чтобы получить новый секрет.
Вы можете добавить сколько угодно конечных точек. Вебхуки охватывают каждого ассистента в рабочем пространстве. Управлять конечными точками также можно через API, с помощью POST /webhooks и ключа с областью доступа write.
События
| Событие | Когда отправляется |
|---|---|
call.started |
Звонок был отвечен ассистентом |
call.ended |
Звонок завершился и был просуммирован (включает транскрипт и сводку) |
call.transferred |
Звонок был переведён на человека |
message.taken |
Ассистент принял сообщение |
appointment.booked |
Ассистент забронировал запись |
appointment.rescheduled |
Запись была перенесена на новое время |
appointment.cancelled |
Запись была отменена |
order.created |
Заказ был оформлен (ассистентом, вручную или через API) |
order.updated |
Заказ перешёл в новый статус |
order.cancelled |
Заказ был отменён |
reservation.created |
Номер был забронирован (ассистентом, вручную или через API) |
reservation.updated |
Бронирование перешло в новый статус (подтверждено, заезд, выезд, неявка) |
reservation.cancelled |
Бронирование было отменено |
campaign.completed |
Исходящая кампания завершила обзвон своего списка |
test.ping |
Вы нажали Отправить тест |
Как выглядит доставка
Каждая доставка — это запрос POST с телом в формате JSON и следующими заголовками:
POST https://example.com/hooks/ringhum
Content-Type: application/json
User-Agent: Ringhum-Webhooks/1.0
X-Ringhum-Event: call.ended
X-Ringhum-Timestamp: 1789250000
X-Ringhum-Signature: v1=5f1a…
{
"id": "evt_8f2k…",
"type": "call.ended",
"created_at": "2026-09-24T14:03:11+00:00",
"data": {
"call_id": 4812,
"direction": "inbound",
"from": "+14155550132",
"to": "+14155550100",
"assistant_id": 3,
"status": "completed",
"outcome": "message_taken",
"sentiment": "neutral",
"duration_seconds": 94,
"summary": "Caller asked for a quote for a kitchen repair…",
"extracted": { "name": "Dana Lee", "reason": "Quote" },
"transcript": [
{ "role": "assistant", "content": "Hello, you've reached…" },
{ "role": "user", "content": "Hi, I'd like a quote…" }
]
}
}
Объект data зависит от события:
call.endedиmessage.taken: поля звонка, показанные выше.call.startedиcall.transferred:call_id,direction,from,to,assistant_id,statusиstarted_at.appointment.*:appointment_id,title,status,starts_at,ends_at,timezone,customer(имя, телефон, email),contact_id,service,staff,call_idиnotes.order.*:order_id,number,status,fulfillment,customer,address,itemsс опциями и ценами,currency,subtotal,fee,total,source,call_idи, для отмен,cancel_reason.reservation.*:reservation_id,number,status,room,check_in,check_out,nights,adults,children,guest,currency,nightly,totalиsource.campaign.completed:campaign_id,nameи счётчики прогресса кампании.
Примечание: Когда ассистент бронирует запись во время звонка, вы можете получить
appointment.bookedдважды. Одно отправляется в момент бронирования, с полями записи. Другое — после того, как звонок просуммирован, с полями звонка. Проверяйте, есть ли вdataполеappointment_idилиcall_id, и используйте полеid, чтобы не обработать одну доставку дважды.
Проверка подписи
Подпись — это HMAC-SHA256 от метки времени, точки и необработанного тела запроса, с ключом — секретом подписи вашей конечной точки. Она отправляется как v1=, за которым следует hex-дайджест.
- Прочитайте сырое тело точно так, как оно получено, до какого-либо разбора JSON.
- Постройте строку
{X-Ringhum-Timestamp}.{raw body}. - Вычислите HMAC-SHA256 со своим секретом и добавьте префикс
v1=. - Сравните её с
X-Ringhum-Signature, используя сравнение за постоянное время. - Отклоняйте запрос, если метка времени старше пяти минут, чтобы блокировать повторно воспроизведённые запросы.
Node.js:
const crypto = require('crypto');
function isValid(req, rawBody, secret) {
const ts = req.header('X-Ringhum-Timestamp');
const sig = req.header('X-Ringhum-Signature') || '';
const expected = 'v1=' + crypto.createHmac('sha256', secret).update(`${ts}.${rawBody}`).digest('hex');
const fresh = Math.abs(Date.now() / 1000 - Number(ts)) < 300;
return fresh && sig.length === expected.length &&
crypto.timingSafeEqual(Buffer.from(sig), Buffer.from(expected));
}
PHP:
$ts = $_SERVER['HTTP_X_RINGHUM_TIMESTAMP'] ?? '';
$sig = $_SERVER['HTTP_X_RINGHUM_SIGNATURE'] ?? '';
$expected = 'v1=' . hash_hmac('sha256', $ts . '.' . file_get_contents('php://input'), $secret);
if (! hash_equals($expected, $sig) || abs(time() - (int) $ts) > 300) {
http_response_code(400);
exit;
}
Ответы, тайм-ауты и повторы
- Отвечайте любым статусом
2xx, чтобы подтвердить доставку. Выполняйте медленную работу уже после ответа. - Ringhum ждёт ответа до 10 секунд.
- Если ваша конечная точка не отвечает
2xx, доставка повторяется до 3 раз всего: сразу, затем ещё раз примерно через 10 секунд и последний раз примерно через 60 секунд. После этого она отбрасывается. - Доставки могут приходить не по порядку. Используйте
created_atи идентификаторы вdata, чтобы упорядочить их.
Таблица Webhooks показывает последний HTTP-статус каждой конечной точки и время отправки. Неисправная конечная точка остаётся активной; Ringhum не отключает её за вас.
Тест, пауза и удаление
- Отправить тест сразу отправляет событие
test.ping, а сообщение показывает HTTP-статус, который вернула ваша конечная точка. - Переключатель Активен приостанавливает конечную точку. События, произошедшие, пока она выключена, позже не отправляются.
- Удалить удаляет конечную точку и её секрет.
Частые вопросы
В чём отличие от приложений Zapier, Make и n8n в разделе «Интеграции»? Те подключения используют страницу «Интеграции» и её шесть типов событий. Их тело — {"event", "workspace", "sent_at", "data"}, а при указании секрета заголовок подписи — X-Ringhum-Signature: sha256=…, HMAC-SHA256 только от тела. Вебхуки для разработчиков, описанные здесь, охватывают больше событий и используют подпись v1= с меткой времени. См. Выбор того, что отправляется.
Моя конечная точка возвращает 2xx, но мой код ничего не видит. Проверьте, что событие отмечено для этой конечной точки, что конечная точка активна, и что ваш файервол разрешает запросы из интернета.
Почему проверка подписи не проходит? Чаще всего тело было разобрано и заново закодировано перед хешированием. Хешируйте сырые байты точно так, как они получены.
← Назад
API-ключи и области доступа
Далее →
Подключение Ringhum к Claude и другим ИИ-инструментам (MCP)
Похожие статьи
API-ключи и области доступа
Создавайте и отзывайте API-ключи на странице «Разработчикам», выбирайте доступ на чтение или запись и изучите основы REST API Ringhum — базовый URL, аутентификация, пагинация, ошибки и ограничения частоты запросов.
Подключение Ringhum к Claude и другим ИИ-инструментам (MCP)
Добавьте Ringhum как коннектор в Claude, ChatGPT, Cursor, VS Code и другие ИИ-приложения, поддерживающие протокол Model Context Protocol, выберите доступ только для чтения или для чтения и изменения, и отключите приложение.
Выбор того, что отправляется
Выбирайте, какие звонки, элементы входящих, записи и заказы получает каждое подключённое приложение, и ограничивайте обновления звонков только теми, что требуют чьих-то действий.
Подключение приложения
Как подключить Slack, вашу CRM, хелпдеск, инструмент для задач, таблицу, магазин или календарь к Ringhum, какой тип подключения использует каждое приложение, и как проверить, что оно работает.
Всё ещё не получается?
Напишите на [email protected] или отправьте нам сообщение. Тарифы Team и Scale получают приоритетную поддержку.