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

Вебхуки: приём запросов в скрипт

Триггер «По вебхуку» даёт скрипту секретный адрес. Внешний сервис (интернет-магазин, CRM, платёжная система, форма на сайте) отправляет на него запрос, Coverse сразу отвечает 200 OK и запускает функцию скрипта с данными запроса.

Входящие и исходящие вебхуки

Здесь речь о входящих запросах в скрипт. Если нужно, наоборот, получать уведомления об изменениях таблицы в своём сервисе, используйте подписки API: пример с уведомлениями в Telegram на портале API.

Создать адрес​

  1. В редакторе скрипта откройте вкладку «Триггеры» → «Добавить триггер» → «По вебхуку».
  2. Выберите функцию, которую будет вызывать запрос, например onWebhook.
  3. Скопируйте адрес и вставьте его в настройки внешнего сервиса.

Есть два способа передать секрет:

СпособАдресСекрет
Секрет в адресеhttps://app.coverse.team/api/hooks/scripts/whs_…часть адреса
Секрет в заголовкеhttps://app.coverse.team/api/hooks/scripts/<идентификатор триггера>заголовок X-Coverse-Token: whs_…

Адреса запросов попадают в журналы серверов по пути, поэтому, если сервис умеет отправлять свои заголовки, выбирайте секрет в заголовке.

Секрет видят только создатель триггера и владелец скрипта. Если секрет мог попасть в чужие руки, нажмите «Перевыпустить секрет»: старый адрес сразу перестанет работать, новый нужно вставить во внешний сервис.

Карточка триггера «По вебхуку»: адрес для отправителя и настройки защиты

Функция скрипта​

function onWebhook(event) {
if (!event) return;

const order = event.json || {};
Coverse.table.getSheet("Заказы").appendRow([
new Date(),
order.id,
order.customer,
Number(order.total),
]);
}

Поля события:

ПолеЧто содержит
event.jsonтело запроса, разобранное из JSON, или null
event.formполя формы, если тело в формате application/x-www-form-urlencoded
event.bodyтело запроса текстом
event.queryпараметры адреса (?source=shop)
event.headersзаголовки запроса
event.methodметод запроса
event.contentTypeтип содержимого
event.ipадрес отправителя
event.receivedAtвремя получения

Заголовки с учётными данными (Authorization, Cookie, X-Coverse-Token и подобные) в событие не попадают.

Пример запроса​

curl -X POST "https://app.coverse.team/api/hooks/scripts/ИДЕНТИФИКАТОР_ТРИГГЕРА" \
-H "X-Coverse-Token: whs_ВАШ_СЕКРЕТ" \
-H "Content-Type: application/json" \
-d '{"id": 1052, "customer": "Анна", "total": 1500}'

Ответ 200 с телом OK означает, что запрос принят. Такой ответ ждут платёжные сервисы и конструкторы сайтов, например ЮKassa, Т-Банк и Tilda. Скрипт выполняется уже после ответа, поэтому его результат во внешний сервис не возвращается. Посмотреть результат можно в журнале скрипта.

Защита​

ЗащитаКак работает
Секретный ключвсегда включён; запрос без верного ключа отклоняется
Разрешённые IP-адресадо 20 адресов или подсетей (CIDR), например 203.0.113.10, 198.51.100.0/24; запросы с других адресов отклоняются
HMAC-подписьсервис подписывает тело запроса ключом по алгоритму HMAC-SHA256 и передаёт подпись в заголовке (по умолчанию X-Signature); запрос без верной подписи отклоняется

Подпись принимается в виде hex, base64 или base64url, допускается префикс sha256=. Ключ подписи (от 8 до 200 символов) берётся из настроек внешнего сервиса и после сохранения скрывается.

Если 20 запросов подряд не прошли проверку адреса или подписи, триггер выключается, а владельцу скрипта приходит письмо. Включить его снова можно на вкладке «Триггеры».

Коды ответа​

КодerrorЧто значит
200—тело OK: запрос принят, скрипт запустится
401webhook_bad_signatureподписи нет или она неверная
403webhook_ip_not_allowedадрес отправителя не входит в разрешённые
403webhook_disabledтриггер выключен
403scripts_plan_requiredскрипты недоступны на тарифе владельца
404webhook_not_foundнеизвестный адрес или неверный секрет
405webhook_method_not_allowedнужен метод POST
413webhook_too_largeтело больше 100 КБ
422webhook_invalid_bodyтело не в кодировке UTF-8
429webhook_rate_limitedбольше 60 запросов в минуту на один адрес
429webhook_queue_fullслишком много запросов ждут обработки
429scripts_quota_exceededзакончились минуты скриптов на сегодня

Ответы с ошибкой приходят в JSON: {"message": "…", "error": "код"}. При ответе 429 заголовок Retry-After подсказывает, через сколько секунд повторить запрос.

Если запросы приходят часто​

Запросы, пришедшие, пока скрипт работает, встают в очередь и обрабатываются по порядку. Если очередь переполнена, Coverse отвечает 429 с ошибкой webhook_queue_full, и сервис может повторить запрос позже. Каждая обработка расходует минуты скриптов, поэтому для потока в сотни запросов в минуту лучше подойдёт API с записью из вашей системы напрямую.

Если, наоборот, ваш сервис должен сам писать в таблицу или получать уведомления о её изменениях, используйте API Coverse Таблиц: см. Первая интеграция.

Частые вопросы​

Как принять данные из внешнего сервиса в таблицу?​

Создайте триггер «По вебхуку»: появится секретный адрес. Сервис отправляет на него POST-запрос, Coverse отвечает 200 OK, а скрипт получает тело, параметры и заголовки запроса.

Как защитить адрес вебхука?​

Адрес содержит секрет. Дополнительно можно ограничить IP-адреса отправителей, включить проверку HMAC-подписи или передавать секрет в заголовке X-Coverse-Token.

Что отвечает вебхук скрипта?​

При успешном приёме — 200 с телом OK до запуска скрипта. Ошибки приходят в JSON с кодом 401, 403, 404, 413 или 429.

Что дальше​