
Језик 🇷🇸 Српски
Pregled
Implementacija
Iza kulisa
Webhooks
Са FastComments-ом могуће је позвати API endpoint кад год се коментар дода, ажурира или уклони из нашег система.
Ово остварујемо помоћу асинхроних webhooks преко HTTP/HTTPS.
Šta su webhook-ovi 
Webhook је механизам, или интеграција, између два система где "произвођач" (FastComments) покреће догађај који "потрошач" (Ви) прима путем API позива.
Podržani događaji i resursi 
FastComments подржава вебхук‑ове само за ресурс Коментар.
Подржавамо вебхук‑ове за креирање коментара, брисање и ажурирање.
Сваки од ових се сматра посебним догађајем у нашем систему и због тога има различиту семантику и структуре за вебхук догађаје.
Било који број крајњих тачака може да се претплати на исти догађај, преко контролне табле или преко API‑ја (погледајте Управљање вебхук‑овима преко API‑ја). Сваки вебхук се испоручује независно.
Podešavanje lokalnog razvoja 
За локални развој, користите алат као што је 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 секунди кашњења док догађаји стигну до вашег рачунара.
Podešavanje 
Пратите исте кораке за localhost као и за продукцију. Уверите се да имате подешене продукционе домене и API тајне (API Secrets).
Прво, идите на Webhooks админ страницу. Доступна је преко Manage Data -> Webhooks.
Страница приказује све вебхук на вашем налогу:
Кликните New Webhook да додате нови. Сваки вебхук има URL, један догађај коментара (креирање, ажурирање или брисање), домен и HTTP метод:
Сваки вебхук се испоручује независно. Можете послати исти догађај на више крајњих тачака, а вебхук обухваћен опцијом All Domains прима коментаре са свих домена, чак и када постоји вебхук специфичан за домен за исти догађај. Исти URL, догађај и домен не могу бити додати два пута.
Пре чувања, кликните Send Test Payload да проверите да крајња тачка прихвата потписани захтев. Погледајте следећи одељак, „Тестирање", за детаље.
Из списка можете да уредите, онемогућите, поново омогућите или обришете вебхук. Онемогућавање задржава догађаје у реду чекања док се вебхук поново не омогући; брисање их одбацује.
Вебхукови се такође могу креирати путем API-ја, на пример преко Zapier-а. Они се појављују у истом списку са извором API. Погледајте Управљање вебхуковима путем API-ја.
Testiranje 
Нове и странице за уређивање веб‑хукова имају дугме 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 за формат података).
Strukture podataka 
Једина структура која се шаље путем вебхукова је објекат WebhookComment, приказан у TypeScript-у испод.
Структура објекта WebhookComment
Структура догађаја „Create"
Тело захтева за догађај „create" је објекат WebhookComment.
Структура догађаја „Update"
Тело захтева за догађај „update" је објекат WebhookComment.
Структура догађаја „Delete"
Тело захтева за догађај „delete" је објекат WebhookComment.
Промена од 14. новембра 2023.
Раније је тело захтева за догађај „delete" садржало само id коментара. Сада садржи цео коментар у тренутку брисања.
Сваки кључ је увек присутан у телу. Када коментар нема вредност за неко поље, тело носи 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 захтева не би требало да креира дупле објекте на вашој страни.
Заглавља захтева
Сваки вебхук захтев укључује следећа заглавља:
| Заглавље | Опис |
|---|---|
Content-Type | application/json |
token | Ваша API тајна |
X-FastComments-Timestamp | Unix временски печат (секунде) када је захтев потписан |
X-FastComments-Signature | HMAC-SHA256 потпис (sha256=<hex>) |
Погледајте Безбедност и API токени за информације о верификацији HMAC потписа.
Bezbednost i API tokeni 
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 као кључ
- Хекс-енкодирајте резултат
Пример верификације (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 напада.
Upravljanje webhook-ovima putem API-ja 
Webhooks такође могу да се управљају преко REST API‑ја. Ово је начин на који интеграције попут Zapier‑а претплаћу се на догађаје коментара без коришћења контролне табле, и прати шаблон REST Hooks: претплата, примање догађаја, одјава.
API претплате постоје паралелно са вебхук‑овима подешеним у контролној табли. Догађај коментара се испоручује сваком вебхуку који одговара његовом домену, сваки као посебна испорука, без обзира како је вебхук креиран.
Аутентификација
Сваки захтев захтева ваш API кључ у заглављу 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 | Yes | Апсолутни http или https URL. |
event | Yes | comment-created, comment-updated or comment-deleted. |
domain | No | Домен из конфигурације вашег налога. Подразумевано је *, који прима догађаје за сваки домен. |
method | No | POST (default), PUT or 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‑ја могу се брисати на овај начин; вебхук из контролне табле, или ID који не постоји у вашем налогу, одговара са 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, где администратор може да их уреди, онемогући, поново омогући или избрише.
Kako funkcioniše i rukovanje ponovnim pokušajima 
Све измене Comment објекта у систему покрећу догађај који се ставља у ред.
Почетни webhook догађај обично се шаље у року од шест секунди од настанка извора догађаја.
Можете пратити овај ред у Webhooks admin у случају да ваш API буде недоступан.
Ако захтев ка вашем API-ју не успе, ми ћемо га поново ставити у ред по распореду.
Тај распоред је 1 Minute * the retry count. Ако позив не успе једном, покушаће поново за минут. Ако не успе два пута, онда ће сачекати два минута, и тако даље. Ово је да не бисмо преоптеретили ваш API ако долази до пада услуге због оптерећења.
Webhooks се могу отказати са странице логова.
У закључку
Овим се завршава наша Webhooks документација.
Надамо се да ће вам интеграција FastComments Webhook бити лака за разумевање и брза за подешавање.
Ако сматрате да сте пронашли било какве недостатке у нашој документацији, јавите нам у наставку.