
Jezik 🇷🇸 Srpski (Latinica)
Pregled
Implementacija
Iza kulisa
Webhooks
Sa FastComments moguće je pozvati API endpoint kad god se komentar doda, ažurira ili ukloni iz našeg sistema.
To ostvarujemo asinhronim webhooks preko HTTP/HTTPS.
Šta su Webhook-ovi 
A Webhook je mehanizam, odnosno integracija, između dva sistema gde "proizvođač" (FastComments) okida događaj koji "potrošač" (Vi) preuzima putem API poziva.
Podržani događaji i resursi 
FastComments podržava webhook‑ove samo za resurs Komentar.
Podržavamo webhook‑ove za kreiranje komentara, brisanje i ažuriranje.
Svaki od ovih smatra se posebnim događajem u našem sistemu i kao takav ima različitu semantiku
i strukture za webhook događaje.
Bilo koji broj krajnjih tačaka može da se pretplati na isti događaj, putem kontrolne table ili kroz API
(vidi Upravljanje webhook‑ovima putem API‑ja). Svaki webhook se isporučuje nezavisno.
Lokalno postavljanje za razvoj 
Za lokalni razvoj koristite alat kao što je ngrok.
Kako bi održavanje sistema bezbednim bilo jednostavnije, lokalni razvoj prati isti proces kao podešavanje i obezbeđivanje ostalih okruženja.
Korak 1: Dodajte "localhost" u domene svog naloga.
Dodajte "localhost" kao domen ovde.
Korak 2: Izaberite API ključ
Dodaćemo konfiguraciju webhook-a za vaš domen, pa će nam trebati API ključ. To možete uraditi ovde.
Pod "Associate with domain" - izaberite svoj "localhost" domen.
NAPOMENA: Alternativno, možete koristiti jedan API Secret za sve test aktivnosti i staging okruženja. Jednostavno dodajte API Secret za "All Domains" i dajte mu ime kao što je "test".
Proverite da imate definisan API Secret za vaše produkcijske domene. Događaji za sve ostale domene koristiće wildcard (testni) secret.
Korak 3: Dodajte svoj Webhook
Dok ngrok ili sličan alat radi, postavite vrednost za "localhost" ovde.
Kada kliknete Send Test Payload, poslaćemo dva testna događaja da proverimo da validirate API ključ.
Kada validacija prođe, kliknite Save.
Korak 4: Dodajte komentar
Sada možete dodavati, menjati ili brisati komentare i trebalo bi da vidimo da pozivamo vašu lokalnu razvojnu mašinu sa događajima, koristeći vaš testni API ključ. Može postojati kašnjenje do 30 sekundi dok događaji stignu do vaše mašine.
Postavka 
Pratite iste korake za localhost kao i za produkciju. Proverite da imate podešene produkcijske domene i API Secrets.
Prvo, idite na Webhooks admin. Ovo je dostupno preko Manage Data -> Webhooks.
Stranica prikazuje svaki webhook na vašem nalogu:
Kliknite na New Webhook da biste dodali novi. Svaki webhook ima URL, jedan događaj komentara (kreiran, ažuriran ili obrisan), domen i HTTP metodu:
Svaki webhook se dostavlja nezavisno. Isti događaj možete poslati na više krajnjih tačaka, a webhook opsežen na All Domains prima komentare sa svakog domena čak i kada postoji webhook specifičan za domen za isti događaj. Isti URL, događaj i domen ne mogu se dodati dva puta.
Pre čuvanja, kliknite na Send Test Payload da proverite da krajnja tačka prihvata potpisan zahtev. Pogledajte sledeću sekciju, "Testiranje", za detalje.
Iz liste možete izmeniti, onemogućiti, ponovo omogućiti ili obrisati webhook. Onemogućavanje zadržava događaje u redu čekanja dok se webhook ponovo ne omogući; brisanje ih odbacuje.
Webhooks se mogu kreirati i putem API-ja, na primer putem Zapier-a. Oni se pojavljuju u istoj listi sa izvorom API. Pogledajte Upravljanje webhooks-ima putem API-ja.
Testiranje 
Stranice za kreiranje i izmenu webhook-a imaju dugme Send Test Payload koje šalje zahtev na URL koji je trenutno u formi, bez obzira na to da li je sačuvan ili ne. Create i Update događaji šalju lažni WebhookComment objekat, dok testiranje Delete-a šalje lažni request body sa samo ID-jem.
Verifikacija Payload-a
Kada testirate svoju webhook integraciju, proverite da dolazni zahtevi uključuju sledeće zaglavlja:
X-FastComments-Timestamp- Unix vremenski pečat (sekunde)X-FastComments-Signature- HMAC-SHA256 potpis
Webhook-ovi kreirani pre uvođenja šeme potpisa takođe primaju token zaglavlje koje sadrži vaš API Secret. Novi webhook-ovi to ne primaju.
Koristite HMAC verifikaciju potpisa da biste osigurali da su payload-i autentični.
Alati za testiranje
Možete koristiti alate kao što su webhook.site ili ngrok da biste pregledali dolazne webhook payload-e tokom razvoja.
Tipovi događaja
- Create Event: Aktivira se kada se kreira novi komentar.
- Update Event: Aktivira se kada se komentar izmeni.
- Delete Event: Aktivira se kada se komentar obriše.
Svaki webhook je vezan za jedan događaj i jednu HTTP metodu (POST, PUT ili DELETE). Svaki događaj uključuje kompletne podatke o komentaru u request body-ju (vidite Data Structures za format payload-a).
Strukture podataka 
Jedina struktura koja se šalje putem webhukova je objekat WebhookComment, prikazan u TypeScript-u ispod.
Struktura objekta WebhookComment
Struktura "create" događaja
Telo zahteva "create" događaja je objekat WebhookComment.
Struktura "update" događaja
Telo zahteva "update" događaja je objekat WebhookComment.
Struktura "delete" događaja
Telo zahteva "delete" događaja je objekat WebhookComment.
Promena od 14. novembra 2023.
Ranije je telo zahteva "delete" događaja sadržalo samo id komentara. Sada sadrži ceo komentar u trenutku brisanja.
Svaki ključ je uvek prisutan u telu. Kada komentar nema vrednost za neko polje, telo nosi null
(ili false za boolean vrednosti i [] za liste), tako da oblik isporuke nikada ne varira od komentara do komentara.
Run 
Kada su korisnici označeni u komentaru, informacija se čuva u listi pod nazivom mentions. Svaki objekat u toj listi
ima sledeću strukturu.
Run 
Svaki unos u listi badges ima sledeću strukturu. Pogledajte vodič za Badges za tipove bedževa.
Run 
HTTP metode
Možete konfigurisati HTTP metodu za svaki tip webhook događaja u admin panelu:
- Create Event: POST ili PUT (podrazumevano: PUT)
- Update Event: POST ili PUT (podrazumevano: PUT)
- Delete Event: DELETE, POST ili PUT (podrazumevano: DELETE)
Pošto svi zahtevi sadrže ID, Create i Update operacije su idempotentne po podrazumevanoj postavci (PUT). Ponavljanje istog Create ili Update zahteva ne bi trebalo da kreira duplirane objekte na vašoj strani.
Zaglavlja zahteva
Svaki webhook zahtev uključuje sledeća zaglavlja:
| 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>) |
Pogledajte Bezbednost i API tokeni za informacije o verifikaciji HMAC potpisa.
Bezbednost i API tokeni 
FastComments webhook zahtevi uključuju više mehanizama autentifikacije radi bezbednosti.
Zaglavlja koja se šalju
| Zaglavlje | Opis |
|---|---|
token | Vaš API Secret (za unazadnu kompatibilnost) |
X-FastComments-Timestamp | Unix timestamp (sekunde) kada je zahtev potpisan |
X-FastComments-Signature | HMAC-SHA256 potpis payload-a |
Verifikacija HMAC potpisa (Preporučeno)
Toplo preporučujemo verifikaciju HMAC potpisa kako biste osigurali da su webhook payload-ovi autentični i da nisu izmenjeni.
Format potpisa: sha256=<hex-encoded-signature>
Kako se potpis izračunava:
- Sastavite:
timestamp + "." + JSON_payload_body - Izračunajte HMAC-SHA256 koristeći vaš API Secret kao ključ
- Hex-enkodirajte rezultat
Primer verifikacije (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;
}
// Proverite da je timestamp recentan (u roku od 5 minuta)
const now = Math.floor(Date.now() / 1000);
if (Math.abs(now - parseInt(timestamp, 10)) > 300) {
return false; // Prevencija replay napada
}
// Proverite potpis
const payload = JSON.stringify(req.body);
const expectedSignature = crypto
.createHmac('sha256', apiSecret)
.update(`${timestamp}.${payload}`)
.digest('hex');
return signature === `sha256=${expectedSignature}`;
}
Primer verifikacije (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
# Proverite da je timestamp recentan
now = int(time.time())
if abs(now - int(timestamp)) > 300:
return False
# Proverite potpis
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}"
Primer verifikacije (PHP)
function verifyWebhookSignature($headers, $body, $apiSecret) {
$timestamp = $headers['X-FastComments-Timestamp'] ?? null;
$signature = $headers['X-FastComments-Signature'] ?? null;
if (!$timestamp || !$signature) {
return false;
}
// Proverite da je timestamp recentan (u roku od 5 minuta)
$now = time();
if (abs($now - intval($timestamp)) > 300) {
return false;
}
// Proverite potpis
$payload = json_encode($body, JSON_UNESCAPED_SLASHES);
$message = $timestamp . '.' . $payload;
$expectedSignature = 'sha256=' . hash_hmac('sha256', $message, $apiSecret);
return hash_equals($expectedSignature, $signature);
}
Nasleđena autentifikacija
Zaglavlje token koje sadrži vaš API Secret se i dalje šalje za unazadnu kompatibilnost. Međutim, preporučujemo migraciju na HMAC verifikaciju za poboljšanu bezbednost, jer štiti od replay napada.
Upravljanje webhook-ovima putem API-ja 
Webhooks se takođe mogu upravljati putem REST API-ja. Ovo je način na koji integracije poput Zapiera pretplaćuju na događaje komentara bez korišćenja kontrolne table, i prati obrazac REST Hooks: pretplata, primanje događaja, otkazivanje pretplate.
API pretplate postoje uz webhooks konfigurirane u kontrolnoj tabli. Događaj komentara se isporučuje svakom webhooku koji odgovara njegovom domenu, svaki kao zasebna isporuka, bez obzira kako je webhook kreiran.
Autentifikacija
Svaki zahtev zahteva vaš API ključ u zaglavlju x-api-key (ili u parametru upita API_KEY) i ID vašeg zakupca u parametru upita tenantId. Obe vrednosti su prikazane na stranici API tajne u kontrolnoj tabli.
Pretplata
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"
}| Polje | Obavezno | Opis |
|---|---|---|
url | Yes | Apsolutni http ili https URL. |
event | Yes | comment-created, comment-updated or comment-deleted. |
domain | No | Domena iz konfiguracije vašeg naloga. Podrazumevano je *, što prima događaje za svaki domen. |
method | No | POST (default), PUT or DELETE. |
Odgovor sadrži pretplatu:
{
"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"
}
}
Ponovno pretplata na isti URL za isti događaj i domen vraća postojeću pretplatu umesto kreiranja duplikata, tako da klijent može bezbedno ponoviti zahtev. Svaki zakupac može imati može do 50 API pretplata.
Lista
GET https://fastcomments.com/api/v1/webhooks?tenantId=YOUR_TENANT_ID
Vraća sve webhookove za zakupca, uključujući i one upravljane u kontrolnoj tabli ("source": "dashboard"). Filtrirajte po event, domain ili source.
Otkaži pretplatu
DELETE https://fastcomments.com/api/v1/webhooks/SUBSCRIPTION_ID?tenantId=YOUR_TENANT_ID
Brisanje pretplate takođe odbacuje sve događaje koji su još u redu za nju. Samo pretplate kreirane putem API-ja mogu se izbrisati na ovaj način; webhook iz kontrolne table, ili ID koji ne postoji na vašem nalogu, odgovara sa 404 i kodom not-found. Webhookovi iz kontrolne table se uređuju na stranici Webhooks.
Payload-ovi i potpisivanje
Isporuke koriste isti payload kao webhookovi iz kontrolne table (pogledajte Data Structures) i potpisane su istim HMAC šemom (pogledajte Security & API Tokens). API pretplate nikada ne primaju zastarelo zaglavlje token, pa proverite zaglavlje X-FastComments-Signature.
Primeri payload-ova
GET https://fastcomments.com/api/v1/webhooks/sample-payloads?tenantId=YOUR_TENANT_ID&event=comment-created&limit=3
Vraća najnovije komentare naloga u tačno onom obliku koji isporuka nosi, tako da integracija može prikazati stvarne uzorke podataka pre nego što prvi događaj stigne. event je opcionalan i samo se validira, pošto svaki događaj isporučuje isti objekat komentara. limit podrazumevano je 3 i prihvata vrednosti od 1 do 10. Troši 2 API kredita.
{
"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
}
]
}
Odgovor sa 410 Gone
Ako endpoint API pretplate odgovori HTTP 410 Gone, FastComments to tretira kao otkazivanje pretplate: pretplata se briše zajedno sa svojim događajima u redu, i ne pokušavaju se dalje isporuke. Webhookovi konfigurirani u kontrolnoj tabli se nikada ne brišu automatski; za njih je 410 običan neuspeh. Svaki drugi status greške se ponovo pokušava i na kraju onemogućava webhook, kako je opisano u sekciji How it Works & Handling Retries.
Kontrolna tabla
API pretplate se pojavljuju u listi Webhookova sa izvorom API, gde administrator može da ih uređuje, onemogući, ponovo omogući ili obriše.
Kako funkcioniše i rukovanje ponovnim pokušajima 
Sve promene Comment objekta u sistemu pokreću događaj koji se na kraju nađe u redu.
Početni webhook događaj se obično šalje u roku od šest sekundi od nastanka izvora događaja.
Možete pratiti ovaj red u Webhooks adminu u slučaju da vaš API bude nedostupan.
Ako zahtev prema vašem API-ju ne uspe, ponovo ćemo ga staviti u red po rasporedu.
Taj raspored je 1 Minute * the retry count. Ako poziv ne uspe jednom, pokušaće ponovo za minut. Ako ne uspe dvaput, onda će sačekati dva minuta, i tako dalje. To je da ne bismo preopteretili vaš API ako on pada zbog razloga povezanih sa opterećenjem.
Webhooks se mogu otkazati sa stranice logova.
Zaključno
Ovim se završava naša Webhooks dokumentacija.
Nadamo se da ćete smatrati da je FastComments Webhook integracija jednostavna za razumevanje i brza za postavljanje.
Ako smatrate da ste uočili neke nedostatke u našoj dokumentaciji, obavestite nas u nastavku.