
Язык 🇷🇺 Русский
Обзор
Реализация
За кулисами
Вебхуки
С 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 для формата полезных данных).
Структуры данных 
The only structure sent via webhooks is the WebhookComment object, outlined in TypeScript below.
The WebhookComment Object Structure
The "Create" Event Structure
The "create" event request body is a WebhookComment object.
The "Update" Event Structure
The "update" event request body is a WebhookComment object.
The "Delete" Event Structure
The "delete" event request body is a WebhookComment object.
Change as of Nov 14th 2023
Previously the "delete" event request body only contained the comment id. It now contains the full comment at the time of deletion.
Every key is always present in the body. When the comment has no value for a field the body carries null
(or false for booleans and [] for lists), so the shape of a delivery never varies from one comment to the next.
Run 
When users are tagged in a comment, the information is stored in a list called mentions. Each object in that list
has the following structure.
Run 
HTTP Methods
You can configure the HTTP method for each webhook event type in the admin panel:
- Create Event: POST or PUT (default: PUT)
- Update Event: POST or PUT (default: PUT)
- Delete Event: DELETE, POST, or PUT (default: DELETE)
Since all requests contain an ID, Create and Update operations are idempotent by default (PUT). Repeating the same Create or Update request should not create duplicate objects on your side.
Request Headers
Each webhook request includes the following headers:
| Header | Description |
|---|---|
Content-Type | application/json |
token | Your API Secret |
X-FastComments-Timestamp | Unix timestamp (seconds) when the request was signed |
X-FastComments-Signature | HMAC-SHA256 signature (sha256=<hex>) |
See Безопасность и токены API for information on verifying the HMAC signature.
Безопасность и токены API 
Запросы вебхуков FastComments включают несколько механизмов аутентификации для безопасности.
Headers Sent
| Header | Description |
|---|---|
token | Ваш API Secret (для обратной совместимости) |
X-FastComments-Timestamp | Unix-временная метка (в секундах), когда запрос был подписан |
X-FastComments-Signature | HMAC-SHA256 подпись полезной нагрузки |
HMAC Signature Verification (Recommended)
Мы настоятельно рекомендуем проверять HMAC-подпись, чтобы убедиться, что полезные данные вебхука подлинны и не были изменены.
Signature Format: sha256=<hex-encoded-signature>
How the signature is computed:
- Concatenate:
timestamp + "." + JSON_payload_body - Compute HMAC-SHA256 using your API Secret as the key
- Hex-encode the result
Example Verification (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; // Защита от повторного воспроизведения (replay-атаки)
}
// Проверка подписи
const payload = JSON.stringify(req.body);
const expectedSignature = crypto
.createHmac('sha256', apiSecret)
.update(`${timestamp}.${payload}`)
.digest('hex');
return signature === `sha256=${expectedSignature}`;
}
Example Verification (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}"
Example Verification (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);
}
Legacy Authentication
The token header containing your API Secret is still sent for backwards compatibility. However, we recommend migrating to HMAC verification for improved security as it protects against replay attacks.
Управление вебхуками через 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 окажется понятной и быстрой в настройке.
Если вы считаете, что обнаружили какие-либо пробелы в нашей документации, сообщите нам об этом ниже.