Вебхуки
Методов в разделе: 8. Все методы
GET /webhooks Доступно
#Список подписок
Подписки этой интеграции (не больше 10). Секрет подписи не возвращается.
- Области
webhooks:manage
- Предел частоты
- чтение
- Идемпотентность
- не требуется
- Успешный ответ
200 Страница подписок.
Тело ответа
| Поле | Тип | Описание |
|---|
data | array<Webhook> обязательное | |
next_cursor | string обязательное, может быть null | Курсор следующей страницы; null — список закончился. Живёт 24 часа. |
Примеры
Запрос
curl -X GET 'https://wfacademy.org/api/public/v1/webhooks' \
-H 'Authorization: Bearer '"$SAPPORT_API_KEY"
Ответ 200
{
"data": [
{
"id": "EXAMPLE_ID",
"url": "https://example.com/hooks/sapport",
"events": [
null
],
"include_pii": false,
"description": null,
"status": "active",
"created_at": "2026-10-11T09:00:00Z",
"updated_at": "2026-10-11T09:00:00Z",
"secret_rotated_at": null,
"previous_secret_expires_at": null
}
],
"next_cursor": "EXAMPLE_CURSOR"
}
Пример ошибки
{
"type": "https://wfacademy.org/developers/errors#scope_missing",
"title": "Scope is missing",
"status": 403,
"code": "scope_missing",
"detail": "EXAMPLE",
"request_id": "req_EXAMPLE"
}
Примеры иллюстративны: ключ в них условный (EXAMPLE), значения полей выдуманы.
Возможные ошибки
invalid_api_key wrong_cell integration_inactive tenant_inactive ip_not_allowed feature_not_in_plan rate_limited wallet_suspended service_unavailable internal_error scope_missing
POST /webhooks Доступно
#Создать подписку
Создаёт подписку на события. Секрет подписи показывается один раз, в этом ответе. Адрес проверяется защитой от SSRF; include_pii: true разрешён только для событий lead.*, contact.*, conversation.*.
- Области
webhooks:manage
- Предел частоты
- запись
- Идемпотентность
- обязателен Idempotency-Key
- Успешный ответ
201 Подписка с секретом.
Параметры
| Поле | Тип | Описание |
|---|
Idempotency-Key | string обязательное | Где: header. Уникальная строка (обычно UUID v4), новая для каждой новой операции. Повтор с тем же ключом и телом даёт тот же результат. |
Тело запроса Параметры подписки.
| Поле | Тип | Описание |
|---|
url | string обязательное | Адрес приёма: https, порт 443, имя хоста (не IP), без переадресаций. |
events | array<string> обязательное | Типы событий: точный тип или шаблон семейства "семейство.*". Доступные типы: conversation.created, message.created, conversation.handoff_requested, conversation.summary_ready, lead.created, lead.updated, lead.scored, lead.status_changed, lead.action_requested, task.created, task.completed, contact.merged, crm.mode_changed, article.ready, article.published, article.generation.failed, strategist.report.ready, strategist.turn.completed, operation.completed, api_key.expiring. |
include_pii | boolean необязательное | Полная нагрузка с персональными данными; только для событий lead.*, contact.*, conversation.*. По умолчанию false. |
description | string необязательное, может быть null | Пометка для вас, до 200 знаков. |
Тело ответа
| Поле | Тип | Описание |
|---|
id | string обязательное | Идентификатор подписки. |
url | string обязательное | Адрес приёма: https, порт 443, имя хоста (не IP), без переадресаций. |
events | array<string> обязательное | Типы событий: точный тип или шаблон семейства "семейство.*". Доступные типы: conversation.created, message.created, conversation.handoff_requested, conversation.summary_ready, lead.created, lead.updated, lead.scored, lead.status_changed, lead.action_requested, task.created, task.completed, contact.merged, crm.mode_changed, article.ready, article.published, article.generation.failed, strategist.report.ready, strategist.turn.completed, operation.completed, api_key.expiring. |
include_pii | boolean обязательное | Полная нагрузка с персональными данными; только для событий lead.*, contact.*, conversation.*. По умолчанию false. |
description | string обязательное, может быть null | Пометка для вас, до 200 знаков. |
status | string обязательное | active — доставки идут; paused — приостановлена. Значения: active paused |
created_at | string обязательное | ISO 8601 UTC. |
updated_at | string обязательное | ISO 8601 UTC. |
secret_rotated_at | string обязательное, может быть null | Время последней ротации секрета; null — не менялся. |
previous_secret_expires_at | string обязательное, может быть null | Пока окно ротации открыто (24 часа) — когда прежний секрет перестанет действовать; иначе null. |
secret | string обязательное, может быть null | Секрет подписи: показывается ОДИН раз, в ответе создания или ротации. При идемпотентном повторе запроса — null: сохраните секрет из первого ответа. |
Примеры
Запрос
curl -X POST 'https://wfacademy.org/api/public/v1/webhooks' \
-H 'Authorization: Bearer '"$SAPPORT_API_KEY" \
-H 'Idempotency-Key: '"$(uuidgen)" \
-H 'Content-Type: application/json' \
-d '{
"url": "https://example.com/hooks/sapport",
"events": [
"string"
],
"include_pii": false,
"description": "string"
}'
Ответ 201
{
"id": "EXAMPLE_ID",
"url": "https://example.com/hooks/sapport",
"events": [
"string"
],
"include_pii": false,
"description": "string",
"status": "active",
"created_at": "2026-10-11T09:00:00Z",
"updated_at": "2026-10-11T09:00:00Z",
"secret_rotated_at": "2026-10-11T09:00:00Z",
"previous_secret_expires_at": "2026-10-11T09:00:00Z",
"secret": "string"
}
Пример ошибки
{
"type": "https://wfacademy.org/developers/errors#scope_missing",
"title": "Scope is missing",
"status": 403,
"code": "scope_missing",
"detail": "EXAMPLE",
"request_id": "req_EXAMPLE"
}
Примеры иллюстративны: ключ в них условный (EXAMPLE), значения полей выдуманы.
Возможные ошибки
invalid_api_key wrong_cell integration_inactive tenant_inactive ip_not_allowed feature_not_in_plan rate_limited wallet_suspended service_unavailable internal_error scope_missing pii_transfer_not_allowed bad_request validation_failed payload_too_large idempotency_key_required idempotency_conflict operation_in_progress invalid_state
GET /webhooks/{id} Доступно
#Получить подписку
Подписка без секрета.
- Области
webhooks:manage
- Предел частоты
- чтение
- Идемпотентность
- не требуется
- Успешный ответ
200 Подписка.
Параметры
| Поле | Тип | Описание |
|---|
id | string обязательное | Где: path. Идентификатор подписки. |
Тело ответа
| Поле | Тип | Описание |
|---|
id | string обязательное | Идентификатор подписки. |
url | string обязательное | Адрес приёма: https, порт 443, имя хоста (не IP), без переадресаций. |
events | array<string> обязательное | Типы событий: точный тип или шаблон семейства "семейство.*". Доступные типы: conversation.created, message.created, conversation.handoff_requested, conversation.summary_ready, lead.created, lead.updated, lead.scored, lead.status_changed, lead.action_requested, task.created, task.completed, contact.merged, crm.mode_changed, article.ready, article.published, article.generation.failed, strategist.report.ready, strategist.turn.completed, operation.completed, api_key.expiring. |
include_pii | boolean обязательное | Полная нагрузка с персональными данными; только для событий lead.*, contact.*, conversation.*. По умолчанию false. |
description | string обязательное, может быть null | Пометка для вас, до 200 знаков. |
status | string обязательное | active — доставки идут; paused — приостановлена. Значения: active paused |
created_at | string обязательное | ISO 8601 UTC. |
updated_at | string обязательное | ISO 8601 UTC. |
secret_rotated_at | string обязательное, может быть null | Время последней ротации секрета; null — не менялся. |
previous_secret_expires_at | string обязательное, может быть null | Пока окно ротации открыто (24 часа) — когда прежний секрет перестанет действовать; иначе null. |
Примеры
Запрос
curl -X GET 'https://wfacademy.org/api/public/v1/webhooks/EXAMPLE_ID' \
-H 'Authorization: Bearer '"$SAPPORT_API_KEY"
Ответ 200
{
"id": "EXAMPLE_ID",
"url": "https://example.com/hooks/sapport",
"events": [
"string"
],
"include_pii": false,
"description": "string",
"status": "active",
"created_at": "2026-10-11T09:00:00Z",
"updated_at": "2026-10-11T09:00:00Z",
"secret_rotated_at": "2026-10-11T09:00:00Z",
"previous_secret_expires_at": "2026-10-11T09:00:00Z"
}
Пример ошибки
{
"type": "https://wfacademy.org/developers/errors#scope_missing",
"title": "Scope is missing",
"status": 403,
"code": "scope_missing",
"detail": "EXAMPLE",
"request_id": "req_EXAMPLE"
}
Примеры иллюстративны: ключ в них условный (EXAMPLE), значения полей выдуманы.
Возможные ошибки
invalid_api_key wrong_cell integration_inactive tenant_inactive ip_not_allowed feature_not_in_plan rate_limited wallet_suspended service_unavailable internal_error scope_missing not_found
PATCH /webhooks/{id} Доступно
#Изменить подписку
Меняет адрес, события, пометку, статус (active или paused) и include_pii. Передайте хотя бы одно поле.
- Области
webhooks:manage
- Предел частоты
- запись
- Идемпотентность
- не требуется
- Успешный ответ
200 Подписка после правки.
Параметры
| Поле | Тип | Описание |
|---|
id | string обязательное | Где: path. Идентификатор подписки. |
Тело запроса Изменяемые поля.
| Поле | Тип | Описание |
|---|
url | string необязательное | Адрес приёма: https, порт 443, имя хоста (не IP), без переадресаций. |
events | array<string> необязательное | Типы событий: точный тип или шаблон семейства "семейство.*". Доступные типы: conversation.created, message.created, conversation.handoff_requested, conversation.summary_ready, lead.created, lead.updated, lead.scored, lead.status_changed, lead.action_requested, task.created, task.completed, contact.merged, crm.mode_changed, article.ready, article.published, article.generation.failed, strategist.report.ready, strategist.turn.completed, operation.completed, api_key.expiring. |
include_pii | boolean необязательное | Полная нагрузка с персональными данными; только для событий lead.*, contact.*, conversation.*. По умолчанию false. |
description | string необязательное, может быть null | Пометка для вас, до 200 знаков. |
status | string необязательное | Приостановить или возобновить доставки. Значения: active paused |
Тело ответа
| Поле | Тип | Описание |
|---|
id | string обязательное | Идентификатор подписки. |
url | string обязательное | Адрес приёма: https, порт 443, имя хоста (не IP), без переадресаций. |
events | array<string> обязательное | Типы событий: точный тип или шаблон семейства "семейство.*". Доступные типы: conversation.created, message.created, conversation.handoff_requested, conversation.summary_ready, lead.created, lead.updated, lead.scored, lead.status_changed, lead.action_requested, task.created, task.completed, contact.merged, crm.mode_changed, article.ready, article.published, article.generation.failed, strategist.report.ready, strategist.turn.completed, operation.completed, api_key.expiring. |
include_pii | boolean обязательное | Полная нагрузка с персональными данными; только для событий lead.*, contact.*, conversation.*. По умолчанию false. |
description | string обязательное, может быть null | Пометка для вас, до 200 знаков. |
status | string обязательное | active — доставки идут; paused — приостановлена. Значения: active paused |
created_at | string обязательное | ISO 8601 UTC. |
updated_at | string обязательное | ISO 8601 UTC. |
secret_rotated_at | string обязательное, может быть null | Время последней ротации секрета; null — не менялся. |
previous_secret_expires_at | string обязательное, может быть null | Пока окно ротации открыто (24 часа) — когда прежний секрет перестанет действовать; иначе null. |
Примеры
Запрос
curl -X PATCH 'https://wfacademy.org/api/public/v1/webhooks/EXAMPLE_ID' \
-H 'Authorization: Bearer '"$SAPPORT_API_KEY" \
-H 'Content-Type: application/json' \
-d '{
"url": "https://example.com/hooks/sapport",
"events": [
"string"
],
"include_pii": false,
"description": "string",
"status": "active"
}'
Ответ 200
{
"id": "EXAMPLE_ID",
"url": "https://example.com/hooks/sapport",
"events": [
"string"
],
"include_pii": false,
"description": "string",
"status": "active",
"created_at": "2026-10-11T09:00:00Z",
"updated_at": "2026-10-11T09:00:00Z",
"secret_rotated_at": "2026-10-11T09:00:00Z",
"previous_secret_expires_at": "2026-10-11T09:00:00Z"
}
Пример ошибки
{
"type": "https://wfacademy.org/developers/errors#scope_missing",
"title": "Scope is missing",
"status": 403,
"code": "scope_missing",
"detail": "EXAMPLE",
"request_id": "req_EXAMPLE"
}
Примеры иллюстративны: ключ в них условный (EXAMPLE), значения полей выдуманы.
Возможные ошибки
invalid_api_key wrong_cell integration_inactive tenant_inactive ip_not_allowed feature_not_in_plan rate_limited wallet_suspended service_unavailable internal_error scope_missing pii_transfer_not_allowed not_found bad_request validation_failed payload_too_large
DELETE /webhooks/{id} Доступно
#Удалить подписку
Удаляет подписку вместе с журналом доставок. Повторное удаление вернёт not_found.
- Области
webhooks:manage
- Предел частоты
- запись
- Идемпотентность
- не требуется
- Успешный ответ
204 Подписка удалена; тела нет.
Параметры
| Поле | Тип | Описание |
|---|
id | string обязательное | Где: path. Идентификатор подписки. |
Примеры
Запрос
curl -X DELETE 'https://wfacademy.org/api/public/v1/webhooks/EXAMPLE_ID' \
-H 'Authorization: Bearer '"$SAPPORT_API_KEY"
Пример ошибки
{
"type": "https://wfacademy.org/developers/errors#scope_missing",
"title": "Scope is missing",
"status": 403,
"code": "scope_missing",
"detail": "EXAMPLE",
"request_id": "req_EXAMPLE"
}
Примеры иллюстративны: ключ в них условный (EXAMPLE), значения полей выдуманы.
Возможные ошибки
invalid_api_key wrong_cell integration_inactive tenant_inactive ip_not_allowed feature_not_in_plan rate_limited wallet_suspended service_unavailable internal_error scope_missing not_found
POST /webhooks/{id}/rotate-secret Доступно
#Заменить секрет
Выпускает новый секрет (показывается один раз). 24 часа действуют оба секрета, каждая доставка подписана обоими.
- Области
webhooks:manage
- Предел частоты
- запись
- Идемпотентность
- обязателен Idempotency-Key
- Успешный ответ
200 Подписка с новым секретом.
Параметры
| Поле | Тип | Описание |
|---|
id | string обязательное | Где: path. Идентификатор подписки. |
Idempotency-Key | string обязательное | Где: header. Уникальная строка (обычно UUID v4), новая для каждой новой операции. Повтор с тем же ключом и телом даёт тот же результат. |
Тело ответа
| Поле | Тип | Описание |
|---|
id | string обязательное | Идентификатор подписки. |
url | string обязательное | Адрес приёма: https, порт 443, имя хоста (не IP), без переадресаций. |
events | array<string> обязательное | Типы событий: точный тип или шаблон семейства "семейство.*". Доступные типы: conversation.created, message.created, conversation.handoff_requested, conversation.summary_ready, lead.created, lead.updated, lead.scored, lead.status_changed, lead.action_requested, task.created, task.completed, contact.merged, crm.mode_changed, article.ready, article.published, article.generation.failed, strategist.report.ready, strategist.turn.completed, operation.completed, api_key.expiring. |
include_pii | boolean обязательное | Полная нагрузка с персональными данными; только для событий lead.*, contact.*, conversation.*. По умолчанию false. |
description | string обязательное, может быть null | Пометка для вас, до 200 знаков. |
status | string обязательное | active — доставки идут; paused — приостановлена. Значения: active paused |
created_at | string обязательное | ISO 8601 UTC. |
updated_at | string обязательное | ISO 8601 UTC. |
secret_rotated_at | string обязательное, может быть null | Время последней ротации секрета; null — не менялся. |
previous_secret_expires_at | string обязательное, может быть null | Пока окно ротации открыто (24 часа) — когда прежний секрет перестанет действовать; иначе null. |
secret | string обязательное, может быть null | Секрет подписи: показывается ОДИН раз, в ответе создания или ротации. При идемпотентном повторе запроса — null: сохраните секрет из первого ответа. |
Примеры
Запрос
curl -X POST 'https://wfacademy.org/api/public/v1/webhooks/EXAMPLE_ID/rotate-secret' \
-H 'Authorization: Bearer '"$SAPPORT_API_KEY" \
-H 'Idempotency-Key: '"$(uuidgen)"
Ответ 200
{
"id": "EXAMPLE_ID",
"url": "https://example.com/hooks/sapport",
"events": [
"string"
],
"include_pii": false,
"description": "string",
"status": "active",
"created_at": "2026-10-11T09:00:00Z",
"updated_at": "2026-10-11T09:00:00Z",
"secret_rotated_at": "2026-10-11T09:00:00Z",
"previous_secret_expires_at": "2026-10-11T09:00:00Z",
"secret": "string"
}
Пример ошибки
{
"type": "https://wfacademy.org/developers/errors#scope_missing",
"title": "Scope is missing",
"status": 403,
"code": "scope_missing",
"detail": "EXAMPLE",
"request_id": "req_EXAMPLE"
}
Примеры иллюстративны: ключ в них условный (EXAMPLE), значения полей выдуманы.
Возможные ошибки
invalid_api_key wrong_cell integration_inactive tenant_inactive ip_not_allowed feature_not_in_plan rate_limited wallet_suspended service_unavailable internal_error scope_missing not_found idempotency_key_required idempotency_conflict operation_in_progress
POST /webhooks/{id}/test Доступно
#Тестовая доставка
Ставит в очередь событие webhook.test (livemode: false) только для этой подписки. Подписка должна быть active.
- Области
webhooks:manage
- Предел частоты
- запись
- Идемпотентность
- обязателен Idempotency-Key
- Успешный ответ
202 Событие поставлено в очередь.
Параметры
| Поле | Тип | Описание |
|---|
id | string обязательное | Где: path. Идентификатор подписки. |
Idempotency-Key | string обязательное | Где: header. Уникальная строка (обычно UUID v4), новая для каждой новой операции. Повтор с тем же ключом и телом даёт тот же результат. |
Тело ответа
| Поле | Тип | Описание |
|---|
event_id | string обязательное, может быть null | Идентификатор тестового события. |
type | string обязательное | |
status | string обязательное | Событие в очереди; уйдёт на ближайшем запуске доставщика (до минуты). |
Примеры
Запрос
curl -X POST 'https://wfacademy.org/api/public/v1/webhooks/EXAMPLE_ID/test' \
-H 'Authorization: Bearer '"$SAPPORT_API_KEY" \
-H 'Idempotency-Key: '"$(uuidgen)"
Ответ 202
{
"event_id": "EXAMPLE_ID",
"type": "string",
"status": "string"
}
Пример ошибки
{
"type": "https://wfacademy.org/developers/errors#scope_missing",
"title": "Scope is missing",
"status": 403,
"code": "scope_missing",
"detail": "EXAMPLE",
"request_id": "req_EXAMPLE"
}
Примеры иллюстративны: ключ в них условный (EXAMPLE), значения полей выдуманы.
Возможные ошибки
invalid_api_key wrong_cell integration_inactive tenant_inactive ip_not_allowed feature_not_in_plan rate_limited wallet_suspended service_unavailable internal_error scope_missing not_found invalid_state idempotency_key_required idempotency_conflict operation_in_progress
GET /webhooks/{id}/deliveries Доступно
#Журнал доставок
Попытки доставки подписки, новые первыми; хранятся 30 суток.
- Области
webhooks:manage
- Предел частоты
- чтение
- Идемпотентность
- не требуется
- Успешный ответ
200 Страница журнала.
Параметры
| Поле | Тип | Описание |
|---|
id | string обязательное | Где: path. Идентификатор подписки. |
limit | integer необязательное | Где: query. Размер страницы: от 1 до 100, по умолчанию 25. |
cursor | string необязательное | Где: query. Значение next_cursor из предыдущего ответа. Живёт 24 часа; при смене фильтров начинайте заново. |
state | string необязательное | Где: query. Фильтр по состоянию доставки. |
Тело ответа
| Поле | Тип | Описание |
|---|
data | array<WebhookDelivery> обязательное | |
next_cursor | string обязательное, может быть null | Курсор следующей страницы; null — список закончился. Живёт 24 часа. |
Примеры
Запрос
curl -X GET 'https://wfacademy.org/api/public/v1/webhooks/EXAMPLE_ID/deliveries' \
-H 'Authorization: Bearer '"$SAPPORT_API_KEY"
Ответ 200
{
"data": [
{
"id": "EXAMPLE_ID",
"event_id": "EXAMPLE_ID",
"state": "pending",
"attempt": 0,
"status_code": null,
"duration_ms": null,
"error": null,
"next_attempt_at": null,
"delivered_at": null,
"created_at": "2026-10-11T09:00:00Z"
}
],
"next_cursor": "EXAMPLE_CURSOR"
}
Пример ошибки
{
"type": "https://wfacademy.org/developers/errors#scope_missing",
"title": "Scope is missing",
"status": 403,
"code": "scope_missing",
"detail": "EXAMPLE",
"request_id": "req_EXAMPLE"
}
Примеры иллюстративны: ключ в них условный (EXAMPLE), значения полей выдуманы.
Возможные ошибки
invalid_api_key wrong_cell integration_inactive tenant_inactive ip_not_allowed feature_not_in_plan rate_limited wallet_suspended service_unavailable internal_error scope_missing not_found validation_failed