Конечные точки вебхуков
Управляйте несколькими URL-адресами вебхуков с секретами и фильтрами событий для каждой конечной точки.
Система вебхуков на основе эндпоинтов позволяет регистрировать несколько назначений для каждой организации, каждое со своим секретом, своим статусом и своей подпиской на подмножество типов событий. Это рекомендуемая модель для всех новых интеграций.
Сравните с устаревшим вебхуком с одним URL, который сохраняется для обратной совместимости, но поддерживает только один URL на организацию.
Эндпоинты
| Метод | Путь | Требуемая роль | Описание |
|---|---|---|---|
GET | /v1/developer/webhook-endpoints | admin+ | Получить список эндпоинтов |
POST | /v1/developer/webhook-endpoints | admin+ | Создать эндпоинт |
PATCH | /v1/developer/webhook-endpoints/{endpoint_id} | admin+ | Обновить метку / URL / события / статус |
DELETE | /v1/developer/webhook-endpoints/{endpoint_id} | admin+ | Удалить эндпоинт |
POST | /v1/developer/webhook-endpoints/{endpoint_id}/test | admin+ | Отправить подписанную тестовую доставку |
Объект эндпоинта
{
"id": "c4d5e6f7-...",
"label": "Production — Call events",
"url": "https://example.com/thunderphone/hook",
"events": ["telephony.incoming", "telephony.complete"],
"status": "active",
"secret_hint": "a1b2…9f0e",
"created_at": "2026-04-20T18:24:10.113Z",
"updated_at": "2026-04-20T18:24:10.113Z"
}| Поле | Тип | Описание |
|---|---|---|
id | UUID | Идентификатор эндпоинта |
label | string | Отображаемое имя, от 1 до 120 символов |
url | string | HTTPS URL; http://localhost разрешён для разработки |
events | массив строк | Типы событий, на которые оформлена подписка (см. допустимые значения). Пустой массив подписывает на все события, кроме явных событий для каждого хода (telephony.turn / web.turn) |
status | string | active, disabled (приостановлен вручную) или failing (устанавливается автоматически, когда доставка исчерпывает расписание повторных попыток в течение 24 ч без единого ответа 2xx) |
secret_hint | string | Первые 4 и последние 4 символа секрета подписи с многоточием (a1b2…9f0e) — этого достаточно, чтобы сопоставить его с секретом, сохранённым локально, не раскрывая полное значение |
created_at, updated_at | timestamp |
Допустимые типы событий
events проверяется по этому точному набору — значения вне списка
возвращают 400. Формат полезной нагрузки для каждого типа см. в каталоге событий.
telephony.incoming,telephony.complete,telephony.tool,telephony.turnweb.incoming,web.complete,web.tool,web.turncall.gradedissue.reportedtest-call.completedalert.triggered
Статусы эндпоинта
active— доставки выполняются в обычном режиме.disabled— вручную приостановлен черезPATCH. Запросы не отправляются. Мы никогда не меняем статус эндпоинтаdisabled; вернуть его вactiveвсегда решаете вы.failing— устанавливается автоматически, когда доставка на эндпоинт исчерпывает всё расписание повторных попыток (8 попыток в течение 24 часов), так и не получив ответ 2xx. Эндпоинт в состоянии сбоя не получает дальнейший трафик. После исправления эндпоинта черезPATCHверните его статус вactive; доставки, чьё расписание повторных попыток ещё не исчерпано, продолжатся с того места, на котором остановились.
Получить список эндпоинтов
curl https://api.thunderphone.com/v1/developer/webhook-endpoints \
-H "Authorization: Bearer sk_live_YOUR_API_KEY"Возвращает массив объектов эндпоинта.
Создание эндпоинта
curl -X POST https://api.thunderphone.com/v1/developer/webhook-endpoints \
-H "Authorization: Bearer sk_live_YOUR_API_KEY" \
-H "Content-Type: application/json" \
-d '{
"label": "Production — Call events",
"url": "https://example.com/thunderphone/hook",
"events": ["telephony.incoming", "telephony.complete"]
}'result = requests.post(
"https://api.thunderphone.com/v1/developer/webhook-endpoints",
headers={"Authorization": "Bearer sk_live_YOUR_API_KEY"},
json={
"label": "Production — Call events",
"url": "https://example.com/thunderphone/hook",
"events": ["telephony.incoming", "telephony.complete"],
},
).json()
secret = result["secret"]
endpoint_id = result["id"]Поля запроса
| Поле | Тип | Обязательное | Описание |
|---|---|---|---|
label | строка | да | 1–120 символов |
url | строка | да | URL-адрес HTTPS (http разрешён только для localhost / 127.0.0.1) |
events | массив | нет | Пустое или неуказанное значение подписывает на все события, кроме telephony.turn / web.turn, для которых требуется явная подписка. Необходимо использовать значения из списка Допустимые типы событий; дубликаты удаляются |
Возвращает 201 Created с объектом эндпоинта и дополнительным
полем верхнего уровня secret, содержащим исходный ключ подписи —
48-символьную шестнадцатеричную строку:
{
"id": "c4d5e6f7-…",
"label": "Production — Call events",
"url": "https://example.com/thunderphone/hook",
"events": ["telephony.incoming", "telephony.complete"],
"status": "active",
"secret_hint": "a1b2…9f0e",
"created_at": "2026-04-20T18:24:10.113Z",
"updated_at": "2026-04-20T18:24:10.113Z",
"secret": "a1b2c37e08d94f5b16a2c8d90e7f3a4b5c6d7e8f90a19f0e"
}Обновление эндпоинта
curl -X PATCH https://api.thunderphone.com/v1/developer/webhook-endpoints/c4d5e6f7-... \
-H "Authorization: Bearer sk_live_YOUR_API_KEY" \
-H "Content-Type: application/json" \
-d '{
"label": "Production — Call + Grade events",
"events": ["telephony.incoming", "telephony.complete", "call.graded"]
}'| Поле | Тип | Описание |
|---|---|---|
label | строка | |
url | строка | |
events | массив | |
status | строка | active или disabled. Установите active, чтобы повторно включить эндпоинт, который сервер пометил как failing |
Возвращает 200 OK с обновлённым объектом эндпоинта.
Отправка тестовой доставки
Отправьте синтетическое событие webhook.test в одну конечную точку, используя стандартный
конвейер доставки, включая каноническую сериализацию JSON,
X-ThunderPhone-Signature, запись доставки и учёт повторных попыток.
Тест выполняется для выбранной конечной точки независимо от её фильтра events.
curl -X POST https://api.thunderphone.com/v1/developer/webhook-endpoints/c4d5e6f7-.../test \
-H "Authorization: Bearer sk_live_YOUR_API_KEY"Конечная точка получает оболочку следующего вида:
{
"data": {
"message": "ThunderPhone webhook test",
"sent_at": "2026-07-17T20:12:34.567890+00:00"
},
"event_id": "2ad6507c-7d19-4498-9b2d-7e8f944ab5a1",
"type": "webhook.test"
}API возвращает 200 OK после первой попытки, даже если целевой адрес
возвращает ошибку. Проверьте success, status, response_code и error,
чтобы узнать результат доставки:
{
"success": true,
"event_id": "2ad6507c-7d19-4498-9b2d-7e8f944ab5a1",
"event_type": "webhook.test",
"status": "delivered",
"response_code": 204,
"error": ""
}webhook.test является синтетическим событием и не может быть добавлен в подписку
конечной точки events. Если первая попытка завершится неудачно, доставка будет выполняться по тому же
расписанию повторных попыток, что и обычные доставки событий.
Удаление конечной точки
curl -X DELETE https://api.thunderphone.com/v1/developer/webhook-endpoints/c4d5e6f7-... \
-H "Authorization: Bearer sk_live_YOUR_API_KEY"Возвращает 204 No Content. Доставка на URL немедленно прекращается;
выполняющиеся повторные попытки отменяются.