
Језик 🇷🇸 Српски
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 
Follow the same steps for localhost as you would production. Ensure you have production domains and API Secrets setup.
First, navigate to the Webhooks admin. This is accessible via Manage Data -> Webhooks.
The page lists every webhook on your account:
Click New Webhook to add one. Each webhook has a URL, one comment event (created, updated or deleted), a domain, and an HTTP method:
Every webhook is delivered independently. You can send the same event to several endpoints, and a webhook scoped to All Domains receives comments from every domain even when a domain-specific webhook exists for the same event. The same URL, event and domain cannot be added twice.
Before saving, click Send Test Payload to check the endpoint accepts a signed request. See the next section, "Testing", for details.
From the list you can edit, disable, re-enable or delete a webhook. Disabling keeps queued events until the webhook is re-enabled; deleting discards them.
Webhooks can also be created through the API, for example by Zapier. Those appear in the same list with the source API. See Управљање вебхукевима преко 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 
The only structure sent via webhooks is the WebhookComment object, outlined in TypeScript below.
Структура WebhookComment објекта
Структура догађаја „Create“
The "create" event request body is a WebhookComment object.
Структура догађаја „Update“
The "update" event request body is a WebhookComment object.
Структура догађаја „Delete“
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 методи
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.
Заглавља захтева
Each webhook request includes the following headers:
| Header | Description |
|---|---|
Content-Type | application/json |
token | Ваш API тајн |
X-FastComments-Timestamp | Unix временски печат (секунде) када је захтев потписан |
X-FastComments-Signature | HMAC-SHA256 потпис (sha256=<hex>) |
See Security & API Tokens for information on verifying the HMAC signature.
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 бити лака за разумевање и брза за подешавање.
Ако сматрате да сте пронашли било какве недостатке у нашој документацији, јавите нам у наставку.