
Език 🇧🇬 Български
Общ преглед
Имплементация
Зад кулисите
Уебкуки
С FastComments е възможно да се извика API endpoint всеки път, когато коментар бъде добавен, актуализиран или премахнат от нашата система.
Постигаме това с помощта на асинхронни webhooks по HTTP/HTTPS.
Какво са уебкуките 
Уебхук е механизъм, или интеграция, между две системи, при която "произвеждащият" (FastComments) изпраща събитие което "потребителят" (Вие) обработва чрез API повикване.
Поддържани събития и ресурси 
FastComments поддържа уебкуки само за ресурса Comment.
Поддържаме уебкуки за създаване, премахване и актуализиране на коментари.
Всяко от тях се счита за отделно събитие в нашата система и като такова има различна семантика и структури за уебкук събитията.
Произволен брой крайни точки могат да се абонират за едно и също събитие, от таблото или чрез API (вижте Управление на уебкуки чрез API). Всяка уебкука се доставя независимо.
Настройка за локално разработване 
За локална разработка използвайте инструмент като ngrok.
За да опростим поддържането на системата сигурна, локалната разработка следва същия процес като настройването и осигуряването на сигурност на други среди.
Стъпка 1: Добавете "localhost" към домейните в акаунта си.
Добавете "localhost" като домейн тук.
Стъпка 2: Изберете API ключ
Ще добавяме конфигурация за webhook за вашия домейн, така че ще ни трябва API ключ. Можете да направите това тук.
Под "Associate with domain" - изберете вашия "localhost" домейн.
ЗАБЕЛЕЖКА: Алтернативно можете да използвате един API Secret за цялата тестова дейност и стейджинг среди. Просто добавете API Secret за "All Domains" и му дайте име като "test".
Уверете се, че имате дефиниран API Secret за вашия производствен(и) домейн(и). Събитията за всички останали домейни ще използват wildcard (тестовия) секрет.
Стъпка 3: Добавете вашия Webhook
Докато ngrok или подобен инструмент работи, задайте стойността за "localhost" тук.
При кликване върху Send Test Payload ще изпратим два тестови събития, за да проверим дали валидирате API ключа.
След като валидацията премине, натиснете Save.
Стъпка 4: Добавете коментар
Сега можете да добавяте, редактирате или изтривате коментари и трябва да видите как извикваме вашата локална машина за разработка със събитията, използвайки вашия тестов API ключ. Може да има закъснение до 30 секунди преди събитията да достигнат вашата машина.
Настройка 
Следвайте същите стъпки за localhost, както за продукция. Уверете се, че имате настроени продукционни домейни и API тайни.
Първо, отидете на Webhooks admin. Това е достъпно чрез Управление на данни -> Уебкукове.
Страницата изброява всеки уебкук във вашия акаунт:
Кликнете New Webhook, за да добавите такъв. Всеки уебкук има URL, едно събитие за коментар (създаден, актуализиран или изтрит), домейн и HTTP метод:
Всеки уебкук се доставя независимо. Можете да изпратите едно и също събитие към няколко крайни точки, а уебкук, обхващащ All Domains, получава коментари от всеки домейн, дори ако съществува уебкук за конкретен домейн за същото събитие. Същият URL, събитие и домейн не могат да бъдат добавени два пъти.
Преди да запазите, кликнете Send Test Payload, за да проверите дали крайната точка приема подписана заявка. Вижте следващия раздел „Testing“ за подробности.
От списъка можете да редактирате, деактивирате, активирате отново или изтриете уебкук. Деактивирането запазва изчакващите събития, докато уебкукът бъде активиран отново; изтриването ги премахва.
Уебкуковете могат да се създадат и чрез API, например чрез Zapier. Те се появяват в същия списък с източник API. Вижте Управление на уебкуковете чрез API.
Тестване 
Новите страници за създаване и редактиране на уебхук имат бутон Send Test Payload, който изпраща заявка към URL адреса, който в момента е във формата, независимо дали е запазен или не. Събитията Create и Update изпращат фиктивен WebhookComment обект, докато при тестване на Delete се изпраща фиктивно тяло на заявка само с ID.
Проверка на полезния товар (Payload)
Когато тествате интеграцията на уебхук, проверете дали входящите заявки включват следните заглавки:
X-FastComments-Timestamp- Unix времеви печат (секунди)X-FastComments-Signature- HMAC-SHA256 подпис
Уебхуковете, създадени преди въвеждането на схемата за подпис, също получават заглавка token, съдържаща вашия API Secret. Новите уебхукове не получават такава.
Използвайте проверката на HMAC подписа, за да сте сигурни, че полезните товари са автентични.
Инструменти за тестване
Можете да използвате инструменти като webhook.site или ngrok, за да преглеждате входящите полезни товари на уебхук по време на разработка.
Типове събития
- Create Event: Задейства се, когато е създаден нов коментар.
- Update Event: Задейства се, когато коментар е редактиран.
- Delete Event: Задейства се, когато коментар е изтрит.
Всеки уебхук е обвързан с едно събитие и един HTTP метод (POST, PUT или DELETE). Всяко събитие включва пълните данни за коментара в тялото на заявката (вижте Структури на данните за формата на полезния товар).
Структури от данни 
Единствената структура, изпращана чрез уебкуки, е обектът WebhookComment, описан в TypeScript по-долу.
Структура на обекта WebhookComment
Структура на събитието "Create"
Събитието "create" заявка съдържа обект WebhookComment.
Структура на събитието "Update"
Събитието "update" заявка съдържа обект WebhookComment.
Структура на събитието "Delete"
Събитието "delete" заявка съдържа обект WebhookComment.
Промяна от 14 ноември 2023 г. Преди тялото на заявката за събитието "delete" съдържаше само идентификатора на коментара. Сега съдържа целия коментар към момента на изтриване.
Всеки ключ винаги присъства в тялото. Когато коментарът няма стойност за дадено поле, тялото съдържа null (или false за булеви стойности и [] за списъци), така че формата на доставката никога не варира от един коментар към друг.
Run 
Когато потребители са отбелязани в коментар, информацията се съхранява в списък, наречен mentions. Всеки обект в този списък има следната структура.
Run 
Всеки елемент от списъка badges има следната структура. Вижте Badges guide за типове значки.
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 не трябва да създава дублирани обекти от ваша страна.
Заглавки на заявката
| Заглавка | Описание |
|---|---|
Content-Type | application/json |
token | Вашият API Secret |
X-FastComments-Timestamp | Unix времева отметка (секунди), когато заявката е подписана |
X-FastComments-Signature | HMAC-SHA256 подпис (sha256=<hex>) |
Вижте Security & API Tokens за информация относно проверка на HMAC подписа.
Сигурност и API токени 
FastComments webhook заявките включват множество механизми за автентикация с цел сигурност.
Изпращани хедъри
| Хедър | Описание |
|---|---|
token | Вашият API Secret (за обратна съвместимост) |
X-FastComments-Timestamp | Unix времеви печат (в секунди), когато заявката е подписана |
X-FastComments-Signature | HMAC-SHA256 подпис на payload данните |
Проверка на HMAC подписа (препоръчително)
Силно препоръчваме да проверявате HMAC подписа, за да сте сигурни, че webhook payload данните са автентични и не са били подменени.
Формат на подписа: 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; // Предпазване от replay атаки
}
// Проверка на подписа
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 проверка за подобрена сигурност, тъй като тя предпазва от replay атаки.
Управление на уебкуки чрез API 
Уебхуковете могат да се управляват и чрез REST API. Така интеграции като Zapier се абонират за събития от коментари, без да докосват таблото, и това следва модела REST Hooks: абониране, получаване на събития, отписване.
API абонаментите съществуват редом с уебхуците, конфигурирани в таблото. Събитие от коментар се доставя на всеки уебхук, който съответства на неговия домейн, всяко като отделна доставка, независимо как е създаден уебхукът.
Автентикация
Всяка заявка се нуждае от вашия API Key в хедъра x-api-key (или параметъра API_KEY в заявката) и
вашия tenant ID в параметъра 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 | Да | Абсолютен http или https URL. |
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 за същото събитие и домейн връща съществуващия абонамент, вместо да създава дубликат, така че клиентът може безопасно да повтори заявката. Всеки tenant може да има до 50 API абонамента.
Списък
GET https://fastcomments.com/api/v1/webhooks?tenantId=YOUR_TENANT_ID
Връща всеки уебхук за tenant-а, включително тези, управлявани в таблото ("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 вместо него.
Примерни payloads
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 в системата предизвикват събитие, което се поставя в опашка.
Първоначалното webhook събитие обикновено се изпраща в рамките на шест секунди след настъпване на източника на събитието.
Можете да наблюдавате тази опашка в администрацията на Webhooks в случай че вашето API спре да работи.
Ако заявка към вашето API не успее, ние ще я поставим отново в опашката по график.
Този график е 1 Minute * the retry count. Ако повикването не успее веднъж, ще опита отново след една минута. Ако не успее два пъти, ще изчака две минути и т.н. Това е така, за да не претоварваме вашето API, ако то спре да работи по причини, свързани с натоварване.
Webhooks могат да бъдат отменени от страницата с логове.
В заключение
Това завършва нашата документация за Webhooks.
Надяваме се, че интеграцията на FastComments Webhook е лесна за разбиране и бърза за настройване.
Ако смятате, че сте открили пропуски в нашата документация, уведомете ни по-долу.