ThunderPhone 2.0 уже доступен.Самостоятельное подключение — от 2 центов/мин.Читать анонс

Webhooks

Конечные точки вебхуков

Управляйте несколькими URL-адресами вебхуков с секретами и фильтрами событий для каждой конечной точки.

Система вебхуков на основе эндпоинтов позволяет регистрировать несколько назначений для каждой организации, каждое со своим секретом, своим статусом и своей подпиской на подмножество типов событий. Это рекомендуемая модель для всех новых интеграций.

Сравните с устаревшим вебхуком с одним URL, который сохраняется для обратной совместимости, но поддерживает только один URL на организацию.

Эндпоинты

МетодПутьТребуемая рольОписание
GET/v1/developer/webhook-endpointsadmin+Получить список эндпоинтов
POST/v1/developer/webhook-endpointsadmin+Создать эндпоинт
PATCH/v1/developer/webhook-endpoints/{endpoint_id}admin+Обновить метку / URL / события / статус
DELETE/v1/developer/webhook-endpoints/{endpoint_id}admin+Удалить эндпоинт
POST/v1/developer/webhook-endpoints/{endpoint_id}/testadmin+Отправить подписанную тестовую доставку

Объект эндпоинта

{
  "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"
}
ПолеТипОписание
idUUIDИдентификатор эндпоинта
labelstringОтображаемое имя, от 1 до 120 символов
urlstringHTTPS URL; http://localhost разрешён для разработки
eventsмассив строкТипы событий, на которые оформлена подписка (см. допустимые значения). Пустой массив подписывает на все события, кроме явных событий для каждого хода (telephony.turn / web.turn)
statusstringactive, disabled (приостановлен вручную) или failing (устанавливается автоматически, когда доставка исчерпывает расписание повторных попыток в течение 24 ч без единого ответа 2xx)
secret_hintstringПервые 4 и последние 4 символа секрета подписи с многоточием (a1b2…9f0e) — этого достаточно, чтобы сопоставить его с секретом, сохранённым локально, не раскрывая полное значение
created_at, updated_attimestamp

Допустимые типы событий

events проверяется по этому точному набору — значения вне списка возвращают 400. Формат полезной нагрузки для каждого типа см. в каталоге событий.

  • telephony.incoming, telephony.complete, telephony.tool, telephony.turn
  • web.incoming, web.complete, web.tool, web.turn
  • call.graded
  • issue.reported
  • test-call.completed
  • alert.triggered

Статусы эндпоинта

  • active — доставки выполняются в обычном режиме.
  • disabled — вручную приостановлен через PATCH. Запросы не отправляются. Мы никогда не меняем статус эндпоинта disabled; вернуть его в active всегда решаете вы.
  • failing — устанавливается автоматически, когда доставка на эндпоинт исчерпывает всё расписание повторных попыток (8 попыток в течение 24 часов), так и не получив ответ 2xx. Эндпоинт в состоянии сбоя не получает дальнейший трафик. После исправления эндпоинта через PATCH верните его статус в active; доставки, чьё расписание повторных попыток ещё не исчерпано, продолжатся с того места, на котором остановились.

Получить список эндпоинтов

cURL
curl https://api.thunderphone.com/v1/developer/webhook-endpoints \
  -H "Authorization: Bearer sk_live_YOUR_API_KEY"

Возвращает массив объектов эндпоинта.


Создание эндпоинта

cURL
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"]
  }'
Python
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
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
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
curl -X DELETE https://api.thunderphone.com/v1/developer/webhook-endpoints/c4d5e6f7-... \
  -H "Authorization: Bearer sk_live_YOUR_API_KEY"

Возвращает 204 No Content. Доставка на URL немедленно прекращается; выполняющиеся повторные попытки отменяются.


Связанные материалы