
Язык 🇷🇺 Русский
Обзор
Реализация
За кулисами
Вебхуки
С FastComments можно вызывать конечную точку API всякий раз, когда комментарий добавляется, обновляется или удаляется в нашей системе.
Мы реализуем это с помощью асинхронных вебхуков по протоколам HTTP/HTTPS.
Что такое вебхуки 
Вебхук — это механизм, или интеграция, между двумя системами, где "производитель" (FastComments) генерирует событие которое "потребитель" (Вы) получает посредством вызова API.
Поддерживаемые события и ресурсы 
FastComments поддерживает вебхуки только для ресурса Comment.
Мы поддерживаем вебхуки для создания комментариев, их удаления и обновления.
Каждое из этих действий считается отдельным событием в нашей системе, поэтому у вебхуков разных событий разные семантика и структура.
Любое количество конечных точек может подписаться на одно и то же событие, через панель управления или через API (см. Управление вебхуками через API). Каждый вебхук доставляется независимо.
Настройка локальной разработки 
Для локальной разработки используйте инструмент, такой как ngrok.
Чтобы упростить поддержание безопасности системы, локальная разработка следует тому же процессу, что и настройка и защита других окружений.
Шаг 1: Добавьте "localhost" в домены в вашем аккаунте.
Добавьте "localhost" в качестве домена здесь.
Шаг 2: Выберите API‑ключ
Мы собираемся добавить конфигурацию вебхука для вашего домена, поэтому нам понадобится API‑ключ. Вы можете сделать это здесь.
В разделе «Associate with domain» — выберите ваш домен «localhost».
ПРИМЕЧАНИЕ: Вместо этого вы можете использовать один API‑секрет для всей тестовой активности и сред предварительного развертывания. Просто добавьте API‑секрет для «All Domains» и дайте ему имя, например, «test».
Убедитесь, что у вас определён API‑секрет для ваших производственных доменов. События для всех остальных доменов будут использовать wildcard‑секрет (тестовый).
Шаг 3: Добавьте ваш вебхук
Во время работы ngrok или аналогичного инструмента задайте значение для "localhost" здесь.
При нажатии Send Test Payload мы отправим два тестовых события, чтобы проверить, что вы валидируете API‑ключ.
После успешной проверки нажмите Save.
Шаг 4: Добавьте комментарий
Теперь вы можете добавлять, редактировать или удалять комментарии и должны увидеть, как мы вызываем вашу локальную машину разработки с событиями, используя ваш тестовый API‑ключ. Может быть задержка до 30 секунд, пока события не достигнут вашей машины.
Настройка 
Следуйте тем же шагам для localhost, как и для продакшн. Убедитесь, что у вас настроены домены продакшн и секреты API.
Сначала перейдите в Webhooks admin. Это доступно через Manage Data -> Webhooks.
На странице перечислены все вебхуки в вашей учетной записи:
Нажмите New Webhook, чтобы добавить его. Каждый вебхук имеет URL, одно событие комментария (создан, обновлен или удалён), домен и HTTP‑метод:
Каждый вебхук доставляется независимо. Вы можете отправлять одно и то же событие на несколько конечных точек, и вебхук, ограниченный All Domains, получает комментарии со всех доменов, даже если для того же события существует вебхук, привязанный к конкретному домену. Один и тот же URL, событие и домен нельзя добавить дважды.
Перед сохранением нажмите Send Test Payload, чтобы проверить, принимает ли конечная точка подписанный запрос. См. следующий раздел, "Testing", для подробностей.
В списке вы можете редактировать, отключать, повторно включать или удалять вебхук. Отключение сохраняет ожидающие события до повторного включения вебхука; удаление их удаляет.
Вебхуки также могут быть созданы через API, например с помощью Zapier. Они появляются в том же списке с источником API. См. Managing Webhooks via the API.
Тестирование 
Новые и страницы редактирования вебхуков имеют кнопку Send Test Payload, которая отправляет запрос на URL, указанный в форме, независимо от того, был он сохранён или нет. События Create и Update отправляют фиктивный объект WebhookComment, а при тестировании Delete будет отправлено фиктивное тело запроса, содержащее только ID.
Проверка полезных данных
При тестировании интеграции вебхука убедитесь, что входящие запросы содержат следующие заголовки:
X-FastComments-Timestamp– Unix‑временная метка (секунды)X-FastComments-Signature– подпись HMAC‑SHA256
Вебхуки, созданные до внедрения схемы подписи, также получают заголовок token, содержащий ваш API‑секрет. Новые вебхуки его не получают.
Используйте проверку подписи HMAC, чтобы убедиться в подлинности полезных данных.
Инструменты тестирования
Вы можете использовать такие инструменты, как webhook.site или ngrok, чтобы просматривать входящие полезные данные вебхуков во время разработки.
Типы событий
- Create Event: Событие, вызываемое при создании нового комментария.
- Update Event: Событие, вызываемое при редактировании комментария.
- Delete Event: Событие, вызываемое при удалении комментария.
Каждый вебхук привязан к одному событию и одному HTTP‑методу (POST, PUT или DELETE). Каждое событие включает полные данные комментария в теле запроса (см. Data Structures для формата полезных данных).
Структуры данных 
Единственная структура, отправляемая через вебхуки, — объект WebhookComment, описанный ниже на TypeScript.
Структура объекта WebhookComment
Структура события "Create"
Тело запроса события "create" представляет собой объект WebhookComment.
Структура события "Update"
Тело запроса события "update" представляет собой объект WebhookComment.
Структура события "Delete"
Тело запроса события "delete" представляет собой объект WebhookComment.
Изменения от 14 ноября 2023 г.
Ранее тело запроса события "delete" содержало только идентификатор комментария. Теперь оно содержит полный комментарий на момент удаления.
Каждый ключ всегда присутствует в теле. Когда у комментария нет значения для поля, тело содержит null
(или false для булевых значений и [] для списков), поэтому структура доставки никогда не меняется от комментария к комментарию.
Run 
Когда пользователи упоминаются в комментарии, информация сохраняется в списке под названием mentions. Каждый объект в этом списке имеет следующую структуру.
Run 
Каждый элемент списка badges имеет следующую структуру. Смотрите руководство по значкам для типов значков.
Run 
HTTP-методы
Вы можете настроить HTTP-метод для каждого типа события вебхука в админ-панели:
- Create Event: POST или PUT (по умолчанию: PUT)
- Update Event: POST или PUT (по умолчанию: PUT)
- Delete Event: DELETE, POST или PUT (по умолчанию: DELETE)
Поскольку все запросы содержат ID, операции Create и Update по умолчанию идемпотентны (PUT). Повторение того же запроса Create или Update не должно создавать дублирующие объекты у вас.
Заголовки запроса
Каждый запрос вебхука включает следующие заголовки:
| Header | Описание |
|---|---|
Content-Type | application/json |
token | Ваш API‑секрет |
X-FastComments-Timestamp | Unix‑временная метка (секунды) при подписи запроса |
X-FastComments-Signature | HMAC‑SHA256 подпись (sha256=<hex>) |
Смотрите Безопасность и API‑токены для информации о проверке HMAC‑подписи.
Безопасность и токены API 
Запросы вебхуков FastComments включают несколько механизмов аутентификации для обеспечения безопасности.
Отправляемые заголовки
| Заголовок | Описание |
|---|---|
token | Ваш API Secret (для обратной совместимости) |
X-FastComments-Timestamp | Unix-время (в секундах), когда запрос был подписан |
X-FastComments-Signature | Подпись HMAC-SHA256 полезной нагрузки |
Проверка подписи HMAC (рекомендуется)
Мы настоятельно рекомендуем проверять подпись HMAC, чтобы убедиться, что полезная нагрузка вебхука подлинная и не была изменена.
Формат подписи: sha256=<hex-encoded-signature>
Как вычисляется подпись:
- Конкатенация:
timestamp + "." + JSON_payload_body - Вычисление HMAC-SHA256 с использованием вашего API Secret в качестве ключа
- Кодирование результата в hex
Пример проверки (Node.js)
const crypto = require('crypto');
function verifyWebhookSignature(req, apiSecret) {
const timestamp = req.headers['x-fastcomments-timestamp'];
const signature = req.headers['x-fastcomments-signature'];
if (!timestamp || !signature) {
return false;
}
// Проверка, что временная метка свежая (в пределах 5 минут)
const now = Math.floor(Date.now() / 1000);
if (Math.abs(now - parseInt(timestamp, 10)) > 300) {
return false; // Защита от атак повторного воспроизведения
}
// Проверка подписи
const payload = JSON.stringify(req.body);
const expectedSignature = crypto
.createHmac('sha256', apiSecret)
.update(`${timestamp}.${payload}`)
.digest('hex');
return signature === `sha256=${expectedSignature}`;
}
Пример проверки (Python)
import hmac
import hashlib
import time
import json
def verify_webhook_signature(headers, body, api_secret):
timestamp = headers.get('X-FastComments-Timestamp')
signature = headers.get('X-FastComments-Signature')
if not timestamp or not signature:
return False
# Проверка, что временная метка свежая
now = int(time.time())
if abs(now - int(timestamp)) > 300:
return False
# Проверка подписи
payload = json.dumps(body, separators=(',', ':'))
message = f"{timestamp}.{payload}"
expected = hmac.new(
api_secret.encode(),
message.encode(),
hashlib.sha256
).hexdigest()
return signature == f"sha256={expected}"
Пример проверки (PHP)
function verifyWebhookSignature($headers, $body, $apiSecret) {
$timestamp = $headers['X-FastComments-Timestamp'] ?? null;
$signature = $headers['X-FastComments-Signature'] ?? null;
if (!$timestamp || !$signature) {
return false;
}
// Проверка, что временная метка свежая (в пределах 5 минут)
$now = time();
if (abs($now - intval($timestamp)) > 300) {
return false;
}
// Проверка подписи
$payload = json_encode($body, JSON_UNESCAPED_SLASHES);
$message = $timestamp . '.' . $payload;
$expectedSignature = 'sha256=' . hash_hmac('sha256', $message, $apiSecret);
return hash_equals($expectedSignature, $signature);
}
Устаревшая аутентификация
Заголовок token, содержащий ваш API Secret, по-прежнему отправляется для обратной совместимости. Однако мы рекомендуем перейти на проверку HMAC для повышения безопасности, так как она защищает от атак повторного воспроизведения.
Управление вебхуками через API 
Webhooks также могут управляться через REST API. Так интеграции, такие как Zapier, подписываются на события комментариев, не открывая панель управления, и следуют шаблону REST Hooks: подписка, получение событий, отписка.
Подписки API находятся рядом с вебхуками, настроенными в панели управления. Событие комментария доставляется каждому вебхуку, который соответствует его домену, каждое как отдельная доставка, независимо от того, как вебхук был создан.
Аутентификация
Каждый запрос требует ваш API‑ключ в заголовке x-api-key (или параметр запроса API_KEY) и
идентификатор арендатора в параметреестре tenantId. Оба отображаются на странице API Secret в панели управления.
Подписка
POST https://fastcomments.com/api/v1/webhooks?tenantId=YOUR_TENANT_ID
x-api-key: YOUR_API_KEY
Content-Type: application/json
{
"url": "https://hooks.zapier.com/hooks/catch/123/abc",
"event": "comment-created"
}| Поле | Обязательно | Описание |
|---|---|---|
url | Да | Абсолютный URL http или https. |
event | Да | comment-created, comment-updated или comment-deleted. |
domain | Нет | Домен из конфигурации вашей учётной записи. По умолчанию *, который получает события для всех доменов. |
method | Нет | POST (по умолчанию), PUT или DELETE. |
Ответ содержит подписку:
{
"status": "success",
"webhook": {
"id": "66f1c4c1e7a2b3d4f5a6b7c8",
"url": "https://hooks.zapier.com/hooks/catch/123/abc",
"event": "comment-created",
"domain": "*",
"method": "POST",
"source": "api",
"enabled": true,
"createdAt": "2026-09-08T12:00:00.000Z"
}
}
Подписка той же URL на то же событие и домен снова возвращает существующую подписку, а не создаёт дубликат, поэтому клиент может безопасно повторять запрос. Каждый арендатор может иметь до 50 подписок API.
Список
GET https://fastcomments.com/api/v1/webhooks?tenantId=YOUR_TENANT_ID
Возвращает каждый вебхук арендатора, включая управляемые в панели ("source": "dashboard").
Фильтруйте по event, domain или source.
Отписка
DELETE https://fastcomments.com/api/v1/webhooks/SUBSCRIPTION_ID?tenantId=YOUR_TENANT_ID
Удаление подписки также отбрасывает любые события, ещё находящиеся в очереди. Только подписки,
созданные через API, могут быть удалены таким способом; вебхук из панели управления или идентификатор,
который не существует в вашей учётной записи, возвращает 404 с кодом not-found. Вебхуки из панели
управления редактируются на странице Webhooks.
Полезные нагрузки и подпись
Доставки используют тот же полезный payload, что и вебхуки из панели (см. Data Structures) и подписываются тем же
схемой HMAC (см. Security & API Tokens). Подписки API никогда не получают устаревший заголовок token,
поэтому проверяйте заголовок X-FastComments-Signature вместо него.
Пример полезных нагрузок
GET https://fastcomments.com/api/v1/webhooks/sample-payloads?tenantId=YOUR_TENANT_ID&event=comment-created&limit=3
Возвращает самые последние комментарии учётной записи точно в том виде, в котором их передаёт доставка,
поэтому интеграция может показать реальные примерные данные до поступления первого события. event необязателен
и только проверяется, поскольку каждое событие передаёт один и тот же объект комментария. limit по умолчанию 3
и принимает значения от 1 до 10. Стоимость — 2 кредита API.
{
"status": "success",
"payloads": [
{
"id": "66f1c4c1e7a2b3d4f5a6b7c8",
"urlId": "https://example.com/blog/hello-world",
"commenterName": "Jane Reader",
",
"comment": "Great article!",
"date": "2026-09-08T12:00:00.000Z",
"approved": true
}
]
}
Ответ с 410 Gone
Если конечная точка подписки API отвечает HTTP 410 Gone, FastComments рассматривает это как
отписку: подписка удаляется вместе с её ожидающими событиями, и дальнейшие доставки не
производятся. Вебхуки, настроенные в панели, никогда не удаляются автоматически; для них 410 —
обычная ошибка. Любой другой статус ошибки повторяется и в конечном итоге отключает вебхук, как описано
в разделе How it Works & Handling Retries.
Панель управления
Подписки API отображаются в списке Webhooks с источником API, где администратор может редактировать, отключать, повторно включать или удалять их.
Как это работает и обработка повторных попыток 
Все изменения объекта Comment в системе вызывают событие, которое попадает в очередь.
Изначальное событие вебхука обычно отправляется в течение шести секунд после возникновения источника события.
Вы можете отслеживать эту очередь в админ-панели Webhooks на случай, если ваш API выйдет из строя.
Если запрос к вашему API не удаётся, мы повторно поставим его в очередь по расписанию.
Это расписание — 1 Minute * the retry count. Если вызов не удастся один раз, запрос будет повторён через минуту. Если он не сработает дважды, повторная попытка будет через две минуты, и так далее. Это делается, чтобы не перегружать ваш API, если он выходит из строя по причинам, связанным с нагрузкой.
Webhooks можно отменить на странице журналов.
В заключение
На этом завершается наша документация по Webhooks.
Мы надеемся, что интеграция FastComments Webhook окажется понятной и быстрой в настройке.
Если вы считаете, что обнаружили какие-либо пробелы в нашей документации, сообщите нам об этом ниже.